Mercurial > projects > ldc
changeset 490:f8c979770af3
Fixed a critical bug in the runtime, where _d_allocmemoryT would mark
the memory block as having pointers (for scanning) opposite of what it
should. So pointers would not be seen and freed. Should fix a bunch of
regressions with AAs.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Sun, 10 Aug 2008 17:28:01 +0200 |
parents | 822774a94750 |
children | c0ceb8c83ab5 |
files | gen/llvmhelpers.h runtime/internal/lifetime.d tests/mini/aa7.d |
diffstat | 3 files changed, 7 insertions(+), 50 deletions(-) [+] |
line wrap: on
line diff
--- a/gen/llvmhelpers.h Sun Aug 10 13:42:08 2008 +0200 +++ b/gen/llvmhelpers.h Sun Aug 10 17:28:01 2008 +0200 @@ -42,15 +42,9 @@ // gets the context value for a call to a nested function or newing a class, with arbitrary nesting LLValue* DtoNestedContext(Loc loc, Dsymbol* sym); - // gets the dvalue of a nested variable with arbitrary nesting DValue* DtoNestedVariable(Loc loc, Type* astype, VarDeclaration* vd); -// old nested stuff -// LLValue* DtoNestedContext(Loc loc, FuncDeclaration* func); -// LLValue* DtoNestedContext(Loc loc, ClassDeclaration* cd); -// DValue* DtoNestedVariable(Loc loc, Type* astype, VarDeclaration* vd); - // basic operations void DtoAssign(Loc& loc, DValue* lhs, DValue* rhs);
--- a/runtime/internal/lifetime.d Sun Aug 10 13:42:08 2008 +0200 +++ b/runtime/internal/lifetime.d Sun Aug 10 17:28:01 2008 +0200 @@ -407,7 +407,7 @@ */ extern (C) void* _d_allocmemoryT(TypeInfo ti) { - return gc_malloc(ti.tsize(), (ti.flags() & 1) ? BlkAttr.NO_SCAN : 0); + return gc_malloc(ti.tsize(), !(ti.flags() & 1) ? BlkAttr.NO_SCAN : 0); } /**
--- a/tests/mini/aa7.d Sun Aug 10 13:42:08 2008 +0200 +++ b/tests/mini/aa7.d Sun Aug 10 17:28:01 2008 +0200 @@ -1,56 +1,19 @@ -// adapted from dstress.run.a.associative_array_19_A to catch regressions early +// adapted from dstress.run.a.associative_array_19_<n> to catch regressions early module mini.aa7; extern (C) int printf(char*, ...); - extern (C) void gc_collect(); -union Key{ - char x; -} - -class Payload { - this(Key value) { - value.x += 1; - _value = value; - } - - Key value() { - return _value; - } - - Key _value; -} int main(){ - Payload[Key] aa; - - Key[] allKeys; - static Key a = { 'a' }; - static Key b = { 'b' }; - static Key c = { 'c' }; - allKeys ~= a; - allKeys ~= b; - allKeys ~= c; - - foreach(Key key; allKeys) { - aa[key] = new Payload(key); - } + char*[char] aa; - int i = 0; - foreach(Key key; allKeys) { - printf("1st #%d\n", i++); - assert(key in aa); - } - + char key = 'a'; + aa[key] = &key; gc_collect(); - - i = 0; - foreach(Key key; allKeys) { - printf("2nd #%d\n", i++); - assert(key in aa); - } + assert(aa[key] == &key); + assert(key in aa); return 0; }