From 9b29ae2c70f2e6439d1a7bd0b7c35d19d982b531 Mon Sep 17 00:00:00 2001 From: Bach Le Date: Tue, 20 Dec 2022 21:44:27 +0800 Subject: [PATCH 01/14] Make __finalize a global index --- std/assembly/rt.ts | 2 ++ std/assembly/rt/index.d.ts | 2 +- std/assembly/rt/itcms.ts | 4 ++-- std/assembly/rt/tcms.ts | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/std/assembly/rt.ts b/std/assembly/rt.ts index 403e4b2087..afe749c9ee 100644 --- a/std/assembly/rt.ts +++ b/std/assembly/rt.ts @@ -52,6 +52,8 @@ function __tostack(ptr: usize): usize { // eslint-disable-line return ptr; } +export let __finalize: u32 = 0; + // These are provided by the respective implementation, included as another entry file by asc: // // @ts-ignore: decorator diff --git a/std/assembly/rt/index.d.ts b/std/assembly/rt/index.d.ts index fbe1a778e1..ffc214ab2c 100644 --- a/std/assembly/rt/index.d.ts +++ b/std/assembly/rt/index.d.ts @@ -23,7 +23,7 @@ declare function __newBuffer(size: usize, id: u32, data?: usize): usize; declare function __newArray(length: i32, alignLog2: usize, id: u32, data?: usize): usize; // Finalization -declare function __finalize(ptr: usize): void; +declare let __finalize: i32; // Debugging declare const ASC_RTRACE: bool; diff --git a/std/assembly/rt/itcms.ts b/std/assembly/rt/itcms.ts index b44b69af25..44830237bf 100644 --- a/std/assembly/rt/itcms.ts +++ b/std/assembly/rt/itcms.ts @@ -246,8 +246,8 @@ function free(obj: Object): void { obj.prev = changetype(0); } else { total -= obj.size; - if (isDefined(__finalize)) { - __finalize(changetype(obj) + TOTAL_OVERHEAD); + if (__finalize) { + call_indirect(__finalize, changetype(obj) + TOTAL_OVERHEAD); } __free(changetype(obj) + BLOCK_OVERHEAD); } diff --git a/std/assembly/rt/tcms.ts b/std/assembly/rt/tcms.ts index 998ff86bc5..586e0892a6 100644 --- a/std/assembly/rt/tcms.ts +++ b/std/assembly/rt/tcms.ts @@ -236,7 +236,7 @@ export function __collect(): void { iter.prev = changetype(0); } else { total -= iter.size; - if (isDefined(__finalize)) __finalize(changetype(iter) + TOTAL_OVERHEAD); + if (__finalize) call_indirect(__finalize, changetype(iter) + TOTAL_OVERHEAD); __free(changetype(iter) + BLOCK_OVERHEAD); } iter = newNext; From 897028fe78bd30d3747c7a9063fa6eb932f4e36c Mon Sep 17 00:00:00 2001 From: Bach Le Date: Tue, 20 Dec 2022 22:13:16 +0800 Subject: [PATCH 02/14] Implement WeakRef --- std/assembly/index.d.ts | 5 + std/assembly/weakref.ts | 56 + tests/compiler/std/weakref.debug.wat | 3950 ++++++++++++++++++++++++ tests/compiler/std/weakref.json | 4 + tests/compiler/std/weakref.release.wat | 3055 ++++++++++++++++++ tests/compiler/std/weakref.ts | 33 + 6 files changed, 7103 insertions(+) create mode 100644 std/assembly/weakref.ts create mode 100644 tests/compiler/std/weakref.debug.wat create mode 100644 tests/compiler/std/weakref.json create mode 100644 tests/compiler/std/weakref.release.wat create mode 100644 tests/compiler/std/weakref.ts diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index 352d00b0ac..ac30cf518f 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -2053,6 +2053,11 @@ declare class Set { toString(): string; } +declare class WeakRef { + constructor(value: T); + deref(): T | null; +} + interface SymbolConstructor { readonly hasInstance: symbol; readonly isConcatSpreadable: symbol; diff --git a/std/assembly/weakref.ts b/std/assembly/weakref.ts new file mode 100644 index 0000000000..861d2f11ad --- /dev/null +++ b/std/assembly/weakref.ts @@ -0,0 +1,56 @@ +// @ts-ignore: decorators +@lazy +const ALL_REFERENCES: Map = new Map(); + +// @ts-ignore: decorators +@lazy +let CURRENT_COOKIE: u32 = 0; + +// @ts-ignore: decorators +@lazy +let PREVIOUS_FINALIZER: i32 = 0; + +// @ts-ignore: decorators +@lazy +let INITIALIZED: boolean = false; + +export class WeakRef { + private ref: usize; + private cookie: u32; + + constructor(value: T) { + assert(isReference() && !isNullable()); + + if (!INITIALIZED) { + PREVIOUS_FINALIZER = __finalize; + __finalize = WeakRef.finalize.index; + INITIALIZED = true; + } + + const ref = changetype(value); + const cookie = CURRENT_COOKIE; + ALL_REFERENCES.set(ref, cookie); + + this.ref = ref; + this.cookie = cookie; + } + + deref(): T | null { + const ref = this.ref; + if (ALL_REFERENCES.has(ref) && ALL_REFERENCES.get(ref) === this.cookie) { + return changetype(ref); + } else { + return null; + } + } + + static finalize(ptr: usize): void { + if (ALL_REFERENCES.delete(ptr)) { + ++CURRENT_COOKIE; + } + + if (PREVIOUS_FINALIZER) { + call_indirect(PREVIOUS_FINALIZER, ptr); + } + } +} diff --git a/tests/compiler/std/weakref.debug.wat b/tests/compiler/std/weakref.debug.wat new file mode 100644 index 0000000000..9e1448b2b1 --- /dev/null +++ b/tests/compiler/std/weakref.debug.wat @@ -0,0 +1,3950 @@ +(module + (type $i32_=>_i32 (func_subtype (param i32) (result i32) func)) + (type $i32_i32_=>_none (func_subtype (param i32 i32) func)) + (type $i32_=>_none (func_subtype (param i32) func)) + (type $i32_i32_=>_i32 (func_subtype (param i32 i32) (result i32) func)) + (type $none_=>_none (func_subtype func)) + (type $i32_i32_i32_=>_none (func_subtype (param i32 i32 i32) func)) + (type $i32_i32_i32_=>_i32 (func_subtype (param i32 i32 i32) (result i32) func)) + (type $none_=>_i32 (func_subtype (result i32) func)) + (type $i32_i32_i32_i32_=>_none (func_subtype (param i32 i32 i32 i32) func)) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (global $~lib/weakref/INITIALIZED (mut i32) (i32.const 0)) + (global $~lib/weakref/PREVIOUS_FINALIZER (mut i32) (i32.const 0)) + (global $~lib/rt/__finalize (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/shared/runtime/Runtime.Stub i32 (i32.const 0)) + (global $~lib/shared/runtime/Runtime.Minimal i32 (i32.const 1)) + (global $~lib/shared/runtime/Runtime.Incremental i32 (i32.const 2)) + (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/native/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) + (global $~lib/native/ASC_RUNTIME i32 (i32.const 2)) + (global $~lib/weakref/ALL_REFERENCES (mut i32) (i32.const 0)) + (global $~lib/weakref/CURRENT_COOKIE (mut i32) (i32.const 0)) + (global $std/weakref/weakref (mut i32) (i32.const 0)) + (global $std/weakref/globalRefs i32 (i32.const 768)) + (global $std/weakref/weakref2 (mut i32) (i32.const 0)) + (global $~lib/rt/__rtti_base i32 (i32.const 848)) + (global $~lib/memory/__data_end i32 (i32.const 888)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 33656)) + (global $~lib/memory/__heap_base i32 (i32.const 33656)) + (memory $0 1) + (data (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") + (data (i32.const 76) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 144) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 176) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 204) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e\00\00\00\00\00\00\00\00\00") + (data (i32.const 268) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 320) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 348) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 412) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1c\00\00\00I\00n\00v\00a\00l\00i\00d\00 \00l\00e\00n\00g\00t\00h\00") + (data (i32.const 460) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00&\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00\00\00\00\00\00\00") + (data (i32.const 524) "\1c\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\08\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 556) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\00K\00e\00y\00 \00d\00o\00e\00s\00 \00n\00o\00t\00 \00e\00x\00i\00s\00t\00\00\00\00\00\00\00\00\00") + (data (i32.const 620) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\00~\00l\00i\00b\00/\00m\00a\00p\00.\00t\00s\00\00\00\00\00\00\00") + (data (i32.const 668) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1c\00\00\00s\00t\00d\00/\00w\00e\00a\00k\00r\00e\00f\00.\00t\00s\00") + (data (i32.const 716) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 748) ",\00\00\00\00\00\00\00\00\00\00\00\08\00\00\00\10\00\00\00\e0\02\00\00\e0\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 796) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") + (data (i32.const 848) "\t\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00\00\00\00\00\10\01\02\00\02A\00\00") + (table $0 2 2 funcref) + (elem $0 (i32.const 1) $~lib/weakref/WeakRef.finalize) + (export "memory" (memory $0)) + (start $~start) + (func $~lib/rt/itcms/Object#set:nextWithColor (type $i32_i32_=>_none) (param $this i32) (param $nextWithColor i32) + local.get $this + local.get $nextWithColor + i32.store $0 offset=4 + ) + (func $~lib/rt/itcms/Object#set:prev (type $i32_i32_=>_none) (param $this i32) (param $prev i32) + local.get $this + local.get $prev + i32.store $0 offset=8 + ) + (func $~lib/rt/itcms/initLazy (type $i32_=>_i32) (param $space i32) (result i32) + local.get $space + local.get $space + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $space + local.get $space + call $~lib/rt/itcms/Object#set:prev + local.get $space + return + ) + (func $~lib/rt/itcms/Object#get:nextWithColor (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) + (func $~lib/rt/itcms/Object#get:next (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.const -1 + i32.xor + i32.and + return + ) + (func $~lib/rt/itcms/Object#get:color (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.and + return + ) + (func $~lib/rt/itcms/visitRoots (type $i32_=>_none) (param $cookie i32) + (local $pn i32) + (local $iter i32) + local.get $cookie + call $~lib/rt/__visit_globals + global.get $~lib/rt/itcms/pinSpace + local.set $pn + local.get $pn + call $~lib/rt/itcms/Object#get:next + local.set $iter + loop $while-continue|0 + local.get $iter + local.get $pn + i32.ne + if + i32.const 1 + drop + local.get $iter + call $~lib/rt/itcms/Object#get:color + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 160 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $iter + i32.const 20 + i32.add + local.get $cookie + call $~lib/rt/__visit_members + local.get $iter + call $~lib/rt/itcms/Object#get:next + local.set $iter + br $while-continue|0 + end + end + ) + (func $~lib/rt/itcms/Object#set:color (type $i32_i32_=>_none) (param $this i32) (param $color i32) + local.get $this + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $color + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + ) + (func $~lib/rt/itcms/Object#get:prev (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=8 + ) + (func $~lib/rt/itcms/Object#set:next (type $i32_i32_=>_none) (param $this i32) (param $obj i32) + local.get $this + local.get $obj + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.and + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + ) + (func $~lib/rt/itcms/Object#unlink (type $i32_=>_none) (param $this i32) + (local $next i32) + (local $prev i32) + local.get $this + call $~lib/rt/itcms/Object#get:next + local.set $next + local.get $next + i32.const 0 + i32.eq + if + i32.const 1 + drop + local.get $this + call $~lib/rt/itcms/Object#get:prev + i32.const 0 + i32.eq + if (result i32) + local.get $this + global.get $~lib/memory/__heap_base + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 128 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + return + end + local.get $this + call $~lib/rt/itcms/Object#get:prev + local.set $prev + i32.const 1 + drop + local.get $prev + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 132 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $next + local.get $prev + call $~lib/rt/itcms/Object#set:prev + local.get $prev + local.get $next + call $~lib/rt/itcms/Object#set:next + ) + (func $~lib/rt/itcms/Object#get:rtId (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=12 + ) + (func $~lib/shared/typeinfo/Typeinfo#get:flags (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + ) + (func $~lib/rt/__typeinfo (type $i32_=>_i32) (param $id i32) (result i32) + (local $ptr i32) + global.get $~lib/rt/__rtti_base + local.set $ptr + local.get $id + local.get $ptr + i32.load $0 + i32.gt_u + if + i32.const 224 + i32.const 288 + i32.const 21 + i32.const 28 + call $~lib/builtins/abort + unreachable + end + local.get $ptr + i32.const 4 + i32.add + local.get $id + i32.const 4 + i32.mul + i32.add + call $~lib/shared/typeinfo/Typeinfo#get:flags + return + ) + (func $~lib/rt/itcms/Object#get:isPointerfree (type $i32_=>_i32) (param $this i32) (result i32) + (local $rtId i32) + local.get $this + call $~lib/rt/itcms/Object#get:rtId + local.set $rtId + local.get $rtId + i32.const 2 + i32.le_u + if (result i32) + i32.const 1 + else + local.get $rtId + call $~lib/rt/__typeinfo + i32.const 32 + i32.and + i32.const 0 + i32.ne + end + return + ) + (func $~lib/rt/itcms/Object#linkTo (type $i32_i32_i32_=>_none) (param $this i32) (param $list i32) (param $withColor i32) + (local $prev i32) + local.get $list + call $~lib/rt/itcms/Object#get:prev + local.set $prev + local.get $this + local.get $list + local.get $withColor + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $this + local.get $prev + call $~lib/rt/itcms/Object#set:prev + local.get $prev + local.get $this + call $~lib/rt/itcms/Object#set:next + local.get $list + local.get $this + call $~lib/rt/itcms/Object#set:prev + ) + (func $~lib/rt/itcms/Object#makeGray (type $i32_=>_none) (param $this i32) + (local $1 i32) + local.get $this + global.get $~lib/rt/itcms/iter + i32.eq + if + local.get $this + call $~lib/rt/itcms/Object#get:prev + local.tee $1 + i32.eqz + if (result i32) + i32.const 0 + i32.const 96 + i32.const 148 + i32.const 30 + call $~lib/builtins/abort + unreachable + else + local.get $1 + end + global.set $~lib/rt/itcms/iter + end + local.get $this + call $~lib/rt/itcms/Object#unlink + local.get $this + global.get $~lib/rt/itcms/toSpace + local.get $this + call $~lib/rt/itcms/Object#get:isPointerfree + if (result i32) + global.get $~lib/rt/itcms/white + i32.eqz + else + i32.const 2 + end + call $~lib/rt/itcms/Object#linkTo + ) + (func $~lib/rt/itcms/__visit (type $i32_i32_=>_none) (param $ptr i32) (param $cookie i32) + (local $obj i32) + local.get $ptr + i32.eqz + if + return + end + local.get $ptr + i32.const 20 + i32.sub + local.set $obj + i32.const 0 + drop + local.get $obj + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eq + if + local.get $obj + call $~lib/rt/itcms/Object#makeGray + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.add + global.set $~lib/rt/itcms/visitCount + end + ) + (func $~lib/rt/itcms/visitStack (type $i32_=>_none) (param $cookie i32) + (local $ptr i32) + global.get $~lib/memory/__stack_pointer + local.set $ptr + loop $while-continue|0 + local.get $ptr + global.get $~lib/memory/__heap_base + i32.lt_u + if + local.get $ptr + i32.load $0 + local.get $cookie + call $~lib/rt/itcms/__visit + local.get $ptr + i32.const 4 + i32.add + local.set $ptr + br $while-continue|0 + end + end + ) + (func $~lib/rt/common/BLOCK#get:mmInfo (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + ) + (func $~lib/rt/itcms/Object#get:size (type $i32_=>_i32) (param $this i32) (result i32) + i32.const 4 + local.get $this + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + return + ) + (func $~lib/rt/tlsf/Root#set:flMap (type $i32_i32_=>_none) (param $this i32) (param $flMap i32) + local.get $this + local.get $flMap + i32.store $0 + ) + (func $~lib/rt/common/BLOCK#set:mmInfo (type $i32_i32_=>_none) (param $this i32) (param $mmInfo i32) + local.get $this + local.get $mmInfo + i32.store $0 + ) + (func $~lib/rt/tlsf/Block#set:prev (type $i32_i32_=>_none) (param $this i32) (param $prev i32) + local.get $this + local.get $prev + i32.store $0 offset=4 + ) + (func $~lib/rt/tlsf/Block#set:next (type $i32_i32_=>_none) (param $this i32) (param $next i32) + local.get $this + local.get $next + i32.store $0 offset=8 + ) + (func $~lib/rt/tlsf/Block#get:prev (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) + (func $~lib/rt/tlsf/Block#get:next (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=8 + ) + (func $~lib/rt/tlsf/Root#get:flMap (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + ) + (func $~lib/rt/tlsf/removeBlock (type $i32_i32_=>_none) (param $root i32) (param $block i32) + (local $blockInfo i32) + (local $size i32) + (local $fl i32) + (local $sl i32) + (local $6 i32) + (local $7 i32) + (local $boundedSize i32) + (local $prev i32) + (local $next i32) + (local $root|11 i32) + (local $fl|12 i32) + (local $sl|13 i32) + (local $root|14 i32) + (local $fl|15 i32) + (local $sl|16 i32) + (local $head i32) + (local $root|18 i32) + (local $fl|19 i32) + (local $slMap i32) + (local $root|21 i32) + (local $fl|22 i32) + (local $slMap|23 i32) + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $blockInfo + i32.const 1 + drop + local.get $blockInfo + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 268 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.set $size + i32.const 1 + drop + local.get $size + i32.const 12 + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 270 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $size + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $fl + local.get $size + i32.const 4 + i32.shr_u + local.set $sl + else + local.get $size + local.tee $6 + i32.const 1073741820 + local.tee $7 + local.get $6 + local.get $7 + i32.lt_u + select + local.set $boundedSize + i32.const 31 + local.get $boundedSize + i32.clz + i32.sub + local.set $fl + local.get $boundedSize + local.get $fl + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $sl + local.get $fl + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $fl + end + i32.const 1 + drop + local.get $fl + i32.const 23 + i32.lt_u + if (result i32) + local.get $sl + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 284 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $block + call $~lib/rt/tlsf/Block#get:prev + local.set $prev + local.get $block + call $~lib/rt/tlsf/Block#get:next + local.set $next + local.get $prev + if + local.get $prev + local.get $next + call $~lib/rt/tlsf/Block#set:next + end + local.get $next + if + local.get $next + local.get $prev + call $~lib/rt/tlsf/Block#set:prev + end + local.get $block + block $~lib/rt/tlsf/GETHEAD|inlined.0 (result i32) + local.get $root + local.set $root|11 + local.get $fl + local.set $fl|12 + local.get $sl + local.set $sl|13 + local.get $root|11 + local.get $fl|12 + i32.const 4 + i32.shl + local.get $sl|13 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load $0 offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.0 + end + i32.eq + if + local.get $root + local.set $root|14 + local.get $fl + local.set $fl|15 + local.get $sl + local.set $sl|16 + local.get $next + local.set $head + local.get $root|14 + local.get $fl|15 + i32.const 4 + i32.shl + local.get $sl|16 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $head + i32.store $0 offset=96 + local.get $next + i32.eqz + if + block $~lib/rt/tlsf/GETSL|inlined.0 (result i32) + local.get $root + local.set $root|18 + local.get $fl + local.set $fl|19 + local.get $root|18 + local.get $fl|19 + i32.const 2 + i32.shl + i32.add + i32.load $0 offset=4 + br $~lib/rt/tlsf/GETSL|inlined.0 + end + local.set $slMap + local.get $root + local.set $root|21 + local.get $fl + local.set $fl|22 + local.get $slMap + i32.const 1 + local.get $sl + i32.shl + i32.const -1 + i32.xor + i32.and + local.tee $slMap + local.set $slMap|23 + local.get $root|21 + local.get $fl|22 + i32.const 2 + i32.shl + i32.add + local.get $slMap|23 + i32.store $0 offset=4 + local.get $slMap + i32.eqz + if + local.get $root + local.get $root + call $~lib/rt/tlsf/Root#get:flMap + i32.const 1 + local.get $fl + i32.shl + i32.const -1 + i32.xor + i32.and + call $~lib/rt/tlsf/Root#set:flMap + end + end + end + ) + (func $~lib/rt/tlsf/insertBlock (type $i32_i32_=>_none) (param $root i32) (param $block i32) + (local $blockInfo i32) + (local $block|3 i32) + (local $right i32) + (local $rightInfo i32) + (local $block|6 i32) + (local $block|7 i32) + (local $left i32) + (local $leftInfo i32) + (local $size i32) + (local $fl i32) + (local $sl i32) + (local $13 i32) + (local $14 i32) + (local $boundedSize i32) + (local $root|16 i32) + (local $fl|17 i32) + (local $sl|18 i32) + (local $head i32) + (local $root|20 i32) + (local $fl|21 i32) + (local $sl|22 i32) + (local $head|23 i32) + (local $root|24 i32) + (local $fl|25 i32) + (local $root|26 i32) + (local $fl|27 i32) + (local $slMap i32) + i32.const 1 + drop + local.get $block + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 201 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $blockInfo + i32.const 1 + drop + local.get $blockInfo + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 203 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETRIGHT|inlined.0 (result i32) + local.get $block + local.set $block|3 + local.get $block|3 + i32.const 4 + i32.add + local.get $block|3 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.0 + end + local.set $right + local.get $right + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $rightInfo + local.get $rightInfo + i32.const 1 + i32.and + if + local.get $root + local.get $right + call $~lib/rt/tlsf/removeBlock + local.get $block + local.get $blockInfo + i32.const 4 + i32.add + local.get $rightInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.tee $blockInfo + call $~lib/rt/common/BLOCK#set:mmInfo + block $~lib/rt/tlsf/GETRIGHT|inlined.1 (result i32) + local.get $block + local.set $block|6 + local.get $block|6 + i32.const 4 + i32.add + local.get $block|6 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.1 + end + local.set $right + local.get $right + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $rightInfo + end + local.get $blockInfo + i32.const 2 + i32.and + if + block $~lib/rt/tlsf/GETFREELEFT|inlined.0 (result i32) + local.get $block + local.set $block|7 + local.get $block|7 + i32.const 4 + i32.sub + i32.load $0 + br $~lib/rt/tlsf/GETFREELEFT|inlined.0 + end + local.set $left + local.get $left + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $leftInfo + i32.const 1 + drop + local.get $leftInfo + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 221 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $root + local.get $left + call $~lib/rt/tlsf/removeBlock + local.get $left + local.set $block + local.get $block + local.get $leftInfo + i32.const 4 + i32.add + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.tee $blockInfo + call $~lib/rt/common/BLOCK#set:mmInfo + end + local.get $right + local.get $rightInfo + i32.const 2 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.set $size + i32.const 1 + drop + local.get $size + i32.const 12 + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 233 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + drop + local.get $block + i32.const 4 + i32.add + local.get $size + i32.add + local.get $right + i32.eq + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 234 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $right + i32.const 4 + i32.sub + local.get $block + i32.store $0 + local.get $size + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $fl + local.get $size + i32.const 4 + i32.shr_u + local.set $sl + else + local.get $size + local.tee $13 + i32.const 1073741820 + local.tee $14 + local.get $13 + local.get $14 + i32.lt_u + select + local.set $boundedSize + i32.const 31 + local.get $boundedSize + i32.clz + i32.sub + local.set $fl + local.get $boundedSize + local.get $fl + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $sl + local.get $fl + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $fl + end + i32.const 1 + drop + local.get $fl + i32.const 23 + i32.lt_u + if (result i32) + local.get $sl + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 251 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETHEAD|inlined.1 (result i32) + local.get $root + local.set $root|16 + local.get $fl + local.set $fl|17 + local.get $sl + local.set $sl|18 + local.get $root|16 + local.get $fl|17 + i32.const 4 + i32.shl + local.get $sl|18 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load $0 offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.1 + end + local.set $head + local.get $block + i32.const 0 + call $~lib/rt/tlsf/Block#set:prev + local.get $block + local.get $head + call $~lib/rt/tlsf/Block#set:next + local.get $head + if + local.get $head + local.get $block + call $~lib/rt/tlsf/Block#set:prev + end + local.get $root + local.set $root|20 + local.get $fl + local.set $fl|21 + local.get $sl + local.set $sl|22 + local.get $block + local.set $head|23 + local.get $root|20 + local.get $fl|21 + i32.const 4 + i32.shl + local.get $sl|22 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $head|23 + i32.store $0 offset=96 + local.get $root + local.get $root + call $~lib/rt/tlsf/Root#get:flMap + i32.const 1 + local.get $fl + i32.shl + i32.or + call $~lib/rt/tlsf/Root#set:flMap + local.get $root + local.set $root|26 + local.get $fl + local.set $fl|27 + block $~lib/rt/tlsf/GETSL|inlined.1 (result i32) + local.get $root + local.set $root|24 + local.get $fl + local.set $fl|25 + local.get $root|24 + local.get $fl|25 + i32.const 2 + i32.shl + i32.add + i32.load $0 offset=4 + br $~lib/rt/tlsf/GETSL|inlined.1 + end + i32.const 1 + local.get $sl + i32.shl + i32.or + local.set $slMap + local.get $root|26 + local.get $fl|27 + i32.const 2 + i32.shl + i32.add + local.get $slMap + i32.store $0 offset=4 + ) + (func $~lib/rt/tlsf/addMemory (type $i32_i32_i32_=>_i32) (param $root i32) (param $start i32) (param $end i32) (result i32) + (local $root|3 i32) + (local $tail i32) + (local $tailInfo i32) + (local $size i32) + (local $leftSize i32) + (local $left i32) + (local $root|9 i32) + (local $tail|10 i32) + i32.const 1 + drop + local.get $start + local.get $end + i32.le_u + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 377 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $start + i32.const 4 + i32.add + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.sub + local.set $start + local.get $end + i32.const 15 + i32.const -1 + i32.xor + i32.and + local.set $end + block $~lib/rt/tlsf/GETTAIL|inlined.0 (result i32) + local.get $root + local.set $root|3 + local.get $root|3 + i32.load $0 offset=1568 + br $~lib/rt/tlsf/GETTAIL|inlined.0 + end + local.set $tail + i32.const 0 + local.set $tailInfo + local.get $tail + if + i32.const 1 + drop + local.get $start + local.get $tail + i32.const 4 + i32.add + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 384 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $start + i32.const 16 + i32.sub + local.get $tail + i32.eq + if + local.get $start + i32.const 16 + i32.sub + local.set $start + local.get $tail + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $tailInfo + else + nop + end + else + i32.const 1 + drop + local.get $start + local.get $root + i32.const 1572 + i32.add + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 397 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + end + local.get $end + local.get $start + i32.sub + local.set $size + local.get $size + i32.const 4 + i32.const 12 + i32.add + i32.const 4 + i32.add + i32.lt_u + if + i32.const 0 + return + end + local.get $size + i32.const 2 + i32.const 4 + i32.mul + i32.sub + local.set $leftSize + local.get $start + local.set $left + local.get $left + local.get $leftSize + i32.const 1 + i32.or + local.get $tailInfo + i32.const 2 + i32.and + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $left + i32.const 0 + call $~lib/rt/tlsf/Block#set:prev + local.get $left + i32.const 0 + call $~lib/rt/tlsf/Block#set:next + local.get $start + i32.const 4 + i32.add + local.get $leftSize + i32.add + local.set $tail + local.get $tail + i32.const 0 + i32.const 2 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $root + local.set $root|9 + local.get $tail + local.set $tail|10 + local.get $root|9 + local.get $tail|10 + i32.store $0 offset=1568 + local.get $root + local.get $left + call $~lib/rt/tlsf/insertBlock + i32.const 1 + return + ) + (func $~lib/rt/tlsf/initialize (type $none_=>_none) + (local $rootOffset i32) + (local $pagesBefore i32) + (local $pagesNeeded i32) + (local $root i32) + (local $root|4 i32) + (local $tail i32) + (local $fl i32) + (local $root|7 i32) + (local $fl|8 i32) + (local $slMap i32) + (local $sl i32) + (local $root|11 i32) + (local $fl|12 i32) + (local $sl|13 i32) + (local $head i32) + (local $memStart i32) + i32.const 0 + drop + global.get $~lib/memory/__heap_base + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + local.set $rootOffset + memory.size $0 + local.set $pagesBefore + local.get $rootOffset + i32.const 1572 + i32.add + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $pagesNeeded + local.get $pagesNeeded + local.get $pagesBefore + i32.gt_s + if (result i32) + local.get $pagesNeeded + local.get $pagesBefore + i32.sub + memory.grow $0 + i32.const 0 + i32.lt_s + else + i32.const 0 + end + if + unreachable + end + local.get $rootOffset + local.set $root + local.get $root + i32.const 0 + call $~lib/rt/tlsf/Root#set:flMap + local.get $root + local.set $root|4 + i32.const 0 + local.set $tail + local.get $root|4 + local.get $tail + i32.store $0 offset=1568 + i32.const 0 + local.set $fl + loop $for-loop|0 + local.get $fl + i32.const 23 + i32.lt_u + if + local.get $root + local.set $root|7 + local.get $fl + local.set $fl|8 + i32.const 0 + local.set $slMap + local.get $root|7 + local.get $fl|8 + i32.const 2 + i32.shl + i32.add + local.get $slMap + i32.store $0 offset=4 + i32.const 0 + local.set $sl + loop $for-loop|1 + local.get $sl + i32.const 16 + i32.lt_u + if + local.get $root + local.set $root|11 + local.get $fl + local.set $fl|12 + local.get $sl + local.set $sl|13 + i32.const 0 + local.set $head + local.get $root|11 + local.get $fl|12 + i32.const 4 + i32.shl + local.get $sl|13 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $head + i32.store $0 offset=96 + local.get $sl + i32.const 1 + i32.add + local.set $sl + br $for-loop|1 + end + end + local.get $fl + i32.const 1 + i32.add + local.set $fl + br $for-loop|0 + end + end + local.get $rootOffset + i32.const 1572 + i32.add + local.set $memStart + i32.const 0 + drop + local.get $root + local.get $memStart + memory.size $0 + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + drop + local.get $root + global.set $~lib/rt/tlsf/ROOT + ) + (func $~lib/rt/tlsf/checkUsedBlock (type $i32_=>_i32) (param $ptr i32) (result i32) + (local $block i32) + local.get $ptr + i32.const 4 + i32.sub + local.set $block + local.get $ptr + i32.const 0 + i32.ne + if (result i32) + local.get $ptr + i32.const 15 + i32.and + i32.eqz + else + i32.const 0 + end + if (result i32) + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 1 + i32.and + i32.eqz + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 559 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $block + return + ) + (func $~lib/rt/tlsf/freeBlock (type $i32_i32_=>_none) (param $root i32) (param $block i32) + i32.const 0 + drop + local.get $block + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 1 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $root + local.get $block + call $~lib/rt/tlsf/insertBlock + ) + (func $~lib/rt/tlsf/__free (type $i32_=>_none) (param $ptr i32) + local.get $ptr + global.get $~lib/memory/__heap_base + i32.lt_u + if + return + end + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $ptr + call $~lib/rt/tlsf/checkUsedBlock + call $~lib/rt/tlsf/freeBlock + ) + (func $~lib/rt/itcms/free (type $i32_=>_none) (param $obj i32) + local.get $obj + global.get $~lib/memory/__heap_base + i32.lt_u + if + local.get $obj + i32.const 0 + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $obj + i32.const 0 + call $~lib/rt/itcms/Object#set:prev + else + global.get $~lib/rt/itcms/total + local.get $obj + call $~lib/rt/itcms/Object#get:size + i32.sub + global.set $~lib/rt/itcms/total + global.get $~lib/rt/__finalize + if + local.get $obj + i32.const 20 + i32.add + global.get $~lib/rt/__finalize + call_indirect $0 (type $i32_=>_none) + end + local.get $obj + i32.const 4 + i32.add + call $~lib/rt/tlsf/__free + end + ) + (func $~lib/rt/itcms/step (type $none_=>_i32) (result i32) + (local $obj i32) + (local $1 i32) + (local $black i32) + (local $from i32) + block $break|0 + block $case2|0 + block $case1|0 + block $case0|0 + global.get $~lib/rt/itcms/state + local.set $1 + local.get $1 + i32.const 0 + i32.eq + br_if $case0|0 + local.get $1 + i32.const 1 + i32.eq + br_if $case1|0 + local.get $1 + i32.const 2 + i32.eq + br_if $case2|0 + br $break|0 + end + i32.const 1 + global.set $~lib/rt/itcms/state + i32.const 0 + global.set $~lib/rt/itcms/visitCount + i32.const 0 + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + global.get $~lib/rt/itcms/white + i32.eqz + local.set $black + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $obj + loop $while-continue|1 + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $obj + global.set $~lib/rt/itcms/iter + local.get $obj + call $~lib/rt/itcms/Object#get:color + local.get $black + i32.ne + if + local.get $obj + local.get $black + call $~lib/rt/itcms/Object#set:color + i32.const 0 + global.set $~lib/rt/itcms/visitCount + local.get $obj + i32.const 20 + i32.add + i32.const 0 + call $~lib/rt/__visit_members + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + local.get $obj + call $~lib/rt/itcms/Object#get:next + local.set $obj + br $while-continue|1 + end + end + i32.const 0 + global.set $~lib/rt/itcms/visitCount + i32.const 0 + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $obj + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.eq + if + i32.const 0 + call $~lib/rt/itcms/visitStack + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $obj + loop $while-continue|2 + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $obj + call $~lib/rt/itcms/Object#get:color + local.get $black + i32.ne + if + local.get $obj + local.get $black + call $~lib/rt/itcms/Object#set:color + local.get $obj + i32.const 20 + i32.add + i32.const 0 + call $~lib/rt/__visit_members + end + local.get $obj + call $~lib/rt/itcms/Object#get:next + local.set $obj + br $while-continue|2 + end + end + global.get $~lib/rt/itcms/fromSpace + local.set $from + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/fromSpace + local.get $from + global.set $~lib/rt/itcms/toSpace + local.get $black + global.set $~lib/rt/itcms/white + local.get $from + call $~lib/rt/itcms/Object#get:next + global.set $~lib/rt/itcms/iter + i32.const 2 + global.set $~lib/rt/itcms/state + end + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + global.get $~lib/rt/itcms/iter + local.set $obj + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $obj + call $~lib/rt/itcms/Object#get:next + global.set $~lib/rt/itcms/iter + i32.const 1 + drop + local.get $obj + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 229 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + local.get $obj + call $~lib/rt/itcms/free + i32.const 10 + return + end + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + call $~lib/rt/itcms/Object#set:nextWithColor + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + call $~lib/rt/itcms/Object#set:prev + i32.const 0 + global.set $~lib/rt/itcms/state + br $break|0 + end + i32.const 0 + return + ) + (func $~lib/rt/itcms/interrupt (type $none_=>_none) + (local $budget i32) + i32.const 0 + drop + i32.const 0 + drop + i32.const 1024 + i32.const 200 + i32.mul + i32.const 100 + i32.div_u + local.set $budget + loop $do-loop|0 + local.get $budget + call $~lib/rt/itcms/step + i32.sub + local.set $budget + global.get $~lib/rt/itcms/state + i32.const 0 + i32.eq + if + i32.const 0 + drop + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i32.const 200 + i64.extend_i32_u + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + return + end + local.get $budget + i32.const 0 + i32.gt_s + br_if $do-loop|0 + end + i32.const 0 + drop + global.get $~lib/rt/itcms/total + i32.const 1024 + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.sub + i32.const 1024 + i32.lt_u + i32.mul + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + ) + (func $~lib/rt/tlsf/computeSize (type $i32_=>_i32) (param $size i32) (result i32) + local.get $size + i32.const 12 + i32.le_u + if (result i32) + i32.const 12 + else + local.get $size + i32.const 4 + i32.add + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.sub + end + return + ) + (func $~lib/rt/tlsf/prepareSize (type $i32_=>_i32) (param $size i32) (result i32) + local.get $size + i32.const 1073741820 + i32.gt_u + if + i32.const 32 + i32.const 368 + i32.const 458 + i32.const 29 + call $~lib/builtins/abort + unreachable + end + local.get $size + call $~lib/rt/tlsf/computeSize + return + ) + (func $~lib/rt/tlsf/searchBlock (type $i32_i32_=>_i32) (param $root i32) (param $size i32) (result i32) + (local $fl i32) + (local $sl i32) + (local $requestSize i32) + (local $root|5 i32) + (local $fl|6 i32) + (local $slMap i32) + (local $head i32) + (local $flMap i32) + (local $root|10 i32) + (local $fl|11 i32) + (local $root|12 i32) + (local $fl|13 i32) + (local $sl|14 i32) + (local $root|15 i32) + (local $fl|16 i32) + (local $sl|17 i32) + local.get $size + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $fl + local.get $size + i32.const 4 + i32.shr_u + local.set $sl + else + local.get $size + i32.const 536870910 + i32.lt_u + if (result i32) + local.get $size + i32.const 1 + i32.const 27 + local.get $size + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + else + local.get $size + end + local.set $requestSize + i32.const 31 + local.get $requestSize + i32.clz + i32.sub + local.set $fl + local.get $requestSize + local.get $fl + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $sl + local.get $fl + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $fl + end + i32.const 1 + drop + local.get $fl + i32.const 23 + i32.lt_u + if (result i32) + local.get $sl + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 330 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETSL|inlined.2 (result i32) + local.get $root + local.set $root|5 + local.get $fl + local.set $fl|6 + local.get $root|5 + local.get $fl|6 + i32.const 2 + i32.shl + i32.add + i32.load $0 offset=4 + br $~lib/rt/tlsf/GETSL|inlined.2 + end + i32.const 0 + i32.const -1 + i32.xor + local.get $sl + i32.shl + i32.and + local.set $slMap + i32.const 0 + local.set $head + local.get $slMap + i32.eqz + if + local.get $root + call $~lib/rt/tlsf/Root#get:flMap + i32.const 0 + i32.const -1 + i32.xor + local.get $fl + i32.const 1 + i32.add + i32.shl + i32.and + local.set $flMap + local.get $flMap + i32.eqz + if + i32.const 0 + local.set $head + else + local.get $flMap + i32.ctz + local.set $fl + block $~lib/rt/tlsf/GETSL|inlined.3 (result i32) + local.get $root + local.set $root|10 + local.get $fl + local.set $fl|11 + local.get $root|10 + local.get $fl|11 + i32.const 2 + i32.shl + i32.add + i32.load $0 offset=4 + br $~lib/rt/tlsf/GETSL|inlined.3 + end + local.set $slMap + i32.const 1 + drop + local.get $slMap + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 343 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETHEAD|inlined.2 (result i32) + local.get $root + local.set $root|12 + local.get $fl + local.set $fl|13 + local.get $slMap + i32.ctz + local.set $sl|14 + local.get $root|12 + local.get $fl|13 + i32.const 4 + i32.shl + local.get $sl|14 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load $0 offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.2 + end + local.set $head + end + else + block $~lib/rt/tlsf/GETHEAD|inlined.3 (result i32) + local.get $root + local.set $root|15 + local.get $fl + local.set $fl|16 + local.get $slMap + i32.ctz + local.set $sl|17 + local.get $root|15 + local.get $fl|16 + i32.const 4 + i32.shl + local.get $sl|17 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load $0 offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.3 + end + local.set $head + end + local.get $head + return + ) + (func $~lib/rt/tlsf/growMemory (type $i32_i32_=>_none) (param $root i32) (param $size i32) + (local $pagesBefore i32) + (local $root|3 i32) + (local $pagesNeeded i32) + (local $5 i32) + (local $6 i32) + (local $pagesWanted i32) + (local $pagesAfter i32) + i32.const 0 + drop + local.get $size + i32.const 536870910 + i32.lt_u + if + local.get $size + i32.const 1 + i32.const 27 + local.get $size + i32.clz + i32.sub + i32.shl + i32.const 1 + i32.sub + i32.add + local.set $size + end + memory.size $0 + local.set $pagesBefore + local.get $size + i32.const 4 + local.get $pagesBefore + i32.const 16 + i32.shl + i32.const 4 + i32.sub + block $~lib/rt/tlsf/GETTAIL|inlined.1 (result i32) + local.get $root + local.set $root|3 + local.get $root|3 + i32.load $0 offset=1568 + br $~lib/rt/tlsf/GETTAIL|inlined.1 + end + i32.ne + i32.shl + i32.add + local.set $size + local.get $size + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $pagesNeeded + local.get $pagesBefore + local.tee $5 + local.get $pagesNeeded + local.tee $6 + local.get $5 + local.get $6 + i32.gt_s + select + local.set $pagesWanted + local.get $pagesWanted + memory.grow $0 + i32.const 0 + i32.lt_s + if + local.get $pagesNeeded + memory.grow $0 + i32.const 0 + i32.lt_s + if + unreachable + end + end + memory.size $0 + local.set $pagesAfter + local.get $root + local.get $pagesBefore + i32.const 16 + i32.shl + local.get $pagesAfter + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + drop + ) + (func $~lib/rt/tlsf/prepareBlock (type $i32_i32_i32_=>_none) (param $root i32) (param $block i32) (param $size i32) + (local $blockInfo i32) + (local $remaining i32) + (local $spare i32) + (local $block|6 i32) + (local $block|7 i32) + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $blockInfo + i32.const 1 + drop + local.get $size + i32.const 4 + i32.add + i32.const 15 + i32.and + i32.eqz + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 357 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $size + i32.sub + local.set $remaining + local.get $remaining + i32.const 4 + i32.const 12 + i32.add + i32.ge_u + if + local.get $block + local.get $size + local.get $blockInfo + i32.const 2 + i32.and + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $block + i32.const 4 + i32.add + local.get $size + i32.add + local.set $spare + local.get $spare + local.get $remaining + i32.const 4 + i32.sub + i32.const 1 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $root + local.get $spare + call $~lib/rt/tlsf/insertBlock + else + local.get $block + local.get $blockInfo + i32.const 1 + i32.const -1 + i32.xor + i32.and + call $~lib/rt/common/BLOCK#set:mmInfo + block $~lib/rt/tlsf/GETRIGHT|inlined.3 (result i32) + local.get $block + local.set $block|7 + local.get $block|7 + i32.const 4 + i32.add + local.get $block|7 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.3 + end + block $~lib/rt/tlsf/GETRIGHT|inlined.2 (result i32) + local.get $block + local.set $block|6 + local.get $block|6 + i32.const 4 + i32.add + local.get $block|6 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.2 + end + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 2 + i32.const -1 + i32.xor + i32.and + call $~lib/rt/common/BLOCK#set:mmInfo + end + ) + (func $~lib/rt/tlsf/allocateBlock (type $i32_i32_=>_i32) (param $root i32) (param $size i32) (result i32) + (local $payloadSize i32) + (local $block i32) + local.get $size + call $~lib/rt/tlsf/prepareSize + local.set $payloadSize + local.get $root + local.get $payloadSize + call $~lib/rt/tlsf/searchBlock + local.set $block + local.get $block + i32.eqz + if + local.get $root + local.get $payloadSize + call $~lib/rt/tlsf/growMemory + local.get $root + local.get $payloadSize + call $~lib/rt/tlsf/searchBlock + local.set $block + i32.const 1 + drop + local.get $block + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 496 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + end + i32.const 1 + drop + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $payloadSize + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 368 + i32.const 498 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $root + local.get $block + call $~lib/rt/tlsf/removeBlock + local.get $root + local.get $block + local.get $payloadSize + call $~lib/rt/tlsf/prepareBlock + i32.const 0 + drop + local.get $block + return + ) + (func $~lib/rt/tlsf/__alloc (type $i32_=>_i32) (param $size i32) (result i32) + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $size + call $~lib/rt/tlsf/allocateBlock + i32.const 4 + i32.add + return + ) + (func $~lib/rt/itcms/Object#set:rtId (type $i32_i32_=>_none) (param $this i32) (param $rtId i32) + local.get $this + local.get $rtId + i32.store $0 offset=12 + ) + (func $~lib/rt/itcms/Object#set:rtSize (type $i32_i32_=>_none) (param $this i32) (param $rtSize i32) + local.get $this + local.get $rtSize + i32.store $0 offset=16 + ) + (func $~lib/rt/itcms/__new (type $i32_i32_=>_i32) (param $size i32) (param $id i32) (result i32) + (local $obj i32) + (local $ptr i32) + local.get $size + i32.const 1073741804 + i32.ge_u + if + i32.const 32 + i32.const 96 + i32.const 261 + i32.const 31 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.ge_u + if + call $~lib/rt/itcms/interrupt + end + i32.const 16 + local.get $size + i32.add + call $~lib/rt/tlsf/__alloc + i32.const 4 + i32.sub + local.set $obj + local.get $obj + local.get $id + call $~lib/rt/itcms/Object#set:rtId + local.get $obj + local.get $size + call $~lib/rt/itcms/Object#set:rtSize + local.get $obj + global.get $~lib/rt/itcms/fromSpace + global.get $~lib/rt/itcms/white + call $~lib/rt/itcms/Object#linkTo + global.get $~lib/rt/itcms/total + local.get $obj + call $~lib/rt/itcms/Object#get:size + i32.add + global.set $~lib/rt/itcms/total + local.get $obj + i32.const 20 + i32.add + local.set $ptr + local.get $ptr + i32.const 0 + local.get $size + memory.fill $0 + local.get $ptr + return + ) + (func $~lib/rt/itcms/__link (type $i32_i32_i32_=>_none) (param $parentPtr i32) (param $childPtr i32) (param $expectMultiple i32) + (local $child i32) + (local $parent i32) + (local $parentColor i32) + local.get $childPtr + i32.eqz + if + return + end + i32.const 1 + drop + local.get $parentPtr + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 295 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $childPtr + i32.const 20 + i32.sub + local.set $child + local.get $child + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eq + if + local.get $parentPtr + i32.const 20 + i32.sub + local.set $parent + local.get $parent + call $~lib/rt/itcms/Object#get:color + local.set $parentColor + local.get $parentColor + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + if + local.get $expectMultiple + if + local.get $parent + call $~lib/rt/itcms/Object#makeGray + else + local.get $child + call $~lib/rt/itcms/Object#makeGray + end + else + local.get $parentColor + i32.const 3 + i32.eq + if (result i32) + global.get $~lib/rt/itcms/state + i32.const 1 + i32.eq + else + i32.const 0 + end + if + local.get $child + call $~lib/rt/itcms/Object#makeGray + end + end + end + ) + (func $~lib/map/Map#set:buckets (type $i32_i32_=>_none) (param $this i32) (param $buckets i32) + local.get $this + local.get $buckets + i32.store $0 + local.get $this + local.get $buckets + i32.const 0 + call $~lib/rt/itcms/__link + ) + (func $~lib/map/Map#set:bucketsMask (type $i32_i32_=>_none) (param $this i32) (param $bucketsMask i32) + local.get $this + local.get $bucketsMask + i32.store $0 offset=4 + ) + (func $~lib/map/Map#set:entries (type $i32_i32_=>_none) (param $this i32) (param $entries i32) + local.get $this + local.get $entries + i32.store $0 offset=8 + local.get $this + local.get $entries + i32.const 0 + call $~lib/rt/itcms/__link + ) + (func $~lib/map/Map#set:entriesCapacity (type $i32_i32_=>_none) (param $this i32) (param $entriesCapacity i32) + local.get $this + local.get $entriesCapacity + i32.store $0 offset=12 + ) + (func $~lib/map/Map#set:entriesOffset (type $i32_i32_=>_none) (param $this i32) (param $entriesOffset i32) + local.get $this + local.get $entriesOffset + i32.store $0 offset=16 + ) + (func $~lib/map/Map#set:entriesCount (type $i32_i32_=>_none) (param $this i32) (param $entriesCount i32) + local.get $this + local.get $entriesCount + i32.store $0 offset=20 + ) + (func $~lib/util/hash/HASH (type $i32_=>_i32) (param $key i32) (result i32) + (local $key|1 i32) + (local $len i32) + (local $h i32) + i32.const 0 + drop + i32.const 0 + drop + i32.const 0 + drop + i32.const 4 + i32.const 4 + i32.le_u + drop + block $~lib/util/hash/hash32|inlined.0 (result i32) + local.get $key + local.set $key|1 + i32.const 4 + local.set $len + i32.const 0 + i32.const 374761393 + i32.add + local.get $len + i32.add + local.set $h + local.get $h + local.get $key|1 + i32.const -1028477379 + i32.mul + i32.add + local.set $h + local.get $h + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.set $h + local.get $h + local.get $h + i32.const 15 + i32.shr_u + i32.xor + local.set $h + local.get $h + i32.const -2048144777 + i32.mul + local.set $h + local.get $h + local.get $h + i32.const 13 + i32.shr_u + i32.xor + local.set $h + local.get $h + i32.const -1028477379 + i32.mul + local.set $h + local.get $h + local.get $h + i32.const 16 + i32.shr_u + i32.xor + local.set $h + local.get $h + br $~lib/util/hash/hash32|inlined.0 + end + return + ) + (func $~lib/map/Map#get:buckets (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + ) + (func $~lib/map/Map#get:bucketsMask (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) + (func $~lib/map/MapEntry#get:taggedNext (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=8 + ) + (func $~lib/map/MapEntry#get:key (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + ) + (func $~lib/map/Map#find (type $i32_i32_i32_=>_i32) (param $this i32) (param $key i32) (param $hashCode i32) (result i32) + (local $entry i32) + (local $taggedNext i32) + local.get $this + call $~lib/map/Map#get:buckets + local.get $hashCode + local.get $this + call $~lib/map/Map#get:bucketsMask + i32.and + i32.const 4 + i32.mul + i32.add + i32.load $0 + local.set $entry + loop $while-continue|0 + local.get $entry + if + local.get $entry + call $~lib/map/MapEntry#get:taggedNext + local.set $taggedNext + local.get $taggedNext + i32.const 1 + i32.and + i32.eqz + if (result i32) + local.get $entry + call $~lib/map/MapEntry#get:key + local.get $key + i32.eq + else + i32.const 0 + end + if + local.get $entry + return + end + local.get $taggedNext + i32.const 1 + i32.const -1 + i32.xor + i32.and + local.set $entry + br $while-continue|0 + end + end + i32.const 0 + return + ) + (func $~lib/map/MapEntry#set:taggedNext (type $i32_i32_=>_none) (param $this i32) (param $taggedNext i32) + local.get $this + local.get $taggedNext + i32.store $0 offset=8 + ) + (func $~lib/map/Map#get:entriesCount (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=20 + ) + (func $~lib/map/Map#get:entriesCapacity (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=12 + ) + (func $~lib/map/Map#get:entries (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=8 + ) + (func $~lib/map/Map#get:entriesOffset (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=16 + ) + (func $~lib/map/MapEntry#set:key (type $i32_i32_=>_none) (param $this i32) (param $key i32) + local.get $this + local.get $key + i32.store $0 + ) + (func $~lib/map/MapEntry#get:value (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) + (func $~lib/map/MapEntry#set:value (type $i32_i32_=>_none) (param $this i32) (param $value i32) + local.get $this + local.get $value + i32.store $0 offset=4 + ) + (func $~lib/map/Map#rehash (type $i32_i32_=>_none) (param $this i32) (param $newBucketsMask i32) + (local $newBucketsCapacity i32) + (local $newBuckets i32) + (local $newEntriesCapacity i32) + (local $newEntries i32) + (local $oldPtr i32) + (local $oldEnd i32) + (local $newPtr i32) + (local $oldEntry i32) + (local $newEntry i32) + (local $oldEntryKey i32) + (local $newBucketIndex i32) + (local $newBucketPtrBase i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store $0 + local.get $newBucketsMask + i32.const 1 + i32.add + local.set $newBucketsCapacity + global.get $~lib/memory/__stack_pointer + i32.const 0 + local.get $newBucketsCapacity + i32.const 4 + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor + local.tee $newBuckets + i32.store $0 + local.get $newBucketsCapacity + i32.const 8 + i32.mul + i32.const 3 + i32.div_s + local.set $newEntriesCapacity + global.get $~lib/memory/__stack_pointer + i32.const 0 + local.get $newEntriesCapacity + block $~lib/map/ENTRY_SIZE|inlined.1 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE|inlined.1 + end + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor + local.tee $newEntries + i32.store $0 offset=4 + local.get $this + call $~lib/map/Map#get:entries + local.set $oldPtr + local.get $oldPtr + local.get $this + call $~lib/map/Map#get:entriesOffset + block $~lib/map/ENTRY_SIZE|inlined.2 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE|inlined.2 + end + i32.mul + i32.add + local.set $oldEnd + local.get $newEntries + local.set $newPtr + loop $while-continue|0 + local.get $oldPtr + local.get $oldEnd + i32.ne + if + local.get $oldPtr + local.set $oldEntry + local.get $oldEntry + call $~lib/map/MapEntry#get:taggedNext + i32.const 1 + i32.and + i32.eqz + if + local.get $newPtr + local.set $newEntry + local.get $oldEntry + call $~lib/map/MapEntry#get:key + local.set $oldEntryKey + local.get $newEntry + local.get $oldEntryKey + call $~lib/map/MapEntry#set:key + local.get $newEntry + local.get $oldEntry + call $~lib/map/MapEntry#get:value + call $~lib/map/MapEntry#set:value + local.get $oldEntryKey + call $~lib/util/hash/HASH + local.get $newBucketsMask + i32.and + local.set $newBucketIndex + local.get $newBuckets + local.get $newBucketIndex + i32.const 4 + i32.mul + i32.add + local.set $newBucketPtrBase + local.get $newEntry + local.get $newBucketPtrBase + i32.load $0 + call $~lib/map/MapEntry#set:taggedNext + local.get $newBucketPtrBase + local.get $newPtr + i32.store $0 + local.get $newPtr + block $~lib/map/ENTRY_SIZE|inlined.3 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE|inlined.3 + end + i32.add + local.set $newPtr + end + local.get $oldPtr + block $~lib/map/ENTRY_SIZE|inlined.4 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE|inlined.4 + end + i32.add + local.set $oldPtr + br $while-continue|0 + end + end + local.get $this + local.get $newBuckets + call $~lib/map/Map#set:buckets + local.get $this + local.get $newBucketsMask + call $~lib/map/Map#set:bucketsMask + local.get $this + local.get $newEntries + call $~lib/map/Map#set:entries + local.get $this + local.get $newEntriesCapacity + call $~lib/map/Map#set:entriesCapacity + local.get $this + local.get $this + call $~lib/map/Map#get:entriesCount + call $~lib/map/Map#set:entriesOffset + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/map/Map#delete (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + (local $entry i32) + (local $halfBucketsMask i32) + (local $4 i32) + (local $5 i32) + local.get $this + local.get $key + local.get $key + call $~lib/util/hash/HASH + call $~lib/map/Map#find + local.set $entry + local.get $entry + i32.eqz + if + i32.const 0 + return + end + local.get $entry + local.get $entry + call $~lib/map/MapEntry#get:taggedNext + i32.const 1 + i32.or + call $~lib/map/MapEntry#set:taggedNext + local.get $this + local.get $this + call $~lib/map/Map#get:entriesCount + i32.const 1 + i32.sub + call $~lib/map/Map#set:entriesCount + local.get $this + call $~lib/map/Map#get:bucketsMask + i32.const 1 + i32.shr_u + local.set $halfBucketsMask + local.get $halfBucketsMask + i32.const 1 + i32.add + i32.const 4 + local.tee $4 + local.get $this + call $~lib/map/Map#get:entriesCount + local.tee $5 + local.get $4 + local.get $5 + i32.gt_u + select + i32.ge_u + if (result i32) + local.get $this + call $~lib/map/Map#get:entriesCount + local.get $this + call $~lib/map/Map#get:entriesCapacity + i32.const 3 + i32.mul + i32.const 4 + i32.div_s + i32.lt_s + else + i32.const 0 + end + if + local.get $this + local.get $halfBucketsMask + call $~lib/map/Map#rehash + end + i32.const 1 + return + ) + (func $~lib/function/Function<%28usize%29=>void>#get:index (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + return + ) + (func $~lib/weakref/WeakRef#set:ref (type $i32_i32_=>_none) (param $this i32) (param $ref i32) + local.get $this + local.get $ref + i32.store $0 + ) + (func $~lib/weakref/WeakRef#set:cookie (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) + local.get $this + local.get $cookie + i32.store $0 offset=4 + ) + (func $~lib/weakref/WeakRef#get:ref (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + ) + (func $~lib/map/Map#has (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + local.get $this + local.get $key + local.get $key + call $~lib/util/hash/HASH + call $~lib/map/Map#find + i32.const 0 + i32.ne + return + ) + (func $~lib/map/Map#get (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + (local $entry i32) + local.get $this + local.get $key + local.get $key + call $~lib/util/hash/HASH + call $~lib/map/Map#find + local.set $entry + local.get $entry + i32.eqz + if + i32.const 576 + i32.const 640 + i32.const 105 + i32.const 17 + call $~lib/builtins/abort + unreachable + end + local.get $entry + call $~lib/map/MapEntry#get:value + return + ) + (func $~lib/weakref/WeakRef#get:cookie (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) + (func $~lib/rt/itcms/__collect (type $none_=>_none) + i32.const 0 + drop + global.get $~lib/rt/itcms/state + i32.const 0 + i32.gt_s + if + loop $while-continue|0 + global.get $~lib/rt/itcms/state + i32.const 0 + i32.ne + if + call $~lib/rt/itcms/step + drop + br $while-continue|0 + end + end + end + call $~lib/rt/itcms/step + drop + loop $while-continue|1 + global.get $~lib/rt/itcms/state + i32.const 0 + i32.ne + if + call $~lib/rt/itcms/step + drop + br $while-continue|1 + end + end + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i32.const 200 + i64.extend_i32_u + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + i32.const 0 + drop + ) + (func $~lib/array/Array#get:length_ (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=12 + ) + (func $~lib/arraybuffer/ArrayBufferView#get:byteLength (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=8 + ) + (func $~lib/arraybuffer/ArrayBufferView#get:buffer (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + ) + (func $~lib/rt/itcms/Object#get:rtSize (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=16 + ) + (func $~lib/rt/itcms/__renew (type $i32_i32_=>_i32) (param $oldPtr i32) (param $size i32) (result i32) + (local $oldObj i32) + (local $newPtr i32) + (local $4 i32) + (local $5 i32) + local.get $oldPtr + i32.const 20 + i32.sub + local.set $oldObj + local.get $size + local.get $oldObj + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.sub + i32.le_u + if + local.get $oldObj + local.get $size + call $~lib/rt/itcms/Object#set:rtSize + local.get $oldPtr + return + end + local.get $size + local.get $oldObj + call $~lib/rt/itcms/Object#get:rtId + call $~lib/rt/itcms/__new + local.set $newPtr + local.get $newPtr + local.get $oldPtr + local.get $size + local.tee $4 + local.get $oldObj + call $~lib/rt/itcms/Object#get:rtSize + local.tee $5 + local.get $4 + local.get $5 + i32.lt_u + select + memory.copy $0 $0 + local.get $newPtr + return + ) + (func $~lib/array/ensureCapacity (type $i32_i32_i32_i32_=>_none) (param $array i32) (param $newSize i32) (param $alignLog2 i32) (param $canGrow i32) + (local $oldCapacity i32) + (local $oldData i32) + (local $6 i32) + (local $7 i32) + (local $newCapacity i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + (local $newData i32) + local.get $array + call $~lib/arraybuffer/ArrayBufferView#get:byteLength + local.set $oldCapacity + local.get $newSize + local.get $oldCapacity + local.get $alignLog2 + i32.shr_u + i32.gt_u + if + local.get $newSize + i32.const 1073741820 + local.get $alignLog2 + i32.shr_u + i32.gt_u + if + i32.const 432 + i32.const 816 + i32.const 19 + i32.const 48 + call $~lib/builtins/abort + unreachable + end + local.get $array + call $~lib/arraybuffer/ArrayBufferView#get:buffer + local.set $oldData + local.get $newSize + local.tee $6 + i32.const 8 + local.tee $7 + local.get $6 + local.get $7 + i32.gt_u + select + local.get $alignLog2 + i32.shl + local.set $newCapacity + local.get $canGrow + if + local.get $oldCapacity + i32.const 1 + i32.shl + local.tee $9 + i32.const 1073741820 + local.tee $10 + local.get $9 + local.get $10 + i32.lt_u + select + local.tee $11 + local.get $newCapacity + local.tee $12 + local.get $11 + local.get $12 + i32.gt_u + select + local.set $newCapacity + end + local.get $oldData + local.get $newCapacity + call $~lib/rt/itcms/__renew + local.set $newData + i32.const 2 + global.get $~lib/shared/runtime/Runtime.Incremental + i32.ne + drop + local.get $newData + local.get $oldData + i32.ne + if + local.get $array + local.get $newData + i32.store $0 + local.get $array + local.get $newData + i32.store $0 offset=4 + local.get $array + local.get $newData + i32.const 0 + call $~lib/rt/itcms/__link + end + local.get $array + local.get $newCapacity + i32.store $0 offset=8 + end + ) + (func $~lib/array/Array#get:dataStart (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) + (func $~lib/array/Array#set:length_ (type $i32_i32_=>_none) (param $this i32) (param $length_ i32) + local.get $this + local.get $length_ + i32.store $0 offset=12 + ) + (func $~lib/array/Array#push (type $i32_i32_=>_i32) (param $this i32) (param $value i32) (result i32) + (local $oldLen i32) + (local $len i32) + local.get $this + call $~lib/array/Array#get:length_ + local.set $oldLen + local.get $oldLen + i32.const 1 + i32.add + local.set $len + local.get $this + local.get $len + i32.const 2 + i32.const 1 + call $~lib/array/ensureCapacity + i32.const 1 + drop + local.get $this + call $~lib/array/Array#get:dataStart + local.get $oldLen + i32.const 2 + i32.shl + i32.add + local.get $value + i32.store $0 + local.get $this + local.get $value + i32.const 1 + call $~lib/rt/itcms/__link + local.get $this + local.get $len + call $~lib/array/Array#set:length_ + local.get $len + return + ) + (func $~lib/array/Array#set:length (type $i32_i32_=>_none) (param $this i32) (param $newLength i32) + local.get $this + local.get $newLength + i32.const 2 + i32.const 0 + call $~lib/array/ensureCapacity + local.get $this + local.get $newLength + call $~lib/array/Array#set:length_ + ) + (func $~lib/rt/__visit_globals (type $i32_=>_none) (param $0 i32) + (local $1 i32) + global.get $~lib/weakref/ALL_REFERENCES + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end + global.get $std/weakref/weakref + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end + global.get $std/weakref/globalRefs + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end + global.get $std/weakref/weakref2 + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end + i32.const 224 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 432 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 576 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 32 + local.get $0 + call $~lib/rt/itcms/__visit + ) + (func $~lib/arraybuffer/ArrayBufferView~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + i32.load $0 + local.tee $2 + if + local.get $2 + local.get $1 + call $~lib/rt/itcms/__visit + end + ) + (func $~lib/object/Object~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + nop + ) + (func $~lib/function/Function<%28usize%29=>void>#get:_env (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) + (func $~lib/function/Function<%28usize%29=>void>#__visit (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) + local.get $this + call $~lib/function/Function<%28usize%29=>void>#get:_env + local.get $cookie + call $~lib/rt/itcms/__visit + ) + (func $~lib/function/Function<%28usize%29=>void>~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + local.get $1 + call $~lib/function/Function<%28usize%29=>void>#__visit + ) + (func $~lib/map/Map#__visit (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) + (local $entries i32) + local.get $this + call $~lib/map/Map#get:buckets + local.get $cookie + call $~lib/rt/itcms/__visit + local.get $this + call $~lib/map/Map#get:entries + local.set $entries + i32.const 0 + drop + local.get $entries + local.get $cookie + call $~lib/rt/itcms/__visit + ) + (func $~lib/map/Map~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + local.get $1 + call $~lib/map/Map#__visit + ) + (func $~lib/array/Array#get:buffer (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + ) + (func $~lib/array/Array#__visit (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) + (local $cur i32) + (local $end i32) + (local $val i32) + i32.const 1 + drop + local.get $this + call $~lib/array/Array#get:dataStart + local.set $cur + local.get $cur + local.get $this + call $~lib/array/Array#get:length_ + i32.const 2 + i32.shl + i32.add + local.set $end + loop $while-continue|0 + local.get $cur + local.get $end + i32.lt_u + if + local.get $cur + i32.load $0 + local.set $val + local.get $val + if + local.get $val + local.get $cookie + call $~lib/rt/itcms/__visit + end + local.get $cur + i32.const 4 + i32.add + local.set $cur + br $while-continue|0 + end + end + local.get $this + call $~lib/array/Array#get:buffer + local.get $cookie + call $~lib/rt/itcms/__visit + ) + (func $~lib/array/Array~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + local.get $1 + call $~lib/array/Array#__visit + ) + (func $~lib/rt/__visit_members (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + block $invalid + block $~lib/array/Array + block $~lib/map/Map + block $~lib/function/Function<%28usize%29=>void> + block $~lib/weakref/WeakRef + block $std/weakref/Dummy + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + block $~lib/object/Object + local.get $0 + i32.const 8 + i32.sub + i32.load $0 + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $std/weakref/Dummy $~lib/weakref/WeakRef $~lib/function/Function<%28usize%29=>void> $~lib/map/Map $~lib/array/Array $invalid + end + return + end + return + end + return + end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit + return + end + return + end + return + end + local.get $0 + local.get $1 + call $~lib/function/Function<%28usize%29=>void>~visit + return + end + local.get $0 + local.get $1 + call $~lib/map/Map~visit + return + end + local.get $0 + local.get $1 + call $~lib/array/Array~visit + return + end + unreachable + ) + (func $~start (type $none_=>_none) + call $start:std/weakref + ) + (func $~stack_check (type $none_=>_none) + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__data_end + i32.lt_s + if + i32.const 33680 + i32.const 33728 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (func $~lib/map/Map#constructor (type $i32_=>_i32) (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store $0 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.const 7 + call $~lib/rt/itcms/__new + local.tee $this + i32.store $0 + end + local.get $this + i32.const 0 + i32.const 4 + i32.const 4 + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $1 + call $~lib/map/Map#set:buckets + local.get $this + i32.const 4 + i32.const 1 + i32.sub + call $~lib/map/Map#set:bucketsMask + local.get $this + i32.const 0 + i32.const 4 + block $~lib/map/ENTRY_SIZE|inlined.0 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE|inlined.0 + end + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $1 + call $~lib/map/Map#set:entries + local.get $this + i32.const 4 + call $~lib/map/Map#set:entriesCapacity + local.get $this + i32.const 0 + call $~lib/map/Map#set:entriesOffset + local.get $this + i32.const 0 + call $~lib/map/Map#set:entriesCount + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $~lib/weakref/WeakRef.finalize (type $i32_=>_none) (param $ptr i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + global.get $~lib/weakref/ALL_REFERENCES + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 + local.get $1 + local.get $ptr + call $~lib/map/Map#delete + if + global.get $~lib/weakref/CURRENT_COOKIE + i32.const 1 + i32.add + global.set $~lib/weakref/CURRENT_COOKIE + end + global.get $~lib/weakref/PREVIOUS_FINALIZER + if + local.get $ptr + global.get $~lib/weakref/PREVIOUS_FINALIZER + call_indirect $0 (type $i32_=>_none) + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/weakref/WeakRef#constructor (type $i32_i32_=>_i32) (param $this i32) (param $value i32) (result i32) + (local $ref i32) + (local $cookie i32) + (local $4 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store $0 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $this + i32.store $0 + end + local.get $this + i32.const 0 + call $~lib/weakref/WeakRef#set:ref + local.get $this + i32.const 0 + call $~lib/weakref/WeakRef#set:cookie + i32.const 0 + i32.eqz + drop + global.get $~lib/weakref/INITIALIZED + i32.eqz + if + global.get $~lib/rt/__finalize + global.set $~lib/weakref/PREVIOUS_FINALIZER + i32.const 544 + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store $0 offset=4 + local.get $4 + call $~lib/function/Function<%28usize%29=>void>#get:index + global.set $~lib/rt/__finalize + i32.const 1 + global.set $~lib/weakref/INITIALIZED + end + local.get $value + local.set $ref + global.get $~lib/weakref/CURRENT_COOKIE + local.set $cookie + global.get $~lib/weakref/ALL_REFERENCES + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store $0 offset=4 + local.get $4 + local.get $ref + local.get $cookie + call $~lib/map/Map#set + drop + local.get $this + local.get $ref + call $~lib/weakref/WeakRef#set:ref + local.get $this + local.get $cookie + call $~lib/weakref/WeakRef#set:cookie + local.get $this + local.set $4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $4 + ) + (func $std/weakref/produceDummy (type $none_=>_i32) (result i32) + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + i32.const 0 + i32.const 0 + call $std/weakref/Dummy#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store $0 + local.get $0 + call $~lib/weakref/WeakRef#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + return + ) + (func $~lib/weakref/WeakRef#deref (type $i32_=>_i32) (param $this i32) (result i32) + (local $ref i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $this + call $~lib/weakref/WeakRef#get:ref + local.set $ref + global.get $~lib/weakref/ALL_REFERENCES + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + local.get $ref + call $~lib/map/Map#has + if (result i32) + global.get $~lib/weakref/ALL_REFERENCES + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + local.get $ref + call $~lib/map/Map#get + local.get $this + call $~lib/weakref/WeakRef#get:cookie + i32.eq + else + i32.const 0 + end + if + local.get $ref + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + return + else + i32.const 0 + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + return + end + unreachable + ) + (func $std/weakref/makeDummy (type $none_=>_i32) (result i32) + (local $instance i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store $0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + call $std/weakref/Dummy#constructor + local.tee $instance + i32.store $0 + global.get $std/weakref/globalRefs + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $1 + local.get $instance + call $~lib/array/Array#push + drop + i32.const 0 + local.get $instance + call $~lib/weakref/WeakRef#constructor + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + return + ) + (func $start:std/weakref (type $none_=>_none) + (local $0 i32) + (local $1 i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + memory.size $0 + i32.const 16 + i32.shl + global.get $~lib/memory/__heap_base + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 144 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 176 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + i32.const 320 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace + i32.const 0 + call $~lib/map/Map#constructor + global.set $~lib/weakref/ALL_REFERENCES + call $std/weakref/produceDummy + global.set $std/weakref/weakref + global.get $std/weakref/weakref + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + call $~lib/weakref/WeakRef#deref + i32.const 0 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 10 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $~lib/rt/itcms/__collect + global.get $std/weakref/weakref + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + call $~lib/weakref/WeakRef#deref + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 12 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $std/weakref/makeDummy + global.set $std/weakref/weakref2 + global.get $std/weakref/weakref2 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + call $~lib/weakref/WeakRef#deref + i32.const 0 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 25 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $~lib/rt/itcms/__collect + global.get $std/weakref/weakref2 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + call $~lib/weakref/WeakRef#deref + i32.const 0 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 29 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $std/weakref/globalRefs + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + i32.const 0 + call $~lib/array/Array#set:length + call $~lib/rt/itcms/__collect + global.get $std/weakref/weakref2 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + call $~lib/weakref/WeakRef#deref + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 33 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/arraybuffer/ArrayBuffer#constructor (type $i32_i32_=>_i32) (param $this i32) (param $length i32) (result i32) + (local $buffer i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $length + i32.const 1073741820 + i32.gt_u + if + i32.const 432 + i32.const 480 + i32.const 52 + i32.const 43 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.get $length + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $buffer + i32.store $0 + i32.const 2 + global.get $~lib/shared/runtime/Runtime.Incremental + i32.ne + drop + local.get $buffer + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + ) + (func $~lib/map/Map#set (type $i32_i32_i32_=>_i32) (param $this i32) (param $key i32) (param $value i32) (result i32) + (local $hashCode i32) + (local $entry i32) + (local $entries i32) + (local $6 i32) + (local $bucketPtrBase i32) + (local $8 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $key + call $~lib/util/hash/HASH + local.set $hashCode + local.get $this + local.get $key + local.get $hashCode + call $~lib/map/Map#find + local.set $entry + local.get $entry + if + local.get $entry + local.get $value + call $~lib/map/MapEntry#set:value + i32.const 0 + drop + else + local.get $this + call $~lib/map/Map#get:entriesOffset + local.get $this + call $~lib/map/Map#get:entriesCapacity + i32.eq + if + local.get $this + local.get $this + call $~lib/map/Map#get:entriesCount + local.get $this + call $~lib/map/Map#get:entriesCapacity + i32.const 3 + i32.mul + i32.const 4 + i32.div_s + i32.lt_s + if (result i32) + local.get $this + call $~lib/map/Map#get:bucketsMask + else + local.get $this + call $~lib/map/Map#get:bucketsMask + i32.const 1 + i32.shl + i32.const 1 + i32.or + end + call $~lib/map/Map#rehash + end + global.get $~lib/memory/__stack_pointer + local.get $this + call $~lib/map/Map#get:entries + local.tee $entries + i32.store $0 + local.get $entries + local.get $this + local.get $this + call $~lib/map/Map#get:entriesOffset + local.tee $6 + i32.const 1 + i32.add + call $~lib/map/Map#set:entriesOffset + local.get $6 + block $~lib/map/ENTRY_SIZE|inlined.5 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE|inlined.5 + end + i32.mul + i32.add + local.set $entry + local.get $entry + local.get $key + call $~lib/map/MapEntry#set:key + i32.const 0 + drop + local.get $entry + local.get $value + call $~lib/map/MapEntry#set:value + i32.const 0 + drop + local.get $this + local.get $this + call $~lib/map/Map#get:entriesCount + i32.const 1 + i32.add + call $~lib/map/Map#set:entriesCount + local.get $this + call $~lib/map/Map#get:buckets + local.get $hashCode + local.get $this + call $~lib/map/Map#get:bucketsMask + i32.and + i32.const 4 + i32.mul + i32.add + local.set $bucketPtrBase + local.get $entry + local.get $bucketPtrBase + i32.load $0 + call $~lib/map/MapEntry#set:taggedNext + local.get $bucketPtrBase + local.get $entry + i32.store $0 + end + local.get $this + local.set $8 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $8 + return + ) + (func $~lib/object/Object#constructor (type $i32_=>_i32) (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 0 + call $~lib/rt/itcms/__new + local.tee $this + i32.store $0 + end + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $std/weakref/Dummy#constructor (type $i32_=>_i32) (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $this + i32.store $0 + end + global.get $~lib/memory/__stack_pointer + local.get $this + call $~lib/object/Object#constructor + local.tee $this + i32.store $0 + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) +) diff --git a/tests/compiler/std/weakref.json b/tests/compiler/std/weakref.json new file mode 100644 index 0000000000..1bdd02b1be --- /dev/null +++ b/tests/compiler/std/weakref.json @@ -0,0 +1,4 @@ +{ + "asc_flags": [ + ] +} diff --git a/tests/compiler/std/weakref.release.wat b/tests/compiler/std/weakref.release.wat new file mode 100644 index 0000000000..a8b2df1435 --- /dev/null +++ b/tests/compiler/std/weakref.release.wat @@ -0,0 +1,3055 @@ +(module + (type $i32_=>_none (func_subtype (param i32) func)) + (type $none_=>_none (func_subtype func)) + (type $i32_i32_=>_none (func_subtype (param i32 i32) func)) + (type $i32_=>_i32 (func_subtype (param i32) (result i32) func)) + (type $i32_i32_i32_=>_none (func_subtype (param i32 i32 i32) func)) + (type $none_=>_i32 (func_subtype (result i32) func)) + (type $i32_i32_=>_i32 (func_subtype (param i32 i32) (result i32) func)) + (type $i32_i32_i32_i32_=>_none (func_subtype (param i32 i32 i32 i32) func)) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (global $~lib/weakref/INITIALIZED (mut i32) (i32.const 0)) + (global $~lib/weakref/PREVIOUS_FINALIZER (mut i32) (i32.const 0)) + (global $~lib/rt/__finalize (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/weakref/ALL_REFERENCES (mut i32) (i32.const 0)) + (global $~lib/weakref/CURRENT_COOKIE (mut i32) (i32.const 0)) + (global $std/weakref/weakref (mut i32) (i32.const 0)) + (global $std/weakref/weakref2 (mut i32) (i32.const 0)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34680)) + (memory $0 1) + (data (i32.const 1036) "<") + (data (i32.const 1048) "\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") + (data (i32.const 1100) "<") + (data (i32.const 1112) "\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s") + (data (i32.const 1228) "<") + (data (i32.const 1240) "\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e") + (data (i32.const 1292) ",") + (data (i32.const 1304) "\02\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") + (data (i32.const 1372) "<") + (data (i32.const 1384) "\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") + (data (i32.const 1436) ",") + (data (i32.const 1448) "\02\00\00\00\1c\00\00\00I\00n\00v\00a\00l\00i\00d\00 \00l\00e\00n\00g\00t\00h") + (data (i32.const 1484) "<") + (data (i32.const 1496) "\02\00\00\00&\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s") + (data (i32.const 1548) "\1c") + (data (i32.const 1560) "\06\00\00\00\08\00\00\00\01") + (data (i32.const 1580) "<") + (data (i32.const 1592) "\02\00\00\00$\00\00\00K\00e\00y\00 \00d\00o\00e\00s\00 \00n\00o\00t\00 \00e\00x\00i\00s\00t") + (data (i32.const 1644) ",") + (data (i32.const 1656) "\02\00\00\00\16\00\00\00~\00l\00i\00b\00/\00m\00a\00p\00.\00t\00s") + (data (i32.const 1692) ",") + (data (i32.const 1704) "\02\00\00\00\1c\00\00\00s\00t\00d\00/\00w\00e\00a\00k\00r\00e\00f\00.\00t\00s") + (data (i32.const 1740) "\1c") + (data (i32.const 1752) "\01") + (data (i32.const 1772) ",") + (data (i32.const 1784) "\08\00\00\00\10\00\00\00\e0\06\00\00\e0\06") + (data (i32.const 1820) ",") + (data (i32.const 1832) "\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") + (data (i32.const 1872) "\t\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00\00\00\00\00\10\01\02\00\02A") + (table $0 2 2 funcref) + (elem $0 (i32.const 1) $~lib/weakref/WeakRef.finalize) + (export "memory" (memory $0)) + (start $~start) + (func $~lib/rt/itcms/visitRoots (type $none_=>_none) + (local $0 i32) + (local $1 i32) + global.get $~lib/weakref/ALL_REFERENCES + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + global.get $std/weakref/weakref + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + i32.const 1792 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + global.get $std/weakref/weakref2 + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + i32.const 1248 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + i32.const 1456 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + i32.const 1600 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + i32.const 1056 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + global.get $~lib/rt/itcms/pinSpace + local.tee $1 + i32.load $0 offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|0 + local.get $0 + local.get $1 + i32.ne + if + local.get $0 + i32.load $0 offset=4 + i32.const 3 + i32.and + i32.const 3 + i32.ne + if + i32.const 0 + i32.const 1120 + i32.const 160 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + local.get $0 + i32.load $0 offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|0 + end + end + ) + (func $~lib/rt/itcms/Object#makeGray (type $i32_=>_none) (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + global.get $~lib/rt/itcms/iter + i32.eq + if + local.get $0 + i32.load $0 offset=8 + local.tee $1 + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 148 + i32.const 30 + call $~lib/builtins/abort + unreachable + end + local.get $1 + global.set $~lib/rt/itcms/iter + end + block $__inlined_func$~lib/rt/itcms/Object#unlink + local.get $0 + i32.load $0 offset=4 + i32.const -4 + i32.and + local.tee $1 + i32.eqz + if + local.get $0 + i32.load $0 offset=8 + i32.eqz + local.get $0 + i32.const 34680 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 128 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + br $__inlined_func$~lib/rt/itcms/Object#unlink + end + local.get $0 + i32.load $0 offset=8 + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 132 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $1 + local.get $2 + i32.store $0 offset=8 + local.get $2 + local.get $1 + local.get $2 + i32.load $0 offset=4 + i32.const 3 + i32.and + i32.or + i32.store $0 offset=4 + end + global.get $~lib/rt/itcms/toSpace + local.set $2 + local.get $0 + i32.load $0 offset=12 + local.tee $1 + i32.const 2 + i32.le_u + if (result i32) + i32.const 1 + else + local.get $1 + i32.const 1872 + i32.load $0 + i32.gt_u + if + i32.const 1248 + i32.const 1312 + i32.const 21 + i32.const 28 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 2 + i32.shl + i32.const 1876 + i32.add + i32.load $0 + i32.const 32 + i32.and + end + local.set $3 + local.get $2 + i32.load $0 offset=8 + local.set $1 + local.get $0 + global.get $~lib/rt/itcms/white + i32.eqz + i32.const 2 + local.get $3 + select + local.get $2 + i32.or + i32.store $0 offset=4 + local.get $0 + local.get $1 + i32.store $0 offset=8 + local.get $1 + local.get $0 + local.get $1 + i32.load $0 offset=4 + i32.const 3 + i32.and + i32.or + i32.store $0 offset=4 + local.get $2 + local.get $0 + i32.store $0 offset=8 + ) + (func $~lib/rt/tlsf/removeBlock (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $1 + i32.load $0 + local.tee $2 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1392 + i32.const 268 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $2 + i32.const -4 + i32.and + local.tee $2 + i32.const 12 + i32.lt_u + if + i32.const 0 + i32.const 1392 + i32.const 270 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $2 + i32.const 256 + i32.lt_u + if (result i32) + local.get $2 + i32.const 4 + i32.shr_u + else + i32.const 31 + i32.const 1073741820 + local.get $2 + local.get $2 + i32.const 1073741820 + i32.ge_u + select + local.tee $2 + i32.clz + i32.sub + local.tee $4 + i32.const 7 + i32.sub + local.set $3 + local.get $2 + local.get $4 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + end + local.tee $2 + i32.const 16 + i32.lt_u + local.get $3 + i32.const 23 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 1392 + i32.const 284 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load $0 offset=8 + local.set $5 + local.get $1 + i32.load $0 offset=4 + local.tee $4 + if + local.get $4 + local.get $5 + i32.store $0 offset=8 + end + local.get $5 + if + local.get $5 + local.get $4 + i32.store $0 offset=4 + end + local.get $1 + local.get $0 + local.get $3 + i32.const 4 + i32.shl + local.get $2 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load $0 offset=96 + i32.eq + if + local.get $0 + local.get $3 + i32.const 4 + i32.shl + local.get $2 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $5 + i32.store $0 offset=96 + local.get $5 + i32.eqz + if + local.get $0 + local.get $3 + i32.const 2 + i32.shl + i32.add + local.tee $1 + i32.load $0 offset=4 + i32.const -2 + local.get $2 + i32.rotl + i32.and + local.set $2 + local.get $1 + local.get $2 + i32.store $0 offset=4 + local.get $2 + i32.eqz + if + local.get $0 + local.get $0 + i32.load $0 + i32.const -2 + local.get $3 + i32.rotl + i32.and + i32.store $0 + end + end + end + ) + (func $~lib/rt/tlsf/insertBlock (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + local.get $1 + i32.eqz + if + i32.const 0 + i32.const 1392 + i32.const 201 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load $0 + local.tee $3 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1392 + i32.const 203 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 4 + i32.add + local.get $1 + i32.load $0 + i32.const -4 + i32.and + i32.add + local.tee $4 + i32.load $0 + local.tee $2 + i32.const 1 + i32.and + if + local.get $0 + local.get $4 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $3 + i32.const 4 + i32.add + local.get $2 + i32.const -4 + i32.and + i32.add + local.tee $3 + i32.store $0 + local.get $1 + i32.const 4 + i32.add + local.get $1 + i32.load $0 + i32.const -4 + i32.and + i32.add + local.tee $4 + i32.load $0 + local.set $2 + end + local.get $3 + i32.const 2 + i32.and + if + local.get $1 + i32.const 4 + i32.sub + i32.load $0 + local.tee $1 + i32.load $0 + local.tee $6 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1392 + i32.const 221 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $6 + i32.const 4 + i32.add + local.get $3 + i32.const -4 + i32.and + i32.add + local.tee $3 + i32.store $0 + end + local.get $4 + local.get $2 + i32.const 2 + i32.or + i32.store $0 + local.get $3 + i32.const -4 + i32.and + local.tee $2 + i32.const 12 + i32.lt_u + if + i32.const 0 + i32.const 1392 + i32.const 233 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $4 + local.get $1 + i32.const 4 + i32.add + local.get $2 + i32.add + i32.ne + if + i32.const 0 + i32.const 1392 + i32.const 234 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 4 + i32.sub + local.get $1 + i32.store $0 + local.get $2 + i32.const 256 + i32.lt_u + if (result i32) + local.get $2 + i32.const 4 + i32.shr_u + else + i32.const 31 + i32.const 1073741820 + local.get $2 + local.get $2 + i32.const 1073741820 + i32.ge_u + select + local.tee $2 + i32.clz + i32.sub + local.tee $3 + i32.const 7 + i32.sub + local.set $5 + local.get $2 + local.get $3 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + end + local.tee $2 + i32.const 16 + i32.lt_u + local.get $5 + i32.const 23 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 1392 + i32.const 251 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $5 + i32.const 4 + i32.shl + local.get $2 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load $0 offset=96 + local.set $3 + local.get $1 + i32.const 0 + i32.store $0 offset=4 + local.get $1 + local.get $3 + i32.store $0 offset=8 + local.get $3 + if + local.get $3 + local.get $1 + i32.store $0 offset=4 + end + local.get $0 + local.get $5 + i32.const 4 + i32.shl + local.get $2 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $1 + i32.store $0 offset=96 + local.get $0 + local.get $0 + i32.load $0 + i32.const 1 + local.get $5 + i32.shl + i32.or + i32.store $0 + local.get $0 + local.get $5 + i32.const 2 + i32.shl + i32.add + local.tee $0 + local.get $0 + i32.load $0 offset=4 + i32.const 1 + local.get $2 + i32.shl + i32.or + i32.store $0 offset=4 + ) + (func $~lib/rt/tlsf/addMemory (type $i32_i32_i32_=>_none) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + local.get $1 + local.get $2 + i32.gt_u + if + i32.const 0 + i32.const 1392 + i32.const 377 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 19 + i32.add + i32.const -16 + i32.and + i32.const 4 + i32.sub + local.set $1 + local.get $0 + i32.load $0 offset=1568 + local.tee $4 + if + local.get $4 + i32.const 4 + i32.add + local.get $1 + i32.gt_u + if + i32.const 0 + i32.const 1392 + i32.const 384 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 16 + i32.sub + local.get $4 + i32.eq + if + local.get $4 + i32.load $0 + local.set $3 + local.get $1 + i32.const 16 + i32.sub + local.set $1 + end + else + local.get $0 + i32.const 1572 + i32.add + local.get $1 + i32.gt_u + if + i32.const 0 + i32.const 1392 + i32.const 397 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + end + local.get $2 + i32.const -16 + i32.and + local.get $1 + i32.sub + local.tee $2 + i32.const 20 + i32.lt_u + if + return + end + local.get $1 + local.get $3 + i32.const 2 + i32.and + local.get $2 + i32.const 8 + i32.sub + local.tee $2 + i32.const 1 + i32.or + i32.or + i32.store $0 + local.get $1 + i32.const 0 + i32.store $0 offset=4 + local.get $1 + i32.const 0 + i32.store $0 offset=8 + local.get $1 + i32.const 4 + i32.add + local.get $2 + i32.add + local.tee $2 + i32.const 2 + i32.store $0 + local.get $0 + local.get $2 + i32.store $0 offset=1568 + local.get $0 + local.get $1 + call $~lib/rt/tlsf/insertBlock + ) + (func $~lib/rt/tlsf/initialize (type $none_=>_none) + (local $0 i32) + (local $1 i32) + memory.size $0 + local.tee $1 + i32.const 0 + i32.le_s + if (result i32) + i32.const 1 + local.get $1 + i32.sub + memory.grow $0 + i32.const 0 + i32.lt_s + else + i32.const 0 + end + if + unreachable + end + i32.const 34688 + i32.const 0 + i32.store $0 + i32.const 36256 + i32.const 0 + i32.store $0 + loop $for-loop|0 + local.get $0 + i32.const 23 + i32.lt_u + if + local.get $0 + i32.const 2 + i32.shl + i32.const 34688 + i32.add + i32.const 0 + i32.store $0 offset=4 + i32.const 0 + local.set $1 + loop $for-loop|1 + local.get $1 + i32.const 16 + i32.lt_u + if + local.get $0 + i32.const 4 + i32.shl + local.get $1 + i32.add + i32.const 2 + i32.shl + i32.const 34688 + i32.add + i32.const 0 + i32.store $0 offset=96 + local.get $1 + i32.const 1 + i32.add + local.set $1 + br $for-loop|1 + end + end + local.get $0 + i32.const 1 + i32.add + local.set $0 + br $for-loop|0 + end + end + i32.const 34688 + i32.const 36260 + memory.size $0 + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + i32.const 34688 + global.set $~lib/rt/tlsf/ROOT + ) + (func $~lib/rt/itcms/step (type $none_=>_i32) (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + block $break|0 + block $case2|0 + block $case1|0 + block $case0|0 + global.get $~lib/rt/itcms/state + br_table $case0|0 $case1|0 $case2|0 $break|0 + end + i32.const 1 + global.set $~lib/rt/itcms/state + i32.const 0 + global.set $~lib/rt/itcms/visitCount + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/visitCount + return + end + global.get $~lib/rt/itcms/white + i32.eqz + local.set $1 + global.get $~lib/rt/itcms/iter + i32.load $0 offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|1 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $0 + global.set $~lib/rt/itcms/iter + local.get $1 + local.get $0 + i32.load $0 offset=4 + i32.const 3 + i32.and + i32.ne + if + local.get $0 + local.get $0 + i32.load $0 offset=4 + i32.const -4 + i32.and + local.get $1 + i32.or + i32.store $0 offset=4 + i32.const 0 + global.set $~lib/rt/itcms/visitCount + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + global.get $~lib/rt/itcms/visitCount + return + end + local.get $0 + i32.load $0 offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|1 + end + end + i32.const 0 + global.set $~lib/rt/itcms/visitCount + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/iter + i32.load $0 offset=4 + i32.const -4 + i32.and + i32.eq + if + global.get $~lib/memory/__stack_pointer + local.set $0 + loop $while-continue|0 + local.get $0 + i32.const 34680 + i32.lt_u + if + local.get $0 + i32.load $0 + local.tee $2 + if + local.get $2 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + local.get $0 + i32.const 4 + i32.add + local.set $0 + br $while-continue|0 + end + end + global.get $~lib/rt/itcms/iter + i32.load $0 offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|2 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $1 + local.get $0 + i32.load $0 offset=4 + i32.const 3 + i32.and + i32.ne + if + local.get $0 + local.get $0 + i32.load $0 offset=4 + i32.const -4 + i32.and + local.get $1 + i32.or + i32.store $0 offset=4 + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + end + local.get $0 + i32.load $0 offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|2 + end + end + global.get $~lib/rt/itcms/fromSpace + local.set $0 + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/fromSpace + local.get $0 + global.set $~lib/rt/itcms/toSpace + local.get $1 + global.set $~lib/rt/itcms/white + local.get $0 + i32.load $0 offset=4 + i32.const -4 + i32.and + global.set $~lib/rt/itcms/iter + i32.const 2 + global.set $~lib/rt/itcms/state + end + global.get $~lib/rt/itcms/visitCount + return + end + global.get $~lib/rt/itcms/iter + local.tee $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $0 + i32.load $0 offset=4 + local.tee $1 + i32.const -4 + i32.and + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/white + i32.eqz + local.get $1 + i32.const 3 + i32.and + i32.ne + if + i32.const 0 + i32.const 1120 + i32.const 229 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 34680 + i32.lt_u + if + local.get $0 + i32.const 0 + i32.store $0 offset=4 + local.get $0 + i32.const 0 + i32.store $0 offset=8 + else + global.get $~lib/rt/itcms/total + local.get $0 + i32.load $0 + i32.const -4 + i32.and + i32.const 4 + i32.add + i32.sub + global.set $~lib/rt/itcms/total + global.get $~lib/rt/__finalize + if + local.get $0 + i32.const 20 + i32.add + global.get $~lib/rt/__finalize + call_indirect $0 (type $i32_=>_none) + end + local.get $0 + i32.const 4 + i32.add + local.tee $0 + i32.const 34680 + i32.ge_u + if + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.set $1 + local.get $0 + i32.const 4 + i32.sub + local.set $2 + local.get $0 + i32.const 15 + i32.and + i32.const 1 + local.get $0 + select + if (result i32) + i32.const 1 + else + local.get $2 + i32.load $0 + i32.const 1 + i32.and + end + if + i32.const 0 + i32.const 1392 + i32.const 559 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $2 + local.get $2 + i32.load $0 + i32.const 1 + i32.or + i32.store $0 + local.get $1 + local.get $2 + call $~lib/rt/tlsf/insertBlock + end + end + i32.const 10 + return + end + global.get $~lib/rt/itcms/toSpace + local.tee $0 + local.get $0 + i32.store $0 offset=4 + local.get $0 + local.get $0 + i32.store $0 offset=8 + i32.const 0 + global.set $~lib/rt/itcms/state + end + i32.const 0 + ) + (func $~lib/rt/tlsf/searchBlock (type $i32_i32_=>_i32) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + local.get $1 + i32.const 256 + i32.lt_u + if (result i32) + local.get $1 + i32.const 4 + i32.shr_u + else + i32.const 31 + local.get $1 + i32.const 1 + i32.const 27 + local.get $1 + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + local.get $1 + local.get $1 + i32.const 536870910 + i32.lt_u + select + local.tee $1 + i32.clz + i32.sub + local.tee $3 + i32.const 7 + i32.sub + local.set $2 + local.get $1 + local.get $3 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + end + local.tee $1 + i32.const 16 + i32.lt_u + local.get $2 + i32.const 23 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 1392 + i32.const 330 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $2 + i32.const 2 + i32.shl + i32.add + i32.load $0 offset=4 + i32.const -1 + local.get $1 + i32.shl + i32.and + local.tee $1 + if (result i32) + local.get $0 + local.get $1 + i32.ctz + local.get $2 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load $0 offset=96 + else + local.get $0 + i32.load $0 + i32.const -1 + local.get $2 + i32.const 1 + i32.add + i32.shl + i32.and + local.tee $1 + if (result i32) + local.get $0 + local.get $1 + i32.ctz + local.tee $1 + i32.const 2 + i32.shl + i32.add + i32.load $0 offset=4 + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 1392 + i32.const 343 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $2 + i32.ctz + local.get $1 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load $0 offset=96 + else + i32.const 0 + end + end + ) + (func $~lib/rt/itcms/__new (type $i32_i32_=>_i32) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + local.get $0 + i32.const 1073741804 + i32.ge_u + if + i32.const 1056 + i32.const 1120 + i32.const 261 + i32.const 31 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.ge_u + if + block $__inlined_func$~lib/rt/itcms/interrupt + i32.const 2048 + local.set $2 + loop $do-loop|0 + local.get $2 + call $~lib/rt/itcms/step + i32.sub + local.set $2 + global.get $~lib/rt/itcms/state + i32.eqz + if + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i64.const 200 + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + br $__inlined_func$~lib/rt/itcms/interrupt + end + local.get $2 + i32.const 0 + i32.gt_s + br_if $do-loop|0 + end + global.get $~lib/rt/itcms/total + local.tee $2 + local.get $2 + global.get $~lib/rt/itcms/threshold + i32.sub + i32.const 1024 + i32.lt_u + i32.const 10 + i32.shl + i32.add + global.set $~lib/rt/itcms/threshold + end + end + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.set $4 + local.get $0 + i32.const 16 + i32.add + local.tee $2 + i32.const 1073741820 + i32.gt_u + if + i32.const 1056 + i32.const 1392 + i32.const 458 + i32.const 29 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 12 + local.get $2 + i32.const 19 + i32.add + i32.const -16 + i32.and + i32.const 4 + i32.sub + local.get $2 + i32.const 12 + i32.le_u + select + local.tee $5 + call $~lib/rt/tlsf/searchBlock + local.tee $2 + i32.eqz + if + memory.size $0 + local.tee $2 + i32.const 4 + local.get $4 + i32.load $0 offset=1568 + local.get $2 + i32.const 16 + i32.shl + i32.const 4 + i32.sub + i32.ne + i32.shl + local.get $5 + i32.const 1 + i32.const 27 + local.get $5 + i32.clz + i32.sub + i32.shl + i32.const 1 + i32.sub + i32.add + local.get $5 + local.get $5 + i32.const 536870910 + i32.lt_u + select + i32.add + i32.const 65535 + i32.add + i32.const -65536 + i32.and + i32.const 16 + i32.shr_u + local.tee $3 + local.get $2 + local.get $3 + i32.gt_s + select + memory.grow $0 + i32.const 0 + i32.lt_s + if + local.get $3 + memory.grow $0 + i32.const 0 + i32.lt_s + if + unreachable + end + end + local.get $4 + local.get $2 + i32.const 16 + i32.shl + memory.size $0 + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + local.get $4 + local.get $5 + call $~lib/rt/tlsf/searchBlock + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 1392 + i32.const 496 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + end + local.get $5 + local.get $2 + i32.load $0 + i32.const -4 + i32.and + i32.gt_u + if + i32.const 0 + i32.const 1392 + i32.const 498 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $4 + local.get $2 + call $~lib/rt/tlsf/removeBlock + local.get $2 + i32.load $0 + local.set $3 + local.get $5 + i32.const 4 + i32.add + i32.const 15 + i32.and + if + i32.const 0 + i32.const 1392 + i32.const 357 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const -4 + i32.and + local.get $5 + i32.sub + local.tee $6 + i32.const 16 + i32.ge_u + if + local.get $2 + local.get $5 + local.get $3 + i32.const 2 + i32.and + i32.or + i32.store $0 + local.get $2 + i32.const 4 + i32.add + local.get $5 + i32.add + local.tee $3 + local.get $6 + i32.const 4 + i32.sub + i32.const 1 + i32.or + i32.store $0 + local.get $4 + local.get $3 + call $~lib/rt/tlsf/insertBlock + else + local.get $2 + local.get $3 + i32.const -2 + i32.and + i32.store $0 + local.get $2 + i32.const 4 + i32.add + local.get $2 + i32.load $0 + i32.const -4 + i32.and + i32.add + local.tee $3 + local.get $3 + i32.load $0 + i32.const -3 + i32.and + i32.store $0 + end + local.get $2 + local.get $1 + i32.store $0 offset=12 + local.get $2 + local.get $0 + i32.store $0 offset=16 + global.get $~lib/rt/itcms/fromSpace + local.tee $1 + i32.load $0 offset=8 + local.set $3 + local.get $2 + local.get $1 + global.get $~lib/rt/itcms/white + i32.or + i32.store $0 offset=4 + local.get $2 + local.get $3 + i32.store $0 offset=8 + local.get $3 + local.get $2 + local.get $3 + i32.load $0 offset=4 + i32.const 3 + i32.and + i32.or + i32.store $0 offset=4 + local.get $1 + local.get $2 + i32.store $0 offset=8 + global.get $~lib/rt/itcms/total + local.get $2 + i32.load $0 + i32.const -4 + i32.and + i32.const 4 + i32.add + i32.add + global.set $~lib/rt/itcms/total + local.get $2 + i32.const 20 + i32.add + local.tee $1 + i32.const 0 + local.get $0 + memory.fill $0 + local.get $1 + ) + (func $~lib/map/Map#rehash (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1912 + i32.lt_s + if + i32.const 34704 + i32.const 34752 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $2 + i64.const 0 + i64.store $0 + local.get $2 + local.get $1 + i32.const 1 + i32.add + local.tee $2 + i32.const 2 + i32.shl + call $~lib/arraybuffer/ArrayBuffer#constructor + local.tee $5 + i32.store $0 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.const 3 + i32.shl + i32.const 3 + i32.div_s + local.tee $6 + i32.const 12 + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor + local.tee $3 + i32.store $0 offset=4 + local.get $0 + i32.load $0 offset=8 + local.tee $4 + local.get $0 + i32.load $0 offset=16 + i32.const 12 + i32.mul + i32.add + local.set $7 + local.get $3 + local.set $2 + loop $while-continue|0 + local.get $4 + local.get $7 + i32.ne + if + local.get $4 + i32.load $0 offset=8 + i32.const 1 + i32.and + i32.eqz + if + local.get $2 + local.get $4 + i32.load $0 + local.tee $8 + i32.store $0 + local.get $2 + local.get $4 + i32.load $0 offset=4 + i32.store $0 offset=4 + local.get $2 + local.get $5 + local.get $1 + local.get $8 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $8 + i32.const 15 + i32.shr_u + local.get $8 + i32.xor + i32.const -2048144777 + i32.mul + local.tee $8 + i32.const 13 + i32.shr_u + local.get $8 + i32.xor + i32.const -1028477379 + i32.mul + local.tee $8 + i32.const 16 + i32.shr_u + local.get $8 + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + local.tee $8 + i32.load $0 + i32.store $0 offset=8 + local.get $8 + local.get $2 + i32.store $0 + local.get $2 + i32.const 12 + i32.add + local.set $2 + end + local.get $4 + i32.const 12 + i32.add + local.set $4 + br $while-continue|0 + end + end + local.get $0 + local.get $5 + i32.store $0 + local.get $5 + if + local.get $0 + local.get $5 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + local.get $0 + local.get $1 + i32.store $0 offset=4 + local.get $0 + local.get $3 + i32.store $0 offset=8 + local.get $3 + if + local.get $0 + local.get $3 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + local.get $0 + local.get $6 + i32.store $0 offset=12 + local.get $0 + local.get $0 + i32.load $0 offset=20 + i32.store $0 offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/rt/itcms/__collect (type $none_=>_none) + global.get $~lib/rt/itcms/state + i32.const 0 + i32.gt_s + if + loop $while-continue|0 + global.get $~lib/rt/itcms/state + if + call $~lib/rt/itcms/step + drop + br $while-continue|0 + end + end + end + call $~lib/rt/itcms/step + drop + loop $while-continue|1 + global.get $~lib/rt/itcms/state + if + call $~lib/rt/itcms/step + drop + br $while-continue|1 + end + end + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i64.const 200 + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + ) + (func $~lib/array/ensureCapacity (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + i32.const 1800 + i32.load $0 + local.tee $3 + i32.const 2 + i32.shr_u + i32.gt_u + if + local.get $0 + i32.const 268435455 + i32.gt_u + if + i32.const 1456 + i32.const 1840 + i32.const 19 + i32.const 48 + call $~lib/builtins/abort + unreachable + end + i32.const 1792 + i32.load $0 + local.set $2 + i32.const 8 + local.get $0 + local.get $0 + i32.const 8 + i32.le_u + select + i32.const 2 + i32.shl + local.set $0 + local.get $1 + if + i32.const 1073741820 + local.get $3 + i32.const 1 + i32.shl + local.tee $1 + local.get $1 + i32.const 1073741820 + i32.ge_u + select + local.tee $1 + local.get $0 + local.get $0 + local.get $1 + i32.lt_u + select + local.set $0 + end + block $__inlined_func$~lib/rt/itcms/__renew + local.get $2 + i32.const 20 + i32.sub + local.tee $3 + i32.load $0 + i32.const -4 + i32.and + i32.const 16 + i32.sub + local.get $0 + i32.ge_u + if + local.get $3 + local.get $0 + i32.store $0 offset=16 + local.get $2 + local.set $1 + br $__inlined_func$~lib/rt/itcms/__renew + end + local.get $0 + local.get $3 + i32.load $0 offset=12 + call $~lib/rt/itcms/__new + local.tee $1 + local.get $2 + local.get $0 + local.get $3 + i32.load $0 offset=16 + local.tee $3 + local.get $0 + local.get $3 + i32.lt_u + select + memory.copy $0 $0 + end + local.get $1 + local.get $2 + i32.ne + if + i32.const 1792 + local.get $1 + i32.store $0 + i32.const 1796 + local.get $1 + i32.store $0 + local.get $1 + if + i32.const 1792 + local.get $1 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + end + i32.const 1800 + local.get $0 + i32.store $0 + end + ) + (func $~lib/rt/__visit_members (type $i32_=>_none) (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + block $invalid + block $~lib/array/Array + block $~lib/map/Map + block $~lib/function/Function<%28usize%29=>void> + block $~lib/weakref/WeakRef + block $std/weakref/Dummy + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + block $~lib/object/Object + local.get $0 + i32.const 8 + i32.sub + i32.load $0 + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $std/weakref/Dummy $~lib/weakref/WeakRef $~lib/function/Function<%28usize%29=>void> $~lib/map/Map $~lib/array/Array $invalid + end + return + end + return + end + return + end + local.get $0 + i32.load $0 + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + return + end + return + end + return + end + local.get $0 + i32.load $0 offset=4 + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + return + end + local.get $0 + i32.load $0 + local.tee $1 + if + local.get $1 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + local.get $0 + i32.load $0 offset=8 + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + return + end + local.get $0 + i32.load $0 offset=4 + local.tee $1 + local.get $0 + i32.load $0 offset=12 + i32.const 2 + i32.shl + i32.add + local.set $2 + loop $while-continue|0 + local.get $1 + local.get $2 + i32.lt_u + if + local.get $1 + i32.load $0 + local.tee $3 + if + local.get $3 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + local.get $1 + i32.const 4 + i32.add + local.set $1 + br $while-continue|0 + end + end + local.get $0 + i32.load $0 + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + return + end + unreachable + ) + (func $~start (type $none_=>_none) + (local $0 i32) + (local $1 i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 1912 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $0 + i32.const 0 + i32.store $0 + memory.size $0 + i32.const 16 + i32.shl + i32.const 34680 + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 1172 + i32.const 1168 + i32.store $0 + i32.const 1176 + i32.const 1168 + i32.store $0 + i32.const 1168 + global.set $~lib/rt/itcms/pinSpace + i32.const 1204 + i32.const 1200 + i32.store $0 + i32.const 1208 + i32.const 1200 + i32.store $0 + i32.const 1200 + global.set $~lib/rt/itcms/toSpace + i32.const 1348 + i32.const 1344 + i32.store $0 + i32.const 1352 + i32.const 1344 + i32.store $0 + i32.const 1344 + global.set $~lib/rt/itcms/fromSpace + local.get $0 + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1912 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $0 + i64.const 0 + i64.store $0 + local.get $0 + i32.const 24 + i32.const 7 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store $0 + i32.const 16 + call $~lib/arraybuffer/ArrayBuffer#constructor + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $0 + local.get $1 + i32.store $0 + local.get $1 + if + local.get $0 + local.get $1 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + local.get $0 + i32.const 3 + i32.store $0 offset=4 + i32.const 48 + call $~lib/arraybuffer/ArrayBuffer#constructor + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $0 + local.get $1 + i32.store $0 offset=8 + local.get $1 + if + local.get $0 + local.get $1 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + local.get $0 + i32.const 4 + i32.store $0 offset=12 + local.get $0 + i32.const 0 + i32.store $0 offset=16 + local.get $0 + i32.const 0 + i32.store $0 offset=20 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + global.set $~lib/weakref/ALL_REFERENCES + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1912 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + call $std/weakref/Dummy#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store $0 + local.get $0 + call $~lib/weakref/WeakRef#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + global.set $std/weakref/weakref + global.get $~lib/memory/__stack_pointer + global.get $std/weakref/weakref + local.tee $0 + i32.store $0 + local.get $0 + call $~lib/weakref/WeakRef#deref + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 10 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $~lib/rt/itcms/__collect + global.get $~lib/memory/__stack_pointer + global.get $std/weakref/weakref + local.tee $0 + i32.store $0 + local.get $0 + call $~lib/weakref/WeakRef#deref + if + i32.const 0 + i32.const 1712 + i32.const 12 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1912 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $0 + i64.const 0 + i64.store $0 + local.get $0 + call $std/weakref/Dummy#constructor + local.tee $1 + i32.store $0 + global.get $~lib/memory/__stack_pointer + i32.const 1792 + i32.store $0 offset=4 + i32.const 1804 + i32.load $0 + local.tee $0 + i32.const 1 + i32.add + local.tee $2 + i32.const 1 + call $~lib/array/ensureCapacity + i32.const 1796 + i32.load $0 + local.get $0 + i32.const 2 + i32.shl + i32.add + local.get $1 + i32.store $0 + local.get $1 + if + i32.const 1792 + local.get $1 + i32.const 1 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + i32.const 1804 + local.get $2 + i32.store $0 + local.get $1 + call $~lib/weakref/WeakRef#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + global.set $std/weakref/weakref2 + global.get $~lib/memory/__stack_pointer + global.get $std/weakref/weakref2 + local.tee $0 + i32.store $0 + local.get $0 + call $~lib/weakref/WeakRef#deref + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 25 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $~lib/rt/itcms/__collect + global.get $~lib/memory/__stack_pointer + global.get $std/weakref/weakref2 + local.tee $0 + i32.store $0 + local.get $0 + call $~lib/weakref/WeakRef#deref + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 29 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1792 + i32.store $0 + i32.const 0 + i32.const 0 + call $~lib/array/ensureCapacity + i32.const 1804 + i32.const 0 + i32.store $0 + call $~lib/rt/itcms/__collect + global.get $~lib/memory/__stack_pointer + global.get $std/weakref/weakref2 + local.tee $0 + i32.store $0 + local.get $0 + call $~lib/weakref/WeakRef#deref + if + i32.const 0 + i32.const 1712 + i32.const 33 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + i32.const 34704 + i32.const 34752 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $~lib/weakref/WeakRef.finalize (type $i32_=>_none) (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1912 + i32.lt_s + if + i32.const 34704 + i32.const 34752 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 0 + i32.store $0 + local.get $1 + global.get $~lib/weakref/ALL_REFERENCES + local.tee $2 + i32.store $0 + block $__inlined_func$~lib/map/Map#delete (result i32) + local.get $2 + i32.load $0 + local.get $2 + i32.load $0 offset=4 + local.get $0 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $1 + i32.const 15 + i32.shr_u + local.get $1 + i32.xor + i32.const -2048144777 + i32.mul + local.tee $1 + i32.const 13 + i32.shr_u + local.get $1 + i32.xor + i32.const -1028477379 + i32.mul + local.tee $1 + i32.const 16 + i32.shr_u + local.get $1 + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $1 + block $__inlined_func$~lib/map/Map#find + loop $while-continue|0 + local.get $1 + if + local.get $1 + i32.load $0 offset=8 + local.tee $3 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $1 + i32.load $0 + local.get $0 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find + local.get $3 + i32.const -2 + i32.and + local.set $1 + br $while-continue|0 + end + end + i32.const 0 + local.set $1 + end + i32.const 0 + local.get $1 + i32.eqz + br_if $__inlined_func$~lib/map/Map#delete + drop + local.get $1 + local.get $1 + i32.load $0 offset=8 + i32.const 1 + i32.or + i32.store $0 offset=8 + local.get $2 + local.get $2 + i32.load $0 offset=20 + i32.const 1 + i32.sub + i32.store $0 offset=20 + local.get $2 + i32.load $0 offset=4 + i32.const 1 + i32.shr_u + local.tee $1 + i32.const 1 + i32.add + i32.const 4 + local.get $2 + i32.load $0 offset=20 + local.tee $3 + local.get $3 + i32.const 4 + i32.lt_u + select + i32.ge_u + if (result i32) + local.get $2 + i32.load $0 offset=20 + local.get $2 + i32.load $0 offset=12 + i32.const 3 + i32.mul + i32.const 4 + i32.div_s + i32.lt_s + else + i32.const 0 + end + if + local.get $2 + local.get $1 + call $~lib/map/Map#rehash + end + i32.const 1 + end + if + global.get $~lib/weakref/CURRENT_COOKIE + i32.const 1 + i32.add + global.set $~lib/weakref/CURRENT_COOKIE + end + global.get $~lib/weakref/PREVIOUS_FINALIZER + if + local.get $0 + global.get $~lib/weakref/PREVIOUS_FINALIZER + call_indirect $0 (type $i32_=>_none) + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/weakref/WeakRef#constructor (type $i32_=>_i32) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 1912 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $1 + i64.const 0 + i64.store $0 + local.get $1 + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $2 + i32.store $0 + local.get $2 + i32.const 0 + i32.store $0 + local.get $2 + i32.const 0 + i32.store $0 offset=4 + global.get $~lib/weakref/INITIALIZED + i32.eqz + if + global.get $~lib/rt/__finalize + global.set $~lib/weakref/PREVIOUS_FINALIZER + global.get $~lib/memory/__stack_pointer + i32.const 1568 + i32.store $0 offset=4 + i32.const 1568 + i32.load $0 + global.set $~lib/rt/__finalize + i32.const 1 + global.set $~lib/weakref/INITIALIZED + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + global.get $~lib/weakref/ALL_REFERENCES + local.tee $4 + i32.store $0 offset=4 + local.get $1 + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1912 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/weakref/CURRENT_COOKIE + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $4 + i32.load $0 + local.get $0 + local.tee $1 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $0 + i32.const 15 + i32.shr_u + local.get $0 + i32.xor + i32.const -2048144777 + i32.mul + local.tee $0 + i32.const 13 + i32.shr_u + local.get $0 + i32.xor + i32.const -1028477379 + i32.mul + local.tee $0 + i32.const 16 + i32.shr_u + local.get $0 + i32.xor + local.tee $5 + local.get $4 + i32.load $0 offset=4 + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $0 + block $__inlined_func$~lib/map/Map#find + loop $while-continue|0 + local.get $0 + if + local.get $0 + i32.load $0 offset=8 + local.tee $6 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $1 + local.get $0 + i32.load $0 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find + local.get $6 + i32.const -2 + i32.and + local.set $0 + br $while-continue|0 + end + end + i32.const 0 + local.set $0 + end + local.get $0 + if + local.get $0 + local.get $3 + i32.store $0 offset=4 + else + local.get $4 + i32.load $0 offset=16 + local.get $4 + i32.load $0 offset=12 + i32.eq + if + local.get $4 + local.get $4 + i32.load $0 offset=20 + local.get $4 + i32.load $0 offset=12 + i32.const 3 + i32.mul + i32.const 4 + i32.div_s + i32.lt_s + if (result i32) + local.get $4 + i32.load $0 offset=4 + else + local.get $4 + i32.load $0 offset=4 + i32.const 1 + i32.shl + i32.const 1 + i32.or + end + call $~lib/map/Map#rehash + end + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.load $0 offset=8 + local.tee $0 + i32.store $0 + local.get $4 + local.get $4 + i32.load $0 offset=16 + local.tee $6 + i32.const 1 + i32.add + i32.store $0 offset=16 + local.get $0 + local.get $6 + i32.const 12 + i32.mul + i32.add + local.tee $0 + local.get $1 + i32.store $0 + local.get $0 + local.get $3 + i32.store $0 offset=4 + local.get $4 + local.get $4 + i32.load $0 offset=20 + i32.const 1 + i32.add + i32.store $0 offset=20 + local.get $0 + local.get $4 + i32.load $0 + local.get $5 + local.get $4 + i32.load $0 offset=4 + i32.and + i32.const 2 + i32.shl + i32.add + local.tee $4 + i32.load $0 + i32.store $0 offset=8 + local.get $4 + local.get $0 + i32.store $0 + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + local.get $1 + i32.store $0 + local.get $2 + local.get $3 + i32.store $0 offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + return + end + i32.const 34704 + i32.const 34752 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $~lib/weakref/WeakRef#deref (type $i32_=>_i32) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1912 + i32.lt_s + if + i32.const 34704 + i32.const 34752 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 0 + i32.store $0 + local.get $0 + i32.load $0 + local.set $2 + local.get $1 + global.get $~lib/weakref/ALL_REFERENCES + local.tee $1 + i32.store $0 + local.get $1 + i32.load $0 + local.get $1 + i32.load $0 offset=4 + local.get $2 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $1 + local.get $1 + i32.const 15 + i32.shr_u + i32.xor + i32.const -2048144777 + i32.mul + local.tee $1 + local.get $1 + i32.const 13 + i32.shr_u + i32.xor + i32.const -1028477379 + i32.mul + local.tee $1 + local.get $1 + i32.const 16 + i32.shr_u + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $1 + block $__inlined_func$~lib/map/Map#find + loop $while-continue|0 + local.get $1 + if + local.get $1 + i32.load $0 offset=8 + local.tee $3 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $2 + local.get $1 + i32.load $0 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find + local.get $3 + i32.const -2 + i32.and + local.set $1 + br $while-continue|0 + end + end + i32.const 0 + local.set $1 + end + local.get $1 + if (result i32) + global.get $~lib/memory/__stack_pointer + global.get $~lib/weakref/ALL_REFERENCES + local.tee $1 + i32.store $0 + local.get $1 + i32.load $0 + local.get $1 + i32.load $0 offset=4 + local.get $2 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $1 + local.get $1 + i32.const 15 + i32.shr_u + i32.xor + i32.const -2048144777 + i32.mul + local.tee $1 + local.get $1 + i32.const 13 + i32.shr_u + i32.xor + i32.const -1028477379 + i32.mul + local.tee $1 + local.get $1 + i32.const 16 + i32.shr_u + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $1 + block $__inlined_func$~lib/map/Map#find2 + loop $while-continue|08 + local.get $1 + if + local.get $1 + i32.load $0 offset=8 + local.tee $3 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $2 + local.get $1 + i32.load $0 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find2 + local.get $3 + i32.const -2 + i32.and + local.set $1 + br $while-continue|08 + end + end + i32.const 0 + local.set $1 + end + local.get $1 + i32.eqz + if + i32.const 1600 + i32.const 1664 + i32.const 105 + i32.const 17 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load $0 offset=4 + local.get $0 + i32.load $0 offset=4 + i32.eq + else + i32.const 0 + end + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + else + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 0 + local.set $2 + end + local.get $2 + ) + (func $~lib/arraybuffer/ArrayBuffer#constructor (type $i32_=>_i32) (param $0 i32) (result i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1912 + i32.lt_s + if + i32.const 34704 + i32.const 34752 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $0 + i32.const 1073741820 + i32.gt_u + if + i32.const 1456 + i32.const 1504 + i32.const 52 + i32.const 43 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store $0 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $std/weakref/Dummy#constructor (type $none_=>_i32) (result i32) + (local $0 i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 1912 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $0 + i32.const 0 + i32.store $0 + local.get $0 + i32.const 0 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store $0 + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1912 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 0 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store $0 + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + local.get $0 + i32.store $0 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + return + end + i32.const 34704 + i32.const 34752 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $byn-split-outlined-A$~lib/rt/itcms/__visit (type $i32_=>_none) (param $0 i32) + global.get $~lib/rt/itcms/white + local.get $0 + i32.const 20 + i32.sub + local.tee $0 + i32.load $0 offset=4 + i32.const 3 + i32.and + i32.eq + if + local.get $0 + call $~lib/rt/itcms/Object#makeGray + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.add + global.set $~lib/rt/itcms/visitCount + end + ) + (func $byn-split-outlined-A$~lib/rt/itcms/__link (type $i32_i32_i32_=>_none) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + local.get $0 + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 295 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/rt/itcms/white + local.get $1 + i32.const 20 + i32.sub + local.tee $1 + i32.load $0 offset=4 + i32.const 3 + i32.and + i32.eq + if + local.get $0 + i32.const 20 + i32.sub + local.tee $0 + i32.load $0 offset=4 + i32.const 3 + i32.and + local.tee $3 + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + if + local.get $0 + local.get $1 + local.get $2 + select + call $~lib/rt/itcms/Object#makeGray + else + global.get $~lib/rt/itcms/state + i32.const 1 + i32.eq + local.get $3 + i32.const 3 + i32.eq + i32.and + if + local.get $1 + call $~lib/rt/itcms/Object#makeGray + end + end + end + ) +) diff --git a/tests/compiler/std/weakref.ts b/tests/compiler/std/weakref.ts new file mode 100644 index 0000000000..f82f1efd93 --- /dev/null +++ b/tests/compiler/std/weakref.ts @@ -0,0 +1,33 @@ +class Dummy {} + +function produceDummy(): WeakRef { + // Dummy must be created inside a function or the shadow stack of the root + // function will keep it alive + return new WeakRef(new Dummy()); +} + +const weakref = produceDummy(); +assert(weakref.deref() !== null); +__collect(); +assert(weakref.deref() === null); + +// Test releasing reference + +const globalRefs: Dummy[] = []; + +function makeDummy(): WeakRef { + const instance = new Dummy(); + globalRefs.push(instance); + return new WeakRef(instance); +} + +const weakref2 = makeDummy(); +assert(weakref2.deref() !== null); + +// No effect since globalRefs is holding dummy +__collect(); +assert(weakref2.deref() !== null); + +globalRefs.length = 0; +__collect(); +assert(weakref2.deref() === null); From 00098a8a3c6e94ed1c424ffe3ad7962ab23fee57 Mon Sep 17 00:00:00 2001 From: Bach Le Date: Tue, 20 Dec 2022 22:40:19 +0800 Subject: [PATCH 03/14] Implement FinalizationRegistry and reimplement WeakRef using it --- std/assembly/finalizationregistry.ts | 67 + std/assembly/index.d.ts | 6 + std/assembly/weakref.ts | 30 +- .../bindings/noExportRuntime.debug.wat | 11 +- tests/compiler/std/weakref.debug.wat | 1402 ++++++++++-- tests/compiler/std/weakref.release.wat | 1971 ++++++++++------- 6 files changed, 2474 insertions(+), 1013 deletions(-) create mode 100644 std/assembly/finalizationregistry.ts diff --git a/std/assembly/finalizationregistry.ts b/std/assembly/finalizationregistry.ts new file mode 100644 index 0000000000..f5cc855abd --- /dev/null +++ b/std/assembly/finalizationregistry.ts @@ -0,0 +1,67 @@ +// @ts-ignore: decorators +@lazy +let CURRENT_COOKIE: u32 = 0; + +// @ts-ignore: decorators +@lazy +let PREVIOUS_FINALIZER: i32 = 0; + +// @ts-ignore: decorators +@lazy +let INITIALIZED: boolean = false; + +// @ts-ignore: decorators +@lazy +let ALL_REGISTRIES: BaseRegistry | null = null; + +abstract class BaseRegistry { + private next: BaseRegistry | null; + + constructor() { + this.next = ALL_REGISTRIES; + ALL_REGISTRIES = this; + } + + static finalizeAll(ptr: usize): void { + for (let i = ALL_REGISTRIES; i !== null; i = i.next) { + i.finalize(ptr); + } + + if (PREVIOUS_FINALIZER) { + call_indirect(PREVIOUS_FINALIZER, ptr); + } + } + + protected abstract finalize(ptr: usize): void; +} + +export class FinalizationRegistry extends BaseRegistry { + private entries: Map = new Map(); + + constructor(private finalizer: (heldValue: T) => void) { + super(); + + if (!INITIALIZED) { + PREVIOUS_FINALIZER = __finalize; + __finalize = BaseRegistry.finalizeAll.index; + INITIALIZED = true; + } + } + + register(key: U, value: T): void { + this.entries.set(changetype(key), value); + } + + unregister(key: U): bool { + return this.entries.delete(changetype(key)); + } + + protected finalize(ptr: usize): void { + if (this.entries.has(ptr)) { + const value = this.entries.get(ptr); + this.entries.delete(ptr); + + this.finalizer(value); + } + } +} diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index ac30cf518f..b7c363f48e 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -2058,6 +2058,12 @@ declare class WeakRef { deref(): T | null; } +declare class FinalizationRegistry { + constructor(finalizer: (heldValue: T) => void); + register(key: U, value: T): void; + unregister(key: U): bool; +} + interface SymbolConstructor { readonly hasInstance: symbol; readonly isConcatSpreadable: symbol; diff --git a/std/assembly/weakref.ts b/std/assembly/weakref.ts index 861d2f11ad..e9ae820e55 100644 --- a/std/assembly/weakref.ts +++ b/std/assembly/weakref.ts @@ -8,11 +8,14 @@ let CURRENT_COOKIE: u32 = 0; // @ts-ignore: decorators @lazy -let PREVIOUS_FINALIZER: i32 = 0; - -// @ts-ignore: decorators -@lazy -let INITIALIZED: boolean = false; +const REGISTRY: FinalizationRegistry = new FinalizationRegistry( + (ptr: usize) => { + if (ALL_REFERENCES.delete(ptr)) { + // The memory block could be reused by the allocator after this point + ++CURRENT_COOKIE; + } + } +); export class WeakRef { private ref: usize; @@ -21,15 +24,10 @@ export class WeakRef { constructor(value: T) { assert(isReference() && !isNullable()); - if (!INITIALIZED) { - PREVIOUS_FINALIZER = __finalize; - __finalize = WeakRef.finalize.index; - INITIALIZED = true; - } - const ref = changetype(value); const cookie = CURRENT_COOKIE; ALL_REFERENCES.set(ref, cookie); + REGISTRY.register(ref, ref); this.ref = ref; this.cookie = cookie; @@ -43,14 +41,4 @@ export class WeakRef { return null; } } - - static finalize(ptr: usize): void { - if (ALL_REFERENCES.delete(ptr)) { - ++CURRENT_COOKIE; - } - - if (PREVIOUS_FINALIZER) { - call_indirect(PREVIOUS_FINALIZER, ptr); - } - } } diff --git a/tests/compiler/bindings/noExportRuntime.debug.wat b/tests/compiler/bindings/noExportRuntime.debug.wat index d84e74bc7e..9c2bc38404 100644 --- a/tests/compiler/bindings/noExportRuntime.debug.wat +++ b/tests/compiler/bindings/noExportRuntime.debug.wat @@ -22,6 +22,7 @@ (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/rt/__finalize (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~lib/native/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) @@ -1433,8 +1434,14 @@ call $~lib/rt/itcms/Object#get:size i32.sub global.set $~lib/rt/itcms/total - i32.const 0 - drop + global.get $~lib/rt/__finalize + if + local.get $obj + i32.const 20 + i32.add + global.get $~lib/rt/__finalize + call_indirect $0 (type $i32_=>_none) + end local.get $obj i32.const 4 i32.add diff --git a/tests/compiler/std/weakref.debug.wat b/tests/compiler/std/weakref.debug.wat index 9e1448b2b1..a6dadd43ae 100644 --- a/tests/compiler/std/weakref.debug.wat +++ b/tests/compiler/std/weakref.debug.wat @@ -1,17 +1,15 @@ (module - (type $i32_=>_i32 (func_subtype (param i32) (result i32) func)) (type $i32_i32_=>_none (func_subtype (param i32 i32) func)) - (type $i32_=>_none (func_subtype (param i32) func)) + (type $i32_=>_i32 (func_subtype (param i32) (result i32) func)) (type $i32_i32_=>_i32 (func_subtype (param i32 i32) (result i32) func)) + (type $i32_=>_none (func_subtype (param i32) func)) (type $none_=>_none (func_subtype func)) - (type $i32_i32_i32_=>_none (func_subtype (param i32 i32 i32) func)) (type $i32_i32_i32_=>_i32 (func_subtype (param i32 i32 i32) (result i32) func)) + (type $i32_i32_i32_=>_none (func_subtype (param i32 i32 i32) func)) (type $none_=>_i32 (func_subtype (result i32) func)) (type $i32_i32_i32_i32_=>_none (func_subtype (param i32 i32 i32 i32) func)) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (global $~lib/weakref/INITIALIZED (mut i32) (i32.const 0)) - (global $~lib/weakref/PREVIOUS_FINALIZER (mut i32) (i32.const 0)) - (global $~lib/rt/__finalize (mut i32) (i32.const 0)) + (global $~lib/weakref/CURRENT_COOKIE (mut i32) (i32.const 0)) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -23,19 +21,24 @@ (global $~lib/shared/runtime/Runtime.Stub i32 (i32.const 0)) (global $~lib/shared/runtime/Runtime.Minimal i32 (i32.const 1)) (global $~lib/shared/runtime/Runtime.Incremental i32 (i32.const 2)) + (global $~lib/rt/__finalize (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~lib/native/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/native/ASC_RUNTIME i32 (i32.const 2)) (global $~lib/weakref/ALL_REFERENCES (mut i32) (i32.const 0)) - (global $~lib/weakref/CURRENT_COOKIE (mut i32) (i32.const 0)) + (global $~lib/finalizationregistry/ALL_REGISTRIES (mut i32) (i32.const 0)) + (global $~lib/finalizationregistry/INITIALIZED (mut i32) (i32.const 0)) + (global $~lib/finalizationregistry/PREVIOUS_FINALIZER (mut i32) (i32.const 0)) + (global $~lib/weakref/REGISTRY (mut i32) (i32.const 0)) (global $std/weakref/weakref (mut i32) (i32.const 0)) - (global $std/weakref/globalRefs i32 (i32.const 768)) + (global $std/weakref/globalRefs i32 (i32.const 800)) (global $std/weakref/weakref2 (mut i32) (i32.const 0)) - (global $~lib/rt/__rtti_base i32 (i32.const 848)) - (global $~lib/memory/__data_end i32 (i32.const 888)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 33656)) - (global $~lib/memory/__heap_base i32 (i32.const 33656)) + (global $~argumentsLength (mut i32) (i32.const 0)) + (global $~lib/rt/__rtti_base i32 (i32.const 880)) + (global $~lib/memory/__data_end i32 (i32.const 932)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 33700)) + (global $~lib/memory/__heap_base i32 (i32.const 33700)) (memory $0 1) (data (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") (data (i32.const 76) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") @@ -47,16 +50,17 @@ (data (i32.const 348) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 412) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1c\00\00\00I\00n\00v\00a\00l\00i\00d\00 \00l\00e\00n\00g\00t\00h\00") (data (i32.const 460) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00&\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00\00\00\00\00\00\00") - (data (i32.const 524) "\1c\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\08\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 556) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\00K\00e\00y\00 \00d\00o\00e\00s\00 \00n\00o\00t\00 \00e\00x\00i\00s\00t\00\00\00\00\00\00\00\00\00") - (data (i32.const 620) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\00~\00l\00i\00b\00/\00m\00a\00p\00.\00t\00s\00\00\00\00\00\00\00") - (data (i32.const 668) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1c\00\00\00s\00t\00d\00/\00w\00e\00a\00k\00r\00e\00f\00.\00t\00s\00") - (data (i32.const 716) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 748) ",\00\00\00\00\00\00\00\00\00\00\00\08\00\00\00\10\00\00\00\e0\02\00\00\e0\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 796) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") - (data (i32.const 848) "\t\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00\00\00\00\00\10\01\02\00\02A\00\00") - (table $0 2 2 funcref) - (elem $0 (i32.const 1) $~lib/weakref/WeakRef.finalize) + (data (i32.const 524) "\1c\00\00\00\00\00\00\00\00\00\00\00\n\00\00\00\08\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 556) "\1c\00\00\00\00\00\00\00\00\00\00\00\n\00\00\00\08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 588) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\00K\00e\00y\00 \00d\00o\00e\00s\00 \00n\00o\00t\00 \00e\00x\00i\00s\00t\00\00\00\00\00\00\00\00\00") + (data (i32.const 652) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\00~\00l\00i\00b\00/\00m\00a\00p\00.\00t\00s\00\00\00\00\00\00\00") + (data (i32.const 700) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1c\00\00\00s\00t\00d\00/\00w\00e\00a\00k\00r\00e\00f\00.\00t\00s\00") + (data (i32.const 748) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 780) ",\00\00\00\00\00\00\00\00\00\00\00\0b\00\00\00\10\00\00\00\00\03\00\00\00\03\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 828) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") + (data (i32.const 880) "\0c\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00\10\01\02\00\00\00\00\00\00\00\00\00\10\01\02\00\00\00\00\00\02A\00\00") + (table $0 3 3 funcref) + (elem $0 (i32.const 1) $~lib/finalizationregistry/BaseRegistry.finalizeAll $start:~lib/weakref~anonymous|0) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/Object#set:nextWithColor (type $i32_i32_=>_none) (param $this i32) (param $nextWithColor i32) @@ -2496,26 +2500,26 @@ i32.const 0 return ) - (func $~lib/map/MapEntry#set:taggedNext (type $i32_i32_=>_none) (param $this i32) (param $taggedNext i32) + (func $~lib/map/MapEntry#set:value (type $i32_i32_=>_none) (param $this i32) (param $value i32) local.get $this - local.get $taggedNext - i32.store $0 offset=8 + local.get $value + i32.store $0 offset=4 ) - (func $~lib/map/Map#get:entriesCount (type $i32_=>_i32) (param $this i32) (result i32) + (func $~lib/map/Map#get:entriesOffset (type $i32_=>_i32) (param $this i32) (result i32) local.get $this - i32.load $0 offset=20 + i32.load $0 offset=16 ) (func $~lib/map/Map#get:entriesCapacity (type $i32_=>_i32) (param $this i32) (result i32) local.get $this i32.load $0 offset=12 ) - (func $~lib/map/Map#get:entries (type $i32_=>_i32) (param $this i32) (result i32) + (func $~lib/map/Map#get:entriesCount (type $i32_=>_i32) (param $this i32) (result i32) local.get $this - i32.load $0 offset=8 + i32.load $0 offset=20 ) - (func $~lib/map/Map#get:entriesOffset (type $i32_=>_i32) (param $this i32) (result i32) + (func $~lib/map/Map#get:entries (type $i32_=>_i32) (param $this i32) (result i32) local.get $this - i32.load $0 offset=16 + i32.load $0 offset=8 ) (func $~lib/map/MapEntry#set:key (type $i32_i32_=>_none) (param $this i32) (param $key i32) local.get $this @@ -2526,10 +2530,10 @@ local.get $this i32.load $0 offset=4 ) - (func $~lib/map/MapEntry#set:value (type $i32_i32_=>_none) (param $this i32) (param $value i32) + (func $~lib/map/MapEntry#set:taggedNext (type $i32_i32_=>_none) (param $this i32) (param $taggedNext i32) local.get $this - local.get $value - i32.store $0 offset=4 + local.get $taggedNext + i32.store $0 offset=8 ) (func $~lib/map/Map#rehash (type $i32_i32_=>_none) (param $this i32) (param $newBucketsMask i32) (local $newBucketsCapacity i32) @@ -2678,6 +2682,124 @@ i32.add global.set $~lib/memory/__stack_pointer ) + (func $~lib/finalizationregistry/BaseRegistry#set:next (type $i32_i32_=>_none) (param $this i32) (param $next i32) + local.get $this + local.get $next + i32.store $0 + local.get $this + local.get $next + i32.const 0 + call $~lib/rt/itcms/__link + ) + (func $~lib/finalizationregistry/BaseRegistry#finalize (type $i32_i32_=>_none) (param $this i32) (param $ptr i32) + unreachable + ) + (func $~lib/finalizationregistry/BaseRegistry#get:next (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + ) + (func $~lib/finalizationregistry/BaseRegistry.finalizeAll (type $i32_=>_none) (param $ptr i32) + (local $i i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + global.get $~lib/memory/__stack_pointer + global.get $~lib/finalizationregistry/ALL_REGISTRIES + local.tee $i + i32.store $0 + loop $for-loop|0 + local.get $i + i32.const 0 + i32.ne + if + local.get $i + local.get $ptr + call $~lib/finalizationregistry/BaseRegistry#finalize@override + global.get $~lib/memory/__stack_pointer + local.get $i + call $~lib/finalizationregistry/BaseRegistry#get:next + local.tee $i + i32.store $0 + br $for-loop|0 + end + end + global.get $~lib/finalizationregistry/PREVIOUS_FINALIZER + if + local.get $ptr + global.get $~lib/finalizationregistry/PREVIOUS_FINALIZER + call_indirect $0 (type $i32_=>_none) + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/function/Function<%28usize%29=>void>#get:index (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + return + ) + (func $~lib/finalizationregistry/FinalizationRegistry#set:finalizer (type $i32_i32_=>_none) (param $this i32) (param $finalizer i32) + local.get $this + local.get $finalizer + i32.store $0 offset=8 + local.get $this + local.get $finalizer + i32.const 0 + call $~lib/rt/itcms/__link + ) + (func $~lib/map/Map#set:buckets (type $i32_i32_=>_none) (param $this i32) (param $buckets i32) + local.get $this + local.get $buckets + i32.store $0 + local.get $this + local.get $buckets + i32.const 0 + call $~lib/rt/itcms/__link + ) + (func $~lib/map/Map#set:bucketsMask (type $i32_i32_=>_none) (param $this i32) (param $bucketsMask i32) + local.get $this + local.get $bucketsMask + i32.store $0 offset=4 + ) + (func $~lib/map/Map#set:entries (type $i32_i32_=>_none) (param $this i32) (param $entries i32) + local.get $this + local.get $entries + i32.store $0 offset=8 + local.get $this + local.get $entries + i32.const 0 + call $~lib/rt/itcms/__link + ) + (func $~lib/map/Map#set:entriesCapacity (type $i32_i32_=>_none) (param $this i32) (param $entriesCapacity i32) + local.get $this + local.get $entriesCapacity + i32.store $0 offset=12 + ) + (func $~lib/map/Map#set:entriesOffset (type $i32_i32_=>_none) (param $this i32) (param $entriesOffset i32) + local.get $this + local.get $entriesOffset + i32.store $0 offset=16 + ) + (func $~lib/map/Map#set:entriesCount (type $i32_i32_=>_none) (param $this i32) (param $entriesCount i32) + local.get $this + local.get $entriesCount + i32.store $0 offset=20 + ) + (func $~lib/finalizationregistry/FinalizationRegistry#set:entries (type $i32_i32_=>_none) (param $this i32) (param $entries i32) + local.get $this + local.get $entries + i32.store $0 offset=4 + local.get $this + local.get $entries + i32.const 0 + call $~lib/rt/itcms/__link + ) (func $~lib/map/Map#delete (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) (local $entry i32) (local $halfBucketsMask i32) @@ -2746,120 +2868,365 @@ i32.const 1 return ) - (func $~lib/function/Function<%28usize%29=>void>#get:index (type $i32_=>_i32) (param $this i32) (result i32) + (func $~lib/finalizationregistry/FinalizationRegistry#get:entries (type $i32_=>_i32) (param $this i32) (result i32) local.get $this - i32.load $0 - return + i32.load $0 offset=4 ) - (func $~lib/weakref/WeakRef#set:ref (type $i32_i32_=>_none) (param $this i32) (param $ref i32) + (func $~lib/map/Map#get:buckets (type $i32_=>_i32) (param $this i32) (result i32) local.get $this - local.get $ref - i32.store $0 + i32.load $0 ) - (func $~lib/weakref/WeakRef#set:cookie (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) + (func $~lib/map/Map#get:bucketsMask (type $i32_=>_i32) (param $this i32) (result i32) local.get $this - local.get $cookie - i32.store $0 offset=4 + i32.load $0 offset=4 ) - (func $~lib/weakref/WeakRef#get:ref (type $i32_=>_i32) (param $this i32) (result i32) + (func $~lib/map/MapEntry#get:taggedNext (type $i32_=>_i32) (param $this i32) (result i32) local.get $this - i32.load $0 + i32.load $0 offset=8 ) - (func $~lib/map/Map#has (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + (func $~lib/map/MapEntry#get:key (type $i32_=>_i32) (param $this i32) (result i32) local.get $this - local.get $key - local.get $key - call $~lib/util/hash/HASH - call $~lib/map/Map#find - i32.const 0 - i32.ne - return + i32.load $0 ) - (func $~lib/map/Map#get (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + (func $~lib/map/Map#find (type $i32_i32_i32_=>_i32) (param $this i32) (param $key i32) (param $hashCode i32) (result i32) (local $entry i32) + (local $taggedNext i32) local.get $this - local.get $key - local.get $key - call $~lib/util/hash/HASH - call $~lib/map/Map#find - local.set $entry - local.get $entry - i32.eqz - if - i32.const 576 - i32.const 640 - i32.const 105 - i32.const 17 - call $~lib/builtins/abort - unreachable - end - local.get $entry - call $~lib/map/MapEntry#get:value - return - ) - (func $~lib/weakref/WeakRef#get:cookie (type $i32_=>_i32) (param $this i32) (result i32) + call $~lib/map/Map#get:buckets + local.get $hashCode local.get $this - i32.load $0 offset=4 - ) - (func $~lib/rt/itcms/__collect (type $none_=>_none) - i32.const 0 - drop - global.get $~lib/rt/itcms/state - i32.const 0 - i32.gt_s - if - loop $while-continue|0 - global.get $~lib/rt/itcms/state - i32.const 0 - i32.ne + call $~lib/map/Map#get:bucketsMask + i32.and + i32.const 4 + i32.mul + i32.add + i32.load $0 + local.set $entry + loop $while-continue|0 + local.get $entry + if + local.get $entry + call $~lib/map/MapEntry#get:taggedNext + local.set $taggedNext + local.get $taggedNext + i32.const 1 + i32.and + i32.eqz + if (result i32) + local.get $entry + call $~lib/map/MapEntry#get:key + local.get $key + i32.eq + else + i32.const 0 + end if - call $~lib/rt/itcms/step - drop - br $while-continue|0 + local.get $entry + return end + local.get $taggedNext + i32.const 1 + i32.const -1 + i32.xor + i32.and + local.set $entry + br $while-continue|0 end end - call $~lib/rt/itcms/step - drop - loop $while-continue|1 - global.get $~lib/rt/itcms/state - i32.const 0 - i32.ne - if - call $~lib/rt/itcms/step - drop - br $while-continue|1 - end - end - global.get $~lib/rt/itcms/total - i64.extend_i32_u - i32.const 200 - i64.extend_i32_u - i64.mul - i64.const 100 - i64.div_u - i32.wrap_i64 - i32.const 1024 - i32.add - global.set $~lib/rt/itcms/threshold - i32.const 0 - drop i32.const 0 - drop + return ) - (func $~lib/array/Array#get:length_ (type $i32_=>_i32) (param $this i32) (result i32) + (func $~lib/map/MapEntry#set:value (type $i32_i32_=>_none) (param $this i32) (param $value i32) local.get $this - i32.load $0 offset=12 + local.get $value + i32.store $0 offset=4 ) - (func $~lib/arraybuffer/ArrayBufferView#get:byteLength (type $i32_=>_i32) (param $this i32) (result i32) + (func $~lib/map/Map#get:entriesOffset (type $i32_=>_i32) (param $this i32) (result i32) local.get $this - i32.load $0 offset=8 + i32.load $0 offset=16 ) - (func $~lib/arraybuffer/ArrayBufferView#get:buffer (type $i32_=>_i32) (param $this i32) (result i32) + (func $~lib/map/Map#get:entriesCapacity (type $i32_=>_i32) (param $this i32) (result i32) local.get $this - i32.load $0 + i32.load $0 offset=12 ) - (func $~lib/rt/itcms/Object#get:rtSize (type $i32_=>_i32) (param $this i32) (result i32) + (func $~lib/map/Map#get:entriesCount (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=20 + ) + (func $~lib/map/Map#get:entries (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=8 + ) + (func $~lib/map/MapEntry#set:key (type $i32_i32_=>_none) (param $this i32) (param $key i32) + local.get $this + local.get $key + i32.store $0 + ) + (func $~lib/map/MapEntry#get:value (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) + (func $~lib/map/MapEntry#set:taggedNext (type $i32_i32_=>_none) (param $this i32) (param $taggedNext i32) + local.get $this + local.get $taggedNext + i32.store $0 offset=8 + ) + (func $~lib/map/Map#rehash (type $i32_i32_=>_none) (param $this i32) (param $newBucketsMask i32) + (local $newBucketsCapacity i32) + (local $newBuckets i32) + (local $newEntriesCapacity i32) + (local $newEntries i32) + (local $oldPtr i32) + (local $oldEnd i32) + (local $newPtr i32) + (local $oldEntry i32) + (local $newEntry i32) + (local $oldEntryKey i32) + (local $newBucketIndex i32) + (local $newBucketPtrBase i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store $0 + local.get $newBucketsMask + i32.const 1 + i32.add + local.set $newBucketsCapacity + global.get $~lib/memory/__stack_pointer + i32.const 0 + local.get $newBucketsCapacity + i32.const 4 + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor + local.tee $newBuckets + i32.store $0 + local.get $newBucketsCapacity + i32.const 8 + i32.mul + i32.const 3 + i32.div_s + local.set $newEntriesCapacity + global.get $~lib/memory/__stack_pointer + i32.const 0 + local.get $newEntriesCapacity + block $~lib/map/ENTRY_SIZE|inlined.1 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE|inlined.1 + end + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor + local.tee $newEntries + i32.store $0 offset=4 + local.get $this + call $~lib/map/Map#get:entries + local.set $oldPtr + local.get $oldPtr + local.get $this + call $~lib/map/Map#get:entriesOffset + block $~lib/map/ENTRY_SIZE|inlined.2 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE|inlined.2 + end + i32.mul + i32.add + local.set $oldEnd + local.get $newEntries + local.set $newPtr + loop $while-continue|0 + local.get $oldPtr + local.get $oldEnd + i32.ne + if + local.get $oldPtr + local.set $oldEntry + local.get $oldEntry + call $~lib/map/MapEntry#get:taggedNext + i32.const 1 + i32.and + i32.eqz + if + local.get $newPtr + local.set $newEntry + local.get $oldEntry + call $~lib/map/MapEntry#get:key + local.set $oldEntryKey + local.get $newEntry + local.get $oldEntryKey + call $~lib/map/MapEntry#set:key + local.get $newEntry + local.get $oldEntry + call $~lib/map/MapEntry#get:value + call $~lib/map/MapEntry#set:value + local.get $oldEntryKey + call $~lib/util/hash/HASH + local.get $newBucketsMask + i32.and + local.set $newBucketIndex + local.get $newBuckets + local.get $newBucketIndex + i32.const 4 + i32.mul + i32.add + local.set $newBucketPtrBase + local.get $newEntry + local.get $newBucketPtrBase + i32.load $0 + call $~lib/map/MapEntry#set:taggedNext + local.get $newBucketPtrBase + local.get $newPtr + i32.store $0 + local.get $newPtr + block $~lib/map/ENTRY_SIZE|inlined.3 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE|inlined.3 + end + i32.add + local.set $newPtr + end + local.get $oldPtr + block $~lib/map/ENTRY_SIZE|inlined.4 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE|inlined.4 + end + i32.add + local.set $oldPtr + br $while-continue|0 + end + end + local.get $this + local.get $newBuckets + call $~lib/map/Map#set:buckets + local.get $this + local.get $newBucketsMask + call $~lib/map/Map#set:bucketsMask + local.get $this + local.get $newEntries + call $~lib/map/Map#set:entries + local.get $this + local.get $newEntriesCapacity + call $~lib/map/Map#set:entriesCapacity + local.get $this + local.get $this + call $~lib/map/Map#get:entriesCount + call $~lib/map/Map#set:entriesOffset + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/weakref/WeakRef#set:ref (type $i32_i32_=>_none) (param $this i32) (param $ref i32) + local.get $this + local.get $ref + i32.store $0 + ) + (func $~lib/weakref/WeakRef#set:cookie (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) + local.get $this + local.get $cookie + i32.store $0 offset=4 + ) + (func $~lib/weakref/WeakRef#get:ref (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + ) + (func $~lib/map/Map#has (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + local.get $this + local.get $key + local.get $key + call $~lib/util/hash/HASH + call $~lib/map/Map#find + i32.const 0 + i32.ne + return + ) + (func $~lib/map/Map#get (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + (local $entry i32) + local.get $this + local.get $key + local.get $key + call $~lib/util/hash/HASH + call $~lib/map/Map#find + local.set $entry + local.get $entry + i32.eqz + if + i32.const 608 + i32.const 672 + i32.const 105 + i32.const 17 + call $~lib/builtins/abort + unreachable + end + local.get $entry + call $~lib/map/MapEntry#get:value + return + ) + (func $~lib/weakref/WeakRef#get:cookie (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) + (func $~lib/rt/itcms/__collect (type $none_=>_none) + i32.const 0 + drop + global.get $~lib/rt/itcms/state + i32.const 0 + i32.gt_s + if + loop $while-continue|0 + global.get $~lib/rt/itcms/state + i32.const 0 + i32.ne + if + call $~lib/rt/itcms/step + drop + br $while-continue|0 + end + end + end + call $~lib/rt/itcms/step + drop + loop $while-continue|1 + global.get $~lib/rt/itcms/state + i32.const 0 + i32.ne + if + call $~lib/rt/itcms/step + drop + br $while-continue|1 + end + end + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i32.const 200 + i64.extend_i32_u + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + i32.const 0 + drop + ) + (func $~lib/array/Array#get:length_ (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=12 + ) + (func $~lib/arraybuffer/ArrayBufferView#get:byteLength (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=8 + ) + (func $~lib/arraybuffer/ArrayBufferView#get:buffer (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + ) + (func $~lib/rt/itcms/Object#get:rtSize (type $i32_=>_i32) (param $this i32) (result i32) local.get $this i32.load $0 offset=16 ) @@ -2936,7 +3303,7 @@ i32.gt_u if i32.const 432 - i32.const 816 + i32.const 848 i32.const 19 i32.const 48 call $~lib/builtins/abort @@ -3042,25 +3409,158 @@ local.get $this local.get $value i32.const 1 - call $~lib/rt/itcms/__link - local.get $this - local.get $len - call $~lib/array/Array#set:length_ - local.get $len + call $~lib/rt/itcms/__link + local.get $this + local.get $len + call $~lib/array/Array#set:length_ + local.get $len + return + ) + (func $~lib/array/Array#set:length (type $i32_i32_=>_none) (param $this i32) (param $newLength i32) + local.get $this + local.get $newLength + i32.const 2 + i32.const 0 + call $~lib/array/ensureCapacity + local.get $this + local.get $newLength + call $~lib/array/Array#set:length_ + ) + (func $~lib/map/Map#has (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + local.get $this + local.get $key + local.get $key + call $~lib/util/hash/HASH + call $~lib/map/Map#find + i32.const 0 + i32.ne + return + ) + (func $~lib/map/Map#get (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + (local $entry i32) + local.get $this + local.get $key + local.get $key + call $~lib/util/hash/HASH + call $~lib/map/Map#find + local.set $entry + local.get $entry + i32.eqz + if + i32.const 608 + i32.const 672 + i32.const 105 + i32.const 17 + call $~lib/builtins/abort + unreachable + end + local.get $entry + call $~lib/map/MapEntry#get:value + return + ) + (func $~lib/map/Map#delete (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + (local $entry i32) + (local $halfBucketsMask i32) + (local $4 i32) + (local $5 i32) + local.get $this + local.get $key + local.get $key + call $~lib/util/hash/HASH + call $~lib/map/Map#find + local.set $entry + local.get $entry + i32.eqz + if + i32.const 0 + return + end + local.get $entry + local.get $entry + call $~lib/map/MapEntry#get:taggedNext + i32.const 1 + i32.or + call $~lib/map/MapEntry#set:taggedNext + local.get $this + local.get $this + call $~lib/map/Map#get:entriesCount + i32.const 1 + i32.sub + call $~lib/map/Map#set:entriesCount + local.get $this + call $~lib/map/Map#get:bucketsMask + i32.const 1 + i32.shr_u + local.set $halfBucketsMask + local.get $halfBucketsMask + i32.const 1 + i32.add + i32.const 4 + local.tee $4 + local.get $this + call $~lib/map/Map#get:entriesCount + local.tee $5 + local.get $4 + local.get $5 + i32.gt_u + select + i32.ge_u + if (result i32) + local.get $this + call $~lib/map/Map#get:entriesCount + local.get $this + call $~lib/map/Map#get:entriesCapacity + i32.const 3 + i32.mul + i32.const 4 + i32.div_s + i32.lt_s + else + i32.const 0 + end + if + local.get $this + local.get $halfBucketsMask + call $~lib/map/Map#rehash + end + i32.const 1 return ) - (func $~lib/array/Array#set:length (type $i32_i32_=>_none) (param $this i32) (param $newLength i32) - local.get $this - local.get $newLength - i32.const 2 - i32.const 0 - call $~lib/array/ensureCapacity + (func $~lib/finalizationregistry/FinalizationRegistry#get:finalizer (type $i32_=>_i32) (param $this i32) (result i32) local.get $this - local.get $newLength - call $~lib/array/Array#set:length_ + i32.load $0 offset=8 + ) + (func $~lib/finalizationregistry/BaseRegistry#finalize@override (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (local $2 i32) + block $default + block $case0 + local.get $0 + i32.const 8 + i32.sub + i32.load $0 + local.set $2 + local.get $2 + i32.const 7 + i32.eq + br_if $case0 + br $default + end + local.get $0 + local.get $1 + call $~lib/finalizationregistry/FinalizationRegistry#finalize + return + end + unreachable ) (func $~lib/rt/__visit_globals (type $i32_=>_none) (param $0 i32) (local $1 i32) + global.get $~lib/finalizationregistry/ALL_REGISTRIES + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end global.get $~lib/weakref/ALL_REFERENCES local.tee $1 if @@ -3068,6 +3568,13 @@ local.get $0 call $~lib/rt/itcms/__visit end + global.get $~lib/weakref/REGISTRY + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end global.get $std/weakref/weakref local.tee $1 if @@ -3095,7 +3602,7 @@ i32.const 432 local.get $0 call $~lib/rt/itcms/__visit - i32.const 576 + i32.const 608 local.get $0 call $~lib/rt/itcms/__visit i32.const 32 @@ -3119,32 +3626,73 @@ (func $~lib/object/Object~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) nop ) - (func $~lib/function/Function<%28usize%29=>void>#get:_env (type $i32_=>_i32) (param $this i32) (result i32) + (func $~lib/map/Map#__visit (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) + (local $entries i32) local.get $this - i32.load $0 offset=4 - ) - (func $~lib/function/Function<%28usize%29=>void>#__visit (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) + call $~lib/map/Map#get:buckets + local.get $cookie + call $~lib/rt/itcms/__visit local.get $this - call $~lib/function/Function<%28usize%29=>void>#get:_env + call $~lib/map/Map#get:entries + local.set $entries + i32.const 0 + drop + local.get $entries local.get $cookie call $~lib/rt/itcms/__visit ) - (func $~lib/function/Function<%28usize%29=>void>~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (func $~lib/map/Map~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) local.get $0 local.get $1 call $~lib/object/Object~visit local.get $0 local.get $1 - call $~lib/function/Function<%28usize%29=>void>#__visit + call $~lib/map/Map#__visit ) - (func $~lib/map/Map#__visit (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) + (func $~lib/finalizationregistry/FinalizationRegistry~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + local.get $1 + call $~lib/finalizationregistry/BaseRegistry~visit + local.get $0 + i32.load $0 offset=4 + local.tee $2 + if + local.get $2 + local.get $1 + call $~lib/rt/itcms/__visit + end + local.get $0 + i32.load $0 offset=8 + local.tee $2 + if + local.get $2 + local.get $1 + call $~lib/rt/itcms/__visit + end + ) + (func $~lib/finalizationregistry/BaseRegistry~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + i32.load $0 + local.tee $2 + if + local.get $2 + local.get $1 + call $~lib/rt/itcms/__visit + end + ) + (func $~lib/map/Map#__visit (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) (local $entries i32) local.get $this - call $~lib/map/Map#get:buckets + call $~lib/map/Map#get:buckets local.get $cookie call $~lib/rt/itcms/__visit local.get $this - call $~lib/map/Map#get:entries + call $~lib/map/Map#get:entries local.set $entries i32.const 0 drop @@ -3152,13 +3700,31 @@ local.get $cookie call $~lib/rt/itcms/__visit ) - (func $~lib/map/Map~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (func $~lib/map/Map~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) local.get $0 local.get $1 call $~lib/object/Object~visit local.get $0 local.get $1 - call $~lib/map/Map#__visit + call $~lib/map/Map#__visit + ) + (func $~lib/function/Function<%28usize%29=>void>#get:_env (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) + (func $~lib/function/Function<%28usize%29=>void>#__visit (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) + local.get $this + call $~lib/function/Function<%28usize%29=>void>#get:_env + local.get $cookie + call $~lib/rt/itcms/__visit + ) + (func $~lib/function/Function<%28usize%29=>void>~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + local.get $1 + call $~lib/function/Function<%28usize%29=>void>#__visit ) (func $~lib/array/Array#get:buffer (type $i32_=>_i32) (param $this i32) (result i32) local.get $this @@ -3217,20 +3783,32 @@ (func $~lib/rt/__visit_members (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) block $invalid block $~lib/array/Array - block $~lib/map/Map - block $~lib/function/Function<%28usize%29=>void> - block $~lib/weakref/WeakRef - block $std/weakref/Dummy - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - block $~lib/object/Object - local.get $0 - i32.const 8 - i32.sub - i32.load $0 - br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $std/weakref/Dummy $~lib/weakref/WeakRef $~lib/function/Function<%28usize%29=>void> $~lib/map/Map $~lib/array/Array $invalid + block $~lib/function/Function<%28usize%29=>void> + block $~lib/map/Map + block $~lib/finalizationregistry/BaseRegistry + block $~lib/finalizationregistry/FinalizationRegistry + block $~lib/map/Map + block $~lib/weakref/WeakRef + block $std/weakref/Dummy + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + block $~lib/object/Object + local.get $0 + i32.const 8 + i32.sub + i32.load $0 + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $std/weakref/Dummy $~lib/weakref/WeakRef $~lib/map/Map $~lib/finalizationregistry/FinalizationRegistry $~lib/finalizationregistry/BaseRegistry $~lib/map/Map $~lib/function/Function<%28usize%29=>void> $~lib/array/Array $invalid + end + return + end + return + end + return end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit return end return @@ -3239,21 +3817,27 @@ end local.get $0 local.get $1 - call $~lib/arraybuffer/ArrayBufferView~visit + call $~lib/map/Map~visit return end + local.get $0 + local.get $1 + call $~lib/finalizationregistry/FinalizationRegistry~visit return end + local.get $0 + local.get $1 + call $~lib/finalizationregistry/BaseRegistry~visit return end local.get $0 local.get $1 - call $~lib/function/Function<%28usize%29=>void>~visit + call $~lib/map/Map~visit return end local.get $0 local.get $1 - call $~lib/map/Map~visit + call $~lib/function/Function<%28usize%29=>void>~visit return end local.get $0 @@ -3271,8 +3855,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 33680 i32.const 33728 + i32.const 33776 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3294,7 +3878,7 @@ if global.get $~lib/memory/__stack_pointer i32.const 24 - i32.const 7 + i32.const 6 call $~lib/rt/itcms/__new local.tee $this i32.store $0 @@ -3321,34 +3905,208 @@ i32.const 4 block $~lib/map/ENTRY_SIZE|inlined.0 (result i32) i32.const 12 - br $~lib/map/ENTRY_SIZE|inlined.0 + br $~lib/map/ENTRY_SIZE|inlined.0 + end + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $1 + call $~lib/map/Map#set:entries + local.get $this + i32.const 4 + call $~lib/map/Map#set:entriesCapacity + local.get $this + i32.const 0 + call $~lib/map/Map#set:entriesOffset + local.get $this + i32.const 0 + call $~lib/map/Map#set:entriesCount + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $~lib/finalizationregistry/BaseRegistry#constructor (type $i32_=>_i32) (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store $0 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 8 + call $~lib/rt/itcms/__new + local.tee $this + i32.store $0 + end + local.get $this + i32.const 0 + call $~lib/finalizationregistry/BaseRegistry#set:next + local.get $this + global.get $~lib/finalizationregistry/ALL_REGISTRIES + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $1 + call $~lib/finalizationregistry/BaseRegistry#set:next + local.get $this + global.set $~lib/finalizationregistry/ALL_REGISTRIES + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $~lib/map/Map#constructor (type $i32_=>_i32) (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store $0 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.const 9 + call $~lib/rt/itcms/__new + local.tee $this + i32.store $0 + end + local.get $this + i32.const 0 + i32.const 4 + i32.const 4 + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $1 + call $~lib/map/Map#set:buckets + local.get $this + i32.const 4 + i32.const 1 + i32.sub + call $~lib/map/Map#set:bucketsMask + local.get $this + i32.const 0 + i32.const 4 + block $~lib/map/ENTRY_SIZE|inlined.0 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE|inlined.0 + end + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $1 + call $~lib/map/Map#set:entries + local.get $this + i32.const 4 + call $~lib/map/Map#set:entriesCapacity + local.get $this + i32.const 0 + call $~lib/map/Map#set:entriesOffset + local.get $this + i32.const 0 + call $~lib/map/Map#set:entriesCount + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $~lib/finalizationregistry/FinalizationRegistry#constructor (type $i32_i32_=>_i32) (param $this i32) (param $finalizer i32) (result i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store $0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 offset=8 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.const 7 + call $~lib/rt/itcms/__new + local.tee $this + i32.store $0 end - i32.mul - call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.store $0 offset=4 - local.get $1 - call $~lib/map/Map#set:entries local.get $this - i32.const 4 - call $~lib/map/Map#set:entriesCapacity + local.get $finalizer + call $~lib/finalizationregistry/FinalizationRegistry#set:finalizer local.get $this i32.const 0 - call $~lib/map/Map#set:entriesOffset + call $~lib/map/Map#constructor + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=4 + local.get $2 + call $~lib/finalizationregistry/FinalizationRegistry#set:entries + global.get $~lib/memory/__stack_pointer local.get $this - i32.const 0 - call $~lib/map/Map#set:entriesCount + call $~lib/finalizationregistry/BaseRegistry#constructor + local.tee $this + i32.store $0 + global.get $~lib/finalizationregistry/INITIALIZED + i32.eqz + if + global.get $~lib/rt/__finalize + global.set $~lib/finalizationregistry/PREVIOUS_FINALIZER + i32.const 544 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=8 + local.get $2 + call $~lib/function/Function<%28usize%29=>void>#get:index + global.set $~lib/rt/__finalize + i32.const 1 + global.set $~lib/finalizationregistry/INITIALIZED + end local.get $this - local.set $1 + local.set $2 global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 12 i32.add global.set $~lib/memory/__stack_pointer - local.get $1 + local.get $2 ) - (func $~lib/weakref/WeakRef.finalize (type $i32_=>_none) (param $ptr i32) + (func $start:~lib/weakref~anonymous|0 (type $i32_=>_none) (param $ptr i32) (local $1 i32) global.get $~lib/memory/__stack_pointer i32.const 4 @@ -3372,12 +4130,32 @@ i32.add global.set $~lib/weakref/CURRENT_COOKIE end - global.get $~lib/weakref/PREVIOUS_FINALIZER - if - local.get $ptr - global.get $~lib/weakref/PREVIOUS_FINALIZER - call_indirect $0 (type $i32_=>_none) - end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/finalizationregistry/FinalizationRegistry#register (type $i32_i32_i32_=>_none) (param $this i32) (param $key i32) (param $value i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $this + call $~lib/finalizationregistry/FinalizationRegistry#get:entries + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store $0 + local.get $3 + local.get $key + local.get $value + call $~lib/map/Map#set + drop global.get $~lib/memory/__stack_pointer i32.const 4 i32.add @@ -3414,22 +4192,6 @@ i32.const 0 i32.eqz drop - global.get $~lib/weakref/INITIALIZED - i32.eqz - if - global.get $~lib/rt/__finalize - global.set $~lib/weakref/PREVIOUS_FINALIZER - i32.const 544 - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store $0 offset=4 - local.get $4 - call $~lib/function/Function<%28usize%29=>void>#get:index - global.set $~lib/rt/__finalize - i32.const 1 - global.set $~lib/weakref/INITIALIZED - end local.get $value local.set $ref global.get $~lib/weakref/CURRENT_COOKIE @@ -3444,6 +4206,15 @@ local.get $cookie call $~lib/map/Map#set drop + global.get $~lib/weakref/REGISTRY + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store $0 offset=4 + local.get $4 + local.get $ref + local.get $ref + call $~lib/finalizationregistry/FinalizationRegistry#register local.get $this local.get $ref call $~lib/weakref/WeakRef#set:ref @@ -3584,13 +4355,13 @@ (local $1 i32) (local $2 i32) global.get $~lib/memory/__stack_pointer - i32.const 4 + i32.const 8 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store $0 + i64.const 0 + i64.store $0 memory.size $0 i32.const 16 i32.shl @@ -3611,13 +4382,22 @@ i32.const 0 call $~lib/map/Map#constructor global.set $~lib/weakref/ALL_REFERENCES + i32.const 0 + i32.const 576 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + call $~lib/finalizationregistry/FinalizationRegistry#constructor + global.set $~lib/weakref/REGISTRY call $std/weakref/produceDummy global.set $std/weakref/weakref global.get $std/weakref/weakref local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store $0 + i32.store $0 offset=4 local.get $2 call $~lib/weakref/WeakRef#deref i32.const 0 @@ -3625,7 +4405,7 @@ i32.eqz if i32.const 0 - i32.const 688 + i32.const 720 i32.const 10 i32.const 1 call $~lib/builtins/abort @@ -3636,7 +4416,7 @@ local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store $0 + i32.store $0 offset=4 local.get $2 call $~lib/weakref/WeakRef#deref i32.const 0 @@ -3644,7 +4424,7 @@ i32.eqz if i32.const 0 - i32.const 688 + i32.const 720 i32.const 12 i32.const 1 call $~lib/builtins/abort @@ -3656,7 +4436,7 @@ local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store $0 + i32.store $0 offset=4 local.get $2 call $~lib/weakref/WeakRef#deref i32.const 0 @@ -3664,7 +4444,7 @@ i32.eqz if i32.const 0 - i32.const 688 + i32.const 720 i32.const 25 i32.const 1 call $~lib/builtins/abort @@ -3675,7 +4455,7 @@ local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store $0 + i32.store $0 offset=4 local.get $2 call $~lib/weakref/WeakRef#deref i32.const 0 @@ -3683,7 +4463,7 @@ i32.eqz if i32.const 0 - i32.const 688 + i32.const 720 i32.const 29 i32.const 1 call $~lib/builtins/abort @@ -3693,7 +4473,7 @@ local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store $0 + i32.store $0 offset=4 local.get $2 i32.const 0 call $~lib/array/Array#set:length @@ -3702,7 +4482,7 @@ local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store $0 + i32.store $0 offset=4 local.get $2 call $~lib/weakref/WeakRef#deref i32.const 0 @@ -3710,13 +4490,67 @@ i32.eqz if i32.const 0 - i32.const 688 + i32.const 720 i32.const 33 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/finalizationregistry/FinalizationRegistry#finalize (type $i32_i32_=>_none) (param $this i32) (param $ptr i32) + (local $value i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $this + call $~lib/finalizationregistry/FinalizationRegistry#get:entries + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store $0 + local.get $3 + local.get $ptr + call $~lib/map/Map#has + if + local.get $this + call $~lib/finalizationregistry/FinalizationRegistry#get:entries + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store $0 + local.get $3 + local.get $ptr + call $~lib/map/Map#get + local.set $value + local.get $this + call $~lib/finalizationregistry/FinalizationRegistry#get:entries + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store $0 + local.get $3 + local.get $ptr + call $~lib/map/Map#delete + drop + local.get $value + i32.const 1 + global.set $~argumentsLength + local.get $this + call $~lib/finalizationregistry/FinalizationRegistry#get:finalizer + i32.load $0 + call_indirect $0 (type $i32_=>_none) + end + global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer @@ -3886,6 +4720,130 @@ local.get $8 return ) + (func $~lib/map/Map#set (type $i32_i32_i32_=>_i32) (param $this i32) (param $key i32) (param $value i32) (result i32) + (local $hashCode i32) + (local $entry i32) + (local $entries i32) + (local $6 i32) + (local $bucketPtrBase i32) + (local $8 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $key + call $~lib/util/hash/HASH + local.set $hashCode + local.get $this + local.get $key + local.get $hashCode + call $~lib/map/Map#find + local.set $entry + local.get $entry + if + local.get $entry + local.get $value + call $~lib/map/MapEntry#set:value + i32.const 0 + drop + else + local.get $this + call $~lib/map/Map#get:entriesOffset + local.get $this + call $~lib/map/Map#get:entriesCapacity + i32.eq + if + local.get $this + local.get $this + call $~lib/map/Map#get:entriesCount + local.get $this + call $~lib/map/Map#get:entriesCapacity + i32.const 3 + i32.mul + i32.const 4 + i32.div_s + i32.lt_s + if (result i32) + local.get $this + call $~lib/map/Map#get:bucketsMask + else + local.get $this + call $~lib/map/Map#get:bucketsMask + i32.const 1 + i32.shl + i32.const 1 + i32.or + end + call $~lib/map/Map#rehash + end + global.get $~lib/memory/__stack_pointer + local.get $this + call $~lib/map/Map#get:entries + local.tee $entries + i32.store $0 + local.get $entries + local.get $this + local.get $this + call $~lib/map/Map#get:entriesOffset + local.tee $6 + i32.const 1 + i32.add + call $~lib/map/Map#set:entriesOffset + local.get $6 + block $~lib/map/ENTRY_SIZE|inlined.5 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE|inlined.5 + end + i32.mul + i32.add + local.set $entry + local.get $entry + local.get $key + call $~lib/map/MapEntry#set:key + i32.const 0 + drop + local.get $entry + local.get $value + call $~lib/map/MapEntry#set:value + i32.const 0 + drop + local.get $this + local.get $this + call $~lib/map/Map#get:entriesCount + i32.const 1 + i32.add + call $~lib/map/Map#set:entriesCount + local.get $this + call $~lib/map/Map#get:buckets + local.get $hashCode + local.get $this + call $~lib/map/Map#get:bucketsMask + i32.and + i32.const 4 + i32.mul + i32.add + local.set $bucketPtrBase + local.get $entry + local.get $bucketPtrBase + i32.load $0 + call $~lib/map/MapEntry#set:taggedNext + local.get $bucketPtrBase + local.get $entry + i32.store $0 + end + local.get $this + local.set $8 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $8 + return + ) (func $~lib/object/Object#constructor (type $i32_=>_i32) (param $this i32) (result i32) (local $1 i32) global.get $~lib/memory/__stack_pointer diff --git a/tests/compiler/std/weakref.release.wat b/tests/compiler/std/weakref.release.wat index a8b2df1435..95a79ad3aa 100644 --- a/tests/compiler/std/weakref.release.wat +++ b/tests/compiler/std/weakref.release.wat @@ -2,15 +2,13 @@ (type $i32_=>_none (func_subtype (param i32) func)) (type $none_=>_none (func_subtype func)) (type $i32_i32_=>_none (func_subtype (param i32 i32) func)) - (type $i32_=>_i32 (func_subtype (param i32) (result i32) func)) + (type $i32_i32_=>_i32 (func_subtype (param i32 i32) (result i32) func)) (type $i32_i32_i32_=>_none (func_subtype (param i32 i32 i32) func)) + (type $i32_=>_i32 (func_subtype (param i32) (result i32) func)) (type $none_=>_i32 (func_subtype (result i32) func)) - (type $i32_i32_=>_i32 (func_subtype (param i32 i32) (result i32) func)) (type $i32_i32_i32_i32_=>_none (func_subtype (param i32 i32 i32 i32) func)) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (global $~lib/weakref/INITIALIZED (mut i32) (i32.const 0)) - (global $~lib/weakref/PREVIOUS_FINALIZER (mut i32) (i32.const 0)) - (global $~lib/rt/__finalize (mut i32) (i32.const 0)) + (global $~lib/weakref/CURRENT_COOKIE (mut i32) (i32.const 0)) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -19,13 +17,17 @@ (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/rt/__finalize (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~lib/weakref/ALL_REFERENCES (mut i32) (i32.const 0)) - (global $~lib/weakref/CURRENT_COOKIE (mut i32) (i32.const 0)) + (global $~lib/finalizationregistry/ALL_REGISTRIES (mut i32) (i32.const 0)) + (global $~lib/finalizationregistry/INITIALIZED (mut i32) (i32.const 0)) + (global $~lib/finalizationregistry/PREVIOUS_FINALIZER (mut i32) (i32.const 0)) + (global $~lib/weakref/REGISTRY (mut i32) (i32.const 0)) (global $std/weakref/weakref (mut i32) (i32.const 0)) (global $std/weakref/weakref2 (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34680)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34724)) (memory $0 1) (data (i32.const 1036) "<") (data (i32.const 1048) "\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") @@ -42,40 +44,55 @@ (data (i32.const 1484) "<") (data (i32.const 1496) "\02\00\00\00&\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s") (data (i32.const 1548) "\1c") - (data (i32.const 1560) "\06\00\00\00\08\00\00\00\01") - (data (i32.const 1580) "<") - (data (i32.const 1592) "\02\00\00\00$\00\00\00K\00e\00y\00 \00d\00o\00e\00s\00 \00n\00o\00t\00 \00e\00x\00i\00s\00t") - (data (i32.const 1644) ",") - (data (i32.const 1656) "\02\00\00\00\16\00\00\00~\00l\00i\00b\00/\00m\00a\00p\00.\00t\00s") - (data (i32.const 1692) ",") - (data (i32.const 1704) "\02\00\00\00\1c\00\00\00s\00t\00d\00/\00w\00e\00a\00k\00r\00e\00f\00.\00t\00s") - (data (i32.const 1740) "\1c") - (data (i32.const 1752) "\01") - (data (i32.const 1772) ",") - (data (i32.const 1784) "\08\00\00\00\10\00\00\00\e0\06\00\00\e0\06") - (data (i32.const 1820) ",") - (data (i32.const 1832) "\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") - (data (i32.const 1872) "\t\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00\00\00\00\00\10\01\02\00\02A") - (table $0 2 2 funcref) - (elem $0 (i32.const 1) $~lib/weakref/WeakRef.finalize) + (data (i32.const 1560) "\n\00\00\00\08\00\00\00\01") + (data (i32.const 1580) "\1c") + (data (i32.const 1592) "\n\00\00\00\08\00\00\00\02") + (data (i32.const 1612) "<") + (data (i32.const 1624) "\02\00\00\00$\00\00\00K\00e\00y\00 \00d\00o\00e\00s\00 \00n\00o\00t\00 \00e\00x\00i\00s\00t") + (data (i32.const 1676) ",") + (data (i32.const 1688) "\02\00\00\00\16\00\00\00~\00l\00i\00b\00/\00m\00a\00p\00.\00t\00s") + (data (i32.const 1724) ",") + (data (i32.const 1736) "\02\00\00\00\1c\00\00\00s\00t\00d\00/\00w\00e\00a\00k\00r\00e\00f\00.\00t\00s") + (data (i32.const 1772) "\1c") + (data (i32.const 1784) "\01") + (data (i32.const 1804) ",") + (data (i32.const 1816) "\0b\00\00\00\10\00\00\00\00\07\00\00\00\07") + (data (i32.const 1852) ",") + (data (i32.const 1864) "\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") + (data (i32.const 1904) "\0c\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00\10\01\02") + (data (i32.const 1944) "\10\01\02\00\00\00\00\00\02A") + (table $0 3 3 funcref) + (elem $0 (i32.const 1) $~lib/finalizationregistry/BaseRegistry.finalizeAll $start:~lib/weakref~anonymous|0) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/visitRoots (type $none_=>_none) (local $0 i32) (local $1 i32) + global.get $~lib/finalizationregistry/ALL_REGISTRIES + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end global.get $~lib/weakref/ALL_REFERENCES local.tee $0 if local.get $0 call $byn-split-outlined-A$~lib/rt/itcms/__visit end + global.get $~lib/weakref/REGISTRY + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end global.get $std/weakref/weakref local.tee $0 if local.get $0 call $byn-split-outlined-A$~lib/rt/itcms/__visit end - i32.const 1792 + i32.const 1824 call $byn-split-outlined-A$~lib/rt/itcms/__visit global.get $std/weakref/weakref2 local.tee $0 @@ -87,7 +104,7 @@ call $byn-split-outlined-A$~lib/rt/itcms/__visit i32.const 1456 call $byn-split-outlined-A$~lib/rt/itcms/__visit - i32.const 1600 + i32.const 1632 call $byn-split-outlined-A$~lib/rt/itcms/__visit i32.const 1056 call $byn-split-outlined-A$~lib/rt/itcms/__visit @@ -164,7 +181,7 @@ i32.load $0 offset=8 i32.eqz local.get $0 - i32.const 34680 + i32.const 34724 i32.lt_u i32.and i32.eqz @@ -213,7 +230,7 @@ i32.const 1 else local.get $1 - i32.const 1872 + i32.const 1904 i32.load $0 i32.gt_u if @@ -227,7 +244,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 1876 + i32.const 1908 i32.add i32.load $0 i32.const 32 @@ -792,10 +809,10 @@ if unreachable end - i32.const 34688 + i32.const 34736 i32.const 0 i32.store $0 - i32.const 36256 + i32.const 36304 i32.const 0 i32.store $0 loop $for-loop|0 @@ -806,7 +823,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 34688 + i32.const 34736 i32.add i32.const 0 i32.store $0 offset=4 @@ -824,7 +841,7 @@ i32.add i32.const 2 i32.shl - i32.const 34688 + i32.const 34736 i32.add i32.const 0 i32.store $0 offset=96 @@ -842,13 +859,13 @@ br $for-loop|0 end end - i32.const 34688 - i32.const 36260 + i32.const 34736 + i32.const 36308 memory.size $0 i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 34688 + i32.const 34736 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (type $none_=>_i32) (result i32) @@ -933,7 +950,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 34680 + i32.const 34724 i32.lt_u if local.get $0 @@ -1033,7 +1050,7 @@ unreachable end local.get $0 - i32.const 34680 + i32.const 34724 i32.lt_u if local.get $0 @@ -1064,7 +1081,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 34680 + i32.const 34724 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1571,11 +1588,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1912 + i32.const 1956 i32.lt_s if - i32.const 34704 i32.const 34752 + i32.const 34800 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -1726,172 +1743,576 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/rt/itcms/__collect (type $none_=>_none) - global.get $~lib/rt/itcms/state - i32.const 0 - i32.gt_s - if - loop $while-continue|0 - global.get $~lib/rt/itcms/state + (func $~lib/finalizationregistry/BaseRegistry.finalizeAll (type $i32_=>_none) (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 1956 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 0 + i32.store $0 + local.get $1 + global.get $~lib/finalizationregistry/ALL_REGISTRIES + local.tee $2 + i32.store $0 + loop $for-loop|0 + local.get $2 if - call $~lib/rt/itcms/step - drop - br $while-continue|0 + block $__inlined_func$~lib/finalizationregistry/BaseRegistry#finalize@override + local.get $2 + i32.const 8 + i32.sub + i32.load $0 + i32.const 7 + i32.eq + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1956 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 0 + i32.store $0 + local.get $1 + local.get $2 + i32.load $0 offset=4 + local.tee $1 + i32.store $0 + local.get $1 + i32.load $0 + local.get $1 + i32.load $0 offset=4 + local.get $0 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $1 + local.get $1 + i32.const 15 + i32.shr_u + i32.xor + i32.const -2048144777 + i32.mul + local.tee $1 + local.get $1 + i32.const 13 + i32.shr_u + i32.xor + i32.const -1028477379 + i32.mul + local.tee $1 + local.get $1 + i32.const 16 + i32.shr_u + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $1 + block $__inlined_func$~lib/map/Map#find + loop $while-continue|0 + local.get $1 + if + local.get $1 + i32.load $0 offset=8 + local.tee $3 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $1 + i32.load $0 + local.get $0 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find + local.get $3 + i32.const -2 + i32.and + local.set $1 + br $while-continue|0 + end + end + i32.const 0 + local.set $1 + end + local.get $1 + if + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.load $0 offset=4 + local.tee $1 + i32.store $0 + local.get $1 + local.get $0 + call $~lib/map/Map#get + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.load $0 offset=4 + local.tee $3 + i32.store $0 + local.get $3 + local.get $0 + call $~lib/map/Map#delete + drop + local.get $1 + local.get $2 + i32.load $0 offset=8 + i32.load $0 + call_indirect $0 (type $i32_=>_none) + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + br $__inlined_func$~lib/finalizationregistry/BaseRegistry#finalize@override + end + unreachable + end + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.load $0 + local.tee $2 + i32.store $0 + br $for-loop|0 end end - end - call $~lib/rt/itcms/step - drop - loop $while-continue|1 - global.get $~lib/rt/itcms/state + global.get $~lib/finalizationregistry/PREVIOUS_FINALIZER if - call $~lib/rt/itcms/step - drop - br $while-continue|1 + local.get $0 + global.get $~lib/finalizationregistry/PREVIOUS_FINALIZER + call_indirect $0 (type $i32_=>_none) end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + return end - global.get $~lib/rt/itcms/total - i64.extend_i32_u - i64.const 200 - i64.mul - i64.const 100 - i64.div_u - i32.wrap_i64 - i32.const 1024 - i32.add - global.set $~lib/rt/itcms/threshold + i32.const 34752 + i32.const 34800 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable ) - (func $~lib/array/ensureCapacity (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (func $~lib/map/Map#delete (type $i32_i32_=>_i32) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) local.get $0 - i32.const 1800 i32.load $0 - local.tee $3 - i32.const 2 + local.get $0 + i32.load $0 offset=4 + local.get $1 + local.tee $2 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $1 + i32.const 15 i32.shr_u - i32.gt_u - if - local.get $0 - i32.const 268435455 - i32.gt_u - if - i32.const 1456 - i32.const 1840 - i32.const 19 - i32.const 48 - call $~lib/builtins/abort - unreachable - end - i32.const 1792 - i32.load $0 - local.set $2 - i32.const 8 - local.get $0 - local.get $0 - i32.const 8 - i32.le_u - select - i32.const 2 - i32.shl - local.set $0 - local.get $1 - if - i32.const 1073741820 - local.get $3 - i32.const 1 - i32.shl - local.tee $1 - local.get $1 - i32.const 1073741820 - i32.ge_u - select - local.tee $1 - local.get $0 - local.get $0 + local.get $1 + i32.xor + i32.const -2048144777 + i32.mul + local.tee $1 + i32.const 13 + i32.shr_u + local.get $1 + i32.xor + i32.const -1028477379 + i32.mul + local.tee $1 + i32.const 16 + i32.shr_u + local.get $1 + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $1 + block $__inlined_func$~lib/map/Map#find + loop $while-continue|0 local.get $1 - i32.lt_u - select - local.set $0 - end - block $__inlined_func$~lib/rt/itcms/__renew - local.get $2 - i32.const 20 - i32.sub - local.tee $3 - i32.load $0 - i32.const -4 - i32.and - i32.const 16 - i32.sub - local.get $0 - i32.ge_u if + local.get $1 + i32.load $0 offset=8 + local.tee $3 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $1 + i32.load $0 + local.get $2 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find local.get $3 - local.get $0 - i32.store $0 offset=16 - local.get $2 + i32.const -2 + i32.and local.set $1 - br $__inlined_func$~lib/rt/itcms/__renew + br $while-continue|0 end - local.get $0 - local.get $3 - i32.load $0 offset=12 - call $~lib/rt/itcms/__new - local.tee $1 - local.get $2 - local.get $0 - local.get $3 - i32.load $0 offset=16 - local.tee $3 - local.get $0 - local.get $3 - i32.lt_u - select - memory.copy $0 $0 end - local.get $1 - local.get $2 - i32.ne + i32.const 0 + local.set $1 + end + local.get $1 + i32.eqz + if + i32.const 0 + return + end + local.get $1 + local.get $1 + i32.load $0 offset=8 + i32.const 1 + i32.or + i32.store $0 offset=8 + local.get $0 + local.get $0 + i32.load $0 offset=20 + i32.const 1 + i32.sub + i32.store $0 offset=20 + local.get $0 + i32.load $0 offset=4 + i32.const 1 + i32.shr_u + local.tee $1 + i32.const 1 + i32.add + i32.const 4 + local.get $0 + i32.load $0 offset=20 + local.tee $2 + local.get $2 + i32.const 4 + i32.lt_u + select + i32.ge_u + if (result i32) + local.get $0 + i32.load $0 offset=20 + local.get $0 + i32.load $0 offset=12 + i32.const 3 + i32.mul + i32.const 4 + i32.div_s + i32.lt_s + else + i32.const 0 + end + if + local.get $0 + local.get $1 + call $~lib/map/Map#rehash + end + i32.const 1 + ) + (func $~lib/map/Map#get (type $i32_i32_=>_i32) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $0 + i32.load $0 + local.get $0 + i32.load $0 offset=4 + local.get $1 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $0 + i32.const 15 + i32.shr_u + local.get $0 + i32.xor + i32.const -2048144777 + i32.mul + local.tee $0 + i32.const 13 + i32.shr_u + local.get $0 + i32.xor + i32.const -1028477379 + i32.mul + local.tee $0 + i32.const 16 + i32.shr_u + local.get $0 + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $0 + block $__inlined_func$~lib/map/Map#find + loop $while-continue|0 + local.get $0 + if + local.get $0 + i32.load $0 offset=8 + local.tee $2 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $0 + i32.load $0 + local.get $1 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find + local.get $2 + i32.const -2 + i32.and + local.set $0 + br $while-continue|0 + end + end + i32.const 0 + local.set $0 + end + local.get $0 + i32.eqz + if + i32.const 1632 + i32.const 1696 + i32.const 105 + i32.const 17 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.load $0 offset=4 + ) + (func $~lib/rt/itcms/__collect (type $none_=>_none) + global.get $~lib/rt/itcms/state + i32.const 0 + i32.gt_s + if + loop $while-continue|0 + global.get $~lib/rt/itcms/state + if + call $~lib/rt/itcms/step + drop + br $while-continue|0 + end + end + end + call $~lib/rt/itcms/step + drop + loop $while-continue|1 + global.get $~lib/rt/itcms/state + if + call $~lib/rt/itcms/step + drop + br $while-continue|1 + end + end + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i64.const 200 + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + ) + (func $~lib/array/ensureCapacity (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + i32.const 1832 + i32.load $0 + local.tee $3 + i32.const 2 + i32.shr_u + i32.gt_u + if + local.get $0 + i32.const 268435455 + i32.gt_u + if + i32.const 1456 + i32.const 1872 + i32.const 19 + i32.const 48 + call $~lib/builtins/abort + unreachable + end + i32.const 1824 + i32.load $0 + local.set $2 + i32.const 8 + local.get $0 + local.get $0 + i32.const 8 + i32.le_u + select + i32.const 2 + i32.shl + local.set $0 + local.get $1 + if + i32.const 1073741820 + local.get $3 + i32.const 1 + i32.shl + local.tee $1 + local.get $1 + i32.const 1073741820 + i32.ge_u + select + local.tee $1 + local.get $0 + local.get $0 + local.get $1 + i32.lt_u + select + local.set $0 + end + block $__inlined_func$~lib/rt/itcms/__renew + local.get $2 + i32.const 20 + i32.sub + local.tee $3 + i32.load $0 + i32.const -4 + i32.and + i32.const 16 + i32.sub + local.get $0 + i32.ge_u + if + local.get $3 + local.get $0 + i32.store $0 offset=16 + local.get $2 + local.set $1 + br $__inlined_func$~lib/rt/itcms/__renew + end + local.get $0 + local.get $3 + i32.load $0 offset=12 + call $~lib/rt/itcms/__new + local.tee $1 + local.get $2 + local.get $0 + local.get $3 + i32.load $0 offset=16 + local.tee $3 + local.get $0 + local.get $3 + i32.lt_u + select + memory.copy $0 $0 + end + local.get $1 + local.get $2 + i32.ne if - i32.const 1792 + i32.const 1824 local.get $1 i32.store $0 - i32.const 1796 + i32.const 1828 local.get $1 i32.store $0 local.get $1 if - i32.const 1792 + i32.const 1824 local.get $1 i32.const 0 call $byn-split-outlined-A$~lib/rt/itcms/__link end end - i32.const 1800 + i32.const 1832 local.get $0 i32.store $0 end ) + (func $~lib/map/Map~visit (type $i32_=>_none) (param $0 i32) + (local $1 i32) + local.get $0 + i32.load $0 + local.tee $1 + if + local.get $1 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + local.get $0 + i32.load $0 offset=8 + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + ) (func $~lib/rt/__visit_members (type $i32_=>_none) (param $0 i32) (local $1 i32) (local $2 i32) (local $3 i32) - block $invalid - block $~lib/array/Array - block $~lib/map/Map + block $folding-inner0 + block $invalid + block $~lib/array/Array block $~lib/function/Function<%28usize%29=>void> - block $~lib/weakref/WeakRef - block $std/weakref/Dummy - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - block $~lib/object/Object - local.get $0 - i32.const 8 - i32.sub - i32.load $0 - br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $std/weakref/Dummy $~lib/weakref/WeakRef $~lib/function/Function<%28usize%29=>void> $~lib/map/Map $~lib/array/Array $invalid + block $~lib/map/Map + block $~lib/finalizationregistry/FinalizationRegistry + block $~lib/map/Map + block $~lib/weakref/WeakRef + block $std/weakref/Dummy + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + block $~lib/object/Object + local.get $0 + i32.const 8 + i32.sub + i32.load $0 + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $folding-inner0 $std/weakref/Dummy $~lib/weakref/WeakRef $~lib/map/Map $~lib/finalizationregistry/FinalizationRegistry $folding-inner0 $~lib/map/Map $~lib/function/Function<%28usize%29=>void> $~lib/array/Array $invalid + end + return + end + return end return end @@ -1900,16 +2321,34 @@ return end local.get $0 - i32.load $0 - local.tee $0 - if - local.get $0 - call $byn-split-outlined-A$~lib/rt/itcms/__visit - end - return + call $~lib/map/Map~visit + return + end + local.get $0 + i32.load $0 + local.tee $1 + if + local.get $1 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + local.get $0 + i32.load $0 offset=4 + local.tee $1 + if + local.get $1 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + local.get $0 + i32.load $0 offset=8 + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit end return end + local.get $0 + call $~lib/map/Map~visit return end local.get $0 @@ -1922,14 +2361,35 @@ return end local.get $0 - i32.load $0 + i32.load $0 offset=4 local.tee $1 - if + local.get $0 + i32.load $0 offset=12 + i32.const 2 + i32.shl + i32.add + local.set $2 + loop $while-continue|0 local.get $1 - call $byn-split-outlined-A$~lib/rt/itcms/__visit + local.get $2 + i32.lt_u + if + local.get $1 + i32.load $0 + local.tee $3 + if + local.get $3 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + local.get $1 + i32.const 4 + i32.add + local.set $1 + br $while-continue|0 + end end local.get $0 - i32.load $0 offset=8 + i32.load $0 local.tee $0 if local.get $0 @@ -1937,66 +2397,37 @@ end return end + unreachable + end + local.get $0 + i32.load $0 + local.tee $0 + if local.get $0 - i32.load $0 offset=4 - local.tee $1 - local.get $0 - i32.load $0 offset=12 - i32.const 2 - i32.shl - i32.add - local.set $2 - loop $while-continue|0 - local.get $1 - local.get $2 - i32.lt_u - if - local.get $1 - i32.load $0 - local.tee $3 - if - local.get $3 - call $byn-split-outlined-A$~lib/rt/itcms/__visit - end - local.get $1 - i32.const 4 - i32.add - local.set $1 - br $while-continue|0 - end - end - local.get $0 - i32.load $0 - local.tee $0 - if - local.get $0 - call $byn-split-outlined-A$~lib/rt/itcms/__visit - end - return + call $byn-split-outlined-A$~lib/rt/itcms/__visit end - unreachable ) (func $~start (type $none_=>_none) (local $0 i32) (local $1 i32) (local $2 i32) global.get $~lib/memory/__stack_pointer - i32.const 4 + i32.const 8 i32.sub global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 1912 + i32.const 1956 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer local.tee $0 - i32.const 0 - i32.store $0 + i64.const 0 + i64.store $0 memory.size $0 i32.const 16 i32.shl - i32.const 34680 + i32.const 34724 i32.sub i32.const 1 i32.shr_u @@ -2030,7 +2461,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1912 + i32.const 1956 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2039,66 +2470,244 @@ i64.store $0 local.get $0 i32.const 24 + i32.const 6 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store $0 + i32.const 16 + call $~lib/arraybuffer/ArrayBuffer#constructor + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $0 + local.get $1 + i32.store $0 + local.get $1 + if + local.get $0 + local.get $1 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + local.get $0 + i32.const 3 + i32.store $0 offset=4 + i32.const 48 + call $~lib/arraybuffer/ArrayBuffer#constructor + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $0 + local.get $1 + i32.store $0 offset=8 + local.get $1 + if + local.get $0 + local.get $1 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + local.get $0 + i32.const 4 + i32.store $0 offset=12 + local.get $0 + i32.const 0 + i32.store $0 offset=16 + local.get $0 + i32.const 0 + i32.store $0 offset=20 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + global.set $~lib/weakref/ALL_REFERENCES + global.get $~lib/memory/__stack_pointer + i32.const 1600 + i32.store $0 + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1956 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $0 + i64.const 0 + i64.store $0 + local.get $0 + i32.const 0 + i32.store $0 offset=8 + local.get $0 + i32.const 12 i32.const 7 call $~lib/rt/itcms/__new local.tee $0 i32.store $0 - i32.const 16 - call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $1 + local.get $0 + i32.const 1600 + i32.store $0 offset=8 + local.get $0 + i32.const 1600 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1956 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $1 + i64.const 0 + i64.store $0 + local.get $1 + i32.const 24 + i32.const 9 + call $~lib/rt/itcms/__new + local.tee $1 + i32.store $0 + i32.const 16 + call $~lib/arraybuffer/ArrayBuffer#constructor + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=4 + local.get $1 + local.get $2 + i32.store $0 + local.get $2 + if + local.get $1 + local.get $2 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + local.get $1 + i32.const 3 + i32.store $0 offset=4 + i32.const 48 + call $~lib/arraybuffer/ArrayBuffer#constructor + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=4 + local.get $1 + local.get $2 + i32.store $0 offset=8 + local.get $2 + if + local.get $1 + local.get $2 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + local.get $1 + i32.const 4 + i32.store $0 offset=12 + local.get $1 + i32.const 0 + i32.store $0 offset=16 + local.get $1 + i32.const 0 + i32.store $0 offset=20 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $0 + local.get $1 + i32.store $0 offset=4 + local.get $1 + if + local.get $0 + local.get $1 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1956 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store $0 + local.get $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 8 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store $0 + end + local.get $0 + i32.const 0 + i32.store $0 global.get $~lib/memory/__stack_pointer - local.get $1 + global.get $~lib/finalizationregistry/ALL_REGISTRIES + local.tee $2 i32.store $0 offset=4 local.get $0 - local.get $1 + local.get $2 i32.store $0 - local.get $1 + local.get $2 if local.get $0 - local.get $1 + local.get $2 i32.const 0 call $byn-split-outlined-A$~lib/rt/itcms/__link end local.get $0 - i32.const 3 - i32.store $0 offset=4 - i32.const 48 - call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $1 + global.set $~lib/finalizationregistry/ALL_REGISTRIES global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer local.get $1 - i32.store $0 offset=4 local.get $0 - local.get $1 - i32.store $0 offset=8 - local.get $1 + i32.store $0 + global.get $~lib/finalizationregistry/INITIALIZED + i32.eqz if - local.get $0 - local.get $1 - i32.const 0 - call $byn-split-outlined-A$~lib/rt/itcms/__link + global.get $~lib/rt/__finalize + global.set $~lib/finalizationregistry/PREVIOUS_FINALIZER + global.get $~lib/memory/__stack_pointer + i32.const 1568 + i32.store $0 offset=8 + i32.const 1568 + i32.load $0 + global.set $~lib/rt/__finalize + i32.const 1 + global.set $~lib/finalizationregistry/INITIALIZED end - local.get $0 - i32.const 4 - i32.store $0 offset=12 - local.get $0 - i32.const 0 - i32.store $0 offset=16 - local.get $0 - i32.const 0 - i32.store $0 offset=20 global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 12 i32.add global.set $~lib/memory/__stack_pointer local.get $0 - global.set $~lib/weakref/ALL_REFERENCES + global.set $~lib/weakref/REGISTRY global.get $~lib/memory/__stack_pointer i32.const 4 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1912 + i32.const 1956 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2121,13 +2730,13 @@ global.get $~lib/memory/__stack_pointer global.get $std/weakref/weakref local.tee $0 - i32.store $0 + i32.store $0 offset=4 local.get $0 call $~lib/weakref/WeakRef#deref i32.eqz if i32.const 0 - i32.const 1712 + i32.const 1744 i32.const 10 i32.const 1 call $~lib/builtins/abort @@ -2137,12 +2746,12 @@ global.get $~lib/memory/__stack_pointer global.get $std/weakref/weakref local.tee $0 - i32.store $0 + i32.store $0 offset=4 local.get $0 call $~lib/weakref/WeakRef#deref if i32.const 0 - i32.const 1712 + i32.const 1744 i32.const 12 i32.const 1 call $~lib/builtins/abort @@ -2153,7 +2762,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1912 + i32.const 1956 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2162,273 +2771,148 @@ i64.store $0 local.get $0 call $std/weakref/Dummy#constructor - local.tee $1 + local.tee $0 i32.store $0 global.get $~lib/memory/__stack_pointer - i32.const 1792 + i32.const 1824 i32.store $0 offset=4 - i32.const 1804 + i32.const 1836 i32.load $0 - local.tee $0 + local.tee $1 i32.const 1 i32.add local.tee $2 i32.const 1 call $~lib/array/ensureCapacity - i32.const 1796 + i32.const 1828 i32.load $0 - local.get $0 + local.get $1 i32.const 2 i32.shl i32.add - local.get $1 - i32.store $0 - local.get $1 - if - i32.const 1792 - local.get $1 - i32.const 1 - call $byn-split-outlined-A$~lib/rt/itcms/__link - end - i32.const 1804 - local.get $2 - i32.store $0 - local.get $1 - call $~lib/weakref/WeakRef#constructor - local.set $0 - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $0 - global.set $std/weakref/weakref2 - global.get $~lib/memory/__stack_pointer - global.get $std/weakref/weakref2 - local.tee $0 - i32.store $0 - local.get $0 - call $~lib/weakref/WeakRef#deref - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 25 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - call $~lib/rt/itcms/__collect - global.get $~lib/memory/__stack_pointer - global.get $std/weakref/weakref2 - local.tee $0 - i32.store $0 local.get $0 - call $~lib/weakref/WeakRef#deref - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 29 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1792 - i32.store $0 - i32.const 0 - i32.const 0 - call $~lib/array/ensureCapacity - i32.const 1804 - i32.const 0 i32.store $0 - call $~lib/rt/itcms/__collect - global.get $~lib/memory/__stack_pointer - global.get $std/weakref/weakref2 - local.tee $0 - i32.store $0 - local.get $0 - call $~lib/weakref/WeakRef#deref - if - i32.const 0 - i32.const 1712 - i32.const 33 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - return - end - i32.const 34704 - i32.const 34752 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable - ) - (func $~lib/weakref/WeakRef.finalize (type $i32_=>_none) (param $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 1912 - i32.lt_s - if - i32.const 34704 - i32.const 34752 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - local.tee $1 - i32.const 0 - i32.store $0 - local.get $1 - global.get $~lib/weakref/ALL_REFERENCES - local.tee $2 - i32.store $0 - block $__inlined_func$~lib/map/Map#delete (result i32) - local.get $2 - i32.load $0 - local.get $2 - i32.load $0 offset=4 local.get $0 - i32.const -1028477379 - i32.mul - i32.const 374761397 - i32.add - i32.const 17 - i32.rotl - i32.const 668265263 - i32.mul - local.tee $1 - i32.const 15 - i32.shr_u - local.get $1 - i32.xor - i32.const -2048144777 - i32.mul - local.tee $1 - i32.const 13 - i32.shr_u - local.get $1 - i32.xor - i32.const -1028477379 - i32.mul - local.tee $1 - i32.const 16 - i32.shr_u - local.get $1 - i32.xor - i32.and - i32.const 2 - i32.shl - i32.add - i32.load $0 - local.set $1 - block $__inlined_func$~lib/map/Map#find - loop $while-continue|0 - local.get $1 - if - local.get $1 - i32.load $0 offset=8 - local.tee $3 - i32.const 1 - i32.and - if (result i32) - i32.const 0 - else - local.get $1 - i32.load $0 - local.get $0 - i32.eq - end - br_if $__inlined_func$~lib/map/Map#find - local.get $3 - i32.const -2 - i32.and - local.set $1 - br $while-continue|0 - end - end - i32.const 0 - local.set $1 - end - i32.const 0 - local.get $1 - i32.eqz - br_if $__inlined_func$~lib/map/Map#delete - drop - local.get $1 - local.get $1 - i32.load $0 offset=8 - i32.const 1 - i32.or - i32.store $0 offset=8 - local.get $2 - local.get $2 - i32.load $0 offset=20 - i32.const 1 - i32.sub - i32.store $0 offset=20 - local.get $2 - i32.load $0 offset=4 - i32.const 1 - i32.shr_u - local.tee $1 - i32.const 1 - i32.add - i32.const 4 - local.get $2 - i32.load $0 offset=20 - local.tee $3 - local.get $3 - i32.const 4 - i32.lt_u - select - i32.ge_u - if (result i32) - local.get $2 - i32.load $0 offset=20 - local.get $2 - i32.load $0 offset=12 - i32.const 3 - i32.mul - i32.const 4 - i32.div_s - i32.lt_s - else + if + i32.const 1824 + local.get $0 + i32.const 1 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + i32.const 1836 + local.get $2 + i32.store $0 + local.get $0 + call $~lib/weakref/WeakRef#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + global.set $std/weakref/weakref2 + global.get $~lib/memory/__stack_pointer + global.get $std/weakref/weakref2 + local.tee $0 + i32.store $0 offset=4 + local.get $0 + call $~lib/weakref/WeakRef#deref + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 25 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $~lib/rt/itcms/__collect + global.get $~lib/memory/__stack_pointer + global.get $std/weakref/weakref2 + local.tee $0 + i32.store $0 offset=4 + local.get $0 + call $~lib/weakref/WeakRef#deref + i32.eqz + if i32.const 0 + i32.const 1744 + i32.const 29 + i32.const 1 + call $~lib/builtins/abort + unreachable end + global.get $~lib/memory/__stack_pointer + i32.const 1824 + i32.store $0 offset=4 + i32.const 0 + i32.const 0 + call $~lib/array/ensureCapacity + i32.const 1836 + i32.const 0 + i32.store $0 + call $~lib/rt/itcms/__collect + global.get $~lib/memory/__stack_pointer + global.get $std/weakref/weakref2 + local.tee $0 + i32.store $0 offset=4 + local.get $0 + call $~lib/weakref/WeakRef#deref if - local.get $2 - local.get $1 - call $~lib/map/Map#rehash + i32.const 0 + i32.const 1744 + i32.const 33 + i32.const 1 + call $~lib/builtins/abort + unreachable end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + i32.const 34752 + i32.const 34800 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $start:~lib/weakref~anonymous|0 (type $i32_=>_none) (param $0 i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1956 + i32.lt_s + if + i32.const 34752 + i32.const 34800 i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable end + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 0 + i32.store $0 + local.get $1 + global.get $~lib/weakref/ALL_REFERENCES + local.tee $1 + i32.store $0 + local.get $1 + local.get $0 + call $~lib/map/Map#delete if global.get $~lib/weakref/CURRENT_COOKIE i32.const 1 i32.add global.set $~lib/weakref/CURRENT_COOKIE end - global.get $~lib/weakref/PREVIOUS_FINALIZER - if - local.get $0 - global.get $~lib/weakref/PREVIOUS_FINALIZER - call_indirect $0 (type $i32_=>_none) - end global.get $~lib/memory/__stack_pointer i32.const 4 i32.add @@ -2439,15 +2923,13 @@ (local $2 i32) (local $3 i32) (local $4 i32) - (local $5 i32) - (local $6 i32) global.get $~lib/memory/__stack_pointer i32.const 8 i32.sub global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 1912 + i32.const 1956 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2458,214 +2940,67 @@ i32.const 8 i32.const 5 call $~lib/rt/itcms/__new - local.tee $2 + local.tee $1 i32.store $0 - local.get $2 + local.get $1 i32.const 0 i32.store $0 - local.get $2 + local.get $1 i32.const 0 i32.store $0 offset=4 - global.get $~lib/weakref/INITIALIZED - i32.eqz - if - global.get $~lib/rt/__finalize - global.set $~lib/weakref/PREVIOUS_FINALIZER - global.get $~lib/memory/__stack_pointer - i32.const 1568 - i32.store $0 offset=4 - i32.const 1568 - i32.load $0 - global.set $~lib/rt/__finalize - i32.const 1 - global.set $~lib/weakref/INITIALIZED - end global.get $~lib/memory/__stack_pointer - local.tee $1 global.get $~lib/weakref/ALL_REFERENCES - local.tee $4 + local.tee $2 i32.store $0 offset=4 - local.get $1 - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 1912 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/weakref/CURRENT_COOKIE - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store $0 - local.get $4 - i32.load $0 - local.get $0 - local.tee $1 - i32.const -1028477379 - i32.mul - i32.const 374761397 - i32.add - i32.const 17 - i32.rotl - i32.const 668265263 - i32.mul - local.tee $0 - i32.const 15 - i32.shr_u - local.get $0 - i32.xor - i32.const -2048144777 - i32.mul - local.tee $0 - i32.const 13 - i32.shr_u - local.get $0 - i32.xor - i32.const -1028477379 - i32.mul - local.tee $0 - i32.const 16 - i32.shr_u - local.get $0 - i32.xor - local.tee $5 - local.get $4 - i32.load $0 offset=4 - i32.and - i32.const 2 - i32.shl - i32.add - i32.load $0 - local.set $0 - block $__inlined_func$~lib/map/Map#find - loop $while-continue|0 - local.get $0 - if - local.get $0 - i32.load $0 offset=8 - local.tee $6 - i32.const 1 - i32.and - if (result i32) - i32.const 0 - else - local.get $1 - local.get $0 - i32.load $0 - i32.eq - end - br_if $__inlined_func$~lib/map/Map#find - local.get $6 - i32.const -2 - i32.and - local.set $0 - br $while-continue|0 - end - end - i32.const 0 - local.set $0 - end - local.get $0 - if - local.get $0 - local.get $3 - i32.store $0 offset=4 - else - local.get $4 - i32.load $0 offset=16 - local.get $4 - i32.load $0 offset=12 - i32.eq - if - local.get $4 - local.get $4 - i32.load $0 offset=20 - local.get $4 - i32.load $0 offset=12 - i32.const 3 - i32.mul - i32.const 4 - i32.div_s - i32.lt_s - if (result i32) - local.get $4 - i32.load $0 offset=4 - else - local.get $4 - i32.load $0 offset=4 - i32.const 1 - i32.shl - i32.const 1 - i32.or - end - call $~lib/map/Map#rehash - end - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.load $0 offset=8 - local.tee $0 - i32.store $0 - local.get $4 - local.get $4 - i32.load $0 offset=16 - local.tee $6 - i32.const 1 - i32.add - i32.store $0 offset=16 - local.get $0 - local.get $6 - i32.const 12 - i32.mul - i32.add - local.tee $0 - local.get $1 - i32.store $0 - local.get $0 - local.get $3 - i32.store $0 offset=4 - local.get $4 - local.get $4 - i32.load $0 offset=20 - i32.const 1 - i32.add - i32.store $0 offset=20 - local.get $0 - local.get $4 - i32.load $0 - local.get $5 - local.get $4 - i32.load $0 offset=4 - i32.and - i32.const 2 - i32.shl - i32.add - local.tee $4 - i32.load $0 - i32.store $0 offset=8 - local.get $4 - local.get $0 - i32.store $0 - end + local.get $2 + local.get $0 + global.get $~lib/weakref/CURRENT_COOKIE + local.tee $2 + call $~lib/map/Map#set + global.get $~lib/memory/__stack_pointer + global.get $~lib/weakref/REGISTRY + local.tee $3 + i32.store $0 offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1956 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $4 + i32.const 0 + i32.store $0 + local.get $4 + local.get $3 + i32.load $0 offset=4 + local.tee $3 + i32.store $0 + local.get $3 + local.get $0 + local.get $0 + call $~lib/map/Map#set global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $2 local.get $1 + local.get $0 i32.store $0 + local.get $1 local.get $2 - local.get $3 i32.store $0 offset=4 global.get $~lib/memory/__stack_pointer i32.const 8 i32.add global.set $~lib/memory/__stack_pointer - local.get $2 + local.get $1 return end - i32.const 34704 i32.const 34752 + i32.const 34800 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2680,11 +3015,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1912 + i32.const 1956 i32.lt_s if - i32.const 34704 i32.const 34752 + i32.const 34800 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2751,9 +3086,9 @@ if (result i32) i32.const 0 else - local.get $2 local.get $1 i32.load $0 + local.get $2 i32.eq end br_if $__inlined_func$~lib/map/Map#find @@ -2774,83 +3109,8 @@ local.tee $1 i32.store $0 local.get $1 - i32.load $0 - local.get $1 - i32.load $0 offset=4 local.get $2 - i32.const -1028477379 - i32.mul - i32.const 374761397 - i32.add - i32.const 17 - i32.rotl - i32.const 668265263 - i32.mul - local.tee $1 - local.get $1 - i32.const 15 - i32.shr_u - i32.xor - i32.const -2048144777 - i32.mul - local.tee $1 - local.get $1 - i32.const 13 - i32.shr_u - i32.xor - i32.const -1028477379 - i32.mul - local.tee $1 - local.get $1 - i32.const 16 - i32.shr_u - i32.xor - i32.and - i32.const 2 - i32.shl - i32.add - i32.load $0 - local.set $1 - block $__inlined_func$~lib/map/Map#find2 - loop $while-continue|08 - local.get $1 - if - local.get $1 - i32.load $0 offset=8 - local.tee $3 - i32.const 1 - i32.and - if (result i32) - i32.const 0 - else - local.get $2 - local.get $1 - i32.load $0 - i32.eq - end - br_if $__inlined_func$~lib/map/Map#find2 - local.get $3 - i32.const -2 - i32.and - local.set $1 - br $while-continue|08 - end - end - i32.const 0 - local.set $1 - end - local.get $1 - i32.eqz - if - i32.const 1600 - i32.const 1664 - i32.const 105 - i32.const 17 - call $~lib/builtins/abort - unreachable - end - local.get $1 - i32.load $0 offset=4 + call $~lib/map/Map#get local.get $0 i32.load $0 offset=4 i32.eq @@ -2878,11 +3138,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1912 + i32.const 1956 i32.lt_s if - i32.const 34704 i32.const 34752 + i32.const 34800 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2914,6 +3174,181 @@ global.set $~lib/memory/__stack_pointer local.get $0 ) + (func $~lib/map/Map#set (type $i32_i32_i32_=>_none) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1956 + i32.lt_s + if + i32.const 34752 + i32.const 34800 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $0 + i32.load $0 + local.get $1 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $3 + i32.const 15 + i32.shr_u + local.get $3 + i32.xor + i32.const -2048144777 + i32.mul + local.tee $3 + i32.const 13 + i32.shr_u + local.get $3 + i32.xor + i32.const -1028477379 + i32.mul + local.tee $3 + i32.const 16 + i32.shr_u + local.get $3 + i32.xor + local.tee $4 + local.get $0 + i32.load $0 offset=4 + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $3 + block $__inlined_func$~lib/map/Map#find + loop $while-continue|0 + local.get $3 + if + local.get $3 + i32.load $0 offset=8 + local.tee $5 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $1 + local.get $3 + i32.load $0 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find + local.get $5 + i32.const -2 + i32.and + local.set $3 + br $while-continue|0 + end + end + i32.const 0 + local.set $3 + end + local.get $3 + if + local.get $3 + local.get $2 + i32.store $0 offset=4 + else + local.get $0 + i32.load $0 offset=16 + local.get $0 + i32.load $0 offset=12 + i32.eq + if + local.get $0 + local.get $0 + i32.load $0 offset=20 + local.get $0 + i32.load $0 offset=12 + i32.const 3 + i32.mul + i32.const 4 + i32.div_s + i32.lt_s + if (result i32) + local.get $0 + i32.load $0 offset=4 + else + local.get $0 + i32.load $0 offset=4 + i32.const 1 + i32.shl + i32.const 1 + i32.or + end + call $~lib/map/Map#rehash + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.load $0 offset=8 + local.tee $3 + i32.store $0 + local.get $0 + local.get $0 + i32.load $0 offset=16 + local.tee $5 + i32.const 1 + i32.add + i32.store $0 offset=16 + local.get $3 + local.get $5 + i32.const 12 + i32.mul + i32.add + local.tee $3 + local.get $1 + i32.store $0 + local.get $3 + local.get $2 + i32.store $0 offset=4 + local.get $0 + local.get $0 + i32.load $0 offset=20 + i32.const 1 + i32.add + i32.store $0 offset=20 + local.get $3 + local.get $0 + i32.load $0 + local.get $4 + local.get $0 + i32.load $0 offset=4 + i32.and + i32.const 2 + i32.shl + i32.add + local.tee $0 + i32.load $0 + i32.store $0 offset=8 + local.get $0 + local.get $3 + i32.store $0 + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) (func $std/weakref/Dummy#constructor (type $none_=>_i32) (result i32) (local $0 i32) (local $1 i32) @@ -2923,7 +3358,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 1912 + i32.const 1956 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2942,7 +3377,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1912 + i32.const 1956 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2972,8 +3407,8 @@ local.get $0 return end - i32.const 34704 i32.const 34752 + i32.const 34800 i32.const 1 i32.const 1 call $~lib/builtins/abort From 7830a3bae0670a66720e00300cad0659062b632a Mon Sep 17 00:00:00 2001 From: Bach Le Date: Tue, 20 Dec 2022 23:03:57 +0800 Subject: [PATCH 04/14] Lint --- std/assembly/finalizationregistry.ts | 13 +++---------- std/assembly/weakref.ts | 9 +++------ 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/std/assembly/finalizationregistry.ts b/std/assembly/finalizationregistry.ts index f5cc855abd..eb9657c33e 100644 --- a/std/assembly/finalizationregistry.ts +++ b/std/assembly/finalizationregistry.ts @@ -1,18 +1,11 @@ // @ts-ignore: decorators -@lazy -let CURRENT_COOKIE: u32 = 0; +@lazy let PREVIOUS_FINALIZER: i32 = 0; // @ts-ignore: decorators -@lazy -let PREVIOUS_FINALIZER: i32 = 0; +@lazy let INITIALIZED: boolean = false; // @ts-ignore: decorators -@lazy -let INITIALIZED: boolean = false; - -// @ts-ignore: decorators -@lazy -let ALL_REGISTRIES: BaseRegistry | null = null; +@lazy let ALL_REGISTRIES: BaseRegistry | null = null; abstract class BaseRegistry { private next: BaseRegistry | null; diff --git a/std/assembly/weakref.ts b/std/assembly/weakref.ts index e9ae820e55..57089d070a 100644 --- a/std/assembly/weakref.ts +++ b/std/assembly/weakref.ts @@ -1,14 +1,11 @@ // @ts-ignore: decorators -@lazy -const ALL_REFERENCES: Map = new Map(); +@lazy const ALL_REFERENCES: Map = new Map(); // @ts-ignore: decorators -@lazy -let CURRENT_COOKIE: u32 = 0; +@lazy let CURRENT_COOKIE: u32 = 0; // @ts-ignore: decorators -@lazy -const REGISTRY: FinalizationRegistry = new FinalizationRegistry( +@lazy const REGISTRY: FinalizationRegistry = new FinalizationRegistry( (ptr: usize) => { if (ALL_REFERENCES.delete(ptr)) { // The memory block could be reused by the allocator after this point From 8008f1ec42305b746050b8fdd2ff493ee239d2b1 Mon Sep 17 00:00:00 2001 From: Bach Le Date: Tue, 20 Dec 2022 23:39:53 +0800 Subject: [PATCH 05/14] Add support for multiple WeakRef on the same object --- std/assembly/weakref.ts | 15 +- tests/compiler/std/weakref.debug.wat | 542 +++++++--- tests/compiler/std/weakref.js | 3 + tests/compiler/std/weakref.release.wat | 1304 ++++++++++++++---------- tests/compiler/std/weakref.ts | 60 +- 5 files changed, 1222 insertions(+), 702 deletions(-) create mode 100644 tests/compiler/std/weakref.js diff --git a/std/assembly/weakref.ts b/std/assembly/weakref.ts index 57089d070a..5ee4af9266 100644 --- a/std/assembly/weakref.ts +++ b/std/assembly/weakref.ts @@ -21,13 +21,16 @@ export class WeakRef { constructor(value: T) { assert(isReference() && !isNullable()); - const ref = changetype(value); - const cookie = CURRENT_COOKIE; - ALL_REFERENCES.set(ref, cookie); - REGISTRY.register(ref, ref); + this.ref = changetype(value); - this.ref = ref; - this.cookie = cookie; + if (ALL_REFERENCES.has(this.ref)) { + this.cookie = ALL_REFERENCES.get(this.ref); + } else { + this.cookie = CURRENT_COOKIE; + ALL_REFERENCES.set(this.ref, this.cookie); + // Avoid creating many variances of register + REGISTRY.register(this.ref, this.ref); + } } deref(): T | null { diff --git a/tests/compiler/std/weakref.debug.wat b/tests/compiler/std/weakref.debug.wat index a6dadd43ae..9fb9e9086e 100644 --- a/tests/compiler/std/weakref.debug.wat +++ b/tests/compiler/std/weakref.debug.wat @@ -9,7 +9,6 @@ (type $none_=>_i32 (func_subtype (result i32) func)) (type $i32_i32_i32_i32_=>_none (func_subtype (param i32 i32 i32 i32) func)) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (global $~lib/weakref/CURRENT_COOKIE (mut i32) (i32.const 0)) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -27,18 +26,17 @@ (global $~lib/native/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/native/ASC_RUNTIME i32 (i32.const 2)) (global $~lib/weakref/ALL_REFERENCES (mut i32) (i32.const 0)) + (global $~lib/weakref/CURRENT_COOKIE (mut i32) (i32.const 0)) (global $~lib/finalizationregistry/ALL_REGISTRIES (mut i32) (i32.const 0)) (global $~lib/finalizationregistry/INITIALIZED (mut i32) (i32.const 0)) (global $~lib/finalizationregistry/PREVIOUS_FINALIZER (mut i32) (i32.const 0)) (global $~lib/weakref/REGISTRY (mut i32) (i32.const 0)) - (global $std/weakref/weakref (mut i32) (i32.const 0)) (global $std/weakref/globalRefs i32 (i32.const 800)) - (global $std/weakref/weakref2 (mut i32) (i32.const 0)) (global $~argumentsLength (mut i32) (i32.const 0)) - (global $~lib/rt/__rtti_base i32 (i32.const 880)) - (global $~lib/memory/__data_end i32 (i32.const 932)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 33700)) - (global $~lib/memory/__heap_base i32 (i32.const 33700)) + (global $~lib/rt/__rtti_base i32 (i32.const 1008)) + (global $~lib/memory/__data_end i32 (i32.const 1060)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 33828)) + (global $~lib/memory/__heap_base i32 (i32.const 33828)) (memory $0 1) (data (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") (data (i32.const 76) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") @@ -50,19 +48,25 @@ (data (i32.const 348) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 412) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1c\00\00\00I\00n\00v\00a\00l\00i\00d\00 \00l\00e\00n\00g\00t\00h\00") (data (i32.const 460) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00&\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00\00\00\00\00\00\00") - (data (i32.const 524) "\1c\00\00\00\00\00\00\00\00\00\00\00\n\00\00\00\08\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 556) "\1c\00\00\00\00\00\00\00\00\00\00\00\n\00\00\00\08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 588) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\00K\00e\00y\00 \00d\00o\00e\00s\00 \00n\00o\00t\00 \00e\00x\00i\00s\00t\00\00\00\00\00\00\00\00\00") - (data (i32.const 652) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\00~\00l\00i\00b\00/\00m\00a\00p\00.\00t\00s\00\00\00\00\00\00\00") + (data (i32.const 524) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\00K\00e\00y\00 \00d\00o\00e\00s\00 \00n\00o\00t\00 \00e\00x\00i\00s\00t\00\00\00\00\00\00\00\00\00") + (data (i32.const 588) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\00~\00l\00i\00b\00/\00m\00a\00p\00.\00t\00s\00\00\00\00\00\00\00") + (data (i32.const 636) "\1c\00\00\00\00\00\00\00\00\00\00\00\n\00\00\00\08\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 668) "\1c\00\00\00\00\00\00\00\00\00\00\00\n\00\00\00\08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 700) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1c\00\00\00s\00t\00d\00/\00w\00e\00a\00k\00r\00e\00f\00.\00t\00s\00") (data (i32.const 748) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 780) ",\00\00\00\00\00\00\00\00\00\00\00\0b\00\00\00\10\00\00\00\00\03\00\00\00\03\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 828) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") - (data (i32.const 880) "\0c\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00\10\01\02\00\00\00\00\00\00\00\00\00\10\01\02\00\00\00\00\00\02A\00\00") + (data (i32.const 876) "|\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1008) "\0c\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00\10\01\02\00\00\00\00\00\00\00\00\00\10\01\02\00\00\00\00\00\02A\00\00") (table $0 3 3 funcref) (elem $0 (i32.const 1) $~lib/finalizationregistry/BaseRegistry.finalizeAll $start:~lib/weakref~anonymous|0) (export "memory" (memory $0)) (start $~start) + (func $~lib/weakref/WeakRef#set:ref (type $i32_i32_=>_none) (param $this i32) (param $ref i32) + local.get $this + local.get $ref + i32.store $0 + ) (func $~lib/rt/itcms/Object#set:nextWithColor (type $i32_i32_=>_none) (param $this i32) (param $nextWithColor i32) local.get $this local.get $nextWithColor @@ -2368,6 +2372,10 @@ local.get $entriesCount i32.store $0 offset=20 ) + (func $~lib/weakref/WeakRef#get:ref (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + ) (func $~lib/util/hash/HASH (type $i32_=>_i32) (param $key i32) (result i32) (local $key|1 i32) (local $len i32) @@ -2500,6 +2508,51 @@ i32.const 0 return ) + (func $~lib/map/Map#has (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + local.get $this + local.get $key + local.get $key + call $~lib/util/hash/HASH + call $~lib/map/Map#find + i32.const 0 + i32.ne + return + ) + (func $~lib/map/MapEntry#get:value (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) + (func $~lib/map/Map#get (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + (local $entry i32) + local.get $this + local.get $key + local.get $key + call $~lib/util/hash/HASH + call $~lib/map/Map#find + local.set $entry + local.get $entry + i32.eqz + if + i32.const 544 + i32.const 608 + i32.const 105 + i32.const 17 + call $~lib/builtins/abort + unreachable + end + local.get $entry + call $~lib/map/MapEntry#get:value + return + ) + (func $~lib/weakref/WeakRef#set:cookie (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) + local.get $this + local.get $cookie + i32.store $0 offset=4 + ) + (func $~lib/weakref/WeakRef#get:cookie (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) (func $~lib/map/MapEntry#set:value (type $i32_i32_=>_none) (param $this i32) (param $value i32) local.get $this local.get $value @@ -2526,10 +2579,6 @@ local.get $key i32.store $0 ) - (func $~lib/map/MapEntry#get:value (type $i32_=>_i32) (param $this i32) (result i32) - local.get $this - i32.load $0 offset=4 - ) (func $~lib/map/MapEntry#set:taggedNext (type $i32_i32_=>_none) (param $this i32) (param $taggedNext i32) local.get $this local.get $taggedNext @@ -3118,56 +3167,6 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/weakref/WeakRef#set:ref (type $i32_i32_=>_none) (param $this i32) (param $ref i32) - local.get $this - local.get $ref - i32.store $0 - ) - (func $~lib/weakref/WeakRef#set:cookie (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) - local.get $this - local.get $cookie - i32.store $0 offset=4 - ) - (func $~lib/weakref/WeakRef#get:ref (type $i32_=>_i32) (param $this i32) (result i32) - local.get $this - i32.load $0 - ) - (func $~lib/map/Map#has (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) - local.get $this - local.get $key - local.get $key - call $~lib/util/hash/HASH - call $~lib/map/Map#find - i32.const 0 - i32.ne - return - ) - (func $~lib/map/Map#get (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) - (local $entry i32) - local.get $this - local.get $key - local.get $key - call $~lib/util/hash/HASH - call $~lib/map/Map#find - local.set $entry - local.get $entry - i32.eqz - if - i32.const 608 - i32.const 672 - i32.const 105 - i32.const 17 - call $~lib/builtins/abort - unreachable - end - local.get $entry - call $~lib/map/MapEntry#get:value - return - ) - (func $~lib/weakref/WeakRef#get:cookie (type $i32_=>_i32) (param $this i32) (result i32) - local.get $this - i32.load $0 offset=4 - ) (func $~lib/rt/itcms/__collect (type $none_=>_none) i32.const 0 drop @@ -3447,8 +3446,8 @@ local.get $entry i32.eqz if + i32.const 544 i32.const 608 - i32.const 672 i32.const 105 i32.const 17 call $~lib/builtins/abort @@ -3575,13 +3574,6 @@ local.get $0 call $~lib/rt/itcms/__visit end - global.get $std/weakref/weakref - local.tee $1 - if - local.get $1 - local.get $0 - call $~lib/rt/itcms/__visit - end global.get $std/weakref/globalRefs local.tee $1 if @@ -3589,20 +3581,16 @@ local.get $0 call $~lib/rt/itcms/__visit end - global.get $std/weakref/weakref2 - local.tee $1 - if - local.get $1 - local.get $0 - call $~lib/rt/itcms/__visit - end i32.const 224 local.get $0 call $~lib/rt/itcms/__visit i32.const 432 local.get $0 call $~lib/rt/itcms/__visit - i32.const 608 + i32.const 896 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 544 local.get $0 call $~lib/rt/itcms/__visit i32.const 32 @@ -3855,8 +3843,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 33728 - i32.const 33776 + i32.const 33856 + i32.const 33904 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4087,7 +4075,7 @@ if global.get $~lib/rt/__finalize global.set $~lib/finalizationregistry/PREVIOUS_FINALIZER - i32.const 544 + i32.const 656 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -4162,9 +4150,7 @@ global.set $~lib/memory/__stack_pointer ) (func $~lib/weakref/WeakRef#constructor (type $i32_i32_=>_i32) (param $this i32) (param $value i32) (result i32) - (local $ref i32) - (local $cookie i32) - (local $4 i32) + (local $2 i32) global.get $~lib/memory/__stack_pointer i32.const 8 i32.sub @@ -4192,42 +4178,65 @@ i32.const 0 i32.eqz drop + local.get $this local.get $value - local.set $ref - global.get $~lib/weakref/CURRENT_COOKIE - local.set $cookie + call $~lib/weakref/WeakRef#set:ref global.get $~lib/weakref/ALL_REFERENCES - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store $0 offset=4 - local.get $4 - local.get $ref - local.get $cookie - call $~lib/map/Map#set - drop - global.get $~lib/weakref/REGISTRY - local.set $4 + local.set $2 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $2 i32.store $0 offset=4 - local.get $4 - local.get $ref - local.get $ref - call $~lib/finalizationregistry/FinalizationRegistry#register - local.get $this - local.get $ref - call $~lib/weakref/WeakRef#set:ref + local.get $2 local.get $this - local.get $cookie - call $~lib/weakref/WeakRef#set:cookie + call $~lib/weakref/WeakRef#get:ref + call $~lib/map/Map#has + if + local.get $this + global.get $~lib/weakref/ALL_REFERENCES + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=4 + local.get $2 + local.get $this + call $~lib/weakref/WeakRef#get:ref + call $~lib/map/Map#get + call $~lib/weakref/WeakRef#set:cookie + else + local.get $this + global.get $~lib/weakref/CURRENT_COOKIE + call $~lib/weakref/WeakRef#set:cookie + global.get $~lib/weakref/ALL_REFERENCES + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=4 + local.get $2 + local.get $this + call $~lib/weakref/WeakRef#get:ref + local.get $this + call $~lib/weakref/WeakRef#get:cookie + call $~lib/map/Map#set + drop + global.get $~lib/weakref/REGISTRY + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=4 + local.get $2 + local.get $this + call $~lib/weakref/WeakRef#get:ref + local.get $this + call $~lib/weakref/WeakRef#get:ref + call $~lib/finalizationregistry/FinalizationRegistry#register + end local.get $this - local.set $4 + local.set $2 global.get $~lib/memory/__stack_pointer i32.const 8 i32.add global.set $~lib/memory/__stack_pointer - local.get $4 + local.get $2 ) (func $std/weakref/produceDummy (type $none_=>_i32) (result i32) (local $0 i32) @@ -4314,7 +4323,7 @@ end unreachable ) - (func $std/weakref/makeDummy (type $none_=>_i32) (result i32) + (func $std/weakref/makeRefencedDummy (type $none_=>_i32) (result i32) (local $instance i32) (local $1 i32) global.get $~lib/memory/__stack_pointer @@ -4350,18 +4359,57 @@ local.get $1 return ) + (func $std/weakref/grabGlobalRef (type $none_=>_i32) (result i32) + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + i32.const 0 + global.get $std/weakref/globalRefs + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store $0 + local.get $0 + i32.const 0 + call $~lib/array/Array#__get + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store $0 + local.get $0 + call $~lib/weakref/WeakRef#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + return + ) (func $start:std/weakref (type $none_=>_none) (local $0 i32) (local $1 i32) (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 28 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store $0 + i32.const 0 + i32.const 28 + memory.fill $0 memory.size $0 i32.const 16 i32.shl @@ -4383,22 +4431,19 @@ call $~lib/map/Map#constructor global.set $~lib/weakref/ALL_REFERENCES i32.const 0 - i32.const 576 - local.set $2 + i32.const 688 + local.set $7 global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $7 i32.store $0 - local.get $2 + local.get $7 call $~lib/finalizationregistry/FinalizationRegistry#constructor global.set $~lib/weakref/REGISTRY - call $std/weakref/produceDummy - global.set $std/weakref/weakref - global.get $std/weakref/weakref - local.set $2 global.get $~lib/memory/__stack_pointer - local.get $2 + call $std/weakref/produceDummy + local.tee $0 i32.store $0 offset=4 - local.get $2 + local.get $0 call $~lib/weakref/WeakRef#deref i32.const 0 i32.ne @@ -4406,18 +4451,66 @@ if i32.const 0 i32.const 720 - i32.const 10 - i32.const 1 + i32.const 11 + i32.const 3 call $~lib/builtins/abort unreachable end call $~lib/rt/itcms/__collect - global.get $std/weakref/weakref - local.set $2 + local.get $0 + call $~lib/weakref/WeakRef#deref + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 13 + i32.const 3 + call $~lib/builtins/abort + unreachable + end global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store $0 offset=4 - local.get $2 + call $std/weakref/makeRefencedDummy + local.tee $3 + i32.store $0 offset=8 + local.get $3 + call $~lib/weakref/WeakRef#deref + i32.const 0 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 28 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + call $~lib/rt/itcms/__collect + local.get $3 + call $~lib/weakref/WeakRef#deref + i32.const 0 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 32 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $std/weakref/globalRefs + local.set $7 + global.get $~lib/memory/__stack_pointer + local.get $7 + i32.store $0 offset=12 + local.get $7 + i32.const 0 + call $~lib/array/Array#set:length + call $~lib/rt/itcms/__collect + local.get $3 call $~lib/weakref/WeakRef#deref i32.const 0 i32.eq @@ -4425,19 +4518,20 @@ if i32.const 0 i32.const 720 - i32.const 12 - i32.const 1 + i32.const 36 + i32.const 3 call $~lib/builtins/abort unreachable end - call $std/weakref/makeDummy - global.set $std/weakref/weakref2 - global.get $std/weakref/weakref2 - local.set $2 global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store $0 offset=4 - local.get $2 + call $std/weakref/makeRefencedDummy + local.tee $4 + i32.store $0 offset=16 + global.get $~lib/memory/__stack_pointer + call $std/weakref/produceDummy + local.tee $5 + i32.store $0 offset=20 + local.get $4 call $~lib/weakref/WeakRef#deref i32.const 0 i32.ne @@ -4445,18 +4539,56 @@ if i32.const 0 i32.const 720 - i32.const 25 - i32.const 1 + i32.const 51 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $5 + call $~lib/weakref/WeakRef#deref + i32.const 0 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 52 + i32.const 3 call $~lib/builtins/abort unreachable end call $~lib/rt/itcms/__collect - global.get $std/weakref/weakref2 - local.set $2 + local.get $4 + call $~lib/weakref/WeakRef#deref + i32.const 0 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 55 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $5 + call $~lib/weakref/WeakRef#deref + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 56 + i32.const 3 + call $~lib/builtins/abort + unreachable + end global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store $0 offset=4 - local.get $2 + call $std/weakref/grabGlobalRef + local.tee $6 + i32.store $0 offset=24 + local.get $4 call $~lib/weakref/WeakRef#deref i32.const 0 i32.ne @@ -4464,26 +4596,34 @@ if i32.const 0 i32.const 720 - i32.const 29 - i32.const 1 + i32.const 59 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $6 + call $~lib/weakref/WeakRef#deref + i32.const 0 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 60 + i32.const 3 call $~lib/builtins/abort unreachable end global.get $std/weakref/globalRefs - local.set $2 + local.set $7 global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store $0 offset=4 - local.get $2 + local.get $7 + i32.store $0 offset=12 + local.get $7 i32.const 0 call $~lib/array/Array#set:length call $~lib/rt/itcms/__collect - global.get $std/weakref/weakref2 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store $0 offset=4 - local.get $2 + local.get $4 call $~lib/weakref/WeakRef#deref i32.const 0 i32.eq @@ -4491,13 +4631,26 @@ if i32.const 0 i32.const 720 - i32.const 33 - i32.const 1 + i32.const 65 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $6 + call $~lib/weakref/WeakRef#deref + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 66 + i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 28 i32.add global.set $~lib/memory/__stack_pointer ) @@ -4905,4 +5058,61 @@ global.set $~lib/memory/__stack_pointer local.get $1 ) + (func $~lib/array/Array#__get (type $i32_i32_=>_i32) (param $this i32) (param $index i32) (result i32) + (local $value i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $index + local.get $this + call $~lib/array/Array#get:length_ + i32.ge_u + if + i32.const 224 + i32.const 848 + i32.const 114 + i32.const 42 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.get $this + call $~lib/array/Array#get:dataStart + local.get $index + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.tee $value + i32.store $0 + i32.const 1 + drop + i32.const 0 + i32.eqz + drop + local.get $value + i32.eqz + if + i32.const 896 + i32.const 848 + i32.const 118 + i32.const 40 + call $~lib/builtins/abort + unreachable + end + local.get $value + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + ) ) diff --git a/tests/compiler/std/weakref.js b/tests/compiler/std/weakref.js new file mode 100644 index 0000000000..63c21f79c3 --- /dev/null +++ b/tests/compiler/std/weakref.js @@ -0,0 +1,3 @@ +export function preInstantiate(imports, exports) { + imports.env["console.log"] = console.log; +} diff --git a/tests/compiler/std/weakref.release.wat b/tests/compiler/std/weakref.release.wat index 95a79ad3aa..3b00ada813 100644 --- a/tests/compiler/std/weakref.release.wat +++ b/tests/compiler/std/weakref.release.wat @@ -2,13 +2,12 @@ (type $i32_=>_none (func_subtype (param i32) func)) (type $none_=>_none (func_subtype func)) (type $i32_i32_=>_none (func_subtype (param i32 i32) func)) + (type $none_=>_i32 (func_subtype (result i32) func)) (type $i32_i32_=>_i32 (func_subtype (param i32 i32) (result i32) func)) (type $i32_i32_i32_=>_none (func_subtype (param i32 i32 i32) func)) (type $i32_=>_i32 (func_subtype (param i32) (result i32) func)) - (type $none_=>_i32 (func_subtype (result i32) func)) (type $i32_i32_i32_i32_=>_none (func_subtype (param i32 i32 i32 i32) func)) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (global $~lib/weakref/CURRENT_COOKIE (mut i32) (i32.const 0)) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -21,13 +20,12 @@ (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~lib/weakref/ALL_REFERENCES (mut i32) (i32.const 0)) + (global $~lib/weakref/CURRENT_COOKIE (mut i32) (i32.const 0)) (global $~lib/finalizationregistry/ALL_REGISTRIES (mut i32) (i32.const 0)) (global $~lib/finalizationregistry/INITIALIZED (mut i32) (i32.const 0)) (global $~lib/finalizationregistry/PREVIOUS_FINALIZER (mut i32) (i32.const 0)) (global $~lib/weakref/REGISTRY (mut i32) (i32.const 0)) - (global $std/weakref/weakref (mut i32) (i32.const 0)) - (global $std/weakref/weakref2 (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34724)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34852)) (memory $0 1) (data (i32.const 1036) "<") (data (i32.const 1048) "\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") @@ -43,14 +41,14 @@ (data (i32.const 1448) "\02\00\00\00\1c\00\00\00I\00n\00v\00a\00l\00i\00d\00 \00l\00e\00n\00g\00t\00h") (data (i32.const 1484) "<") (data (i32.const 1496) "\02\00\00\00&\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s") - (data (i32.const 1548) "\1c") - (data (i32.const 1560) "\n\00\00\00\08\00\00\00\01") - (data (i32.const 1580) "\1c") - (data (i32.const 1592) "\n\00\00\00\08\00\00\00\02") - (data (i32.const 1612) "<") - (data (i32.const 1624) "\02\00\00\00$\00\00\00K\00e\00y\00 \00d\00o\00e\00s\00 \00n\00o\00t\00 \00e\00x\00i\00s\00t") - (data (i32.const 1676) ",") - (data (i32.const 1688) "\02\00\00\00\16\00\00\00~\00l\00i\00b\00/\00m\00a\00p\00.\00t\00s") + (data (i32.const 1548) "<") + (data (i32.const 1560) "\02\00\00\00$\00\00\00K\00e\00y\00 \00d\00o\00e\00s\00 \00n\00o\00t\00 \00e\00x\00i\00s\00t") + (data (i32.const 1612) ",") + (data (i32.const 1624) "\02\00\00\00\16\00\00\00~\00l\00i\00b\00/\00m\00a\00p\00.\00t\00s") + (data (i32.const 1660) "\1c") + (data (i32.const 1672) "\n\00\00\00\08\00\00\00\01") + (data (i32.const 1692) "\1c") + (data (i32.const 1704) "\n\00\00\00\08\00\00\00\02") (data (i32.const 1724) ",") (data (i32.const 1736) "\02\00\00\00\1c\00\00\00s\00t\00d\00/\00w\00e\00a\00k\00r\00e\00f\00.\00t\00s") (data (i32.const 1772) "\1c") @@ -59,8 +57,10 @@ (data (i32.const 1816) "\0b\00\00\00\10\00\00\00\00\07\00\00\00\07") (data (i32.const 1852) ",") (data (i32.const 1864) "\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") - (data (i32.const 1904) "\0c\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00\10\01\02") - (data (i32.const 1944) "\10\01\02\00\00\00\00\00\02A") + (data (i32.const 1900) "|") + (data (i32.const 1912) "\02\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y") + (data (i32.const 2032) "\0c\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00\10\01\02") + (data (i32.const 2072) "\10\01\02\00\00\00\00\00\02A") (table $0 3 3 funcref) (elem $0 (i32.const 1) $~lib/finalizationregistry/BaseRegistry.finalizeAll $start:~lib/weakref~anonymous|0) (export "memory" (memory $0)) @@ -86,25 +86,15 @@ local.get $0 call $byn-split-outlined-A$~lib/rt/itcms/__visit end - global.get $std/weakref/weakref - local.tee $0 - if - local.get $0 - call $byn-split-outlined-A$~lib/rt/itcms/__visit - end i32.const 1824 call $byn-split-outlined-A$~lib/rt/itcms/__visit - global.get $std/weakref/weakref2 - local.tee $0 - if - local.get $0 - call $byn-split-outlined-A$~lib/rt/itcms/__visit - end i32.const 1248 call $byn-split-outlined-A$~lib/rt/itcms/__visit i32.const 1456 call $byn-split-outlined-A$~lib/rt/itcms/__visit - i32.const 1632 + i32.const 1920 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + i32.const 1568 call $byn-split-outlined-A$~lib/rt/itcms/__visit i32.const 1056 call $byn-split-outlined-A$~lib/rt/itcms/__visit @@ -181,7 +171,7 @@ i32.load $0 offset=8 i32.eqz local.get $0 - i32.const 34724 + i32.const 34852 i32.lt_u i32.and i32.eqz @@ -230,7 +220,7 @@ i32.const 1 else local.get $1 - i32.const 1904 + i32.const 2032 i32.load $0 i32.gt_u if @@ -244,7 +234,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 1908 + i32.const 2036 i32.add i32.load $0 i32.const 32 @@ -809,10 +799,10 @@ if unreachable end - i32.const 34736 + i32.const 34864 i32.const 0 i32.store $0 - i32.const 36304 + i32.const 36432 i32.const 0 i32.store $0 loop $for-loop|0 @@ -823,7 +813,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 34736 + i32.const 34864 i32.add i32.const 0 i32.store $0 offset=4 @@ -841,7 +831,7 @@ i32.add i32.const 2 i32.shl - i32.const 34736 + i32.const 34864 i32.add i32.const 0 i32.store $0 offset=96 @@ -859,13 +849,13 @@ br $for-loop|0 end end - i32.const 34736 - i32.const 36308 + i32.const 34864 + i32.const 36436 memory.size $0 i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 34736 + i32.const 34864 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (type $none_=>_i32) (result i32) @@ -950,7 +940,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 34724 + i32.const 34852 i32.lt_u if local.get $0 @@ -1050,7 +1040,7 @@ unreachable end local.get $0 - i32.const 34724 + i32.const 34852 i32.lt_u if local.get $0 @@ -1081,7 +1071,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 34724 + i32.const 34852 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1575,6 +1565,87 @@ memory.fill $0 local.get $1 ) + (func $~lib/map/Map#get (type $i32_i32_=>_i32) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $0 + i32.load $0 + local.get $0 + i32.load $0 offset=4 + local.get $1 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $0 + i32.const 15 + i32.shr_u + local.get $0 + i32.xor + i32.const -2048144777 + i32.mul + local.tee $0 + i32.const 13 + i32.shr_u + local.get $0 + i32.xor + i32.const -1028477379 + i32.mul + local.tee $0 + i32.const 16 + i32.shr_u + local.get $0 + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $0 + block $__inlined_func$~lib/map/Map#find + loop $while-continue|0 + local.get $0 + if + local.get $0 + i32.load $0 offset=8 + local.tee $2 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $0 + i32.load $0 + local.get $1 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find + local.get $2 + i32.const -2 + i32.and + local.set $0 + br $while-continue|0 + end + end + i32.const 0 + local.set $0 + end + local.get $0 + i32.eqz + if + i32.const 1568 + i32.const 1632 + i32.const 105 + i32.const 17 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.load $0 offset=4 + ) (func $~lib/map/Map#rehash (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) (local $2 i32) (local $3 i32) @@ -1588,11 +1659,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1956 + i32.const 2084 i32.lt_s if - i32.const 34752 - i32.const 34800 + i32.const 34880 + i32.const 34928 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -1753,7 +1824,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 1956 + i32.const 2084 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1780,7 +1851,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1956 + i32.const 2084 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1912,8 +1983,8 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 34752 - i32.const 34800 + i32.const 34880 + i32.const 34928 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2043,87 +2114,6 @@ end i32.const 1 ) - (func $~lib/map/Map#get (type $i32_i32_=>_i32) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - local.get $0 - i32.load $0 - local.get $0 - i32.load $0 offset=4 - local.get $1 - i32.const -1028477379 - i32.mul - i32.const 374761397 - i32.add - i32.const 17 - i32.rotl - i32.const 668265263 - i32.mul - local.tee $0 - i32.const 15 - i32.shr_u - local.get $0 - i32.xor - i32.const -2048144777 - i32.mul - local.tee $0 - i32.const 13 - i32.shr_u - local.get $0 - i32.xor - i32.const -1028477379 - i32.mul - local.tee $0 - i32.const 16 - i32.shr_u - local.get $0 - i32.xor - i32.and - i32.const 2 - i32.shl - i32.add - i32.load $0 - local.set $0 - block $__inlined_func$~lib/map/Map#find - loop $while-continue|0 - local.get $0 - if - local.get $0 - i32.load $0 offset=8 - local.tee $2 - i32.const 1 - i32.and - if (result i32) - i32.const 0 - else - local.get $0 - i32.load $0 - local.get $1 - i32.eq - end - br_if $__inlined_func$~lib/map/Map#find - local.get $2 - i32.const -2 - i32.and - local.set $0 - br $while-continue|0 - end - end - i32.const 0 - local.set $0 - end - local.get $0 - i32.eqz - if - i32.const 1632 - i32.const 1696 - i32.const 105 - i32.const 17 - call $~lib/builtins/abort - unreachable - end - local.get $0 - i32.load $0 offset=4 - ) (func $~lib/rt/itcms/__collect (type $none_=>_none) global.get $~lib/rt/itcms/state i32.const 0 @@ -2408,51 +2398,500 @@ end ) (func $~start (type $none_=>_none) - (local $0 i32) + call $start:std/weakref + ) + (func $start:~lib/weakref~anonymous|0 (type $i32_=>_none) (param $0 i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2084 + i32.lt_s + if + i32.const 34880 + i32.const 34928 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 0 + i32.store $0 + local.get $1 + global.get $~lib/weakref/ALL_REFERENCES + local.tee $1 + i32.store $0 + local.get $1 + local.get $0 + call $~lib/map/Map#delete + if + global.get $~lib/weakref/CURRENT_COOKIE + i32.const 1 + i32.add + global.set $~lib/weakref/CURRENT_COOKIE + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/weakref/WeakRef#constructor (type $i32_=>_i32) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) + (local $3 i32) + (local $4 i32) global.get $~lib/memory/__stack_pointer i32.const 8 i32.sub global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 1956 + i32.const 2084 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer - local.tee $0 + local.tee $1 i64.const 0 i64.store $0 - memory.size $0 - i32.const 16 - i32.shl - i32.const 34724 - i32.sub - i32.const 1 - i32.shr_u - global.set $~lib/rt/itcms/threshold - i32.const 1172 - i32.const 1168 - i32.store $0 - i32.const 1176 - i32.const 1168 - i32.store $0 - i32.const 1168 - global.set $~lib/rt/itcms/pinSpace - i32.const 1204 - i32.const 1200 - i32.store $0 - i32.const 1208 - i32.const 1200 + local.get $1 + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $1 i32.store $0 - i32.const 1200 - global.set $~lib/rt/itcms/toSpace - i32.const 1348 - i32.const 1344 + local.get $1 + i32.const 0 i32.store $0 - i32.const 1352 - i32.const 1344 + local.get $1 + i32.const 0 + i32.store $0 offset=4 + local.get $1 + local.get $0 + i32.store $0 + global.get $~lib/memory/__stack_pointer + global.get $~lib/weakref/ALL_REFERENCES + local.tee $0 + i32.store $0 offset=4 + local.get $0 + i32.load $0 + local.get $0 + i32.load $0 offset=4 + local.get $1 + i32.load $0 + local.tee $2 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $0 + local.get $0 + i32.const 15 + i32.shr_u + i32.xor + i32.const -2048144777 + i32.mul + local.tee $0 + local.get $0 + i32.const 13 + i32.shr_u + i32.xor + i32.const -1028477379 + i32.mul + local.tee $0 + local.get $0 + i32.const 16 + i32.shr_u + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $0 + block $__inlined_func$~lib/map/Map#find + loop $while-continue|0 + local.get $0 + if + local.get $0 + i32.load $0 offset=8 + local.tee $3 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $0 + i32.load $0 + local.get $2 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find + local.get $3 + i32.const -2 + i32.and + local.set $0 + br $while-continue|0 + end + end + i32.const 0 + local.set $0 + end + local.get $0 + if + global.get $~lib/memory/__stack_pointer + global.get $~lib/weakref/ALL_REFERENCES + local.tee $0 + i32.store $0 offset=4 + local.get $1 + local.get $0 + local.get $1 + i32.load $0 + call $~lib/map/Map#get + i32.store $0 offset=4 + else + local.get $1 + global.get $~lib/weakref/CURRENT_COOKIE + i32.store $0 offset=4 + global.get $~lib/memory/__stack_pointer + global.get $~lib/weakref/ALL_REFERENCES + local.tee $0 + i32.store $0 offset=4 + local.get $0 + local.get $1 + i32.load $0 + local.get $1 + i32.load $0 offset=4 + call $~lib/map/Map#set + global.get $~lib/memory/__stack_pointer + global.get $~lib/weakref/REGISTRY + local.tee $2 + i32.store $0 offset=4 + local.get $1 + i32.load $0 + local.set $3 + local.get $1 + i32.load $0 + local.set $4 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2084 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $0 + i32.const 0 + i32.store $0 + local.get $0 + local.get $2 + i32.load $0 offset=4 + local.tee $0 + i32.store $0 + local.get $0 + local.get $3 + local.get $4 + call $~lib/map/Map#set + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + return + end + i32.const 34880 + i32.const 34928 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $std/weakref/produceDummy (type $none_=>_i32) (result i32) + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2084 + i32.lt_s + if + i32.const 34880 + i32.const 34928 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + call $std/weakref/Dummy#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store $0 + local.get $0 + call $~lib/weakref/WeakRef#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $~lib/weakref/WeakRef#deref (type $i32_=>_i32) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2084 + i32.lt_s + if + i32.const 34880 + i32.const 34928 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 0 + i32.store $0 + local.get $0 + i32.load $0 + local.set $2 + local.get $1 + global.get $~lib/weakref/ALL_REFERENCES + local.tee $1 + i32.store $0 + local.get $1 + i32.load $0 + local.get $1 + i32.load $0 offset=4 + local.get $2 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $1 + local.get $1 + i32.const 15 + i32.shr_u + i32.xor + i32.const -2048144777 + i32.mul + local.tee $1 + local.get $1 + i32.const 13 + i32.shr_u + i32.xor + i32.const -1028477379 + i32.mul + local.tee $1 + local.get $1 + i32.const 16 + i32.shr_u + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $1 + block $__inlined_func$~lib/map/Map#find + loop $while-continue|0 + local.get $1 + if + local.get $1 + i32.load $0 offset=8 + local.tee $3 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $1 + i32.load $0 + local.get $2 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find + local.get $3 + i32.const -2 + i32.and + local.set $1 + br $while-continue|0 + end + end + i32.const 0 + local.set $1 + end + local.get $1 + if (result i32) + global.get $~lib/memory/__stack_pointer + global.get $~lib/weakref/ALL_REFERENCES + local.tee $1 + i32.store $0 + local.get $1 + local.get $2 + call $~lib/map/Map#get + local.get $0 + i32.load $0 offset=4 + i32.eq + else + i32.const 0 + end + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + else + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 0 + local.set $2 + end + local.get $2 + ) + (func $std/weakref/makeRefencedDummy (type $none_=>_i32) (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2084 + i32.lt_s + if + i32.const 34880 + i32.const 34928 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $0 + i64.const 0 + i64.store $0 + local.get $0 + call $std/weakref/Dummy#constructor + local.tee $0 + i32.store $0 + global.get $~lib/memory/__stack_pointer + i32.const 1824 + i32.store $0 offset=4 + i32.const 1836 + i32.load $0 + local.tee $1 + i32.const 1 + i32.add + local.tee $2 + i32.const 1 + call $~lib/array/ensureCapacity + i32.const 1828 + i32.load $0 + local.get $1 + i32.const 2 + i32.shl + i32.add + local.get $0 + i32.store $0 + local.get $0 + if + i32.const 1824 + local.get $0 + i32.const 1 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + i32.const 1836 + local.get $2 + i32.store $0 + local.get $0 + call $~lib/weakref/WeakRef#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $start:std/weakref (type $none_=>_none) + (local $0 i32) + (local $1 i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 28 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner1 + global.get $~lib/memory/__stack_pointer + i32.const 2084 + i32.lt_s + br_if $folding-inner1 + global.get $~lib/memory/__stack_pointer + local.tee $0 + i32.const 0 + i32.const 28 + memory.fill $0 + memory.size $0 + i32.const 16 + i32.shl + i32.const 34852 + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 1172 + i32.const 1168 + i32.store $0 + i32.const 1176 + i32.const 1168 + i32.store $0 + i32.const 1168 + global.set $~lib/rt/itcms/pinSpace + i32.const 1204 + i32.const 1200 + i32.store $0 + i32.const 1208 + i32.const 1200 + i32.store $0 + i32.const 1200 + global.set $~lib/rt/itcms/toSpace + i32.const 1348 + i32.const 1344 + i32.store $0 + i32.const 1352 + i32.const 1344 i32.store $0 i32.const 1344 global.set $~lib/rt/itcms/fromSpace @@ -2461,9 +2900,9 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1956 + i32.const 2084 i32.lt_s - br_if $folding-inner0 + br_if $folding-inner1 global.get $~lib/memory/__stack_pointer local.tee $0 i64.const 0 @@ -2525,16 +2964,16 @@ local.get $0 global.set $~lib/weakref/ALL_REFERENCES global.get $~lib/memory/__stack_pointer - i32.const 1600 + i32.const 1712 i32.store $0 global.get $~lib/memory/__stack_pointer i32.const 12 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1956 + i32.const 2084 i32.lt_s - br_if $folding-inner0 + br_if $folding-inner1 global.get $~lib/memory/__stack_pointer local.tee $0 i64.const 0 @@ -2549,10 +2988,10 @@ local.tee $0 i32.store $0 local.get $0 - i32.const 1600 + i32.const 1712 i32.store $0 offset=8 local.get $0 - i32.const 1600 + i32.const 1712 i32.const 0 call $byn-split-outlined-A$~lib/rt/itcms/__link global.get $~lib/memory/__stack_pointer @@ -2560,9 +2999,9 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1956 + i32.const 2084 i32.lt_s - br_if $folding-inner0 + br_if $folding-inner1 global.get $~lib/memory/__stack_pointer local.tee $1 i64.const 0 @@ -2640,9 +3079,9 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1956 + i32.const 2084 i32.lt_s - br_if $folding-inner0 + br_if $folding-inner1 global.get $~lib/memory/__stack_pointer i64.const 0 i64.store $0 @@ -2688,9 +3127,9 @@ global.get $~lib/rt/__finalize global.set $~lib/finalizationregistry/PREVIOUS_FINALIZER global.get $~lib/memory/__stack_pointer - i32.const 1568 + i32.const 1680 i32.store $0 offset=8 - i32.const 1568 + i32.const 1680 i32.load $0 global.set $~lib/rt/__finalize i32.const 1 @@ -2703,32 +3142,7 @@ local.get $0 global.set $~lib/weakref/REGISTRY global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 1956 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store $0 - call $std/weakref/Dummy#constructor - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store $0 - local.get $0 - call $~lib/weakref/WeakRef#constructor - local.set $0 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $0 - global.set $std/weakref/weakref - global.get $~lib/memory/__stack_pointer - global.get $std/weakref/weakref + call $std/weakref/produceDummy local.tee $0 i32.store $0 offset=4 local.get $0 @@ -2737,114 +3151,52 @@ if i32.const 0 i32.const 1744 - i32.const 10 - i32.const 1 + i32.const 11 + i32.const 3 call $~lib/builtins/abort unreachable end call $~lib/rt/itcms/__collect - global.get $~lib/memory/__stack_pointer - global.get $std/weakref/weakref - local.tee $0 - i32.store $0 offset=4 local.get $0 call $~lib/weakref/WeakRef#deref if i32.const 0 i32.const 1744 - i32.const 12 - i32.const 1 + i32.const 13 + i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 1956 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - local.tee $0 - i64.const 0 - i64.store $0 - local.get $0 - call $std/weakref/Dummy#constructor - local.tee $0 - i32.store $0 - global.get $~lib/memory/__stack_pointer - i32.const 1824 - i32.store $0 offset=4 - i32.const 1836 - i32.load $0 - local.tee $1 - i32.const 1 - i32.add - local.tee $2 - i32.const 1 - call $~lib/array/ensureCapacity - i32.const 1828 - i32.load $0 - local.get $1 - i32.const 2 - i32.shl - i32.add - local.get $0 - i32.store $0 - local.get $0 - if - i32.const 1824 - local.get $0 - i32.const 1 - call $byn-split-outlined-A$~lib/rt/itcms/__link - end - i32.const 1836 - local.get $2 - i32.store $0 - local.get $0 - call $~lib/weakref/WeakRef#constructor - local.set $0 - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $0 - global.set $std/weakref/weakref2 - global.get $~lib/memory/__stack_pointer - global.get $std/weakref/weakref2 + call $std/weakref/makeRefencedDummy local.tee $0 - i32.store $0 offset=4 + i32.store $0 offset=8 local.get $0 call $~lib/weakref/WeakRef#deref i32.eqz if i32.const 0 i32.const 1744 - i32.const 25 - i32.const 1 + i32.const 28 + i32.const 3 call $~lib/builtins/abort unreachable end call $~lib/rt/itcms/__collect - global.get $~lib/memory/__stack_pointer - global.get $std/weakref/weakref2 - local.tee $0 - i32.store $0 offset=4 local.get $0 call $~lib/weakref/WeakRef#deref i32.eqz if i32.const 0 i32.const 1744 - i32.const 29 - i32.const 1 + i32.const 32 + i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer i32.const 1824 - i32.store $0 offset=4 + i32.store $0 offset=12 i32.const 0 i32.const 0 call $~lib/array/ensureCapacity @@ -2852,285 +3204,203 @@ i32.const 0 i32.store $0 call $~lib/rt/itcms/__collect + local.get $0 + call $~lib/weakref/WeakRef#deref + if + i32.const 0 + i32.const 1744 + i32.const 36 + i32.const 3 + call $~lib/builtins/abort + unreachable + end global.get $~lib/memory/__stack_pointer - global.get $std/weakref/weakref2 + call $std/weakref/makeRefencedDummy local.tee $0 - i32.store $0 offset=4 + i32.store $0 offset=16 + global.get $~lib/memory/__stack_pointer + call $std/weakref/produceDummy + local.tee $1 + i32.store $0 offset=20 local.get $0 call $~lib/weakref/WeakRef#deref + i32.eqz if i32.const 0 i32.const 1744 - i32.const 33 - i32.const 1 + i32.const 51 + i32.const 3 call $~lib/builtins/abort unreachable end + local.get $1 + call $~lib/weakref/WeakRef#deref + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 52 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + call $~lib/rt/itcms/__collect + local.get $0 + call $~lib/weakref/WeakRef#deref + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 55 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $1 + call $~lib/weakref/WeakRef#deref + if + i32.const 0 + i32.const 1744 + i32.const 56 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - return - end - i32.const 34752 - i32.const 34800 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable - ) - (func $start:~lib/weakref~anonymous|0 (type $i32_=>_none) (param $0 i32) - (local $1 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 1956 - i32.lt_s - if - i32.const 34752 - i32.const 34800 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - local.tee $1 - i32.const 0 - i32.store $0 - local.get $1 - global.get $~lib/weakref/ALL_REFERENCES - local.tee $1 - i32.store $0 - local.get $1 - local.get $0 - call $~lib/map/Map#delete - if - global.get $~lib/weakref/CURRENT_COOKIE - i32.const 1 - i32.add - global.set $~lib/weakref/CURRENT_COOKIE - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - ) - (func $~lib/weakref/WeakRef#constructor (type $i32_=>_i32) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.sub - global.set $~lib/memory/__stack_pointer - block $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 1956 + i32.const 2084 i32.lt_s - br_if $folding-inner0 + br_if $folding-inner1 global.get $~lib/memory/__stack_pointer - local.tee $1 - i64.const 0 - i64.store $0 - local.get $1 - i32.const 8 - i32.const 5 - call $~lib/rt/itcms/__new - local.tee $1 - i32.store $0 - local.get $1 + local.tee $2 i32.const 0 i32.store $0 - local.get $1 - i32.const 0 - i32.store $0 offset=4 - global.get $~lib/memory/__stack_pointer - global.get $~lib/weakref/ALL_REFERENCES - local.tee $2 - i32.store $0 offset=4 local.get $2 - local.get $0 - global.get $~lib/weakref/CURRENT_COOKIE - local.tee $2 - call $~lib/map/Map#set - global.get $~lib/memory/__stack_pointer - global.get $~lib/weakref/REGISTRY - local.tee $3 - i32.store $0 offset=4 - global.get $~lib/memory/__stack_pointer + i32.const 1824 + i32.store $0 + local.get $2 i32.const 4 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1956 + i32.const 2084 i32.lt_s - br_if $folding-inner0 + br_if $folding-inner1 global.get $~lib/memory/__stack_pointer - local.tee $4 i32.const 0 i32.store $0 - local.get $4 - local.get $3 - i32.load $0 offset=4 - local.tee $3 + i32.const 1836 + i32.load $0 + i32.eqz + if + i32.const 1248 + i32.const 1872 + i32.const 114 + i32.const 42 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1828 + i32.load $0 + i32.load $0 + local.tee $2 i32.store $0 - local.get $3 - local.get $0 - local.get $0 - call $~lib/map/Map#set + local.get $2 + i32.eqz + if + i32.const 1920 + i32.const 1872 + i32.const 118 + i32.const 40 + call $~lib/builtins/abort + unreachable + end global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $1 - local.get $0 + global.get $~lib/memory/__stack_pointer + local.get $2 i32.store $0 - local.get $1 local.get $2 - i32.store $0 offset=4 + call $~lib/weakref/WeakRef#constructor + local.set $2 global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer local.get $1 - return - end - i32.const 34752 - i32.const 34800 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable - ) - (func $~lib/weakref/WeakRef#deref (type $i32_=>_i32) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 1956 - i32.lt_s - if - i32.const 34752 - i32.const 34800 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - local.tee $1 - i32.const 0 - i32.store $0 - local.get $0 - i32.load $0 - local.set $2 - local.get $1 - global.get $~lib/weakref/ALL_REFERENCES - local.tee $1 - i32.store $0 - local.get $1 - i32.load $0 - local.get $1 - i32.load $0 offset=4 - local.get $2 - i32.const -1028477379 - i32.mul - i32.const 374761397 - i32.add - i32.const 17 - i32.rotl - i32.const 668265263 - i32.mul - local.tee $1 - local.get $1 - i32.const 15 - i32.shr_u - i32.xor - i32.const -2048144777 - i32.mul - local.tee $1 - local.get $1 - i32.const 13 - i32.shr_u - i32.xor - i32.const -1028477379 - i32.mul - local.tee $1 - local.get $1 - i32.const 16 - i32.shr_u - i32.xor - i32.and - i32.const 2 - i32.shl - i32.add - i32.load $0 - local.set $1 - block $__inlined_func$~lib/map/Map#find - loop $while-continue|0 - local.get $1 - if - local.get $1 - i32.load $0 offset=8 - local.tee $3 - i32.const 1 - i32.and - if (result i32) - i32.const 0 - else - local.get $1 - i32.load $0 - local.get $2 - i32.eq - end - br_if $__inlined_func$~lib/map/Map#find - local.get $3 - i32.const -2 - i32.and - local.set $1 - br $while-continue|0 - end + local.get $2 + i32.store $0 offset=24 + local.get $0 + call $~lib/weakref/WeakRef#deref + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 59 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $2 + call $~lib/weakref/WeakRef#deref + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 60 + i32.const 3 + call $~lib/builtins/abort + unreachable end - i32.const 0 - local.set $1 - end - local.get $1 - if (result i32) global.get $~lib/memory/__stack_pointer - global.get $~lib/weakref/ALL_REFERENCES - local.tee $1 + i32.const 1824 + i32.store $0 offset=12 + i32.const 0 + i32.const 0 + call $~lib/array/ensureCapacity + i32.const 1836 + i32.const 0 i32.store $0 - local.get $1 - local.get $2 - call $~lib/map/Map#get + call $~lib/rt/itcms/__collect local.get $0 - i32.load $0 offset=4 - i32.eq - else - i32.const 0 - end - if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - else + call $~lib/weakref/WeakRef#deref + if + i32.const 0 + i32.const 1744 + i32.const 65 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $2 + call $~lib/weakref/WeakRef#deref + if + i32.const 0 + i32.const 1744 + i32.const 66 + i32.const 3 + call $~lib/builtins/abort + unreachable + end global.get $~lib/memory/__stack_pointer - i32.const 4 + i32.const 28 i32.add global.set $~lib/memory/__stack_pointer - i32.const 0 - local.set $2 + return end - local.get $2 + i32.const 34880 + i32.const 34928 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable ) (func $~lib/arraybuffer/ArrayBuffer#constructor (type $i32_=>_i32) (param $0 i32) (result i32) global.get $~lib/memory/__stack_pointer @@ -3138,11 +3408,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1956 + i32.const 2084 i32.lt_s if - i32.const 34752 - i32.const 34800 + i32.const 34880 + i32.const 34928 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3183,11 +3453,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1956 + i32.const 2084 i32.lt_s if - i32.const 34752 - i32.const 34800 + i32.const 34880 + i32.const 34928 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3358,7 +3628,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 1956 + i32.const 2084 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -3377,7 +3647,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1956 + i32.const 2084 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -3407,8 +3677,8 @@ local.get $0 return end - i32.const 34752 - i32.const 34800 + i32.const 34880 + i32.const 34928 i32.const 1 i32.const 1 call $~lib/builtins/abort diff --git a/tests/compiler/std/weakref.ts b/tests/compiler/std/weakref.ts index f82f1efd93..73d1797ea5 100644 --- a/tests/compiler/std/weakref.ts +++ b/tests/compiler/std/weakref.ts @@ -6,28 +6,62 @@ function produceDummy(): WeakRef { return new WeakRef(new Dummy()); } -const weakref = produceDummy(); -assert(weakref.deref() !== null); -__collect(); -assert(weakref.deref() === null); +{ + const weakref = produceDummy(); + assert(weakref.deref() !== null); + __collect(); + assert(weakref.deref() === null); +} // Test releasing reference const globalRefs: Dummy[] = []; -function makeDummy(): WeakRef { +function makeRefencedDummy(): WeakRef { const instance = new Dummy(); globalRefs.push(instance); return new WeakRef(instance); } -const weakref2 = makeDummy(); -assert(weakref2.deref() !== null); +{ + const weakref = makeRefencedDummy(); + assert(weakref.deref() !== null); + + // No effect since globalRefs is holding dummy + __collect(); + assert(weakref.deref() !== null); + + globalRefs.length = 0; + __collect(); + assert(weakref.deref() === null); +} + +// Test overlapping WeakRef + +function grabGlobalRef(): WeakRef { + // Again, deref inside a function to prevent the shadow stack from holding on + // to globalRefs[0] + return new WeakRef(globalRefs[0]); +} + +{ + const weakref1 = makeRefencedDummy(); + const weakref2 = produceDummy(); + + assert(weakref1.deref() !== null); + assert(weakref2.deref() !== null); -// No effect since globalRefs is holding dummy -__collect(); -assert(weakref2.deref() !== null); + __collect(); + assert(weakref1.deref() !== null); + assert(weakref2.deref() === null); -globalRefs.length = 0; -__collect(); -assert(weakref2.deref() === null); + const weakref3 = grabGlobalRef(); + assert(weakref1.deref() !== null); + assert(weakref3.deref() !== null); + + globalRefs.length = 0; + __collect(); + + assert(weakref1.deref() === null); + assert(weakref3.deref() === null); +} From bdb721b674c772a2ea4cb0407925f2ea666510fc Mon Sep 17 00:00:00 2001 From: Bach Le Date: Wed, 21 Dec 2022 00:22:04 +0800 Subject: [PATCH 06/14] Make FinalizationRegistry GC-able --- std/assembly/finalizationregistry.ts | 34 +- tests/compiler/std/weakref.debug.wat | 1718 +++++++++++++---- tests/compiler/std/weakref.release.wat | 2377 +++++++++++++++++------- 3 files changed, 3101 insertions(+), 1028 deletions(-) diff --git a/std/assembly/finalizationregistry.ts b/std/assembly/finalizationregistry.ts index eb9657c33e..d7cc33ed70 100644 --- a/std/assembly/finalizationregistry.ts +++ b/std/assembly/finalizationregistry.ts @@ -5,20 +5,21 @@ @lazy let INITIALIZED: boolean = false; // @ts-ignore: decorators -@lazy let ALL_REGISTRIES: BaseRegistry | null = null; +@lazy let REGISTRIES_FOR_PTR: Map = new Map(); abstract class BaseRegistry { - private next: BaseRegistry | null; - - constructor() { - this.next = ALL_REGISTRIES; - ALL_REGISTRIES = this; - } - static finalizeAll(ptr: usize): void { - for (let i = ALL_REGISTRIES; i !== null; i = i.next) { - i.finalize(ptr); + if (!REGISTRIES_FOR_PTR.has(ptr)) { return; } + + const registries = REGISTRIES_FOR_PTR.get(ptr); + for ( + let i = 0, numRegistries = registries.length; + i < numRegistries; + ++i + ) { + registries[i].finalize(ptr); } + REGISTRIES_FOR_PTR.delete(ptr); if (PREVIOUS_FINALIZER) { call_indirect(PREVIOUS_FINALIZER, ptr); @@ -42,7 +43,18 @@ export class FinalizationRegistry extends BaseRegistry { } register(key: U, value: T): void { - this.entries.set(changetype(key), value); + const ptr = changetype(key); + if (this.entries.has(ptr)) { return; } + + this.entries.set(ptr, value); + + if (REGISTRIES_FOR_PTR.has(ptr)) { + REGISTRIES_FOR_PTR.get(ptr).push(this); + } else { + const registries: BaseRegistry[] = new Array(); + registries.push(this); + REGISTRIES_FOR_PTR.set(ptr, registries); + } } unregister(key: U): bool { diff --git a/tests/compiler/std/weakref.debug.wat b/tests/compiler/std/weakref.debug.wat index 9fb9e9086e..b896a877f7 100644 --- a/tests/compiler/std/weakref.debug.wat +++ b/tests/compiler/std/weakref.debug.wat @@ -3,8 +3,8 @@ (type $i32_=>_i32 (func_subtype (param i32) (result i32) func)) (type $i32_i32_=>_i32 (func_subtype (param i32 i32) (result i32) func)) (type $i32_=>_none (func_subtype (param i32) func)) - (type $none_=>_none (func_subtype func)) (type $i32_i32_i32_=>_i32 (func_subtype (param i32 i32 i32) (result i32) func)) + (type $none_=>_none (func_subtype func)) (type $i32_i32_i32_=>_none (func_subtype (param i32 i32 i32) func)) (type $none_=>_i32 (func_subtype (result i32) func)) (type $i32_i32_i32_i32_=>_none (func_subtype (param i32 i32 i32 i32) func)) @@ -27,16 +27,16 @@ (global $~lib/native/ASC_RUNTIME i32 (i32.const 2)) (global $~lib/weakref/ALL_REFERENCES (mut i32) (i32.const 0)) (global $~lib/weakref/CURRENT_COOKIE (mut i32) (i32.const 0)) - (global $~lib/finalizationregistry/ALL_REGISTRIES (mut i32) (i32.const 0)) (global $~lib/finalizationregistry/INITIALIZED (mut i32) (i32.const 0)) (global $~lib/finalizationregistry/PREVIOUS_FINALIZER (mut i32) (i32.const 0)) + (global $~lib/finalizationregistry/REGISTRIES_FOR_PTR (mut i32) (i32.const 0)) (global $~lib/weakref/REGISTRY (mut i32) (i32.const 0)) - (global $std/weakref/globalRefs i32 (i32.const 800)) + (global $std/weakref/globalRefs i32 (i32.const 976)) (global $~argumentsLength (mut i32) (i32.const 0)) (global $~lib/rt/__rtti_base i32 (i32.const 1008)) - (global $~lib/memory/__data_end i32 (i32.const 1060)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 33828)) - (global $~lib/memory/__heap_base i32 (i32.const 33828)) + (global $~lib/memory/__data_end i32 (i32.const 1068)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 33836)) + (global $~lib/memory/__heap_base i32 (i32.const 33836)) (memory $0 1) (data (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") (data (i32.const 76) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") @@ -50,14 +50,14 @@ (data (i32.const 460) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00&\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00\00\00\00\00\00\00") (data (i32.const 524) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\00K\00e\00y\00 \00d\00o\00e\00s\00 \00n\00o\00t\00 \00e\00x\00i\00s\00t\00\00\00\00\00\00\00\00\00") (data (i32.const 588) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\00~\00l\00i\00b\00/\00m\00a\00p\00.\00t\00s\00\00\00\00\00\00\00") - (data (i32.const 636) "\1c\00\00\00\00\00\00\00\00\00\00\00\n\00\00\00\08\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 668) "\1c\00\00\00\00\00\00\00\00\00\00\00\n\00\00\00\08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 700) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1c\00\00\00s\00t\00d\00/\00w\00e\00a\00k\00r\00e\00f\00.\00t\00s\00") - (data (i32.const 748) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 780) ",\00\00\00\00\00\00\00\00\00\00\00\0b\00\00\00\10\00\00\00\00\03\00\00\00\03\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 828) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") - (data (i32.const 876) "|\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1008) "\0c\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00\10\01\02\00\00\00\00\00\00\00\00\00\10\01\02\00\00\00\00\00\02A\00\00") + (data (i32.const 636) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") + (data (i32.const 684) "|\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 812) "\1c\00\00\00\00\00\00\00\00\00\00\00\n\00\00\00\08\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 844) "\1c\00\00\00\00\00\00\00\00\00\00\00\n\00\00\00\08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 876) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1c\00\00\00s\00t\00d\00/\00w\00e\00a\00k\00r\00e\00f\00.\00t\00s\00") + (data (i32.const 924) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 956) ",\00\00\00\00\00\00\00\00\00\00\00\r\00\00\00\10\00\00\00\b0\03\00\00\b0\03\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1008) "\0e\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00\10\01\02\00\00\00\00\00 \00\00\00\10\01\02\00\00\00\00\00\02A\00\00\10A\02\00\02A\00\00") (table $0 3 3 funcref) (elem $0 (i32.const 1) $~lib/finalizationregistry/BaseRegistry.finalizeAll $start:~lib/weakref~anonymous|0) (export "memory" (memory $0)) @@ -2731,62 +2731,258 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/finalizationregistry/BaseRegistry#set:next (type $i32_i32_=>_none) (param $this i32) (param $next i32) + (func $~lib/map/Map>#set:buckets (type $i32_i32_=>_none) (param $this i32) (param $buckets i32) local.get $this - local.get $next + local.get $buckets i32.store $0 local.get $this - local.get $next + local.get $buckets i32.const 0 call $~lib/rt/itcms/__link ) - (func $~lib/finalizationregistry/BaseRegistry#finalize (type $i32_i32_=>_none) (param $this i32) (param $ptr i32) - unreachable + (func $~lib/map/Map>#set:bucketsMask (type $i32_i32_=>_none) (param $this i32) (param $bucketsMask i32) + local.get $this + local.get $bucketsMask + i32.store $0 offset=4 + ) + (func $~lib/map/Map>#set:entries (type $i32_i32_=>_none) (param $this i32) (param $entries i32) + local.get $this + local.get $entries + i32.store $0 offset=8 + local.get $this + local.get $entries + i32.const 0 + call $~lib/rt/itcms/__link + ) + (func $~lib/map/Map>#set:entriesCapacity (type $i32_i32_=>_none) (param $this i32) (param $entriesCapacity i32) + local.get $this + local.get $entriesCapacity + i32.store $0 offset=12 + ) + (func $~lib/map/Map>#set:entriesOffset (type $i32_i32_=>_none) (param $this i32) (param $entriesOffset i32) + local.get $this + local.get $entriesOffset + i32.store $0 offset=16 + ) + (func $~lib/map/Map>#set:entriesCount (type $i32_i32_=>_none) (param $this i32) (param $entriesCount i32) + local.get $this + local.get $entriesCount + i32.store $0 offset=20 ) - (func $~lib/finalizationregistry/BaseRegistry#get:next (type $i32_=>_i32) (param $this i32) (result i32) + (func $~lib/map/Map>#get:buckets (type $i32_=>_i32) (param $this i32) (result i32) local.get $this i32.load $0 ) - (func $~lib/finalizationregistry/BaseRegistry.finalizeAll (type $i32_=>_none) (param $ptr i32) - (local $i i32) - global.get $~lib/memory/__stack_pointer + (func $~lib/map/Map>#get:bucketsMask (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) + (func $~lib/map/MapEntry>#get:taggedNext (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=8 + ) + (func $~lib/map/MapEntry>#get:key (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + ) + (func $~lib/map/Map>#find (type $i32_i32_i32_=>_i32) (param $this i32) (param $key i32) (param $hashCode i32) (result i32) + (local $entry i32) + (local $taggedNext i32) + local.get $this + call $~lib/map/Map>#get:buckets + local.get $hashCode + local.get $this + call $~lib/map/Map>#get:bucketsMask + i32.and i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store $0 - global.get $~lib/memory/__stack_pointer - global.get $~lib/finalizationregistry/ALL_REGISTRIES - local.tee $i - i32.store $0 - loop $for-loop|0 - local.get $i - i32.const 0 - i32.ne + i32.mul + i32.add + i32.load $0 + local.set $entry + loop $while-continue|0 + local.get $entry if - local.get $i - local.get $ptr - call $~lib/finalizationregistry/BaseRegistry#finalize@override - global.get $~lib/memory/__stack_pointer - local.get $i - call $~lib/finalizationregistry/BaseRegistry#get:next - local.tee $i - i32.store $0 - br $for-loop|0 + local.get $entry + call $~lib/map/MapEntry>#get:taggedNext + local.set $taggedNext + local.get $taggedNext + i32.const 1 + i32.and + i32.eqz + if (result i32) + local.get $entry + call $~lib/map/MapEntry>#get:key + local.get $key + i32.eq + else + i32.const 0 + end + if + local.get $entry + return + end + local.get $taggedNext + i32.const 1 + i32.const -1 + i32.xor + i32.and + local.set $entry + br $while-continue|0 end end - global.get $~lib/finalizationregistry/PREVIOUS_FINALIZER + i32.const 0 + return + ) + (func $~lib/map/Map>#has (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + local.get $this + local.get $key + local.get $key + call $~lib/util/hash/HASH + call $~lib/map/Map>#find + i32.const 0 + i32.ne + return + ) + (func $~lib/map/MapEntry>#get:value (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) + (func $~lib/map/Map>#get (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + (local $entry i32) + local.get $this + local.get $key + local.get $key + call $~lib/util/hash/HASH + call $~lib/map/Map>#find + local.set $entry + local.get $entry + i32.eqz if - local.get $ptr - global.get $~lib/finalizationregistry/PREVIOUS_FINALIZER - call_indirect $0 (type $i32_=>_none) + i32.const 544 + i32.const 608 + i32.const 105 + i32.const 17 + call $~lib/builtins/abort + unreachable end - global.get $~lib/memory/__stack_pointer - i32.const 4 + local.get $entry + call $~lib/map/MapEntry>#get:value + return + ) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#get:length_ (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=12 + ) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#get:length (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#get:length_ + return + ) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#get:dataStart (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=4 + ) + (func $~lib/finalizationregistry/BaseRegistry#finalize (type $i32_i32_=>_none) (param $this i32) (param $ptr i32) + unreachable + ) + (func $~lib/map/MapEntry>#set:taggedNext (type $i32_i32_=>_none) (param $this i32) (param $taggedNext i32) + local.get $this + local.get $taggedNext + i32.store $0 offset=8 + ) + (func $~lib/map/Map>#get:entriesCount (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=20 + ) + (func $~lib/map/Map>#get:entriesCapacity (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=12 + ) + (func $~lib/map/Map>#get:entries (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=8 + ) + (func $~lib/map/Map>#get:entriesOffset (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=16 + ) + (func $~lib/map/MapEntry>#set:key (type $i32_i32_=>_none) (param $this i32) (param $key i32) + local.get $this + local.get $key + i32.store $0 + ) + (func $~lib/map/MapEntry>#set:value (type $i32_i32_=>_none) (param $this i32) (param $value i32) + local.get $this + local.get $value + i32.store $0 offset=4 + ) + (func $~lib/map/Map>#delete (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + (local $entry i32) + (local $halfBucketsMask i32) + (local $4 i32) + (local $5 i32) + local.get $this + local.get $key + local.get $key + call $~lib/util/hash/HASH + call $~lib/map/Map>#find + local.set $entry + local.get $entry + i32.eqz + if + i32.const 0 + return + end + local.get $entry + local.get $entry + call $~lib/map/MapEntry>#get:taggedNext + i32.const 1 + i32.or + call $~lib/map/MapEntry>#set:taggedNext + local.get $this + local.get $this + call $~lib/map/Map>#get:entriesCount + i32.const 1 + i32.sub + call $~lib/map/Map>#set:entriesCount + local.get $this + call $~lib/map/Map>#get:bucketsMask + i32.const 1 + i32.shr_u + local.set $halfBucketsMask + local.get $halfBucketsMask + i32.const 1 i32.add - global.set $~lib/memory/__stack_pointer + i32.const 4 + local.tee $4 + local.get $this + call $~lib/map/Map>#get:entriesCount + local.tee $5 + local.get $4 + local.get $5 + i32.gt_u + select + i32.ge_u + if (result i32) + local.get $this + call $~lib/map/Map>#get:entriesCount + local.get $this + call $~lib/map/Map>#get:entriesCapacity + i32.const 3 + i32.mul + i32.const 4 + i32.div_s + i32.lt_s + else + i32.const 0 + end + if + local.get $this + local.get $halfBucketsMask + call $~lib/map/Map>#rehash + end + i32.const 1 + return ) (func $~lib/function/Function<%28usize%29=>void>#get:index (type $i32_=>_i32) (param $this i32) (result i32) local.get $this @@ -2796,7 +2992,7 @@ (func $~lib/finalizationregistry/FinalizationRegistry#set:finalizer (type $i32_i32_=>_none) (param $this i32) (param $finalizer i32) local.get $this local.get $finalizer - i32.store $0 offset=8 + i32.store $0 offset=4 local.get $this local.get $finalizer i32.const 0 @@ -2843,7 +3039,7 @@ (func $~lib/finalizationregistry/FinalizationRegistry#set:entries (type $i32_i32_=>_none) (param $this i32) (param $entries i32) local.get $this local.get $entries - i32.store $0 offset=4 + i32.store $0 local.get $this local.get $entries i32.const 0 @@ -2919,7 +3115,7 @@ ) (func $~lib/finalizationregistry/FinalizationRegistry#get:entries (type $i32_=>_i32) (param $this i32) (result i32) local.get $this - i32.load $0 offset=4 + i32.load $0 ) (func $~lib/map/Map#get:buckets (type $i32_=>_i32) (param $this i32) (result i32) local.get $this @@ -2985,6 +3181,16 @@ i32.const 0 return ) + (func $~lib/map/Map#has (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) + local.get $this + local.get $key + local.get $key + call $~lib/util/hash/HASH + call $~lib/map/Map#find + i32.const 0 + i32.ne + return + ) (func $~lib/map/MapEntry#set:value (type $i32_i32_=>_none) (param $this i32) (param $value i32) local.get $this local.get $value @@ -3167,56 +3373,6 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/rt/itcms/__collect (type $none_=>_none) - i32.const 0 - drop - global.get $~lib/rt/itcms/state - i32.const 0 - i32.gt_s - if - loop $while-continue|0 - global.get $~lib/rt/itcms/state - i32.const 0 - i32.ne - if - call $~lib/rt/itcms/step - drop - br $while-continue|0 - end - end - end - call $~lib/rt/itcms/step - drop - loop $while-continue|1 - global.get $~lib/rt/itcms/state - i32.const 0 - i32.ne - if - call $~lib/rt/itcms/step - drop - br $while-continue|1 - end - end - global.get $~lib/rt/itcms/total - i64.extend_i32_u - i32.const 200 - i64.extend_i32_u - i64.mul - i64.const 100 - i64.div_u - i32.wrap_i64 - i32.const 1024 - i32.add - global.set $~lib/rt/itcms/threshold - i32.const 0 - drop - i32.const 0 - drop - ) - (func $~lib/array/Array#get:length_ (type $i32_=>_i32) (param $this i32) (result i32) - local.get $this - i32.load $0 offset=12 - ) (func $~lib/arraybuffer/ArrayBufferView#get:byteLength (type $i32_=>_i32) (param $this i32) (result i32) local.get $this i32.load $0 offset=8 @@ -3302,7 +3458,7 @@ i32.gt_u if i32.const 432 - i32.const 848 + i32.const 656 i32.const 19 i32.const 48 call $~lib/builtins/abort @@ -3371,6 +3527,115 @@ i32.store $0 offset=8 end ) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#set:length_ (type $i32_i32_=>_none) (param $this i32) (param $length_ i32) + local.get $this + local.get $length_ + i32.store $0 offset=12 + ) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#push (type $i32_i32_=>_i32) (param $this i32) (param $value i32) (result i32) + (local $oldLen i32) + (local $len i32) + local.get $this + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#get:length_ + local.set $oldLen + local.get $oldLen + i32.const 1 + i32.add + local.set $len + local.get $this + local.get $len + i32.const 2 + i32.const 1 + call $~lib/array/ensureCapacity + i32.const 1 + drop + local.get $this + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#get:dataStart + local.get $oldLen + i32.const 2 + i32.shl + i32.add + local.get $value + i32.store $0 + local.get $this + local.get $value + i32.const 1 + call $~lib/rt/itcms/__link + local.get $this + local.get $len + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#set:length_ + local.get $len + return + ) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#set:buffer (type $i32_i32_=>_none) (param $this i32) (param $buffer i32) + local.get $this + local.get $buffer + i32.store $0 + local.get $this + local.get $buffer + i32.const 0 + call $~lib/rt/itcms/__link + ) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#set:dataStart (type $i32_i32_=>_none) (param $this i32) (param $dataStart i32) + local.get $this + local.get $dataStart + i32.store $0 offset=4 + ) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#set:byteLength (type $i32_i32_=>_none) (param $this i32) (param $byteLength i32) + local.get $this + local.get $byteLength + i32.store $0 offset=8 + ) + (func $~lib/rt/itcms/__collect (type $none_=>_none) + i32.const 0 + drop + global.get $~lib/rt/itcms/state + i32.const 0 + i32.gt_s + if + loop $while-continue|0 + global.get $~lib/rt/itcms/state + i32.const 0 + i32.ne + if + call $~lib/rt/itcms/step + drop + br $while-continue|0 + end + end + end + call $~lib/rt/itcms/step + drop + loop $while-continue|1 + global.get $~lib/rt/itcms/state + i32.const 0 + i32.ne + if + call $~lib/rt/itcms/step + drop + br $while-continue|1 + end + end + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i32.const 200 + i64.extend_i32_u + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + i32.const 0 + drop + ) + (func $~lib/array/Array#get:length_ (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 offset=12 + ) (func $~lib/array/Array#get:dataStart (type $i32_=>_i32) (param $this i32) (result i32) local.get $this i32.load $0 offset=4 @@ -3425,16 +3690,6 @@ local.get $newLength call $~lib/array/Array#set:length_ ) - (func $~lib/map/Map#has (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) - local.get $this - local.get $key - local.get $key - call $~lib/util/hash/HASH - call $~lib/map/Map#find - i32.const 0 - i32.ne - return - ) (func $~lib/map/Map#get (type $i32_i32_=>_i32) (param $this i32) (param $key i32) (result i32) (local $entry i32) local.get $this @@ -3527,7 +3782,7 @@ ) (func $~lib/finalizationregistry/FinalizationRegistry#get:finalizer (type $i32_=>_i32) (param $this i32) (result i32) local.get $this - i32.load $0 offset=8 + i32.load $0 offset=4 ) (func $~lib/finalizationregistry/BaseRegistry#finalize@override (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) (local $2 i32) @@ -3553,7 +3808,7 @@ ) (func $~lib/rt/__visit_globals (type $i32_=>_none) (param $0 i32) (local $1 i32) - global.get $~lib/finalizationregistry/ALL_REGISTRIES + global.get $~lib/finalizationregistry/REGISTRIES_FOR_PTR local.tee $1 if local.get $1 @@ -3587,7 +3842,7 @@ i32.const 432 local.get $0 call $~lib/rt/itcms/__visit - i32.const 896 + i32.const 704 local.get $0 call $~lib/rt/itcms/__visit i32.const 544 @@ -3643,7 +3898,7 @@ local.get $1 call $~lib/finalizationregistry/BaseRegistry~visit local.get $0 - i32.load $0 offset=4 + i32.load $0 local.tee $2 if local.get $2 @@ -3651,7 +3906,7 @@ call $~lib/rt/itcms/__visit end local.get $0 - i32.load $0 offset=8 + i32.load $0 offset=4 local.tee $2 if local.get $2 @@ -3660,18 +3915,9 @@ end ) (func $~lib/finalizationregistry/BaseRegistry~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) - (local $2 i32) local.get $0 local.get $1 call $~lib/object/Object~visit - local.get $0 - i32.load $0 - local.tee $2 - if - local.get $2 - local.get $1 - call $~lib/rt/itcms/__visit - end ) (func $~lib/map/Map#__visit (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) (local $entries i32) @@ -3714,22 +3960,22 @@ local.get $1 call $~lib/function/Function<%28usize%29=>void>#__visit ) - (func $~lib/array/Array#get:buffer (type $i32_=>_i32) (param $this i32) (result i32) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#get:buffer (type $i32_=>_i32) (param $this i32) (result i32) local.get $this i32.load $0 ) - (func $~lib/array/Array#__visit (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#__visit (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) (local $cur i32) (local $end i32) (local $val i32) i32.const 1 drop local.get $this - call $~lib/array/Array#get:dataStart + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#get:dataStart local.set $cur local.get $cur local.get $this - call $~lib/array/Array#get:length_ + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#get:length_ i32.const 2 i32.shl i32.add @@ -3756,86 +4002,224 @@ end end local.get $this - call $~lib/array/Array#get:buffer + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#get:buffer local.get $cookie call $~lib/rt/itcms/__visit ) - (func $~lib/array/Array~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) local.get $0 local.get $1 call $~lib/object/Object~visit local.get $0 local.get $1 - call $~lib/array/Array#__visit + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#__visit ) - (func $~lib/rt/__visit_members (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) - block $invalid - block $~lib/array/Array - block $~lib/function/Function<%28usize%29=>void> - block $~lib/map/Map - block $~lib/finalizationregistry/BaseRegistry - block $~lib/finalizationregistry/FinalizationRegistry - block $~lib/map/Map - block $~lib/weakref/WeakRef - block $std/weakref/Dummy - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - block $~lib/object/Object - local.get $0 - i32.const 8 - i32.sub - i32.load $0 - br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $std/weakref/Dummy $~lib/weakref/WeakRef $~lib/map/Map $~lib/finalizationregistry/FinalizationRegistry $~lib/finalizationregistry/BaseRegistry $~lib/map/Map $~lib/function/Function<%28usize%29=>void> $~lib/array/Array $invalid - end - return - end - return - end - return - end - local.get $0 - local.get $1 - call $~lib/arraybuffer/ArrayBufferView~visit - return - end - return - end - return - end - local.get $0 - local.get $1 - call $~lib/map/Map~visit - return - end - local.get $0 - local.get $1 - call $~lib/finalizationregistry/FinalizationRegistry~visit - return - end - local.get $0 - local.get $1 - call $~lib/finalizationregistry/BaseRegistry~visit - return - end - local.get $0 - local.get $1 - call $~lib/map/Map~visit - return + (func $~lib/map/Map>#__visit (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) + (local $entries i32) + (local $cur i32) + (local $end i32) + (local $entry i32) + (local $val i32) + local.get $this + call $~lib/map/Map>#get:buckets + local.get $cookie + call $~lib/rt/itcms/__visit + local.get $this + call $~lib/map/Map>#get:entries + local.set $entries + i32.const 1 + drop + local.get $entries + local.set $cur + local.get $cur + local.get $this + call $~lib/map/Map>#get:entriesOffset + block $~lib/map/ENTRY_SIZE>|inlined.6 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE>|inlined.6 + end + i32.mul + i32.add + local.set $end + loop $while-continue|0 + local.get $cur + local.get $end + i32.lt_u + if + local.get $cur + local.set $entry + local.get $entry + call $~lib/map/MapEntry>#get:taggedNext + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + drop + i32.const 1 + drop + local.get $entry + call $~lib/map/MapEntry>#get:value + local.set $val + i32.const 0 + drop + local.get $val + local.get $cookie + call $~lib/rt/itcms/__visit end - local.get $0 - local.get $1 - call $~lib/function/Function<%28usize%29=>void>~visit - return + local.get $cur + block $~lib/map/ENTRY_SIZE>|inlined.7 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE>|inlined.7 + end + i32.add + local.set $cur + br $while-continue|0 end - local.get $0 - local.get $1 - call $~lib/array/Array~visit - return end - unreachable - ) - (func $~start (type $none_=>_none) + local.get $entries + local.get $cookie + call $~lib/rt/itcms/__visit + ) + (func $~lib/map/Map>~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + local.get $1 + call $~lib/map/Map>#__visit + ) + (func $~lib/array/Array#get:buffer (type $i32_=>_i32) (param $this i32) (result i32) + local.get $this + i32.load $0 + ) + (func $~lib/array/Array#__visit (type $i32_i32_=>_none) (param $this i32) (param $cookie i32) + (local $cur i32) + (local $end i32) + (local $val i32) + i32.const 1 + drop + local.get $this + call $~lib/array/Array#get:dataStart + local.set $cur + local.get $cur + local.get $this + call $~lib/array/Array#get:length_ + i32.const 2 + i32.shl + i32.add + local.set $end + loop $while-continue|0 + local.get $cur + local.get $end + i32.lt_u + if + local.get $cur + i32.load $0 + local.set $val + local.get $val + if + local.get $val + local.get $cookie + call $~lib/rt/itcms/__visit + end + local.get $cur + i32.const 4 + i32.add + local.set $cur + br $while-continue|0 + end + end + local.get $this + call $~lib/array/Array#get:buffer + local.get $cookie + call $~lib/rt/itcms/__visit + ) + (func $~lib/array/Array~visit (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + local.get $1 + call $~lib/array/Array#__visit + ) + (func $~lib/rt/__visit_members (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + block $invalid + block $~lib/array/Array + block $~lib/map/Map> + block $~lib/array/Array<~lib/finalizationregistry/BaseRegistry> + block $~lib/function/Function<%28usize%29=>void> + block $~lib/map/Map + block $~lib/finalizationregistry/BaseRegistry + block $~lib/finalizationregistry/FinalizationRegistry + block $~lib/map/Map + block $~lib/weakref/WeakRef + block $std/weakref/Dummy + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + block $~lib/object/Object + local.get $0 + i32.const 8 + i32.sub + i32.load $0 + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $std/weakref/Dummy $~lib/weakref/WeakRef $~lib/map/Map $~lib/finalizationregistry/FinalizationRegistry $~lib/finalizationregistry/BaseRegistry $~lib/map/Map $~lib/function/Function<%28usize%29=>void> $~lib/array/Array<~lib/finalizationregistry/BaseRegistry> $~lib/map/Map> $~lib/array/Array $invalid + end + return + end + return + end + return + end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit + return + end + return + end + return + end + local.get $0 + local.get $1 + call $~lib/map/Map~visit + return + end + local.get $0 + local.get $1 + call $~lib/finalizationregistry/FinalizationRegistry~visit + return + end + return + end + local.get $0 + local.get $1 + call $~lib/map/Map~visit + return + end + local.get $0 + local.get $1 + call $~lib/function/Function<%28usize%29=>void>~visit + return + end + local.get $0 + local.get $1 + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>~visit + return + end + local.get $0 + local.get $1 + call $~lib/map/Map>~visit + return + end + local.get $0 + local.get $1 + call $~lib/array/Array~visit + return + end + unreachable + ) + (func $~start (type $none_=>_none) call $start:std/weakref ) (func $~stack_check (type $none_=>_none) @@ -3920,7 +4304,7 @@ global.set $~lib/memory/__stack_pointer local.get $1 ) - (func $~lib/finalizationregistry/BaseRegistry#constructor (type $i32_=>_i32) (param $this i32) (result i32) + (func $~lib/map/Map>#constructor (type $i32_=>_i32) (param $this i32) (result i32) (local $1 i32) global.get $~lib/memory/__stack_pointer i32.const 8 @@ -3934,25 +4318,53 @@ i32.eqz if global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.const 8 + i32.const 24 + i32.const 12 call $~lib/rt/itcms/__new local.tee $this i32.store $0 end local.get $this i32.const 0 - call $~lib/finalizationregistry/BaseRegistry#set:next + i32.const 4 + i32.const 4 + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $1 + call $~lib/map/Map>#set:buckets + local.get $this + i32.const 4 + i32.const 1 + i32.sub + call $~lib/map/Map>#set:bucketsMask local.get $this - global.get $~lib/finalizationregistry/ALL_REGISTRIES + i32.const 0 + i32.const 4 + block $~lib/map/ENTRY_SIZE>|inlined.0 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE>|inlined.0 + end + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor local.set $1 global.get $~lib/memory/__stack_pointer local.get $1 i32.store $0 offset=4 local.get $1 - call $~lib/finalizationregistry/BaseRegistry#set:next + call $~lib/map/Map>#set:entries + local.get $this + i32.const 4 + call $~lib/map/Map>#set:entriesCapacity local.get $this - global.set $~lib/finalizationregistry/ALL_REGISTRIES + i32.const 0 + call $~lib/map/Map>#set:entriesOffset + local.get $this + i32.const 0 + call $~lib/map/Map>#set:entriesCount local.get $this local.set $1 global.get $~lib/memory/__stack_pointer @@ -3961,6 +4373,249 @@ global.set $~lib/memory/__stack_pointer local.get $1 ) + (func $~lib/map/Map>#rehash (type $i32_i32_=>_none) (param $this i32) (param $newBucketsMask i32) + (local $newBucketsCapacity i32) + (local $newBuckets i32) + (local $newEntriesCapacity i32) + (local $newEntries i32) + (local $oldPtr i32) + (local $oldEnd i32) + (local $newPtr i32) + (local $oldEntry i32) + (local $newEntry i32) + (local $oldEntryKey i32) + (local $newBucketIndex i32) + (local $newBucketPtrBase i32) + (local $14 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store $0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 offset=8 + local.get $newBucketsMask + i32.const 1 + i32.add + local.set $newBucketsCapacity + global.get $~lib/memory/__stack_pointer + i32.const 0 + local.get $newBucketsCapacity + i32.const 4 + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor + local.tee $newBuckets + i32.store $0 + local.get $newBucketsCapacity + i32.const 8 + i32.mul + i32.const 3 + i32.div_s + local.set $newEntriesCapacity + global.get $~lib/memory/__stack_pointer + i32.const 0 + local.get $newEntriesCapacity + block $~lib/map/ENTRY_SIZE>|inlined.1 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE>|inlined.1 + end + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor + local.tee $newEntries + i32.store $0 offset=4 + local.get $this + call $~lib/map/Map>#get:entries + local.set $oldPtr + local.get $oldPtr + local.get $this + call $~lib/map/Map>#get:entriesOffset + block $~lib/map/ENTRY_SIZE>|inlined.2 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE>|inlined.2 + end + i32.mul + i32.add + local.set $oldEnd + local.get $newEntries + local.set $newPtr + loop $while-continue|0 + local.get $oldPtr + local.get $oldEnd + i32.ne + if + local.get $oldPtr + local.set $oldEntry + local.get $oldEntry + call $~lib/map/MapEntry>#get:taggedNext + i32.const 1 + i32.and + i32.eqz + if + local.get $newPtr + local.set $newEntry + local.get $oldEntry + call $~lib/map/MapEntry>#get:key + local.set $oldEntryKey + local.get $newEntry + local.get $oldEntryKey + call $~lib/map/MapEntry>#set:key + local.get $newEntry + local.get $oldEntry + call $~lib/map/MapEntry>#get:value + local.set $14 + global.get $~lib/memory/__stack_pointer + local.get $14 + i32.store $0 offset=8 + local.get $14 + call $~lib/map/MapEntry>#set:value + local.get $oldEntryKey + call $~lib/util/hash/HASH + local.get $newBucketsMask + i32.and + local.set $newBucketIndex + local.get $newBuckets + local.get $newBucketIndex + i32.const 4 + i32.mul + i32.add + local.set $newBucketPtrBase + local.get $newEntry + local.get $newBucketPtrBase + i32.load $0 + call $~lib/map/MapEntry>#set:taggedNext + local.get $newBucketPtrBase + local.get $newPtr + i32.store $0 + local.get $newPtr + block $~lib/map/ENTRY_SIZE>|inlined.3 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE>|inlined.3 + end + i32.add + local.set $newPtr + end + local.get $oldPtr + block $~lib/map/ENTRY_SIZE>|inlined.4 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE>|inlined.4 + end + i32.add + local.set $oldPtr + br $while-continue|0 + end + end + local.get $this + local.get $newBuckets + call $~lib/map/Map>#set:buckets + local.get $this + local.get $newBucketsMask + call $~lib/map/Map>#set:bucketsMask + local.get $this + local.get $newEntries + call $~lib/map/Map>#set:entries + local.get $this + local.get $newEntriesCapacity + call $~lib/map/Map>#set:entriesCapacity + local.get $this + local.get $this + call $~lib/map/Map>#get:entriesCount + call $~lib/map/Map>#set:entriesOffset + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/finalizationregistry/BaseRegistry.finalizeAll (type $i32_=>_none) (param $ptr i32) + (local $registries i32) + (local $i i32) + (local $numRegistries i32) + (local $4 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store $0 + global.get $~lib/finalizationregistry/REGISTRIES_FOR_PTR + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store $0 + local.get $4 + local.get $ptr + call $~lib/map/Map>#has + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + global.get $~lib/memory/__stack_pointer + global.get $~lib/finalizationregistry/REGISTRIES_FOR_PTR + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store $0 + local.get $4 + local.get $ptr + call $~lib/map/Map>#get + local.tee $registries + i32.store $0 offset=4 + i32.const 0 + local.set $i + local.get $registries + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#get:length + local.set $numRegistries + loop $for-loop|0 + local.get $i + local.get $numRegistries + i32.lt_s + if + local.get $registries + local.get $i + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#__get + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store $0 + local.get $4 + local.get $ptr + call $~lib/finalizationregistry/BaseRegistry#finalize@override + local.get $i + i32.const 1 + i32.add + local.set $i + br $for-loop|0 + end + end + global.get $~lib/finalizationregistry/REGISTRIES_FOR_PTR + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store $0 + local.get $4 + local.get $ptr + call $~lib/map/Map>#delete + drop + global.get $~lib/finalizationregistry/PREVIOUS_FINALIZER + if + local.get $ptr + global.get $~lib/finalizationregistry/PREVIOUS_FINALIZER + call_indirect $0 (type $i32_=>_none) + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + ) (func $~lib/map/Map#constructor (type $i32_=>_i32) (param $this i32) (result i32) (local $1 i32) global.get $~lib/memory/__stack_pointer @@ -4047,7 +4702,7 @@ i32.eqz if global.get $~lib/memory/__stack_pointer - i32.const 12 + i32.const 8 i32.const 7 call $~lib/rt/itcms/__new local.tee $this @@ -4075,7 +4730,7 @@ if global.get $~lib/rt/__finalize global.set $~lib/finalizationregistry/PREVIOUS_FINALIZER - i32.const 656 + i32.const 832 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -4124,28 +4779,98 @@ global.set $~lib/memory/__stack_pointer ) (func $~lib/finalizationregistry/FinalizationRegistry#register (type $i32_i32_i32_=>_none) (param $this i32) (param $key i32) (param $value i32) - (local $3 i32) + (local $ptr i32) + (local $registries i32) + (local $5 i32) global.get $~lib/memory/__stack_pointer - i32.const 4 + i32.const 12 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store $0 + global.get $~lib/memory/__stack_pointer i32.const 0 + i32.store $0 offset=8 + local.get $key + local.set $ptr + local.get $this + call $~lib/finalizationregistry/FinalizationRegistry#get:entries + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 i32.store $0 + local.get $5 + local.get $ptr + call $~lib/map/Map#has + if + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + return + end local.get $this call $~lib/finalizationregistry/FinalizationRegistry#get:entries - local.set $3 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $3 + local.get $5 i32.store $0 - local.get $3 - local.get $key + local.get $5 + local.get $ptr local.get $value call $~lib/map/Map#set drop + global.get $~lib/finalizationregistry/REGISTRIES_FOR_PTR + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store $0 + local.get $5 + local.get $ptr + call $~lib/map/Map>#has + if + global.get $~lib/finalizationregistry/REGISTRIES_FOR_PTR + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store $0 offset=4 + local.get $5 + local.get $ptr + call $~lib/map/Map>#get + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store $0 + local.get $5 + local.get $this + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#push + drop + else + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 0 + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#constructor + local.tee $registries + i32.store $0 offset=8 + local.get $registries + local.get $this + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#push + drop + global.get $~lib/finalizationregistry/REGISTRIES_FOR_PTR + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store $0 + local.get $5 + local.get $ptr + local.get $registries + call $~lib/map/Map>#set + drop + end global.get $~lib/memory/__stack_pointer - i32.const 4 + i32.const 12 i32.add global.set $~lib/memory/__stack_pointer ) @@ -4431,7 +5156,10 @@ call $~lib/map/Map#constructor global.set $~lib/weakref/ALL_REFERENCES i32.const 0 - i32.const 688 + call $~lib/map/Map>#constructor + global.set $~lib/finalizationregistry/REGISTRIES_FOR_PTR + i32.const 0 + i32.const 864 local.set $7 global.get $~lib/memory/__stack_pointer local.get $7 @@ -4450,7 +5178,7 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 896 i32.const 11 i32.const 3 call $~lib/builtins/abort @@ -4464,7 +5192,7 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 896 i32.const 13 i32.const 3 call $~lib/builtins/abort @@ -4481,7 +5209,7 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 896 i32.const 28 i32.const 3 call $~lib/builtins/abort @@ -4495,7 +5223,7 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 896 i32.const 32 i32.const 3 call $~lib/builtins/abort @@ -4517,7 +5245,7 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 896 i32.const 36 i32.const 3 call $~lib/builtins/abort @@ -4538,7 +5266,7 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 896 i32.const 51 i32.const 3 call $~lib/builtins/abort @@ -4551,7 +5279,7 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 896 i32.const 52 i32.const 3 call $~lib/builtins/abort @@ -4565,7 +5293,7 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 896 i32.const 55 i32.const 3 call $~lib/builtins/abort @@ -4578,7 +5306,7 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 896 i32.const 56 i32.const 3 call $~lib/builtins/abort @@ -4595,7 +5323,7 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 896 i32.const 59 i32.const 3 call $~lib/builtins/abort @@ -4608,7 +5336,7 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 896 i32.const 60 i32.const 3 call $~lib/builtins/abort @@ -4630,7 +5358,7 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 896 i32.const 65 i32.const 3 call $~lib/builtins/abort @@ -4643,7 +5371,7 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 896 i32.const 66 i32.const 3 call $~lib/builtins/abort @@ -4689,27 +5417,253 @@ call $~lib/finalizationregistry/FinalizationRegistry#get:entries local.set $3 global.get $~lib/memory/__stack_pointer - local.get $3 + local.get $3 + i32.store $0 + local.get $3 + local.get $ptr + call $~lib/map/Map#delete + drop + local.get $value + i32.const 1 + global.set $~argumentsLength + local.get $this + call $~lib/finalizationregistry/FinalizationRegistry#get:finalizer + i32.load $0 + call_indirect $0 (type $i32_=>_none) + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/arraybuffer/ArrayBuffer#constructor (type $i32_i32_=>_i32) (param $this i32) (param $length i32) (result i32) + (local $buffer i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $length + i32.const 1073741820 + i32.gt_u + if + i32.const 432 + i32.const 480 + i32.const 52 + i32.const 43 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.get $length + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $buffer + i32.store $0 + i32.const 2 + global.get $~lib/shared/runtime/Runtime.Incremental + i32.ne + drop + local.get $buffer + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + ) + (func $~lib/map/Map#set (type $i32_i32_i32_=>_i32) (param $this i32) (param $key i32) (param $value i32) (result i32) + (local $hashCode i32) + (local $entry i32) + (local $entries i32) + (local $6 i32) + (local $bucketPtrBase i32) + (local $8 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $key + call $~lib/util/hash/HASH + local.set $hashCode + local.get $this + local.get $key + local.get $hashCode + call $~lib/map/Map#find + local.set $entry + local.get $entry + if + local.get $entry + local.get $value + call $~lib/map/MapEntry#set:value + i32.const 0 + drop + else + local.get $this + call $~lib/map/Map#get:entriesOffset + local.get $this + call $~lib/map/Map#get:entriesCapacity + i32.eq + if + local.get $this + local.get $this + call $~lib/map/Map#get:entriesCount + local.get $this + call $~lib/map/Map#get:entriesCapacity + i32.const 3 + i32.mul + i32.const 4 + i32.div_s + i32.lt_s + if (result i32) + local.get $this + call $~lib/map/Map#get:bucketsMask + else + local.get $this + call $~lib/map/Map#get:bucketsMask + i32.const 1 + i32.shl + i32.const 1 + i32.or + end + call $~lib/map/Map#rehash + end + global.get $~lib/memory/__stack_pointer + local.get $this + call $~lib/map/Map#get:entries + local.tee $entries + i32.store $0 + local.get $entries + local.get $this + local.get $this + call $~lib/map/Map#get:entriesOffset + local.tee $6 + i32.const 1 + i32.add + call $~lib/map/Map#set:entriesOffset + local.get $6 + block $~lib/map/ENTRY_SIZE|inlined.5 (result i32) + i32.const 12 + br $~lib/map/ENTRY_SIZE|inlined.5 + end + i32.mul + i32.add + local.set $entry + local.get $entry + local.get $key + call $~lib/map/MapEntry#set:key + i32.const 0 + drop + local.get $entry + local.get $value + call $~lib/map/MapEntry#set:value + i32.const 0 + drop + local.get $this + local.get $this + call $~lib/map/Map#get:entriesCount + i32.const 1 + i32.add + call $~lib/map/Map#set:entriesCount + local.get $this + call $~lib/map/Map#get:buckets + local.get $hashCode + local.get $this + call $~lib/map/Map#get:bucketsMask + i32.and + i32.const 4 + i32.mul + i32.add + local.set $bucketPtrBase + local.get $entry + local.get $bucketPtrBase + i32.load $0 + call $~lib/map/MapEntry#set:taggedNext + local.get $bucketPtrBase + local.get $entry + i32.store $0 + end + local.get $this + local.set $8 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $8 + return + ) + (func $~lib/object/Object#constructor (type $i32_=>_i32) (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 0 + call $~lib/rt/itcms/__new + local.tee $this + i32.store $0 + end + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $~lib/finalizationregistry/BaseRegistry#constructor (type $i32_=>_i32) (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 8 + call $~lib/rt/itcms/__new + local.tee $this i32.store $0 - local.get $3 - local.get $ptr - call $~lib/map/Map#delete - drop - local.get $value - i32.const 1 - global.set $~argumentsLength - local.get $this - call $~lib/finalizationregistry/FinalizationRegistry#get:finalizer - i32.load $0 - call_indirect $0 (type $i32_=>_none) end global.get $~lib/memory/__stack_pointer + local.get $this + call $~lib/object/Object#constructor + local.tee $this + i32.store $0 + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer + local.get $1 ) - (func $~lib/arraybuffer/ArrayBuffer#constructor (type $i32_i32_=>_i32) (param $this i32) (param $length i32) (result i32) - (local $buffer i32) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#__get (type $i32_i32_=>_i32) (param $this i32) (param $index i32) (result i32) + (local $value i32) (local $3 i32) global.get $~lib/memory/__stack_pointer i32.const 4 @@ -4719,28 +5673,44 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store $0 - local.get $length - i32.const 1073741820 - i32.gt_u + local.get $index + local.get $this + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#get:length_ + i32.ge_u if - i32.const 432 - i32.const 480 - i32.const 52 - i32.const 43 + i32.const 224 + i32.const 656 + i32.const 114 + i32.const 42 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - local.get $length - i32.const 1 - call $~lib/rt/itcms/__new - local.tee $buffer - i32.store $0 + local.get $this + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#get:dataStart + local.get $index i32.const 2 - global.get $~lib/shared/runtime/Runtime.Incremental - i32.ne + i32.shl + i32.add + i32.load $0 + local.tee $value + i32.store $0 + i32.const 1 drop - local.get $buffer + i32.const 0 + i32.eqz + drop + local.get $value + i32.eqz + if + i32.const 704 + i32.const 656 + i32.const 118 + i32.const 40 + call $~lib/builtins/abort + unreachable + end + local.get $value local.set $3 global.get $~lib/memory/__stack_pointer i32.const 4 @@ -4749,7 +5719,7 @@ local.get $3 return ) - (func $~lib/map/Map#set (type $i32_i32_i32_=>_i32) (param $this i32) (param $key i32) (param $value i32) (result i32) + (func $~lib/map/Map#set (type $i32_i32_i32_=>_i32) (param $this i32) (param $key i32) (param $value i32) (result i32) (local $hashCode i32) (local $entry i32) (local $entries i32) @@ -4770,27 +5740,27 @@ local.get $this local.get $key local.get $hashCode - call $~lib/map/Map#find + call $~lib/map/Map#find local.set $entry local.get $entry if local.get $entry local.get $value - call $~lib/map/MapEntry#set:value + call $~lib/map/MapEntry#set:value i32.const 0 drop else local.get $this - call $~lib/map/Map#get:entriesOffset + call $~lib/map/Map#get:entriesOffset local.get $this - call $~lib/map/Map#get:entriesCapacity + call $~lib/map/Map#get:entriesCapacity i32.eq if local.get $this local.get $this - call $~lib/map/Map#get:entriesCount + call $~lib/map/Map#get:entriesCount local.get $this - call $~lib/map/Map#get:entriesCapacity + call $~lib/map/Map#get:entriesCapacity i32.const 3 i32.mul i32.const 4 @@ -4798,59 +5768,59 @@ i32.lt_s if (result i32) local.get $this - call $~lib/map/Map#get:bucketsMask + call $~lib/map/Map#get:bucketsMask else local.get $this - call $~lib/map/Map#get:bucketsMask + call $~lib/map/Map#get:bucketsMask i32.const 1 i32.shl i32.const 1 i32.or end - call $~lib/map/Map#rehash + call $~lib/map/Map#rehash end global.get $~lib/memory/__stack_pointer local.get $this - call $~lib/map/Map#get:entries + call $~lib/map/Map#get:entries local.tee $entries i32.store $0 local.get $entries local.get $this local.get $this - call $~lib/map/Map#get:entriesOffset + call $~lib/map/Map#get:entriesOffset local.tee $6 i32.const 1 i32.add - call $~lib/map/Map#set:entriesOffset + call $~lib/map/Map#set:entriesOffset local.get $6 - block $~lib/map/ENTRY_SIZE|inlined.5 (result i32) + block $~lib/map/ENTRY_SIZE|inlined.5 (result i32) i32.const 12 - br $~lib/map/ENTRY_SIZE|inlined.5 + br $~lib/map/ENTRY_SIZE|inlined.5 end i32.mul i32.add local.set $entry local.get $entry local.get $key - call $~lib/map/MapEntry#set:key + call $~lib/map/MapEntry#set:key i32.const 0 drop local.get $entry local.get $value - call $~lib/map/MapEntry#set:value + call $~lib/map/MapEntry#set:value i32.const 0 drop local.get $this local.get $this - call $~lib/map/Map#get:entriesCount + call $~lib/map/Map#get:entriesCount i32.const 1 i32.add - call $~lib/map/Map#set:entriesCount + call $~lib/map/Map#set:entriesCount local.get $this - call $~lib/map/Map#get:buckets + call $~lib/map/Map#get:buckets local.get $hashCode local.get $this - call $~lib/map/Map#get:bucketsMask + call $~lib/map/Map#get:bucketsMask i32.and i32.const 4 i32.mul @@ -4859,7 +5829,7 @@ local.get $entry local.get $bucketPtrBase i32.load $0 - call $~lib/map/MapEntry#set:taggedNext + call $~lib/map/MapEntry#set:taggedNext local.get $bucketPtrBase local.get $entry i32.store $0 @@ -4873,7 +5843,97 @@ local.get $8 return ) - (func $~lib/map/Map#set (type $i32_i32_i32_=>_i32) (param $this i32) (param $key i32) (param $value i32) (result i32) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#constructor (type $i32_i32_=>_i32) (param $this i32) (param $length i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $bufferSize i32) + (local $buffer i32) + (local $6 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store $0 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.const 11 + call $~lib/rt/itcms/__new + local.tee $this + i32.store $0 + end + local.get $this + i32.const 0 + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#set:buffer + local.get $this + i32.const 0 + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#set:dataStart + local.get $this + i32.const 0 + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#set:byteLength + local.get $this + i32.const 0 + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#set:length_ + local.get $length + i32.const 1073741820 + i32.const 2 + i32.shr_u + i32.gt_u + if + i32.const 432 + i32.const 656 + i32.const 70 + i32.const 60 + call $~lib/builtins/abort + unreachable + end + local.get $length + local.tee $2 + i32.const 8 + local.tee $3 + local.get $2 + local.get $3 + i32.gt_u + select + i32.const 2 + i32.shl + local.set $bufferSize + global.get $~lib/memory/__stack_pointer + local.get $bufferSize + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $buffer + i32.store $0 offset=4 + i32.const 2 + global.get $~lib/shared/runtime/Runtime.Incremental + i32.ne + drop + local.get $this + local.get $buffer + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#set:buffer + local.get $this + local.get $buffer + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#set:dataStart + local.get $this + local.get $bufferSize + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#set:byteLength + local.get $this + local.get $length + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#set:length_ + local.get $this + local.set $6 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $6 + ) + (func $~lib/map/Map>#set (type $i32_i32_i32_=>_i32) (param $this i32) (param $key i32) (param $value i32) (result i32) (local $hashCode i32) (local $entry i32) (local $entries i32) @@ -4894,27 +5954,31 @@ local.get $this local.get $key local.get $hashCode - call $~lib/map/Map#find + call $~lib/map/Map>#find local.set $entry local.get $entry if local.get $entry local.get $value - call $~lib/map/MapEntry#set:value - i32.const 0 + call $~lib/map/MapEntry>#set:value + i32.const 1 drop + local.get $this + local.get $value + i32.const 1 + call $~lib/rt/itcms/__link else local.get $this - call $~lib/map/Map#get:entriesOffset + call $~lib/map/Map>#get:entriesOffset local.get $this - call $~lib/map/Map#get:entriesCapacity + call $~lib/map/Map>#get:entriesCapacity i32.eq if local.get $this local.get $this - call $~lib/map/Map#get:entriesCount + call $~lib/map/Map>#get:entriesCount local.get $this - call $~lib/map/Map#get:entriesCapacity + call $~lib/map/Map>#get:entriesCapacity i32.const 3 i32.mul i32.const 4 @@ -4922,59 +5986,63 @@ i32.lt_s if (result i32) local.get $this - call $~lib/map/Map#get:bucketsMask + call $~lib/map/Map>#get:bucketsMask else local.get $this - call $~lib/map/Map#get:bucketsMask + call $~lib/map/Map>#get:bucketsMask i32.const 1 i32.shl i32.const 1 i32.or end - call $~lib/map/Map#rehash + call $~lib/map/Map>#rehash end global.get $~lib/memory/__stack_pointer local.get $this - call $~lib/map/Map#get:entries + call $~lib/map/Map>#get:entries local.tee $entries i32.store $0 local.get $entries local.get $this local.get $this - call $~lib/map/Map#get:entriesOffset + call $~lib/map/Map>#get:entriesOffset local.tee $6 i32.const 1 i32.add - call $~lib/map/Map#set:entriesOffset + call $~lib/map/Map>#set:entriesOffset local.get $6 - block $~lib/map/ENTRY_SIZE|inlined.5 (result i32) + block $~lib/map/ENTRY_SIZE>|inlined.5 (result i32) i32.const 12 - br $~lib/map/ENTRY_SIZE|inlined.5 + br $~lib/map/ENTRY_SIZE>|inlined.5 end i32.mul i32.add local.set $entry local.get $entry local.get $key - call $~lib/map/MapEntry#set:key + call $~lib/map/MapEntry>#set:key i32.const 0 drop local.get $entry local.get $value - call $~lib/map/MapEntry#set:value - i32.const 0 + call $~lib/map/MapEntry>#set:value + i32.const 1 drop local.get $this + local.get $value + i32.const 1 + call $~lib/rt/itcms/__link local.get $this - call $~lib/map/Map#get:entriesCount + local.get $this + call $~lib/map/Map>#get:entriesCount i32.const 1 i32.add - call $~lib/map/Map#set:entriesCount + call $~lib/map/Map>#set:entriesCount local.get $this - call $~lib/map/Map#get:buckets + call $~lib/map/Map>#get:buckets local.get $hashCode local.get $this - call $~lib/map/Map#get:bucketsMask + call $~lib/map/Map>#get:bucketsMask i32.and i32.const 4 i32.mul @@ -4983,7 +6051,7 @@ local.get $entry local.get $bucketPtrBase i32.load $0 - call $~lib/map/MapEntry#set:taggedNext + call $~lib/map/MapEntry>#set:taggedNext local.get $bucketPtrBase local.get $entry i32.store $0 @@ -4997,34 +6065,6 @@ local.get $8 return ) - (func $~lib/object/Object#constructor (type $i32_=>_i32) (param $this i32) (result i32) - (local $1 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store $0 - local.get $this - i32.eqz - if - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.const 0 - call $~lib/rt/itcms/__new - local.tee $this - i32.store $0 - end - local.get $this - local.set $1 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $1 - ) (func $std/weakref/Dummy#constructor (type $i32_=>_i32) (param $this i32) (result i32) (local $1 i32) global.get $~lib/memory/__stack_pointer @@ -5075,7 +6115,7 @@ i32.ge_u if i32.const 224 - i32.const 848 + i32.const 656 i32.const 114 i32.const 42 call $~lib/builtins/abort @@ -5099,8 +6139,8 @@ local.get $value i32.eqz if - i32.const 896 - i32.const 848 + i32.const 704 + i32.const 656 i32.const 118 i32.const 40 call $~lib/builtins/abort diff --git a/tests/compiler/std/weakref.release.wat b/tests/compiler/std/weakref.release.wat index 3b00ada813..9e6dc64c58 100644 --- a/tests/compiler/std/weakref.release.wat +++ b/tests/compiler/std/weakref.release.wat @@ -1,10 +1,10 @@ (module (type $i32_=>_none (func_subtype (param i32) func)) - (type $none_=>_none (func_subtype func)) (type $i32_i32_=>_none (func_subtype (param i32 i32) func)) - (type $none_=>_i32 (func_subtype (result i32) func)) - (type $i32_i32_=>_i32 (func_subtype (param i32 i32) (result i32) func)) + (type $none_=>_none (func_subtype func)) (type $i32_i32_i32_=>_none (func_subtype (param i32 i32 i32) func)) + (type $i32_i32_=>_i32 (func_subtype (param i32 i32) (result i32) func)) + (type $none_=>_i32 (func_subtype (result i32) func)) (type $i32_=>_i32 (func_subtype (param i32) (result i32) func)) (type $i32_i32_i32_i32_=>_none (func_subtype (param i32 i32 i32 i32) func)) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) @@ -21,11 +21,11 @@ (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~lib/weakref/ALL_REFERENCES (mut i32) (i32.const 0)) (global $~lib/weakref/CURRENT_COOKIE (mut i32) (i32.const 0)) - (global $~lib/finalizationregistry/ALL_REGISTRIES (mut i32) (i32.const 0)) (global $~lib/finalizationregistry/INITIALIZED (mut i32) (i32.const 0)) (global $~lib/finalizationregistry/PREVIOUS_FINALIZER (mut i32) (i32.const 0)) + (global $~lib/finalizationregistry/REGISTRIES_FOR_PTR (mut i32) (i32.const 0)) (global $~lib/weakref/REGISTRY (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34852)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34860)) (memory $0 1) (data (i32.const 1036) "<") (data (i32.const 1048) "\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") @@ -45,22 +45,21 @@ (data (i32.const 1560) "\02\00\00\00$\00\00\00K\00e\00y\00 \00d\00o\00e\00s\00 \00n\00o\00t\00 \00e\00x\00i\00s\00t") (data (i32.const 1612) ",") (data (i32.const 1624) "\02\00\00\00\16\00\00\00~\00l\00i\00b\00/\00m\00a\00p\00.\00t\00s") - (data (i32.const 1660) "\1c") - (data (i32.const 1672) "\n\00\00\00\08\00\00\00\01") - (data (i32.const 1692) "\1c") - (data (i32.const 1704) "\n\00\00\00\08\00\00\00\02") - (data (i32.const 1724) ",") - (data (i32.const 1736) "\02\00\00\00\1c\00\00\00s\00t\00d\00/\00w\00e\00a\00k\00r\00e\00f\00.\00t\00s") - (data (i32.const 1772) "\1c") - (data (i32.const 1784) "\01") - (data (i32.const 1804) ",") - (data (i32.const 1816) "\0b\00\00\00\10\00\00\00\00\07\00\00\00\07") - (data (i32.const 1852) ",") - (data (i32.const 1864) "\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") - (data (i32.const 1900) "|") - (data (i32.const 1912) "\02\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y") - (data (i32.const 2032) "\0c\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00\10\01\02") - (data (i32.const 2072) "\10\01\02\00\00\00\00\00\02A") + (data (i32.const 1660) ",") + (data (i32.const 1672) "\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") + (data (i32.const 1708) "|") + (data (i32.const 1720) "\02\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y") + (data (i32.const 1836) "\1c") + (data (i32.const 1848) "\n\00\00\00\08\00\00\00\01") + (data (i32.const 1868) "\1c") + (data (i32.const 1880) "\n\00\00\00\08\00\00\00\02") + (data (i32.const 1900) ",") + (data (i32.const 1912) "\02\00\00\00\1c\00\00\00s\00t\00d\00/\00w\00e\00a\00k\00r\00e\00f\00.\00t\00s") + (data (i32.const 1948) "\1c") + (data (i32.const 1960) "\01") + (data (i32.const 1980) ",") + (data (i32.const 1992) "\r\00\00\00\10\00\00\00\b0\07\00\00\b0\07") + (data (i32.const 2032) "\0e\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00\10\01\02\00\00\00\00\00 \00\00\00\10\01\02\00\00\00\00\00\02A\00\00\10A\02\00\02A") (table $0 3 3 funcref) (elem $0 (i32.const 1) $~lib/finalizationregistry/BaseRegistry.finalizeAll $start:~lib/weakref~anonymous|0) (export "memory" (memory $0)) @@ -68,7 +67,7 @@ (func $~lib/rt/itcms/visitRoots (type $none_=>_none) (local $0 i32) (local $1 i32) - global.get $~lib/finalizationregistry/ALL_REGISTRIES + global.get $~lib/finalizationregistry/REGISTRIES_FOR_PTR local.tee $0 if local.get $0 @@ -86,13 +85,13 @@ local.get $0 call $byn-split-outlined-A$~lib/rt/itcms/__visit end - i32.const 1824 + i32.const 2000 call $byn-split-outlined-A$~lib/rt/itcms/__visit i32.const 1248 call $byn-split-outlined-A$~lib/rt/itcms/__visit i32.const 1456 call $byn-split-outlined-A$~lib/rt/itcms/__visit - i32.const 1920 + i32.const 1728 call $byn-split-outlined-A$~lib/rt/itcms/__visit i32.const 1568 call $byn-split-outlined-A$~lib/rt/itcms/__visit @@ -171,7 +170,7 @@ i32.load $0 offset=8 i32.eqz local.get $0 - i32.const 34852 + i32.const 34860 i32.lt_u i32.and i32.eqz @@ -940,7 +939,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 34852 + i32.const 34860 i32.lt_u if local.get $0 @@ -1040,7 +1039,7 @@ unreachable end local.get $0 - i32.const 34852 + i32.const 34860 i32.lt_u if local.get $0 @@ -1071,7 +1070,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 34852 + i32.const 34860 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1659,7 +1658,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2084 + i32.const 2092 i32.lt_s if i32.const 34880 @@ -1814,182 +1813,6 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/finalizationregistry/BaseRegistry.finalizeAll (type $i32_=>_none) (param $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - block $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 2084 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - local.tee $1 - i32.const 0 - i32.store $0 - local.get $1 - global.get $~lib/finalizationregistry/ALL_REGISTRIES - local.tee $2 - i32.store $0 - loop $for-loop|0 - local.get $2 - if - block $__inlined_func$~lib/finalizationregistry/BaseRegistry#finalize@override - local.get $2 - i32.const 8 - i32.sub - i32.load $0 - i32.const 7 - i32.eq - if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 2084 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - local.tee $1 - i32.const 0 - i32.store $0 - local.get $1 - local.get $2 - i32.load $0 offset=4 - local.tee $1 - i32.store $0 - local.get $1 - i32.load $0 - local.get $1 - i32.load $0 offset=4 - local.get $0 - i32.const -1028477379 - i32.mul - i32.const 374761397 - i32.add - i32.const 17 - i32.rotl - i32.const 668265263 - i32.mul - local.tee $1 - local.get $1 - i32.const 15 - i32.shr_u - i32.xor - i32.const -2048144777 - i32.mul - local.tee $1 - local.get $1 - i32.const 13 - i32.shr_u - i32.xor - i32.const -1028477379 - i32.mul - local.tee $1 - local.get $1 - i32.const 16 - i32.shr_u - i32.xor - i32.and - i32.const 2 - i32.shl - i32.add - i32.load $0 - local.set $1 - block $__inlined_func$~lib/map/Map#find - loop $while-continue|0 - local.get $1 - if - local.get $1 - i32.load $0 offset=8 - local.tee $3 - i32.const 1 - i32.and - if (result i32) - i32.const 0 - else - local.get $1 - i32.load $0 - local.get $0 - i32.eq - end - br_if $__inlined_func$~lib/map/Map#find - local.get $3 - i32.const -2 - i32.and - local.set $1 - br $while-continue|0 - end - end - i32.const 0 - local.set $1 - end - local.get $1 - if - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.load $0 offset=4 - local.tee $1 - i32.store $0 - local.get $1 - local.get $0 - call $~lib/map/Map#get - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.load $0 offset=4 - local.tee $3 - i32.store $0 - local.get $3 - local.get $0 - call $~lib/map/Map#delete - drop - local.get $1 - local.get $2 - i32.load $0 offset=8 - i32.load $0 - call_indirect $0 (type $i32_=>_none) - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - br $__inlined_func$~lib/finalizationregistry/BaseRegistry#finalize@override - end - unreachable - end - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.load $0 - local.tee $2 - i32.store $0 - br $for-loop|0 - end - end - global.get $~lib/finalizationregistry/PREVIOUS_FINALIZER - if - local.get $0 - global.get $~lib/finalizationregistry/PREVIOUS_FINALIZER - call_indirect $0 (type $i32_=>_none) - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - return - end - i32.const 34880 - i32.const 34928 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable - ) (func $~lib/map/Map#delete (type $i32_i32_=>_i32) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) @@ -2114,152 +1937,183 @@ end i32.const 1 ) - (func $~lib/rt/itcms/__collect (type $none_=>_none) - global.get $~lib/rt/itcms/state - i32.const 0 - i32.gt_s - if - loop $while-continue|0 - global.get $~lib/rt/itcms/state - if - call $~lib/rt/itcms/step - drop - br $while-continue|0 - end - end - end - call $~lib/rt/itcms/step - drop - loop $while-continue|1 - global.get $~lib/rt/itcms/state - if - call $~lib/rt/itcms/step - drop - br $while-continue|1 - end - end - global.get $~lib/rt/itcms/total - i64.extend_i32_u - i64.const 200 - i64.mul - i64.const 100 - i64.div_u - i32.wrap_i64 - i32.const 1024 - i32.add - global.set $~lib/rt/itcms/threshold - ) - (func $~lib/array/ensureCapacity (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) - (local $2 i32) + (func $~lib/array/ensureCapacity (type $i32_i32_i32_=>_none) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) + (local $4 i32) + local.get $1 local.get $0 - i32.const 1832 - i32.load $0 - local.tee $3 + i32.load $0 offset=8 + local.tee $4 i32.const 2 i32.shr_u i32.gt_u if - local.get $0 + local.get $1 i32.const 268435455 i32.gt_u if i32.const 1456 - i32.const 1872 + i32.const 1680 i32.const 19 i32.const 48 call $~lib/builtins/abort unreachable end - i32.const 1824 + local.get $0 i32.load $0 - local.set $2 + local.set $3 i32.const 8 - local.get $0 - local.get $0 + local.get $1 + local.get $1 i32.const 8 i32.le_u select i32.const 2 i32.shl - local.set $0 - local.get $1 + local.set $1 + local.get $2 if i32.const 1073741820 - local.get $3 + local.get $4 i32.const 1 i32.shl - local.tee $1 - local.get $1 + local.tee $2 + local.get $2 i32.const 1073741820 i32.ge_u select - local.tee $1 - local.get $0 - local.get $0 + local.tee $2 local.get $1 + local.get $1 + local.get $2 i32.lt_u select - local.set $0 + local.set $1 end block $__inlined_func$~lib/rt/itcms/__renew - local.get $2 + local.get $3 i32.const 20 i32.sub - local.tee $3 + local.tee $4 i32.load $0 i32.const -4 i32.and i32.const 16 i32.sub - local.get $0 + local.get $1 i32.ge_u if - local.get $3 - local.get $0 + local.get $4 + local.get $1 i32.store $0 offset=16 - local.get $2 - local.set $1 + local.get $3 + local.set $2 br $__inlined_func$~lib/rt/itcms/__renew end - local.get $0 - local.get $3 - i32.load $0 offset=12 + local.get $1 + local.get $4 + i32.load $0 offset=12 call $~lib/rt/itcms/__new - local.tee $1 - local.get $2 - local.get $0 + local.tee $2 local.get $3 + local.get $1 + local.get $4 i32.load $0 offset=16 - local.tee $3 - local.get $0 - local.get $3 + local.tee $4 + local.get $1 + local.get $4 i32.lt_u select memory.copy $0 $0 end - local.get $1 local.get $2 + local.get $3 i32.ne if - i32.const 1824 - local.get $1 - i32.store $0 - i32.const 1828 - local.get $1 + local.get $0 + local.get $2 i32.store $0 - local.get $1 + local.get $0 + local.get $2 + i32.store $0 offset=4 + local.get $2 if - i32.const 1824 - local.get $1 + local.get $0 + local.get $2 i32.const 0 call $byn-split-outlined-A$~lib/rt/itcms/__link end end - i32.const 1832 local.get $0 - i32.store $0 + local.get $1 + i32.store $0 offset=8 + end + ) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#push (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + local.get $0 + i32.load $0 offset=12 + local.tee $2 + i32.const 1 + i32.add + local.tee $3 + i32.const 1 + call $~lib/array/ensureCapacity + local.get $0 + i32.load $0 offset=4 + local.get $2 + i32.const 2 + i32.shl + i32.add + local.get $1 + i32.store $0 + local.get $1 + if + local.get $0 + local.get $1 + i32.const 1 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + local.get $0 + local.get $3 + i32.store $0 offset=12 + ) + (func $~lib/rt/itcms/__collect (type $none_=>_none) + global.get $~lib/rt/itcms/state + i32.const 0 + i32.gt_s + if + loop $while-continue|0 + global.get $~lib/rt/itcms/state + if + call $~lib/rt/itcms/step + drop + br $while-continue|0 + end + end + end + call $~lib/rt/itcms/step + drop + loop $while-continue|1 + global.get $~lib/rt/itcms/state + if + call $~lib/rt/itcms/step + drop + br $while-continue|1 + end end + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i64.const 200 + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold ) (func $~lib/map/Map~visit (type $i32_=>_none) (param $0 i32) (local $1 i32) @@ -2278,27 +2132,83 @@ call $byn-split-outlined-A$~lib/rt/itcms/__visit end ) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>~visit (type $i32_=>_none) (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + i32.load $0 offset=4 + local.tee $1 + local.get $0 + i32.load $0 offset=12 + i32.const 2 + i32.shl + i32.add + local.set $2 + loop $while-continue|0 + local.get $1 + local.get $2 + i32.lt_u + if + local.get $1 + i32.load $0 + local.tee $3 + if + local.get $3 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + local.get $1 + i32.const 4 + i32.add + local.set $1 + br $while-continue|0 + end + end + local.get $0 + i32.load $0 + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + ) (func $~lib/rt/__visit_members (type $i32_=>_none) (param $0 i32) (local $1 i32) (local $2 i32) (local $3 i32) - block $folding-inner0 - block $invalid - block $~lib/array/Array - block $~lib/function/Function<%28usize%29=>void> - block $~lib/map/Map - block $~lib/finalizationregistry/FinalizationRegistry - block $~lib/map/Map - block $~lib/weakref/WeakRef - block $std/weakref/Dummy - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - block $~lib/object/Object + block $invalid + block $~lib/array/Array + block $~lib/map/Map> + block $~lib/array/Array<~lib/finalizationregistry/BaseRegistry> + block $~lib/function/Function<%28usize%29=>void> + block $~lib/map/Map + block $~lib/finalizationregistry/BaseRegistry + block $~lib/finalizationregistry/FinalizationRegistry + block $~lib/map/Map + block $~lib/weakref/WeakRef + block $std/weakref/Dummy + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + block $~lib/object/Object + local.get $0 + i32.const 8 + i32.sub + i32.load $0 + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $std/weakref/Dummy $~lib/weakref/WeakRef $~lib/map/Map $~lib/finalizationregistry/FinalizationRegistry $~lib/finalizationregistry/BaseRegistry $~lib/map/Map $~lib/function/Function<%28usize%29=>void> $~lib/array/Array<~lib/finalizationregistry/BaseRegistry> $~lib/map/Map> $~lib/array/Array $invalid + end + return + end + return + end + return + end + local.get $0 + i32.load $0 + local.tee $0 + if local.get $0 - i32.const 8 - i32.sub - i32.load $0 - br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $folding-inner0 $std/weakref/Dummy $~lib/weakref/WeakRef $~lib/map/Map $~lib/finalizationregistry/FinalizationRegistry $folding-inner0 $~lib/map/Map $~lib/function/Function<%28usize%29=>void> $~lib/array/Array $invalid + call $byn-split-outlined-A$~lib/rt/itcms/__visit end return end @@ -2306,108 +2216,119 @@ end return end + local.get $0 + call $~lib/map/Map~visit return end + local.get $0 + i32.load $0 + local.tee $1 + if + local.get $1 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + local.get $0 + i32.load $0 offset=4 + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end return end - local.get $0 - call $~lib/map/Map~visit return end local.get $0 - i32.load $0 - local.tee $1 - if - local.get $1 - call $byn-split-outlined-A$~lib/rt/itcms/__visit - end - local.get $0 - i32.load $0 offset=4 - local.tee $1 - if - local.get $1 - call $byn-split-outlined-A$~lib/rt/itcms/__visit - end - local.get $0 - i32.load $0 offset=8 - local.tee $0 - if - local.get $0 - call $byn-split-outlined-A$~lib/rt/itcms/__visit - end + call $~lib/map/Map~visit return end local.get $0 - call $~lib/map/Map~visit + i32.load $0 offset=4 + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end return end local.get $0 - i32.load $0 offset=4 - local.tee $0 - if - local.get $0 - call $byn-split-outlined-A$~lib/rt/itcms/__visit - end + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>~visit return end local.get $0 - i32.load $0 offset=4 + i32.load $0 local.tee $1 + if + local.get $1 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end local.get $0 - i32.load $0 offset=12 - i32.const 2 - i32.shl + i32.load $0 offset=16 + i32.const 12 + i32.mul + local.get $0 + i32.load $0 offset=8 + local.tee $1 + local.tee $0 i32.add - local.set $2 + local.set $3 loop $while-continue|0 - local.get $1 - local.get $2 + local.get $0 + local.get $3 i32.lt_u if - local.get $1 - i32.load $0 - local.tee $3 + local.get $0 + i32.load $0 offset=8 + i32.const 1 + i32.and + i32.eqz if - local.get $3 - call $byn-split-outlined-A$~lib/rt/itcms/__visit + local.get $0 + i32.load $0 offset=4 + local.tee $2 + if + local.get $2 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end end - local.get $1 - i32.const 4 + local.get $0 + i32.const 12 i32.add - local.set $1 + local.set $0 br $while-continue|0 end end - local.get $0 - i32.load $0 - local.tee $0 + local.get $1 if - local.get $0 + local.get $1 call $byn-split-outlined-A$~lib/rt/itcms/__visit end return end - unreachable - end - local.get $0 - i32.load $0 - local.tee $0 - if local.get $0 - call $byn-split-outlined-A$~lib/rt/itcms/__visit + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>~visit + return end + unreachable ) (func $~start (type $none_=>_none) call $start:std/weakref ) - (func $start:~lib/weakref~anonymous|0 (type $i32_=>_none) (param $0 i32) - (local $1 i32) + (func $~lib/map/Map>#rehash (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) global.get $~lib/memory/__stack_pointer - i32.const 4 + i32.const 12 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2084 + i32.const 2092 i32.lt_s if i32.const 34880 @@ -2418,39 +2339,171 @@ unreachable end global.get $~lib/memory/__stack_pointer - local.tee $1 + local.tee $2 + i64.const 0 + i64.store $0 + local.get $2 i32.const 0 - i32.store $0 - local.get $1 - global.get $~lib/weakref/ALL_REFERENCES - local.tee $1 - i32.store $0 + i32.store $0 offset=8 + local.get $2 local.get $1 - local.get $0 - call $~lib/map/Map#delete + i32.const 1 + i32.add + local.tee $2 + i32.const 2 + i32.shl + call $~lib/arraybuffer/ArrayBuffer#constructor + local.tee $5 + i32.store $0 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.const 3 + i32.shl + i32.const 3 + i32.div_s + local.tee $6 + i32.const 12 + i32.mul + call $~lib/arraybuffer/ArrayBuffer#constructor + local.tee $3 + i32.store $0 offset=4 + local.get $0 + i32.load $0 offset=8 + local.tee $4 + local.get $0 + i32.load $0 offset=16 + i32.const 12 + i32.mul + i32.add + local.set $7 + local.get $3 + local.set $2 + loop $while-continue|0 + local.get $4 + local.get $7 + i32.ne + if + local.get $4 + i32.load $0 offset=8 + i32.const 1 + i32.and + i32.eqz + if + local.get $2 + local.get $4 + i32.load $0 + local.tee $8 + i32.store $0 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.load $0 offset=4 + local.tee $9 + i32.store $0 offset=8 + local.get $2 + local.get $9 + i32.store $0 offset=4 + local.get $2 + local.get $5 + local.get $1 + local.get $8 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $8 + i32.const 15 + i32.shr_u + local.get $8 + i32.xor + i32.const -2048144777 + i32.mul + local.tee $8 + i32.const 13 + i32.shr_u + local.get $8 + i32.xor + i32.const -1028477379 + i32.mul + local.tee $8 + i32.const 16 + i32.shr_u + local.get $8 + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + local.tee $8 + i32.load $0 + i32.store $0 offset=8 + local.get $8 + local.get $2 + i32.store $0 + local.get $2 + i32.const 12 + i32.add + local.set $2 + end + local.get $4 + i32.const 12 + i32.add + local.set $4 + br $while-continue|0 + end + end + local.get $0 + local.get $5 + i32.store $0 + local.get $5 if - global.get $~lib/weakref/CURRENT_COOKIE - i32.const 1 - i32.add - global.set $~lib/weakref/CURRENT_COOKIE + local.get $0 + local.get $5 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + local.get $0 + local.get $1 + i32.store $0 offset=4 + local.get $0 + local.get $3 + i32.store $0 offset=8 + local.get $3 + if + local.get $0 + local.get $3 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link end + local.get $0 + local.get $6 + i32.store $0 offset=12 + local.get $0 + local.get $0 + i32.load $0 offset=20 + i32.store $0 offset=16 global.get $~lib/memory/__stack_pointer - i32.const 4 + i32.const 12 i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/weakref/WeakRef#constructor (type $i32_=>_i32) (param $0 i32) (result i32) + (func $~lib/finalizationregistry/BaseRegistry.finalizeAll (type $i32_=>_none) (param $0 i32) (local $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) + (local $6 i32) global.get $~lib/memory/__stack_pointer i32.const 8 i32.sub global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 2084 + i32.const 2092 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2458,31 +2511,14 @@ i64.const 0 i64.store $0 local.get $1 - i32.const 8 - i32.const 5 - call $~lib/rt/itcms/__new + global.get $~lib/finalizationregistry/REGISTRIES_FOR_PTR local.tee $1 i32.store $0 local.get $1 - i32.const 0 - i32.store $0 - local.get $1 - i32.const 0 - i32.store $0 offset=4 - local.get $1 - local.get $0 - i32.store $0 - global.get $~lib/memory/__stack_pointer - global.get $~lib/weakref/ALL_REFERENCES - local.tee $0 - i32.store $0 offset=4 - local.get $0 i32.load $0 - local.get $0 - i32.load $0 offset=4 local.get $1 - i32.load $0 - local.tee $2 + i32.load $0 offset=4 + local.get $0 i32.const -1028477379 i32.mul i32.const 374761397 @@ -2491,22 +2527,22 @@ i32.rotl i32.const 668265263 i32.mul - local.tee $0 - local.get $0 + local.tee $1 + local.get $1 i32.const 15 i32.shr_u i32.xor i32.const -2048144777 i32.mul - local.tee $0 - local.get $0 + local.tee $1 + local.get $1 i32.const 13 i32.shr_u i32.xor i32.const -1028477379 i32.mul - local.tee $0 - local.get $0 + local.tee $1 + local.get $1 i32.const 16 i32.shr_u i32.xor @@ -2515,110 +2551,986 @@ i32.shl i32.add i32.load $0 - local.set $0 + local.set $1 block $__inlined_func$~lib/map/Map#find loop $while-continue|0 - local.get $0 + local.get $1 if + local.get $1 + i32.load $0 offset=8 + local.tee $3 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $1 + i32.load $0 + local.get $0 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find + local.get $3 + i32.const -2 + i32.and + local.set $1 + br $while-continue|0 + end + end + i32.const 0 + local.set $1 + end + local.get $1 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + global.get $~lib/finalizationregistry/REGISTRIES_FOR_PTR + local.tee $3 + i32.store $0 + local.get $1 + local.get $3 + local.get $0 + call $~lib/map/Map#get + local.tee $3 + i32.store $0 offset=4 + local.get $3 + i32.load $0 offset=12 + local.set $5 + loop $for-loop|0 + local.get $2 + local.get $5 + i32.lt_s + if + local.get $3 + local.get $2 + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#__get + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store $0 + block $__inlined_func$~lib/finalizationregistry/BaseRegistry#finalize@override + local.get $4 + i32.const 8 + i32.sub + i32.load $0 + i32.const 7 + i32.eq + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2092 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 0 + i32.store $0 + local.get $1 + local.get $4 + i32.load $0 + local.tee $1 + i32.store $0 + local.get $1 + i32.load $0 + local.get $1 + i32.load $0 offset=4 + local.get $0 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $1 + local.get $1 + i32.const 15 + i32.shr_u + i32.xor + i32.const -2048144777 + i32.mul + local.tee $1 + local.get $1 + i32.const 13 + i32.shr_u + i32.xor + i32.const -1028477379 + i32.mul + local.tee $1 + local.get $1 + i32.const 16 + i32.shr_u + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $1 + block $__inlined_func$~lib/map/Map#find1 + loop $while-continue|02 + local.get $1 + if + local.get $1 + i32.load $0 offset=8 + local.tee $6 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $1 + i32.load $0 + local.get $0 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find1 + local.get $6 + i32.const -2 + i32.and + local.set $1 + br $while-continue|02 + end + end + i32.const 0 + local.set $1 + end + local.get $1 + if + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.load $0 + local.tee $1 + i32.store $0 + local.get $1 + local.get $0 + call $~lib/map/Map#get + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.load $0 + local.tee $6 + i32.store $0 + local.get $6 + local.get $0 + call $~lib/map/Map#delete + drop + local.get $1 + local.get $4 + i32.load $0 offset=4 + i32.load $0 + call_indirect $0 (type $i32_=>_none) + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + br $__inlined_func$~lib/finalizationregistry/BaseRegistry#finalize@override + end + unreachable + end + local.get $2 + i32.const 1 + i32.add + local.set $2 + br $for-loop|0 + end + end + global.get $~lib/memory/__stack_pointer + global.get $~lib/finalizationregistry/REGISTRIES_FOR_PTR + local.tee $2 + i32.store $0 + local.get $2 + i32.load $0 + local.get $2 + i32.load $0 offset=4 + local.get $0 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $1 + i32.const 15 + i32.shr_u + local.get $1 + i32.xor + i32.const -2048144777 + i32.mul + local.tee $1 + i32.const 13 + i32.shr_u + local.get $1 + i32.xor + i32.const -1028477379 + i32.mul + local.tee $1 + i32.const 16 + i32.shr_u + local.get $1 + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $1 + block $__inlined_func$~lib/map/Map#find3 + loop $while-continue|04 + local.get $1 + if + local.get $1 + i32.load $0 offset=8 + local.tee $3 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $1 + i32.load $0 + local.get $0 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find3 + local.get $3 + i32.const -2 + i32.and + local.set $1 + br $while-continue|04 + end + end + i32.const 0 + local.set $1 + end + local.get $1 + if + local.get $1 + local.get $1 + i32.load $0 offset=8 + i32.const 1 + i32.or + i32.store $0 offset=8 + local.get $2 + local.get $2 + i32.load $0 offset=20 + i32.const 1 + i32.sub + i32.store $0 offset=20 + local.get $2 + i32.load $0 offset=4 + i32.const 1 + i32.shr_u + local.tee $1 + i32.const 1 + i32.add + i32.const 4 + local.get $2 + i32.load $0 offset=20 + local.tee $3 + local.get $3 + i32.const 4 + i32.lt_u + select + i32.ge_u + if (result i32) + local.get $2 + i32.load $0 offset=20 + local.get $2 + i32.load $0 offset=12 + i32.const 3 + i32.mul + i32.const 4 + i32.div_s + i32.lt_s + else + i32.const 0 + end + if + local.get $2 + local.get $1 + call $~lib/map/Map>#rehash + end + end + global.get $~lib/finalizationregistry/PREVIOUS_FINALIZER + if + local.get $0 + global.get $~lib/finalizationregistry/PREVIOUS_FINALIZER + call_indirect $0 (type $i32_=>_none) + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + i32.const 34880 + i32.const 34928 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $start:~lib/weakref~anonymous|0 (type $i32_=>_none) (param $0 i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2092 + i32.lt_s + if + i32.const 34880 + i32.const 34928 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 0 + i32.store $0 + local.get $1 + global.get $~lib/weakref/ALL_REFERENCES + local.tee $1 + i32.store $0 + local.get $1 + local.get $0 + call $~lib/map/Map#delete + if + global.get $~lib/weakref/CURRENT_COOKIE + i32.const 1 + i32.add + global.set $~lib/weakref/CURRENT_COOKIE + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/finalizationregistry/FinalizationRegistry#register (type $i32_i32_i32_=>_none) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 2092 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $3 + i64.const 0 + i64.store $0 + local.get $3 + i32.const 0 + i32.store $0 offset=8 + local.get $3 + local.get $0 + i32.load $0 + local.tee $3 + i32.store $0 + local.get $3 + i32.load $0 + local.get $3 + i32.load $0 offset=4 + local.get $1 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $3 + local.get $3 + i32.const 15 + i32.shr_u + i32.xor + i32.const -2048144777 + i32.mul + local.tee $3 + local.get $3 + i32.const 13 + i32.shr_u + i32.xor + i32.const -1028477379 + i32.mul + local.tee $3 + local.get $3 + i32.const 16 + i32.shr_u + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $3 + block $__inlined_func$~lib/map/Map#find + loop $while-continue|0 + local.get $3 + if + local.get $3 + i32.load $0 offset=8 + local.tee $4 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $3 + i32.load $0 + local.get $1 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find + local.get $4 + i32.const -2 + i32.and + local.set $3 + br $while-continue|0 + end + end + i32.const 0 + local.set $3 + end + local.get $3 + if + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.load $0 + local.tee $3 + i32.store $0 + local.get $3 + local.get $1 + local.get $2 + call $~lib/map/Map#set + global.get $~lib/memory/__stack_pointer + global.get $~lib/finalizationregistry/REGISTRIES_FOR_PTR + local.tee $2 + i32.store $0 + local.get $2 + i32.load $0 + local.get $2 + i32.load $0 offset=4 + local.get $1 + local.tee $2 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $1 + local.get $1 + i32.const 15 + i32.shr_u + i32.xor + i32.const -2048144777 + i32.mul + local.tee $1 + local.get $1 + i32.const 13 + i32.shr_u + i32.xor + i32.const -1028477379 + i32.mul + local.tee $1 + local.get $1 + i32.const 16 + i32.shr_u + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $1 + block $__inlined_func$~lib/map/Map#find1 + loop $while-continue|02 + local.get $1 + if + local.get $1 + i32.load $0 offset=8 + local.tee $3 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $1 + i32.load $0 + local.get $2 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find1 + local.get $3 + i32.const -2 + i32.and + local.set $1 + br $while-continue|02 + end + end + i32.const 0 + local.set $1 + end + local.get $1 + if + global.get $~lib/memory/__stack_pointer + global.get $~lib/finalizationregistry/REGISTRIES_FOR_PTR + local.tee $1 + i32.store $0 offset=4 + local.get $1 + local.get $2 + call $~lib/map/Map#get + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 + local.get $1 + local.get $0 + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#push + else + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2092 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $3 + i64.const 0 + i64.store $0 + local.get $3 + i32.const 16 + i32.const 11 + call $~lib/rt/itcms/__new + local.tee $3 + i32.store $0 + local.get $3 + i32.const 0 + i32.store $0 + local.get $3 + i32.const 0 + i32.store $0 offset=4 + local.get $3 + i32.const 0 + i32.store $0 offset=8 + local.get $3 + i32.const 0 + i32.store $0 offset=12 + global.get $~lib/memory/__stack_pointer + i32.const 32 + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $4 + i32.store $0 offset=4 + local.get $3 + local.get $4 + i32.store $0 + local.get $4 + if + local.get $3 + local.get $4 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + local.get $3 + local.get $4 + i32.store $0 offset=4 + local.get $3 + i32.const 32 + i32.store $0 offset=8 + local.get $3 + i32.const 0 + i32.store $0 offset=12 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + local.get $3 + i32.store $0 offset=8 + local.get $3 + local.get $0 + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#push + global.get $~lib/memory/__stack_pointer + global.get $~lib/finalizationregistry/REGISTRIES_FOR_PTR + local.tee $1 + i32.store $0 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2092 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $1 + i32.load $0 + local.get $2 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $0 + i32.const 15 + i32.shr_u + local.get $0 + i32.xor + i32.const -2048144777 + i32.mul + local.tee $0 + i32.const 13 + i32.shr_u + local.get $0 + i32.xor + i32.const -1028477379 + i32.mul + local.tee $0 + i32.const 16 + i32.shr_u + local.get $0 + i32.xor + local.tee $4 + local.get $1 + i32.load $0 offset=4 + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $0 + block $__inlined_func$~lib/map/Map#find4 + loop $while-continue|05 + local.get $0 + if + local.get $0 + i32.load $0 offset=8 + local.tee $5 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else + local.get $2 + local.get $0 + i32.load $0 + i32.eq + end + br_if $__inlined_func$~lib/map/Map#find4 + local.get $5 + i32.const -2 + i32.and + local.set $0 + br $while-continue|05 + end + end + i32.const 0 + local.set $0 + end + local.get $0 + if + local.get $0 + local.get $3 + i32.store $0 offset=4 + local.get $3 + if + local.get $1 + local.get $3 + call $byn-split-outlined-A$~lib/rt/itcms/__link_0 + end + else + local.get $1 + i32.load $0 offset=16 + local.get $1 + i32.load $0 offset=12 + i32.eq + if + local.get $1 + local.get $1 + i32.load $0 offset=20 + local.get $1 + i32.load $0 offset=12 + i32.const 3 + i32.mul + i32.const 4 + i32.div_s + i32.lt_s + if (result i32) + local.get $1 + i32.load $0 offset=4 + else + local.get $1 + i32.load $0 offset=4 + i32.const 1 + i32.shl + i32.const 1 + i32.or + end + call $~lib/map/Map>#rehash + end + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.load $0 offset=8 + local.tee $0 + i32.store $0 + local.get $1 + local.get $1 + i32.load $0 offset=16 + local.tee $5 + i32.const 1 + i32.add + i32.store $0 offset=16 + local.get $0 + local.get $5 + i32.const 12 + i32.mul + i32.add + local.tee $0 + local.get $2 + i32.store $0 + local.get $0 + local.get $3 + i32.store $0 offset=4 + local.get $3 + if + local.get $1 + local.get $3 + call $byn-split-outlined-A$~lib/rt/itcms/__link_0 + end + local.get $1 + local.get $1 + i32.load $0 offset=20 + i32.const 1 + i32.add + i32.store $0 offset=20 + local.get $0 + local.get $1 + i32.load $0 + local.get $4 + local.get $1 + i32.load $0 offset=4 + i32.and + i32.const 2 + i32.shl + i32.add + local.tee $1 + i32.load $0 + i32.store $0 offset=8 + local.get $1 + local.get $0 + i32.store $0 + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + end + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + i32.const 34880 + i32.const 34928 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $~lib/weakref/WeakRef#constructor (type $i32_=>_i32) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2092 + i32.lt_s + if + i32.const 34880 + i32.const 34928 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + i64.const 0 + i64.store $0 + local.get $1 + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $2 + i32.store $0 + local.get $2 + i32.const 0 + i32.store $0 + local.get $2 + i32.const 0 + i32.store $0 offset=4 + local.get $2 + local.get $0 + i32.store $0 + global.get $~lib/memory/__stack_pointer + global.get $~lib/weakref/ALL_REFERENCES + local.tee $0 + i32.store $0 offset=4 + local.get $0 + i32.load $0 + local.get $0 + i32.load $0 offset=4 + local.get $2 + i32.load $0 + local.tee $3 + i32.const -1028477379 + i32.mul + i32.const 374761397 + i32.add + i32.const 17 + i32.rotl + i32.const 668265263 + i32.mul + local.tee $0 + local.get $0 + i32.const 15 + i32.shr_u + i32.xor + i32.const -2048144777 + i32.mul + local.tee $0 + local.get $0 + i32.const 13 + i32.shr_u + i32.xor + i32.const -1028477379 + i32.mul + local.tee $0 + local.get $0 + i32.const 16 + i32.shr_u + i32.xor + i32.and + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.set $0 + block $__inlined_func$~lib/map/Map#find + loop $while-continue|0 + local.get $0 + if + local.get $0 + i32.load $0 offset=8 + local.tee $1 + i32.const 1 + i32.and + if (result i32) + i32.const 0 + else local.get $0 - i32.load $0 offset=8 - local.tee $3 - i32.const 1 - i32.and - if (result i32) - i32.const 0 - else - local.get $0 - i32.load $0 - local.get $2 - i32.eq - end - br_if $__inlined_func$~lib/map/Map#find + i32.load $0 local.get $3 - i32.const -2 - i32.and - local.set $0 - br $while-continue|0 + i32.eq end + br_if $__inlined_func$~lib/map/Map#find + local.get $1 + i32.const -2 + i32.and + local.set $0 + br $while-continue|0 end - i32.const 0 - local.set $0 end + i32.const 0 + local.set $0 + end + local.get $0 + if + global.get $~lib/memory/__stack_pointer + global.get $~lib/weakref/ALL_REFERENCES + local.tee $0 + i32.store $0 offset=4 + local.get $2 local.get $0 - if - global.get $~lib/memory/__stack_pointer - global.get $~lib/weakref/ALL_REFERENCES - local.tee $0 - i32.store $0 offset=4 - local.get $1 - local.get $0 - local.get $1 - i32.load $0 - call $~lib/map/Map#get - i32.store $0 offset=4 - else - local.get $1 - global.get $~lib/weakref/CURRENT_COOKIE - i32.store $0 offset=4 - global.get $~lib/memory/__stack_pointer - global.get $~lib/weakref/ALL_REFERENCES - local.tee $0 - i32.store $0 offset=4 - local.get $0 - local.get $1 - i32.load $0 - local.get $1 - i32.load $0 offset=4 - call $~lib/map/Map#set - global.get $~lib/memory/__stack_pointer - global.get $~lib/weakref/REGISTRY - local.tee $2 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.set $3 - local.get $1 - i32.load $0 - local.set $4 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 2084 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - local.tee $0 - i32.const 0 - i32.store $0 - local.get $0 - local.get $2 - i32.load $0 offset=4 - local.tee $0 - i32.store $0 - local.get $0 - local.get $3 - local.get $4 - call $~lib/map/Map#set - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - end + local.get $2 + i32.load $0 + call $~lib/map/Map#get + i32.store $0 offset=4 + else + local.get $2 + global.get $~lib/weakref/CURRENT_COOKIE + i32.store $0 offset=4 global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $1 - return + global.get $~lib/weakref/ALL_REFERENCES + local.tee $0 + i32.store $0 offset=4 + local.get $0 + local.get $2 + i32.load $0 + local.get $2 + i32.load $0 offset=4 + call $~lib/map/Map#set + global.get $~lib/memory/__stack_pointer + global.get $~lib/weakref/REGISTRY + local.tee $0 + i32.store $0 offset=4 + local.get $0 + local.get $2 + i32.load $0 + local.get $2 + i32.load $0 + call $~lib/finalizationregistry/FinalizationRegistry#register end - i32.const 34880 - i32.const 34928 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 ) (func $std/weakref/produceDummy (type $none_=>_i32) (result i32) (local $0 i32) @@ -2627,7 +3539,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2084 + i32.const 2092 i32.lt_s if i32.const 34880 @@ -2663,7 +3575,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2084 + i32.const 2092 i32.lt_s if i32.const 34880 @@ -2782,14 +3694,12 @@ ) (func $std/weakref/makeRefencedDummy (type $none_=>_i32) (result i32) (local $0 i32) - (local $1 i32) - (local $2 i32) global.get $~lib/memory/__stack_pointer i32.const 8 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2084 + i32.const 2092 i32.lt_s if i32.const 34880 @@ -2808,34 +3718,11 @@ local.tee $0 i32.store $0 global.get $~lib/memory/__stack_pointer - i32.const 1824 + i32.const 2000 i32.store $0 offset=4 - i32.const 1836 - i32.load $0 - local.tee $1 - i32.const 1 - i32.add - local.tee $2 - i32.const 1 - call $~lib/array/ensureCapacity - i32.const 1828 - i32.load $0 - local.get $1 - i32.const 2 - i32.shl - i32.add - local.get $0 - i32.store $0 + i32.const 2000 local.get $0 - if - i32.const 1824 - local.get $0 - i32.const 1 - call $byn-split-outlined-A$~lib/rt/itcms/__link - end - i32.const 1836 - local.get $2 - i32.store $0 + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#push local.get $0 call $~lib/weakref/WeakRef#constructor local.set $0 @@ -2855,7 +3742,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner1 global.get $~lib/memory/__stack_pointer - i32.const 2084 + i32.const 2092 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -2866,7 +3753,7 @@ memory.size $0 i32.const 16 i32.shl - i32.const 34852 + i32.const 34860 i32.sub i32.const 1 i32.shr_u @@ -2900,7 +3787,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2084 + i32.const 2092 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -2964,14 +3851,82 @@ local.get $0 global.set $~lib/weakref/ALL_REFERENCES global.get $~lib/memory/__stack_pointer - i32.const 1712 + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2092 + i32.lt_s + br_if $folding-inner1 + global.get $~lib/memory/__stack_pointer + local.tee $0 + i64.const 0 + i64.store $0 + local.get $0 + i32.const 24 + i32.const 12 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store $0 + i32.const 16 + call $~lib/arraybuffer/ArrayBuffer#constructor + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $0 + local.get $1 + i32.store $0 + local.get $1 + if + local.get $0 + local.get $1 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + local.get $0 + i32.const 3 + i32.store $0 offset=4 + i32.const 48 + call $~lib/arraybuffer/ArrayBuffer#constructor + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store $0 offset=4 + local.get $0 + local.get $1 + i32.store $0 offset=8 + local.get $1 + if + local.get $0 + local.get $1 + i32.const 0 + call $byn-split-outlined-A$~lib/rt/itcms/__link + end + local.get $0 + i32.const 4 + i32.store $0 offset=12 + local.get $0 + i32.const 0 + i32.store $0 offset=16 + local.get $0 + i32.const 0 + i32.store $0 offset=20 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + global.set $~lib/finalizationregistry/REGISTRIES_FOR_PTR + global.get $~lib/memory/__stack_pointer + i32.const 1888 i32.store $0 global.get $~lib/memory/__stack_pointer i32.const 12 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2084 + i32.const 2092 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -2982,16 +3937,16 @@ i32.const 0 i32.store $0 offset=8 local.get $0 - i32.const 12 + i32.const 8 i32.const 7 call $~lib/rt/itcms/__new local.tee $0 i32.store $0 local.get $0 - i32.const 1712 - i32.store $0 offset=8 + i32.const 1888 + i32.store $0 offset=4 local.get $0 - i32.const 1712 + i32.const 1888 i32.const 0 call $byn-split-outlined-A$~lib/rt/itcms/__link global.get $~lib/memory/__stack_pointer @@ -2999,7 +3954,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2084 + i32.const 2092 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -3065,7 +4020,7 @@ i32.store $0 offset=4 local.get $0 local.get $1 - i32.store $0 offset=4 + i32.store $0 local.get $1 if local.get $0 @@ -3075,47 +4030,33 @@ end global.get $~lib/memory/__stack_pointer local.tee $1 - i32.const 8 + i32.const 4 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2084 + i32.const 2092 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store $0 + i32.const 0 + i32.store $0 local.get $0 i32.eqz if global.get $~lib/memory/__stack_pointer - i32.const 4 + i32.const 0 i32.const 8 call $~lib/rt/itcms/__new local.tee $0 i32.store $0 end - local.get $0 - i32.const 0 - i32.store $0 global.get $~lib/memory/__stack_pointer - global.get $~lib/finalizationregistry/ALL_REGISTRIES - local.tee $2 - i32.store $0 offset=4 - local.get $0 - local.get $2 - i32.store $0 - local.get $2 - if - local.get $0 - local.get $2 - i32.const 0 - call $byn-split-outlined-A$~lib/rt/itcms/__link - end local.get $0 - global.set $~lib/finalizationregistry/ALL_REGISTRIES + call $~lib/object/Object#constructor + local.tee $0 + i32.store $0 global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer local.get $1 @@ -3127,9 +4068,9 @@ global.get $~lib/rt/__finalize global.set $~lib/finalizationregistry/PREVIOUS_FINALIZER global.get $~lib/memory/__stack_pointer - i32.const 1680 + i32.const 1856 i32.store $0 offset=8 - i32.const 1680 + i32.const 1856 i32.load $0 global.set $~lib/rt/__finalize i32.const 1 @@ -3150,7 +4091,7 @@ i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1920 i32.const 11 i32.const 3 call $~lib/builtins/abort @@ -3161,7 +4102,7 @@ call $~lib/weakref/WeakRef#deref if i32.const 0 - i32.const 1744 + i32.const 1920 i32.const 13 i32.const 3 call $~lib/builtins/abort @@ -3176,7 +4117,7 @@ i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1920 i32.const 28 i32.const 3 call $~lib/builtins/abort @@ -3188,19 +4129,20 @@ i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1920 i32.const 32 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1824 + i32.const 2000 i32.store $0 offset=12 + i32.const 2000 i32.const 0 i32.const 0 call $~lib/array/ensureCapacity - i32.const 1836 + i32.const 2012 i32.const 0 i32.store $0 call $~lib/rt/itcms/__collect @@ -3208,7 +4150,7 @@ call $~lib/weakref/WeakRef#deref if i32.const 0 - i32.const 1744 + i32.const 1920 i32.const 36 i32.const 3 call $~lib/builtins/abort @@ -3227,7 +4169,7 @@ i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1920 i32.const 51 i32.const 3 call $~lib/builtins/abort @@ -3238,7 +4180,7 @@ i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1920 i32.const 52 i32.const 3 call $~lib/builtins/abort @@ -3250,7 +4192,7 @@ i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1920 i32.const 55 i32.const 3 call $~lib/builtins/abort @@ -3260,7 +4202,7 @@ call $~lib/weakref/WeakRef#deref if i32.const 0 - i32.const 1744 + i32.const 1920 i32.const 56 i32.const 3 call $~lib/builtins/abort @@ -3272,7 +4214,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2084 + i32.const 2092 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -3280,50 +4222,12 @@ i32.const 0 i32.store $0 local.get $2 - i32.const 1824 + i32.const 2000 i32.store $0 - local.get $2 - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 2084 - i32.lt_s - br_if $folding-inner1 - global.get $~lib/memory/__stack_pointer + i32.const 2000 i32.const 0 - i32.store $0 - i32.const 1836 - i32.load $0 - i32.eqz - if - i32.const 1248 - i32.const 1872 - i32.const 114 - i32.const 42 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1828 - i32.load $0 - i32.load $0 - local.tee $2 - i32.store $0 - local.get $2 - i32.eqz - if - i32.const 1920 - i32.const 1872 - i32.const 118 - i32.const 40 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer + call $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#__get + local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store $0 @@ -3342,7 +4246,7 @@ i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1920 i32.const 59 i32.const 3 call $~lib/builtins/abort @@ -3353,19 +4257,20 @@ i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1920 i32.const 60 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1824 + i32.const 2000 i32.store $0 offset=12 + i32.const 2000 i32.const 0 i32.const 0 call $~lib/array/ensureCapacity - i32.const 1836 + i32.const 2012 i32.const 0 i32.store $0 call $~lib/rt/itcms/__collect @@ -3373,7 +4278,7 @@ call $~lib/weakref/WeakRef#deref if i32.const 0 - i32.const 1744 + i32.const 1920 i32.const 65 i32.const 3 call $~lib/builtins/abort @@ -3383,7 +4288,7 @@ call $~lib/weakref/WeakRef#deref if i32.const 0 - i32.const 1744 + i32.const 1920 i32.const 66 i32.const 3 call $~lib/builtins/abort @@ -3408,7 +4313,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2084 + i32.const 2092 i32.lt_s if i32.const 34880 @@ -3453,7 +4358,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2084 + i32.const 2092 i32.lt_s if i32.const 34880 @@ -3619,70 +4524,135 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $std/weakref/Dummy#constructor (type $none_=>_i32) (result i32) - (local $0 i32) - (local $1 i32) + (func $~lib/object/Object#constructor (type $i32_=>_i32) (param $0 i32) (result i32) global.get $~lib/memory/__stack_pointer i32.const 4 i32.sub global.set $~lib/memory/__stack_pointer - block $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 2084 - i32.lt_s - br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 2092 + i32.lt_s + if + i32.const 34880 + i32.const 34928 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $0 + i32.eqz + if global.get $~lib/memory/__stack_pointer - local.tee $0 i32.const 0 - i32.store $0 - local.get $0 i32.const 0 - i32.const 4 call $~lib/rt/itcms/__new local.tee $0 i32.store $0 - global.get $~lib/memory/__stack_pointer - local.tee $1 - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 2084 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store $0 - local.get $0 - i32.eqz - if - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.const 0 - call $~lib/rt/itcms/__new - local.tee $0 - i32.store $0 - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $1 - local.get $0 - i32.store $0 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $0 - return end - i32.const 34880 - i32.const 34928 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $~lib/array/Array<~lib/finalizationregistry/BaseRegistry>#__get (type $i32_i32_=>_i32) (param $0 i32) (param $1 i32) (result i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2092 + i32.lt_s + if + i32.const 34880 + i32.const 34928 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store $0 + local.get $1 + local.get $0 + i32.load $0 offset=12 + i32.ge_u + if + i32.const 1248 + i32.const 1680 + i32.const 114 + i32.const 42 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.load $0 offset=4 + local.get $1 + i32.const 2 + i32.shl + i32.add + i32.load $0 + local.tee $0 + i32.store $0 + local.get $0 + i32.eqz + if + i32.const 1728 + i32.const 1680 + i32.const 118 + i32.const 40 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $std/weakref/Dummy#constructor (type $none_=>_i32) (result i32) + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2092 + i32.lt_s + if + i32.const 34880 + i32.const 34928 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $0 + i32.const 0 + i32.store $0 + local.get $0 + i32.const 0 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + call $~lib/object/Object#constructor + local.tee $0 + i32.store $0 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 ) (func $byn-split-outlined-A$~lib/rt/itcms/__visit (type $i32_=>_none) (param $0 i32) global.get $~lib/rt/itcms/white @@ -3757,4 +4727,55 @@ end end ) + (func $byn-split-outlined-A$~lib/rt/itcms/__link_0 (type $i32_i32_=>_none) (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 295 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/rt/itcms/white + local.get $1 + i32.const 20 + i32.sub + local.tee $1 + i32.load $0 offset=4 + i32.const 3 + i32.and + i32.eq + if + local.get $0 + i32.const 20 + i32.sub + local.tee $0 + i32.load $0 offset=4 + i32.const 3 + i32.and + local.tee $2 + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + if + local.get $0 + call $~lib/rt/itcms/Object#makeGray + else + global.get $~lib/rt/itcms/state + i32.const 1 + i32.eq + local.get $2 + i32.const 3 + i32.eq + i32.and + if + local.get $1 + call $~lib/rt/itcms/Object#makeGray + end + end + end + ) ) From f81744f8e9e5b997f81ce3b60d08f2abd093bebc Mon Sep 17 00:00:00 2001 From: Bach Le Date: Wed, 21 Dec 2022 00:41:22 +0800 Subject: [PATCH 07/14] Enforce that only GC-able types can be used in FinalizationRegistry --- std/assembly/finalizationregistry.ts | 4 ++ std/assembly/weakref.ts | 5 +- tests/compiler/std/weakref.debug.wat | 12 ++-- tests/compiler/std/weakref.release.wat | 78 +++++++++++++------------- 4 files changed, 51 insertions(+), 48 deletions(-) diff --git a/std/assembly/finalizationregistry.ts b/std/assembly/finalizationregistry.ts index d7cc33ed70..c77528e444 100644 --- a/std/assembly/finalizationregistry.ts +++ b/std/assembly/finalizationregistry.ts @@ -43,6 +43,8 @@ export class FinalizationRegistry extends BaseRegistry { } register(key: U, value: T): void { + assert(isManaged()); + const ptr = changetype(key); if (this.entries.has(ptr)) { return; } @@ -58,6 +60,8 @@ export class FinalizationRegistry extends BaseRegistry { } unregister(key: U): bool { + assert(isManaged()); + return this.entries.delete(changetype(key)); } diff --git a/std/assembly/weakref.ts b/std/assembly/weakref.ts index 5ee4af9266..de968727a7 100644 --- a/std/assembly/weakref.ts +++ b/std/assembly/weakref.ts @@ -19,7 +19,7 @@ export class WeakRef { private cookie: u32; constructor(value: T) { - assert(isReference() && !isNullable()); + assert(isManaged()); this.ref = changetype(value); @@ -28,8 +28,7 @@ export class WeakRef { } else { this.cookie = CURRENT_COOKIE; ALL_REFERENCES.set(this.ref, this.cookie); - // Avoid creating many variances of register - REGISTRY.register(this.ref, this.ref); + REGISTRY.register(value, this.ref); } } diff --git a/tests/compiler/std/weakref.debug.wat b/tests/compiler/std/weakref.debug.wat index b896a877f7..cf96ff8970 100644 --- a/tests/compiler/std/weakref.debug.wat +++ b/tests/compiler/std/weakref.debug.wat @@ -4778,7 +4778,7 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/finalizationregistry/FinalizationRegistry#register (type $i32_i32_i32_=>_none) (param $this i32) (param $key i32) (param $value i32) + (func $~lib/finalizationregistry/FinalizationRegistry#register (type $i32_i32_i32_=>_none) (param $this i32) (param $key i32) (param $value i32) (local $ptr i32) (local $registries i32) (local $5 i32) @@ -4793,6 +4793,8 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store $0 offset=8 + i32.const 1 + drop local.get $key local.set $ptr local.get $this @@ -4900,8 +4902,7 @@ local.get $this i32.const 0 call $~lib/weakref/WeakRef#set:cookie - i32.const 0 - i32.eqz + i32.const 1 drop local.get $this local.get $value @@ -4949,11 +4950,10 @@ local.get $2 i32.store $0 offset=4 local.get $2 + local.get $value local.get $this call $~lib/weakref/WeakRef#get:ref - local.get $this - call $~lib/weakref/WeakRef#get:ref - call $~lib/finalizationregistry/FinalizationRegistry#register + call $~lib/finalizationregistry/FinalizationRegistry#register end local.get $this local.set $2 diff --git a/tests/compiler/std/weakref.release.wat b/tests/compiler/std/weakref.release.wat index 9e6dc64c58..47165d3235 100644 --- a/tests/compiler/std/weakref.release.wat +++ b/tests/compiler/std/weakref.release.wat @@ -2924,7 +2924,7 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/finalizationregistry/FinalizationRegistry#register (type $i32_i32_i32_=>_none) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/finalizationregistry/FinalizationRegistry#register (type $i32_i32_i32_=>_none) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -3383,6 +3383,7 @@ (local $1 i32) (local $2 i32) (local $3 i32) + (local $4 i32) global.get $~lib/memory/__stack_pointer i32.const 8 i32.sub @@ -3406,28 +3407,28 @@ i32.const 8 i32.const 5 call $~lib/rt/itcms/__new - local.tee $2 + local.tee $4 i32.store $0 - local.get $2 + local.get $4 i32.const 0 i32.store $0 - local.get $2 + local.get $4 i32.const 0 i32.store $0 offset=4 - local.get $2 + local.get $4 local.get $0 i32.store $0 global.get $~lib/memory/__stack_pointer global.get $~lib/weakref/ALL_REFERENCES - local.tee $0 + local.tee $1 i32.store $0 offset=4 - local.get $0 + local.get $1 i32.load $0 - local.get $0 + local.get $1 i32.load $0 offset=4 - local.get $2 + local.get $4 i32.load $0 - local.tee $3 + local.tee $2 i32.const -1028477379 i32.mul i32.const 374761397 @@ -3436,22 +3437,22 @@ i32.rotl i32.const 668265263 i32.mul - local.tee $0 - local.get $0 + local.tee $1 + local.get $1 i32.const 15 i32.shr_u i32.xor i32.const -2048144777 i32.mul - local.tee $0 - local.get $0 + local.tee $1 + local.get $1 i32.const 13 i32.shr_u i32.xor i32.const -1028477379 i32.mul - local.tee $0 - local.get $0 + local.tee $1 + local.get $1 i32.const 16 i32.shr_u i32.xor @@ -3460,77 +3461,76 @@ i32.shl i32.add i32.load $0 - local.set $0 + local.set $1 block $__inlined_func$~lib/map/Map#find loop $while-continue|0 - local.get $0 + local.get $1 if - local.get $0 + local.get $1 i32.load $0 offset=8 - local.tee $1 + local.tee $3 i32.const 1 i32.and if (result i32) i32.const 0 else - local.get $0 + local.get $1 i32.load $0 - local.get $3 + local.get $2 i32.eq end br_if $__inlined_func$~lib/map/Map#find - local.get $1 + local.get $3 i32.const -2 i32.and - local.set $0 + local.set $1 br $while-continue|0 end end i32.const 0 - local.set $0 + local.set $1 end - local.get $0 + local.get $1 if global.get $~lib/memory/__stack_pointer global.get $~lib/weakref/ALL_REFERENCES local.tee $0 i32.store $0 offset=4 - local.get $2 + local.get $4 local.get $0 - local.get $2 + local.get $4 i32.load $0 call $~lib/map/Map#get i32.store $0 offset=4 else - local.get $2 + local.get $4 global.get $~lib/weakref/CURRENT_COOKIE i32.store $0 offset=4 global.get $~lib/memory/__stack_pointer global.get $~lib/weakref/ALL_REFERENCES - local.tee $0 + local.tee $1 i32.store $0 offset=4 - local.get $0 - local.get $2 + local.get $1 + local.get $4 i32.load $0 - local.get $2 + local.get $4 i32.load $0 offset=4 call $~lib/map/Map#set global.get $~lib/memory/__stack_pointer global.get $~lib/weakref/REGISTRY - local.tee $0 + local.tee $1 i32.store $0 offset=4 + local.get $1 local.get $0 - local.get $2 - i32.load $0 - local.get $2 + local.get $4 i32.load $0 - call $~lib/finalizationregistry/FinalizationRegistry#register + call $~lib/finalizationregistry/FinalizationRegistry#register end global.get $~lib/memory/__stack_pointer i32.const 8 i32.add global.set $~lib/memory/__stack_pointer - local.get $2 + local.get $4 ) (func $std/weakref/produceDummy (type $none_=>_i32) (result i32) (local $0 i32) From ee6b2077316d15820a4a4af9cf55e77e7f39311b Mon Sep 17 00:00:00 2001 From: Bach Le Date: Wed, 21 Dec 2022 01:18:03 +0800 Subject: [PATCH 08/14] Make check for managed type compile-time --- std/assembly/finalizationregistry.ts | 4 ++-- std/assembly/weakref.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/std/assembly/finalizationregistry.ts b/std/assembly/finalizationregistry.ts index c77528e444..07d138148b 100644 --- a/std/assembly/finalizationregistry.ts +++ b/std/assembly/finalizationregistry.ts @@ -43,7 +43,7 @@ export class FinalizationRegistry extends BaseRegistry { } register(key: U, value: T): void { - assert(isManaged()); + if(!isManaged()) { ERROR("invalid target"); } const ptr = changetype(key); if (this.entries.has(ptr)) { return; } @@ -60,7 +60,7 @@ export class FinalizationRegistry extends BaseRegistry { } unregister(key: U): bool { - assert(isManaged()); + if(!isManaged()) { ERROR("invalid target"); } return this.entries.delete(changetype(key)); } diff --git a/std/assembly/weakref.ts b/std/assembly/weakref.ts index de968727a7..d9c4444193 100644 --- a/std/assembly/weakref.ts +++ b/std/assembly/weakref.ts @@ -19,7 +19,7 @@ export class WeakRef { private cookie: u32; constructor(value: T) { - assert(isManaged()); + if(!isManaged()) { ERROR("invalid target"); } this.ref = changetype(value); From be2615d11ff0049a038f6dfaf8baf0ae1e61bd0b Mon Sep 17 00:00:00 2001 From: Bach Le Date: Wed, 21 Dec 2022 23:01:24 +0800 Subject: [PATCH 09/14] Add support for registration token The current implementation already uses a 2 step lookup so it does not hurt to just support token. --- std/assembly/finalizationregistry.ts | 66 ++++++++++++++++------------ std/assembly/index.d.ts | 4 +- std/assembly/weakref.ts | 2 +- 3 files changed, 41 insertions(+), 31 deletions(-) diff --git a/std/assembly/finalizationregistry.ts b/std/assembly/finalizationregistry.ts index 07d138148b..a1515b09e9 100644 --- a/std/assembly/finalizationregistry.ts +++ b/std/assembly/finalizationregistry.ts @@ -5,28 +5,40 @@ @lazy let INITIALIZED: boolean = false; // @ts-ignore: decorators -@lazy let REGISTRIES_FOR_PTR: Map = new Map(); +@lazy let ENTRIES_FOR_PTR: Map = new Map(); + +class FinalizationEntry { + next: FinalizationEntry | null = null; + + constructor( + public readonly registry: BaseRegistry, + public readonly token: usize, + ) { + } +} abstract class BaseRegistry { static finalizeAll(ptr: usize): void { - if (!REGISTRIES_FOR_PTR.has(ptr)) { return; } + if (!ENTRIES_FOR_PTR.has(ptr)) { return; } + + const entries = ENTRIES_FOR_PTR.get(ptr); - const registries = REGISTRIES_FOR_PTR.get(ptr); for ( - let i = 0, numRegistries = registries.length; - i < numRegistries; - ++i + let i: FinalizationEntry | null = entries; + i !== null; + i = i.next ) { - registries[i].finalize(ptr); + i.registry.finalize(i.token); } - REGISTRIES_FOR_PTR.delete(ptr); + + ENTRIES_FOR_PTR.delete(ptr); if (PREVIOUS_FINALIZER) { call_indirect(PREVIOUS_FINALIZER, ptr); } } - protected abstract finalize(ptr: usize): void; + protected abstract finalize(token: usize): void; } export class FinalizationRegistry extends BaseRegistry { @@ -42,33 +54,31 @@ export class FinalizationRegistry extends BaseRegistry { } } - register(key: U, value: T): void { + register(key: U, value: T, token: V): void { if(!isManaged()) { ERROR("invalid target"); } - const ptr = changetype(key); - if (this.entries.has(ptr)) { return; } + const keyPtr = changetype(key); + if (this.entries.has(keyPtr)) { return; } - this.entries.set(ptr, value); + const tokenPtr = changetype(token); + this.entries.set(tokenPtr, value); - if (REGISTRIES_FOR_PTR.has(ptr)) { - REGISTRIES_FOR_PTR.get(ptr).push(this); - } else { - const registries: BaseRegistry[] = new Array(); - registries.push(this); - REGISTRIES_FOR_PTR.set(ptr, registries); - } + const newEntry = new FinalizationEntry(this, tokenPtr); + const head: FinalizationEntry | null = ENTRIES_FOR_PTR.has(keyPtr) + ? ENTRIES_FOR_PTR.get(keyPtr) + : null; + newEntry.next = head; + ENTRIES_FOR_PTR.set(keyPtr, newEntry); } - unregister(key: U): bool { - if(!isManaged()) { ERROR("invalid target"); } - - return this.entries.delete(changetype(key)); + unregister(token: V): bool { + return this.entries.delete(changetype(token)); } - protected finalize(ptr: usize): void { - if (this.entries.has(ptr)) { - const value = this.entries.get(ptr); - this.entries.delete(ptr); + protected finalize(token: usize): void { + if (this.entries.has(token)) { + const value = this.entries.get(token); + this.entries.delete(token); this.finalizer(value); } diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index b7c363f48e..b6d919dd86 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -2060,8 +2060,8 @@ declare class WeakRef { declare class FinalizationRegistry { constructor(finalizer: (heldValue: T) => void); - register(key: U, value: T): void; - unregister(key: U): bool; + register(key: U, value: T, token: V): void; + unregister(token: V): bool; } interface SymbolConstructor { diff --git a/std/assembly/weakref.ts b/std/assembly/weakref.ts index d9c4444193..3760c34fb6 100644 --- a/std/assembly/weakref.ts +++ b/std/assembly/weakref.ts @@ -28,7 +28,7 @@ export class WeakRef { } else { this.cookie = CURRENT_COOKIE; ALL_REFERENCES.set(this.ref, this.cookie); - REGISTRY.register(value, this.ref); + REGISTRY.register(value, this.ref, value); } } From 446bcb22ae75558c0822bd8fe6339daca089c001 Mon Sep 17 00:00:00 2001 From: Bach Le Date: Wed, 21 Dec 2022 23:28:06 +0800 Subject: [PATCH 10/14] Pool FinalizationEntry objects --- std/assembly/finalizationregistry.ts | 38 +++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/std/assembly/finalizationregistry.ts b/std/assembly/finalizationregistry.ts index a1515b09e9..68da60a594 100644 --- a/std/assembly/finalizationregistry.ts +++ b/std/assembly/finalizationregistry.ts @@ -5,16 +5,40 @@ @lazy let INITIALIZED: boolean = false; // @ts-ignore: decorators -@lazy let ENTRIES_FOR_PTR: Map = new Map(); +@lazy const ENTRIES_FOR_PTR: Map = new Map(); + +// @ts-ignore: decorators +@lazy let ENTRY_POOL: FinalizationEntry | null = null; class FinalizationEntry { next: FinalizationEntry | null = null; - constructor( - public readonly registry: BaseRegistry, - public readonly token: usize, + private constructor( + public registry: BaseRegistry, + public token: usize, ) { } + + // @ts-ignore: decorators + @inline + static alloc(registry: BaseRegistry, token: usize): FinalizationEntry { + const instance: FinalizationEntry | null = ENTRY_POOL; + if (instance === null) { + return new FinalizationEntry(registry, token); + } else { + ENTRY_POOL = instance.next; + instance.registry = registry; + instance.token = token; + return instance; + } + } + + // @ts-ignore: decorators + @inline + static recycle(entry: FinalizationEntry): void { + entry.next = ENTRY_POOL; + ENTRY_POOL = entry; + } } abstract class BaseRegistry { @@ -26,9 +50,11 @@ abstract class BaseRegistry { for ( let i: FinalizationEntry | null = entries; i !== null; - i = i.next ) { i.registry.finalize(i.token); + const next: FinalizationEntry | null = i.next; + FinalizationEntry.recycle(i); + i = next; } ENTRIES_FOR_PTR.delete(ptr); @@ -63,7 +89,7 @@ export class FinalizationRegistry extends BaseRegistry { const tokenPtr = changetype(token); this.entries.set(tokenPtr, value); - const newEntry = new FinalizationEntry(this, tokenPtr); + const newEntry = FinalizationEntry.alloc(this, tokenPtr); const head: FinalizationEntry | null = ENTRIES_FOR_PTR.has(keyPtr) ? ENTRIES_FOR_PTR.get(keyPtr) : null; From dda35b8af3538760ac659ca05356e00ec43f5de0 Mon Sep 17 00:00:00 2001 From: Bach Le Date: Wed, 21 Dec 2022 23:44:20 +0800 Subject: [PATCH 11/14] Ensure that FinalizationRegistry can be GC-ed again after pooling --- std/assembly/finalizationregistry.ts | 24 ++++++++++++------------ std/assembly/index.d.ts | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/std/assembly/finalizationregistry.ts b/std/assembly/finalizationregistry.ts index 68da60a594..4f74cb3927 100644 --- a/std/assembly/finalizationregistry.ts +++ b/std/assembly/finalizationregistry.ts @@ -12,23 +12,17 @@ class FinalizationEntry { next: FinalizationEntry | null = null; - - private constructor( - public registry: BaseRegistry, - public token: usize, - ) { - } + registry: BaseRegistry | null = null; + token: usize = 0; // @ts-ignore: decorators @inline - static alloc(registry: BaseRegistry, token: usize): FinalizationEntry { + static alloc(): FinalizationEntry { const instance: FinalizationEntry | null = ENTRY_POOL; if (instance === null) { - return new FinalizationEntry(registry, token); + return new FinalizationEntry; } else { ENTRY_POOL = instance.next; - instance.registry = registry; - instance.token = token; return instance; } } @@ -36,6 +30,7 @@ class FinalizationEntry { // @ts-ignore: decorators @inline static recycle(entry: FinalizationEntry): void { + entry.registry = null; // Allow the registry to be GC-ed entry.next = ENTRY_POOL; ENTRY_POOL = entry; } @@ -51,7 +46,10 @@ abstract class BaseRegistry { let i: FinalizationEntry | null = entries; i !== null; ) { - i.registry.finalize(i.token); + const registry = i.registry; + assert(registry !== null); + + registry!.finalize(i.token); const next: FinalizationEntry | null = i.next; FinalizationEntry.recycle(i); i = next; @@ -89,7 +87,9 @@ export class FinalizationRegistry extends BaseRegistry { const tokenPtr = changetype(token); this.entries.set(tokenPtr, value); - const newEntry = FinalizationEntry.alloc(this, tokenPtr); + const newEntry = FinalizationEntry.alloc(); + newEntry.registry = this; + newEntry.token = tokenPtr; const head: FinalizationEntry | null = ENTRIES_FOR_PTR.has(keyPtr) ? ENTRIES_FOR_PTR.get(keyPtr) : null; diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index b6d919dd86..e0fb4ab2f8 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -2060,7 +2060,7 @@ declare class WeakRef { declare class FinalizationRegistry { constructor(finalizer: (heldValue: T) => void); - register(key: U, value: T, token: V): void; + register(target: U, value: T, token: V): void; unregister(token: V): bool; } From c18131dd22bf342d8603587f28725d95e0f81daf Mon Sep 17 00:00:00 2001 From: Bach Le Date: Thu, 22 Dec 2022 00:05:20 +0800 Subject: [PATCH 12/14] Fix usage of token and target --- std/assembly/finalizationregistry.ts | 16 ++++++++-------- std/assembly/index.d.ts | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/std/assembly/finalizationregistry.ts b/std/assembly/finalizationregistry.ts index 4f74cb3927..6cc6f623dc 100644 --- a/std/assembly/finalizationregistry.ts +++ b/std/assembly/finalizationregistry.ts @@ -78,23 +78,23 @@ export class FinalizationRegistry extends BaseRegistry { } } - register(key: U, value: T, token: V): void { + register(target: U, heldValue: T, token: V): void { if(!isManaged()) { ERROR("invalid target"); } - const keyPtr = changetype(key); - if (this.entries.has(keyPtr)) { return; } - + const targetPtr = changetype(target); const tokenPtr = changetype(token); - this.entries.set(tokenPtr, value); + + if (this.entries.has(tokenPtr)) { return; } + this.entries.set(tokenPtr, heldValue); const newEntry = FinalizationEntry.alloc(); newEntry.registry = this; newEntry.token = tokenPtr; - const head: FinalizationEntry | null = ENTRIES_FOR_PTR.has(keyPtr) - ? ENTRIES_FOR_PTR.get(keyPtr) + const head: FinalizationEntry | null = ENTRIES_FOR_PTR.has(targetPtr) + ? ENTRIES_FOR_PTR.get(targetPtr) : null; newEntry.next = head; - ENTRIES_FOR_PTR.set(keyPtr, newEntry); + ENTRIES_FOR_PTR.set(targetPtr, newEntry); } unregister(token: V): bool { diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index e0fb4ab2f8..81f917c3fe 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -2060,7 +2060,7 @@ declare class WeakRef { declare class FinalizationRegistry { constructor(finalizer: (heldValue: T) => void); - register(target: U, value: T, token: V): void; + register(target: U, heldValue: T, token: V): void; unregister(token: V): bool; } From 69c1c327dcb929fbf956c443f6d831db91a4493c Mon Sep 17 00:00:00 2001 From: Bach Le Date: Thu, 22 Dec 2022 00:08:44 +0800 Subject: [PATCH 13/14] Better naming --- std/assembly/weakref.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/std/assembly/weakref.ts b/std/assembly/weakref.ts index 3760c34fb6..13cf7f921f 100644 --- a/std/assembly/weakref.ts +++ b/std/assembly/weakref.ts @@ -1,5 +1,5 @@ // @ts-ignore: decorators -@lazy const ALL_REFERENCES: Map = new Map(); +@lazy const COOKIE_FOR_REFERENCE: Map = new Map(); // @ts-ignore: decorators @lazy let CURRENT_COOKIE: u32 = 0; @@ -7,7 +7,7 @@ // @ts-ignore: decorators @lazy const REGISTRY: FinalizationRegistry = new FinalizationRegistry( (ptr: usize) => { - if (ALL_REFERENCES.delete(ptr)) { + if (COOKIE_FOR_REFERENCE.delete(ptr)) { // The memory block could be reused by the allocator after this point ++CURRENT_COOKIE; } @@ -23,18 +23,21 @@ export class WeakRef { this.ref = changetype(value); - if (ALL_REFERENCES.has(this.ref)) { - this.cookie = ALL_REFERENCES.get(this.ref); + if (COOKIE_FOR_REFERENCE.has(this.ref)) { + this.cookie = COOKIE_FOR_REFERENCE.get(this.ref); } else { this.cookie = CURRENT_COOKIE; - ALL_REFERENCES.set(this.ref, this.cookie); + COOKIE_FOR_REFERENCE.set(this.ref, this.cookie); REGISTRY.register(value, this.ref, value); } } deref(): T | null { const ref = this.ref; - if (ALL_REFERENCES.has(ref) && ALL_REFERENCES.get(ref) === this.cookie) { + if ( + COOKIE_FOR_REFERENCE.has(ref) + && COOKIE_FOR_REFERENCE.get(ref) === this.cookie + ) { return changetype(ref); } else { return null; From 287e02ed2db443155117cd396b8fa1e5dceff082 Mon Sep 17 00:00:00 2001 From: Bach Le Date: Thu, 22 Dec 2022 00:57:21 +0800 Subject: [PATCH 14/14] Add a WeakMap to demonstrate usage of token --- std/assembly/weakmap.ts | 93 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 std/assembly/weakmap.ts diff --git a/std/assembly/weakmap.ts b/std/assembly/weakmap.ts new file mode 100644 index 0000000000..17bb91952b --- /dev/null +++ b/std/assembly/weakmap.ts @@ -0,0 +1,93 @@ +// @ts-ignore: decorators +@lazy let TOKEN_POOL: Token | null = null; + +// @ts-ignore: decorators +@lazy const REGISTRY: FinalizationRegistry = new FinalizationRegistry( + (token: Token) => { + const map = token.map; + if (map) { + map.evict(token.ptr); + } + Token.recycle(token); + } +); + +class Token { + map: BaseWeakMap | null = null; + ptr: usize = 0; + next: Token | null = null; + + // @ts-ignore: decorators + @inline + static alloc(): Token { + const instance = TOKEN_POOL; + if (instance === null) { + return new Token; + } else { + TOKEN_POOL = instance.next; + return instance; + } + } + + // @ts-ignore: decorators + @inline + static recycle(token: Token): void { + token.map = null; + token.next = TOKEN_POOL; + TOKEN_POOL = token; + } +} + +abstract class BaseWeakMap { + abstract evict(ptr: usize): void; +} + +export class WeakMap extends BaseWeakMap { + private data: Map = new Map(); + private tokens: Map = new Map(); + + constructor() { + super(); + + if(!isManaged()) { ERROR("invalid key type"); } + } + + get(key: K): V { + return this.data.get(changetype(key)); + } + + set(key: K, value: V): void { + const ptr = changetype(key); + this.data.set(ptr, value); + + if (!this.tokens.has(ptr)) { + const token = Token.alloc(); + token.map = this; + token.ptr = ptr; + + this.tokens.set(ptr, token); + REGISTRY.register(key, token, token); + } + } + + has(key: K): bool { + return this.data.has(changetype(key)); + } + + delete(key: K): bool { + const ptr = changetype(key); + if (this.data.delete(ptr)) { + const token = this.tokens.get(ptr); + REGISTRY.unregister(token); + this.tokens.delete(ptr); + return true; + } else { + return false; + } + } + + evict(ptr: usize): void { + this.data.delete(ptr); + this.tokens.delete(ptr); + } +}