comparison gen/toir.cpp @ 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 e096a1502428
comparison
equal deleted inserted replaced
591:e6bcc4d9e5ff 592:5fb7ed0ac580
2166 // dmd seems to just make them null... 2166 // dmd seems to just make them null...
2167 return new DSliceValue(type, DtoConstSize_t(0), getNullPtr(getPtrToType(llElemType))); 2167 return new DSliceValue(type, DtoConstSize_t(0), getNullPtr(getPtrToType(llElemType)));
2168 } 2168 }
2169 2169
2170 // dst pointer 2170 // dst pointer
2171 // FIXME: dynamic array literals should be allocated with the GC 2171 LLValue* dstMem;
2172 LLValue* dstMem = DtoAlloca(llStoType, "arrayliteral"); 2172 DSliceValue* dynSlice = NULL;
2173 if(dyn)
2174 {
2175 dynSlice = DtoNewDynArray(loc, arrayType, new DConstValue(Type::tsize_t, DtoConstSize_t(len)), false);
2176 dstMem = dynSlice->ptr;
2177 }
2178 else
2179 dstMem = DtoAlloca(llStoType, "arrayliteral");
2173 2180
2174 // store elements 2181 // store elements
2175 for (size_t i=0; i<len; ++i) 2182 for (size_t i=0; i<len; ++i)
2176 { 2183 {
2177 Expression* expr = (Expression*)elements->data[i]; 2184 Expression* expr = (Expression*)elements->data[i];
2178 LLValue* elemAddr = DtoGEPi(dstMem,0,i,"tmp",p->scopebb()); 2185 LLValue* elemAddr;
2186 if(dyn)
2187 elemAddr = DtoGEPi1(dstMem, i, "tmp", p->scopebb());
2188 else
2189 elemAddr = DtoGEPi(dstMem,0,i,"tmp",p->scopebb());
2179 2190
2180 // emulate assignment 2191 // emulate assignment
2181 DVarValue* vv = new DVarValue(expr->type, elemAddr); 2192 DVarValue* vv = new DVarValue(expr->type, elemAddr);
2182 DValue* e = expr->toElem(p); 2193 DValue* e = expr->toElem(p);
2183 DtoAssign(loc, vv, e); 2194 DtoAssign(loc, vv, e);
2185 2196
2186 // return storage directly ? 2197 // return storage directly ?
2187 if (!dyn) 2198 if (!dyn)
2188 return new DImValue(type, dstMem); 2199 return new DImValue(type, dstMem);
2189 2200
2190 // wrap in a slice 2201 // return slice
2191 return new DSliceValue(type, DtoConstSize_t(len), DtoGEPi(dstMem,0,0,"tmp")); 2202 return dynSlice;
2192 } 2203 }
2193 2204
2194 ////////////////////////////////////////////////////////////////////////////////////////// 2205 //////////////////////////////////////////////////////////////////////////////////////////
2195 2206
2196 LLConstant* ArrayLiteralExp::toConstElem(IRState* p) 2207 LLConstant* ArrayLiteralExp::toConstElem(IRState* p)