Methods and Initializers 28

This commit is contained in:
nazrin 2025-06-14 14:50:40 +00:00
parent d9dc02b92f
commit 28b0c71be1
12 changed files with 233 additions and 28 deletions

View file

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