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