diff --git a/src/compiler.ts b/src/compiler.ts index c9aecb7889..6c012542c2 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8081,6 +8081,7 @@ export class Compiler extends DiagnosticEmitter { ); // Try to eliminate unnecesssary branches if the condition is constant + // FIXME: skips common denominator, inconsistently picking left type if ( getExpressionId(condExpr) == ExpressionId.Const && getExpressionType(condExpr) == NativeType.I32 diff --git a/src/resolver.ts b/src/resolver.ts index 6e335c9093..bcea493684 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -1025,6 +1025,11 @@ export class Resolver extends DiagnosticEmitter { ): Type | null { var element = this.lookupIdentifierExpression(node, ctxFlow, ctxElement, reportMode); if (!element) return null; + if (element.kind == ElementKind.FUNCTION_PROTOTYPE) { + let instance = this.resolveFunction(element, null, makeMap(), reportMode); + if (!instance) return null; + element = instance; + } var type = this.getTypeOfElement(element); if (!type) { if (reportMode == ReportMode.REPORT) { diff --git a/tests/compiler/resolve-ternary.optimized.wat b/tests/compiler/resolve-ternary.optimized.wat new file mode 100644 index 0000000000..0672841651 --- /dev/null +++ b/tests/compiler/resolve-ternary.optimized.wat @@ -0,0 +1,3320 @@ +(module + (type $FUNCSIG$iii (func (param i32 i32) (result i32))) + (type $FUNCSIG$v (func)) + (type $FUNCSIG$iiii (func (param i32 i32 i32) (result i32))) + (type $FUNCSIG$viiii (func (param i32 i32 i32 i32))) + (type $FUNCSIG$vii (func (param i32 i32))) + (type $FUNCSIG$ii (func (param i32) (result i32))) + (type $FUNCSIG$viii (func (param i32 i32 i32))) + (type $FUNCSIG$vi (func (param i32))) + (type $FUNCSIG$id (func (param f64) (result i32))) + (type $FUNCSIG$iid (func (param i32 f64) (result i32))) + (type $FUNCSIG$iijijiji (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (memory $0 1) + (data (i32.const 8) "\1e\00\00\00\01\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") + (data (i32.const 56) "(\00\00\00\01\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") + (data (i32.const 112) "\1e\00\00\00\01\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00p\00u\00r\00e\00.\00t\00s") + (data (i32.const 160) "$\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 216) "\14\00\00\00\01\00\00\00\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") + (data (i32.const 256) "\02\00\00\00\01\00\00\00\01\00\00\00\02\00\00\000") + (data (i32.const 280) "\02\00\00\00\01\00\00\00\01\00\00\00\02\00\00\001") + (data (i32.const 304) "$\00\00\00\01\00\00\00\01\00\00\00$\00\00\00r\00e\00s\00o\00l\00v\00e\00-\00t\00e\00r\00n\00a\00r\00y\00.\00t\00s") + (data (i32.const 360) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\000\00.\000") + (data (i32.const 384) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00N\00a\00N") + (data (i32.const 408) "\12\00\00\00\01\00\00\00\01\00\00\00\12\00\00\00-\00I\00n\00f\00i\00n\00i\00t\00y") + (data (i32.const 448) "\10\00\00\00\01\00\00\00\01\00\00\00\10\00\00\00I\00n\00f\00i\00n\00i\00t\00y") + (data (i32.const 480) "\b8\02\00\00\01\00\00\00\00\00\00\00\b8\02\00\00\88\02\1c\08\a0\d5\8f\fav\bf>\a2\7f\e1\ae\bav\acU0 \fb\16\8b\ea5\ce]J\89B\cf-;eU\aa\b0k\9a\dfE\1a=\03\cf\1a\e6\ca\c6\9a\c7\17\fep\abO\dc\bc\be\fc\b1w\ff\0c\d6kA\ef\91V\be<\fc\7f\90\ad\1f\d0\8d\83\9aU1(\\Q\d3\b5\c9\a6\ad\8f\acq\9d\cb\8b\ee#w\"\9c\eamSx@\91I\cc\aeW\ce\b6]y\12<\827V\fbM6\94\10\c2O\98H8o\ea\96\90\c7:\82%\cb\85t\d7\f4\97\bf\97\cd\cf\86\a0\e5\ac*\17\98\n4\ef\8e\b25*\fbg8\b2;?\c6\d2\df\d4\c8\84\ba\cd\d3\1a\'D\dd\c5\96\c9%\bb\ce\9fk\93\84\a5b}$l\ac\db\f6\da_\0dXf\ab\a3&\f1\c3\de\93\f8\e2\f3\b8\80\ff\aa\a8\ad\b5\b5\8bJ|l\05_b\87S0\c14`\ff\bc\c9U&\ba\91\8c\85N\96\bd~)p$w\f9\df\8f\b8\e5\b8\9f\bd\df\a6\94}t\88\cf_\a9\f8\cf\9b\a8\8f\93pD\b9k\15\0f\bf\f8\f0\08\8a\b611eU%\b0\cd\ac\7f{\d0\c6\e2?\99\06;+*\c4\10\\\e4\d3\92si\99$$\aa\0e\ca\00\83\f2\b5\87\fd\eb\1a\11\92d\08\e5\bc\cc\88Po\t\cc\bc\8c,e\19\e2X\17\b7\d1\00\00\00\00\00\00@\9c\00\00\00\00\10\a5\d4\e8\00\00b\ac\c5\ebx\ad\84\t\94\f8x9?\81\b3\15\07\c9{\ce\97\c0p\\\ea{\ce2~\8fh\80\e9\ab\a48\d2\d5E\"\9a\17&\'O\9f\'\fb\c4\d41\a2c\ed\a8\ad\c8\8c8e\de\b0\dbe\ab\1a\8e\08\c7\83\9a\1dqB\f9\1d]\c4X\e7\1b\a6,iM\92\ea\8dp\1ad\ee\01\daJw\ef\9a\99\a3m\a2\85k}\b4{x\t\f2w\18\ddy\a1\e4T\b4\c2\c5\9b[\92\86[\86=]\96\c8\c5S5\c8\b3\a0\97\fa\\\b4*\95\e3_\a0\99\bd\9fF\de%\8c9\db4\c2\9b\a5\\\9f\98\a3r\9a\c6\f6\ce\be\e9TS\bf\dc\b7\e2A\"\f2\17\f3\fc\88\a5x\\\d3\9b\ce \cc\dfS!{\f3Z\16\98:0\1f\97\dc\b5\a0\e2\96\b3\e3\\S\d1\d9\a8 (; 27 ;) (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/itoa32 (; 28 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + i32.eqz + if + i32.const 272 + call $~lib/rt/pure/__retain + return + end + local.get $0 + i32.const 0 + i32.lt_s + local.tee $1 + if + i32.const 0 + local.get $0 + i32.sub + local.set $0 + end + local.get $0 + call $~lib/util/number/decimalCount32 + local.get $1 + i32.add + local.tee $3 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/tlsf/__alloc + local.tee $2 + local.get $0 + local.get $3 + call $~lib/util/number/utoa_simple + local.get $1 + if + local.get $2 + i32.const 45 + i32.store16 + end + local.get $2 + call $~lib/rt/pure/__retain + ) + (func $~lib/string/String#get:length (; 29 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 16 + i32.sub + i32.load offset=12 + i32.const 1 + i32.shr_u + ) + (func $~lib/util/string/compareImpl (; 30 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $0 + call $~lib/rt/pure/__retain + drop + local.get $1 + call $~lib/rt/pure/__retain + drop + local.get $0 + local.set $3 + local.get $1 + local.set $4 + loop $continue|0 + local.get $2 + if (result i32) + local.get $3 + i32.load16_u + local.get $4 + i32.load16_u + i32.sub + local.tee $5 + i32.eqz + else + i32.const 0 + end + if + local.get $2 + i32.const 1 + i32.sub + local.set $2 + local.get $3 + i32.const 2 + i32.add + local.set $3 + local.get $4 + i32.const 2 + i32.add + local.set $4 + br $continue|0 + end + end + local.get $0 + call $~lib/rt/pure/__release + local.get $1 + call $~lib/rt/pure/__release + local.get $5 + ) + (func $~lib/string/String.__eq (; 31 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $0 + call $~lib/rt/pure/__retain + drop + local.get $1 + call $~lib/rt/pure/__retain + drop + local.get $0 + local.get $1 + i32.eq + if + local.get $0 + call $~lib/rt/pure/__release + local.get $1 + call $~lib/rt/pure/__release + i32.const 1 + return + end + block $folding-inner0 + local.get $1 + i32.eqz + i32.const 1 + local.get $0 + select + if + br $folding-inner0 + end + local.get $0 + call $~lib/string/String#get:length + local.tee $2 + local.get $1 + call $~lib/string/String#get:length + i32.ne + if + br $folding-inner0 + end + local.get $0 + local.get $1 + local.get $2 + call $~lib/util/string/compareImpl + i32.eqz + local.get $0 + call $~lib/rt/pure/__release + local.get $1 + call $~lib/rt/pure/__release + return + end + local.get $0 + call $~lib/rt/pure/__release + local.get $1 + call $~lib/rt/pure/__release + i32.const 0 + ) + (func $~lib/util/number/genDigits (; 32 ;) (type $FUNCSIG$iijijiji) (param $0 i32) (param $1 i64) (param $2 i32) (param $3 i64) (param $4 i32) (param $5 i64) (param $6 i32) (result i32) + (local $7 i32) + (local $8 i32) + (local $9 i64) + (local $10 i32) + (local $11 i64) + (local $12 i64) + (local $13 i32) + (local $14 i64) + local.get $3 + local.get $1 + i64.sub + local.set $9 + i64.const 1 + i32.const 0 + local.get $4 + i32.sub + local.tee $10 + i64.extend_i32_s + i64.shl + local.tee $11 + i64.const 1 + i64.sub + local.tee $14 + local.get $3 + i64.and + local.set $12 + local.get $3 + local.get $10 + i64.extend_i32_s + i64.shr_u + i32.wrap_i64 + local.tee $7 + call $~lib/util/number/decimalCount32 + local.set $4 + i32.const 1524 + i32.load + local.set $13 + loop $continue|0 + local.get $4 + i32.const 0 + i32.gt_s + if + block $break|1 + block $case10|1 + block $case9|1 + block $case8|1 + block $case7|1 + block $case6|1 + block $case5|1 + block $case4|1 + block $case3|1 + block $case2|1 + block $case1|1 + local.get $4 + i32.const 10 + i32.ne + if + local.get $4 + i32.const 9 + i32.eq + br_if $case1|1 + block $tablify|0 + local.get $4 + i32.const 1 + i32.sub + br_table $case9|1 $case8|1 $case7|1 $case6|1 $case5|1 $case4|1 $case3|1 $case2|1 $tablify|0 + end + br $case10|1 + end + local.get $7 + i32.const 1000000000 + i32.div_u + local.set $8 + local.get $7 + i32.const 1000000000 + i32.rem_u + local.set $7 + br $break|1 + end + local.get $7 + i32.const 100000000 + i32.div_u + local.set $8 + local.get $7 + i32.const 100000000 + i32.rem_u + local.set $7 + br $break|1 + end + local.get $7 + i32.const 10000000 + i32.div_u + local.set $8 + local.get $7 + i32.const 10000000 + i32.rem_u + local.set $7 + br $break|1 + end + local.get $7 + i32.const 1000000 + i32.div_u + local.set $8 + local.get $7 + i32.const 1000000 + i32.rem_u + local.set $7 + br $break|1 + end + local.get $7 + i32.const 100000 + i32.div_u + local.set $8 + local.get $7 + i32.const 100000 + i32.rem_u + local.set $7 + br $break|1 + end + local.get $7 + i32.const 10000 + i32.div_u + local.set $8 + local.get $7 + i32.const 10000 + i32.rem_u + local.set $7 + br $break|1 + end + local.get $7 + i32.const 1000 + i32.div_u + local.set $8 + local.get $7 + i32.const 1000 + i32.rem_u + local.set $7 + br $break|1 + end + local.get $7 + i32.const 100 + i32.div_u + local.set $8 + local.get $7 + i32.const 100 + i32.rem_u + local.set $7 + br $break|1 + end + local.get $7 + i32.const 10 + i32.div_u + local.set $8 + local.get $7 + i32.const 10 + i32.rem_u + local.set $7 + br $break|1 + end + local.get $7 + local.set $8 + i32.const 0 + local.set $7 + br $break|1 + end + i32.const 0 + local.set $8 + end + local.get $6 + local.get $8 + i32.or + if + local.get $6 + local.tee $2 + i32.const 1 + i32.add + local.set $6 + local.get $2 + i32.const 1 + i32.shl + local.get $0 + i32.add + local.get $8 + i32.const 65535 + i32.and + i32.const 48 + i32.add + i32.store16 + end + local.get $4 + i32.const 1 + i32.sub + local.set $4 + local.get $7 + i64.extend_i32_u + local.get $10 + i64.extend_i32_s + i64.shl + local.get $12 + i64.add + local.tee $1 + local.get $5 + i64.gt_u + br_if $continue|0 + global.get $~lib/util/number/_K + local.get $4 + i32.add + global.set $~lib/util/number/_K + local.get $4 + i32.const 2 + i32.shl + local.get $13 + i32.add + i64.load32_u + local.get $10 + i64.extend_i32_s + i64.shl + local.set $3 + local.get $6 + i32.const 1 + i32.sub + i32.const 1 + i32.shl + local.get $0 + i32.add + local.tee $2 + i32.load16_u + local.set $4 + loop $continue|2 + i32.const 1 + local.get $9 + local.get $1 + i64.sub + local.get $1 + local.get $3 + i64.add + local.get $9 + i64.sub + i64.gt_u + local.get $1 + local.get $3 + i64.add + local.get $9 + i64.lt_u + select + i32.const 0 + local.get $5 + local.get $1 + i64.sub + local.get $3 + i64.ge_u + i32.const 0 + local.get $1 + local.get $9 + i64.lt_u + select + select + if + local.get $4 + i32.const 1 + i32.sub + local.set $4 + local.get $1 + local.get $3 + i64.add + local.set $1 + br $continue|2 + end + end + local.get $2 + local.get $4 + i32.store16 + local.get $6 + return + end + end + loop $continue|3 (result i32) + local.get $5 + i64.const 10 + i64.mul + local.set $5 + local.get $12 + i64.const 10 + i64.mul + local.tee $3 + local.get $10 + i64.extend_i32_s + i64.shr_u + local.tee $1 + local.get $6 + i64.extend_i32_s + i64.or + i64.const 0 + i64.ne + if + local.get $6 + local.tee $2 + i32.const 1 + i32.add + local.set $6 + local.get $2 + i32.const 1 + i32.shl + local.get $0 + i32.add + local.get $1 + i32.wrap_i64 + i32.const 65535 + i32.and + i32.const 48 + i32.add + i32.store16 + end + local.get $4 + i32.const 1 + i32.sub + local.set $4 + local.get $3 + local.get $14 + i64.and + local.tee $12 + local.get $5 + i64.ge_u + br_if $continue|3 + global.get $~lib/util/number/_K + local.get $4 + i32.add + global.set $~lib/util/number/_K + local.get $12 + local.set $1 + i32.const 0 + local.get $4 + i32.sub + i32.const 2 + i32.shl + local.get $13 + i32.add + i64.load32_u + local.get $9 + i64.mul + local.set $3 + local.get $6 + i32.const 1 + i32.sub + i32.const 1 + i32.shl + local.get $0 + i32.add + local.tee $2 + i32.load16_u + local.set $4 + loop $continue|4 + i32.const 1 + local.get $3 + local.get $1 + i64.sub + local.get $1 + local.get $11 + i64.add + local.get $3 + i64.sub + i64.gt_u + local.get $1 + local.get $11 + i64.add + local.get $3 + i64.lt_u + select + i32.const 0 + local.get $5 + local.get $1 + i64.sub + local.get $11 + i64.ge_u + i32.const 0 + local.get $1 + local.get $3 + i64.lt_u + select + select + if + local.get $4 + i32.const 1 + i32.sub + local.set $4 + local.get $1 + local.get $11 + i64.add + local.set $1 + br $continue|4 + end + end + local.get $2 + local.get $4 + i32.store16 + local.get $6 + end + ) + (func $~lib/util/number/prettify (; 33 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + local.get $2 + i32.eqz + if + local.get $1 + i32.const 1 + i32.shl + local.get $0 + i32.add + i32.const 3145774 + i32.store + local.get $1 + i32.const 2 + i32.add + return + end + local.get $1 + local.get $1 + local.get $2 + i32.add + local.tee $3 + i32.le_s + if (result i32) + local.get $3 + i32.const 21 + i32.le_s + else + i32.const 0 + end + if (result i32) + loop $loop|0 + block $break|0 + local.get $1 + local.get $3 + i32.ge_s + br_if $break|0 + local.get $1 + i32.const 1 + i32.shl + local.get $0 + i32.add + i32.const 48 + i32.store16 + local.get $1 + i32.const 1 + i32.add + local.set $1 + br $loop|0 + end + end + local.get $3 + i32.const 1 + i32.shl + local.get $0 + i32.add + i32.const 3145774 + i32.store + local.get $3 + i32.const 2 + i32.add + else + local.get $3 + i32.const 21 + i32.le_s + i32.const 0 + local.get $3 + i32.const 0 + i32.gt_s + select + if (result i32) + local.get $3 + i32.const 1 + i32.shl + local.get $0 + i32.add + local.tee $0 + i32.const 2 + i32.add + local.get $0 + i32.const 0 + local.get $2 + i32.sub + i32.const 1 + i32.shl + call $~lib/memory/memory.copy + local.get $0 + i32.const 46 + i32.store16 + local.get $1 + i32.const 1 + i32.add + else + local.get $3 + i32.const 0 + i32.le_s + i32.const 0 + i32.const -6 + local.get $3 + i32.lt_s + select + if (result i32) + i32.const 2 + local.get $3 + i32.sub + local.tee $3 + i32.const 1 + i32.shl + local.get $0 + i32.add + local.get $0 + local.get $1 + i32.const 1 + i32.shl + call $~lib/memory/memory.copy + local.get $0 + i32.const 3014704 + i32.store + i32.const 2 + local.set $2 + loop $loop|1 + block $break|1 + local.get $2 + local.get $3 + i32.ge_s + br_if $break|1 + local.get $2 + i32.const 1 + i32.shl + local.get $0 + i32.add + i32.const 48 + i32.store16 + local.get $2 + i32.const 1 + i32.add + local.set $2 + br $loop|1 + end + end + local.get $1 + local.get $3 + i32.add + else + local.get $1 + i32.const 1 + i32.eq + if (result i32) + local.get $0 + i32.const 101 + i32.store16 offset=2 + local.get $0 + i32.const 4 + i32.add + local.tee $0 + local.get $3 + i32.const 1 + i32.sub + local.tee $2 + i32.const 0 + i32.lt_s + local.tee $1 + if + i32.const 0 + local.get $2 + i32.sub + local.set $2 + end + local.get $2 + local.get $2 + call $~lib/util/number/decimalCount32 + i32.const 1 + i32.add + local.tee $2 + call $~lib/util/number/utoa_simple + local.get $0 + i32.const 45 + i32.const 43 + local.get $1 + select + i32.store16 + local.get $2 + i32.const 2 + i32.add + else + local.get $0 + i32.const 4 + i32.add + local.get $0 + i32.const 2 + i32.add + local.get $1 + i32.const 1 + i32.shl + local.tee $2 + i32.const 2 + i32.sub + call $~lib/memory/memory.copy + local.get $0 + i32.const 46 + i32.store16 offset=2 + local.get $0 + local.get $2 + i32.add + local.tee $0 + i32.const 101 + i32.store16 offset=2 + local.get $0 + i32.const 4 + i32.add + local.tee $2 + local.get $3 + i32.const 1 + i32.sub + local.tee $0 + i32.const 0 + i32.lt_s + local.tee $3 + if + i32.const 0 + local.get $0 + i32.sub + local.set $0 + end + local.get $0 + local.get $0 + call $~lib/util/number/decimalCount32 + i32.const 1 + i32.add + local.tee $0 + call $~lib/util/number/utoa_simple + local.get $2 + i32.const 45 + i32.const 43 + local.get $3 + select + i32.store16 + local.get $0 + local.get $1 + i32.add + i32.const 2 + i32.add + end + end + end + end + ) + (func $~lib/util/number/dtoa_core (; 34 ;) (type $FUNCSIG$iid) (param $0 i32) (param $1 f64) (result i32) + (local $2 i64) + (local $3 i32) + (local $4 i64) + (local $5 i64) + (local $6 i64) + (local $7 i32) + (local $8 i64) + (local $9 i64) + (local $10 i32) + (local $11 i32) + local.get $1 + f64.const 0 + f64.lt + local.tee $10 + if + local.get $0 + i32.const 45 + i32.store16 + local.get $1 + f64.neg + local.set $1 + end + local.get $1 + i64.reinterpret_f64 + local.tee $2 + i64.const 9218868437227405312 + i64.and + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.tee $11 + i32.const 0 + i32.ne + local.set $7 + local.get $2 + i64.const 4503599627370495 + i64.and + local.get $7 + i64.extend_i32_u + i64.const 52 + i64.shl + i64.add + local.tee $5 + i64.const 1 + i64.shl + i64.const 1 + i64.add + local.tee $2 + i64.clz + i32.wrap_i64 + local.set $3 + local.get $2 + local.get $3 + i64.extend_i32_s + i64.shl + global.set $~lib/util/number/_frc_plus + local.get $11 + i32.const 1 + local.get $7 + select + i32.const 1075 + i32.sub + local.tee $7 + i32.const 1 + i32.sub + local.get $3 + i32.sub + local.set $3 + local.get $5 + local.get $5 + i64.const 4503599627370496 + i64.eq + i32.const 1 + i32.add + local.tee $11 + i64.extend_i32_s + i64.shl + i64.const 1 + i64.sub + local.get $7 + local.get $11 + i32.sub + local.get $3 + i32.sub + i64.extend_i32_s + i64.shl + global.set $~lib/util/number/_frc_minus + local.get $3 + global.set $~lib/util/number/_exp + i32.const 348 + i32.const -61 + global.get $~lib/util/number/_exp + i32.sub + f64.convert_i32_s + f64.const 0.30102999566398114 + f64.mul + f64.const 347 + f64.add + local.tee $1 + i32.trunc_f64_s + local.tee $3 + local.get $3 + f64.convert_i32_s + local.get $1 + f64.ne + i32.add + i32.const 3 + i32.shr_s + i32.const 1 + i32.add + local.tee $3 + i32.const 3 + i32.shl + i32.sub + global.set $~lib/util/number/_K + i32.const 1212 + i32.load + local.get $3 + i32.const 3 + i32.shl + i32.add + i64.load + global.set $~lib/util/number/_frc_pow + i32.const 1436 + i32.load + local.get $3 + i32.const 1 + i32.shl + i32.add + i32.load16_s + global.set $~lib/util/number/_exp_pow + global.get $~lib/util/number/_frc_pow + local.tee $6 + i64.const 4294967295 + i64.and + local.set $2 + global.get $~lib/util/number/_frc_plus + local.tee $8 + i64.const 4294967295 + i64.and + local.tee $4 + local.get $6 + i64.const 32 + i64.shr_u + local.tee $6 + i64.mul + local.get $8 + i64.const 32 + i64.shr_u + local.tee $8 + local.get $2 + i64.mul + local.get $2 + local.get $4 + i64.mul + i64.const 32 + i64.shr_u + i64.add + local.tee $4 + i64.const 4294967295 + i64.and + i64.add + i64.const 2147483647 + i64.add + i64.const 32 + i64.shr_u + local.get $6 + local.get $8 + i64.mul + local.get $4 + i64.const 32 + i64.shr_u + i64.add + i64.add + i64.const 1 + i64.sub + local.tee $8 + local.get $6 + global.get $~lib/util/number/_frc_minus + local.tee $4 + i64.const 4294967295 + i64.and + local.tee $9 + i64.mul + local.get $4 + i64.const 32 + i64.shr_u + local.tee $4 + local.get $2 + i64.mul + local.get $2 + local.get $9 + i64.mul + i64.const 32 + i64.shr_u + i64.add + local.tee $9 + i64.const 4294967295 + i64.and + i64.add + i64.const 2147483647 + i64.add + i64.const 32 + i64.shr_u + local.get $4 + local.get $6 + i64.mul + local.get $9 + i64.const 32 + i64.shr_u + i64.add + i64.add + i64.const 1 + i64.add + i64.sub + local.set $4 + local.get $10 + i32.const 1 + i32.shl + local.get $0 + i32.add + local.get $0 + local.get $6 + local.get $5 + local.get $5 + i64.clz + i32.wrap_i64 + local.tee $0 + i64.extend_i32_s + i64.shl + local.tee $5 + i64.const 4294967295 + i64.and + local.tee $9 + i64.mul + local.get $5 + i64.const 32 + i64.shr_u + local.tee $5 + local.get $2 + i64.mul + local.get $2 + local.get $9 + i64.mul + i64.const 32 + i64.shr_u + i64.add + local.tee $2 + i64.const 4294967295 + i64.and + i64.add + i64.const 2147483647 + i64.add + i64.const 32 + i64.shr_u + local.get $5 + local.get $6 + i64.mul + local.get $2 + i64.const 32 + i64.shr_u + i64.add + i64.add + global.get $~lib/util/number/_exp_pow + local.tee $3 + local.get $7 + local.get $0 + i32.sub + i32.add + i32.const -64 + i32.sub + local.get $8 + global.get $~lib/util/number/_exp + local.get $3 + i32.add + i32.const -64 + i32.sub + local.get $4 + local.get $10 + call $~lib/util/number/genDigits + local.get $10 + i32.sub + global.get $~lib/util/number/_K + call $~lib/util/number/prettify + local.get $10 + i32.add + ) + (func $~lib/string/String#substring (; 35 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + i32.const 0 + local.get $0 + call $~lib/string/String#get:length + local.tee $2 + i32.const 0 + local.get $2 + i32.lt_s + select + local.tee $3 + local.get $1 + i32.const 0 + local.get $1 + i32.const 0 + i32.gt_s + select + local.tee $1 + local.get $2 + local.get $1 + local.get $2 + i32.lt_s + select + local.tee $2 + local.get $3 + local.get $2 + i32.gt_s + select + i32.const 1 + i32.shl + local.tee $1 + local.get $3 + local.get $2 + local.get $3 + local.get $2 + i32.lt_s + select + i32.const 1 + i32.shl + local.tee $3 + i32.sub + local.tee $2 + i32.eqz + if + i32.const 1552 + call $~lib/rt/pure/__retain + return + end + local.get $3 + if (result i32) + i32.const 0 + else + local.get $0 + call $~lib/string/String#get:length + i32.const 1 + i32.shl + local.get $1 + i32.eq + end + if + local.get $0 + call $~lib/rt/pure/__retain + return + end + local.get $2 + i32.const 1 + call $~lib/rt/tlsf/__alloc + local.tee $1 + local.get $0 + local.get $3 + i32.add + local.get $2 + call $~lib/memory/memory.copy + local.get $1 + call $~lib/rt/pure/__retain + ) + (func $~lib/util/number/dtoa (; 36 ;) (type $FUNCSIG$id) (param $0 f64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + f64.const 0 + f64.eq + if + i32.const 376 + call $~lib/rt/pure/__retain + return + end + local.get $0 + local.get $0 + f64.sub + f64.const 0 + f64.ne + if + local.get $0 + local.get $0 + f64.ne + if + i32.const 400 + call $~lib/rt/pure/__retain + return + end + i32.const 424 + i32.const 464 + local.get $0 + f64.const 0 + f64.lt + select + call $~lib/rt/pure/__retain + return + end + i32.const 56 + i32.const 1 + call $~lib/rt/tlsf/__alloc + local.tee $1 + local.get $0 + call $~lib/util/number/dtoa_core + local.tee $2 + i32.const 28 + i32.eq + if + local.get $1 + call $~lib/rt/pure/__retain + return + end + local.get $1 + local.get $2 + call $~lib/string/String#substring + local.get $1 + call $~lib/rt/tlsf/__free + ) + (func $start:resolve-ternary~anonymous|0 (; 37 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 1 + i32.add + ) + (func $start:resolve-ternary~anonymous|1 (; 38 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 2 + i32.add + ) + (func $resolve-ternary/g1 (; 39 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 3 + i32.add + ) + (func $resolve-ternary/g2 (; 40 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 4 + i32.add + ) + (func $start:resolve-ternary (; 41 ;) (type $FUNCSIG$v) + (local $0 i32) + (local $1 i32) + (local $2 i32) + i32.const 1 + i32.const 2 + global.get $resolve-ternary/b + select + call $~lib/util/number/itoa32 + local.tee $0 + call $~lib/rt/pure/__retain + local.set $1 + local.get $0 + call $~lib/rt/pure/__release + local.get $1 + i32.const 296 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 5 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + f64.const 1 + f64.const 2 + global.get $resolve-ternary/b + select + call $~lib/util/number/dtoa + local.tee $2 + local.get $2 + i32.const 1568 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 13 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + global.set $~lib/argc + i32.const 1 + i32.const 1 + i32.const 2 + global.get $resolve-ternary/b + select + call_indirect (type $FUNCSIG$ii) + i32.const 2 + i32.ne + if + i32.const 0 + i32.const 320 + i32.const 24 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + global.set $~lib/argc + i32.const 1 + i32.const 3 + i32.const 4 + global.get $resolve-ternary/b + select + call_indirect (type $FUNCSIG$ii) + i32.const 4 + i32.ne + if + i32.const 0 + i32.const 320 + i32.const 35 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + global.set $~lib/argc + i32.const 1 + i32.const 2 + i32.const 4 + global.get $resolve-ternary/b + select + call_indirect (type $FUNCSIG$ii) + i32.const 3 + i32.ne + if + i32.const 0 + i32.const 320 + i32.const 43 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + local.get $1 + call $~lib/rt/pure/__release + call $~lib/rt/pure/__release + ) + (func $start (; 42 ;) (type $FUNCSIG$v) + call $start:resolve-ternary + ) + (func $~lib/rt/pure/__visit (; 43 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) + local.get $0 + i32.const 1628 + i32.lt_u + if + return + end + local.get $0 + i32.const 16 + i32.sub + local.set $0 + block $break|0 + block $case5|0 + block $case4|0 + block $case3|0 + block $case2|0 + block $case1|0 + local.get $1 + i32.const 1 + i32.ne + if + local.get $1 + i32.const 2 + i32.eq + br_if $case1|0 + block $tablify|0 + local.get $1 + i32.const 3 + i32.sub + br_table $case2|0 $case3|0 $case4|0 $tablify|0 + end + br $case5|0 + end + local.get $0 + call $~lib/rt/pure/decrement + br $break|0 + end + local.get $0 + i32.load offset=4 + i32.const 268435455 + i32.and + i32.const 0 + i32.le_u + if + i32.const 0 + i32.const 128 + i32.const 75 + i32.const 17 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $0 + i32.load offset=4 + i32.const 1 + i32.sub + i32.store offset=4 + local.get $0 + call $~lib/rt/pure/markGray + br $break|0 + end + local.get $0 + call $~lib/rt/pure/scan + br $break|0 + end + local.get $0 + i32.load offset=4 + local.tee $1 + i32.const -268435456 + i32.and + local.get $1 + i32.const 1 + i32.add + i32.const -268435456 + i32.and + i32.ne + if + i32.const 0 + i32.const 128 + i32.const 86 + i32.const 6 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + i32.const 1 + i32.add + i32.store offset=4 + local.get $1 + i32.const 1879048192 + i32.and + if + local.get $0 + call $~lib/rt/pure/scanBlack + end + br $break|0 + end + local.get $0 + call $~lib/rt/pure/collectWhite + br $break|0 + end + i32.const 0 + i32.const 128 + i32.const 97 + i32.const 24 + call $~lib/builtins/abort + unreachable + end + ) + (func $~lib/rt/__visit_members (; 44 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) + block $block$4$break + block $switch$1$default + block $switch$1$case$2 + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $switch$1$case$2 $switch$1$case$2 $block$4$break $block$4$break $block$4$break $block$4$break $switch$1$default + end + return + end + unreachable + end + local.get $0 + i32.load + local.tee $0 + if + local.get $0 + local.get $1 + call $~lib/rt/pure/__visit + end + ) + (func $null (; 45 ;) (type $FUNCSIG$v) + nop + ) +) diff --git a/tests/compiler/resolve-ternary.ts b/tests/compiler/resolve-ternary.ts new file mode 100644 index 0000000000..6bf7dee6a0 --- /dev/null +++ b/tests/compiler/resolve-ternary.ts @@ -0,0 +1,47 @@ +var b = true; + +// literal + +assert( + (b ? 1 : 2).toString() + == + "1" +); + +// literal mismatch (convert lhs to f64) + +assert( + (b ? 1 : 2.0).toString() + == + "1.0" +); + +// function type + +const f1 = (x: i32): i32 => x + 1; +const f2 = (x: i32): i32 => x + 2; + +assert( + (b ? f1 : f2)(1) + == + 2 +); + +// function type from identifier + +function g1(x: i32): i32 { return x + 3; } +function g2(x: i32): i32 { return x + 4; } + +assert( + (b ? g1 : g2)(1) + == + 4 +); + +// function type mixed + +assert( + (b ? f2 : g2)(1) + == + 3 +); diff --git a/tests/compiler/resolve-ternary.untouched.wat b/tests/compiler/resolve-ternary.untouched.wat new file mode 100644 index 0000000000..fe0e360e3a --- /dev/null +++ b/tests/compiler/resolve-ternary.untouched.wat @@ -0,0 +1,5426 @@ +(module + (type $FUNCSIG$iii (func (param i32 i32) (result i32))) + (type $FUNCSIG$v (func)) + (type $FUNCSIG$iiii (func (param i32 i32 i32) (result i32))) + (type $FUNCSIG$viiii (func (param i32 i32 i32 i32))) + (type $FUNCSIG$vii (func (param i32 i32))) + (type $FUNCSIG$ii (func (param i32) (result i32))) + (type $FUNCSIG$viii (func (param i32 i32 i32))) + (type $FUNCSIG$vi (func (param i32))) + (type $FUNCSIG$iiiiii (func (param i32 i32 i32 i32 i32) (result i32))) + (type $FUNCSIG$idi (func (param f64 i32) (result i32))) + (type $FUNCSIG$id (func (param f64) (result i32))) + (type $FUNCSIG$iid (func (param i32 f64) (result i32))) + (type $FUNCSIG$jii (func (param i32 i32) (result i64))) + (type $FUNCSIG$iijijiji (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (memory $0 1) + (data (i32.const 8) "\1e\00\00\00\01\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") + (data (i32.const 56) "(\00\00\00\01\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") + (data (i32.const 112) "\1e\00\00\00\01\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00p\00u\00r\00e\00.\00t\00s\00") + (data (i32.const 160) "$\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 216) "\14\00\00\00\01\00\00\00\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00") + (data (i32.const 256) "\02\00\00\00\01\00\00\00\01\00\00\00\02\00\00\000\00") + (data (i32.const 280) "\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 696) "\10\00\00\00\01\00\00\00\03\00\00\00\10\00\00\00(\01\00\00(\01\00\00\90\01\00\00d\00\00\00") + (data (i32.const 728) "\02\00\00\00\01\00\00\00\01\00\00\00\02\00\00\001\00") + (data (i32.const 752) "$\00\00\00\01\00\00\00\01\00\00\00$\00\00\00r\00e\00s\00o\00l\00v\00e\00-\00t\00e\00r\00n\00a\00r\00y\00.\00t\00s\00") + (data (i32.const 808) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\000\00.\000\00") + (data (i32.const 832) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00N\00a\00N\00") + (data (i32.const 856) "\12\00\00\00\01\00\00\00\01\00\00\00\12\00\00\00-\00I\00n\00f\00i\00n\00i\00t\00y\00") + (data (i32.const 896) "\10\00\00\00\01\00\00\00\01\00\00\00\10\00\00\00I\00n\00f\00i\00n\00i\00t\00y\00") + (data (i32.const 928) "\b8\02\00\00\01\00\00\00\00\00\00\00\b8\02\00\00\88\02\1c\08\a0\d5\8f\fav\bf>\a2\7f\e1\ae\bav\acU0 \fb\16\8b\ea5\ce]J\89B\cf-;eU\aa\b0k\9a\dfE\1a=\03\cf\1a\e6\ca\c6\9a\c7\17\fep\abO\dc\bc\be\fc\b1w\ff\0c\d6kA\ef\91V\be<\fc\7f\90\ad\1f\d0\8d\83\9aU1(\\Q\d3\b5\c9\a6\ad\8f\acq\9d\cb\8b\ee#w\"\9c\eamSx@\91I\cc\aeW\ce\b6]y\12<\827V\fbM6\94\10\c2O\98H8o\ea\96\90\c7:\82%\cb\85t\d7\f4\97\bf\97\cd\cf\86\a0\e5\ac*\17\98\n4\ef\8e\b25*\fbg8\b2;?\c6\d2\df\d4\c8\84\ba\cd\d3\1a\'D\dd\c5\96\c9%\bb\ce\9fk\93\84\a5b}$l\ac\db\f6\da_\0dXf\ab\a3&\f1\c3\de\93\f8\e2\f3\b8\80\ff\aa\a8\ad\b5\b5\8bJ|l\05_b\87S0\c14`\ff\bc\c9U&\ba\91\8c\85N\96\bd~)p$w\f9\df\8f\b8\e5\b8\9f\bd\df\a6\94}t\88\cf_\a9\f8\cf\9b\a8\8f\93pD\b9k\15\0f\bf\f8\f0\08\8a\b611eU%\b0\cd\ac\7f{\d0\c6\e2?\99\06;+*\c4\10\\\e4\d3\92si\99$$\aa\0e\ca\00\83\f2\b5\87\fd\eb\1a\11\92d\08\e5\bc\cc\88Po\t\cc\bc\8c,e\19\e2X\17\b7\d1\00\00\00\00\00\00@\9c\00\00\00\00\10\a5\d4\e8\00\00b\ac\c5\ebx\ad\84\t\94\f8x9?\81\b3\15\07\c9{\ce\97\c0p\\\ea{\ce2~\8fh\80\e9\ab\a48\d2\d5E\"\9a\17&\'O\9f\'\fb\c4\d41\a2c\ed\a8\ad\c8\8c8e\de\b0\dbe\ab\1a\8e\08\c7\83\9a\1dqB\f9\1d]\c4X\e7\1b\a6,iM\92\ea\8dp\1ad\ee\01\daJw\ef\9a\99\a3m\a2\85k}\b4{x\t\f2w\18\ddy\a1\e4T\b4\c2\c5\9b[\92\86[\86=]\96\c8\c5S5\c8\b3\a0\97\fa\\\b4*\95\e3_\a0\99\bd\9fF\de%\8c9\db4\c2\9b\a5\\\9f\98\a3r\9a\c6\f6\ce\be\e9TS\bf\dc\b7\e2A\"\f2\17\f3\fc\88\a5x\\\d3\9b\ce \cc\dfS!{\f3Z\16\98:0\1f\97\dc\b5\a0\e2\96\b3\e3\\S\d1\d9\a8 (; 30 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + call $~lib/util/number/itoa32 + return + ) + (func $~lib/number/I32#toString (; 31 ;) (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/pure/__retain + local.set $2 + local.get $1 + call $~lib/rt/pure/__release + local.get $2 + ) + (func $~lib/string/String#get:length (; 32 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 16 + i32.sub + i32.load offset=12 + i32.const 1 + i32.shr_u + ) + (func $~lib/util/string/compareImpl (; 33 ;) (type $FUNCSIG$iiiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + local.get $0 + call $~lib/rt/pure/__retain + drop + local.get $2 + call $~lib/rt/pure/__retain + drop + i32.const 0 + local.set $5 + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add + local.set $6 + local.get $2 + local.get $3 + i32.const 1 + i32.shl + i32.add + local.set $7 + block $break|0 + loop $continue|0 + local.get $4 + if (result i32) + local.get $6 + i32.load16_u + local.get $7 + i32.load16_u + i32.sub + local.tee $5 + i32.eqz + else + i32.const 0 + end + i32.eqz + br_if $break|0 + local.get $4 + i32.const 1 + i32.sub + local.set $4 + local.get $6 + i32.const 2 + i32.add + local.set $6 + local.get $7 + i32.const 2 + i32.add + local.set $7 + br $continue|0 + end + unreachable + end + local.get $5 + local.set $8 + local.get $0 + call $~lib/rt/pure/__release + local.get $2 + call $~lib/rt/pure/__release + local.get $8 + ) + (func $~lib/string/String.__eq (; 34 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + local.get $0 + call $~lib/rt/pure/__retain + drop + local.get $1 + call $~lib/rt/pure/__retain + drop + local.get $0 + local.get $1 + i32.eq + if + i32.const 1 + local.set $2 + local.get $0 + call $~lib/rt/pure/__release + local.get $1 + call $~lib/rt/pure/__release + local.get $2 + return + end + local.get $0 + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $1 + i32.const 0 + i32.eq + end + if + i32.const 0 + local.set $2 + local.get $0 + call $~lib/rt/pure/__release + local.get $1 + call $~lib/rt/pure/__release + local.get $2 + return + end + local.get $0 + call $~lib/string/String#get:length + local.set $3 + local.get $3 + local.get $1 + call $~lib/string/String#get:length + i32.ne + if + i32.const 0 + local.set $2 + local.get $0 + call $~lib/rt/pure/__release + local.get $1 + call $~lib/rt/pure/__release + local.get $2 + return + end + local.get $0 + i32.const 0 + local.get $1 + i32.const 0 + local.get $3 + call $~lib/util/string/compareImpl + i32.eqz + local.set $2 + local.get $0 + call $~lib/rt/pure/__release + local.get $1 + call $~lib/rt/pure/__release + local.get $2 + ) + (func $~lib/number/isFinite (; 35 ;) (type $FUNCSIG$id) (param $0 f64) (result i32) + local.get $0 + local.get $0 + f64.sub + f64.const 0 + f64.eq + ) + (func $~lib/number/isNaN (; 36 ;) (type $FUNCSIG$id) (param $0 f64) (result i32) + local.get $0 + local.get $0 + f64.ne + ) + (func $~lib/array/Array#__unchecked_get (; 37 ;) (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#__unchecked_get (; 38 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + local.get $0 + i32.load offset=4 + local.get $1 + i32.const 1 + i32.shl + i32.add + i32.load16_s + ) + (func $~lib/util/number/genDigits (; 39 ;) (type $FUNCSIG$iijijiji) (param $0 i32) (param $1 i64) (param $2 i32) (param $3 i64) (param $4 i32) (param $5 i64) (param $6 i32) (result i32) + (local $7 i32) + (local $8 i64) + (local $9 i64) + (local $10 i64) + (local $11 i32) + (local $12 i32) + (local $13 i64) + (local $14 i32) + (local $15 i32) + (local $16 i32) + (local $17 i32) + (local $18 i32) + (local $19 i64) + (local $20 i64) + (local $21 i64) + (local $22 i64) + (local $23 i64) + (local $24 i32) + (local $25 i32) + (local $26 i32) + i32.const 0 + local.get $4 + i32.sub + local.set $7 + i64.const 1 + local.get $7 + i64.extend_i32_s + i64.shl + local.set $8 + local.get $8 + i64.const 1 + i64.sub + local.set $9 + local.get $3 + local.get $1 + i64.sub + local.set $10 + local.get $4 + local.set $11 + local.get $3 + local.get $7 + i64.extend_i32_s + i64.shr_u + i32.wrap_i64 + local.set $12 + local.get $3 + local.get $9 + i64.and + local.set $13 + local.get $12 + call $~lib/util/number/decimalCount32 + local.set $14 + local.get $6 + local.set $15 + i32.const 1968 + i32.load offset=4 + local.set $16 + block $break|0 + loop $continue|0 + local.get $14 + i32.const 0 + i32.gt_s + i32.eqz + br_if $break|0 + block $break|1 + block $case10|1 + block $case9|1 + block $case8|1 + block $case7|1 + block $case6|1 + block $case5|1 + block $case4|1 + block $case3|1 + block $case2|1 + block $case1|1 + block $case0|1 + local.get $14 + local.set $18 + local.get $18 + i32.const 10 + i32.eq + br_if $case0|1 + local.get $18 + i32.const 9 + i32.eq + br_if $case1|1 + local.get $18 + i32.const 8 + i32.eq + br_if $case2|1 + local.get $18 + i32.const 7 + i32.eq + br_if $case3|1 + local.get $18 + i32.const 6 + i32.eq + br_if $case4|1 + local.get $18 + i32.const 5 + i32.eq + br_if $case5|1 + local.get $18 + i32.const 4 + i32.eq + br_if $case6|1 + local.get $18 + i32.const 3 + i32.eq + br_if $case7|1 + local.get $18 + i32.const 2 + i32.eq + br_if $case8|1 + local.get $18 + i32.const 1 + i32.eq + br_if $case9|1 + br $case10|1 + end + local.get $12 + i32.const 1000000000 + i32.div_u + local.set $17 + local.get $12 + i32.const 1000000000 + i32.rem_u + local.set $12 + br $break|1 + end + local.get $12 + i32.const 100000000 + i32.div_u + local.set $17 + local.get $12 + i32.const 100000000 + i32.rem_u + local.set $12 + br $break|1 + end + local.get $12 + i32.const 10000000 + i32.div_u + local.set $17 + local.get $12 + i32.const 10000000 + i32.rem_u + local.set $12 + br $break|1 + end + local.get $12 + i32.const 1000000 + i32.div_u + local.set $17 + local.get $12 + i32.const 1000000 + i32.rem_u + local.set $12 + br $break|1 + end + local.get $12 + i32.const 100000 + i32.div_u + local.set $17 + local.get $12 + i32.const 100000 + i32.rem_u + local.set $12 + br $break|1 + end + local.get $12 + i32.const 10000 + i32.div_u + local.set $17 + local.get $12 + i32.const 10000 + i32.rem_u + local.set $12 + br $break|1 + end + local.get $12 + i32.const 1000 + i32.div_u + local.set $17 + local.get $12 + i32.const 1000 + i32.rem_u + local.set $12 + br $break|1 + end + local.get $12 + i32.const 100 + i32.div_u + local.set $17 + local.get $12 + i32.const 100 + i32.rem_u + local.set $12 + br $break|1 + end + local.get $12 + i32.const 10 + i32.div_u + local.set $17 + local.get $12 + i32.const 10 + i32.rem_u + local.set $12 + br $break|1 + end + local.get $12 + local.set $17 + i32.const 0 + local.set $12 + br $break|1 + end + i32.const 0 + local.set $17 + br $break|1 + end + local.get $17 + local.get $15 + i32.or + if + local.get $0 + local.get $15 + local.tee $18 + i32.const 1 + i32.add + local.set $15 + local.get $18 + i32.const 1 + i32.shl + i32.add + i32.const 48 + local.get $17 + i32.const 65535 + i32.and + i32.add + i32.store16 + end + local.get $14 + i32.const 1 + i32.sub + local.set $14 + local.get $12 + i64.extend_i32_u + local.get $7 + i64.extend_i32_s + i64.shl + local.get $13 + i64.add + local.set $19 + local.get $19 + local.get $5 + i64.le_u + if + global.get $~lib/util/number/_K + local.get $14 + i32.add + global.set $~lib/util/number/_K + local.get $0 + local.set $24 + local.get $15 + local.set $18 + local.get $5 + local.set $23 + local.get $19 + local.set $22 + local.get $16 + local.get $14 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.get $7 + i64.extend_i32_s + i64.shl + local.set $21 + local.get $10 + local.set $20 + local.get $24 + local.get $18 + i32.const 1 + i32.sub + i32.const 1 + i32.shl + i32.add + local.set $25 + local.get $25 + i32.load16_u + local.set $26 + block $break|2 + loop $continue|2 + local.get $22 + local.get $20 + i64.lt_u + if (result i32) + local.get $23 + local.get $22 + i64.sub + local.get $21 + i64.ge_u + else + i32.const 0 + end + if (result i32) + local.get $22 + local.get $21 + i64.add + local.get $20 + i64.lt_u + if (result i32) + i32.const 1 + else + local.get $20 + local.get $22 + i64.sub + local.get $22 + local.get $21 + i64.add + local.get $20 + i64.sub + i64.gt_u + end + else + i32.const 0 + end + i32.eqz + br_if $break|2 + local.get $26 + i32.const 1 + i32.sub + local.set $26 + local.get $22 + local.get $21 + i64.add + local.set $22 + br $continue|2 + end + unreachable + end + local.get $25 + local.get $26 + i32.store16 + local.get $15 + return + end + br $continue|0 + end + unreachable + end + loop $continue|3 + local.get $13 + i64.const 10 + i64.mul + local.set $13 + local.get $5 + i64.const 10 + i64.mul + local.set $5 + local.get $13 + local.get $7 + i64.extend_i32_s + i64.shr_u + local.set $19 + local.get $19 + local.get $15 + i64.extend_i32_s + i64.or + i64.const 0 + i64.ne + if + local.get $0 + local.get $15 + local.tee $17 + i32.const 1 + i32.add + local.set $15 + local.get $17 + i32.const 1 + i32.shl + i32.add + i32.const 48 + local.get $19 + i32.wrap_i64 + i32.const 65535 + i32.and + i32.add + i32.store16 + end + local.get $13 + local.get $9 + i64.and + local.set $13 + local.get $14 + i32.const 1 + i32.sub + local.set $14 + local.get $13 + local.get $5 + i64.lt_u + if + global.get $~lib/util/number/_K + local.get $14 + i32.add + global.set $~lib/util/number/_K + local.get $10 + local.get $16 + i32.const 0 + local.get $14 + i32.sub + i32.const 2 + i32.shl + i32.add + i64.load32_u + i64.mul + local.set $10 + local.get $0 + local.set $24 + local.get $15 + local.set $18 + local.get $5 + local.set $23 + local.get $13 + local.set $22 + local.get $8 + local.set $21 + local.get $10 + local.set $20 + local.get $24 + local.get $18 + i32.const 1 + i32.sub + i32.const 1 + i32.shl + i32.add + local.set $17 + local.get $17 + i32.load16_u + local.set $26 + block $break|4 + loop $continue|4 + local.get $22 + local.get $20 + i64.lt_u + if (result i32) + local.get $23 + local.get $22 + i64.sub + local.get $21 + i64.ge_u + else + i32.const 0 + end + if (result i32) + local.get $22 + local.get $21 + i64.add + local.get $20 + i64.lt_u + if (result i32) + i32.const 1 + else + local.get $20 + local.get $22 + i64.sub + local.get $22 + local.get $21 + i64.add + local.get $20 + i64.sub + i64.gt_u + end + else + i32.const 0 + end + i32.eqz + br_if $break|4 + local.get $26 + i32.const 1 + i32.sub + local.set $26 + local.get $22 + local.get $21 + i64.add + local.set $22 + br $continue|4 + end + unreachable + end + local.get $17 + local.get $26 + i32.store16 + local.get $15 + return + end + br $continue|3 + end + unreachable + ) + (func $~lib/util/number/prettify (; 40 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + local.get $2 + i32.eqz + if + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add + i32.const 46 + i32.const 48 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 2 + i32.add + return + end + local.get $1 + local.get $2 + i32.add + local.set $3 + local.get $1 + local.get $3 + i32.le_s + if (result i32) + local.get $3 + i32.const 21 + i32.le_s + else + i32.const 0 + end + if + block $break|0 + local.get $1 + local.set $4 + loop $loop|0 + local.get $4 + local.get $3 + i32.lt_s + i32.eqz + br_if $break|0 + local.get $0 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.const 48 + i32.store16 + local.get $4 + i32.const 1 + i32.add + local.set $4 + br $loop|0 + end + unreachable + end + local.get $0 + local.get $3 + i32.const 1 + i32.shl + i32.add + i32.const 46 + i32.const 48 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $3 + i32.const 2 + i32.add + return + else + local.get $3 + i32.const 0 + i32.gt_s + if (result i32) + local.get $3 + i32.const 21 + i32.le_s + else + i32.const 0 + end + if + local.get $0 + local.get $3 + i32.const 1 + i32.shl + i32.add + local.set $4 + local.get $4 + i32.const 2 + i32.add + local.get $4 + i32.const 0 + local.get $2 + i32.sub + i32.const 1 + i32.shl + call $~lib/memory/memory.copy + local.get $0 + local.get $3 + i32.const 1 + i32.shl + i32.add + i32.const 46 + i32.store16 + local.get $1 + i32.const 1 + i32.add + return + else + i32.const -6 + local.get $3 + i32.lt_s + if (result i32) + local.get $3 + i32.const 0 + i32.le_s + else + i32.const 0 + end + if + i32.const 2 + local.get $3 + i32.sub + local.set $4 + local.get $0 + local.get $4 + i32.const 1 + i32.shl + i32.add + local.get $0 + local.get $1 + i32.const 1 + i32.shl + call $~lib/memory/memory.copy + local.get $0 + i32.const 48 + i32.const 46 + i32.const 16 + i32.shl + i32.or + i32.store + block $break|1 + i32.const 2 + local.set $5 + loop $loop|1 + local.get $5 + local.get $4 + i32.lt_s + i32.eqz + br_if $break|1 + local.get $0 + local.get $5 + i32.const 1 + i32.shl + i32.add + i32.const 48 + i32.store16 + local.get $5 + i32.const 1 + i32.add + local.set $5 + br $loop|1 + end + unreachable + end + local.get $1 + local.get $4 + i32.add + return + else + local.get $1 + i32.const 1 + i32.eq + if + local.get $0 + i32.const 101 + i32.store16 offset=2 + local.get $0 + i32.const 4 + i32.add + local.set $4 + local.get $3 + i32.const 1 + i32.sub + local.set $5 + local.get $5 + i32.const 0 + i32.lt_s + local.set $6 + local.get $6 + if + i32.const 0 + local.get $5 + i32.sub + local.set $5 + end + local.get $5 + call $~lib/util/number/decimalCount32 + i32.const 1 + i32.add + local.set $7 + local.get $4 + local.set $10 + local.get $5 + local.set $9 + local.get $7 + local.set $8 + local.get $10 + local.get $9 + local.get $8 + call $~lib/util/number/utoa32_lut + local.get $4 + i32.const 45 + i32.const 43 + local.get $6 + select + i32.store16 + local.get $7 + local.set $1 + local.get $1 + i32.const 2 + i32.add + return + else + local.get $1 + i32.const 1 + i32.shl + local.set $7 + local.get $0 + i32.const 4 + i32.add + local.get $0 + i32.const 2 + i32.add + local.get $7 + i32.const 2 + i32.sub + call $~lib/memory/memory.copy + local.get $0 + i32.const 46 + i32.store16 offset=2 + local.get $0 + local.get $7 + i32.add + i32.const 101 + i32.store16 offset=2 + local.get $1 + local.get $0 + local.get $7 + i32.add + i32.const 4 + i32.add + local.set $9 + local.get $3 + i32.const 1 + i32.sub + local.set $8 + local.get $8 + i32.const 0 + i32.lt_s + local.set $6 + local.get $6 + if + i32.const 0 + local.get $8 + i32.sub + local.set $8 + end + local.get $8 + call $~lib/util/number/decimalCount32 + i32.const 1 + i32.add + local.set $4 + local.get $9 + local.set $11 + local.get $8 + local.set $5 + local.get $4 + local.set $10 + local.get $11 + local.get $5 + local.get $10 + call $~lib/util/number/utoa32_lut + local.get $9 + i32.const 45 + i32.const 43 + local.get $6 + select + i32.store16 + local.get $4 + i32.add + local.set $1 + local.get $1 + i32.const 2 + i32.add + return + end + unreachable + end + unreachable + end + unreachable + end + unreachable + ) + (func $~lib/util/number/dtoa_core (; 41 ;) (type $FUNCSIG$iid) (param $0 i32) (param $1 f64) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 f64) + (local $6 i64) + (local $7 i32) + (local $8 i64) + (local $9 i64) + (local $10 i32) + (local $11 i64) + (local $12 i64) + (local $13 i32) + (local $14 i32) + (local $15 i32) + (local $16 f64) + (local $17 i64) + (local $18 i64) + (local $19 i64) + (local $20 i64) + (local $21 i64) + (local $22 i64) + (local $23 i64) + (local $24 i64) + (local $25 i64) + (local $26 i32) + (local $27 i64) + (local $28 i32) + local.get $1 + f64.const 0 + f64.lt + local.set $2 + local.get $2 + if + local.get $1 + f64.neg + local.set $1 + local.get $0 + i32.const 45 + i32.store16 + end + local.get $1 + local.set $5 + local.get $0 + local.set $4 + local.get $2 + local.set $3 + local.get $5 + i64.reinterpret_f64 + local.set $6 + local.get $6 + i64.const 9218868437227405312 + i64.and + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.set $7 + local.get $6 + i64.const 4503599627370495 + i64.and + local.set $8 + local.get $7 + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 52 + i64.shl + local.get $8 + i64.add + local.set $9 + local.get $7 + i32.const 1 + local.get $7 + i32.const 0 + i32.ne + select + i32.const 1023 + i32.const 52 + i32.add + i32.sub + local.set $7 + local.get $9 + local.set $11 + local.get $7 + local.set $10 + local.get $11 + i64.const 1 + i64.shl + i64.const 1 + i64.add + local.set $12 + local.get $10 + i32.const 1 + i32.sub + local.set $13 + local.get $12 + i64.clz + i32.wrap_i64 + local.set $14 + local.get $12 + local.get $14 + i64.extend_i32_s + i64.shl + local.set $12 + local.get $13 + local.get $14 + i32.sub + local.set $13 + i32.const 1 + local.get $11 + i64.const 4503599627370496 + i64.eq + i32.add + local.set $15 + local.get $12 + global.set $~lib/util/number/_frc_plus + local.get $11 + local.get $15 + i64.extend_i32_s + i64.shl + i64.const 1 + i64.sub + local.get $10 + local.get $15 + i32.sub + local.get $13 + i32.sub + i64.extend_i32_s + i64.shl + global.set $~lib/util/number/_frc_minus + local.get $13 + global.set $~lib/util/number/_exp + global.get $~lib/util/number/_exp + local.set $10 + i32.const -61 + local.get $10 + i32.sub + f64.convert_i32_s + f64.const 0.30102999566398114 + f64.mul + f64.const 347 + f64.add + local.set $16 + local.get $16 + i32.trunc_f64_s + local.set $15 + local.get $15 + local.get $15 + f64.convert_i32_s + local.get $16 + f64.ne + i32.add + local.set $15 + local.get $15 + i32.const 3 + i32.shr_s + i32.const 1 + i32.add + local.set $14 + i32.const 348 + local.get $14 + i32.const 3 + i32.shl + i32.sub + global.set $~lib/util/number/_K + i32.const 1656 + local.get $14 + call $~lib/array/Array#__unchecked_get + global.set $~lib/util/number/_frc_pow + i32.const 1880 + local.get $14 + call $~lib/array/Array#__unchecked_get + global.set $~lib/util/number/_exp_pow + local.get $9 + i64.clz + i32.wrap_i64 + local.set $14 + local.get $9 + local.get $14 + i64.extend_i32_s + i64.shl + local.set $9 + local.get $7 + local.get $14 + i32.sub + local.set $7 + global.get $~lib/util/number/_frc_pow + local.set $12 + global.get $~lib/util/number/_exp_pow + local.set $15 + local.get $9 + local.set $17 + local.get $12 + local.set $11 + local.get $17 + i64.const 4294967295 + i64.and + local.set $18 + local.get $11 + i64.const 4294967295 + i64.and + local.set $19 + local.get $17 + i64.const 32 + i64.shr_u + local.set $20 + local.get $11 + i64.const 32 + i64.shr_u + local.set $21 + local.get $18 + local.get $19 + i64.mul + local.set $22 + local.get $20 + local.get $19 + i64.mul + local.get $22 + i64.const 32 + i64.shr_u + i64.add + local.set $23 + local.get $18 + local.get $21 + i64.mul + local.get $23 + i64.const 4294967295 + i64.and + i64.add + local.set $24 + local.get $24 + i64.const 2147483647 + i64.add + local.set $24 + local.get $23 + i64.const 32 + i64.shr_u + local.set $23 + local.get $24 + i64.const 32 + i64.shr_u + local.set $24 + local.get $20 + local.get $21 + i64.mul + local.get $23 + i64.add + local.get $24 + i64.add + local.set $24 + local.get $7 + local.set $10 + local.get $15 + local.set $13 + local.get $10 + local.get $13 + i32.add + i32.const 64 + i32.add + local.set $10 + global.get $~lib/util/number/_frc_plus + local.set $17 + local.get $12 + local.set $11 + local.get $17 + i64.const 4294967295 + i64.and + local.set $23 + local.get $11 + i64.const 4294967295 + i64.and + local.set $22 + local.get $17 + i64.const 32 + i64.shr_u + local.set $21 + local.get $11 + i64.const 32 + i64.shr_u + local.set $20 + local.get $23 + local.get $22 + i64.mul + local.set $19 + local.get $21 + local.get $22 + i64.mul + local.get $19 + i64.const 32 + i64.shr_u + i64.add + local.set $18 + local.get $23 + local.get $20 + i64.mul + local.get $18 + i64.const 4294967295 + i64.and + i64.add + local.set $25 + local.get $25 + i64.const 2147483647 + i64.add + local.set $25 + local.get $18 + i64.const 32 + i64.shr_u + local.set $18 + local.get $25 + i64.const 32 + i64.shr_u + local.set $25 + local.get $21 + local.get $20 + i64.mul + local.get $18 + i64.add + local.get $25 + i64.add + i64.const 1 + i64.sub + local.set $25 + global.get $~lib/util/number/_exp + local.set $26 + local.get $15 + local.set $13 + local.get $26 + local.get $13 + i32.add + i32.const 64 + i32.add + local.set $26 + global.get $~lib/util/number/_frc_minus + local.set $17 + local.get $12 + local.set $11 + local.get $17 + i64.const 4294967295 + i64.and + local.set $18 + local.get $11 + i64.const 4294967295 + i64.and + local.set $19 + local.get $17 + i64.const 32 + i64.shr_u + local.set $20 + local.get $11 + i64.const 32 + i64.shr_u + local.set $21 + local.get $18 + local.get $19 + i64.mul + local.set $22 + local.get $20 + local.get $19 + i64.mul + local.get $22 + i64.const 32 + i64.shr_u + i64.add + local.set $23 + local.get $18 + local.get $21 + i64.mul + local.get $23 + i64.const 4294967295 + i64.and + i64.add + local.set $27 + local.get $27 + i64.const 2147483647 + i64.add + local.set $27 + local.get $23 + i64.const 32 + i64.shr_u + local.set $23 + local.get $27 + i64.const 32 + i64.shr_u + local.set $27 + local.get $20 + local.get $21 + i64.mul + local.get $23 + i64.add + local.get $27 + i64.add + i64.const 1 + i64.add + local.set $27 + local.get $25 + local.get $27 + i64.sub + local.set $23 + local.get $4 + local.get $24 + local.get $10 + local.get $25 + local.get $26 + local.get $23 + local.get $3 + call $~lib/util/number/genDigits + local.set $28 + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $28 + local.get $2 + i32.sub + global.get $~lib/util/number/_K + call $~lib/util/number/prettify + local.set $28 + local.get $28 + local.get $2 + i32.add + ) + (func $~lib/string/String#substring (; 42 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + local.get $0 + call $~lib/string/String#get:length + local.set $3 + local.get $1 + local.tee $4 + i32.const 0 + local.tee $5 + local.get $4 + local.get $5 + i32.gt_s + select + local.tee $4 + local.get $3 + local.tee $5 + local.get $4 + local.get $5 + i32.lt_s + select + local.set $6 + local.get $2 + local.tee $4 + i32.const 0 + local.tee $5 + local.get $4 + local.get $5 + i32.gt_s + select + local.tee $4 + local.get $3 + local.tee $5 + local.get $4 + local.get $5 + i32.lt_s + select + local.set $7 + local.get $6 + local.tee $4 + local.get $7 + local.tee $5 + local.get $4 + local.get $5 + i32.lt_s + select + i32.const 1 + i32.shl + local.set $8 + local.get $6 + local.tee $4 + local.get $7 + local.tee $5 + local.get $4 + local.get $5 + i32.gt_s + select + i32.const 1 + i32.shl + local.set $9 + local.get $9 + local.get $8 + i32.sub + local.set $3 + local.get $3 + i32.eqz + if + i32.const 2000 + call $~lib/rt/pure/__retain + return + end + local.get $8 + i32.eqz + if (result i32) + local.get $9 + local.get $0 + call $~lib/string/String#get:length + i32.const 1 + i32.shl + i32.eq + else + i32.const 0 + end + if + local.get $0 + call $~lib/rt/pure/__retain + return + end + local.get $3 + i32.const 1 + call $~lib/rt/tlsf/__alloc + local.set $10 + local.get $10 + local.get $0 + local.get $8 + i32.add + local.get $3 + call $~lib/memory/memory.copy + local.get $10 + call $~lib/rt/pure/__retain + ) + (func $~lib/util/number/dtoa (; 43 ;) (type $FUNCSIG$id) (param $0 f64) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + f64.const 0 + f64.eq + if + i32.const 824 + call $~lib/rt/pure/__retain + return + end + local.get $0 + call $~lib/number/isFinite + i32.eqz + if + local.get $0 + call $~lib/number/isNaN + if + i32.const 848 + call $~lib/rt/pure/__retain + return + end + i32.const 872 + i32.const 912 + local.get $0 + f64.const 0 + f64.lt + select + call $~lib/rt/pure/__retain + return + end + i32.const 28 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/tlsf/__alloc + local.set $1 + local.get $1 + local.get $0 + call $~lib/util/number/dtoa_core + local.set $2 + local.get $2 + i32.const 28 + i32.eq + if + local.get $1 + call $~lib/rt/pure/__retain + return + end + local.get $1 + i32.const 0 + local.get $2 + call $~lib/string/String#substring + local.set $3 + local.get $1 + call $~lib/rt/tlsf/__free + local.get $3 + ) + (func $~lib/number/F64#toString (; 44 ;) (type $FUNCSIG$idi) (param $0 f64) (param $1 i32) (result i32) + local.get $0 + call $~lib/util/number/dtoa + ) + (func $start:resolve-ternary~anonymous|0 (; 45 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 1 + i32.add + ) + (func $start:resolve-ternary~anonymous|1 (; 46 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 2 + i32.add + ) + (func $resolve-ternary/g1 (; 47 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 3 + i32.add + ) + (func $resolve-ternary/g2 (; 48 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 4 + i32.add + ) + (func $start:resolve-ternary (; 49 ;) (type $FUNCSIG$v) + (local $0 i32) + (local $1 i32) + global.get $resolve-ternary/b + if (result i32) + i32.const 1 + else + i32.const 2 + end + call $~lib/number/I32#toString + local.tee $0 + i32.const 744 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 768 + i32.const 5 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + global.get $resolve-ternary/b + if (result f64) + f64.const 1 + else + f64.const 2 + end + i32.const 0 + call $~lib/number/F64#toString + local.tee $1 + i32.const 2016 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 768 + i32.const 13 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + global.set $~lib/argc + i32.const 1 + global.get $resolve-ternary/b + if (result i32) + i32.const 1 + else + i32.const 2 + end + call_indirect (type $FUNCSIG$ii) + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 768 + i32.const 24 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + global.set $~lib/argc + i32.const 1 + global.get $resolve-ternary/b + if (result i32) + i32.const 3 + else + i32.const 4 + end + call_indirect (type $FUNCSIG$ii) + i32.const 4 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 768 + i32.const 35 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + global.set $~lib/argc + i32.const 1 + global.get $resolve-ternary/b + if (result i32) + i32.const 2 + else + i32.const 4 + end + call_indirect (type $FUNCSIG$ii) + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 768 + i32.const 43 + i32.const 0 + call $~lib/builtins/abort + unreachable + end + local.get $0 + call $~lib/rt/pure/__release + local.get $1 + call $~lib/rt/pure/__release + ) + (func $start (; 50 ;) (type $FUNCSIG$v) + call $start:resolve-ternary + ) + (func $~lib/array/Array#__visit_impl (; 51 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) + nop + ) + (func $~lib/array/Array#__visit_impl (; 52 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) + nop + ) + (func $~lib/array/Array#__visit_impl (; 53 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) + nop + ) + (func $~lib/rt/pure/__visit (; 54 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + global.get $~lib/heap/__heap_base + i32.lt_u + if + return + end + local.get $0 + i32.const 16 + i32.sub + local.set $2 + block $break|0 + block $case5|0 + block $case4|0 + block $case3|0 + block $case2|0 + block $case1|0 + block $case0|0 + local.get $1 + local.set $3 + local.get $3 + i32.const 1 + i32.eq + br_if $case0|0 + local.get $3 + i32.const 2 + i32.eq + br_if $case1|0 + local.get $3 + i32.const 3 + i32.eq + br_if $case2|0 + local.get $3 + i32.const 4 + i32.eq + br_if $case3|0 + local.get $3 + i32.const 5 + i32.eq + br_if $case4|0 + br $case5|0 + end + local.get $2 + call $~lib/rt/pure/decrement + br $break|0 + end + local.get $2 + i32.load offset=4 + i32.const 268435455 + i32.and + i32.const 0 + i32.gt_u + i32.eqz + if + i32.const 0 + i32.const 128 + i32.const 75 + i32.const 17 + call $~lib/builtins/abort + unreachable + end + local.get $2 + local.get $2 + i32.load offset=4 + i32.const 1 + i32.sub + i32.store offset=4 + local.get $2 + call $~lib/rt/pure/markGray + br $break|0 + end + local.get $2 + call $~lib/rt/pure/scan + br $break|0 + end + local.get $2 + i32.load offset=4 + local.set $3 + local.get $3 + i32.const -268435456 + i32.and + local.get $3 + i32.const 1 + i32.add + i32.const -268435456 + i32.and + i32.eq + i32.eqz + if + i32.const 0 + i32.const 128 + i32.const 86 + i32.const 6 + call $~lib/builtins/abort + unreachable + end + local.get $2 + local.get $3 + i32.const 1 + i32.add + i32.store offset=4 + local.get $3 + i32.const 1879048192 + i32.and + i32.const 0 + i32.ne + if + local.get $2 + call $~lib/rt/pure/scanBlack + end + br $break|0 + end + local.get $2 + call $~lib/rt/pure/collectWhite + br $break|0 + end + i32.const 0 + i32.eqz + if + i32.const 0 + i32.const 128 + i32.const 97 + i32.const 24 + call $~lib/builtins/abort + unreachable + end + end + ) + (func $~lib/rt/__visit_members (; 55 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) + (local $2 i32) + block $block$4$break + block $switch$1$default + block $switch$1$case$7 + block $switch$1$case$6 + block $switch$1$case$5 + block $switch$1$case$4 + block $switch$1$case$2 + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $switch$1$case$2 $switch$1$case$2 $switch$1$case$4 $switch$1$case$5 $switch$1$case$6 $switch$1$case$7 $switch$1$default + end + return + end + br $block$4$break + end + local.get $0 + local.get $1 + call $~lib/array/Array#__visit_impl + br $block$4$break + end + local.get $0 + local.get $1 + call $~lib/array/Array#__visit_impl + br $block$4$break + end + local.get $0 + local.get $1 + call $~lib/array/Array#__visit_impl + br $block$4$break + end + unreachable + end + local.get $0 + i32.load + local.tee $2 + if + local.get $2 + local.get $1 + call $~lib/rt/pure/__visit + end + return + ) + (func $null (; 56 ;) (type $FUNCSIG$v) + ) +) diff --git a/tests/resolve-ternary.json b/tests/resolve-ternary.json new file mode 100644 index 0000000000..453cb07770 --- /dev/null +++ b/tests/resolve-ternary.json @@ -0,0 +1,5 @@ +{ + "asc_flags": [ + "--runtime none" + ] +}