import "allocator/arena"; import "collector/itcm"; // a class to test with class MyObject { a: u32; } function MyObject_visit(ref: usize): void {} // function table index == classId ? // allocate a managed instance var obj: MyObject | null = changetype(__gc_allocate(offsetof(), MyObject_visit)); obj.a = 123; // check header { let head = changetype(obj) - 16; let next = load(head, 0) & ~3; let prev = load(head, 4); assert(next != 0 && prev != 0 && next == prev); let visitFn = load(head, 8); assert(visitFn == changetype(MyObject_visit)); let unused = load(head, 12); assert(unused == 0); let a = load(head, 16); assert(a == 123); } gc.collect(); // should keep 'obj' because it's a referenced root (see trace output) obj = null; gc.collect(); // should free 'obj' because it isn't referenced anymore (see trace output) var obj2: MyObject; // should also iterate globals defined late export function main(): i32 { return 0; }