mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-04-25 15:12:12 +00:00
* Rework IR and resolver to use nested lookup tables * Integrate types into IR * Make components prefer IR, slimmed down AST * Implement `export *` * Add `@lazy` annotation and remove `--noTreeShaking` * Add `@start` annotation and remove magic `main` * Related refactoring, cleanup and docs
36 lines
1021 B
TypeScript
36 lines
1021 B
TypeScript
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
|
|
|
|
@start
|
|
export function main(): i32 { return 0; }
|