diff --git a/dmd/mtype.c b/dmd/mtype.c index fa927a84..974b7cb0 100644 --- a/dmd/mtype.c +++ b/dmd/mtype.c @@ -2333,6 +2333,11 @@ Expression *TypeAArray::defaultInit(Loc loc) return e; } +int TypeAArray::isZeroInit() +{ + return 1; +} + int TypeAArray::checkBoolean() { return TRUE; diff --git a/dmd/mtype.h b/dmd/mtype.h index 524f99d8..17e9a4a5 100644 --- a/dmd/mtype.h +++ b/dmd/mtype.h @@ -360,6 +360,7 @@ struct TypeAArray : TypeArray Expression *dotExp(Scope *sc, Expression *e, Identifier *ident); Expression *defaultInit(Loc loc); MATCH deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes); + int isZeroInit(); int checkBoolean(); TypeInfoDeclaration *getTypeInfoDeclaration(); int hasPointers(); diff --git a/gen/arrays.cpp b/gen/arrays.cpp index d4bf7df4..aac43ffc 100644 --- a/gen/arrays.cpp +++ b/gen/arrays.cpp @@ -545,7 +545,10 @@ DSliceValue* DtoResizeDynArray(Type* arrayType, DValue* array, DValue* newdim) assert(arrayType); assert(arrayType->toBasetype()->ty == Tarray); - bool zeroInit = arrayType->toBasetype()->nextOf()->isZeroInit(); + // decide on what runtime function to call based on whether the type is zero initialized + bool zeroInit = arrayType->toBasetype()->next->isZeroInit(); + + // call runtime llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, zeroInit ? "_d_arraysetlengthT" : "_d_arraysetlengthiT" ); llvm::SmallVector args; diff --git a/tango/lib/compiler/llvmdc/lifetime.d b/tango/lib/compiler/llvmdc/lifetime.d index d48d3867..5ba3655d 100644 --- a/tango/lib/compiler/llvmdc/lifetime.d +++ b/tango/lib/compiler/llvmdc/lifetime.d @@ -514,9 +514,8 @@ body debug(PRINTF) { - printf("_d_arraysetlengthT(p = %p, sizeelem = %d, newlength = %d)\n", p, sizeelem, newlength); - if (p) - printf("\tp.data = %p, p.length = %d\n", pdata, plength); + printf("_d_arraysetlengthT(sizeelem = %d, newlength = %d)\n", sizeelem, newlength); + printf("\tp.data = %p, p.length = %d\n", pdata, plength); } if (newlength) @@ -602,8 +601,9 @@ in body { byte* newdata; - size_t sizeelem = ti.next.tsize(); - void[] initializer = ti.next.init(); + TypeInfo tinext = ti.next; + size_t sizeelem = tinext.tsize(); + void[] initializer = tinext.init(); size_t initsize = initializer.length; assert(sizeelem); @@ -613,9 +613,8 @@ body debug(PRINTF) { - printf("_d_arraysetlengthiT(p = %p, sizeelem = %d, newlength = %d, initsize = %d)\n", p, sizeelem, newlength, initsize); - if (p) - printf("\tp.data = %p, p.length = %d\n", pdata, plength); + printf("_d_arraysetlengthiT(sizeelem = %d, newlength = %d, initsize = %d)\n", sizeelem, newlength, initsize); + printf("\tp.data = %p, p.length = %d\n", pdata, plength); } if (newlength) @@ -668,7 +667,7 @@ body } else { - newdata = cast(byte *)gc_malloc(newsize + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); + newdata = cast(byte *)gc_malloc(newsize + 1, !(tinext.flags() & 1) ? BlkAttr.NO_SCAN : 0); } auto q = initializer.ptr; // pointer to initializer