diff --git a/src/compiler.ts b/src/compiler.ts index e035cab8ca..84dbaa101b 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8146,16 +8146,71 @@ export class Compiler extends DiagnosticEmitter { var expressions = expression.expressions; assert(numParts - 1 == expressions.length); - // Shortcut if just a (multi-line) string - if (tag === null && numParts == 1) { - return this.ensureStaticString(parts[0]); - } - var module = this.module; - var stringType = this.program.stringInstance.type; + var stringInstance = this.program.stringInstance; + var stringType = stringInstance.type; - // Compile to a `StaticArray#join("")` if untagged if (tag === null) { + // Shortcut if just a (multi-line) string + if (numParts == 1) { + return this.ensureStaticString(parts[0]); + } + + // Shortcut for `${expr}`, `${expr}`, `${expr}` + if (numParts == 2) { + let expression = expressions[0]; + let lhsLen = parts[0].length; + let rhsLen = parts[1].length; + // Shortcut for `${expr}` -> expr.toString() + if (!lhsLen && !rhsLen) { + return this.makeToString( + this.compileExpression(expression, stringType), + this.currentType, expression + ); + } + // Shortcuts for + // `${expr}` -> "" + expr.toString() + // `${expr}` -> expr.toString() + "" + let hasPrefix = lhsLen != 0; + // @ts-ignore: cast + if (hasPrefix ^ (rhsLen != 0)) { + let lhs: ExpressionRef; + let rhs: ExpressionRef; + let expr = this.makeToString( + this.compileExpression(expression, stringType), + this.currentType, expression + ); + if (hasPrefix) { + lhs = this.ensureStaticString(parts[0]); + rhs = expr; + } else { + // suffix + lhs = expr; + rhs = this.ensureStaticString(parts[1]); + } + let concatMethod = assert(stringInstance.getMethod("concat")); + return this.makeCallDirect(concatMethod, [ lhs, rhs ], expression); + } + } + + // Shortcut for `${exprA}${exprB}` -> exprA.toString() + exprB.toString() + if (numParts == 3 && !parts[0].length && !parts[1].length && !parts[2].length) { + let exprA = expressions[0]; + let exprB = expressions[1]; + + let lhs = this.makeToString( + this.compileExpression(exprA, stringType), + this.currentType, exprA + ); + let rhs = this.makeToString( + this.compileExpression(exprB, stringType), + this.currentType, exprB + ); + let concatMethod = assert(stringInstance.getMethod("concat")); + return this.makeCallDirect(concatMethod, [ lhs, rhs ], expression); + } + + // Compile to a `StaticArray#join("") for general case let length = 2 * numParts - 1; let values = new Array(length); values[0] = this.ensureStaticString(parts[0]); @@ -8168,26 +8223,22 @@ export class Compiler extends DiagnosticEmitter { let offset = i64_add(segment.offset, i64_new(this.program.totalOverhead)); let joinInstance = assert(arrayInstance.getMethod("join")); let indexedSetInstance = assert(arrayInstance.lookupOverload(OperatorKind.INDEXED_SET, true)); - let stmts = new Array(); + let stmts = new Array(numParts); for (let i = 0, k = numParts - 1; i < k; ++i) { let expression = expressions[i]; - stmts.push( - this.makeCallDirect(indexedSetInstance, [ - module.usize(offset), - module.i32(2 * i + 1), - this.makeToString( - this.compileExpression(expression, stringType), - this.currentType, expression - ) - ], expression) - ); - } - stmts.push( - this.makeCallDirect(joinInstance, [ + stmts[i] = this.makeCallDirect(indexedSetInstance, [ module.usize(offset), - this.ensureStaticString("") - ], expression) - ); + module.i32(2 * i + 1), + this.makeToString( + this.compileExpression(expression, stringType), + this.currentType, expression + ) + ], expression); + } + stmts[numParts - 1] = this.makeCallDirect(joinInstance, [ + module.usize(offset), + this.ensureStaticString("") + ], expression); return module.flatten(stmts, stringType.toRef()); } @@ -8200,7 +8251,12 @@ export class Compiler extends DiagnosticEmitter { if (target) { switch (target.kind) { case ElementKind.FUNCTION_PROTOTYPE: { - let instance = this.resolver.resolveFunction(target, null, uniqueMap(), ReportMode.SWALLOW); + let instance = this.resolver.resolveFunction( + target, + null, + uniqueMap(), + ReportMode.SWALLOW + ); if (!instance) break; target = instance; // fall-through diff --git a/tests/compiler/templateliteral.optimized.wat b/tests/compiler/templateliteral.optimized.wat index dbe75c87b0..c72f01d654 100644 --- a/tests/compiler/templateliteral.optimized.wat +++ b/tests/compiler/templateliteral.optimized.wat @@ -1,9 +1,9 @@ (module + (type $none_=>_none (func)) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) + (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 (func (param i32 i32) (result i32))) (type $i32_i32_=>_none (func (param i32 i32))) (type $f64_=>_i32 (func (param f64) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) @@ -11,14 +11,14 @@ (type $i64_i32_i64_i32_i64_i32_=>_i32 (func (param i64 i32 i64 i32 i64 i32) (result i32))) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~lib/util/number/_frc_plus (mut i64) (i64.const 0)) @@ -27,107 +27,275 @@ (global $~lib/util/number/_K (mut i32) (i32.const 0)) (global $~lib/util/number/_frc_pow (mut i64) (i64.const 0)) (global $~lib/util/number/_exp_pow (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 22028)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 21964)) (global $~started (mut i32) (i32.const 0)) (memory $0 1) (data (i32.const 1036) "\1c") (data (i32.const 1048) "\01\00\00\00\02\00\00\00a") (data (i32.const 1068) "\1c") (data (i32.const 1080) "\01\00\00\00\02\00\00\00b") - (data (i32.const 1100) "\1c") - (data (i32.const 1112) "\01") - (data (i32.const 1132) "\1c") - (data (i32.const 1144) "\03\00\00\00\0c\00\00\00`\04\00\00\00\00\00\00`\04") - (data (i32.const 1164) "<") - (data (i32.const 1176) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s") + (data (i32.const 1100) "<") + (data (i32.const 1112) "\01\00\00\00$\00\00\00t\00e\00m\00p\00l\00a\00t\00e\00l\00i\00t\00e\00r\00a\00l\00.\00t\00s") + (data (i32.const 1164) "\1c") + (data (i32.const 1176) "\01") + (data (i32.const 1196) "<") + (data (i32.const 1208) "\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 1260) "<") - (data (i32.const 1272) "\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 1324) ",") - (data (i32.const 1336) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") - (data (i32.const 1372) "<") - (data (i32.const 1384) "\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 1500) "<") - (data (i32.const 1512) "\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 1564) "<") - (data (i32.const 1576) "\01\00\00\00$\00\00\00t\00e\00m\00p\00l\00a\00t\00e\00l\00i\00t\00e\00r\00a\00l\00.\00t\00s") - (data (i32.const 1628) ",") - (data (i32.const 1640) "\03\00\00\00\14\00\00\00`\04\00\00\00\00\00\00`\04\00\00\00\00\00\00`\04") - (data (i32.const 1676) "\1c") - (data (i32.const 1688) "\01\00\00\00\04\00\00\00a\00b") - (data (i32.const 1708) "\1c") - (data (i32.const 1720) "\01\00\00\00\06\00\00\00(\00A\00=") - (data (i32.const 1740) "\1c") - (data (i32.const 1752) "\01\00\00\00\08\00\00\00,\00 \00B\00=") - (data (i32.const 1772) "\1c") - (data (i32.const 1784) "\01\00\00\00\02\00\00\00)") - (data (i32.const 1804) ",") - (data (i32.const 1816) "\03\00\00\00\14\00\00\00\c0\06\00\00\00\00\00\00\e0\06\00\00\00\00\00\00\00\07") - (data (i32.const 1852) ",") - (data (i32.const 1864) "\01\00\00\00\14\00\00\00(\00A\00=\00a\00,\00 \00B\00=\00b\00)") - (data (i32.const 1900) "\1c") - (data (i32.const 1912) "\03\00\00\00\0c\00\00\00`\04\00\00\00\00\00\00`\04") - (data (i32.const 1932) "|") - (data (i32.const 1944) "\01\00\00\00d\00\00\00t\00o\00S\00t\00r\00i\00n\00g\00(\00)\00 \00r\00a\00d\00i\00x\00 \00a\00r\00g\00u\00m\00e\00n\00t\00 \00m\00u\00s\00t\00 \00b\00e\00 \00b\00e\00t\00w\00e\00e\00n\00 \002\00 \00a\00n\00d\00 \003\006") - (data (i32.const 2060) "<") - (data (i32.const 2072) "\01\00\00\00&\00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00n\00u\00m\00b\00e\00r\00.\00t\00s") - (data (i32.const 2124) "\1c") - (data (i32.const 2136) "\01\00\00\00\02\00\00\000") - (data (i32.const 2156) "0\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") - (data (i32.const 2556) "\1c\04") - (data (i32.const 2568) "\01\00\00\00\00\04\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\000\00a\000\00b\000\00c\000\00d\000\00e\000\00f\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\001\00a\001\00b\001\00c\001\00d\001\00e\001\00f\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\002\00a\002\00b\002\00c\002\00d\002\00e\002\00f\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\003\00a\003\00b\003\00c\003\00d\003\00e\003\00f\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\004\00a\004\00b\004\00c\004\00d\004\00e\004\00f\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\005\00a\005\00b\005\00c\005\00d\005\00e\005\00f\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\006\00a\006\00b\006\00c\006\00d\006\00e\006\00f\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\007\00a\007\00b\007\00c\007\00d\007\00e\007\00f\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\008\00a\008\00b\008\00c\008\00d\008\00e\008\00f\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\009\00a\009\00b\009\00c\009\00d\009\00e\009\00f\00a\000\00a\001\00a\002\00a\003\00a\004\00a\005\00a\006\00a\007\00a\008\00a\009\00a\00a\00a\00b\00a\00c\00a\00d\00a\00e\00a\00f\00b\000\00b\001\00b\002\00b\003\00b\004\00b\005\00b\006\00b\007\00b\008\00b\009\00b\00a\00b\00b\00b\00c\00b\00d\00b\00e\00b\00f\00c\000\00c\001\00c\002\00c\003\00c\004\00c\005\00c\006\00c\007\00c\008\00c\009\00c\00a\00c\00b\00c\00c\00c\00d\00c\00e\00c\00f\00d\000\00d\001\00d\002\00d\003\00d\004\00d\005\00d\006\00d\007\00d\008\00d\009\00d\00a\00d\00b\00d\00c\00d\00d\00d\00e\00d\00f\00e\000\00e\001\00e\002\00e\003\00e\004\00e\005\00e\006\00e\007\00e\008\00e\009\00e\00a\00e\00b\00e\00c\00e\00d\00e\00e\00e\00f\00f\000\00f\001\00f\002\00f\003\00f\004\00f\005\00f\006\00f\007\00f\008\00f\009\00f\00a\00f\00b\00f\00c\00f\00d\00f\00e\00f\00f") - (data (i32.const 3612) "\\") - (data (i32.const 3624) "\01\00\00\00H\00\00\000\001\002\003\004\005\006\007\008\009\00a\00b\00c\00d\00e\00f\00g\00h\00i\00j\00k\00l\00m\00n\00o\00p\00q\00r\00s\00t\00u\00v\00w\00x\00y\00z") - (data (i32.const 3708) "\1c") - (data (i32.const 3720) "\01\00\00\00\02\00\00\001") - (data (i32.const 3740) ",") - (data (i32.const 3752) "\03\00\00\00\14\00\00\00`\04\00\00\00\00\00\00`\04\00\00\00\00\00\00`\04") + (data (i32.const 1272) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s") + (data (i32.const 1388) "<") + (data (i32.const 1400) "\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 1452) ",") + (data (i32.const 1464) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") + (data (i32.const 1532) "<") + (data (i32.const 1544) "\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 1596) "\1c") + (data (i32.const 1608) "\01\00\00\00\04\00\00\00a\00b") + (data (i32.const 1628) "\1c") + (data (i32.const 1640) "\01\00\00\00\06\00\00\00(\00A\00=") + (data (i32.const 1660) "\1c") + (data (i32.const 1672) "\01\00\00\00\08\00\00\00,\00 \00B\00=") + (data (i32.const 1692) "\1c") + (data (i32.const 1704) "\01\00\00\00\02\00\00\00)") + (data (i32.const 1724) ",") + (data (i32.const 1736) "\03\00\00\00\14\00\00\00p\06\00\00\00\00\00\00\90\06\00\00\00\00\00\00\b0\06") + (data (i32.const 1772) ",") + (data (i32.const 1784) "\01\00\00\00\14\00\00\00(\00A\00=\00a\00,\00 \00B\00=\00b\00)") + (data (i32.const 1820) "|") + (data (i32.const 1832) "\01\00\00\00d\00\00\00t\00o\00S\00t\00r\00i\00n\00g\00(\00)\00 \00r\00a\00d\00i\00x\00 \00a\00r\00g\00u\00m\00e\00n\00t\00 \00m\00u\00s\00t\00 \00b\00e\00 \00b\00e\00t\00w\00e\00e\00n\00 \002\00 \00a\00n\00d\00 \003\006") + (data (i32.const 1948) "<") + (data (i32.const 1960) "\01\00\00\00&\00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00n\00u\00m\00b\00e\00r\00.\00t\00s") + (data (i32.const 2012) "\1c") + (data (i32.const 2024) "\01\00\00\00\02\00\00\000") + (data (i32.const 2044) "0\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") + (data (i32.const 2444) "\1c\04") + (data (i32.const 2456) "\01\00\00\00\00\04\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\000\00a\000\00b\000\00c\000\00d\000\00e\000\00f\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\001\00a\001\00b\001\00c\001\00d\001\00e\001\00f\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\002\00a\002\00b\002\00c\002\00d\002\00e\002\00f\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\003\00a\003\00b\003\00c\003\00d\003\00e\003\00f\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\004\00a\004\00b\004\00c\004\00d\004\00e\004\00f\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\005\00a\005\00b\005\00c\005\00d\005\00e\005\00f\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\006\00a\006\00b\006\00c\006\00d\006\00e\006\00f\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\007\00a\007\00b\007\00c\007\00d\007\00e\007\00f\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\008\00a\008\00b\008\00c\008\00d\008\00e\008\00f\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\009\00a\009\00b\009\00c\009\00d\009\00e\009\00f\00a\000\00a\001\00a\002\00a\003\00a\004\00a\005\00a\006\00a\007\00a\008\00a\009\00a\00a\00a\00b\00a\00c\00a\00d\00a\00e\00a\00f\00b\000\00b\001\00b\002\00b\003\00b\004\00b\005\00b\006\00b\007\00b\008\00b\009\00b\00a\00b\00b\00b\00c\00b\00d\00b\00e\00b\00f\00c\000\00c\001\00c\002\00c\003\00c\004\00c\005\00c\006\00c\007\00c\008\00c\009\00c\00a\00c\00b\00c\00c\00c\00d\00c\00e\00c\00f\00d\000\00d\001\00d\002\00d\003\00d\004\00d\005\00d\006\00d\007\00d\008\00d\009\00d\00a\00d\00b\00d\00c\00d\00d\00d\00e\00d\00f\00e\000\00e\001\00e\002\00e\003\00e\004\00e\005\00e\006\00e\007\00e\008\00e\009\00e\00a\00e\00b\00e\00c\00e\00d\00e\00e\00e\00f\00f\000\00f\001\00f\002\00f\003\00f\004\00f\005\00f\006\00f\007\00f\008\00f\009\00f\00a\00f\00b\00f\00c\00f\00d\00f\00e\00f\00f") + (data (i32.const 3500) "\\") + (data (i32.const 3512) "\01\00\00\00H\00\00\000\001\002\003\004\005\006\007\008\009\00a\00b\00c\00d\00e\00f\00g\00h\00i\00j\00k\00l\00m\00n\00o\00p\00q\00r\00s\00t\00u\00v\00w\00x\00y\00z") + (data (i32.const 3596) "\1c") + (data (i32.const 3608) "\01\00\00\00\02\00\00\001") + (data (i32.const 3628) "\1c") + (data (i32.const 3640) "\01\00\00\00\04\00\00\001\002") + (data (i32.const 3660) ",") + (data (i32.const 3672) "\03\00\00\00\14\00\00\00p\06\00\00\00\00\00\00\90\06\00\00\00\00\00\00\b0\06") + (data (i32.const 3708) ",") + (data (i32.const 3720) "\01\00\00\00\14\00\00\00(\00A\00=\001\00,\00 \00B\00=\002\00)") + (data (i32.const 3756) "\1c") + (data (i32.const 3768) "\01\00\00\00\06\00\00\000\00.\000") (data (i32.const 3788) "\1c") - (data (i32.const 3800) "\01\00\00\00\04\00\00\001\002") + (data (i32.const 3800) "\01\00\00\00\06\00\00\00N\00a\00N") (data (i32.const 3820) ",") - (data (i32.const 3832) "\03\00\00\00\14\00\00\00\c0\06\00\00\00\00\00\00\e0\06\00\00\00\00\00\00\00\07") + (data (i32.const 3832) "\01\00\00\00\12\00\00\00-\00I\00n\00f\00i\00n\00i\00t\00y") (data (i32.const 3868) ",") - (data (i32.const 3880) "\01\00\00\00\14\00\00\00(\00A\00=\001\00,\00 \00B\00=\002\00)") - (data (i32.const 3916) "\1c") - (data (i32.const 3928) "\03\00\00\00\0c\00\00\00`\04\00\00\00\00\00\00`\04") - (data (i32.const 3948) "\1c") - (data (i32.const 3960) "\01\00\00\00\06\00\00\000\00.\000") - (data (i32.const 3980) "\1c") - (data (i32.const 3992) "\01\00\00\00\06\00\00\00N\00a\00N") - (data (i32.const 4012) ",") - (data (i32.const 4024) "\01\00\00\00\12\00\00\00-\00I\00n\00f\00i\00n\00i\00t\00y") - (data (i32.const 4060) ",") - (data (i32.const 4072) "\01\00\00\00\10\00\00\00I\00n\00f\00i\00n\00i\00t\00y") - (data (i32.const 4168) "\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\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#__uset (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/rt/itcms/__visit (param $0 i32) local.get $0 - local.get $1 - i32.const 2 - i32.shl - i32.add - local.get $2 - i32.store - local.get $2 - local.tee $1 + i32.eqz + if + return + end + global.get $~lib/rt/itcms/white + local.get $0 + i32.const 20 + i32.sub + local.tee $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.eq if local.get $0 - i32.eqz - if - i32.const 0 - i32.const 1184 - i32.const 294 - i32.const 14 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/rt/itcms/white - local.get $1 - i32.const 20 - i32.sub - local.tee $1 - i32.load offset=4 - i32.const 3 - i32.and - i32.eq - if - local.get $0 - i32.const 20 - i32.sub - local.tee $0 - i32.load offset=4 - i32.const 3 - i32.and - local.tee $2 - global.get $~lib/rt/itcms/white - i32.eqz - i32.eq - if - local.get $0 - call $~lib/rt/itcms/Object#makeGray - else - global.get $~lib/rt/itcms/state - i32.const 1 - i32.eq - i32.const 0 - local.get $2 - i32.const 3 - i32.eq - select - if - local.get $1 - call $~lib/rt/itcms/Object#makeGray - end - end - end - end - ) - (func $~lib/rt/itcms/visitRoots - (local $0 i32) - (local $1 i32) - i32.const 1280 - call $~lib/rt/itcms/__visit - i32.const 1392 - call $~lib/rt/itcms/__visit - i32.const 2576 - call $~lib/rt/itcms/__visit - i32.const 3632 - call $~lib/rt/itcms/__visit - global.get $~lib/rt/itcms/pinSpace - local.tee $1 - i32.load offset=4 - i32.const -4 - i32.and - local.set $0 - loop $while-continue|0 - local.get $0 - local.get $1 - i32.ne - if - local.get $0 - i32.load offset=4 - i32.const 3 - i32.and - i32.const 3 - i32.ne - if - i32.const 0 - i32.const 1184 - i32.const 159 - i32.const 16 - call $~lib/builtins/abort - unreachable - end - local.get $0 - i32.const 20 - i32.add - call $~lib/rt/__visit_members - local.get $0 - i32.load offset=4 - i32.const -4 - i32.and - local.set $0 - br $while-continue|0 - end - end - ) - (func $~lib/rt/itcms/__visit (param $0 i32) - local.get $0 - i32.eqz - if - return - end - global.get $~lib/rt/itcms/white - local.get $0 - i32.const 20 - i32.sub - local.tee $0 - i32.load offset=4 - i32.const 3 - i32.and - i32.eq - if - local.get $0 - call $~lib/rt/itcms/Object#makeGray - global.get $~lib/rt/itcms/visitCount - i32.const 1 - i32.add - global.set $~lib/rt/itcms/visitCount + call $~lib/rt/itcms/Object#makeGray + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.add + global.set $~lib/rt/itcms/visitCount end ) (func $~lib/rt/tlsf/removeBlock (param $0 i32) (param $1 i32) @@ -410,7 +467,7 @@ i32.eqz if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 268 i32.const 14 call $~lib/builtins/abort @@ -424,7 +481,7 @@ i32.lt_u if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 270 i32.const 14 call $~lib/builtins/abort @@ -474,7 +531,7 @@ i32.eqz if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 284 i32.const 14 call $~lib/builtins/abort @@ -564,7 +621,7 @@ i32.eqz if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 201 i32.const 14 call $~lib/builtins/abort @@ -578,7 +635,7 @@ i32.eqz if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 203 i32.const 14 call $~lib/builtins/abort @@ -639,7 +696,7 @@ i32.eqz if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 221 i32.const 16 call $~lib/builtins/abort @@ -672,7 +729,7 @@ i32.lt_u if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 233 i32.const 14 call $~lib/builtins/abort @@ -687,7 +744,7 @@ i32.ne if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 234 i32.const 14 call $~lib/builtins/abort @@ -739,7 +796,7 @@ i32.eqz if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 251 i32.const 14 call $~lib/builtins/abort @@ -809,7 +866,7 @@ i32.gt_u if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 377 i32.const 14 call $~lib/builtins/abort @@ -837,7 +894,7 @@ i32.lt_u if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 384 i32.const 16 call $~lib/builtins/abort @@ -865,7 +922,7 @@ i32.lt_u if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 397 i32.const 5 call $~lib/builtins/abort @@ -933,10 +990,10 @@ if unreachable end - i32.const 22032 + i32.const 21968 i32.const 0 i32.store - i32.const 23600 + i32.const 23536 i32.const 0 i32.store loop $for-loop|0 @@ -947,7 +1004,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 22032 + i32.const 21968 i32.add i32.const 0 i32.store offset=4 @@ -965,7 +1022,7 @@ i32.add i32.const 2 i32.shl - i32.const 22032 + i32.const 21968 i32.add i32.const 0 i32.store offset=96 @@ -983,13 +1040,13 @@ br $for-loop|0 end end - i32.const 22032 - i32.const 23604 + i32.const 21968 + i32.const 23540 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 22032 + i32.const 21968 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1073,7 +1130,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 22028 + i32.const 21964 i32.lt_u if local.get $0 @@ -1161,14 +1218,14 @@ i32.ne if i32.const 0 - i32.const 1184 + i32.const 1280 i32.const 228 i32.const 20 call $~lib/builtins/abort unreachable end local.get $0 - i32.const 22028 + i32.const 21964 i32.lt_u if local.get $0 @@ -1191,7 +1248,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 22028 + i32.const 21964 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1220,7 +1277,7 @@ end if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 559 i32.const 3 call $~lib/builtins/abort @@ -1313,7 +1370,7 @@ i32.eqz if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 330 i32.const 14 call $~lib/builtins/abort @@ -1365,7 +1422,7 @@ i32.eqz if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 343 i32.const 18 call $~lib/builtins/abort @@ -1397,8 +1454,8 @@ i32.const 1073741804 i32.ge_u if - i32.const 1392 - i32.const 1184 + i32.const 1216 + i32.const 1280 i32.const 260 i32.const 31 call $~lib/builtins/abort @@ -1464,8 +1521,8 @@ i32.const 1073741820 i32.gt_u if - i32.const 1392 - i32.const 1520 + i32.const 1216 + i32.const 1552 i32.const 458 i32.const 29 call $~lib/builtins/abort @@ -1560,7 +1617,7 @@ i32.eqz if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 496 i32.const 16 call $~lib/builtins/abort @@ -1575,7 +1632,7 @@ i32.gt_u if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 498 i32.const 14 call $~lib/builtins/abort @@ -1594,7 +1651,7 @@ i32.and if i32.const 0 - i32.const 1520 + i32.const 1552 i32.const 357 i32.const 14 call $~lib/builtins/abort @@ -2822,6 +2879,68 @@ end end ) + (func $~lib/staticarray/StaticArray<~lib/string/String>#__uset (param $0 i32) (param $1 i32) (param $2 i32) + local.get $0 + local.get $1 + i32.const 2 + i32.shl + i32.add + local.get $2 + i32.store + local.get $2 + local.tee $1 + if + local.get $0 + i32.eqz + if + i32.const 0 + i32.const 1280 + i32.const 294 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/rt/itcms/white + local.get $1 + i32.const 20 + i32.sub + local.tee $1 + i32.load offset=4 + i32.const 3 + i32.and + i32.eq + if + local.get $0 + i32.const 20 + i32.sub + local.tee $0 + i32.load offset=4 + i32.const 3 + i32.and + local.tee $2 + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + if + local.get $0 + call $~lib/rt/itcms/Object#makeGray + else + global.get $~lib/rt/itcms/state + i32.const 1 + i32.eq + i32.const 0 + local.get $2 + i32.const 3 + i32.eq + select + if + local.get $1 + call $~lib/rt/itcms/Object#makeGray + end + end + end + end + ) (func $~lib/staticarray/StaticArray<~lib/string/String>#join (param $0 i32) (result i32) (local $1 i32) (local $2 i32) @@ -2841,11 +2960,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5580 i32.lt_s if - i32.const 22048 - i32.const 22096 + i32.const 21984 + i32.const 22032 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2870,7 +2989,7 @@ i32.const 12 i32.add global.set $~lib/memory/__stack_pointer - i32.const 1120 + i32.const 1184 local.set $2 br $__inlined_func$~lib/util/string/joinStringArray end @@ -2888,7 +3007,7 @@ i32.add global.set $~lib/memory/__stack_pointer local.get $0 - i32.const 1120 + i32.const 1184 local.get $0 select local.set $2 @@ -2930,7 +3049,7 @@ global.get $~lib/memory/__stack_pointer local.get $2 local.get $6 - i32.const 1116 + i32.const 1180 i32.load i32.const 1 i32.shr_u @@ -2989,7 +3108,7 @@ i32.const 1 i32.shl i32.add - i32.const 1120 + i32.const 1184 local.get $5 i32.const 1 i32.shl @@ -3040,212 +3159,93 @@ end local.get $2 ) - (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) + (func $~lib/util/number/utoa32_dec_lut (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) - (local $4 i32) - local.get $0 - local.get $1 - i32.eq - if - i32.const 1 - return + loop $while-continue|0 + local.get $1 + i32.const 10000 + i32.ge_u + if + local.get $1 + i32.const 10000 + i32.rem_u + local.set $3 + local.get $1 + i32.const 10000 + i32.div_u + local.set $1 + local.get $0 + local.get $2 + i32.const 4 + i32.sub + local.tee $2 + i32.const 1 + i32.shl + i32.add + local.get $3 + i32.const 100 + i32.div_u + i32.const 2 + i32.shl + i32.const 2044 + i32.add + i64.load32_u + local.get $3 + i32.const 100 + i32.rem_u + i32.const 2 + i32.shl + i32.const 2044 + i32.add + i64.load32_u + i64.const 32 + i64.shl + i64.or + i64.store + br $while-continue|0 + end end local.get $1 - i32.const 0 - local.get $0 - select - i32.eqz + i32.const 100 + i32.ge_u if - i32.const 0 - return + local.get $0 + local.get $2 + i32.const 2 + i32.sub + local.tee $2 + i32.const 1 + i32.shl + i32.add + local.get $1 + i32.const 100 + i32.rem_u + i32.const 2 + i32.shl + i32.const 2044 + i32.add + i32.load + i32.store + local.get $1 + i32.const 100 + i32.div_u + local.set $1 end - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - local.tee $4 local.get $1 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - i32.ne + i32.const 10 + i32.ge_u if - i32.const 0 - return - end - block $__inlined_func$~lib/util/string/compareImpl (result i32) local.get $0 - local.set $2 - local.get $1 - local.set $3 local.get $2 - i32.const 7 - i32.and - local.get $3 - i32.const 7 - i32.and - i32.or - i32.const 1 - local.get $4 - local.tee $0 - i32.const 4 - i32.ge_u - select - i32.eqz - if - loop $do-continue|0 - local.get $2 - i64.load - local.get $3 - i64.load - i64.eq - if - local.get $2 - i32.const 8 - i32.add - local.set $2 - 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-continue|0 - end - end - end - loop $while-continue|1 - local.get $0 - local.tee $1 - i32.const 1 - i32.sub - local.set $0 - local.get $1 - if - local.get $2 - i32.load16_u - local.tee $1 - local.get $3 - i32.load16_u - local.tee $4 - i32.ne - if - local.get $1 - local.get $4 - i32.sub - br $__inlined_func$~lib/util/string/compareImpl - end - local.get $2 - i32.const 2 - i32.add - local.set $2 - local.get $3 - i32.const 2 - i32.add - local.set $3 - br $while-continue|1 - end - end - i32.const 0 - end - i32.eqz - ) - (func $~lib/util/number/utoa32_dec_lut (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - loop $while-continue|0 - local.get $1 - i32.const 10000 - i32.ge_u - if - local.get $1 - i32.const 10000 - i32.rem_u - local.set $3 - local.get $1 - i32.const 10000 - i32.div_u - local.set $1 - local.get $0 - local.get $2 - i32.const 4 - i32.sub - local.tee $2 - i32.const 1 - i32.shl - i32.add - local.get $3 - i32.const 100 - i32.div_u - i32.const 2 - i32.shl - i32.const 2156 - i32.add - i64.load32_u - local.get $3 - i32.const 100 - i32.rem_u - i32.const 2 - i32.shl - i32.const 2156 - i32.add - i64.load32_u - i64.const 32 - i64.shl - i64.or - i64.store - br $while-continue|0 - end - end - local.get $1 - i32.const 100 - i32.ge_u - if - local.get $0 - local.get $2 - i32.const 2 - i32.sub - local.tee $2 - i32.const 1 - i32.shl - i32.add - local.get $1 - i32.const 100 - i32.rem_u - i32.const 2 - i32.shl - i32.const 2156 - i32.add - i32.load - i32.store - local.get $1 - i32.const 100 - i32.div_u - local.set $1 - end - local.get $1 - i32.const 10 - i32.ge_u - if - local.get $0 - local.get $2 - i32.const 2 - i32.sub + i32.const 2 + i32.sub i32.const 1 i32.shl i32.add local.get $1 i32.const 2 i32.shl - i32.const 2156 + i32.const 2044 i32.add i32.load i32.store @@ -3470,7 +3470,7 @@ local.get $5 i32.const 1 i32.shl - i32.const 4112 + i32.const 3920 i32.add local.get $3 i32.const 65535 @@ -3505,7 +3505,7 @@ local.get $7 i32.const 2 i32.shl - i32.const 5040 + i32.const 4848 i32.add i64.load32_u local.get $9 @@ -3515,7 +3515,7 @@ local.get $5 i32.const 1 i32.shl - i32.const 4110 + i32.const 3918 i32.add local.tee $7 i32.load16_u @@ -3595,7 +3595,7 @@ local.get $5 i32.const 1 i32.shl - i32.const 4112 + i32.const 3920 i32.add local.get $6 i32.wrap_i64 @@ -3633,7 +3633,7 @@ i32.sub i32.const 2 i32.shl - i32.const 5040 + i32.const 4848 i32.add i64.load32_u i64.mul @@ -3641,7 +3641,7 @@ local.get $5 i32.const 1 i32.shl - i32.const 4110 + i32.const 3918 i32.add local.tee $7 i32.load16_u @@ -4051,7 +4051,7 @@ f64.lt local.tee $8 if (result f64) - i32.const 4112 + i32.const 3920 i32.const 45 i32.store16 local.get $0 @@ -4152,14 +4152,14 @@ i32.sub global.set $~lib/util/number/_K local.get $9 - i32.const 4168 + i32.const 3976 i32.add i64.load global.set $~lib/util/number/_frc_pow local.get $5 i32.const 1 i32.shl - i32.const 4864 + i32.const 4672 i32.add i32.load16_s global.set $~lib/util/number/_exp_pow @@ -4191,7 +4191,7 @@ local.get $8 i32.const 1 i32.shl - i32.const 4112 + i32.const 3920 i32.add local.get $2 local.get $1 @@ -4325,11 +4325,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5580 i32.lt_s if - i32.const 22048 - i32.const 22096 + i32.const 21984 + i32.const 22032 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4347,7 +4347,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - i32.const 3968 + i32.const 3776 local.set $1 br $__inlined_func$~lib/util/number/dtoa end @@ -4365,7 +4365,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - i32.const 4000 + i32.const 3808 local.set $1 br $__inlined_func$~lib/util/number/dtoa end @@ -4373,8 +4373,8 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - i32.const 4032 - i32.const 4080 + i32.const 3840 + i32.const 3888 local.get $0 f64.const 0 f64.lt @@ -4394,7 +4394,7 @@ local.tee $1 i32.store local.get $1 - i32.const 4112 + i32.const 3920 local.get $2 call $~lib/memory/memory.copy global.get $~lib/memory/__stack_pointer @@ -4404,108 +4404,42 @@ end local.get $1 ) - (func $~lib/rt/__visit_members (param $0 i32) - (local $1 i32) - (local $2 i32) - block $invalid - block $templateliteral/Ref - block $~lib/staticarray/StaticArray<~lib/string/String> - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - local.get $0 - i32.const 8 - i32.sub - i32.load - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $~lib/staticarray/StaticArray<~lib/string/String> $templateliteral/Ref $invalid - end - return - end - return - end - local.get $0 - i32.load - local.tee $0 - if - local.get $0 - call $~lib/rt/itcms/__visit - end - return - end - local.get $0 - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 - i32.add - local.set $1 - loop $while-continue|0 - local.get $0 - local.get $1 - i32.lt_u - if - local.get $0 - i32.load - local.tee $2 - if - local.get $2 - call $~lib/rt/itcms/__visit - end - local.get $0 - i32.const 4 - i32.add - local.set $0 - br $while-continue|0 - end - end - return - end - return - end - unreachable - ) - (func $~start + (func $start:templateliteral (local $0 i32) (local $1 i32) (local $2 i32) (local $3 i32) - global.get $~started - if - return - end - i32.const 1 - global.set $~started - i32.const 1236 - i32.const 1232 - i32.store - i32.const 1240 - i32.const 1232 - i32.store - i32.const 1232 - global.set $~lib/rt/itcms/toSpace memory.size i32.const 16 i32.shl - i32.const 22028 + i32.const 21964 i32.sub i32.const 1 i32.shr_u global.set $~lib/rt/itcms/threshold - i32.const 1444 - i32.const 1440 + i32.const 1332 + i32.const 1328 i32.store - i32.const 1448 - i32.const 1440 + i32.const 1336 + i32.const 1328 i32.store - i32.const 1440 + i32.const 1328 global.set $~lib/rt/itcms/pinSpace - i32.const 1476 - i32.const 1472 + i32.const 1364 + i32.const 1360 + i32.store + i32.const 1368 + i32.const 1360 + i32.store + i32.const 1360 + global.set $~lib/rt/itcms/toSpace + i32.const 1508 + i32.const 1504 i32.store - i32.const 1480 - i32.const 1472 + i32.const 1512 + i32.const 1504 i32.store - i32.const 1472 + i32.const 1504 global.set $~lib/rt/itcms/fromSpace global.get $~lib/memory/__stack_pointer i32.const 24 @@ -4513,7 +4447,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5580 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4533,122 +4467,81 @@ i32.const 1088 i32.store offset=4 local.get $0 - i32.const 1152 - i32.store offset=16 - i32.const 1152 - i32.const 1 i32.const 1056 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - local.tee $0 - i32.const 1152 - i32.store offset=16 - local.get $0 - i32.const 1120 - i32.store offset=20 - i32.const 1152 - call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $0 - global.get $~lib/memory/__stack_pointer - local.tee $1 - local.get $0 i32.store offset=8 - local.get $1 i32.const 1056 - i32.store offset=12 - local.get $0 i32.const 1056 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 + i32.const 1120 i32.const 4 i32.const 3 call $~lib/builtins/abort unreachable end - global.get $~lib/memory/__stack_pointer - i32.const 1648 - i32.store offset=16 - i32.const 1648 - i32.const 1 i32.const 1056 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - i32.const 1648 - i32.store offset=16 - i32.const 1648 - i32.const 3 i32.const 1088 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - local.tee $0 - i32.const 1648 - i32.store offset=16 - local.get $0 - i32.const 1120 - i32.store offset=20 - i32.const 1648 - call $~lib/staticarray/StaticArray<~lib/string/String>#join + call $~lib/string/String#concat local.set $0 global.get $~lib/memory/__stack_pointer local.tee $1 local.get $0 - i32.store offset=8 - local.get $1 - i32.const 1696 i32.store offset=12 + local.get $1 + i32.const 1616 + i32.store offset=8 local.get $0 - i32.const 1696 + i32.const 1616 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 + i32.const 1120 i32.const 5 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1824 + i32.const 1744 i32.store offset=16 - i32.const 1824 + i32.const 1744 i32.const 1 i32.const 1056 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 1824 + i32.const 1744 i32.store offset=16 - i32.const 1824 + i32.const 1744 i32.const 3 i32.const 1088 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer local.tee $0 - i32.const 1824 + i32.const 1744 i32.store offset=16 local.get $0 - i32.const 1120 + i32.const 1184 i32.store offset=20 - i32.const 1824 + i32.const 1744 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer local.tee $1 local.get $0 - i32.store offset=8 - local.get $1 - i32.const 1872 i32.store offset=12 + local.get $1 + i32.const 1792 + i32.store offset=8 local.get $0 - i32.const 1872 + i32.const 1792 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 + i32.const 1120 i32.const 6 i32.const 3 call $~lib/builtins/abort @@ -4663,7 +4556,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5580 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4676,137 +4569,97 @@ local.get $0 i32.const 0 i32.store offset=16 - local.get $0 - i32.const 1920 - i32.store offset=8 i32.const 1 call $~lib/util/number/itoa32 local.set $0 global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=12 - i32.const 1920 - i32.const 1 - local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - local.tee $0 - i32.const 1920 - i32.store offset=8 - local.get $0 - i32.const 1120 - i32.store offset=16 - i32.const 1920 - call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $0 - global.get $~lib/memory/__stack_pointer local.tee $1 local.get $0 i32.store local.get $1 - i32.const 3728 + i32.const 3616 i32.store offset=4 local.get $0 - i32.const 3728 + i32.const 3616 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 + i32.const 1120 i32.const 13 i32.const 3 call $~lib/builtins/abort unreachable end - global.get $~lib/memory/__stack_pointer - i32.const 3760 - i32.store offset=8 i32.const 1 call $~lib/util/number/itoa32 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=12 - i32.const 3760 - i32.const 1 - local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - i32.const 3760 i32.store offset=8 i32.const 2 call $~lib/util/number/itoa32 - local.set $0 + local.set $1 global.get $~lib/memory/__stack_pointer - local.get $0 + local.get $1 i32.store offset=12 - i32.const 3760 - i32.const 3 local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - local.tee $0 - i32.const 3760 - i32.store offset=8 - local.get $0 - i32.const 1120 - i32.store offset=16 - i32.const 3760 - call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.get $1 + call $~lib/string/String#concat local.set $0 global.get $~lib/memory/__stack_pointer local.tee $1 local.get $0 i32.store local.get $1 - i32.const 3808 + i32.const 3648 i32.store offset=4 local.get $0 - i32.const 3808 + i32.const 3648 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 + i32.const 1120 i32.const 14 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3840 + i32.const 3680 i32.store offset=8 i32.const 1 call $~lib/util/number/itoa32 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=12 - i32.const 3840 + i32.store offset=16 + i32.const 3680 i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 3840 + i32.const 3680 i32.store offset=8 i32.const 2 call $~lib/util/number/itoa32 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=12 - i32.const 3840 + i32.store offset=16 + i32.const 3680 i32.const 3 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer local.tee $0 - i32.const 3840 + i32.const 3680 i32.store offset=8 local.get $0 - i32.const 1120 - i32.store offset=16 - i32.const 3840 + i32.const 1184 + i32.store offset=12 + i32.const 3680 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer @@ -4814,15 +4667,15 @@ local.get $0 i32.store local.get $1 - i32.const 3888 + i32.const 3728 i32.store offset=4 local.get $0 - i32.const 3888 + i32.const 3728 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 + i32.const 1120 i32.const 15 i32.const 3 call $~lib/builtins/abort @@ -4837,7 +4690,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5580 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4850,137 +4703,97 @@ local.get $0 i32.const 0 i32.store offset=16 - local.get $0 - i32.const 3936 - i32.store offset=8 f64.const 1 call $~lib/number/F64#toString local.set $0 global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=12 - i32.const 3936 - i32.const 1 - local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - local.tee $0 - i32.const 3936 - i32.store offset=8 - local.get $0 - i32.const 1120 - i32.store offset=16 - i32.const 3936 - call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $0 - global.get $~lib/memory/__stack_pointer local.tee $1 local.get $0 i32.store local.get $1 - i32.const 5104 + i32.const 4912 i32.store offset=4 local.get $0 - i32.const 5104 + i32.const 4912 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 + i32.const 1120 i32.const 22 i32.const 3 call $~lib/builtins/abort unreachable end - global.get $~lib/memory/__stack_pointer - i32.const 5136 - i32.store offset=8 f64.const 1 call $~lib/number/F64#toString local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=12 - i32.const 5136 - i32.const 1 - local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - i32.const 5136 i32.store offset=8 f64.const 2 call $~lib/number/F64#toString - local.set $0 + local.set $1 global.get $~lib/memory/__stack_pointer - local.get $0 + local.get $1 i32.store offset=12 - i32.const 5136 - i32.const 3 - local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - local.tee $0 - i32.const 5136 - i32.store offset=8 local.get $0 - i32.const 1120 - i32.store offset=16 - i32.const 5136 - call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.get $1 + call $~lib/string/String#concat local.set $0 global.get $~lib/memory/__stack_pointer local.tee $1 local.get $0 i32.store local.get $1 - i32.const 5184 + i32.const 4944 i32.store offset=4 local.get $0 - i32.const 5184 + i32.const 4944 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 + i32.const 1120 i32.const 23 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 5216 + i32.const 4976 i32.store offset=8 f64.const 1 call $~lib/number/F64#toString local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=12 - i32.const 5216 + i32.store offset=16 + i32.const 4976 i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 5216 + i32.const 4976 i32.store offset=8 f64.const 2 call $~lib/number/F64#toString local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=12 - i32.const 5216 + i32.store offset=16 + i32.const 4976 i32.const 3 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer local.tee $0 - i32.const 5216 + i32.const 4976 i32.store offset=8 local.get $0 - i32.const 1120 - i32.store offset=16 - i32.const 5216 + i32.const 1184 + i32.store offset=12 + i32.const 4976 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer @@ -4988,15 +4801,15 @@ local.get $0 i32.store local.get $1 - i32.const 5264 + i32.const 5024 i32.store offset=4 local.get $0 - i32.const 5264 + i32.const 5024 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 + i32.const 1120 i32.const 24 i32.const 3 call $~lib/builtins/abort @@ -5006,12 +4819,13 @@ i32.const 20 i32.add global.set $~lib/memory/__stack_pointer + call $templateliteral/test_fast_paths_string global.get $~lib/memory/__stack_pointer i32.const 28 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5580 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -5037,137 +4851,97 @@ call $templateliteral/Ref#constructor local.tee $1 i32.store offset=4 - global.get $~lib/memory/__stack_pointer - i32.const 5312 - i32.store offset=16 local.get $0 call $templateliteral/Ref#toString local.set $2 global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=20 - i32.const 5312 - i32.const 1 - local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - local.tee $2 - i32.const 5312 - i32.store offset=16 - local.get $2 - i32.const 1120 - i32.store offset=24 - i32.const 5312 - call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $2 - global.get $~lib/memory/__stack_pointer local.tee $3 local.get $2 i32.store offset=8 local.get $3 - i32.const 5376 + i32.const 5360 i32.store offset=12 local.get $2 - i32.const 5376 + i32.const 5360 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 - i32.const 38 + i32.const 1120 + i32.const 51 i32.const 3 call $~lib/builtins/abort unreachable end - global.get $~lib/memory/__stack_pointer - i32.const 5408 - i32.store offset=16 local.get $0 call $templateliteral/Ref#toString local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=20 - i32.const 5408 - i32.const 1 - local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - i32.const 5408 i32.store offset=16 local.get $1 call $templateliteral/Ref#toString - local.set $2 + local.set $3 global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $3 i32.store offset=20 - i32.const 5408 - i32.const 3 - local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - local.tee $2 - i32.const 5408 - i32.store offset=16 local.get $2 - i32.const 1120 - i32.store offset=24 - i32.const 5408 - call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.get $3 + call $~lib/string/String#concat local.set $2 global.get $~lib/memory/__stack_pointer local.tee $3 local.get $2 i32.store offset=8 local.get $3 - i32.const 5456 + i32.const 5392 i32.store offset=12 local.get $2 - i32.const 5456 + i32.const 5392 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 - i32.const 39 + i32.const 1120 + i32.const 52 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 5504 + i32.const 5440 i32.store offset=16 local.get $0 call $templateliteral/Ref#toString local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=20 - i32.const 5504 + i32.store offset=24 + i32.const 5440 i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 5504 + i32.const 5440 i32.store offset=16 local.get $1 call $templateliteral/Ref#toString local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=20 - i32.const 5504 + i32.store offset=24 + i32.const 5440 i32.const 3 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer local.tee $0 - i32.const 5504 + i32.const 5440 i32.store offset=16 local.get $0 - i32.const 1120 - i32.store offset=24 - i32.const 5504 + i32.const 1184 + i32.store offset=20 + i32.const 5440 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer @@ -5175,16 +4949,16 @@ local.get $0 i32.store offset=8 local.get $1 - i32.const 5552 + i32.const 5488 i32.store offset=12 local.get $0 - i32.const 5552 + i32.const 5488 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 - i32.const 40 + i32.const 1120 + i32.const 53 i32.const 3 call $~lib/builtins/abort unreachable @@ -5195,115 +4969,412 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 22048 - i32.const 22096 + i32.const 21984 + i32.const 22032 i32.const 1 i32.const 1 call $~lib/builtins/abort unreachable ) - (func $templateliteral/Ref#toString (param $0 i32) (result i32) + (func $~lib/rt/__visit_members (param $0 i32) (local $1 i32) (local $2 i32) - (local $3 i32) - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.sub - global.set $~lib/memory/__stack_pointer - block $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 5644 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - local.tee $1 - i64.const 0 - i64.store - local.get $1 - i32.const 5344 - i32.store - local.get $0 - i32.load - call $~lib/util/number/itoa32 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.tee $1 - local.get $0 - i32.store offset=4 - local.get $1 - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 5644 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - block $__inlined_func$~lib/string/String#concat - i32.const 5340 - i32.load - i32.const 1 - i32.shr_u - i32.const 1 - i32.shl - local.tee $2 + block $invalid + block $templateliteral/Ref + block $~lib/staticarray/StaticArray<~lib/string/String> + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $~lib/staticarray/StaticArray<~lib/string/String> $templateliteral/Ref $invalid + end + return + end + return + end + local.get $0 + i32.load + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end + return + end + local.get $0 local.get $0 i32.const 20 i32.sub i32.load offset=16 - i32.const 1 - i32.shr_u - i32.const 1 - i32.shl - local.tee $3 i32.add - local.tee $1 - i32.eqz - if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 1120 - local.set $1 - br $__inlined_func$~lib/string/String#concat + local.set $1 + loop $while-continue|0 + local.get $0 + local.get $1 + i32.lt_u + if + local.get $0 + i32.load + local.tee $2 + if + local.get $2 + call $~lib/rt/itcms/__visit + end + local.get $0 + i32.const 4 + i32.add + local.set $0 + br $while-continue|0 + end end - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.const 1 - call $~lib/rt/itcms/__new - local.tee $1 - i32.store - local.get $1 - i32.const 5344 - local.get $2 - call $~lib/memory/memory.copy - local.get $1 - local.get $2 - i32.add - local.get $0 - local.get $3 - call $~lib/memory/memory.copy - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer + return end + return + end + unreachable + ) + (func $~start + global.get $~started + if + return + end + i32.const 1 + global.set $~started + call $start:templateliteral + ) + (func $templateliteral/test_fast_paths_string + (local $0 i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 5580 + i32.lt_s + if + i32.const 21984 + i32.const 22032 + 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 + local.get $0 + i64.const 0 + i64.store offset=8 + local.get $0 + i32.const 0 + i32.store offset=16 + local.get $0 + i32.const 1088 + i32.store + i32.const 2 + call $~lib/util/number/itoa32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.tee $1 + local.get $0 + i32.store offset=4 + local.get $1 + i32.const 5072 + i32.store offset=8 + local.get $0 + i32.const 5072 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 31 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1088 + i32.store offset=8 + i32.const 1088 + i32.const 1088 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 32 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 5104 + i32.store offset=12 + i32.const 2 + call $~lib/util/number/itoa32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=16 + i32.const 5104 + local.get $0 + call $~lib/string/String#concat + local.set $0 + global.get $~lib/memory/__stack_pointer + local.tee $1 + local.get $0 + i32.store offset=4 + local.get $1 + i32.const 5136 + i32.store offset=8 + local.get $0 + i32.const 5136 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 33 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 5104 + i32.store offset=12 + i32.const 5104 + i32.const 1088 + call $~lib/string/String#concat + local.set $0 + global.get $~lib/memory/__stack_pointer + local.tee $1 + local.get $0 + i32.store offset=4 + local.get $1 + i32.const 5168 + i32.store offset=8 + local.get $0 + i32.const 5168 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 34 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 2 + call $~lib/util/number/itoa32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.tee $1 + local.get $0 + i32.store offset=12 + local.get $1 + i32.const 5200 + i32.store offset=16 + local.get $0 + i32.const 5200 + call $~lib/string/String#concat + local.set $0 + global.get $~lib/memory/__stack_pointer + local.tee $1 + local.get $0 + i32.store offset=4 + local.get $1 + i32.const 5232 + i32.store offset=8 + local.get $0 + i32.const 5232 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 35 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 5200 + i32.store offset=16 + i32.const 1088 + i32.const 5200 + call $~lib/string/String#concat + local.set $0 + global.get $~lib/memory/__stack_pointer + local.tee $1 + local.get $0 + i32.store offset=4 + local.get $1 + i32.const 5264 + i32.store offset=8 + local.get $0 + i32.const 5264 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 36 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 2 + call $~lib/util/number/itoa32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=12 + local.get $0 + i32.const 1088 + call $~lib/string/String#concat + local.set $0 + global.get $~lib/memory/__stack_pointer + local.tee $1 + local.get $0 + i32.store offset=4 + local.get $1 + i32.const 5296 + i32.store offset=8 + local.get $0 + i32.const 5296 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 37 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $templateliteral/Ref#toString (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 5580 + i32.lt_s + if + i32.const 21984 + i32.const 22032 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + i64.const 0 + i64.store + local.get $1 + i32.const 5328 + i32.store + local.get $0 + i32.load + call $~lib/util/number/itoa32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + i32.const 5328 + local.get $0 + call $~lib/string/String#concat + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/string/String#concat (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 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 5580 + i32.lt_s + if + i32.const 21984 + i32.const 22032 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + i32.const 1 + i32.shl + local.tee $3 + local.get $1 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + i32.const 1 + i32.shl + local.tee $4 + i32.add + local.tee $2 + i32.eqz + if global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $1 + i32.const 1184 return end - i32.const 22048 - i32.const 22096 - i32.const 1 + global.get $~lib/memory/__stack_pointer + local.get $2 i32.const 1 - call $~lib/builtins/abort - unreachable + call $~lib/rt/itcms/__new + local.tee $2 + i32.store + local.get $2 + local.get $0 + local.get $3 + call $~lib/memory/memory.copy + local.get $2 + local.get $3 + i32.add + local.get $1 + local.get $4 + call $~lib/memory/memory.copy + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 ) (func $~lib/util/number/itoa32 (param $0 i32) (result i32) (local $1 i32) @@ -5314,11 +5385,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5580 i32.lt_s if - i32.const 22048 - i32.const 22096 + i32.const 21984 + i32.const 22032 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5334,7 +5405,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - i32.const 2144 + i32.const 2032 return end global.get $~lib/memory/__stack_pointer @@ -5426,11 +5497,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5580 i32.lt_s if - i32.const 22048 - i32.const 22096 + i32.const 21984 + i32.const 22032 i32.const 1 i32.const 1 call $~lib/builtins/abort diff --git a/tests/compiler/templateliteral.ts b/tests/compiler/templateliteral.ts index adbabacd9b..c015573c32 100644 --- a/tests/compiler/templateliteral.ts +++ b/tests/compiler/templateliteral.ts @@ -1,8 +1,8 @@ function test_string(): void { var a = "a"; var b = "b"; - assert(`${a}`== "a"); - assert(`${a}${b}`== "ab"); + assert(`${a}` == "a"); + assert(`${a}${b}` == "ab"); assert(`(A=${a}, B=${b})` == "(A=a, B=b)"); } test_string(); @@ -10,8 +10,8 @@ test_string(); function test_integer(): void { var a = 1; var b = 2; - assert(`${a}`== "1"); - assert(`${a}${b}`== "12"); + assert(`${a}` == "1"); + assert(`${a}${b}` == "12"); assert(`(A=${a}, B=${b})` == "(A=1, B=2)"); } test_integer(); @@ -19,12 +19,25 @@ test_integer(); function test_float(): void { var a = 1.0; var b = 2.0; - assert(`${a}`== "1.0"); - assert(`${a}${b}`== "1.02.0"); + assert(`${a}` == "1.0"); + assert(`${a}${b}` == "1.02.0"); assert(`(A=${a}, B=${b})` == "(A=1.0, B=2.0)"); } test_float(); +function test_fast_paths_string(): void { + var a = 2; + var b = "b"; + assert(`${a}` == "2"); + assert(`${b}` == "b"); + assert(`pref${a}` == "pref2"); + assert(`pref${b}` == "prefb"); + assert(`${a}suff` == "2suff"); + assert(`${b}suff` == "bsuff"); + assert(`${a}${b}` == "2b"); +} +test_fast_paths_string(); + class Ref { constructor(public value: i32) {} toString(): string { @@ -35,8 +48,8 @@ class Ref { function test_ref(): void { var a = new Ref(1); var b = new Ref(2); - assert(`${a}`== "ref#1"); - assert(`${a}${b}`== "ref#1ref#2"); + assert(`${a}` == "ref#1"); + assert(`${a}${b}` == "ref#1ref#2"); assert(`(A=${a}, B=${b})` == "(A=ref#1, B=ref#2)"); } test_ref(); diff --git a/tests/compiler/templateliteral.untouched.wat b/tests/compiler/templateliteral.untouched.wat index 768a99f96e..5dc0782c75 100644 --- a/tests/compiler/templateliteral.untouched.wat +++ b/tests/compiler/templateliteral.untouched.wat @@ -6,9 +6,9 @@ (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_none (func (param i32))) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) + (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result 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))) (type $i32_i64_i32_=>_none (func (param i32 i64 i32))) (type $i64_i32_=>_i32 (func (param i64 i32) (result i32))) (type $i32_i64_i32_i32_=>_none (func (param i32 i64 i32 i32))) @@ -17,15 +17,15 @@ (type $f64_i32_=>_i32 (func (param f64 i32) (result i32))) (type $f64_=>_i32 (func (param f64) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) @@ -35,75 +35,245 @@ (global $~lib/util/number/_K (mut i32) (i32.const 0)) (global $~lib/util/number/_frc_pow (mut i64) (i64.const 0)) (global $~lib/util/number/_exp_pow (mut i32) (i32.const 0)) - (global $~lib/rt/__rtti_base i32 (i32.const 4576)) - (global $~lib/memory/__data_end i32 (i32.const 4620)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 21004)) - (global $~lib/memory/__heap_base i32 (i32.const 21004)) + (global $~lib/rt/__rtti_base i32 (i32.const 4512)) + (global $~lib/memory/__data_end i32 (i32.const 4556)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20940)) + (global $~lib/memory/__heap_base i32 (i32.const 20940)) (global $~started (mut i32) (i32.const 0)) (memory $0 1) (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 44) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00b\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 76) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 108) "\1c\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\0c\00\00\00`\00\00\00\00\00\00\00`\00\00\00") - (data (i32.const 140) "<\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") - (data (i32.const 208) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 236) "<\00\00\00\00\00\00\00\00\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\00\00\00\00\00\00\00\00") - (data (i32.const 300) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data (i32.const 348) "<\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 416) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 448) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 476) "<\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 540) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00$\00\00\00t\00e\00m\00p\00l\00a\00t\00e\00l\00i\00t\00e\00r\00a\00l\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data (i32.const 604) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\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 652) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00a\00b\00\00\00\00\00\00\00\00\00") - (data (i32.const 684) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00(\00A\00=\00\00\00\00\00\00\00") - (data (i32.const 716) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\08\00\00\00,\00 \00B\00=\00\00\00\00\00") - (data (i32.const 748) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00)\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 780) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\c0\02\00\00\00\00\00\00\e0\02\00\00\00\00\00\00\00\03\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 828) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00(\00A\00=\00a\00,\00 \00B\00=\00b\00)\00\00\00\00\00\00\00\00\00") - (data (i32.const 876) "\1c\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\0c\00\00\00`\00\00\00\00\00\00\00`\00\00\00") - (data (i32.const 908) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00d\00\00\00t\00o\00S\00t\00r\00i\00n\00g\00(\00)\00 \00r\00a\00d\00i\00x\00 \00a\00r\00g\00u\00m\00e\00n\00t\00 \00m\00u\00s\00t\00 \00b\00e\00 \00b\00e\00t\00w\00e\00e\00n\00 \002\00 \00a\00n\00d\00 \003\006\00\00\00\00\00\00\00\00\00") - (data (i32.const 1036) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00&\00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00n\00u\00m\00b\00e\00r\00.\00t\00s\00\00\00\00\00\00\00") - (data (i32.const 1100) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\000\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1132) "0\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 1532) "\1c\04\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\04\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\000\00a\000\00b\000\00c\000\00d\000\00e\000\00f\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\001\00a\001\00b\001\00c\001\00d\001\00e\001\00f\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\002\00a\002\00b\002\00c\002\00d\002\00e\002\00f\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\003\00a\003\00b\003\00c\003\00d\003\00e\003\00f\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\004\00a\004\00b\004\00c\004\00d\004\00e\004\00f\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\005\00a\005\00b\005\00c\005\00d\005\00e\005\00f\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\006\00a\006\00b\006\00c\006\00d\006\00e\006\00f\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\007\00a\007\00b\007\00c\007\00d\007\00e\007\00f\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\008\00a\008\00b\008\00c\008\00d\008\00e\008\00f\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\009\00a\009\00b\009\00c\009\00d\009\00e\009\00f\00a\000\00a\001\00a\002\00a\003\00a\004\00a\005\00a\006\00a\007\00a\008\00a\009\00a\00a\00a\00b\00a\00c\00a\00d\00a\00e\00a\00f\00b\000\00b\001\00b\002\00b\003\00b\004\00b\005\00b\006\00b\007\00b\008\00b\009\00b\00a\00b\00b\00b\00c\00b\00d\00b\00e\00b\00f\00c\000\00c\001\00c\002\00c\003\00c\004\00c\005\00c\006\00c\007\00c\008\00c\009\00c\00a\00c\00b\00c\00c\00c\00d\00c\00e\00c\00f\00d\000\00d\001\00d\002\00d\003\00d\004\00d\005\00d\006\00d\007\00d\008\00d\009\00d\00a\00d\00b\00d\00c\00d\00d\00d\00e\00d\00f\00e\000\00e\001\00e\002\00e\003\00e\004\00e\005\00e\006\00e\007\00e\008\00e\009\00e\00a\00e\00b\00e\00c\00e\00d\00e\00e\00e\00f\00f\000\00f\001\00f\002\00f\003\00f\004\00f\005\00f\006\00f\007\00f\008\00f\009\00f\00a\00f\00b\00f\00c\00f\00d\00f\00e\00f\00f\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2588) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\000\001\002\003\004\005\006\007\008\009\00a\00b\00c\00d\00e\00f\00g\00h\00i\00j\00k\00l\00m\00n\00o\00p\00q\00r\00s\00t\00u\00v\00w\00x\00y\00z\00\00\00\00\00") - (data (i32.const 2684) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\001\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2716) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\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 2764) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\001\002\00\00\00\00\00\00\00\00\00") - (data (i32.const 2796) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\c0\02\00\00\00\00\00\00\e0\02\00\00\00\00\00\00\00\03\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2844) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00(\00A\00=\001\00,\00 \00B\00=\002\00)\00\00\00\00\00\00\00\00\00") - (data (i32.const 2892) "\1c\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\0c\00\00\00`\00\00\00\00\00\00\00`\00\00\00") - (data (i32.const 2924) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\000\00.\000\00\00\00\00\00\00\00") - (data (i32.const 2956) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00N\00a\00N\00\00\00\00\00\00\00") - (data (i32.const 2988) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\12\00\00\00-\00I\00n\00f\00i\00n\00i\00t\00y\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 3036) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\10\00\00\00I\00n\00f\00i\00n\00i\00t\00y\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 3088) "\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\00\00\00") - (data (i32.const 3144) "\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\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#__uset (param $0 i32) (param $1 i32) (param $2 i32) - local.get $0 - local.get $1 - i32.const 2 - i32.shl - i32.add - local.get $2 - i32.store - i32.const 1 - drop - local.get $0 - local.get $2 - i32.const 1 - call $~lib/rt/itcms/__link - ) - (func $~lib/staticarray/StaticArray<~lib/string/String>#get:length (param $0 i32) (result i32) - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 2 - i32.shr_u - ) - (func $~lib/string/String#get:length (param $0 i32) (result i32) - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - ) - (func $~lib/rt/itcms/visitRoots (param $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - local.get $0 - call $~lib/rt/__visit_globals - global.get $~lib/rt/itcms/pinSpace - local.set $1 - local.get $1 - call $~lib/rt/itcms/Object#get:next - local.set $2 - loop $while-continue|0 - local.get $2 - local.get $1 - i32.ne - local.set $3 - local.get $3 - if - i32.const 1 - drop - local.get $2 - call $~lib/rt/itcms/Object#get:color - i32.const 3 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 160 - i32.const 159 - i32.const 16 - call $~lib/builtins/abort - unreachable - end - local.get $2 - i32.const 20 - i32.add - local.get $0 - call $~lib/rt/__visit_members - local.get $2 - call $~lib/rt/itcms/Object#get:next - local.set $2 - br $while-continue|0 - end - end - ) - (func $~lib/rt/itcms/Object#set:color (param $0 i32) (param $1 i32) - local.get $0 - local.get $0 - i32.load offset=4 - i32.const 3 - i32.const -1 - i32.xor - i32.and - local.get $1 - i32.or - call $~lib/rt/itcms/Object#set:nextWithColor - ) (func $~lib/rt/itcms/__visit (param $0 i32) (param $1 i32) (local $2 i32) local.get $0 @@ -556,7 +614,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 268 i32.const 14 call $~lib/builtins/abort @@ -576,7 +634,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 270 i32.const 14 call $~lib/builtins/abort @@ -639,7 +697,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 284 i32.const 14 call $~lib/builtins/abort @@ -771,7 +829,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 201 i32.const 14 call $~lib/builtins/abort @@ -788,7 +846,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 203 i32.const 14 call $~lib/builtins/abort @@ -868,7 +926,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 221 i32.const 16 call $~lib/builtins/abort @@ -911,7 +969,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 233 i32.const 14 call $~lib/builtins/abort @@ -929,7 +987,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 234 i32.const 14 call $~lib/builtins/abort @@ -997,7 +1055,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 251 i32.const 14 call $~lib/builtins/abort @@ -1102,7 +1160,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 377 i32.const 14 call $~lib/builtins/abort @@ -1145,7 +1203,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 384 i32.const 16 call $~lib/builtins/abort @@ -1178,7 +1236,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 397 i32.const 5 call $~lib/builtins/abort @@ -1421,7 +1479,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 559 i32.const 3 call $~lib/builtins/abort @@ -1643,7 +1701,7 @@ i32.eqz if i32.const 0 - i32.const 160 + i32.const 256 i32.const 228 i32.const 20 call $~lib/builtins/abort @@ -1751,8 +1809,8 @@ i32.const 1073741820 i32.gt_u if - i32.const 368 - i32.const 496 + i32.const 192 + i32.const 528 i32.const 458 i32.const 29 call $~lib/builtins/abort @@ -1836,7 +1894,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 330 i32.const 14 call $~lib/builtins/abort @@ -1901,7 +1959,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 343 i32.const 18 call $~lib/builtins/abort @@ -2052,7 +2110,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 357 i32.const 14 call $~lib/builtins/abort @@ -2161,7 +2219,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 496 i32.const 16 call $~lib/builtins/abort @@ -2181,7 +2239,7 @@ i32.eqz if i32.const 0 - i32.const 496 + i32.const 528 i32.const 498 i32.const 14 call $~lib/builtins/abort @@ -2458,8 +2516,8 @@ i32.const 1073741804 i32.ge_u if - i32.const 368 - i32.const 160 + i32.const 192 + i32.const 256 i32.const 260 i32.const 31 call $~lib/builtins/abort @@ -3734,28 +3792,119 @@ end end end - loop $while-continue|5 + loop $while-continue|5 + local.get $3 + local.set $6 + local.get $6 + if + local.get $5 + local.get $3 + i32.const 1 + i32.sub + local.tee $3 + i32.add + local.get $4 + local.get $3 + i32.add + i32.load8_u + i32.store8 + br $while-continue|5 + end + end + end + end + ) + (func $~lib/rt/itcms/__link (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $1 + i32.eqz + if + return + end + i32.const 1 + drop + local.get $0 + i32.eqz + if + i32.const 0 + i32.const 256 + i32.const 294 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 20 + i32.sub + local.set $3 + local.get $3 + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eq + if + local.get $0 + i32.const 20 + i32.sub + local.set $4 + local.get $4 + call $~lib/rt/itcms/Object#get:color + local.set $5 + local.get $5 + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + if + local.get $2 + if + local.get $4 + call $~lib/rt/itcms/Object#makeGray + else + local.get $3 + call $~lib/rt/itcms/Object#makeGray + end + else + local.get $5 + i32.const 3 + i32.eq + if (result i32) + global.get $~lib/rt/itcms/state + i32.const 1 + i32.eq + else + i32.const 0 + end + if local.get $3 - local.set $6 - local.get $6 - if - local.get $5 - local.get $3 - i32.const 1 - i32.sub - local.tee $3 - i32.add - local.get $4 - local.get $3 - i32.add - i32.load8_u - i32.store8 - br $while-continue|5 - end + call $~lib/rt/itcms/Object#makeGray end end end ) + (func $~lib/staticarray/StaticArray<~lib/string/String>#__uset (param $0 i32) (param $1 i32) (param $2 i32) + local.get $0 + local.get $1 + i32.const 2 + i32.shl + i32.add + local.get $2 + i32.store + i32.const 1 + drop + local.get $0 + local.get $2 + i32.const 1 + call $~lib/rt/itcms/__link + ) + (func $~lib/staticarray/StaticArray<~lib/string/String>#get:length (param $0 i32) (result i32) + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 2 + i32.shr_u + ) (func $~lib/staticarray/StaticArray<~lib/string/String>#join (param $0 i32) (param $1 i32) (result i32) i32.const 0 drop @@ -3776,155 +3925,6 @@ call $~lib/util/string/joinStringArray return ) - (func $~lib/util/string/compareImpl (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 $9 i32) - local.get $0 - local.get $1 - i32.const 1 - i32.shl - i32.add - local.set $5 - local.get $2 - local.get $3 - i32.const 1 - i32.shl - i32.add - local.set $6 - i32.const 0 - i32.const 2 - i32.lt_s - drop - local.get $4 - i32.const 4 - i32.ge_u - if (result i32) - local.get $5 - i32.const 7 - i32.and - local.get $6 - i32.const 7 - i32.and - i32.or - i32.eqz - else - i32.const 0 - end - if - block $do-break|0 - loop $do-continue|0 - local.get $5 - i64.load - local.get $6 - i64.load - i64.ne - if - br $do-break|0 - end - local.get $5 - i32.const 8 - i32.add - local.set $5 - local.get $6 - i32.const 8 - i32.add - local.set $6 - local.get $4 - i32.const 4 - i32.sub - local.set $4 - local.get $4 - i32.const 4 - i32.ge_u - local.set $7 - local.get $7 - br_if $do-continue|0 - end - end - end - loop $while-continue|1 - local.get $4 - local.tee $7 - i32.const 1 - i32.sub - local.set $4 - local.get $7 - local.set $7 - local.get $7 - if - local.get $5 - i32.load16_u - local.set $8 - local.get $6 - i32.load16_u - local.set $9 - local.get $8 - local.get $9 - i32.ne - if - local.get $8 - local.get $9 - i32.sub - return - end - local.get $5 - i32.const 2 - i32.add - local.set $5 - local.get $6 - i32.const 2 - i32.add - local.set $6 - br $while-continue|1 - end - end - i32.const 0 - ) - (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - local.get $0 - local.get $1 - i32.eq - if - i32.const 1 - return - end - 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 - return - end - local.get $0 - call $~lib/string/String#get:length - local.set $2 - local.get $2 - local.get $1 - call $~lib/string/String#get:length - i32.ne - if - i32.const 0 - return - end - local.get $0 - i32.const 0 - local.get $1 - i32.const 0 - local.get $2 - call $~lib/util/string/compareImpl - i32.eqz - ) (func $~lib/util/number/decimalCount32 (param $0 i32) (result i32) local.get $0 i32.const 100000 @@ -4015,14 +4015,14 @@ i32.const 100 i32.rem_u local.set $7 - i32.const 1132 + i32.const 1020 local.get $6 i32.const 2 i32.shl i32.add i64.load32_u local.set $8 - i32.const 1132 + i32.const 1020 local.get $7 i32.const 2 i32.shl @@ -4065,7 +4065,7 @@ i32.const 2 i32.sub local.set $2 - i32.const 1132 + i32.const 1020 local.get $10 i32.const 2 i32.shl @@ -4088,7 +4088,7 @@ i32.const 2 i32.sub local.set $2 - i32.const 1132 + i32.const 1020 local.get $1 i32.const 2 i32.shl @@ -4138,7 +4138,7 @@ i32.const 1 i32.shl i32.add - i32.const 1552 + i32.const 1440 local.get $1 i32.wrap_i64 i32.const 255 @@ -4160,7 +4160,7 @@ i32.and if local.get $0 - i32.const 1552 + i32.const 1440 local.get $1 i32.wrap_i64 i32.const 6 @@ -4283,7 +4283,7 @@ i32.const 1 i32.shl i32.add - i32.const 2608 + i32.const 2496 local.get $1 local.get $6 i64.and @@ -4319,7 +4319,7 @@ i32.const 1 i32.shl i32.add - i32.const 2608 + i32.const 2496 local.get $1 local.get $6 local.get $4 @@ -4613,7 +4613,7 @@ local.set $22 local.get $18 local.set $21 - i32.const 4016 + i32.const 3824 local.get $13 i32.const 2 i32.shl @@ -4754,7 +4754,7 @@ i32.add global.set $~lib/util/number/_K local.get $10 - i32.const 4016 + i32.const 3824 i32.const 0 local.get $13 i32.sub @@ -5335,14 +5335,14 @@ i32.shl i32.sub global.set $~lib/util/number/_K - i32.const 3144 + i32.const 2952 local.get $14 i32.const 3 i32.shl i32.add i64.load global.set $~lib/util/number/_frc_pow - i32.const 3840 + i32.const 3648 local.get $14 i32.const 1 i32.shl @@ -5613,9 +5613,6 @@ call $~lib/string/String#concat ) (func $start:templateliteral - i32.const 208 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/toSpace memory.size i32.const 16 i32.shl @@ -5624,29 +5621,33 @@ i32.const 1 i32.shr_u global.set $~lib/rt/itcms/threshold - i32.const 416 + i32.const 304 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/pinSpace - i32.const 448 + i32.const 336 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + i32.const 480 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/fromSpace call $templateliteral/test_string call $templateliteral/test_integer call $templateliteral/test_float + call $templateliteral/test_fast_paths_string call $templateliteral/test_ref ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) - i32.const 256 + i32.const 384 local.get $0 call $~lib/rt/itcms/__visit - i32.const 368 + i32.const 192 local.get $0 call $~lib/rt/itcms/__visit - i32.const 1552 + i32.const 1440 local.get $0 call $~lib/rt/itcms/__visit - i32.const 2608 + i32.const 2496 local.get $0 call $~lib/rt/itcms/__visit ) @@ -5751,8 +5752,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 21024 - i32.const 21072 + i32.const 20960 + i32.const 21008 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5785,102 +5786,48 @@ i32.const 64 local.tee $1 i32.store offset=4 - i32.const 128 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=16 - local.get $2 - i32.const 1 local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 128 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=16 - local.get $2 - i32.const 96 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=20 - local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=8 - local.get $2 i32.const 32 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=12 + i32.store offset=8 local.get $2 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 560 + i32.const 96 i32.const 4 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 624 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=16 - local.get $2 - i32.const 1 local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 624 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=16 - local.get $2 - i32.const 3 local.get $1 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 624 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=16 - local.get $2 - i32.const 96 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=20 - local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#join + call $~lib/string/String#concat local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=8 + i32.store offset=12 local.get $2 - i32.const 672 + i32.const 592 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=12 + i32.store offset=8 local.get $2 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 560 + i32.const 96 i32.const 5 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 800 + i32.const 720 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -5889,7 +5836,7 @@ i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 800 + i32.const 720 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -5898,13 +5845,13 @@ i32.const 3 local.get $1 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 800 + i32.const 720 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=16 local.get $2 - i32.const 96 + i32.const 160 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -5914,19 +5861,19 @@ local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=8 + i32.store offset=12 local.get $2 - i32.const 848 + i32.const 768 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=12 + i32.store offset=8 local.get $2 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 560 + i32.const 96 i32.const 6 i32.const 3 call $~lib/builtins/abort @@ -5959,41 +5906,53 @@ local.set $0 i32.const 2 local.set $1 - i32.const 896 + local.get $0 + i32.const 10 + call $~lib/number/I32#toString local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=8 + i32.store local.get $2 - i32.const 1 - local.get $0 - i32.const 10 - call $~lib/number/I32#toString + i32.const 2592 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=12 + i32.store offset=4 local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 896 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 13 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 10 + call $~lib/number/I32#toString local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=8 local.get $2 - i32.const 96 + local.get $1 + i32.const 10 + call $~lib/number/I32#toString local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=16 + i32.store offset=12 local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#join + call $~lib/string/String#concat local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store local.get $2 - i32.const 2704 + i32.const 2624 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6003,13 +5962,13 @@ i32.eqz if i32.const 0 - i32.const 560 - i32.const 13 + i32.const 96 + i32.const 14 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 2736 + i32.const 2656 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6022,10 +5981,10 @@ local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=12 + i32.store offset=16 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2736 + i32.const 2656 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6038,20 +5997,20 @@ local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=12 + i32.store offset=16 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2736 + i32.const 2656 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=8 local.get $2 - i32.const 96 + i32.const 160 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=16 + i32.store offset=12 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $2 @@ -6059,7 +6018,7 @@ local.get $2 i32.store local.get $2 - i32.const 2784 + i32.const 2704 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6069,13 +6028,102 @@ i32.eqz if i32.const 0 - i32.const 560 - i32.const 14 + i32.const 96 + i32.const 15 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $templateliteral/test_float + (local $0 f64) + (local $1 f64) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=16 + f64.const 1 + local.set $0 + f64.const 2 + local.set $1 + local.get $0 + i32.const 0 + call $~lib/number/F64#toString + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + i32.const 3888 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 22 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 0 + call $~lib/number/F64#toString + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + local.get $1 + i32.const 0 + call $~lib/number/F64#toString + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=12 + local.get $2 + call $~lib/string/String#concat + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + i32.const 3920 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 23 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 2816 + i32.const 3952 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6083,15 +6131,15 @@ local.get $2 i32.const 1 local.get $0 - i32.const 10 - call $~lib/number/I32#toString + i32.const 0 + call $~lib/number/F64#toString local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=12 + i32.store offset=16 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2816 + i32.const 3952 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6099,25 +6147,25 @@ local.get $2 i32.const 3 local.get $1 - i32.const 10 - call $~lib/number/I32#toString + i32.const 0 + call $~lib/number/F64#toString local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=12 + i32.store offset=16 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2816 + i32.const 3952 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=8 local.get $2 - i32.const 96 + i32.const 160 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=16 + i32.store offset=12 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $2 @@ -6125,7 +6173,7 @@ local.get $2 i32.store local.get $2 - i32.const 2864 + i32.const 4000 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6135,8 +6183,8 @@ i32.eqz if i32.const 0 - i32.const 560 - i32.const 15 + i32.const 96 + i32.const 24 i32.const 3 call $~lib/builtins/abort unreachable @@ -6146,9 +6194,9 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $templateliteral/test_float - (local $0 f64) - (local $1 f64) + (func $templateliteral/test_fast_paths_string + (local $0 i32) + (local $1 i32) (local $2 i32) global.get $~lib/memory/__stack_pointer i32.const 20 @@ -6164,188 +6212,210 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store offset=16 - f64.const 1 + i32.const 2 local.set $0 - f64.const 2 - local.set $1 - i32.const 2912 + global.get $~lib/memory/__stack_pointer + i32.const 64 + local.tee $1 + i32.store + local.get $0 + i32.const 10 + call $~lib/number/I32#toString local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=8 + i32.store offset=4 local.get $2 - i32.const 1 - local.get $0 - i32.const 0 - call $~lib/number/F64#toString + i32.const 4048 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=12 + i32.store offset=8 local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2912 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 31 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 64 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=8 local.get $2 - i32.const 96 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 32 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 4080 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=12 + local.get $2 + local.get $0 + i32.const 10 + call $~lib/number/I32#toString local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=16 local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#join + call $~lib/string/String#concat local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store + i32.store offset=4 local.get $2 - i32.const 4080 + i32.const 4112 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=4 + i32.store offset=8 local.get $2 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 560 - i32.const 22 + i32.const 96 + i32.const 33 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 4112 + i32.const 4080 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=8 + i32.store offset=12 local.get $2 - i32.const 1 - local.get $0 - i32.const 0 - call $~lib/number/F64#toString + local.get $1 + call $~lib/string/String#concat local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=12 + i32.store offset=4 local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4112 + i32.const 4144 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=8 local.get $2 - i32.const 3 - local.get $1 - i32.const 0 - call $~lib/number/F64#toString + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 34 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 10 + call $~lib/number/I32#toString local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=12 local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4112 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=8 - local.get $2 - i32.const 96 + i32.const 4176 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=16 local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#join + call $~lib/string/String#concat local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store + i32.store offset=4 local.get $2 - i32.const 4160 + i32.const 4208 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=4 + i32.store offset=8 local.get $2 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 560 - i32.const 23 + i32.const 96 + i32.const 35 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 4192 + local.get $1 + i32.const 4176 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=8 + i32.store offset=16 local.get $2 - i32.const 1 - local.get $0 - i32.const 0 - call $~lib/number/F64#toString + call $~lib/string/String#concat local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=12 + i32.store offset=4 local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4192 + i32.const 4240 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=8 local.get $2 - i32.const 3 - local.get $1 - i32.const 0 - call $~lib/number/F64#toString + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 36 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 10 + call $~lib/number/I32#toString local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=12 local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4192 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=8 - local.get $2 - i32.const 96 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=16 - local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.get $1 + call $~lib/string/String#concat local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store + i32.store offset=4 local.get $2 - i32.const 4240 + i32.const 4272 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=4 + i32.store offset=8 local.get $2 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 560 - i32.const 24 + i32.const 96 + i32.const 37 i32.const 3 call $~lib/builtins/abort unreachable @@ -6365,7 +6435,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - i32.const 4320 + i32.const 4304 local.set $1 global.get $~lib/memory/__stack_pointer local.get $1 @@ -6421,40 +6491,14 @@ call $templateliteral/Ref#constructor local.tee $1 i32.store offset=4 - i32.const 4288 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=16 - local.get $2 - i32.const 1 local.get $0 call $templateliteral/Ref#toString local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=20 - local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4288 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=16 - local.get $2 - i32.const 96 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=24 - local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 i32.store offset=8 local.get $2 - i32.const 4352 + i32.const 4336 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6464,34 +6508,19 @@ i32.eqz if i32.const 0 - i32.const 560 - i32.const 38 + i32.const 96 + i32.const 51 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 4384 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=16 - local.get $2 - i32.const 1 local.get $0 call $templateliteral/Ref#toString local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=20 - local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4384 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 i32.store offset=16 local.get $2 - i32.const 3 local.get $1 call $templateliteral/Ref#toString local.set $2 @@ -6499,26 +6528,13 @@ local.get $2 i32.store offset=20 local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4384 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=16 - local.get $2 - i32.const 96 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=24 - local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#join + call $~lib/string/String#concat local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=8 local.get $2 - i32.const 4432 + i32.const 4368 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6528,13 +6544,13 @@ i32.eqz if i32.const 0 - i32.const 560 - i32.const 39 + i32.const 96 + i32.const 52 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 4480 + i32.const 4416 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6546,10 +6562,10 @@ local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=20 + i32.store offset=24 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4480 + i32.const 4416 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6561,20 +6577,20 @@ local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=20 + i32.store offset=24 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4480 + i32.const 4416 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=16 local.get $2 - i32.const 96 + i32.const 160 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=24 + i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $2 @@ -6582,7 +6598,7 @@ local.get $2 i32.store offset=8 local.get $2 - i32.const 4528 + i32.const 4464 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6592,8 +6608,8 @@ i32.eqz if i32.const 0 - i32.const 560 - i32.const 40 + i32.const 96 + i32.const 53 i32.const 3 call $~lib/builtins/abort unreachable @@ -6603,6 +6619,71 @@ i32.add global.set $~lib/memory/__stack_pointer ) + (func $~lib/string/String#concat (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 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 + local.get $0 + call $~lib/string/String#get:length + i32.const 1 + i32.shl + local.set $2 + local.get $1 + call $~lib/string/String#get:length + i32.const 1 + i32.shl + local.set $3 + local.get $2 + local.get $3 + i32.add + local.set $4 + local.get $4 + i32.const 0 + i32.eq + if + i32.const 160 + local.set $6 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $6 + return + end + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $5 + i32.store + local.get $5 + local.get $0 + local.get $2 + call $~lib/memory/memory.copy + local.get $5 + local.get $2 + i32.add + local.get $1 + local.get $3 + call $~lib/memory/memory.copy + local.get $5 + local.set $6 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $6 + ) (func $~lib/util/string/joinStringArray (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) @@ -6633,7 +6714,7 @@ i32.const 0 i32.lt_s if - i32.const 96 + i32.const 160 local.set $12 global.get $~lib/memory/__stack_pointer i32.const 12 @@ -6654,7 +6735,7 @@ if (result i32) local.get $4 else - i32.const 96 + i32.const 160 end local.set $12 global.get $~lib/memory/__stack_pointer @@ -6842,8 +6923,8 @@ i32.gt_s end if - i32.const 928 - i32.const 1056 + i32.const 816 + i32.const 944 i32.const 373 i32.const 5 call $~lib/builtins/abort @@ -6852,7 +6933,7 @@ local.get $0 i32.eqz if - i32.const 1120 + i32.const 1008 local.set $8 global.get $~lib/memory/__stack_pointer i32.const 4 @@ -6998,7 +7079,7 @@ f64.const 0 f64.eq if - i32.const 2944 + i32.const 2752 local.set $3 global.get $~lib/memory/__stack_pointer i32.const 4 @@ -7018,7 +7099,7 @@ local.get $0 f64.ne if - i32.const 2976 + i32.const 2784 local.set $3 global.get $~lib/memory/__stack_pointer i32.const 4 @@ -7027,8 +7108,8 @@ local.get $3 return end - i32.const 3008 - i32.const 3056 + i32.const 2816 + i32.const 2864 local.get $0 f64.const 0 f64.lt @@ -7041,7 +7122,7 @@ local.get $3 return end - i32.const 3088 + i32.const 2896 local.get $0 call $~lib/util/number/dtoa_core i32.const 1 @@ -7054,7 +7135,7 @@ local.tee $2 i32.store local.get $2 - i32.const 3088 + i32.const 2896 local.get $1 call $~lib/memory/memory.copy local.get $2 @@ -7096,69 +7177,4 @@ global.set $~lib/memory/__stack_pointer local.get $2 ) - (func $~lib/string/String#concat (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 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 - local.get $0 - call $~lib/string/String#get:length - i32.const 1 - i32.shl - local.set $2 - local.get $1 - call $~lib/string/String#get:length - i32.const 1 - i32.shl - local.set $3 - local.get $2 - local.get $3 - i32.add - local.set $4 - local.get $4 - i32.const 0 - i32.eq - if - i32.const 96 - local.set $6 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $6 - return - end - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.const 1 - call $~lib/rt/itcms/__new - local.tee $5 - i32.store - local.get $5 - local.get $0 - local.get $2 - call $~lib/memory/memory.copy - local.get $5 - local.get $2 - i32.add - local.get $1 - local.get $3 - call $~lib/memory/memory.copy - local.get $5 - local.set $6 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $6 - ) )