changeset 592:5fb7ed0ac580

Allocate dynamic array literals on the heap.
author Christian Kamm <kamm incasoftware de>
date Sun, 14 Sep 2008 10:56:01 +0200
parents e6bcc4d9e5ff
children 7042d912767e
files gen/toir.cpp
diffstat 1 files changed, 16 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/gen/toir.cpp	Sun Sep 14 10:13:50 2008 +0200
+++ b/gen/toir.cpp	Sun Sep 14 10:56:01 2008 +0200
@@ -2168,14 +2168,25 @@
     }
 
     // dst pointer
-    // FIXME: dynamic array literals should be allocated with the GC
-    LLValue* dstMem = DtoAlloca(llStoType, "arrayliteral");
+    LLValue* dstMem;
+    DSliceValue* dynSlice = NULL;
+    if(dyn)
+    {
+        dynSlice = DtoNewDynArray(loc, arrayType, new DConstValue(Type::tsize_t, DtoConstSize_t(len)), false);
+        dstMem = dynSlice->ptr;
+    }
+    else
+        dstMem = DtoAlloca(llStoType, "arrayliteral");
 
     // store elements
     for (size_t i=0; i<len; ++i)
     {
         Expression* expr = (Expression*)elements->data[i];
-        LLValue* elemAddr = DtoGEPi(dstMem,0,i,"tmp",p->scopebb());
+        LLValue* elemAddr;
+        if(dyn)
+            elemAddr = DtoGEPi1(dstMem, i, "tmp", p->scopebb());
+        else
+            elemAddr = DtoGEPi(dstMem,0,i,"tmp",p->scopebb());
 
         // emulate assignment
         DVarValue* vv = new DVarValue(expr->type, elemAddr);
@@ -2187,8 +2198,8 @@
     if (!dyn)
         return new DImValue(type, dstMem);
 
-    // wrap in a slice
-    return new DSliceValue(type, DtoConstSize_t(len), DtoGEPi(dstMem,0,0,"tmp"));
+    // return slice
+    return dynSlice;
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////