mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-06-23 19:51:47 +00:00
directize more (eliminate table use)
This commit is contained in:
@ -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>();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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>();
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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>();
|
||||
|
Reference in New Issue
Block a user