mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-11 18:33:14 +01:00
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:
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user