mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-06-17 08:51:34 +00:00
Initial GC integration (#196)
This commit is contained in:
34
tests/compiler/std/gc-basics.ts
Normal file
34
tests/compiler/std/gc-basics.ts
Normal file
@ -0,0 +1,34 @@
|
||||
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<MyObject>(__gc_allocate(offsetof<MyObject>(), MyObject_visit));
|
||||
obj.a = 123;
|
||||
|
||||
// check header
|
||||
{
|
||||
let head = changetype<usize>(obj) - 16;
|
||||
let next = load<u32>(head, 0) & ~3;
|
||||
let prev = load<u32>(head, 4);
|
||||
assert(next != 0 && prev != 0 && next == prev);
|
||||
let visitFn = load<u32>(head, 8);
|
||||
assert(visitFn == changetype<u32>(MyObject_visit));
|
||||
let unused = load<u32>(head, 12);
|
||||
assert(unused == 0);
|
||||
let a = load<u32>(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; }
|
Reference in New Issue
Block a user