diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index 6e89c4eacf..c4130c8d73 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -1541,6 +1541,11 @@ declare class Date { setTime(value: i64): i64; } +declare class Object { + /** The Object.is() method determines whether two values are the same value. */ + static is(value1: T, value2: T): bool; +} + /** Environmental tracing function for debugging purposes. */ declare function trace(msg: string, n?: i32, a0?: f64, a1?: f64, a2?: f64, a3?: f64, a4?: f64): void; diff --git a/std/assembly/object.ts b/std/assembly/object.ts new file mode 100644 index 0000000000..978260a116 --- /dev/null +++ b/std/assembly/object.ts @@ -0,0 +1,21 @@ +export class Object { + static is(value1: T, value2: T): bool { + if (isFloat()) { + if (value1 == value2) { + // 0 === -0, but they are not identical + if (sizeof() == 8) { + // @ts-ignore: typecast + return reinterpret(value1) == reinterpret(value2); + } else { + // @ts-ignore: typecast + return reinterpret(value1) == reinterpret(value2); + } + } + // NaN !== NaN, but they are identical. + // @ts-ignore: typecast + return bool(i32(isNaN(value1)) & i32(isNaN(value2))); + } + // For references, strings, integers and booleans + return value1 == value2; + } +} diff --git a/tests/compiler/std/object.json b/tests/compiler/std/object.json new file mode 100644 index 0000000000..453cb07770 --- /dev/null +++ b/tests/compiler/std/object.json @@ -0,0 +1,5 @@ +{ + "asc_flags": [ + "--runtime none" + ] +} diff --git a/tests/compiler/std/object.optimized.wat b/tests/compiler/std/object.optimized.wat new file mode 100644 index 0000000000..babdd25c48 --- /dev/null +++ b/tests/compiler/std/object.optimized.wat @@ -0,0 +1,638 @@ +(module + (type $FUNCSIG$idd (func (param f64 f64) (result i32))) + (type $FUNCSIG$id (func (param f64) (result i32))) + (type $FUNCSIG$viiii (func (param i32 i32 i32 i32))) + (type $FUNCSIG$iff (func (param f32 f32) (result i32))) + (type $FUNCSIG$if (func (param f32) (result i32))) + (type $FUNCSIG$iii (func (param i32 i32) (result i32))) + (type $FUNCSIG$ii (func (param i32) (result i32))) + (type $FUNCSIG$v (func)) + (type $FUNCSIG$iiii (func (param i32 i32 i32) (result i32))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (memory $0 1) + (data (i32.const 8) "\1a\00\00\00\01\00\00\00\01\00\00\00\1a\00\00\00s\00t\00d\00/\00o\00b\00j\00e\00c\00t\00.\00t\00s") + (data (i32.const 56) "\02\00\00\00\01\00\00\00\01\00\00\00\02\00\00\00a") + (data (i32.const 80) "\02\00\00\00\01\00\00\00\01\00\00\00\02\00\00\00b") + (data (i32.const 104) "\04\00\00\00\01\00\00\00\01\00\00\00\04\00\00\00a\00b") + (data (i32.const 132) "\01\00\00\00\01") + (export "memory" (memory $0)) + (start $start) + (func $~lib/number/isNaN (; 1 ;) (type $FUNCSIG$id) (param $0 f64) (result i32) + local.get $0 + local.get $0 + f64.ne + ) + (func $~lib/object/Object.is (; 2 ;) (type $FUNCSIG$idd) (param $0 f64) (param $1 f64) (result i32) + local.get $0 + local.get $1 + f64.eq + if + local.get $0 + i64.reinterpret_f64 + local.get $1 + i64.reinterpret_f64 + i64.eq + return + end + local.get $0 + call $~lib/number/isNaN + local.get $1 + call $~lib/number/isNaN + i32.and + ) + (func $~lib/number/isNaN (; 3 ;) (type $FUNCSIG$if) (param $0 f32) (result i32) + local.get $0 + local.get $0 + f32.ne + ) + (func $~lib/object/Object.is (; 4 ;) (type $FUNCSIG$iff) (param $0 f32) (param $1 f32) (result i32) + local.get $0 + local.get $1 + f32.eq + if + local.get $0 + i32.reinterpret_f32 + local.get $1 + i32.reinterpret_f32 + i32.eq + return + end + local.get $0 + call $~lib/number/isNaN + local.get $1 + call $~lib/number/isNaN + i32.and + ) + (func $~lib/object/Object.is (; 5 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + local.get $0 + local.get $1 + i32.eq + ) + (func $~lib/object/Object.is (; 6 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + local.get $0 + i32.const 0 + i32.ne + local.get $1 + i32.const 0 + i32.ne + i32.eq + ) + (func $~lib/string/String#get:length (; 7 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 16 + i32.sub + i32.load offset=12 + i32.const 1 + i32.shr_u + ) + (func $~lib/util/string/compareImpl (; 8 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + loop $continue|0 + local.get $2 + if (result i32) + local.get $0 + i32.load16_u + local.get $1 + i32.load16_u + i32.sub + local.tee $3 + i32.eqz + else + i32.const 0 + end + if + local.get $2 + i32.const 1 + i32.sub + local.set $2 + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $continue|0 + end + end + local.get $3 + ) + (func $~lib/string/String.__eq (; 9 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $0 + local.get $1 + i32.eq + if + i32.const 1 + return + end + block $folding-inner0 + local.get $1 + i32.eqz + i32.const 1 + local.get $0 + select + br_if $folding-inner0 + local.get $0 + call $~lib/string/String#get:length + local.tee $2 + local.get $1 + call $~lib/string/String#get:length + i32.ne + br_if $folding-inner0 + local.get $0 + local.get $1 + local.get $2 + call $~lib/util/string/compareImpl + i32.eqz + return + end + i32.const 0 + ) + (func $~lib/object/Object.is<~lib/string/String> (; 10 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + local.get $0 + local.get $1 + call $~lib/string/String.__eq + ) + (func $start:std/object (; 11 ;) (type $FUNCSIG$v) + f64.const 0 + f64.const 0 + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 4 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const 0 + f64.const -0 + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 5 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const -0 + f64.const 0 + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 6 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const 0 + f64.const 1 + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 7 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const 1 + f64.const -1 + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 8 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const 1 + f64.const 1 + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 9 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const inf + f64.const inf + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 11 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const -inf + f64.const -inf + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 12 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const inf + f64.const -inf + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 13 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const -inf + f64.const inf + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 14 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const inf + f64.const nan:0x8000000000000 + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 15 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const nan:0x8000000000000 + f64.const inf + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 16 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const nan:0x8000000000000 + f64.const nan:0x8000000000000 + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 17 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const 0 + f32.const 0 + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 19 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const 0 + f32.const -0 + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 20 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const -0 + f32.const 0 + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 21 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const 0 + f32.const 1 + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 22 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const 1 + f32.const -1 + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 23 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const 1 + f32.const 1 + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 24 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const inf + f32.const inf + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 26 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const -inf + f32.const -inf + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 27 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const inf + f32.const -inf + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 28 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const -inf + f32.const inf + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 29 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const inf + f32.const nan:0x400000 + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 30 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const nan:0x400000 + f32.const inf + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 31 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const nan:0x400000 + f32.const nan:0x400000 + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 32 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const 0 + f64.const -1e-309 + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 34 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const -0 + f64.const -1e-309 + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 35 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const 0 + f64.const 0 + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 36 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + i32.const 0 + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 38 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + i32.const -1 + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 39 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + i32.const 1 + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 41 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + i32.const 0 + call $~lib/object/Object.is + if + i32.const 0 + i32.const 24 + i32.const 42 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + i32.const 0 + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 43 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 72 + i32.const 72 + call $~lib/object/Object.is<~lib/string/String> + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 45 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 72 + i32.const 96 + call $~lib/object/Object.is<~lib/string/String> + if + i32.const 0 + i32.const 24 + i32.const 46 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 72 + i32.const 120 + call $~lib/object/Object.is<~lib/string/String> + if + i32.const 0 + i32.const 24 + i32.const 47 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + i32.const 0 + call $~lib/object/Object.is + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 24 + i32.const 49 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 144 + i32.const 0 + call $~lib/object/Object.is<~lib/string/String> + if + i32.const 0 + i32.const 24 + i32.const 50 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + i32.const 144 + call $~lib/object/Object.is<~lib/string/String> + if + i32.const 0 + i32.const 24 + i32.const 51 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + ) + (func $start (; 12 ;) (type $FUNCSIG$v) + call $start:std/object + ) + (func $null (; 13 ;) (type $FUNCSIG$v) + nop + ) +) diff --git a/tests/compiler/std/object.ts b/tests/compiler/std/object.ts new file mode 100644 index 0000000000..33aa33dd01 --- /dev/null +++ b/tests/compiler/std/object.ts @@ -0,0 +1,51 @@ + +// Object.is + +assert(Object.is(+0.0, +0.0) == true); +assert(Object.is(+0.0, -0.0) == false); +assert(Object.is(-0.0, +0.0) == false); +assert(Object.is(+0.0, +1.0) == false); +assert(Object.is(+1.0, -1.0) == false); +assert(Object.is(+1.0, +1.0) == true); + +assert(Object.is(+Infinity, +Infinity) == true); +assert(Object.is(-Infinity, -Infinity) == true); +assert(Object.is(+Infinity, -Infinity) == false); +assert(Object.is(-Infinity, +Infinity) == false); +assert(Object.is(+Infinity, NaN) == false); +assert(Object.is(NaN, Infinity) == false); +assert(Object.is(NaN, NaN) == true); + +assert(Object.is(+0.0, +0.0) == true); +assert(Object.is(+0.0, -0.0) == false); +assert(Object.is(-0.0, +0.0) == false); +assert(Object.is(+0.0, +1.0) == false); +assert(Object.is(+1.0, -1.0) == false); +assert(Object.is(+1.0, +1.0) == true); + +assert(Object.is(+Infinity, +Infinity) == true); +assert(Object.is(-Infinity, -Infinity) == true); +assert(Object.is(+Infinity, -Infinity) == false); +assert(Object.is(-Infinity, +Infinity) == false); +assert(Object.is(+Infinity, NaN) == false); +assert(Object.is(NaN, Infinity) == false); +assert(Object.is(NaN, NaN) == true); + +assert(Object.is(-0, 1e-1 * (-1e-308)) == false); +assert(Object.is(-0.0, 1e-1 * (-1e-308)) == false); +assert(Object.is(0, 0.0) == true); + +assert(Object.is(+0, -0) == true); +assert(Object.is(+1, -1) == false); + +assert(Object.is(true, true) == true); +assert(Object.is(true, false) == false); +assert(Object.is(false, false) == true); + +assert(Object.is("a", "a") == true); +assert(Object.is("a", "b") == false); +assert(Object.is("a", "ab") == false); + +assert(Object.is(null, null) == true); +assert(Object.is("", null) == false); +assert(Object.is(null, "") == false); diff --git a/tests/compiler/std/object.untouched.wat b/tests/compiler/std/object.untouched.wat new file mode 100644 index 0000000000..1964b0744b --- /dev/null +++ b/tests/compiler/std/object.untouched.wat @@ -0,0 +1,845 @@ +(module + (type $FUNCSIG$idd (func (param f64 f64) (result i32))) + (type $FUNCSIG$id (func (param f64) (result i32))) + (type $FUNCSIG$viiii (func (param i32 i32 i32 i32))) + (type $FUNCSIG$iff (func (param f32 f32) (result i32))) + (type $FUNCSIG$if (func (param f32) (result i32))) + (type $FUNCSIG$iii (func (param i32 i32) (result i32))) + (type $FUNCSIG$ii (func (param i32) (result i32))) + (type $FUNCSIG$vi (func (param i32))) + (type $FUNCSIG$iiiiii (func (param i32 i32 i32 i32 i32) (result i32))) + (type $FUNCSIG$v (func)) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (memory $0 1) + (data (i32.const 8) "\1a\00\00\00\01\00\00\00\01\00\00\00\1a\00\00\00s\00t\00d\00/\00o\00b\00j\00e\00c\00t\00.\00t\00s\00") + (data (i32.const 56) "\02\00\00\00\01\00\00\00\01\00\00\00\02\00\00\00a\00") + (data (i32.const 80) "\02\00\00\00\01\00\00\00\01\00\00\00\02\00\00\00b\00") + (data (i32.const 104) "\04\00\00\00\01\00\00\00\01\00\00\00\04\00\00\00a\00b\00") + (data (i32.const 128) "\00\00\00\00\01\00\00\00\01\00\00\00\00\00\00\00") + (table $0 1 funcref) + (elem (i32.const 0) $null) + (export "memory" (memory $0)) + (start $start) + (func $~lib/number/isNaN (; 1 ;) (type $FUNCSIG$id) (param $0 f64) (result i32) + local.get $0 + local.get $0 + f64.ne + ) + (func $~lib/object/Object.is (; 2 ;) (type $FUNCSIG$idd) (param $0 f64) (param $1 f64) (result i32) + local.get $0 + local.get $1 + f64.eq + if + local.get $0 + i64.reinterpret_f64 + local.get $1 + i64.reinterpret_f64 + i64.eq + return + end + local.get $0 + call $~lib/number/isNaN + local.get $1 + call $~lib/number/isNaN + i32.and + return + ) + (func $~lib/number/isNaN (; 3 ;) (type $FUNCSIG$if) (param $0 f32) (result i32) + local.get $0 + local.get $0 + f32.ne + ) + (func $~lib/object/Object.is (; 4 ;) (type $FUNCSIG$iff) (param $0 f32) (param $1 f32) (result i32) + local.get $0 + local.get $1 + f32.eq + if + local.get $0 + i32.reinterpret_f32 + local.get $1 + i32.reinterpret_f32 + i32.eq + return + end + local.get $0 + call $~lib/number/isNaN + local.get $1 + call $~lib/number/isNaN + i32.and + return + ) + (func $~lib/object/Object.is (; 5 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + local.get $0 + local.get $1 + i32.eq + ) + (func $~lib/object/Object.is (; 6 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + local.get $0 + i32.const 0 + i32.ne + local.get $1 + i32.const 0 + i32.ne + i32.eq + ) + (func $~lib/rt/stub/__retain (; 7 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + ) + (func $~lib/rt/stub/__release (; 8 ;) (type $FUNCSIG$vi) (param $0 i32) + nop + ) + (func $~lib/string/String#get:length (; 9 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 16 + i32.sub + i32.load offset=12 + i32.const 1 + i32.shr_u + ) + (func $~lib/util/string/compareImpl (; 10 ;) (type $FUNCSIG$iiiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + local.get $0 + call $~lib/rt/stub/__retain + drop + local.get $2 + call $~lib/rt/stub/__retain + drop + i32.const 0 + local.set $5 + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add + local.set $6 + local.get $2 + local.get $3 + i32.const 1 + i32.shl + i32.add + local.set $7 + block $break|0 + loop $continue|0 + local.get $4 + if (result i32) + local.get $6 + i32.load16_u + local.get $7 + i32.load16_u + i32.sub + local.tee $5 + i32.eqz + else + i32.const 0 + end + i32.eqz + br_if $break|0 + local.get $4 + i32.const 1 + i32.sub + local.set $4 + local.get $6 + i32.const 2 + i32.add + local.set $6 + local.get $7 + i32.const 2 + i32.add + local.set $7 + br $continue|0 + end + unreachable + end + local.get $5 + local.set $8 + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + call $~lib/rt/stub/__release + local.get $8 + ) + (func $~lib/string/String.__eq (; 11 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + local.get $0 + call $~lib/rt/stub/__retain + drop + local.get $1 + call $~lib/rt/stub/__retain + drop + local.get $0 + local.get $1 + i32.eq + if + i32.const 1 + local.set $2 + local.get $0 + call $~lib/rt/stub/__release + local.get $1 + call $~lib/rt/stub/__release + local.get $2 + return + end + local.get $0 + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $1 + i32.const 0 + i32.eq + end + if + i32.const 0 + local.set $2 + local.get $0 + call $~lib/rt/stub/__release + local.get $1 + call $~lib/rt/stub/__release + local.get $2 + return + end + local.get $0 + call $~lib/string/String#get:length + local.set $3 + local.get $3 + local.get $1 + call $~lib/string/String#get:length + i32.ne + if + i32.const 0 + local.set $2 + local.get $0 + call $~lib/rt/stub/__release + local.get $1 + call $~lib/rt/stub/__release + local.get $2 + return + end + local.get $0 + i32.const 0 + local.get $1 + i32.const 0 + local.get $3 + call $~lib/util/string/compareImpl + i32.eqz + local.set $2 + local.get $0 + call $~lib/rt/stub/__release + local.get $1 + call $~lib/rt/stub/__release + local.get $2 + ) + (func $~lib/object/Object.is<~lib/string/String> (; 12 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $0 + call $~lib/rt/stub/__retain + drop + local.get $1 + call $~lib/rt/stub/__retain + drop + local.get $0 + local.get $1 + call $~lib/string/String.__eq + local.set $2 + local.get $0 + call $~lib/rt/stub/__release + local.get $1 + call $~lib/rt/stub/__release + local.get $2 + ) + (func $~lib/object/Object.is (; 13 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + local.get $0 + local.get $1 + i32.eq + ) + (func $~lib/object/Object.is<~lib/string/String | null> (; 14 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $0 + call $~lib/rt/stub/__retain + drop + local.get $1 + call $~lib/rt/stub/__retain + drop + local.get $0 + local.get $1 + call $~lib/string/String.__eq + local.set $2 + local.get $0 + call $~lib/rt/stub/__release + local.get $1 + call $~lib/rt/stub/__release + local.get $2 + ) + (func $start:std/object (; 15 ;) (type $FUNCSIG$v) + f64.const 0 + f64.const 0 + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 4 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const 0 + f64.const -0 + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 5 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const -0 + f64.const 0 + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 6 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const 0 + f64.const 1 + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 7 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const 1 + f64.const -1 + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 8 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const 1 + f64.const 1 + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 9 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const inf + f64.const inf + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 11 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const -inf + f64.const -inf + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 12 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const inf + f64.const -inf + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 13 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const -inf + f64.const inf + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 14 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const inf + f64.const nan:0x8000000000000 + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 15 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const nan:0x8000000000000 + f64.const inf + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 16 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const nan:0x8000000000000 + f64.const nan:0x8000000000000 + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 17 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const 0 + f32.const 0 + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 19 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const 0 + f32.const -0 + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 20 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const -0 + f32.const 0 + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 21 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const 0 + f32.const 1 + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 22 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const 1 + f32.const -1 + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 23 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const 1 + f32.const 1 + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 24 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const inf + f32.const inf + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 26 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const -inf + f32.const -inf + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 27 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const inf + f32.const -inf + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 28 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const -inf + f32.const inf + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 29 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const inf + f32.const nan:0x400000 + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 30 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const nan:0x400000 + f32.const inf + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 31 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f32.const nan:0x400000 + f32.const nan:0x400000 + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 32 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const 0 + f64.const -1e-309 + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 34 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const -0 + f64.const -1e-309 + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 35 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const 0 + f64.const 0 + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 36 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + i32.const 0 + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 38 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + i32.const -1 + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 39 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + i32.const 1 + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 41 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + i32.const 0 + call $~lib/object/Object.is + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 42 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + i32.const 0 + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 43 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 72 + i32.const 72 + call $~lib/object/Object.is<~lib/string/String> + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 45 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 72 + i32.const 96 + call $~lib/object/Object.is<~lib/string/String> + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 46 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 72 + i32.const 120 + call $~lib/object/Object.is<~lib/string/String> + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 47 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + i32.const 0 + call $~lib/object/Object.is + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 49 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 144 + i32.const 0 + call $~lib/object/Object.is<~lib/string/String | null> + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 50 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + i32.const 144 + call $~lib/object/Object.is<~lib/string/String | null> + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 24 + i32.const 51 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + ) + (func $start (; 16 ;) (type $FUNCSIG$v) + call $start:std/object + ) + (func $null (; 17 ;) (type $FUNCSIG$v) + ) +)