comparison gen/aa.cpp @ 127:facc562f5674 trunk

[svn r131] Fixed #11 All associative array properties now work as they should. Fixed problems with some cases of array.length and array.ptr. Fixed some problems with array properties. Fixed 'in' contracts.
author lindquist
date Fri, 30 Nov 2007 12:56:52 +0100
parents 5ab8e92611f9
children 44a95ac7368a
comparison
equal deleted inserted replaced
126:a2c2c3c1a73d 127:facc562f5674
46 } 46 }
47 47
48 return pkey; 48 return pkey;
49 } 49 }
50 50
51 // returns the keytype typeinfo
52 static llvm::Value* to_keyti(DValue* key)
53 {
54 // keyti param
55 Type* keytype = key->getType();
56 keytype->getTypeInfo(NULL);
57 TypeInfoDeclaration* tid = keytype->getTypeInfoDeclaration();
58 assert(tid);
59 DtoResolveDsymbol(Type::typeinfo);
60 DtoForceDeclareDsymbol(tid);
61 assert(tid->llvmValue);
62 return tid->llvmValue;
63 }
64
51 ///////////////////////////////////////////////////////////////////////////////////// 65 /////////////////////////////////////////////////////////////////////////////////////
52 66
53 DValue* DtoAAIndex(Type* type, DValue* aa, DValue* key) 67 DValue* DtoAAIndex(Type* type, DValue* aa, DValue* key)
54 { 68 {
55 // call: 69 // call:
62 // aa param 76 // aa param
63 llvm::Value* aaval = aa->getLVal(); 77 llvm::Value* aaval = aa->getLVal();
64 aaval = DtoBitCast(aaval, funcTy->getParamType(0)); 78 aaval = DtoBitCast(aaval, funcTy->getParamType(0));
65 79
66 // keyti param 80 // keyti param
67 Type* keytype = key->getType(); 81 llvm::Value* keyti = to_keyti(key);
68 keytype->getTypeInfo(NULL);
69 TypeInfoDeclaration* tid = keytype->getTypeInfoDeclaration();
70 assert(tid);
71 DtoResolveDsymbol(Type::typeinfo);
72 DtoForceDeclareDsymbol(tid);
73 assert(tid->llvmValue);
74 llvm::Value* keyti = tid->llvmValue;
75 keyti = DtoBitCast(keyti, funcTy->getParamType(1)); 82 keyti = DtoBitCast(keyti, funcTy->getParamType(1));
76 83
77 // pkey param 84 // pkey param
78 llvm::Value* pkey = to_pkey(key); 85 llvm::Value* pkey = to_pkey(key);
79 pkey = DtoBitCast(pkey, funcTy->getParamType(2)); 86 pkey = DtoBitCast(pkey, funcTy->getParamType(2));
87 args.push_back(keyti); 94 args.push_back(keyti);
88 args.push_back(pkey); 95 args.push_back(pkey);
89 args.push_back(valsize); 96 args.push_back(valsize);
90 97
91 // call runtime 98 // call runtime
92 llvm::Value* ret = gIR->ir->CreateCall(func, args.begin(), args.end(), "aaGet"); 99 llvm::Value* ret = gIR->ir->CreateCall(func, args.begin(), args.end(), "aa.index");
93 100
94 // cast return value 101 // cast return value
95 const llvm::Type* targettype = llvm::PointerType::get(DtoType(type)); 102 const llvm::Type* targettype = llvm::PointerType::get(DtoType(type));
96 if (ret->getType() != targettype) 103 if (ret->getType() != targettype)
97 ret = DtoBitCast(ret, targettype); 104 ret = DtoBitCast(ret, targettype);
117 Logger::cout() << "aaval: " << *aaval << '\n'; 124 Logger::cout() << "aaval: " << *aaval << '\n';
118 Logger::cout() << "totype: " << *funcTy->getParamType(0) << '\n'; 125 Logger::cout() << "totype: " << *funcTy->getParamType(0) << '\n';
119 aaval = DtoBitCast(aaval, funcTy->getParamType(0)); 126 aaval = DtoBitCast(aaval, funcTy->getParamType(0));
120 127
121 // keyti param 128 // keyti param
122 Type* keytype = key->getType(); 129 llvm::Value* keyti = to_keyti(key);
123 keytype->getTypeInfo(NULL);
124 TypeInfoDeclaration* tid = keytype->getTypeInfoDeclaration();
125 assert(tid);
126 DtoResolveDsymbol(Type::typeinfo);
127 DtoForceDeclareDsymbol(tid);
128 assert(tid->llvmValue);
129 llvm::Value* keyti = tid->llvmValue;
130 keyti = DtoBitCast(keyti, funcTy->getParamType(1)); 130 keyti = DtoBitCast(keyti, funcTy->getParamType(1));
131 131
132 // pkey param 132 // pkey param
133 llvm::Value* pkey = to_pkey(key); 133 llvm::Value* pkey = to_pkey(key);
134 pkey = DtoBitCast(pkey, funcTy->getParamType(2)); 134 pkey = DtoBitCast(pkey, funcTy->getParamType(2));
138 args.push_back(aaval); 138 args.push_back(aaval);
139 args.push_back(keyti); 139 args.push_back(keyti);
140 args.push_back(pkey); 140 args.push_back(pkey);
141 141
142 // call runtime 142 // call runtime
143 llvm::Value* ret = gIR->ir->CreateCall(func, args.begin(), args.end(), "aaIn"); 143 llvm::Value* ret = gIR->ir->CreateCall(func, args.begin(), args.end(), "aa.in");
144 144
145 // cast return value 145 // cast return value
146 const llvm::Type* targettype = DtoType(type); 146 const llvm::Type* targettype = DtoType(type);
147 if (ret->getType() != targettype) 147 if (ret->getType() != targettype)
148 ret = DtoBitCast(ret, targettype); 148 ret = DtoBitCast(ret, targettype);
149 149
150 return new DImValue(type, ret); 150 return new DImValue(type, ret);
151 } 151 }
152 152
153 ///////////////////////////////////////////////////////////////////////////////////// 153 /////////////////////////////////////////////////////////////////////////////////////
154
155 void DtoAARemove(DValue* aa, DValue* key)
156 {
157 // call:
158 // extern(C) void _aaDel(AA aa, TypeInfo keyti, void* pkey)
159
160 // first get the runtime function
161 llvm::Function* func = LLVM_D_GetRuntimeFunction(gIR->module, "_aaDel");
162 const llvm::FunctionType* funcTy = func->getFunctionType();
163
164 Logger::cout() << "_aaDel = " << *func << '\n';
165
166 // aa param
167 llvm::Value* aaval = aa->getRVal();
168 Logger::cout() << "aaval: " << *aaval << '\n';
169 Logger::cout() << "totype: " << *funcTy->getParamType(0) << '\n';
170 aaval = DtoBitCast(aaval, funcTy->getParamType(0));
171
172 // keyti param
173 llvm::Value* keyti = to_keyti(key);
174 keyti = DtoBitCast(keyti, funcTy->getParamType(1));
175
176 // pkey param
177 llvm::Value* pkey = to_pkey(key);
178 pkey = DtoBitCast(pkey, funcTy->getParamType(2));
179
180 // build arg vector
181 std::vector<llvm::Value*> args;
182 args.push_back(aaval);
183 args.push_back(keyti);
184 args.push_back(pkey);
185
186 // call runtime
187 gIR->ir->CreateCall(func, args.begin(), args.end(),"");
188 }