# HG changeset patch # User Tomas Lindquist Olsen # Date 1217709324 -7200 # Node ID 121624c1405382ba396a4254a39854ce2473c999 # Parent d82ebdba4191d928513d97bd6536f0bc68389f57 Fixed AA Rvalue-only access (like indexing an AA return value immediately). diff -r d82ebdba4191 -r 121624c14053 gen/aa.cpp --- a/gen/aa.cpp Sat Aug 02 21:51:49 2008 +0200 +++ b/gen/aa.cpp Sat Aug 02 22:35:24 2008 +0200 @@ -66,17 +66,19 @@ ///////////////////////////////////////////////////////////////////////////////////// -DValue* DtoAAIndex(Loc& loc, Type* type, DValue* aa, DValue* key) +DValue* DtoAAIndex(Loc& loc, Type* type, DValue* aa, DValue* key, bool lvalue) { // call: - // extern(C) void* _aaGet(AA* aa, TypeInfo keyti, void* pkey, size_t valuesize) + // extern(C) void* _aaGet(AA* aa, TypeInfo keyti, size_t valuesize, void* pkey) + // or + // extern(C) void* _aaGetRvalue(AA aa, TypeInfo keyti, size_t valuesize, void* pkey) // first get the runtime function - llvm::Function* func = LLVM_D_GetRuntimeFunction(gIR->module, "_aaGet"); + llvm::Function* func = LLVM_D_GetRuntimeFunction(gIR->module, lvalue?"_aaGet":"_aaGetRvalue"); const llvm::FunctionType* funcTy = func->getFunctionType(); // aa param - LLValue* aaval = aa->getLVal(); + LLValue* aaval = lvalue ? aa->getLVal() : aa->getRVal(); aaval = DtoBitCast(aaval, funcTy->getParamType(0)); // keyti param diff -r d82ebdba4191 -r 121624c14053 gen/aa.h --- a/gen/aa.h Sat Aug 02 21:51:49 2008 +0200 +++ b/gen/aa.h Sat Aug 02 22:35:24 2008 +0200 @@ -1,7 +1,7 @@ #ifndef LLVMDC_GEN_AA_H #define LLVMDC_GEN_AA_H -DValue* DtoAAIndex(Loc& loc, Type* type, DValue* aa, DValue* key); +DValue* DtoAAIndex(Loc& loc, Type* type, DValue* aa, DValue* key, bool lvalue); DValue* DtoAAIn(Loc& loc, Type* type, DValue* aa, DValue* key); void DtoAARemove(Loc& loc, DValue* aa, DValue* key); diff -r d82ebdba4191 -r 121624c14053 gen/toir.cpp --- a/gen/toir.cpp Sat Aug 02 21:51:49 2008 +0200 +++ b/gen/toir.cpp Sat Aug 02 22:35:24 2008 +0200 @@ -1034,7 +1034,7 @@ arrptr = DtoGEP1(arrptr,r->getRVal()); } else if (e1type->ty == Taarray) { - return DtoAAIndex(loc, type, l, r); + return DtoAAIndex(loc, type, l, r, modifiable); } else { Logger::println("invalid index exp! e1type: %s", e1type->toChars()); @@ -2255,7 +2255,7 @@ // index DValue* key = ekey->toElem(p); - DValue* mem = DtoAAIndex(loc, vtype, aa, key); + DValue* mem = DtoAAIndex(loc, vtype, aa, key, true); // store DValue* val = eval->toElem(p);