comparison gen/elem.cpp @ 86:fd32135dca3e trunk

[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!! Lots of bugfixes. Added support for special foreach on strings. Added std.array, std.utf, std.ctype and std.uni to phobos. Changed all the .c files in the gen dir to .cpp (it *is* C++ after all)
author lindquist
date Sat, 03 Nov 2007 14:44:58 +0100
parents gen/elem.c@339422268de1
children
comparison
equal deleted inserted replaced
85:f869c636a113 86:fd32135dca3e
1 /*
2 #include <iostream>
3
4 #include "gen/llvm.h"
5
6 #include "gen/elem.h"
7 #include "gen/irstate.h"
8 #include "gen/logger.h"
9 #include "gen/dvalue.h"
10
11 //////////////////////////////////////////////////////////////////////////////////////////
12
13 elem::elem(Expression* e)
14 {
15 exp = e;
16
17 mem = 0;
18 val = 0;
19 arg = 0;
20
21 type = NONE;
22 inplace = false;
23 field = false;
24 callconv = (unsigned)-1;
25 isthis = false;
26 istypeinfo = false;
27 temp = false;
28
29 vardecl = 0;
30 funcdecl = 0;
31
32 dvalue = 0;
33 }
34
35 elem::~elem()
36 {
37 delete dvalue;
38 }
39
40 llvm::Value* elem::getValue()
41 {
42 if (dvalue && !dvalue->isSlice()) {
43 Logger::println("HAS DVALUE");
44 return dvalue->getRVal();
45 }
46
47 assert(val || mem);
48 switch(type)
49 {
50 case NONE:
51 assert(0 && "type == NONE");
52 break;
53
54 case VAR:
55 case REF:
56 case ARRAYLEN:
57 if (val) {
58 return val;
59 }
60 else {
61 if (!llvm::isa<llvm::PointerType>(mem->getType()))
62 {
63 Logger::cout() << "unexpected type: " << *mem->getType() << '\n';
64 assert(0);
65 }
66 const llvm::PointerType* pt = llvm::cast<llvm::PointerType>(mem->getType());
67 if (!pt->getElementType()->isFirstClassType()) {
68 return mem;
69 }
70 else {
71 return gIR->ir->CreateLoad(mem, "tmp");
72 }
73 }
74
75 case VAL:
76 case NUL:
77 case FUNC:
78 case CONST:
79 case SLICE:
80 return val ? val : mem;
81 }
82 assert(0 && "type == invalid value");
83 return 0;
84 }
85 */