Mercurial > projects > ldc
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) |