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.
This commit is contained in:
Tomas Lindquist Olsen
2008-08-10 17:28:01 +02:00
parent d81aeb0d28
commit 43567aca3b
3 changed files with 7 additions and 50 deletions

View File

@@ -42,15 +42,9 @@ void DtoLeaveMonitor(LLValue* v);
// 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);

View File

@@ -407,7 +407,7 @@ void* _d_allocmemory(size_t nbytes)
*/
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);
}
/**

View File

@@ -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);
}
int i = 0;
foreach(Key key; allKeys) {
printf("1st #%d\n", i++);
assert(key in aa);
}
char*[char] 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;
}