Methods and Initializers 28
This commit is contained in:
parent
d9dc02b92f
commit
28b0c71be1
12 changed files with 233 additions and 28 deletions
|
|
@ -50,7 +50,7 @@ void collectGarbage(){
|
|||
vm.nextGC = conf.nextGCGrowthFunc(vm.bytesAllocated);
|
||||
}
|
||||
}
|
||||
void mark(O)(O* o) if(is(O == Obj) || __traits(hasMember, O, "obj")){
|
||||
void mark(O)(O* o) if(is(O == Obj) || __traits(getMember, O, "obj").offsetof == 0){
|
||||
Obj* object = cast(Obj*)o;
|
||||
if(object is null || object.isMarked)
|
||||
return;
|
||||
|
|
@ -85,6 +85,7 @@ private void markRoots(){
|
|||
mark(upvalue);
|
||||
}
|
||||
mark(vm.globals);
|
||||
mark(vm.initString);
|
||||
markCompilerRoots();
|
||||
}
|
||||
private void blacken(Obj* object){
|
||||
|
|
@ -110,6 +111,7 @@ private void blacken(Obj* object){
|
|||
break;
|
||||
case Obj.Type.Class:
|
||||
Obj.Class* cls = object.asClass;
|
||||
mark(cls.methods);
|
||||
mark(cls.name);
|
||||
break;
|
||||
case Obj.Type.Instance:
|
||||
|
|
@ -117,6 +119,11 @@ private void blacken(Obj* object){
|
|||
mark(ins.cls);
|
||||
mark(ins.fields);
|
||||
break;
|
||||
case Obj.Type.BoundMethod:
|
||||
Obj.BoundMethod* bm = object.asBoundMethod;
|
||||
mark(bm.receiver);
|
||||
mark(bm.method);
|
||||
break;
|
||||
case Obj.Type.None: assert(0);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue