Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
123 commits
Select commit Hold shift + click to select a range
80fb450
Runtime experiment
dcodeIO Mar 8, 2019
878ee3f
fix
dcodeIO Mar 8, 2019
979a0b8
simplify
dcodeIO Mar 8, 2019
dd5430a
simplify more
dcodeIO Mar 8, 2019
911a4bb
design
dcodeIO Mar 8, 2019
0ad9d56
integrate
dcodeIO Mar 8, 2019
4f1a971
make it test again
dcodeIO Mar 9, 2019
0c537c3
test a few things
dcodeIO Mar 9, 2019
661e239
refactor
dcodeIO Mar 9, 2019
5c25b0c
refactor
dcodeIO Mar 9, 2019
5a2ab3d
what std/string would look like
dcodeIO Mar 10, 2019
cb77760
unsafe, stub
dcodeIO Mar 10, 2019
85b740d
fix
dcodeIO Mar 10, 2019
f076826
update std/string
dcodeIO Mar 10, 2019
ce82e54
unshiftify padEnd
dcodeIO Mar 11, 2019
ebe92c6
untrampoline padEnd
dcodeIO Mar 11, 2019
1198e71
same for padStart
dcodeIO Mar 11, 2019
d9a5681
arraybufferview
dcodeIO Mar 11, 2019
146dfdb
it's all broken
dcodeIO Mar 11, 2019
8e95867
I'm lost
dcodeIO Mar 12, 2019
36d54d6
slowly but steadily
dcodeIO Mar 12, 2019
e78c4c7
more
dcodeIO Mar 13, 2019
37d361b
dataview
dcodeIO Mar 13, 2019
707f2da
more
dcodeIO Mar 13, 2019
e581f25
fix
dcodeIO Mar 13, 2019
6f70826
hmm
dcodeIO Mar 13, 2019
e38f627
more
dcodeIO Mar 13, 2019
6163a73
take a step back
dcodeIO Mar 14, 2019
a5e14a0
srsly
dcodeIO Mar 14, 2019
84ddd97
if that's what's necessary
dcodeIO Mar 14, 2019
3b8c233
symbols
dcodeIO Mar 14, 2019
ea43f9f
what's that btw
dcodeIO Mar 14, 2019
cdf3e2c
fixes
dcodeIO Mar 14, 2019
3a60638
simplify
dcodeIO Mar 14, 2019
d3ca06b
inline single-use implementations
dcodeIO Mar 14, 2019
139cec0
Merge branch 'master' into runtime
dcodeIO Mar 14, 2019
968b032
decisions
dcodeIO Mar 15, 2019
058dc8d
static array stuff
dcodeIO Mar 15, 2019
b8a08da
more static array
dcodeIO Mar 16, 2019
05a35f4
more
dcodeIO Mar 16, 2019
0c388ca
make std/string test ok again
dcodeIO Mar 16, 2019
2d76da9
alias locals when inlining a tail call
dcodeIO Mar 16, 2019
e63c6bd
local flow flags, see what works
dcodeIO Mar 17, 2019
f21b339
checked builtin array get, optimize abv layout
dcodeIO Mar 17, 2019
edb2299
fixes
dcodeIO Mar 17, 2019
ba4c00e
clean
dcodeIO Mar 17, 2019
c147e98
capabilities to detect half/full runtime header
dcodeIO Mar 18, 2019
0932cf1
use overloads for checked access
dcodeIO Mar 18, 2019
83566a5
eliminate unnecessary tee+drop in unchecked set
dcodeIO Mar 18, 2019
7693b54
optimize array literal init, warn on unsupported inlining
dcodeIO Mar 19, 2019
d42ef51
update n-body for comparison
dcodeIO Mar 19, 2019
74789c9
aliased makeCallInline, unmanaged rt alloc
dcodeIO Mar 19, 2019
81039c4
FixedArray experimentation
dcodeIO Mar 19, 2019
89b9d46
link on property assign
dcodeIO Mar 19, 2019
5fb3077
rt unlink
dcodeIO Mar 20, 2019
9b664dc
harden / elaborate on makeCallInline
dcodeIO Mar 20, 2019
952ac86
stdlib unlink wiring
dcodeIO Mar 20, 2019
f44dbf2
quick pure gc prototype
dcodeIO Mar 20, 2019
88a595f
some thoughts on pure gc
dcodeIO Mar 20, 2019
658a380
whoops
dcodeIO Mar 20, 2019
3fc9f55
more general gc hooks?
dcodeIO Mar 21, 2019
d4d5814
rt docs, initial itcm wiring
dcodeIO Mar 21, 2019
d9463c5
dummy gc
dcodeIO Mar 21, 2019
e57fa14
give it a shot
dcodeIO Mar 21, 2019
c2ac1a0
what if..
dcodeIO Mar 21, 2019
7c0dc66
guard, info on never null, more general array rt
dcodeIO Mar 22, 2019
3146f8f
use gc interface directly, document
dcodeIO Mar 26, 2019
bb1609c
baseline
dcodeIO Mar 27, 2019
f7ad5f8
fixes
dcodeIO Mar 27, 2019
a309547
Merge branch 'master' into runtime
dcodeIO Mar 27, 2019
e36722f
unify mem/ref interface
dcodeIO Mar 27, 2019
41abc01
readme [ci skip]
dcodeIO Mar 27, 2019
0dcfcc7
external gc interface
dcodeIO Mar 28, 2019
01fad52
fix allocator tests
dcodeIO Mar 29, 2019
97d1f6e
atomics option?
dcodeIO Mar 29, 2019
72c1dbf
maybe..
dcodeIO Mar 29, 2019
6911f9d
clear cache, revert
dcodeIO Mar 29, 2019
a3aa9a3
disable caching
dcodeIO Mar 29, 2019
6a79032
make ref_unlink optional and itcm pass a simple test again
dcodeIO Mar 29, 2019
3e3c393
finalize GC wiring
dcodeIO Mar 30, 2019
c4a5702
add binaryen fiddles for indirect to direct call optimization
dcodeIO Mar 31, 2019
27f1905
runtime integration and flag
dcodeIO Mar 31, 2019
7b99e44
update allocator tests
dcodeIO Mar 31, 2019
1ada854
some cleanup
dcodeIO Apr 1, 2019
3bcd32f
directize
dcodeIO Apr 2, 2019
6bf8276
Merge branch 'master' into runtime
dcodeIO Apr 2, 2019
e1bd005
directize more (eliminate table use)
dcodeIO Apr 2, 2019
d85a438
remove old traversal code
dcodeIO Apr 2, 2019
a639a42
initial __runtime_instanceof
dcodeIO Apr 2, 2019
b62927f
move runtime templates into stdlib for bundling with lib files
dcodeIO Apr 2, 2019
b58683a
wire __runtime_instanceof to 'instanceof' on upcasts
dcodeIO Apr 2, 2019
50c49e4
make it 'runtime.instanceof'
dcodeIO Apr 2, 2019
cc1e4cd
expose runtime id of exported class
dcodeIO Apr 3, 2019
85f3fc5
runtime api
dcodeIO Apr 3, 2019
25c5dfd
slim down runtime
dcodeIO Apr 4, 2019
ed32a4c
notes on gc.collect that I don't yet know how to work around
dcodeIO Apr 4, 2019
a9e4813
implement __runtime_flags
dcodeIO Apr 4, 2019
e1070ce
rtti & refactoring
dcodeIO Apr 6, 2019
57c8bd0
handle references externally assigned to fields
dcodeIO Apr 6, 2019
c3ff3f2
inherent acylic data structure detection
dcodeIO Apr 8, 2019
6f25642
add a note on acyclic detection
dcodeIO Apr 8, 2019
8ec5142
Merge branch 'master' into runtime
dcodeIO Apr 8, 2019
c16c19e
unify runtime header
dcodeIO Apr 8, 2019
da4a775
optimize logical and/or, initial null checking in flows
dcodeIO Apr 9, 2019
cd79376
null checking throughout logical and/or
dcodeIO Apr 9, 2019
eb6c4c0
possible-null assignment to non-null, notes
dcodeIO Apr 9, 2019
bb659bb
Runtime 'none' by default
dcodeIO Apr 9, 2019
8b5c629
reduce tlsf footprint
dcodeIO Apr 11, 2019
6b256be
asrt experiment
dcodeIO Apr 11, 2019
085e2db
asrt: derive constants
dcodeIO Apr 11, 2019
c13f4db
asrt: merge tlsf and purerc
dcodeIO Apr 15, 2019
586ca8b
backport tlsf fixes, add asrt allocator test
dcodeIO Apr 15, 2019
aee3a3e
16b alignment, cleanup
dcodeIO Apr 15, 2019
ceffc18
implications of 16b alignment
dcodeIO Apr 15, 2019
3e08e5c
asrt debugger, fixes
dcodeIO Apr 16, 2019
0ba0d8a
crunch functions
dcodeIO Apr 16, 2019
504e207
polish
dcodeIO Apr 17, 2019
ffdda4b
realloc on mm level
dcodeIO Apr 17, 2019
8216cf3
refactor into stdlib
dcodeIO Apr 18, 2019
18c3f0c
unify, stub impl
dcodeIO Apr 18, 2019
2b0a165
more
dcodeIO Apr 18, 2019
2dec529
fix export star module exports, shiftify
dcodeIO Apr 18, 2019
dd2bdd0
load/store Block
dcodeIO Apr 18, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
simplify
  • Loading branch information
dcodeIO committed Mar 14, 2019
commit 3a60638f7284b8773221aa7804cc7d9bb3aa9efa
38 changes: 21 additions & 17 deletions std/assembly/array.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { runtime, ArrayBufferView } from "./runtime";
import { gc } from "./gc";
import { ArrayBuffer } from "./arraybuffer";
import { COMPARATOR, SORT } from "./util/sort";
import { itoa, dtoa, itoa_stream, dtoa_stream, MAX_DOUBLE_LENGTH } from "./util/number";
Expand Down Expand Up @@ -76,7 +77,7 @@ export class Array<T> extends ArrayBufferView {
private __set(index: i32, value: T): void {
this.resize(index + 1);
store<T>(this.dataStart + (<usize>index << alignof<T>()), value);
if (isManaged<T>()) runtime.link(changetype<usize>(value), changetype<usize>(this));
if (isManaged<T>()) gc.link(value, this);
if (index >= this.length_) this.length_ = index + 1;
}

Expand Down Expand Up @@ -141,7 +142,7 @@ export class Array<T> extends ArrayBufferView {
this.resize(newLength);
this.length_ = newLength;
store<T>(this.dataStart + (<usize>(newLength - 1) << alignof<T>()), element);
if (isManaged<T>()) runtime.link(changetype<usize>(element), changetype<usize>(this));
if (isManaged<T>()) gc.link(element, this);
return newLength;
}

Expand All @@ -156,14 +157,14 @@ export class Array<T> extends ArrayBufferView {
for (let offset: usize = 0; offset < thisSize; offset += sizeof<T>()) {
let element = load<T>(thisStart + offset);
store<T>(outStart + offset, element);
runtime.link(changetype<usize>(element), changetype<usize>(out));
gc.link(element, out);
}
let otherStart = other.dataStart;
let otherSize = <usize>otherLen << alignof<T>();
for (let offset: usize = 0; offset < otherSize; offset += sizeof<T>()) {
let element = load<T>(otherStart + offset);
store<T>(outStart + thisSize + offset, element);
runtime.link(changetype<usize>(element), changetype<usize>(out));
gc.link(element, out);
}
} else {
memory.copy(outStart, this.dataStart, thisSize);
Expand Down Expand Up @@ -221,7 +222,7 @@ export class Array<T> extends ArrayBufferView {
let value = load<T>(this.dataStart + (<usize>index << alignof<T>()));
let result = callbackfn(value, index, this);
store<U>(outStart + (<usize>index << alignof<U>()), result);
if (isManaged<U>()) runtime.link(changetype<usize>(result), changetype<usize>(out));
if (isManaged<U>()) gc.link(result, out);
}
return out;
}
Expand Down Expand Up @@ -293,7 +294,7 @@ export class Array<T> extends ArrayBufferView {
<usize>(newLength - 1) << alignof<T>()
);
store<T>(base, element);
if (isManaged<T>()) runtime.link(changetype<usize>(element), changetype<usize>(this));
if (isManaged<T>()) gc.link(element, this);
this.length_ = newLength;
return newLength;
}
Expand All @@ -310,7 +311,7 @@ export class Array<T> extends ArrayBufferView {
let offset = <usize>i << alignof<T>();
let element = load<T>(thisBase + offset);
store<T>(sliceBase + offset, element);
if (isManaged<T>()) runtime.link(changetype<usize>(element), changetype<usize>(slice));
if (isManaged<T>()) gc.link(element, slice);
}
return slice;
}
Expand All @@ -326,7 +327,7 @@ export class Array<T> extends ArrayBufferView {
for (let i = 0; i < deleteCount; ++i) {
let element = load<T>(thisBase + (<usize>i << alignof<T>()));
store<T>(spliceStart + (<usize>i << alignof<T>()), element);
if (isManaged<T>()) runtime.link(changetype<usize>(element), changetype<usize>(splice));
if (isManaged<T>()) gc.link(element, splice);
}
memory.copy(
splice.dataStart,
Expand Down Expand Up @@ -428,16 +429,17 @@ export class Array<T> extends ArrayBufferView {

if (estLen > offset) {
let trimmed = changetype<string>(result).substring(0, offset);
runtime.free(result);
runtime.freeUnregistered(result);
return trimmed; // registered in .substring
}
return runtime.register<string>(result);
return gc.register<string>(result);
}

private join_int(separator: string = ","): string {
var lastIndex = this.length_ - 1;
if (lastIndex < 0) return "";
var dataStart = this.dataStart;
// @ts-ignore: type
if (!lastIndex) return changetype<string>(itoa<T>(load<T>(dataStart)));

var sepLen = separator.length;
Expand All @@ -448,6 +450,7 @@ export class Array<T> extends ArrayBufferView {
var value: T;
for (let i = 0; i < lastIndex; ++i) {
value = load<T>(dataStart + (<usize>i << alignof<T>()));
// @ts-ignore: type
offset += itoa_stream<T>(result, offset, value);
if (sepLen) {
memory.copy(
Expand All @@ -459,13 +462,14 @@ export class Array<T> extends ArrayBufferView {
}
}
value = load<T>(dataStart + (<usize>lastIndex << alignof<T>()));
// @ts-ignore: type
offset += itoa_stream<T>(result, offset, value);
if (estLen > offset) {
let trimmed = changetype<string>(result).substring(0, offset);
runtime.free(result);
runtime.freeUnregistered(result);
return trimmed; // registered in .substring
}
return runtime.register<string>(result);
return gc.register<string>(result);
}

private join_flt(separator: string = ","): string {
Expand Down Expand Up @@ -507,10 +511,10 @@ export class Array<T> extends ArrayBufferView {
);
if (estLen > offset) {
let trimmed = changetype<string>(result).substring(0, offset);
runtime.free(result);
runtime.freeUnregistered(result);
return trimmed; // registered in .substring
}
return runtime.register<string>(result);
return gc.register<string>(result);
}

private join_str(separator: string = ","): string {
Expand Down Expand Up @@ -556,7 +560,7 @@ export class Array<T> extends ArrayBufferView {
<usize>valueLen << 1
);
}
return runtime.register<string>(result);
return gc.register<string>(result);
}

private join_arr(separator: string = ","): string {
Expand Down Expand Up @@ -625,10 +629,10 @@ export class Array<T> extends ArrayBufferView {
}
if (estLen > offset) {
let out = changetype<string>(result).substring(0, offset);
runtime.free(result);
runtime.freeUnregistered(result);
return out; // registered in .substring
}
return runtime.register<string>(result);
return gc.register<string>(result);
}

@inline
Expand Down
9 changes: 6 additions & 3 deletions std/assembly/arraybuffer.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { runtime, ArrayBufferView } from "./runtime";
import { gc } from "./gc";

@sealed export class ArrayBuffer {

Expand All @@ -22,7 +23,9 @@ import { runtime, ArrayBufferView } from "./runtime";

constructor(length: i32) {
if (<u32>length > <u32>ArrayBufferView.MAX_BYTELENGTH) throw new RangeError("Invalid array buffer length");
return runtime.register<ArrayBuffer>(runtime.alloc(<usize>length));
var buffer = runtime.alloc(<usize>length);
memory.fill(changetype<usize>(buffer), 0, <usize>length);
return gc.register<ArrayBuffer>(buffer);
}

get byteLength(): i32 {
Expand All @@ -34,9 +37,9 @@ import { runtime, ArrayBufferView } from "./runtime";
begin = begin < 0 ? max(length + begin, 0) : min(begin, length);
end = end < 0 ? max(length + end , 0) : min(end , length);
var outSize = <usize>max(end - begin, 0);
var out = runtime.allocRaw(outSize);
var out = runtime.alloc(outSize);
memory.copy(out, changetype<usize>(this) + <usize>begin, outSize);
return runtime.register<ArrayBuffer>(out);
return gc.register<ArrayBuffer>(out);
}

toString(): string {
Expand Down
17 changes: 11 additions & 6 deletions std/assembly/gc.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { runtime } from "./runtime";

/** Garbage collector interface. */
export namespace gc {

Expand All @@ -21,20 +23,23 @@ export namespace gc {

/** Registers a managed object to be tracked by the garbage collector. */
// @ts-ignore: decorator
@unsafe
export function register(ref: usize): void {
@unsafe @inline
export function register<T>(ref: usize): T {
runtime.unrefUnregistered(ref).classId = classId<T>();
// @ts-ignore: stub
if (isDefined(__gc_register)) __gc_register(ref);
else ERROR("missing implementation: gc.register");
return changetype<T>(ref);
}

/** Links a registered object with the registered object now referencing it. */
// @ts-ignore: decorator
@unsafe
export function link(ref: usize, parentRef: usize): void {
@unsafe @inline
export function link<T, TParent>(ref: T, parentRef: TParent): void {
assert(changetype<usize>(ref) >= HEAP_BASE + runtime.Header.SIZE); // must be a heap object
var header = changetype<runtime.Header>(changetype<usize>(ref) - runtime.Header.SIZE);
assert(header.classId != runtime.Header.MAGIC && header.gc1 != 0 && header.gc2 != 0); // must be registered
// @ts-ignore: stub
if (isDefined(__gc_link)) __gc_link(ref, parentRef);
else ERROR("missing implementation: gc.link");
}

/** Marks an object as being reachable. */
Expand Down
6 changes: 3 additions & 3 deletions std/assembly/map.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { runtime } from "./runtime";
import { gc } from "./gc";
import { HASH } from "./util/hash";

// A deterministic hash map based on CloseTable from https://github.com/jorendorff/dht
Expand Down Expand Up @@ -124,8 +124,8 @@ export class Map<K,V> {
let bucketPtrBase = changetype<usize>(this.buckets) + <usize>(hashCode & this.bucketsMask) * BUCKET_SIZE;
entry.taggedNext = load<usize>(bucketPtrBase);
store<usize>(bucketPtrBase, changetype<usize>(entry));
if (isManaged<K>()) runtime.link(changetype<usize>(key), changetype<usize>(this));
if (isManaged<V>()) runtime.link(changetype<usize>(value), changetype<usize>(this));
if (isManaged<K>()) gc.link(key, this);
if (isManaged<V>()) gc.link(value, this);
}
}

Expand Down
48 changes: 10 additions & 38 deletions std/assembly/runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export namespace runtime {
/** Allocates a new object and returns a pointer to its payload. Does not fill. */
// @ts-ignore: decorator
@unsafe
export function allocRaw(payloadSize: u32): usize {
export function alloc(payloadSize: u32): usize {
var header = changetype<Header>(memory.allocate(adjust(payloadSize)));
header.classId = Header.MAGIC;
header.payloadSize = payloadSize;
Expand All @@ -59,15 +59,6 @@ export namespace runtime {
return changetype<usize>(header) + Header.SIZE;
}

/** Allocates a new object and returns a pointer to its payload. Fills with zeroes.*/
// @ts-ignore: decorator
@unsafe
export function alloc(payloadSize: u32): usize {
var ref = allocRaw(payloadSize);
memory.fill(ref, 0, payloadSize);
return ref;
}

/** Reallocates an object if necessary. Returns a pointer to its (moved) payload. */
// @ts-ignore: decorator
@unsafe
Expand All @@ -83,7 +74,7 @@ export namespace runtime {
if (select(adjust(payloadSize), 0, ref > HEAP_BASE) < newAdjustedSize) {
// move if the allocation isn't large enough or not a heap object
let newHeader = changetype<Header>(memory.allocate(newAdjustedSize));
newHeader.classId = Header.MAGIC;
newHeader.classId = header.classId;
if (gc.implemented) {
newHeader.gc1 = 0;
newHeader.gc2 = 0;
Expand All @@ -97,7 +88,8 @@ export namespace runtime {
memory.free(changetype<usize>(header));
} else if (gc.implemented) {
// if previously registered, register again
gc.register(ref);
// @ts-ignore: stub
__gc_register(ref);
}
header = newHeader;
ref = newRef;
Expand All @@ -113,40 +105,20 @@ export namespace runtime {
return ref;
}

function unref(ref: usize): Header {
// @ts-ignore: decorator
@unsafe
export function unrefUnregistered(ref: usize): Header {
assert(ref >= HEAP_BASE + Header.SIZE); // must be a heap object
var header = changetype<Header>(ref - Header.SIZE);
assert(header.classId == Header.MAGIC); // must be unregistered
return header;
}

/** Frees an object. Must not have been registered with GC yet. */
// @ts-ignore: decorator
@unsafe @inline
export function free<T>(ref: T): void {
memory.free(changetype<usize>(unref(changetype<usize>(ref))));
}

/** Registers a managed object. Cannot be free'd anymore afterwards. */
// @ts-ignore: decorator
@unsafe @inline
export function register<T>(ref: usize): T {
if (!isReference<T>()) ERROR("reference expected");
// see comment in REALLOC why this is useful. also inline this because
// it's generic so we don't get a bunch of functions.
unref(ref).classId = gc.classId<T>();
if (gc.implemented) gc.register(ref);
return changetype<T>(ref);
}

/** Links a managed object with its managed parent. */
/** Frees an unregistered object that turned out to be unnecessary. */
// @ts-ignore: decorator
@unsafe @inline
export function link<T, TParent>(ref: T, parentRef: TParent): void {
assert(changetype<usize>(ref) >= HEAP_BASE + Header.SIZE); // must be a heap object
var header = changetype<Header>(changetype<usize>(ref) - Header.SIZE);
assert(header.classId != Header.MAGIC && header.gc1 != 0 && header.gc2 != 0); // must be registered
if (gc.implemented) gc.link(changetype<usize>(ref), changetype<usize>(parentRef)); // tslint:disable-line
export function freeUnregistered<T>(ref: T): void {
memory.free(changetype<usize>(unrefUnregistered(changetype<usize>(ref))));
}
}

Expand Down
8 changes: 4 additions & 4 deletions std/assembly/set.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { runtime } from "./runtime";
import { gc } from "./gc";
import { HASH } from "./util/hash";

// A deterministic hash set based on CloseTable from https://github.com/jorendorff/dht
Expand Down Expand Up @@ -70,7 +70,7 @@ export class Set<K> {
this.buckets = new ArrayBuffer(bucketsSize);
this.bucketsMask = INITIAL_CAPACITY - 1;
const entriesSize = INITIAL_CAPACITY * <i32>ENTRY_SIZE<K>();
this.entries = new ArrayBuffer(entriesSize, true);
this.entries = new ArrayBuffer(entriesSize);
this.entriesCapacity = INITIAL_CAPACITY;
this.entriesOffset = 0;
this.entriesCount = 0;
Expand Down Expand Up @@ -114,7 +114,7 @@ export class Set<K> {
let bucketPtrBase = changetype<usize>(this.buckets) + <usize>(hashCode & this.bucketsMask) * BUCKET_SIZE;
entry.taggedNext = load<usize>(bucketPtrBase);
store<usize>(bucketPtrBase, changetype<usize>(entry));
if (isManaged<K>()) runtime.link(changetype<usize>(key), changetype<usize>(this)); // tslint:disable-line
if (isManaged<K>()) gc.link(key, this);
}
}

Expand All @@ -136,7 +136,7 @@ export class Set<K> {
var newBucketsCapacity = <i32>(newBucketsMask + 1);
var newBuckets = new ArrayBuffer(newBucketsCapacity * <i32>BUCKET_SIZE);
var newEntriesCapacity = <i32>(newBucketsCapacity * FILL_FACTOR);
var newEntries = new ArrayBuffer(newEntriesCapacity * <i32>ENTRY_SIZE<K>(), true);
var newEntries = new ArrayBuffer(newEntriesCapacity * <i32>ENTRY_SIZE<K>());

// copy old entries to new entries
var oldPtr = changetype<usize>(this.entries);
Expand Down
Loading