Mercurial > projects > ldc
diff 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 |
line wrap: on
line diff
--- a/gen/aa.cpp Wed Nov 28 05:04:38 2007 +0100 +++ b/gen/aa.cpp Fri Nov 30 12:56:52 2007 +0100 @@ -48,6 +48,20 @@ return pkey; } +// returns the keytype typeinfo +static llvm::Value* to_keyti(DValue* key) +{ + // keyti param + Type* keytype = key->getType(); + keytype->getTypeInfo(NULL); + TypeInfoDeclaration* tid = keytype->getTypeInfoDeclaration(); + assert(tid); + DtoResolveDsymbol(Type::typeinfo); + DtoForceDeclareDsymbol(tid); + assert(tid->llvmValue); + return tid->llvmValue; +} + ///////////////////////////////////////////////////////////////////////////////////// DValue* DtoAAIndex(Type* type, DValue* aa, DValue* key) @@ -64,14 +78,7 @@ aaval = DtoBitCast(aaval, funcTy->getParamType(0)); // keyti param - Type* keytype = key->getType(); - keytype->getTypeInfo(NULL); - TypeInfoDeclaration* tid = keytype->getTypeInfoDeclaration(); - assert(tid); - DtoResolveDsymbol(Type::typeinfo); - DtoForceDeclareDsymbol(tid); - assert(tid->llvmValue); - llvm::Value* keyti = tid->llvmValue; + llvm::Value* keyti = to_keyti(key); keyti = DtoBitCast(keyti, funcTy->getParamType(1)); // pkey param @@ -89,7 +96,7 @@ args.push_back(valsize); // call runtime - llvm::Value* ret = gIR->ir->CreateCall(func, args.begin(), args.end(), "aaGet"); + llvm::Value* ret = gIR->ir->CreateCall(func, args.begin(), args.end(), "aa.index"); // cast return value const llvm::Type* targettype = llvm::PointerType::get(DtoType(type)); @@ -119,14 +126,7 @@ aaval = DtoBitCast(aaval, funcTy->getParamType(0)); // keyti param - Type* keytype = key->getType(); - keytype->getTypeInfo(NULL); - TypeInfoDeclaration* tid = keytype->getTypeInfoDeclaration(); - assert(tid); - DtoResolveDsymbol(Type::typeinfo); - DtoForceDeclareDsymbol(tid); - assert(tid->llvmValue); - llvm::Value* keyti = tid->llvmValue; + llvm::Value* keyti = to_keyti(key); keyti = DtoBitCast(keyti, funcTy->getParamType(1)); // pkey param @@ -140,7 +140,7 @@ args.push_back(pkey); // call runtime - llvm::Value* ret = gIR->ir->CreateCall(func, args.begin(), args.end(), "aaIn"); + llvm::Value* ret = gIR->ir->CreateCall(func, args.begin(), args.end(), "aa.in"); // cast return value const llvm::Type* targettype = DtoType(type); @@ -151,3 +151,38 @@ } ///////////////////////////////////////////////////////////////////////////////////// + +void DtoAARemove(DValue* aa, DValue* key) +{ + // call: + // extern(C) void _aaDel(AA aa, TypeInfo keyti, void* pkey) + + // first get the runtime function + llvm::Function* func = LLVM_D_GetRuntimeFunction(gIR->module, "_aaDel"); + const llvm::FunctionType* funcTy = func->getFunctionType(); + + Logger::cout() << "_aaDel = " << *func << '\n'; + + // aa param + llvm::Value* aaval = aa->getRVal(); + Logger::cout() << "aaval: " << *aaval << '\n'; + Logger::cout() << "totype: " << *funcTy->getParamType(0) << '\n'; + aaval = DtoBitCast(aaval, funcTy->getParamType(0)); + + // keyti param + llvm::Value* keyti = to_keyti(key); + keyti = DtoBitCast(keyti, funcTy->getParamType(1)); + + // pkey param + llvm::Value* pkey = to_pkey(key); + pkey = DtoBitCast(pkey, funcTy->getParamType(2)); + + // build arg vector + std::vector<llvm::Value*> args; + args.push_back(aaval); + args.push_back(keyti); + args.push_back(pkey); + + // call runtime + gIR->ir->CreateCall(func, args.begin(), args.end(),""); +}