diff --git a/NOTICE b/NOTICE index c99b6077b7..f9e5e9e9a2 100644 --- a/NOTICE +++ b/NOTICE @@ -14,6 +14,7 @@ under the licensing terms detailed in LICENSE: * Nidin Vinayakan <01@01alchemist.com> * Aaron Turner * Willem Wyndham +* Bowen Wang Portions of this software are derived from third-party works licensed under the following terms: diff --git a/src/resolver.ts b/src/resolver.ts index 7a7c97ea12..2f52dc88d2 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -748,14 +748,22 @@ export class Resolver extends DiagnosticEmitter { return null; } let arrayType = indexedGet.signature.returnType; + // } - if (!(target = arrayType.classReference)) { - this.error( - DiagnosticCode.Property_0_does_not_exist_on_type_1, - propertyAccess.property.range, propertyName, arrayType.toString() - ); - return null; + let classReference = arrayType.classReference; + if (!classReference) { + let typeClasses = this.program.typeClasses; + if (!arrayType.is(TypeFlags.REFERENCE) && typeClasses.has(arrayType.kind)) { + classReference = typeClasses.get(arrayType.kind)!; + } else { + this.error( + DiagnosticCode.Property_0_does_not_exist_on_type_1, + propertyAccess.property.range, propertyName, arrayType.toString() + ); + return null; + } } + target = classReference; } break; } @@ -1333,6 +1341,7 @@ export class Resolver extends DiagnosticEmitter { contextualType, reportMode ); + if (!target) return null; if (target.kind == ElementKind.FUNCTION_PROTOTYPE) { // `unchecked(expr: *): *` is special @@ -1365,6 +1374,11 @@ export class Resolver extends DiagnosticEmitter { // reuse resolvedThisExpression (might be property access) // reuse resolvedElementExpression (might be element access) return functionTarget; + } else { + let typeClasses = this.program.typeClasses; + if (!returnType.is(TypeFlags.REFERENCE) && typeClasses.has(returnType.kind)) { + return typeClasses.get(returnType.kind); + } } } if (reportMode == ReportMode.REPORT) { diff --git a/tests/compiler/resolve-access.json b/tests/compiler/resolve-access.json new file mode 100644 index 0000000000..453cb07770 --- /dev/null +++ b/tests/compiler/resolve-access.json @@ -0,0 +1,5 @@ +{ + "asc_flags": [ + "--runtime none" + ] +} diff --git a/tests/compiler/resolve-access.optimized.wat b/tests/compiler/resolve-access.optimized.wat new file mode 100644 index 0000000000..fd20d90cc9 --- /dev/null +++ b/tests/compiler/resolve-access.optimized.wat @@ -0,0 +1,576 @@ +(module + (type $FUNCSIG$i (func (result i32))) + (type $FUNCSIG$iii (func (param i32 i32) (result i32))) + (type $FUNCSIG$ii (func (param i32) (result i32))) + (type $FUNCSIG$viii (func (param i32 i32 i32))) + (type $FUNCSIG$viiii (func (param i32 i32 i32 i32))) + (type $FUNCSIG$ij (func (param i64) (result i32))) + (type $FUNCSIG$viji (func (param i32 i64 i32))) + (type $FUNCSIG$v (func)) + (type $FUNCSIG$vi (func (param i32))) + (type $FUNCSIG$ji (func (param i32) (result i64))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (memory $0 1) + (data (i32.const 8) "\08\00\00\00\01\00\00\00\00\00\00\00\08\00\00\00\01") + (data (i32.const 32) "$\00\00\00\01\00\00\00\01\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 88) "\1a\00\00\00\01\00\00\00\01\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") + (data (i32.const 136) "\02\00\00\00\01\00\00\00\01\00\00\00\02\00\00\000") + (global $~lib/rt/stub/startOffset (mut i32) (i32.const 0)) + (global $~lib/rt/stub/offset (mut i32) (i32.const 0)) + (export "memory" (memory $0)) + (export "arrayAccess" (func $resolve-access/arrayAccess)) + (export "fieldAccess" (func $resolve-access/fieldAccess)) + (export "propertyAccess" (func $resolve-access/propertyAccess)) + (start $start) + (func $~lib/rt/stub/__alloc (; 1 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $0 + i32.const 1073741808 + i32.gt_u + if + unreachable + end + global.get $~lib/rt/stub/offset + i32.const 16 + i32.add + local.tee $3 + local.get $0 + i32.const 1 + local.get $0 + i32.const 1 + i32.gt_u + select + i32.add + i32.const 15 + i32.add + i32.const -16 + i32.and + local.tee $2 + memory.size + local.tee $4 + i32.const 16 + i32.shl + i32.gt_u + if + local.get $4 + local.get $2 + local.get $3 + i32.sub + i32.const 65535 + i32.add + i32.const -65536 + i32.and + i32.const 16 + i32.shr_u + local.tee $5 + local.get $4 + local.get $5 + i32.gt_s + select + memory.grow + i32.const 0 + i32.lt_s + if + local.get $5 + memory.grow + i32.const 0 + i32.lt_s + if + unreachable + end + end + end + local.get $2 + global.set $~lib/rt/stub/offset + local.get $3 + i32.const 16 + i32.sub + local.tee $2 + local.get $1 + i32.store offset=8 + local.get $2 + local.get $0 + i32.store offset=12 + local.get $3 + ) + (func $~lib/memory/memory.copy (; 2 ;) (type $FUNCSIG$vi) (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + i32.const 24 + local.set $2 + i32.const 8 + local.set $1 + block $~lib/util/memory/memmove|inlined.0 + local.get $0 + i32.const 24 + i32.eq + br_if $~lib/util/memory/memmove|inlined.0 + local.get $0 + i32.const 24 + i32.lt_u + if + local.get $0 + i32.const 7 + i32.and + i32.eqz + if + loop $continue|0 + local.get $0 + i32.const 7 + i32.and + if + local.get $1 + i32.eqz + br_if $~lib/util/memory/memmove|inlined.0 + local.get $1 + i32.const 1 + i32.sub + local.set $1 + local.get $0 + local.tee $3 + i32.const 1 + i32.add + local.set $0 + local.get $2 + local.tee $4 + i32.const 1 + i32.add + local.set $2 + local.get $3 + local.get $4 + i32.load8_u + i32.store8 + br $continue|0 + end + end + loop $continue|1 + local.get $1 + i32.const 8 + i32.ge_u + if + local.get $0 + local.get $2 + i64.load + i64.store + local.get $1 + i32.const 8 + i32.sub + local.set $1 + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $2 + i32.const 8 + i32.add + local.set $2 + br $continue|1 + end + end + end + loop $continue|2 + local.get $1 + if + local.get $0 + local.tee $3 + i32.const 1 + i32.add + local.set $0 + local.get $2 + local.tee $4 + i32.const 1 + i32.add + local.set $2 + local.get $3 + local.get $4 + i32.load8_u + i32.store8 + local.get $1 + i32.const 1 + i32.sub + local.set $1 + br $continue|2 + end + end + else + local.get $0 + i32.const 7 + i32.and + i32.eqz + if + loop $continue|3 + local.get $0 + local.get $1 + i32.add + i32.const 7 + i32.and + if + local.get $1 + i32.eqz + br_if $~lib/util/memory/memmove|inlined.0 + local.get $1 + i32.const 1 + i32.sub + local.tee $1 + local.get $0 + i32.add + local.get $1 + i32.const 24 + i32.add + i32.load8_u + i32.store8 + br $continue|3 + end + end + loop $continue|4 + local.get $1 + i32.const 8 + i32.ge_u + if + local.get $1 + i32.const 8 + i32.sub + local.tee $1 + local.get $0 + i32.add + local.get $1 + i32.const 24 + i32.add + i64.load + i64.store + br $continue|4 + end + end + end + loop $continue|5 + local.get $1 + if + local.get $1 + i32.const 1 + i32.sub + local.tee $1 + local.get $0 + i32.add + local.get $1 + i32.const 24 + i32.add + i32.load8_u + i32.store8 + br $continue|5 + end + end + end + end + ) + (func $~lib/rt/__allocArray (; 3 ;) (type $FUNCSIG$i) (result i32) + (local $0 i32) + (local $1 i32) + i32.const 16 + i32.const 3 + call $~lib/rt/stub/__alloc + local.tee $0 + i32.const 8 + i32.const 0 + call $~lib/rt/stub/__alloc + local.tee $1 + i32.store + local.get $0 + local.get $1 + i32.store offset=4 + local.get $0 + i32.const 8 + i32.store offset=8 + local.get $0 + i32.const 1 + i32.store offset=12 + local.get $1 + call $~lib/memory/memory.copy + local.get $0 + ) + (func $~lib/array/Array#__get (; 4 ;) (type $FUNCSIG$ji) (param $0 i32) (result i64) + i32.const 0 + local.get $0 + i32.load offset=8 + i32.const 3 + i32.shr_u + i32.ge_u + if + i32.const 48 + i32.const 104 + i32.const 109 + i32.const 61 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.load offset=4 + i64.load + ) + (func $~lib/util/number/decimalCount32 (; 5 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + i32.const 1 + i32.const 2 + local.get $0 + i32.const 10 + i32.lt_u + select + i32.const 3 + i32.const 4 + i32.const 5 + local.get $0 + i32.const 10000 + i32.lt_u + select + local.get $0 + i32.const 1000 + i32.lt_u + select + local.get $0 + i32.const 100 + i32.lt_u + select + i32.const 6 + i32.const 7 + local.get $0 + i32.const 1000000 + i32.lt_u + select + i32.const 8 + i32.const 9 + i32.const 10 + local.get $0 + i32.const 1000000000 + i32.lt_u + select + local.get $0 + i32.const 100000000 + i32.lt_u + select + local.get $0 + i32.const 10000000 + i32.lt_u + select + local.get $0 + i32.const 100000 + i32.lt_u + select + ) + (func $~lib/util/number/utoa_simple (; 6 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + loop $continue|0 + local.get $1 + i32.const 10 + i32.rem_u + local.set $3 + local.get $1 + i32.const 10 + i32.div_u + local.set $1 + local.get $2 + i32.const 1 + i32.sub + local.tee $2 + i32.const 1 + i32.shl + local.get $0 + i32.add + local.get $3 + i32.const 48 + i32.add + i32.store16 + local.get $1 + br_if $continue|0 + end + ) + (func $~lib/util/number/decimalCount64 (; 7 ;) (type $FUNCSIG$ij) (param $0 i64) (result i32) + i32.const 11 + i32.const 12 + local.get $0 + i64.const 100000000000 + i64.lt_u + select + i32.const 13 + i32.const 14 + i32.const 15 + local.get $0 + i64.const 100000000000000 + i64.lt_u + select + local.get $0 + i64.const 10000000000000 + i64.lt_u + select + local.get $0 + i64.const 1000000000000 + i64.lt_u + select + i32.const 16 + i32.const 17 + local.get $0 + i64.const 10000000000000000 + i64.lt_u + select + i32.const 18 + i32.const 19 + i32.const 20 + local.get $0 + i64.const -8446744073709551616 + i64.lt_u + select + local.get $0 + i64.const 1000000000000000000 + i64.lt_u + select + local.get $0 + i64.const 100000000000000000 + i64.lt_u + select + local.get $0 + i64.const 1000000000000000 + i64.lt_u + select + ) + (func $~lib/util/number/utoa_simple (; 8 ;) (type $FUNCSIG$viji) (param $0 i32) (param $1 i64) (param $2 i32) + (local $3 i32) + loop $continue|0 + local.get $1 + i64.const 10 + i64.rem_u + i32.wrap_i64 + local.set $3 + local.get $1 + i64.const 10 + i64.div_u + local.set $1 + local.get $2 + i32.const 1 + i32.sub + local.tee $2 + i32.const 1 + i32.shl + local.get $0 + i32.add + local.get $3 + i32.const 48 + i32.add + i32.store16 + local.get $1 + i64.const 0 + i64.ne + br_if $continue|0 + end + ) + (func $~lib/util/number/utoa64 (; 9 ;) (type $FUNCSIG$ij) (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + i64.eqz + if + i32.const 152 + return + end + local.get $0 + i64.const 4294967295 + i64.le_u + if + local.get $0 + i32.wrap_i64 + local.tee $1 + call $~lib/util/number/decimalCount32 + local.tee $3 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/stub/__alloc + local.tee $2 + local.get $1 + local.get $3 + call $~lib/util/number/utoa_simple + else + local.get $0 + call $~lib/util/number/decimalCount64 + local.tee $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/stub/__alloc + local.tee $2 + local.get $0 + local.get $1 + call $~lib/util/number/utoa_simple + end + local.get $2 + ) + (func $resolve-access/arrayAccess (; 10 ;) (type $FUNCSIG$i) (result i32) + call $~lib/rt/__allocArray + call $~lib/array/Array#__get + call $~lib/util/number/utoa64 + ) + (func $resolve-access/Container#constructor (; 11 ;) (type $FUNCSIG$i) (result i32) + (local $0 i32) + i32.const 8 + i32.const 5 + call $~lib/rt/stub/__alloc + local.tee $0 + i64.const 0 + i64.store + local.get $0 + ) + (func $resolve-access/fieldAccess (; 12 ;) (type $FUNCSIG$i) (result i32) + (local $0 i32) + call $resolve-access/Container#constructor + local.tee $0 + i64.const 1 + i64.store + local.get $0 + i64.load + call $~lib/util/number/utoa64 + ) + (func $~lib/util/number/utoa32 (; 13 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.eqz + if + i32.const 152 + return + end + local.get $0 + call $~lib/util/number/decimalCount32 + local.tee $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/stub/__alloc + local.tee $2 + local.get $0 + local.get $1 + call $~lib/util/number/utoa_simple + local.get $2 + ) + (func $resolve-access/propertyAccess (; 14 ;) (type $FUNCSIG$i) (result i32) + (local $0 i32) + call $resolve-access/Container#constructor + local.tee $0 + i64.const 1 + i64.store + local.get $0 + i64.load + i32.wrap_i64 + call $~lib/util/number/utoa32 + ) + (func $start (; 15 ;) (type $FUNCSIG$v) + i32.const 160 + global.set $~lib/rt/stub/startOffset + global.get $~lib/rt/stub/startOffset + global.set $~lib/rt/stub/offset + ) + (func $null (; 16 ;) (type $FUNCSIG$v) + nop + ) +) diff --git a/tests/compiler/resolve-access.ts b/tests/compiler/resolve-access.ts new file mode 100644 index 0000000000..9519101fb2 --- /dev/null +++ b/tests/compiler/resolve-access.ts @@ -0,0 +1,25 @@ +export function arrayAccess(): string { + let arr: u64[] = [1]; + return arr[0].toString(); +} + +class Container { + foo: u64; + + toU32(): u32 { + return this.foo as u32; + } +} + +export function fieldAccess(): string { + let container = new Container(); + container.foo = 1; + return container.foo.toString(); +} + +export function propertyAccess(): string { + let container = new Container(); + container.foo = 1; + return container.toU32().toString(); +} + diff --git a/tests/compiler/resolve-access.untouched.wat b/tests/compiler/resolve-access.untouched.wat new file mode 100644 index 0000000000..0fac801874 --- /dev/null +++ b/tests/compiler/resolve-access.untouched.wat @@ -0,0 +1,2077 @@ +(module + (type $FUNCSIG$i (func (result i32))) + (type $FUNCSIG$iiiii (func (param i32 i32 i32 i32) (result i32))) + (type $FUNCSIG$iii (func (param i32 i32) (result i32))) + (type $FUNCSIG$ii (func (param i32) (result i32))) + (type $FUNCSIG$viii (func (param i32 i32 i32))) + (type $FUNCSIG$jii (func (param i32 i32) (result i64))) + (type $FUNCSIG$viiii (func (param i32 i32 i32 i32))) + (type $FUNCSIG$ij (func (param i64) (result i32))) + (type $FUNCSIG$viji (func (param i32 i64 i32))) + (type $FUNCSIG$vi (func (param i32))) + (type $FUNCSIG$v (func)) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (memory $0 1) + (data (i32.const 8) "\08\00\00\00\01\00\00\00\00\00\00\00\08\00\00\00\01\00\00\00\00\00\00\00") + (data (i32.const 32) "$\00\00\00\01\00\00\00\01\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e\00") + (data (i32.const 88) "\1a\00\00\00\01\00\00\00\01\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") + (data (i32.const 136) "\02\00\00\00\01\00\00\00\01\00\00\00\02\00\00\000\00") + (data (i32.const 160) "\90\01\00\00\01\00\00\00\00\00\00\00\90\01\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00") + (data (i32.const 576) "\10\00\00\00\01\00\00\00\05\00\00\00\10\00\00\00\b0\00\00\00\b0\00\00\00\90\01\00\00d\00\00\00") + (table $0 1 funcref) + (elem (i32.const 0) $null) + (global $~lib/rt/stub/startOffset (mut i32) (i32.const 0)) + (global $~lib/rt/stub/offset (mut i32) (i32.const 0)) + (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) + (global $~lib/builtins/u32.MAX_VALUE i32 (i32.const -1)) + (global $~lib/heap/__heap_base i32 (i32.const 608)) + (export "memory" (memory $0)) + (export "arrayAccess" (func $resolve-access/arrayAccess)) + (export "fieldAccess" (func $resolve-access/fieldAccess)) + (export "propertyAccess" (func $resolve-access/propertyAccess)) + (start $start) + (func $~lib/rt/stub/__alloc (; 1 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + local.get $0 + i32.const 1073741808 + i32.gt_u + if + unreachable + end + global.get $~lib/rt/stub/offset + i32.const 16 + i32.add + local.set $2 + local.get $2 + local.get $0 + local.tee $3 + i32.const 1 + local.tee $4 + local.get $3 + local.get $4 + i32.gt_u + select + i32.add + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + local.set $5 + memory.size + local.set $6 + local.get $5 + local.get $6 + i32.const 16 + i32.shl + i32.gt_u + if + local.get $5 + local.get $2 + i32.sub + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $3 + local.get $6 + local.tee $4 + local.get $3 + local.tee $7 + local.get $4 + local.get $7 + i32.gt_s + select + local.set $4 + local.get $4 + memory.grow + i32.const 0 + i32.lt_s + if + local.get $3 + memory.grow + i32.const 0 + i32.lt_s + if + unreachable + end + end + end + local.get $5 + global.set $~lib/rt/stub/offset + local.get $2 + i32.const 16 + i32.sub + local.set $8 + local.get $8 + local.get $1 + i32.store offset=8 + local.get $8 + local.get $0 + i32.store offset=12 + local.get $2 + ) + (func $~lib/rt/stub/__retain (; 2 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + ) + (func $~lib/util/memory/memcpy (; 3 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + block $break|0 + loop $continue|0 + local.get $2 + if (result i32) + local.get $1 + i32.const 3 + i32.and + else + i32.const 0 + end + i32.eqz + br_if $break|0 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $2 + i32.const 1 + i32.sub + local.set $2 + br $continue|0 + end + unreachable + end + local.get $0 + i32.const 3 + i32.and + i32.const 0 + i32.eq + if + block $break|1 + loop $continue|1 + local.get $2 + i32.const 16 + i32.ge_u + i32.eqz + br_if $break|1 + local.get $0 + local.get $1 + i32.load + i32.store + local.get $0 + i32.const 4 + i32.add + local.get $1 + i32.const 4 + i32.add + i32.load + i32.store + local.get $0 + i32.const 8 + i32.add + local.get $1 + i32.const 8 + i32.add + i32.load + i32.store + local.get $0 + i32.const 12 + i32.add + local.get $1 + i32.const 12 + i32.add + i32.load + i32.store + local.get $1 + i32.const 16 + i32.add + local.set $1 + local.get $0 + i32.const 16 + i32.add + local.set $0 + local.get $2 + i32.const 16 + i32.sub + local.set $2 + br $continue|1 + end + unreachable + end + local.get $2 + i32.const 8 + i32.and + if + local.get $0 + local.get $1 + i32.load + i32.store + local.get $0 + i32.const 4 + i32.add + local.get $1 + i32.const 4 + i32.add + i32.load + i32.store + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + end + local.get $2 + i32.const 4 + i32.and + if + local.get $0 + local.get $1 + i32.load + i32.store + local.get $0 + i32.const 4 + i32.add + local.set $0 + local.get $1 + i32.const 4 + i32.add + local.set $1 + end + local.get $2 + i32.const 2 + i32.and + if + local.get $0 + local.get $1 + i32.load16_u + i32.store16 + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $1 + i32.const 2 + i32.add + local.set $1 + end + local.get $2 + i32.const 1 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + return + end + local.get $2 + i32.const 32 + i32.ge_u + if + block $break|2 + block $case2|2 + block $case1|2 + block $case0|2 + local.get $0 + i32.const 3 + i32.and + local.set $5 + local.get $5 + i32.const 1 + i32.eq + br_if $case0|2 + local.get $5 + i32.const 2 + i32.eq + br_if $case1|2 + local.get $5 + i32.const 3 + i32.eq + br_if $case2|2 + br $break|2 + end + local.get $1 + i32.load + local.set $3 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $2 + i32.const 3 + i32.sub + local.set $2 + block $break|3 + loop $continue|3 + local.get $2 + i32.const 17 + i32.ge_u + i32.eqz + br_if $break|3 + local.get $1 + i32.const 1 + i32.add + i32.load + local.set $4 + local.get $0 + local.get $3 + i32.const 24 + i32.shr_u + local.get $4 + i32.const 8 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 5 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 4 + i32.add + local.get $4 + i32.const 24 + i32.shr_u + local.get $3 + i32.const 8 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 9 + i32.add + i32.load + local.set $4 + local.get $0 + i32.const 8 + i32.add + local.get $3 + i32.const 24 + i32.shr_u + local.get $4 + i32.const 8 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 13 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 12 + i32.add + local.get $4 + i32.const 24 + i32.shr_u + local.get $3 + i32.const 8 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 16 + i32.add + local.set $1 + local.get $0 + i32.const 16 + i32.add + local.set $0 + local.get $2 + i32.const 16 + i32.sub + local.set $2 + br $continue|3 + end + unreachable + end + br $break|2 + end + local.get $1 + i32.load + local.set $3 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $2 + i32.const 2 + i32.sub + local.set $2 + block $break|4 + loop $continue|4 + local.get $2 + i32.const 18 + i32.ge_u + i32.eqz + br_if $break|4 + local.get $1 + i32.const 2 + i32.add + i32.load + local.set $4 + local.get $0 + local.get $3 + i32.const 16 + i32.shr_u + local.get $4 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 6 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 4 + i32.add + local.get $4 + i32.const 16 + i32.shr_u + local.get $3 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 10 + i32.add + i32.load + local.set $4 + local.get $0 + i32.const 8 + i32.add + local.get $3 + i32.const 16 + i32.shr_u + local.get $4 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 14 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 12 + i32.add + local.get $4 + i32.const 16 + i32.shr_u + local.get $3 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 16 + i32.add + local.set $1 + local.get $0 + i32.const 16 + i32.add + local.set $0 + local.get $2 + i32.const 16 + i32.sub + local.set $2 + br $continue|4 + end + unreachable + end + br $break|2 + end + local.get $1 + i32.load + local.set $3 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $2 + i32.const 1 + i32.sub + local.set $2 + block $break|5 + loop $continue|5 + local.get $2 + i32.const 19 + i32.ge_u + i32.eqz + br_if $break|5 + local.get $1 + i32.const 3 + i32.add + i32.load + local.set $4 + local.get $0 + local.get $3 + i32.const 8 + i32.shr_u + local.get $4 + i32.const 24 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 7 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 4 + i32.add + local.get $4 + i32.const 8 + i32.shr_u + local.get $3 + i32.const 24 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 11 + i32.add + i32.load + local.set $4 + local.get $0 + i32.const 8 + i32.add + local.get $3 + i32.const 8 + i32.shr_u + local.get $4 + i32.const 24 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 15 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 12 + i32.add + local.get $4 + i32.const 8 + i32.shr_u + local.get $3 + i32.const 24 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 16 + i32.add + local.set $1 + local.get $0 + i32.const 16 + i32.add + local.set $0 + local.get $2 + i32.const 16 + i32.sub + local.set $2 + br $continue|5 + end + unreachable + end + br $break|2 + end + end + local.get $2 + i32.const 16 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + local.get $2 + i32.const 8 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + local.get $2 + i32.const 4 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + local.get $2 + i32.const 2 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + local.get $2 + i32.const 1 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + ) + (func $~lib/memory/memory.copy (; 4 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + block $~lib/util/memory/memmove|inlined.0 + local.get $0 + local.set $5 + local.get $1 + local.set $4 + local.get $2 + local.set $3 + local.get $5 + local.get $4 + i32.eq + if + br $~lib/util/memory/memmove|inlined.0 + end + local.get $4 + local.get $3 + i32.add + local.get $5 + i32.le_u + if (result i32) + i32.const 1 + else + local.get $5 + local.get $3 + i32.add + local.get $4 + i32.le_u + end + if + local.get $5 + local.get $4 + local.get $3 + call $~lib/util/memory/memcpy + br $~lib/util/memory/memmove|inlined.0 + end + local.get $5 + local.get $4 + i32.lt_u + if + local.get $4 + i32.const 7 + i32.and + local.get $5 + i32.const 7 + i32.and + i32.eq + if + block $break|0 + loop $continue|0 + local.get $5 + i32.const 7 + i32.and + i32.eqz + br_if $break|0 + local.get $3 + i32.eqz + if + br $~lib/util/memory/memmove|inlined.0 + end + local.get $3 + i32.const 1 + i32.sub + local.set $3 + local.get $5 + local.tee $6 + i32.const 1 + i32.add + local.set $5 + local.get $6 + local.get $4 + local.tee $6 + i32.const 1 + i32.add + local.set $4 + local.get $6 + i32.load8_u + i32.store8 + br $continue|0 + end + unreachable + end + block $break|1 + loop $continue|1 + local.get $3 + i32.const 8 + i32.ge_u + i32.eqz + br_if $break|1 + local.get $5 + local.get $4 + i64.load + i64.store + local.get $3 + i32.const 8 + i32.sub + local.set $3 + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $4 + i32.const 8 + i32.add + local.set $4 + br $continue|1 + end + unreachable + end + end + block $break|2 + loop $continue|2 + local.get $3 + i32.eqz + br_if $break|2 + local.get $5 + local.tee $6 + i32.const 1 + i32.add + local.set $5 + local.get $6 + local.get $4 + local.tee $6 + i32.const 1 + i32.add + local.set $4 + local.get $6 + i32.load8_u + i32.store8 + local.get $3 + i32.const 1 + i32.sub + local.set $3 + br $continue|2 + end + unreachable + end + else + local.get $4 + i32.const 7 + i32.and + local.get $5 + i32.const 7 + i32.and + i32.eq + if + block $break|3 + loop $continue|3 + local.get $5 + local.get $3 + i32.add + i32.const 7 + i32.and + i32.eqz + br_if $break|3 + local.get $3 + i32.eqz + if + br $~lib/util/memory/memmove|inlined.0 + end + local.get $5 + local.get $3 + i32.const 1 + i32.sub + local.tee $3 + i32.add + local.get $4 + local.get $3 + i32.add + i32.load8_u + i32.store8 + br $continue|3 + end + unreachable + end + block $break|4 + loop $continue|4 + local.get $3 + i32.const 8 + i32.ge_u + i32.eqz + br_if $break|4 + local.get $3 + i32.const 8 + i32.sub + local.set $3 + local.get $5 + local.get $3 + i32.add + local.get $4 + local.get $3 + i32.add + i64.load + i64.store + br $continue|4 + end + unreachable + end + end + block $break|5 + loop $continue|5 + local.get $3 + i32.eqz + br_if $break|5 + local.get $5 + local.get $3 + i32.const 1 + i32.sub + local.tee $3 + i32.add + local.get $4 + local.get $3 + i32.add + i32.load8_u + i32.store8 + br $continue|5 + end + unreachable + end + end + end + ) + (func $~lib/rt/__allocArray (; 5 ;) (type $FUNCSIG$iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + i32.const 16 + local.get $2 + call $~lib/rt/stub/__alloc + local.set $4 + local.get $0 + local.get $1 + i32.shl + local.set $5 + local.get $5 + i32.const 0 + call $~lib/rt/stub/__alloc + local.set $6 + local.get $4 + local.get $6 + call $~lib/rt/stub/__retain + i32.store + local.get $4 + local.get $6 + i32.store offset=4 + local.get $4 + local.get $5 + i32.store offset=8 + local.get $4 + local.get $0 + i32.store offset=12 + local.get $3 + if + local.get $6 + local.get $3 + local.get $5 + call $~lib/memory/memory.copy + end + local.get $4 + ) + (func $~lib/array/Array#__unchecked_get (; 6 ;) (type $FUNCSIG$jii) (param $0 i32) (param $1 i32) (result i64) + local.get $0 + i32.load offset=4 + local.get $1 + i32.const 3 + i32.shl + i32.add + i64.load + ) + (func $~lib/array/Array#__get (; 7 ;) (type $FUNCSIG$jii) (param $0 i32) (param $1 i32) (result i64) + local.get $1 + local.get $0 + i32.load offset=8 + i32.const 3 + i32.shr_u + i32.ge_u + if + i32.const 48 + i32.const 104 + i32.const 109 + i32.const 61 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + call $~lib/array/Array#__unchecked_get + ) + (func $~lib/util/number/decimalCount32 (; 8 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.const 100000 + i32.lt_u + if + local.get $0 + i32.const 100 + i32.lt_u + if + i32.const 1 + i32.const 2 + local.get $0 + i32.const 10 + i32.lt_u + select + return + else + i32.const 4 + i32.const 5 + local.get $0 + i32.const 10000 + i32.lt_u + select + local.set $1 + i32.const 3 + local.get $1 + local.get $0 + i32.const 1000 + i32.lt_u + select + return + end + unreachable + else + local.get $0 + i32.const 10000000 + i32.lt_u + if + i32.const 6 + i32.const 7 + local.get $0 + i32.const 1000000 + i32.lt_u + select + return + else + i32.const 9 + i32.const 10 + local.get $0 + i32.const 1000000000 + i32.lt_u + select + local.set $1 + i32.const 8 + local.get $1 + local.get $0 + i32.const 100000000 + i32.lt_u + select + return + end + unreachable + end + unreachable + ) + (func $~lib/util/number/utoa32_lut (; 9 ;) (type $FUNCSIG$viii) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i64) + (local $9 i64) + i32.const 592 + i32.load offset=4 + local.set $3 + block $break|0 + loop $continue|0 + local.get $1 + i32.const 10000 + i32.ge_u + i32.eqz + br_if $break|0 + local.get $1 + i32.const 10000 + i32.div_u + local.set $4 + local.get $1 + i32.const 10000 + i32.rem_u + local.set $5 + local.get $4 + local.set $1 + local.get $5 + i32.const 100 + i32.div_u + local.set $6 + local.get $5 + i32.const 100 + i32.rem_u + local.set $7 + local.get $3 + local.get $6 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.set $8 + local.get $3 + local.get $7 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.set $9 + local.get $2 + i32.const 4 + i32.sub + local.set $2 + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $8 + local.get $9 + i64.const 32 + i64.shl + i64.or + i64.store + br $continue|0 + end + unreachable + end + local.get $1 + i32.const 100 + i32.ge_u + if + local.get $1 + i32.const 100 + i32.div_u + local.set $7 + local.get $1 + i32.const 100 + i32.rem_u + local.set $6 + local.get $7 + local.set $1 + local.get $2 + i32.const 2 + i32.sub + local.set $2 + local.get $3 + local.get $6 + i32.const 2 + i32.shl + i32.add + i32.load + local.set $5 + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $5 + i32.store + end + local.get $1 + i32.const 10 + i32.ge_u + if + local.get $2 + i32.const 2 + i32.sub + local.set $2 + local.get $3 + local.get $1 + i32.const 2 + i32.shl + i32.add + i32.load + local.set $5 + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $5 + i32.store + else + local.get $2 + i32.const 1 + i32.sub + local.set $2 + i32.const 48 + local.get $1 + i32.add + local.set $5 + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $5 + i32.store16 + end + ) + (func $~lib/util/number/decimalCount64 (; 10 ;) (type $FUNCSIG$ij) (param $0 i64) (result i32) + (local $1 i32) + local.get $0 + i64.const 1000000000000000 + i64.lt_u + if + local.get $0 + i64.const 1000000000000 + i64.lt_u + if + i32.const 11 + i32.const 12 + local.get $0 + i64.const 100000000000 + i64.lt_u + select + return + else + i32.const 14 + i32.const 15 + local.get $0 + i64.const 100000000000000 + i64.lt_u + select + local.set $1 + i32.const 13 + local.get $1 + local.get $0 + i64.const 10000000000000 + i64.lt_u + select + return + end + unreachable + else + local.get $0 + i64.const 100000000000000000 + i64.lt_u + if + i32.const 16 + i32.const 17 + local.get $0 + i64.const 10000000000000000 + i64.lt_u + select + return + else + i32.const 19 + i32.const 20 + local.get $0 + i64.const -8446744073709551616 + i64.lt_u + select + local.set $1 + i32.const 18 + local.get $1 + local.get $0 + i64.const 1000000000000000000 + i64.lt_u + select + return + end + unreachable + end + unreachable + ) + (func $~lib/util/number/utoa64_lut (; 11 ;) (type $FUNCSIG$viji) (param $0 i32) (param $1 i64) (param $2 i32) + (local $3 i32) + (local $4 i64) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i64) + (local $13 i64) + i32.const 592 + i32.load offset=4 + local.set $3 + block $break|0 + loop $continue|0 + local.get $1 + i64.const 100000000 + i64.ge_u + i32.eqz + br_if $break|0 + local.get $1 + i64.const 100000000 + i64.div_u + local.set $4 + local.get $1 + local.get $4 + i64.const 100000000 + i64.mul + i64.sub + i32.wrap_i64 + local.set $5 + local.get $4 + local.set $1 + local.get $5 + i32.const 10000 + i32.div_u + local.set $6 + local.get $5 + i32.const 10000 + i32.rem_u + local.set $7 + local.get $6 + i32.const 100 + i32.div_u + local.set $8 + local.get $6 + i32.const 100 + i32.rem_u + local.set $9 + local.get $7 + i32.const 100 + i32.div_u + local.set $10 + local.get $7 + i32.const 100 + i32.rem_u + local.set $11 + local.get $3 + local.get $10 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.set $12 + local.get $3 + local.get $11 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.set $13 + local.get $2 + i32.const 4 + i32.sub + local.set $2 + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $12 + local.get $13 + i64.const 32 + i64.shl + i64.or + i64.store + local.get $3 + local.get $8 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.set $12 + local.get $3 + local.get $9 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.set $13 + local.get $2 + i32.const 4 + i32.sub + local.set $2 + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $12 + local.get $13 + i64.const 32 + i64.shl + i64.or + i64.store + br $continue|0 + end + unreachable + end + local.get $0 + local.get $1 + i32.wrap_i64 + local.get $2 + call $~lib/util/number/utoa32_lut + ) + (func $~lib/util/number/utoa64 (; 12 ;) (type $FUNCSIG$ij) (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i64) + local.get $0 + i64.eqz + if + i32.const 152 + call $~lib/rt/stub/__retain + return + end + local.get $0 + i64.const 4294967295 + i64.le_u + if + local.get $0 + i32.wrap_i64 + local.set $2 + local.get $2 + call $~lib/util/number/decimalCount32 + local.set $3 + local.get $3 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/stub/__alloc + local.set $1 + local.get $1 + local.set $6 + local.get $2 + local.set $5 + local.get $3 + local.set $4 + local.get $6 + local.get $5 + local.get $4 + call $~lib/util/number/utoa32_lut + else + local.get $0 + call $~lib/util/number/decimalCount64 + local.set $3 + local.get $3 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/stub/__alloc + local.set $1 + local.get $1 + local.set $5 + local.get $0 + local.set $7 + local.get $3 + local.set $4 + local.get $5 + local.get $7 + local.get $4 + call $~lib/util/number/utoa64_lut + end + local.get $1 + call $~lib/rt/stub/__retain + ) + (func $~lib/util/number/itoa (; 13 ;) (type $FUNCSIG$ij) (param $0 i64) (result i32) + local.get $0 + call $~lib/util/number/utoa64 + return + ) + (func $~lib/rt/stub/__release (; 14 ;) (type $FUNCSIG$vi) (param $0 i32) + nop + ) + (func $~lib/number/U64#toString (; 15 ;) (type $FUNCSIG$ij) (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + call $~lib/util/number/itoa + local.tee $1 + call $~lib/rt/stub/__retain + local.set $2 + local.get $1 + call $~lib/rt/stub/__release + local.get $2 + ) + (func $resolve-access/arrayAccess (; 16 ;) (type $FUNCSIG$i) (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + i32.const 1 + i32.const 3 + i32.const 3 + i32.const 24 + call $~lib/rt/__allocArray + call $~lib/rt/stub/__retain + local.tee $1 + call $~lib/rt/stub/__retain + local.set $0 + local.get $0 + i32.const 0 + call $~lib/array/Array#__get + call $~lib/number/U64#toString + local.set $2 + local.get $1 + call $~lib/rt/stub/__release + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + ) + (func $resolve-access/Container#constructor (; 17 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.eqz + if + i32.const 8 + i32.const 6 + call $~lib/rt/stub/__alloc + call $~lib/rt/stub/__retain + local.set $0 + end + local.get $0 + i64.const 0 + i64.store + local.get $0 + ) + (func $resolve-access/fieldAccess (; 18 ;) (type $FUNCSIG$i) (result i32) + (local $0 i32) + (local $1 i32) + i32.const 0 + call $resolve-access/Container#constructor + local.set $0 + local.get $0 + i64.const 1 + i64.store + local.get $0 + i64.load + call $~lib/number/U64#toString + local.set $1 + local.get $0 + call $~lib/rt/stub/__release + local.get $1 + ) + (func $resolve-access/Container#toU32 (; 19 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i64.load + i32.wrap_i64 + ) + (func $~lib/util/number/utoa32 (; 20 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $0 + i32.eqz + if + i32.const 152 + call $~lib/rt/stub/__retain + return + end + local.get $0 + call $~lib/util/number/decimalCount32 + local.set $1 + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/stub/__alloc + local.set $2 + local.get $2 + local.set $5 + local.get $0 + local.set $4 + local.get $1 + local.set $3 + local.get $5 + local.get $4 + local.get $3 + call $~lib/util/number/utoa32_lut + local.get $2 + call $~lib/rt/stub/__retain + ) + (func $~lib/util/number/itoa (; 21 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + call $~lib/util/number/utoa32 + return + ) + (func $~lib/number/U32#toString (; 22 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + call $~lib/util/number/itoa + local.tee $1 + call $~lib/rt/stub/__retain + local.set $2 + local.get $1 + call $~lib/rt/stub/__release + local.get $2 + ) + (func $resolve-access/propertyAccess (; 23 ;) (type $FUNCSIG$i) (result i32) + (local $0 i32) + (local $1 i32) + i32.const 0 + call $resolve-access/Container#constructor + local.set $0 + local.get $0 + i64.const 1 + i64.store + local.get $0 + call $resolve-access/Container#toU32 + call $~lib/number/U32#toString + local.set $1 + local.get $0 + call $~lib/rt/stub/__release + local.get $1 + ) + (func $start (; 24 ;) (type $FUNCSIG$v) + global.get $~lib/heap/__heap_base + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + global.set $~lib/rt/stub/startOffset + global.get $~lib/rt/stub/startOffset + global.set $~lib/rt/stub/offset + ) + (func $null (; 25 ;) (type $FUNCSIG$v) + ) +)