1
- import { AL_MASK } from "./allocator" ;
1
+ import { AL_MASK } from "../internal /allocator" ;
2
2
import { __rt_classid } from "../builtins" ;
3
3
4
4
/** Common runtime header of all objects. */
5
- @unmanaged
6
- export class HEADER {
5
+ @unmanaged export class HEADER {
7
6
/** Unique id of the respective class or a magic value if not yet registered.*/
8
7
classId : u32 ;
9
8
/** Size of the allocated payload. */
@@ -67,7 +66,10 @@ export function REALLOC(ref: usize, newPayloadSize: u32): usize {
67
66
let newRef = changetype < usize > ( newHeader ) + HEADER_SIZE ;
68
67
memory . copy ( newRef , ref , payloadSize ) ;
69
68
memory . fill ( newRef + payloadSize , 0 , newPayloadSize - payloadSize ) ;
70
- memory . free ( changetype < usize > ( header ) ) ;
69
+ if ( header . classId == HEADER_MAGIC ) {
70
+ // free right away if not registered yet
71
+ memory . free ( changetype < usize > ( header ) ) ;
72
+ }
71
73
header = newHeader ;
72
74
ref = newRef ;
73
75
} else {
@@ -83,20 +85,21 @@ export function REALLOC(ref: usize, newPayloadSize: u32): usize {
83
85
return ref ;
84
86
}
85
87
86
- /** Frees an object. Must not have been registered with GC yet. */
87
- export function FREE ( ref : usize ) : void {
88
+ function ensureUnregistered ( ref : usize ) : HEADER {
88
89
assert ( ref >= HEAP_BASE + HEADER_SIZE ) ; // must be a heap object
89
90
var header = changetype < HEADER > ( ref - HEADER_SIZE ) ;
90
91
assert ( header . classId == HEADER_MAGIC ) ; // must be unregistered
91
- memory . free ( changetype < usize > ( header ) ) ;
92
+ return header ;
92
93
}
93
94
94
- /** Registers a managed object with GC. Cannot be changed anymore afterwards. */
95
- export function REGISTER < T > ( ref : usize , parentRef : usize ) : void {
96
- assert ( ref >= HEAP_BASE + HEADER_SIZE ) ; // must be a heap object
97
- var header = changetype < HEADER > ( ref - HEADER_SIZE ) ;
98
- assert ( header . classId == HEADER_MAGIC ) ; // must be unregistered
99
- header . classId = __rt_classid < T > ( ) ;
95
+ /** Frees an object. Must not have been registered with GC yet. */
96
+ export function FREE ( ref : usize ) : void {
97
+ memory . free ( changetype < usize > ( ensureUnregistered ( ref ) ) ) ;
98
+ }
99
+
100
+ /** Registers a managed object with GC. Cannot be free'd anymore afterwards. */
101
+ @inline export function REGISTER < T > ( ref : usize , parentRef : usize ) : void {
102
+ ensureUnregistered ( ref ) . classId = __rt_classid < T > ( ) ;
100
103
if ( GC ) __REGISTER_IMPL ( ref , parentRef ) ; // tslint:disable-line
101
104
}
102
105
0 commit comments