Mercurial > projects > ldc
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 } |