Mercurial > projects > ldc
diff gen/arrays.cpp @ 591:e6bcc4d9e5ff
Add _d_newarrayvT and _d_newarraymvT to create arrays without initialization.
Adjust DtoNewDynArray to use DtoArrayInit for initialization of new arrays.
Make Type::tvoid->defaultInit() not error.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Sun, 14 Sep 2008 10:13:50 +0200 |
parents | 192b82878b78 |
children | 7042d912767e |
line wrap: on
line diff
--- a/gen/arrays.cpp Fri Sep 12 13:11:32 2008 +0200 +++ b/gen/arrays.cpp Sun Sep 14 10:13:50 2008 +0200 @@ -399,7 +399,7 @@ } ////////////////////////////////////////////////////////////////////////////////////////// -DSliceValue* DtoNewDynArray(Type* arrayType, DValue* dim, bool defaultInit) +DSliceValue* DtoNewDynArray(Loc& loc, Type* arrayType, DValue* dim, bool defaultInit) { Logger::println("DtoNewDynArray : %s", arrayType->toChars()); LOG_SCOPE; @@ -412,8 +412,7 @@ LLValue* arrayLen = dim->getRVal(); // get runtime function - bool zeroInit = arrayType->toBasetype()->nextOf()->isZeroInit(); - LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, zeroInit ? "_d_newarrayT" : "_d_newarrayiT" ); + LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_newarrayvT"); // call allocator LLValue* newptr = gIR->CreateCallOrInvoke2(fn, arrayTypeInfo, arrayLen, ".gc_mem")->get(); @@ -425,18 +424,18 @@ Logger::cout() << "final ptr = " << *newptr << '\n'; -#if 0 + DSliceValue* ret = new DSliceValue(arrayType, arrayLen, newptr); + if (defaultInit) { - DValue* e = dty->defaultInit()->toElem(gIR); - DtoArrayInit(newptr,dim,e->getRVal()); + DValue* e = arrayType->nextOf()->defaultInit()->toElem(gIR); + DtoArrayInit(loc, ret, e); } -#endif - return new DSliceValue(arrayType, arrayLen, newptr); + return ret; } ////////////////////////////////////////////////////////////////////////////////////////// -DSliceValue* DtoNewMulDimDynArray(Type* arrayType, DValue** dims, size_t ndims, bool defaultInit) +DSliceValue* DtoNewMulDimDynArray(Loc& loc, Type* arrayType, DValue** dims, size_t ndims, bool defaultInit) { Logger::println("DtoNewMulDimDynArray : %s", arrayType->toChars()); LOG_SCOPE; @@ -474,6 +473,7 @@ Logger::cout() << "final ptr = " << *newptr << '\n'; #if 0 + // using this would reinit all arrays beyond the first level to [] if (defaultInit) { DValue* e = dty->defaultInit()->toElem(gIR); DtoArrayInit(newptr,dim,e->getRVal()); @@ -597,7 +597,7 @@ res = gIR->ir->CreateAdd(len1,len2,"tmp"); DValue* lenval = new DImValue(Type::tsize_t, res); - DSliceValue* slice = DtoNewDynArray(type, lenval, false); + DSliceValue* slice = DtoNewDynArray(exp1->loc, type, lenval, false); LLValue* mem = slice->ptr; src1 = DtoArrayPtr(e1); @@ -637,7 +637,7 @@ res = gIR->ir->CreateAdd(len1,DtoConstSize_t(1),"tmp"); DValue* lenval = new DImValue(Type::tsize_t, res); - DSliceValue* slice = DtoNewDynArray(type, lenval, false); + DSliceValue* slice = DtoNewDynArray(exp1->loc, type, lenval, false); LLValue* mem = slice->ptr; DVarValue* memval = new DVarValue(e1->getType(), mem); @@ -661,7 +661,7 @@ res = gIR->ir->CreateAdd(len1,DtoConstSize_t(1),"tmp"); DValue* lenval = new DImValue(Type::tsize_t, res); - DSliceValue* slice = DtoNewDynArray(type, lenval, false); + DSliceValue* slice = DtoNewDynArray(exp1->loc, type, lenval, false); LLValue* mem = slice->ptr; src1 = DtoArrayPtr(e1);