Skip to content

Commit 661e239

Browse files
committed
refactor
1 parent 0c537c3 commit 661e239

File tree

4 files changed

+255
-279
lines changed

4 files changed

+255
-279
lines changed

std/assembly/internal/runtime.ts renamed to std/assembly/runtime/index.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
import { AL_MASK } from "./allocator";
1+
import { AL_MASK } from "../internal/allocator";
22
import { __rt_classid } from "../builtins";
33

44
/** Common runtime header of all objects. */
5-
@unmanaged
6-
export class HEADER {
5+
@unmanaged export class HEADER {
76
/** Unique id of the respective class or a magic value if not yet registered.*/
87
classId: u32;
98
/** Size of the allocated payload. */
@@ -67,7 +66,10 @@ export function REALLOC(ref: usize, newPayloadSize: u32): usize {
6766
let newRef = changetype<usize>(newHeader) + HEADER_SIZE;
6867
memory.copy(newRef, ref, payloadSize);
6968
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+
}
7173
header = newHeader;
7274
ref = newRef;
7375
} else {
@@ -83,20 +85,21 @@ export function REALLOC(ref: usize, newPayloadSize: u32): usize {
8385
return ref;
8486
}
8587

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 {
8889
assert(ref >= HEAP_BASE + HEADER_SIZE); // must be a heap object
8990
var header = changetype<HEADER>(ref - HEADER_SIZE);
9091
assert(header.classId == HEADER_MAGIC); // must be unregistered
91-
memory.free(changetype<usize>(header));
92+
return header;
9293
}
9394

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>();
100103
if (GC) __REGISTER_IMPL(ref, parentRef); // tslint:disable-line
101104
}
102105

0 commit comments

Comments
 (0)