[svn r227] Fixed: crash in lifetime.d when resizing array of AAs by .length assignment.

This commit is contained in:
Tomas Lindquist Olsen 2008-05-27 19:53:29 +02:00
parent a954f06e90
commit 6b735db510
4 changed files with 18 additions and 10 deletions

View file

@ -2333,6 +2333,11 @@ Expression *TypeAArray::defaultInit(Loc loc)
return e;
}
int TypeAArray::isZeroInit()
{
return 1;
}
int TypeAArray::checkBoolean()
{
return TRUE;

View file

@ -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();

View file

@ -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<llvm::Value*,4> args;

View file

@ -514,8 +514,7 @@ body
debug(PRINTF)
{
printf("_d_arraysetlengthT(p = %p, sizeelem = %d, newlength = %d)\n", p, sizeelem, newlength);
if (p)
printf("_d_arraysetlengthT(sizeelem = %d, newlength = %d)\n", sizeelem, newlength);
printf("\tp.data = %p, p.length = %d\n", pdata, plength);
}
@ -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,8 +613,7 @@ body
debug(PRINTF)
{
printf("_d_arraysetlengthiT(p = %p, sizeelem = %d, newlength = %d, initsize = %d)\n", p, sizeelem, newlength, initsize);
if (p)
printf("_d_arraysetlengthiT(sizeelem = %d, newlength = %d, initsize = %d)\n", sizeelem, newlength, initsize);
printf("\tp.data = %p, p.length = %d\n", pdata, plength);
}
@ -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