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)) // } // } // }