directize more (eliminate table use)

This commit is contained in:
dcode
2019-04-02 16:18:44 +02:00
parent 6bf8276746
commit e1bd0050e2
45 changed files with 4202 additions and 5869 deletions

View File

@ -7,6 +7,7 @@ import { ArrayBuffer, ArrayBufferView } from "./arraybuffer";
import { itoa, dtoa, itoa_stream, dtoa_stream, MAX_DOUBLE_LENGTH } from "./util/number";
import { isArray as builtin_isArray } from "./builtins";
import { E_INDEXOUTOFRANGE, E_INVALIDLENGTH, E_EMPTYARRAY, E_HOLEYARRAY } from "./util/error";
import { __gc_mark_members } from "./gc";
/** Ensures that the given array has _at least_ the specified capacity. */
function ensureCapacity(array: ArrayBufferView, minCapacity: i32, alignLog2: u32): void {
@ -815,11 +816,11 @@ export class Array<T> extends ArrayBufferView {
if (isNullable<T>()) {
if (val) {
__ref_mark(val);
call_direct(__runtime_id<T>(), val);
__gc_mark_members(__runtime_id<T>(), val);
}
} else {
__ref_mark(val);
call_direct(__runtime_id<T>(), val);
__gc_mark_members(__runtime_id<T>(), val);
}
cur += sizeof<usize>();
}

View File

@ -133,27 +133,30 @@ var iter: ManagedObject;
}
}
function maybeInit(): void {
if (state == State.INIT) {
if (TRACE) trace("itcm~init");
fromSpace = changetype<ManagedObjectList>(memory.allocate(HEADER_SIZE));
if (TRACE) trace(" fromSpace =", 1, objToRef(fromSpace));
fromSpace.classId = -1; // would error
fromSpace.payloadSize = 0;
fromSpace.clear();
toSpace = changetype<ManagedObjectList>(memory.allocate(HEADER_SIZE));
if (TRACE) trace(" toSpace =", 1, objToRef(toSpace));
toSpace.classId = -1; // would error
toSpace.payloadSize = 0;
toSpace.clear();
iter = toSpace;
state = State.IDLE;
if (TRACE) trace("itcm~state = IDLE");
}
}
/** Performs a single step according to the current state. */
function step(): void {
var obj: ManagedObject;
switch (state) {
case State.INIT: {
if (TRACE) trace("itcm~step/INIT");
fromSpace = changetype<ManagedObjectList>(memory.allocate(HEADER_SIZE));
if (TRACE) trace(" fromSpace =", 1, objToRef(fromSpace));
fromSpace.classId = -1; // would error
fromSpace.payloadSize = 0;
fromSpace.clear();
toSpace = changetype<ManagedObjectList>(memory.allocate(HEADER_SIZE));
if (TRACE) trace(" toSpace =", 1, objToRef(toSpace));
toSpace.classId = -1; // would error
toSpace.payloadSize = 0;
toSpace.clear();
iter = toSpace;
state = State.IDLE;
if (TRACE) trace("itcm~state = IDLE");
// fall-through
}
case State.INIT: unreachable();
case State.IDLE: {
if (TRACE) trace("itcm~step/IDLE");
__gc_mark_roots();
@ -167,8 +170,7 @@ function step(): void {
if (TRACE) trace("itcm~step/MARK", 1, objToRef(obj));
iter = obj;
obj.color = i32(!white);
// TODO: directize through __gc_mark_members
call_indirect(obj.classId, objToRef(obj)); // CLASS~traverse(ref)
__gc_mark_members(obj.classId, objToRef(obj));
} else {
__gc_mark_roots();
if (TRACE) trace("itcm~step/MARK finish");
@ -220,20 +222,18 @@ function objToRef(obj: ManagedObject): usize {
@global @unsafe
export function __ref_collect(): void {
if (TRACE) trace("itcm.collect");
// begin collecting if not yet collecting
switch (state) {
case State.INIT:
case State.IDLE: step();
}
// finish the cycle
maybeInit();
// finish the current state
while (state != State.IDLE) step();
// perform a full cycle
do step(); while (state != State.IDLE);
}
// @ts-ignore: decorator
@global @unsafe
export function __ref_register(ref: usize): void {
if (TRACE) trace("itcm.register", 1, ref);
step(); // also makes sure it's initialized
maybeInit();
var obj = refToObj(ref);
obj.color = white;
fromSpace.push(obj); // sets gc-reserved header fields
@ -243,6 +243,7 @@ export function __ref_register(ref: usize): void {
@global @unsafe
export function __ref_link(ref: usize, parentRef: usize): void {
if (TRACE) trace("itcm.link", 2, ref, parentRef);
maybeInit();
var parent = refToObj(parentRef);
if (parent.color == i32(!white) && refToObj(ref).color == white) parent.makeGray();
}
@ -251,6 +252,7 @@ export function __ref_link(ref: usize, parentRef: usize): void {
@global @unsafe
export function __ref_mark(ref: usize): void {
if (TRACE) trace("itcm.mark", 1, ref);
maybeInit();
var obj = refToObj(ref);
if (obj.color == white) obj.makeGray();
}

View File

@ -1,6 +1,7 @@
import { HEADER, HEADER_SIZE, MAX_BYTELENGTH } from "./util/runtime";
import { runtime, __runtime_id } from "./runtime";
import { E_INDEXOUTOFRANGE, E_INVALIDLENGTH, E_HOLEYARRAY } from "./util/error";
import { __gc_mark_members } from "./gc";
// NOTE: DO NOT USE YET!
@ -81,11 +82,11 @@ export class FixedArray<T> {
if (isNullable<T>()) {
if (val) {
__ref_mark(val);
call_direct(__runtime_id<T>(), val);
__gc_mark_members(__runtime_id<T>(), val);
}
} else {
__ref_mark(val);
call_direct(__runtime_id<T>(), val);
__gc_mark_members(__runtime_id<T>(), val);
}
cur += sizeof<usize>();
}

View File

@ -2,6 +2,7 @@
import { HASH } from "./util/hash";
import { __runtime_id } from "./runtime";
import { __gc_mark_members } from "./gc";
// A deterministic hash map based on CloseTable from https://github.com/jorendorff/dht
@ -283,11 +284,11 @@ export class Map<K,V> {
if (isNullable<K>()) {
if (val) {
__ref_mark(val);
call_direct(__runtime_id<K>(), val);
__gc_mark_members(__runtime_id<K>(), val);
}
} else {
__ref_mark(val);
call_direct(__runtime_id<K>(), val);
__gc_mark_members(__runtime_id<K>(), val);
}
}
if (isManaged<V>()) {
@ -295,11 +296,11 @@ export class Map<K,V> {
if (isNullable<V>()) {
if (val) {
__ref_mark(val);
call_direct(__runtime_id<V>(), val);
__gc_mark_members(__runtime_id<V>(), val);
}
} else {
__ref_mark(val);
call_direct(__runtime_id<V>(), val);
__gc_mark_members(__runtime_id<V>(), val);
}
}
}

View File

@ -2,6 +2,7 @@
import { HASH } from "./util/hash";
import { __runtime_id } from "./runtime";
import { __gc_mark_members } from "./gc";
// A deterministic hash set based on CloseTable from https://github.com/jorendorff/dht
@ -212,11 +213,11 @@ export class Set<K> {
if (isNullable<K>()) {
if (val) {
__ref_mark(val);
call_direct(__runtime_id<K>(), val);
__gc_mark_members(__runtime_id<K>(), val);
}
} else {
__ref_mark(val);
call_direct(__runtime_id<K>(), val);
__gc_mark_members(__runtime_id<K>(), val);
}
}
cur += ENTRY_SIZE<K>();