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;
 }