# HG changeset patch # User lindquist # Date 1211910809 -7200 # Node ID f66219e0d530007b65dc50a7cb16f2ecc539ecde # Parent 1d6cfdbc97f00ed965dd190af9778af3af109c59 [svn r227] Fixed: crash in lifetime.d when resizing array of AAs by .length assignment. diff -r 1d6cfdbc97f0 -r f66219e0d530 dmd/mtype.c --- a/dmd/mtype.c Wed May 14 02:00:23 2008 +0200 +++ b/dmd/mtype.c Tue May 27 19:53:29 2008 +0200 @@ -2333,6 +2333,11 @@ return e; } +int TypeAArray::isZeroInit() +{ + return 1; +} + int TypeAArray::checkBoolean() { return TRUE; diff -r 1d6cfdbc97f0 -r f66219e0d530 dmd/mtype.h --- a/dmd/mtype.h Wed May 14 02:00:23 2008 +0200 +++ b/dmd/mtype.h Tue May 27 19:53:29 2008 +0200 @@ -360,6 +360,7 @@ 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 -r 1d6cfdbc97f0 -r f66219e0d530 gen/arrays.cpp --- a/gen/arrays.cpp Wed May 14 02:00:23 2008 +0200 +++ b/gen/arrays.cpp Tue May 27 19:53:29 2008 +0200 @@ -545,7 +545,10 @@ 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 -r 1d6cfdbc97f0 -r f66219e0d530 tango/lib/compiler/llvmdc/lifetime.d --- a/tango/lib/compiler/llvmdc/lifetime.d Wed May 14 02:00:23 2008 +0200 +++ b/tango/lib/compiler/llvmdc/lifetime.d Tue May 27 19:53:29 2008 +0200 @@ -514,9 +514,8 @@ 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 @@ 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 @@ 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 @@ } 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