diff --git a/src/compiler.ts b/src/compiler.ts index 91e219f18b..e937313480 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -5596,8 +5596,11 @@ export class Compiler extends DiagnosticEmitter { } return this.module.unreachable(); } - assert(indexedSet.signature.parameterTypes.length == 2); // parser must guarantee this - targetType = indexedSet.signature.parameterTypes[1]; // 2nd parameter is the element + let parameterTypes = indexedSet.signature.parameterTypes; + + assert(parameterTypes.length == 2); // parser must guarantee this + targetType = parameterTypes[1]; // 2nd parameter is the element + if (indexedSet.hasDecorator(DecoratorFlags.UNSAFE)) this.checkUnsafe(expression); if (!isUnchecked && this.options.pedantic) { this.pedantic( @@ -5788,7 +5791,19 @@ export class Compiler extends DiagnosticEmitter { thisType, Constraints.CONV_IMPLICIT | Constraints.IS_THIS ); - let elementExpr = this.compileExpression(assert(indexExpression), Type.i32, Constraints.CONV_IMPLICIT); + let setterIndexType = setterInstance.signature.parameterTypes[0]; + let getterIndexType = getterInstance.signature.parameterTypes[0]; + if (!setterIndexType.equals(getterIndexType)) { + this.errorRelated( + DiagnosticCode.Index_signature_accessors_in_type_0_differ_in_types, + getterInstance.identifierAndSignatureRange, + setterInstance.identifierAndSignatureRange, + classInstance.internalName, + ); + this.currentType = tee ? getterInstance.signature.returnType : Type.void; + return module.unreachable(); + } + let elementExpr = this.compileExpression(assert(indexExpression), setterIndexType, Constraints.CONV_IMPLICIT); let elementType = this.currentType; if (tee) { let tempTarget = flow.getTempLocal(thisType); diff --git a/src/diagnosticMessages.json b/src/diagnosticMessages.json index 12265ea713..99486b1396 100644 --- a/src/diagnosticMessages.json +++ b/src/diagnosticMessages.json @@ -48,6 +48,7 @@ "Expression does not compile to a value at runtime.": 234, "Only variables, functions and enums become WebAssembly module exports.": 235, "Literal '{0}' does not fit into 'i64' or 'u64' types.": 236, + "Index signature accessors in type '{0}' differ in types.": 237, "Importing the table disables some indirect call optimizations.": 901, "Exporting the table disables some indirect call optimizations.": 902, diff --git a/tests/compiler/std/operator-overloading.debug.wat b/tests/compiler/std/operator-overloading.debug.wat index 72015d7409..408e97f2de 100644 --- a/tests/compiler/std/operator-overloading.debug.wat +++ b/tests/compiler/std/operator-overloading.debug.wat @@ -3,11 +3,12 @@ (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_=>_none (func (param i32))) - (type $none_=>_none (func)) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) + (type $none_=>_none (func)) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $none_=>_i32 (func (result i32))) + (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -91,10 +92,11 @@ (global $std/operator-overloading/aii1 (mut i32) (i32.const 0)) (global $std/operator-overloading/aii2 (mut i32) (i32.const 0)) (global $std/operator-overloading/aii (mut i32) (i32.const 0)) - (global $~lib/rt/__rtti_base i32 (i32.const 496)) - (global $~lib/memory/__data_end i32 (i32.const 548)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 16932)) - (global $~lib/memory/__heap_base i32 (i32.const 16932)) + (global $std/operator-overloading/tea (mut i32) (i32.const 0)) + (global $~lib/rt/__rtti_base i32 (i32.const 560)) + (global $~lib/memory/__data_end i32 (i32.const 620)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17004)) + (global $~lib/memory/__heap_base i32 (i32.const 17004)) (memory $0 1) (data (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\01\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\01\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") @@ -105,7 +107,9 @@ (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\01\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) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\006\00\00\00s\00t\00d\00/\00o\00p\00e\00r\00a\00t\00o\00r\00-\00o\00v\00e\00r\00l\00o\00a\00d\00i\00n\00g\00.\00t\00s\00\00\00\00\00\00\00") - (data (i32.const 496) "\06\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\00\00\00\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00") + (data (i32.const 492) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00x\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 524) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00y\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 560) "\07\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\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\00") (table $0 1 1 funcref) (elem $0 (i32.const 1)) (export "memory" (memory $0)) @@ -2787,6 +2791,171 @@ local.get $1 i32.store $0 offset=4 ) + (func $std/operator-overloading/TesterElementAccess#set:x (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store $0 + ) + (func $std/operator-overloading/TesterElementAccess#set:y (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store $0 offset=4 + ) + (func $~lib/string/String#get:length (param $this i32) (result i32) + local.get $this + i32.const 20 + i32.sub + i32.load $0 offset=16 + i32.const 1 + i32.shr_u + ) + (func $~lib/util/string/compareImpl (param $str1 i32) (param $index1 i32) (param $str2 i32) (param $index2 i32) (param $len i32) (result i32) + (local $ptr1 i32) + (local $ptr2 i32) + (local $var$7 i32) + (local $a i32) + (local $b i32) + local.get $str1 + local.get $index1 + i32.const 1 + i32.shl + i32.add + local.set $ptr1 + local.get $str2 + local.get $index2 + i32.const 1 + i32.shl + i32.add + local.set $ptr2 + i32.const 0 + i32.const 2 + i32.lt_s + drop + local.get $len + i32.const 4 + i32.ge_u + if (result i32) + local.get $ptr1 + i32.const 7 + i32.and + local.get $ptr2 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $do-break|0 + loop $do-loop|0 + local.get $ptr1 + i64.load $0 + local.get $ptr2 + i64.load $0 + i64.ne + if + br $do-break|0 + end + local.get $ptr1 + i32.const 8 + i32.add + local.set $ptr1 + local.get $ptr2 + i32.const 8 + i32.add + local.set $ptr2 + local.get $len + i32.const 4 + i32.sub + local.set $len + local.get $len + i32.const 4 + i32.ge_u + br_if $do-loop|0 + end + end + end + loop $while-continue|1 + local.get $len + local.tee $var$7 + i32.const 1 + i32.sub + local.set $len + local.get $var$7 + local.set $var$7 + local.get $var$7 + if + local.get $ptr1 + i32.load16_u $0 + local.set $a + local.get $ptr2 + i32.load16_u $0 + local.set $b + local.get $a + local.get $b + i32.ne + if + local.get $a + local.get $b + i32.sub + return + end + local.get $ptr1 + i32.const 2 + i32.add + local.set $ptr1 + local.get $ptr2 + i32.const 2 + i32.add + local.set $ptr2 + br $while-continue|1 + end + end + i32.const 0 + ) + (func $~lib/string/String.__eq (param $left i32) (param $right i32) (result i32) + (local $leftLength i32) + local.get $left + local.get $right + i32.eq + if + i32.const 1 + return + end + local.get $left + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $right + i32.const 0 + i32.eq + end + if + i32.const 0 + return + end + local.get $left + call $~lib/string/String#get:length + local.set $leftLength + local.get $leftLength + local.get $right + call $~lib/string/String#get:length + i32.ne + if + i32.const 0 + return + end + local.get $left + i32.const 0 + local.get $right + i32.const 0 + local.get $leftLength + call $~lib/util/string/compareImpl + i32.eqz + ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) global.get $std/operator-overloading/a1 @@ -3202,6 +3371,13 @@ local.get $0 call $~lib/rt/itcms/__visit end + global.get $std/operator-overloading/tea + 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 @@ -3222,25 +3398,28 @@ ) (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) block $invalid - block $std/operator-overloading/TesterInlineInstance - block $std/operator-overloading/TesterInlineStatic - block $std/operator-overloading/Tester - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - local.get $0 - i32.const 8 - i32.sub - i32.load $0 - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $std/operator-overloading/Tester $std/operator-overloading/TesterInlineStatic $std/operator-overloading/TesterInlineInstance $invalid + block $std/operator-overloading/TesterElementAccess + block $std/operator-overloading/TesterInlineInstance + block $std/operator-overloading/TesterInlineStatic + block $std/operator-overloading/Tester + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load $0 + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $std/operator-overloading/Tester $std/operator-overloading/TesterInlineStatic $std/operator-overloading/TesterInlineInstance $std/operator-overloading/TesterElementAccess $invalid + end + return end return end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit return end - local.get $0 - local.get $1 - call $~lib/arraybuffer/ArrayBufferView~visit return end return @@ -3259,29 +3438,91 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 16960 - i32.const 17008 + i32.const 17024 + i32.const 17072 i32.const 1 i32.const 1 call $~lib/builtins/abort unreachable end ) + (func $std/operator-overloading/TesterElementAccess#__set (param $0 i32) (param $1 i32) (param $2 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 $1 + i32.const 512 + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store $0 + local.get $3 + call $~lib/string/String.__eq + if + local.get $0 + local.get $2 + call $std/operator-overloading/TesterElementAccess#set:x + else + local.get $0 + local.get $2 + call $std/operator-overloading/TesterElementAccess#set:y + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $std/operator-overloading/TesterElementAccess#__get (param $0 i32) (param $1 i32) (result 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 $1 + i32.const 512 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + call $~lib/string/String.__eq + if (result i32) + local.get $0 + i32.load $0 + else + local.get $0 + i32.load $0 offset=4 + end + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + ) (func $start:std/operator-overloading (local $0 i32) (local $1 i32) (local $2 i32) global.get $~lib/memory/__stack_pointer - i32.const 16 + i32.const 24 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 - i64.const 0 - i64.store $0 offset=8 + i32.const 0 + i32.const 24 + memory.fill $0 memory.size $0 i32.const 16 i32.shl @@ -4548,8 +4789,219 @@ call $~lib/builtins/abort unreachable end + i32.const 0 + i32.const 1 + i32.const 2 + call $std/operator-overloading/TesterElementAccess#constructor + global.set $std/operator-overloading/tea + global.get $std/operator-overloading/tea + local.set $2 global.get $~lib/memory/__stack_pointer - i32.const 16 + local.get $2 + i32.store $0 + local.get $2 + i32.const 512 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=4 + local.get $2 + i32.const -1 + call $std/operator-overloading/TesterElementAccess#__set + global.get $std/operator-overloading/tea + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + i32.const 544 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=4 + local.get $2 + i32.const -2 + call $std/operator-overloading/TesterElementAccess#__set + global.get $std/operator-overloading/tea + i32.load $0 + i32.const -1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 360 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $std/operator-overloading/tea + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + i32.const 512 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=4 + local.get $2 + call $std/operator-overloading/TesterElementAccess#__get + i32.const -1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 361 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $std/operator-overloading/tea + i32.load $0 offset=4 + i32.const -2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 363 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $std/operator-overloading/tea + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + i32.const 544 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=4 + local.get $2 + call $std/operator-overloading/TesterElementAccess#__get + i32.const -2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 364 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $std/operator-overloading/tea + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + i32.const 512 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=4 + local.get $2 + global.get $std/operator-overloading/tea + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=16 + local.get $2 + i32.const 512 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=20 + local.get $2 + call $std/operator-overloading/TesterElementAccess#__get + i32.const 1 + i32.add + call $std/operator-overloading/TesterElementAccess#__set + global.get $std/operator-overloading/tea + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + i32.const 544 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=4 + local.get $2 + global.get $std/operator-overloading/tea + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=16 + local.get $2 + i32.const 544 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=20 + local.get $2 + call $std/operator-overloading/TesterElementAccess#__get + i32.const 1 + i32.sub + call $std/operator-overloading/TesterElementAccess#__set + global.get $std/operator-overloading/tea + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + i32.const 512 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=4 + local.get $2 + call $std/operator-overloading/TesterElementAccess#__get + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 369 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $std/operator-overloading/tea + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 + local.get $2 + i32.const 544 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store $0 offset=4 + local.get $2 + call $std/operator-overloading/TesterElementAccess#__get + i32.const -3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 370 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 24 i32.add global.set $~lib/memory/__stack_pointer ) @@ -4655,4 +5107,38 @@ global.set $~lib/memory/__stack_pointer local.get $3 ) + (func $std/operator-overloading/TesterElementAccess#constructor (param $0 i32) (param $1 i32) (param $2 i32) (result 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 $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 6 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store $0 + end + local.get $0 + local.get $1 + call $std/operator-overloading/TesterElementAccess#set:x + local.get $0 + local.get $2 + call $std/operator-overloading/TesterElementAccess#set:y + local.get $0 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + ) ) diff --git a/tests/compiler/std/operator-overloading.release.wat b/tests/compiler/std/operator-overloading.release.wat index 449adc5794..70a34dbf2a 100644 --- a/tests/compiler/std/operator-overloading.release.wat +++ b/tests/compiler/std/operator-overloading.release.wat @@ -1,11 +1,11 @@ (module (type $none_=>_none (func)) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_=>_i32 (func (param i32) (result i32))) + (type $i32_i32_=>_none (func (param i32 i32))) + (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_none (func (param i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) - (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $none_=>_i32 (func (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) @@ -84,7 +84,8 @@ (global $std/operator-overloading/aii1 (mut i32) (i32.const 0)) (global $std/operator-overloading/aii2 (mut i32) (i32.const 0)) (global $std/operator-overloading/aii (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17956)) + (global $std/operator-overloading/tea (mut i32) (i32.const 0)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18028)) (memory $0 1) (data (i32.const 1036) "<") (data (i32.const 1048) "\01\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") @@ -98,8 +99,12 @@ (data (i32.const 1384) "\01\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) "L") (data (i32.const 1448) "\01\00\00\006\00\00\00s\00t\00d\00/\00o\00p\00e\00r\00a\00t\00o\00r\00-\00o\00v\00e\00r\00l\00o\00a\00d\00i\00n\00g\00.\00t\00s") - (data (i32.const 1520) "\06\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 1548) " \00\00\00\00\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 1516) "\1c") + (data (i32.const 1528) "\01\00\00\00\02\00\00\00x") + (data (i32.const 1548) "\1c") + (data (i32.const 1560) "\01\00\00\00\02\00\00\00y") + (data (i32.const 1584) "\07\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 1612) " \00\00\00\00\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00 ") (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/visitRoots @@ -675,10 +680,10 @@ if unreachable end - i32.const 17968 + i32.const 18032 i32.const 0 i32.store $0 - i32.const 19536 + i32.const 19600 i32.const 0 i32.store $0 loop $for-loop|0 @@ -689,7 +694,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 17968 + i32.const 18032 i32.add i32.const 0 i32.store $0 offset=4 @@ -707,7 +712,7 @@ i32.add i32.const 2 i32.shl - i32.const 17968 + i32.const 18032 i32.add i32.const 0 i32.store $0 offset=96 @@ -725,13 +730,13 @@ br $for-loop|0 end end - i32.const 17968 - i32.const 19540 + i32.const 18032 + i32.const 19604 memory.size $0 i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 17968 + i32.const 18032 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -816,7 +821,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 17956 + i32.const 18028 i32.lt_u if local.get $0 @@ -916,7 +921,7 @@ unreachable end local.get $0 - i32.const 17956 + i32.const 18028 i32.lt_u if local.get $0 @@ -939,7 +944,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 17956 + i32.const 18028 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1475,6 +1480,117 @@ end local.get $2 ) + (func $~lib/string/String.__eq (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $0 + i32.const 1536 + i32.eq + if + i32.const 1 + return + end + local.get $0 + i32.eqz + if + i32.const 0 + return + end + local.get $0 + i32.const 20 + i32.sub + i32.load $0 offset=16 + i32.const 1 + i32.shr_u + local.tee $2 + i32.const 1532 + i32.load $0 + i32.const 1 + i32.shr_u + i32.ne + if + i32.const 0 + return + end + i32.const 1536 + local.set $3 + local.get $0 + local.tee $1 + i32.const 7 + i32.and + i32.eqz + local.get $2 + local.tee $0 + i32.const 4 + i32.ge_u + i32.and + if + loop $do-loop|0 + local.get $1 + i64.load $0 + local.get $3 + i64.load $0 + i64.eq + if + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $0 + i32.const 4 + i32.sub + local.tee $0 + i32.const 4 + i32.ge_u + br_if $do-loop|0 + end + end + end + block $__inlined_func$~lib/util/string/compareImpl + loop $while-continue|1 + local.get $0 + local.tee $2 + i32.const 1 + i32.sub + local.set $0 + local.get $2 + if + local.get $1 + i32.load16_u $0 + local.tee $4 + local.get $3 + i32.load16_u $0 + local.tee $5 + i32.sub + local.set $2 + local.get $4 + local.get $5 + i32.ne + br_if $__inlined_func$~lib/util/string/compareImpl + local.get $1 + i32.const 2 + i32.add + local.set $1 + local.get $3 + i32.const 2 + i32.add + local.set $3 + br $while-continue|1 + end + end + i32.const 0 + local.set $2 + end + local.get $2 + i32.eqz + ) (func $~lib/rt/__visit_globals (local $0 i32) global.get $std/operator-overloading/a1 @@ -1831,6 +1947,12 @@ local.get $0 call $byn-split-outlined-A$~lib/rt/itcms/__visit end + global.get $std/operator-overloading/tea + 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 1056 @@ -1838,28 +1960,31 @@ ) (func $~lib/rt/__visit_members (param $0 i32) block $invalid - block $std/operator-overloading/TesterInlineInstance - block $std/operator-overloading/TesterInlineStatic - block $std/operator-overloading/Tester - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - local.get $0 - i32.const 8 - i32.sub - i32.load $0 - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $std/operator-overloading/Tester $std/operator-overloading/TesterInlineStatic $std/operator-overloading/TesterInlineInstance $invalid + block $std/operator-overloading/TesterElementAccess + block $std/operator-overloading/TesterInlineInstance + block $std/operator-overloading/TesterInlineStatic + block $std/operator-overloading/Tester + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load $0 + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $std/operator-overloading/Tester $std/operator-overloading/TesterInlineStatic $std/operator-overloading/TesterInlineInstance $std/operator-overloading/TesterElementAccess $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 + i32.load $0 + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + return end return end @@ -1874,1453 +1999,1732 @@ (func $~start call $start:std/operator-overloading ) - (func $start:std/operator-overloading - (local $0 i32) - (local $1 i32) + (func $std/operator-overloading/TesterElementAccess#__set (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) global.get $~lib/memory/__stack_pointer - i32.const 16 + i32.const 4 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1572 + i32.const 1644 i32.lt_s if - i32.const 17984 - i32.const 18032 + i32.const 18048 + i32.const 18096 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 - i64.const 0 - i64.store $0 offset=8 - memory.size $0 - i32.const 16 - i32.shl - i32.const 17956 - 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 + local.tee $3 + i32.const 0 i32.store $0 - i32.const 1344 - global.set $~lib/rt/itcms/fromSpace - i32.const 1 - i32.const 2 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/a1 - i32.const 2 - i32.const 3 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/a2 - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/a1 - local.tee $0 + local.get $3 + i32.const 1536 i32.store $0 - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/a2 - local.tee $1 - i32.store $0 offset=4 - local.get $0 - i32.load $0 - local.get $1 - i32.load $0 - i32.add - local.get $0 - i32.load $0 offset=4 local.get $1 - i32.load $0 offset=4 - i32.add - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/a - global.get $std/operator-overloading/a - i32.load $0 - i32.const 3 - i32.eq - if (result i32) - global.get $std/operator-overloading/a - i32.load $0 offset=4 - i32.const 5 - i32.eq + call $~lib/string/String.__eq + if + local.get $0 + local.get $2 + i32.store $0 else - i32.const 0 + local.get $0 + local.get $2 + i32.store $0 offset=4 end - i32.eqz + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $std/operator-overloading/TesterElementAccess#__get (param $0 i32) (param $1 i32) (result i32) + (local $2 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 1644 + i32.lt_s if - i32.const 0 - i32.const 1456 - i32.const 145 + i32.const 18048 + i32.const 18096 + i32.const 1 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 2 - i32.const 3 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/s1 - i32.const 2 - i32.const -3 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/s2 global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/s1 - local.tee $1 + local.tee $2 + i32.const 0 + i32.store $0 + local.get $2 + i32.const 1536 i32.store $0 - local.get $0 - global.get $std/operator-overloading/s2 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.sub local.get $1 - i32.load $0 offset=4 - local.get $0 - i32.load $0 offset=4 - i32.sub - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/s - global.get $std/operator-overloading/s - i32.load $0 + call $~lib/string/String.__eq if (result i32) - i32.const 0 + local.get $0 + i32.load $0 else - global.get $std/operator-overloading/s + local.get $0 i32.load $0 offset=4 - i32.const 6 - i32.eq - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 151 - i32.const 1 - call $~lib/builtins/abort - unreachable end - i32.const 2 - i32.const 5 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/m1 - i32.const 3 - i32.const 2 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/m2 + local.set $0 global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/m1 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/m2 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.mul - local.get $1 - i32.load $0 offset=4 + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer local.get $0 - i32.load $0 offset=4 - i32.mul - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/m - global.get $std/operator-overloading/m - i32.load $0 - i32.const 6 - i32.eq - if (result i32) - global.get $std/operator-overloading/m - i32.load $0 offset=4 - i32.const 10 - i32.eq - else - i32.const 0 - end - i32.eqz - if + ) + (func $start:std/operator-overloading + (local $0 i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 1644 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 1456 - i32.const 157 + i32.const 24 + memory.fill $0 + memory.size $0 + i32.const 16 + i32.shl + i32.const 18028 + i32.sub i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 6 - i32.const 50 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/d1 - i32.const 3 - i32.const 10 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/d2 - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/d1 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/d2 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.div_s - local.get $1 - i32.load $0 offset=4 - local.get $0 - i32.load $0 offset=4 - i32.div_s - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/d - global.get $std/operator-overloading/d - i32.load $0 - i32.const 2 - i32.eq - if (result i32) - global.get $std/operator-overloading/d + 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 + i32.const 1 + i32.const 2 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/a1 + i32.const 2 + i32.const 3 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/a2 + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/a1 + local.tee $0 + i32.store $0 + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/a2 + local.tee $1 + i32.store $0 offset=4 + local.get $0 + i32.load $0 + local.get $1 + i32.load $0 + i32.add + local.get $0 + i32.load $0 offset=4 + local.get $1 + i32.load $0 offset=4 + i32.add + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/a + global.get $std/operator-overloading/a + i32.load $0 + i32.const 3 + i32.eq + if (result i32) + global.get $std/operator-overloading/a + i32.load $0 offset=4 + i32.const 5 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 145 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2 + i32.const 3 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/s1 + i32.const 2 + i32.const -3 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/s2 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/s1 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/s2 + local.tee $0 + i32.store $0 offset=4 + local.get $1 + i32.load $0 + local.get $0 + i32.load $0 + i32.sub + local.get $1 i32.load $0 offset=4 + local.get $0 + i32.load $0 offset=4 + i32.sub + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/s + global.get $std/operator-overloading/s + i32.load $0 + if (result i32) + i32.const 0 + else + global.get $std/operator-overloading/s + i32.load $0 offset=4 + i32.const 6 + i32.eq + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 151 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2 i32.const 5 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/m1 + i32.const 3 + i32.const 2 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/m2 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/m1 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/m2 + local.tee $0 + i32.store $0 offset=4 + local.get $1 + i32.load $0 + local.get $0 + i32.load $0 + i32.mul + local.get $1 + i32.load $0 offset=4 + local.get $0 + i32.load $0 offset=4 + i32.mul + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/m + global.get $std/operator-overloading/m + i32.load $0 + i32.const 6 i32.eq - else - i32.const 0 - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 163 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 10 - i32.const 10 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/f1 - i32.const 6 - i32.const 10 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/f2 - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/f1 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/f2 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.rem_s - local.get $1 - i32.load $0 offset=4 - local.get $0 - i32.load $0 offset=4 - i32.rem_s - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/f - global.get $std/operator-overloading/f - i32.load $0 - i32.const 4 - i32.eq - if (result i32) - global.get $std/operator-overloading/f + if (result i32) + global.get $std/operator-overloading/m + i32.load $0 offset=4 + i32.const 10 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 157 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 6 + i32.const 50 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/d1 + i32.const 3 + i32.const 10 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/d2 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/d1 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/d2 + local.tee $0 + i32.store $0 offset=4 + local.get $1 + i32.load $0 + local.get $0 + i32.load $0 + i32.div_s + local.get $1 i32.load $0 offset=4 - else - i32.const 1 - end - if - i32.const 0 - i32.const 1456 - i32.const 169 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 2 - i32.const 3 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/p1 - i32.const 4 - i32.const 5 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/p2 - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/p1 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/p2 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - call $~lib/math/ipow32 - local.get $1 - i32.load $0 offset=4 - local.get $0 - i32.load $0 offset=4 - call $~lib/math/ipow32 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/p - global.get $std/operator-overloading/p - i32.load $0 - i32.const 16 - i32.eq - if (result i32) - global.get $std/operator-overloading/p + local.get $0 i32.load $0 offset=4 - i32.const 243 + i32.div_s + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/d + global.get $std/operator-overloading/d + i32.load $0 + i32.const 2 i32.eq - else - i32.const 0 - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 175 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 255 - i32.const 15 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/n1 - i32.const 15 - i32.const 255 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/n2 - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/n1 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/n2 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.and - local.get $1 - i32.load $0 offset=4 - local.get $0 - i32.load $0 offset=4 - i32.and - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/n - global.get $std/operator-overloading/n - i32.load $0 - i32.const 15 - i32.eq - if (result i32) - global.get $std/operator-overloading/n + if (result i32) + global.get $std/operator-overloading/d + i32.load $0 offset=4 + i32.const 5 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 163 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 10 + i32.const 10 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/f1 + i32.const 6 + i32.const 10 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/f2 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/f1 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/f2 + local.tee $0 + i32.store $0 offset=4 + local.get $1 + i32.load $0 + local.get $0 + i32.load $0 + i32.rem_s + local.get $1 i32.load $0 offset=4 - i32.const 15 + local.get $0 + i32.load $0 offset=4 + i32.rem_s + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/f + global.get $std/operator-overloading/f + i32.load $0 + i32.const 4 i32.eq - else - i32.const 0 - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 181 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 3855 - i32.const 255 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/o1 - i32.const 61680 - i32.const 0 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/o2 - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/o1 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/o2 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.or - local.get $1 - i32.load $0 offset=4 - local.get $0 - i32.load $0 offset=4 - i32.or - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/o - global.get $std/operator-overloading/o - i32.load $0 - i32.const 65535 - i32.eq - if (result i32) - global.get $std/operator-overloading/o + if (result i32) + global.get $std/operator-overloading/f + i32.load $0 offset=4 + else + i32.const 1 + end + if + i32.const 0 + i32.const 1456 + i32.const 169 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2 + i32.const 3 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/p1 + i32.const 4 + i32.const 5 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/p2 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/p1 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/p2 + local.tee $0 + i32.store $0 offset=4 + local.get $1 + i32.load $0 + local.get $0 + i32.load $0 + call $~lib/math/ipow32 + local.get $1 i32.load $0 offset=4 - i32.const 255 + local.get $0 + i32.load $0 offset=4 + call $~lib/math/ipow32 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/p + global.get $std/operator-overloading/p + i32.load $0 + i32.const 16 i32.eq - else - i32.const 0 - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 187 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 255 - i32.const 255 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/x1 - i32.const 65280 - i32.const 0 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/x2 - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/x1 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/x2 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.xor - local.get $1 - i32.load $0 offset=4 - local.get $0 - i32.load $0 offset=4 - i32.xor - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/x - global.get $std/operator-overloading/x - i32.load $0 - i32.const 65535 - i32.eq - if (result i32) - global.get $std/operator-overloading/x + if (result i32) + global.get $std/operator-overloading/p + i32.load $0 offset=4 + i32.const 243 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 175 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 255 + i32.const 15 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/n1 + i32.const 15 + i32.const 255 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/n2 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/n1 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/n2 + local.tee $0 + i32.store $0 offset=4 + local.get $1 + i32.load $0 + local.get $0 + i32.load $0 + i32.and + local.get $1 i32.load $0 offset=4 - i32.const 255 + local.get $0 + i32.load $0 offset=4 + i32.and + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/n + global.get $std/operator-overloading/n + i32.load $0 + i32.const 15 i32.eq - else - i32.const 0 - end - i32.eqz - if + if (result i32) + global.get $std/operator-overloading/n + i32.load $0 offset=4 + i32.const 15 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 181 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 3855 + i32.const 255 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/o1 + i32.const 61680 i32.const 0 - i32.const 1456 - i32.const 193 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1 - i32.const -2 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/eq1 - i32.const 1 - i32.const -2 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/eq2 - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/eq1 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/eq2 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.eq - if (result i32) + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/o2 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/o1 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/o2 + local.tee $0 + i32.store $0 offset=4 + local.get $1 + i32.load $0 + local.get $0 + i32.load $0 + i32.or local.get $1 i32.load $0 offset=4 local.get $0 i32.load $0 offset=4 + i32.or + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/o + global.get $std/operator-overloading/o + i32.load $0 + i32.const 65535 i32.eq - else - i32.const 0 - end - global.set $std/operator-overloading/eq - global.get $std/operator-overloading/eq - i32.const 1 - i32.ne - if + if (result i32) + global.get $std/operator-overloading/o + i32.load $0 offset=4 + i32.const 255 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 187 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 255 + i32.const 255 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/x1 + i32.const 65280 i32.const 0 - i32.const 1456 - i32.const 199 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1 - i32.const 0 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/eq3 - i32.const 0 - i32.const 1 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/eq4 - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/eq3 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/eq4 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.eq - if (result i32) + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/x2 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/x1 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/x2 + local.tee $0 + i32.store $0 offset=4 + local.get $1 + i32.load $0 + local.get $0 + i32.load $0 + i32.xor local.get $1 i32.load $0 offset=4 local.get $0 i32.load $0 offset=4 + i32.xor + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/x + global.get $std/operator-overloading/x + i32.load $0 + i32.const 65535 i32.eq - else - i32.const 0 - end - global.set $std/operator-overloading/eqf - global.get $std/operator-overloading/eqf - if - i32.const 0 - i32.const 1456 - i32.const 205 + if (result i32) + global.get $std/operator-overloading/x + i32.load $0 offset=4 + i32.const 255 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 193 + i32.const 1 + call $~lib/builtins/abort + unreachable + end i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/eq1 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/eq2 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.ne - if (result i32) + i32.const -2 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/eq1 + i32.const 1 + i32.const -2 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/eq2 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/eq1 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/eq2 + local.tee $0 + i32.store $0 offset=4 local.get $1 - i32.load $0 offset=4 + i32.load $0 local.get $0 - i32.load $0 offset=4 + i32.load $0 + i32.eq + if (result i32) + local.get $1 + i32.load $0 offset=4 + local.get $0 + i32.load $0 offset=4 + i32.eq + else + i32.const 0 + end + global.set $std/operator-overloading/eq + global.get $std/operator-overloading/eq + i32.const 1 i32.ne - else + if + i32.const 0 + i32.const 1456 + i32.const 199 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1 i32.const 0 - end - global.set $std/operator-overloading/eq - global.get $std/operator-overloading/eq - if + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/eq3 i32.const 0 - i32.const 1456 - i32.const 209 i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/eq3 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/eq4 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.ne - if (result i32) + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/eq4 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/eq3 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/eq4 + local.tee $0 + i32.store $0 offset=4 + local.get $1 + i32.load $0 + local.get $0 + i32.load $0 + i32.eq + if (result i32) + local.get $1 + i32.load $0 offset=4 + local.get $0 + i32.load $0 offset=4 + i32.eq + else + i32.const 0 + end + global.set $std/operator-overloading/eqf + global.get $std/operator-overloading/eqf + if + i32.const 0 + i32.const 1456 + i32.const 205 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/eq1 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/eq2 + local.tee $0 + i32.store $0 offset=4 + local.get $1 + i32.load $0 + local.get $0 + i32.load $0 + i32.ne + if (result i32) + local.get $1 + i32.load $0 offset=4 + local.get $0 + i32.load $0 offset=4 + i32.ne + else + i32.const 0 + end + global.set $std/operator-overloading/eq + global.get $std/operator-overloading/eq + if + i32.const 0 + i32.const 1456 + i32.const 209 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/eq3 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/eq4 + local.tee $0 + i32.store $0 offset=4 local.get $1 - i32.load $0 offset=4 + i32.load $0 local.get $0 - i32.load $0 offset=4 + i32.load $0 i32.ne - else - i32.const 0 - end - global.set $std/operator-overloading/eqf - global.get $std/operator-overloading/eqf - i32.const 1 - i32.ne - if - i32.const 0 - i32.const 1456 - i32.const 213 + if (result i32) + local.get $1 + i32.load $0 offset=4 + local.get $0 + i32.load $0 offset=4 + i32.ne + else + i32.const 0 + end + global.set $std/operator-overloading/eqf + global.get $std/operator-overloading/eqf i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 2 - i32.const 2147483647 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/gt1 - i32.const 1 - i32.const 0 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/gt2 - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/gt1 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/gt2 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.gt_s - if (result i32) + i32.ne + if + i32.const 0 + i32.const 1456 + i32.const 213 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2 + i32.const 2147483647 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/gt1 + i32.const 1 + i32.const 0 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/gt2 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/gt1 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/gt2 + local.tee $0 + i32.store $0 offset=4 local.get $1 - i32.load $0 offset=4 + i32.load $0 local.get $0 - i32.load $0 offset=4 + i32.load $0 i32.gt_s - else - i32.const 0 - end - global.set $std/operator-overloading/gt - global.get $std/operator-overloading/gt - i32.const 1 - i32.ne - if - i32.const 0 - i32.const 1456 - i32.const 219 + if (result i32) + local.get $1 + i32.load $0 offset=4 + local.get $0 + i32.load $0 offset=4 + i32.gt_s + else + i32.const 0 + end + global.set $std/operator-overloading/gt + global.get $std/operator-overloading/gt i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 2 - i32.const 2 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/gte1 - i32.const 2 - i32.const 2 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/gte2 - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/gte1 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/gte2 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.ge_s - if (result i32) + i32.ne + if + i32.const 0 + i32.const 1456 + i32.const 219 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2 + i32.const 2 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/gte1 + i32.const 2 + i32.const 2 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/gte2 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/gte1 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/gte2 + local.tee $0 + i32.store $0 offset=4 local.get $1 - i32.load $0 offset=4 + i32.load $0 local.get $0 - i32.load $0 offset=4 + i32.load $0 i32.ge_s - else - i32.const 0 - end - global.set $std/operator-overloading/gte - global.get $std/operator-overloading/gte - i32.const 1 - i32.ne - if - i32.const 0 - i32.const 1456 - i32.const 225 + if (result i32) + local.get $1 + i32.load $0 offset=4 + local.get $0 + i32.load $0 offset=4 + i32.ge_s + else + i32.const 0 + end + global.set $std/operator-overloading/gte + global.get $std/operator-overloading/gte i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 5 - i32.const -1 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/le1 - i32.const 6 - i32.const 6 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/le2 - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/le1 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/le2 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.lt_s - if (result i32) + i32.ne + if + i32.const 0 + i32.const 1456 + i32.const 225 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 5 + i32.const -1 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/le1 + i32.const 6 + i32.const 6 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/le2 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/le1 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/le2 + local.tee $0 + i32.store $0 offset=4 local.get $1 - i32.load $0 offset=4 + i32.load $0 local.get $0 - i32.load $0 offset=4 + i32.load $0 i32.lt_s - else - i32.const 0 - end - global.set $std/operator-overloading/le - global.get $std/operator-overloading/le - i32.const 1 - i32.ne - if - i32.const 0 - i32.const 1456 - i32.const 231 + if (result i32) + local.get $1 + i32.load $0 offset=4 + local.get $0 + i32.load $0 offset=4 + i32.lt_s + else + i32.const 0 + end + global.set $std/operator-overloading/le + global.get $std/operator-overloading/le i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 4 - i32.const 3 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/leq1 - i32.const 4 - i32.const 3 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/leq2 - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/leq1 - local.tee $1 - i32.store $0 - local.get $0 - global.get $std/operator-overloading/leq2 - local.tee $0 - i32.store $0 offset=4 - local.get $1 - i32.load $0 - local.get $0 - i32.load $0 - i32.le_s - if (result i32) + i32.ne + if + i32.const 0 + i32.const 1456 + i32.const 231 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 4 + i32.const 3 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/leq1 + i32.const 4 + i32.const 3 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/leq2 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/leq1 + local.tee $1 + i32.store $0 + local.get $0 + global.get $std/operator-overloading/leq2 + local.tee $0 + i32.store $0 offset=4 local.get $1 - i32.load $0 offset=4 + i32.load $0 + local.get $0 + i32.load $0 + i32.le_s + if (result i32) + local.get $1 + i32.load $0 offset=4 + local.get $0 + i32.load $0 offset=4 + i32.le_s + else + i32.const 0 + end + global.set $std/operator-overloading/leq + global.get $std/operator-overloading/leq + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 1456 + i32.const 237 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 8 + i32.const 16 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/shr + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/shr + local.tee $0 + i32.store $0 + local.get $0 + i32.load $0 + i32.const 3 + i32.shr_s local.get $0 i32.load $0 offset=4 - i32.le_s - else - i32.const 0 - end - global.set $std/operator-overloading/leq - global.get $std/operator-overloading/leq - i32.const 1 - i32.ne - if - i32.const 0 - i32.const 1456 - i32.const 237 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 8 - i32.const 16 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/shr - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/shr - local.tee $0 - i32.store $0 - local.get $0 - i32.load $0 - i32.const 3 - i32.shr_s - local.get $0 - i32.load $0 offset=4 - i32.const 3 - i32.shr_s - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/sres - global.get $std/operator-overloading/sres - i32.load $0 - i32.const 1 - i32.eq - if (result i32) + i32.const 3 + i32.shr_s + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/sres global.get $std/operator-overloading/sres - i32.load $0 offset=4 - i32.const 2 - i32.eq - else - i32.const 0 - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 242 + i32.load $0 i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const -8 - i32.const -16 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/shu - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/shu - local.tee $0 - i32.store $0 - local.get $0 - i32.load $0 - i32.const 3 - i32.shr_u - local.get $0 - i32.load $0 offset=4 - i32.const 3 - i32.shr_u - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/ures - global.get $std/operator-overloading/ures - i32.load $0 - i32.const 536870911 - i32.eq - if (result i32) - global.get $std/operator-overloading/ures + i32.eq + if (result i32) + global.get $std/operator-overloading/sres + i32.load $0 offset=4 + i32.const 2 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 242 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const -8 + i32.const -16 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/shu + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/shu + local.tee $0 + i32.store $0 + local.get $0 + i32.load $0 + i32.const 3 + i32.shr_u + local.get $0 i32.load $0 offset=4 - i32.const 536870910 + i32.const 3 + i32.shr_u + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/ures + global.get $std/operator-overloading/ures + i32.load $0 + i32.const 536870911 i32.eq - else - i32.const 0 - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 247 + if (result i32) + global.get $std/operator-overloading/ures + i32.load $0 offset=4 + i32.const 536870910 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 247 + i32.const 1 + call $~lib/builtins/abort + unreachable + end i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1 - i32.const 2 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/shl - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/shl - local.tee $0 - i32.store $0 - local.get $0 - i32.load $0 - i32.const 3 - i32.shl - local.get $0 - i32.load $0 offset=4 - i32.const 3 - i32.shl - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/sres - global.get $std/operator-overloading/sres - i32.load $0 - i32.const 8 - i32.eq - if (result i32) - global.get $std/operator-overloading/sres + i32.const 2 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/shl + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/shl + local.tee $0 + i32.store $0 + local.get $0 + i32.load $0 + i32.const 3 + i32.shl + local.get $0 i32.load $0 offset=4 - i32.const 16 + i32.const 3 + i32.shl + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/sres + global.get $std/operator-overloading/sres + i32.load $0 + i32.const 8 i32.eq - else - i32.const 0 - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 252 + if (result i32) + global.get $std/operator-overloading/sres + i32.load $0 offset=4 + i32.const 16 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 252 + i32.const 1 + call $~lib/builtins/abort + unreachable + end i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1 - i32.const -2 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/pos - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/pos - local.tee $0 - i32.store $0 - local.get $0 - i32.load $0 - local.get $0 - i32.load $0 offset=4 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/pres - global.get $std/operator-overloading/pres - i32.load $0 - global.get $std/operator-overloading/pos - i32.load $0 - i32.eq - if (result i32) - global.get $std/operator-overloading/pres - i32.load $0 offset=4 + i32.const -2 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/pos + global.get $~lib/memory/__stack_pointer global.get $std/operator-overloading/pos + local.tee $0 + i32.store $0 + local.get $0 + i32.load $0 + local.get $0 i32.load $0 offset=4 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/pres + global.get $std/operator-overloading/pres + i32.load $0 + global.get $std/operator-overloading/pos + i32.load $0 i32.eq - else - i32.const 0 - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 257 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const -1 - i32.const -2 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/neg - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/neg - local.tee $0 - i32.store $0 - i32.const 0 - local.get $0 - i32.load $0 - i32.sub - i32.const 0 - local.get $0 - i32.load $0 offset=4 - i32.sub - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/nres - global.get $std/operator-overloading/nres - i32.load $0 - i32.const 0 - global.get $std/operator-overloading/neg - i32.load $0 - i32.sub - i32.eq - if (result i32) - global.get $std/operator-overloading/nres + if (result i32) + global.get $std/operator-overloading/pres + i32.load $0 offset=4 + global.get $std/operator-overloading/pos + i32.load $0 offset=4 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 257 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const -1 + i32.const -2 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/neg + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/neg + local.tee $0 + i32.store $0 + i32.const 0 + local.get $0 + i32.load $0 + i32.sub + i32.const 0 + local.get $0 i32.load $0 offset=4 + i32.sub + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/nres + global.get $std/operator-overloading/nres + i32.load $0 i32.const 0 global.get $std/operator-overloading/neg - i32.load $0 offset=4 + i32.load $0 i32.sub i32.eq - else - i32.const 0 - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 262 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 255 - i32.const 16 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/not - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/not - local.tee $0 - i32.store $0 - local.get $0 - i32.load $0 - i32.const -1 - i32.xor - local.get $0 - i32.load $0 offset=4 - i32.const -1 - i32.xor - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/res - global.get $std/operator-overloading/res - i32.load $0 - global.get $std/operator-overloading/not - i32.load $0 - i32.const -1 - i32.xor - i32.eq - if (result i32) - global.get $std/operator-overloading/res - i32.load $0 offset=4 + if (result i32) + global.get $std/operator-overloading/nres + i32.load $0 offset=4 + i32.const 0 + global.get $std/operator-overloading/neg + i32.load $0 offset=4 + i32.sub + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 262 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 255 + i32.const 16 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/not + global.get $~lib/memory/__stack_pointer global.get $std/operator-overloading/not + local.tee $0 + i32.store $0 + local.get $0 + i32.load $0 + i32.const -1 + i32.xor + local.get $0 i32.load $0 offset=4 i32.const -1 i32.xor + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/res + global.get $std/operator-overloading/res + i32.load $0 + global.get $std/operator-overloading/not + i32.load $0 + i32.const -1 + i32.xor i32.eq - else + if (result i32) + global.get $std/operator-overloading/res + i32.load $0 offset=4 + global.get $std/operator-overloading/not + i32.load $0 offset=4 + i32.const -1 + i32.xor + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 267 + i32.const 1 + call $~lib/builtins/abort + unreachable + end i32.const 0 - end - i32.eqz - if i32.const 0 - i32.const 1456 - i32.const 267 + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/excl + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/excl + local.tee $0 + i32.store $0 + local.get $0 + i32.load $0 + if (result i32) + i32.const 1 + else + local.get $0 + i32.load $0 offset=4 + end + i32.eqz + global.set $std/operator-overloading/bres + global.get $std/operator-overloading/bres + global.get $std/operator-overloading/excl + i32.load $0 + if (result i32) + i32.const 1 + else + global.get $std/operator-overloading/excl + i32.load $0 offset=4 + end + i32.eqz + i32.ne + if + i32.const 0 + i32.const 1456 + i32.const 272 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $std/operator-overloading/bres i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 0 - i32.const 0 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/excl - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/excl - local.tee $0 - i32.store $0 - local.get $0 - i32.load $0 - if (result i32) + i32.ne + if + i32.const 0 + i32.const 1456 + i32.const 273 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 i32.const 1 - else + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/incdec + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/incdec + local.tee $0 + i32.store $0 local.get $0 - i32.load $0 offset=4 - end - i32.eqz - global.set $std/operator-overloading/bres - global.get $std/operator-overloading/bres - global.get $std/operator-overloading/excl - i32.load $0 - if (result i32) + local.get $0 + i32.load $0 i32.const 1 - else - global.get $std/operator-overloading/excl + i32.add + i32.store $0 + local.get $0 + local.get $0 i32.load $0 offset=4 - end - i32.eqz - i32.ne - if - i32.const 0 - i32.const 1456 - i32.const 272 i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $std/operator-overloading/bres - i32.const 1 - i32.ne - if - i32.const 0 - i32.const 1456 - i32.const 273 + i32.add + i32.store $0 offset=4 + local.get $0 + global.set $std/operator-overloading/incdec + global.get $std/operator-overloading/incdec + i32.load $0 i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 0 - i32.const 1 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/incdec - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/incdec - local.tee $0 - i32.store $0 - local.get $0 - local.get $0 - i32.load $0 - i32.const 1 - i32.add - i32.store $0 - local.get $0 - local.get $0 - i32.load $0 offset=4 - i32.const 1 - i32.add - i32.store $0 offset=4 - local.get $0 - global.set $std/operator-overloading/incdec - global.get $std/operator-overloading/incdec - i32.load $0 - i32.const 1 - i32.eq - if (result i32) + i32.eq + if (result i32) + global.get $std/operator-overloading/incdec + i32.load $0 offset=4 + i32.const 2 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 279 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer global.get $std/operator-overloading/incdec + local.tee $0 + i32.store $0 + local.get $0 + local.get $0 + i32.load $0 + i32.const 1 + i32.sub + i32.store $0 + local.get $0 + local.get $0 i32.load $0 offset=4 - i32.const 2 - i32.eq - else - i32.const 0 - end - i32.eqz - if + i32.const 1 + i32.sub + i32.store $0 offset=4 + local.get $0 + global.set $std/operator-overloading/incdec + global.get $std/operator-overloading/incdec + i32.load $0 + if (result i32) + i32.const 0 + else + global.get $std/operator-overloading/incdec + i32.load $0 offset=4 + i32.const 1 + i32.eq + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 282 + i32.const 1 + call $~lib/builtins/abort + unreachable + end i32.const 0 - i32.const 1456 - i32.const 279 i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/incdec - local.tee $0 - i32.store $0 - local.get $0 - local.get $0 - i32.load $0 - i32.const 1 - i32.sub - i32.store $0 - local.get $0 - local.get $0 - i32.load $0 offset=4 - i32.const 1 - i32.sub - i32.store $0 offset=4 - local.get $0 - global.set $std/operator-overloading/incdec - global.get $std/operator-overloading/incdec - i32.load $0 - if (result i32) - i32.const 0 - else + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/incdec + global.get $~lib/memory/__stack_pointer global.get $std/operator-overloading/incdec + local.tee $0 + i32.store $0 offset=8 + local.get $0 + i32.load $0 + i32.const 1 + i32.add + local.get $0 i32.load $0 offset=4 i32.const 1 + i32.add + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/incdec + local.get $0 + global.set $std/operator-overloading/tmp + global.get $std/operator-overloading/tmp + i32.load $0 + if (result i32) + i32.const 0 + else + global.get $std/operator-overloading/tmp + i32.load $0 offset=4 + i32.const 1 + i32.eq + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 287 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $std/operator-overloading/incdec + i32.load $0 + i32.const 1 i32.eq - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 282 + if (result i32) + global.get $std/operator-overloading/incdec + i32.load $0 offset=4 + i32.const 2 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 288 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/incdec + local.tee $0 + i32.store $0 offset=8 + local.get $0 + i32.load $0 i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 0 - i32.const 1 - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/incdec - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/incdec - local.tee $0 - i32.store $0 offset=8 - local.get $0 - i32.load $0 - i32.const 1 - i32.add - local.get $0 - i32.load $0 offset=4 - i32.const 1 - i32.add - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/incdec - local.get $0 - global.set $std/operator-overloading/tmp - global.get $std/operator-overloading/tmp - i32.load $0 - if (result i32) - i32.const 0 - else - global.get $std/operator-overloading/tmp + i32.sub + local.get $0 i32.load $0 offset=4 i32.const 1 - i32.eq - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 287 + i32.sub + call $std/operator-overloading/Tester#constructor + global.set $std/operator-overloading/incdec + local.get $0 + global.set $std/operator-overloading/tmp + global.get $std/operator-overloading/tmp + i32.load $0 i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $std/operator-overloading/incdec - i32.load $0 - i32.const 1 - i32.eq - if (result i32) + i32.eq + if (result i32) + global.get $std/operator-overloading/tmp + i32.load $0 offset=4 + i32.const 2 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 291 + i32.const 1 + call $~lib/builtins/abort + unreachable + end global.get $std/operator-overloading/incdec - i32.load $0 offset=4 + i32.load $0 + if (result i32) + i32.const 0 + else + global.get $std/operator-overloading/incdec + i32.load $0 offset=4 + i32.const 1 + i32.eq + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 292 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1 i32.const 2 - i32.eq - else - i32.const 0 - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 288 + call $std/operator-overloading/TesterInlineStatic#constructor + global.set $std/operator-overloading/ais1 + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/ais1 + local.tee $1 + i32.store $0 + local.get $0 + local.get $1 + i32.store $0 offset=8 + local.get $1 + i32.load $0 i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/incdec - local.tee $0 - i32.store $0 offset=8 - local.get $0 - i32.load $0 - i32.const 1 - i32.sub - local.get $0 - i32.load $0 offset=4 - i32.const 1 - i32.sub - call $std/operator-overloading/Tester#constructor - global.set $std/operator-overloading/incdec - local.get $0 - global.set $std/operator-overloading/tmp - global.get $std/operator-overloading/tmp - i32.load $0 - i32.const 1 - i32.eq - if (result i32) - global.get $std/operator-overloading/tmp + i32.add + local.get $1 i32.load $0 offset=4 + i32.const 1 + i32.add + call $std/operator-overloading/TesterInlineStatic#constructor + global.set $std/operator-overloading/ais1 i32.const 2 + i32.const 3 + call $std/operator-overloading/TesterInlineStatic#constructor + global.set $std/operator-overloading/ais2 + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/ais1 + local.tee $0 + i32.store $0 offset=12 + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/ais2 + local.tee $1 + i32.store $0 offset=8 + local.get $0 + i32.load $0 + local.get $1 + i32.load $0 + i32.add + local.get $0 + i32.load $0 offset=4 + local.get $1 + i32.load $0 offset=4 + i32.add + call $std/operator-overloading/TesterInlineStatic#constructor + global.set $std/operator-overloading/ais + global.get $std/operator-overloading/ais + i32.load $0 + i32.const 4 i32.eq - else - i32.const 0 - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 291 + if (result i32) + global.get $std/operator-overloading/ais + i32.load $0 offset=4 + i32.const 6 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 312 + i32.const 1 + call $~lib/builtins/abort + unreachable + end i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $std/operator-overloading/incdec - i32.load $0 - if (result i32) - i32.const 0 - else - global.get $std/operator-overloading/incdec + i32.const 2 + call $std/operator-overloading/TesterInlineInstance#constructor + global.set $std/operator-overloading/aii1 + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/aii1 + local.tee $0 + i32.store $0 offset=8 + local.get $0 + i32.load $0 + i32.const 1 + i32.add + local.get $0 + i32.load $0 offset=4 + i32.const 1 + i32.add + call $std/operator-overloading/TesterInlineInstance#constructor + global.set $std/operator-overloading/aii1 + i32.const 2 + i32.const 3 + call $std/operator-overloading/TesterInlineInstance#constructor + global.set $std/operator-overloading/aii2 + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/aii1 + local.tee $0 + i32.store $0 offset=8 + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/aii2 + local.tee $1 + i32.store $0 offset=12 + local.get $0 + i32.load $0 + local.get $1 + i32.load $0 + i32.add + local.get $0 i32.load $0 offset=4 - i32.const 1 + local.get $1 + i32.load $0 offset=4 + i32.add + call $std/operator-overloading/TesterInlineInstance#constructor + global.set $std/operator-overloading/aii + global.get $std/operator-overloading/aii + i32.load $0 + i32.const 4 i32.eq - end - i32.eqz - if + if (result i32) + global.get $std/operator-overloading/aii + i32.load $0 offset=4 + i32.const 6 + i32.eq + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 332 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + 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 1644 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $0 i32.const 0 - i32.const 1456 - i32.const 292 + i32.store $0 + local.get $0 + i32.const 6 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store $0 + local.get $0 i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1 - i32.const 2 - call $std/operator-overloading/TesterInlineStatic#constructor - global.set $std/operator-overloading/ais1 - global.get $~lib/memory/__stack_pointer - local.tee $0 - global.get $std/operator-overloading/ais1 - local.tee $1 - i32.store $0 - local.get $0 - local.get $1 - i32.store $0 offset=8 - local.get $1 - i32.load $0 - i32.const 1 - i32.add - local.get $1 - i32.load $0 offset=4 - i32.const 1 - i32.add - call $std/operator-overloading/TesterInlineStatic#constructor - global.set $std/operator-overloading/ais1 - i32.const 2 - i32.const 3 - call $std/operator-overloading/TesterInlineStatic#constructor - global.set $std/operator-overloading/ais2 - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/ais1 - local.tee $0 - i32.store $0 offset=12 - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/ais2 - local.tee $1 - i32.store $0 offset=8 - local.get $0 - i32.load $0 - local.get $1 - i32.load $0 - i32.add - local.get $0 - i32.load $0 offset=4 - local.get $1 - i32.load $0 offset=4 - i32.add - call $std/operator-overloading/TesterInlineStatic#constructor - global.set $std/operator-overloading/ais - global.get $std/operator-overloading/ais - i32.load $0 - i32.const 4 - i32.eq - if (result i32) - global.get $std/operator-overloading/ais + i32.store $0 + local.get $0 + i32.const 2 + i32.store $0 offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + global.set $std/operator-overloading/tea + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/tea + local.tee $0 + i32.store $0 + global.get $~lib/memory/__stack_pointer + i32.const 1536 + i32.store $0 offset=4 + local.get $0 + i32.const 1536 + i32.const -1 + call $std/operator-overloading/TesterElementAccess#__set + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/tea + local.tee $0 + i32.store $0 + global.get $~lib/memory/__stack_pointer + i32.const 1568 + i32.store $0 offset=4 + local.get $0 + i32.const 1568 + i32.const -2 + call $std/operator-overloading/TesterElementAccess#__set + global.get $std/operator-overloading/tea + i32.load $0 + i32.const -1 + i32.ne + if + i32.const 0 + i32.const 1456 + i32.const 360 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/tea + local.tee $1 + i32.store $0 + local.get $0 + i32.const 1536 + i32.store $0 offset=4 + local.get $1 + i32.const 1536 + call $std/operator-overloading/TesterElementAccess#__get + i32.const -1 + i32.ne + if + i32.const 0 + i32.const 1456 + i32.const 361 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $std/operator-overloading/tea i32.load $0 offset=4 - i32.const 6 - i32.eq - else - i32.const 0 - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 312 + i32.const -2 + i32.ne + if + i32.const 0 + i32.const 1456 + i32.const 363 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/tea + local.tee $1 + i32.store $0 + local.get $0 + i32.const 1568 + i32.store $0 offset=4 + local.get $1 + i32.const 1568 + call $std/operator-overloading/TesterElementAccess#__get + i32.const -2 + i32.ne + if + i32.const 0 + i32.const 1456 + i32.const 364 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/tea + local.tee $1 + i32.store $0 + local.get $0 + i32.const 1536 + i32.store $0 offset=4 + local.get $0 + local.get $1 + i32.store $0 offset=16 + local.get $0 + i32.const 1536 + i32.store $0 offset=20 + local.get $1 + i32.const 1536 + local.get $1 + i32.const 1536 + call $std/operator-overloading/TesterElementAccess#__get i32.const 1 - call $~lib/builtins/abort - unreachable + i32.add + call $std/operator-overloading/TesterElementAccess#__set + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/tea + local.tee $0 + i32.store $0 + global.get $~lib/memory/__stack_pointer + i32.const 1568 + i32.store $0 offset=4 + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/tea + local.tee $1 + i32.store $0 offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 1568 + i32.store $0 offset=20 + local.get $0 + i32.const 1568 + local.get $1 + i32.const 1568 + call $std/operator-overloading/TesterElementAccess#__get + i32.const 1 + i32.sub + call $std/operator-overloading/TesterElementAccess#__set + global.get $~lib/memory/__stack_pointer + global.get $std/operator-overloading/tea + local.tee $0 + i32.store $0 + global.get $~lib/memory/__stack_pointer + i32.const 1536 + i32.store $0 offset=4 + local.get $0 + i32.const 1536 + call $std/operator-overloading/TesterElementAccess#__get + if + i32.const 0 + i32.const 1456 + i32.const 369 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $std/operator-overloading/tea + local.tee $1 + i32.store $0 + local.get $0 + i32.const 1568 + i32.store $0 offset=4 + local.get $1 + i32.const 1568 + call $std/operator-overloading/TesterElementAccess#__get + i32.const -3 + i32.ne + if + i32.const 0 + i32.const 1456 + i32.const 370 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.add + global.set $~lib/memory/__stack_pointer + return end + i32.const 18048 + i32.const 18096 i32.const 1 - i32.const 2 - call $std/operator-overloading/TesterInlineInstance#constructor - global.set $std/operator-overloading/aii1 - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/aii1 - local.tee $0 - i32.store $0 offset=8 - local.get $0 - i32.load $0 - i32.const 1 - i32.add - local.get $0 - i32.load $0 offset=4 i32.const 1 - i32.add - call $std/operator-overloading/TesterInlineInstance#constructor - global.set $std/operator-overloading/aii1 - i32.const 2 - i32.const 3 - call $std/operator-overloading/TesterInlineInstance#constructor - global.set $std/operator-overloading/aii2 - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/aii1 - local.tee $0 - i32.store $0 offset=8 - global.get $~lib/memory/__stack_pointer - global.get $std/operator-overloading/aii2 - local.tee $1 - i32.store $0 offset=12 - local.get $0 - i32.load $0 - local.get $1 - i32.load $0 - i32.add - local.get $0 - i32.load $0 offset=4 - local.get $1 - i32.load $0 offset=4 - i32.add - call $std/operator-overloading/TesterInlineInstance#constructor - global.set $std/operator-overloading/aii - global.get $std/operator-overloading/aii - i32.load $0 - i32.const 4 - i32.eq - if (result i32) - global.get $std/operator-overloading/aii - i32.load $0 offset=4 - i32.const 6 - i32.eq - else - i32.const 0 - end - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 332 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 16 - i32.add - global.set $~lib/memory/__stack_pointer + call $~lib/builtins/abort + unreachable ) (func $std/operator-overloading/Tester#constructor (param $0 i32) (param $1 i32) (result i32) (local $2 i32) @@ -3329,11 +3733,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1572 + i32.const 1644 i32.lt_s if - i32.const 17984 - i32.const 18032 + i32.const 18048 + i32.const 18096 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3367,11 +3771,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1572 + i32.const 1644 i32.lt_s if - i32.const 17984 - i32.const 18032 + i32.const 18048 + i32.const 18096 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3405,11 +3809,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1572 + i32.const 1644 i32.lt_s if - i32.const 17984 - i32.const 18032 + i32.const 18048 + i32.const 18096 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3479,7 +3883,7 @@ if i32.const 0 local.get $1 - i32.const 17956 + i32.const 18028 i32.lt_u local.get $1 i32.load $0 offset=8 @@ -3530,7 +3934,7 @@ i32.const 1 else local.get $0 - i32.const 1520 + i32.const 1584 i32.load $0 i32.gt_u if @@ -3544,7 +3948,7 @@ local.get $0 i32.const 3 i32.shl - i32.const 1524 + i32.const 1588 i32.add i32.load $0 i32.const 32 diff --git a/tests/compiler/std/operator-overloading.ts b/tests/compiler/std/operator-overloading.ts index 314f5cc9fa..8dbb881d52 100644 --- a/tests/compiler/std/operator-overloading.ts +++ b/tests/compiler/std/operator-overloading.ts @@ -330,3 +330,41 @@ aii1++; // 2, 3 var aii2 = new TesterInlineInstance(2, 3); var aii = aii1 + aii2; assert(aii.x == 4 && aii.y == 6); + +// test custom element access overloading with string keys +class TesterElementAccess { + [key: string]: number; + constructor( + public x: i32, + public y: i32 + ) {} + @operator("[]") + __get(key: string): i32 { + return key == "x" + ? this.x + : this.y; + } + @operator("[]=") + __set(key: string, value: i32): void { + key == "x" + ? this.x = value + : this.y = value; + } +} + +var tea = new TesterElementAccess(1, 2); + +tea["x"] = -1; +tea["y"] = -2; + +assert(tea.x == -1); +assert(tea["x"] == -1); + +assert(tea.y == -2); +assert(tea["y"] == -2); + +tea["x"]++; +--tea["y"]; + +assert(tea["x"] == 0); +assert(tea["y"] == -3);