module "main" extern "puts" func puts(text: cstring) extern "malloc" func malloc(size: u64): ^void extern "free" func free(address: ^void) struct Human { name: cstring } extern "main" func main(args: []cstring): i64 { let x: ref = {} test(x) return 0 } func test(x: ref) { } struct ref { value: ^T count: ^u64 @oncreate func on_create() { puts("on_create") this.value = @interpret(^T, malloc(@size(T))) this.count = @interpret(^u64, malloc(@size(u64))) this.count^ = 1 } @oncopy func on_copy() { puts("on_copy") this.count^ = this.count^ + 1 } @ondestroy func on_destroy() { puts("on_destroy") this.count^ = this.count^ - 1 if this.count^ <= 0 { puts("free") free(@interpret(^void, this.value)) free(@interpret(^void, this.count)) } } }