changeset 458:121624c14053

Fixed AA Rvalue-only access (like indexing an AA return value immediately).
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Sat, 02 Aug 2008 22:35:24 +0200
parents d82ebdba4191
children 3a5d6ff8c70f
files gen/aa.cpp gen/aa.h gen/toir.cpp
diffstat 3 files changed, 9 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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);
 
--- 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);