From 2e4b9fdc73318aff0da62c65cba0697226ff651d Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 1 Aug 2021 16:40:45 +0300 Subject: [PATCH 01/16] add shortcut for ${expr} templates --- src/compiler.ts | 17 + tests/compiler/templateliteral.optimized.wat | 1089 +++++++++--------- tests/compiler/templateliteral.ts | 22 +- tests/compiler/templateliteral.untouched.wat | 828 ++++++------- 4 files changed, 934 insertions(+), 1022 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index e035cab8ca..d0f4268f22 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8154,6 +8154,23 @@ export class Compiler extends DiagnosticEmitter { var module = this.module; var stringType = this.program.stringInstance.type; + // Shortcut for `${expr}`, `prefix${expr}`, `${expr}suffix` + if ( + tag === null && + numParts == 2 && + expressions.length == 1 + ) { + // Shortcut for `${expr}` + if (!parts[0].length && !parts[1].length) { + let expression = expressions[0]; + return this.makeToString( + this.compileExpression(expression, stringType), + this.currentType, expression + ); + } + // TODO: Add shortcuts for `prefix${expr}` and `${expr}suffix` + } + // Compile to a `StaticArray#join("")` if untagged if (tag === null) { let length = 2 * numParts - 1; diff --git a/tests/compiler/templateliteral.optimized.wat b/tests/compiler/templateliteral.optimized.wat index dbe75c87b0..1d3d6635ad 100644 --- a/tests/compiler/templateliteral.optimized.wat +++ b/tests/compiler/templateliteral.optimized.wat @@ -1,9 +1,9 @@ (module (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) - (type $i32_=>_i32 (func (param i32) (result i32))) - (type $i32_=>_none (func (param i32))) (type $none_=>_none (func)) + (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + (type $i32_=>_none (func (param 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))) @@ -27,107 +27,220 @@ (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 21932)) (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 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 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) "\03\00\00\00\14\00\00\00\a0\04\00\00\00\00\00\00\a0\04\00\00\00\00\00\00\a0\04") + (data (i32.const 1244) "<") + (data (i32.const 1256) "\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 1340) "<") + (data (i32.const 1352) "\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 1404) ",") + (data (i32.const 1416) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") + (data (i32.const 1452) "<") + (data (i32.const 1464) "\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 1580) "<") + (data (i32.const 1592) "\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 1644) "\1c") + (data (i32.const 1656) "\01\00\00\00\04\00\00\00a\00b") (data (i32.const 1676) "\1c") - (data (i32.const 1688) "\01\00\00\00\04\00\00\00a\00b") + (data (i32.const 1688) "\01\00\00\00\06\00\00\00(\00A\00=") (data (i32.const 1708) "\1c") - (data (i32.const 1720) "\01\00\00\00\06\00\00\00(\00A\00=") + (data (i32.const 1720) "\01\00\00\00\08\00\00\00,\00 \00B\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 3788) "\1c") - (data (i32.const 3800) "\01\00\00\00\04\00\00\001\002") - (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 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 - 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.const 1316 + i32.const 1312 i32.store - i32.const 1240 - i32.const 1232 + i32.const 1320 + i32.const 1312 i32.store - i32.const 1232 + i32.const 1312 global.set $~lib/rt/itcms/toSpace memory.size i32.const 16 i32.shl - i32.const 22028 + i32.const 21932 i32.sub i32.const 1 i32.shr_u global.set $~lib/rt/itcms/threshold - i32.const 1444 - i32.const 1440 + i32.const 1524 + i32.const 1520 i32.store - i32.const 1448 - i32.const 1440 + i32.const 1528 + i32.const 1520 i32.store - i32.const 1440 + i32.const 1520 global.set $~lib/rt/itcms/pinSpace - i32.const 1476 - i32.const 1472 + i32.const 1556 + i32.const 1552 i32.store - i32.const 1480 - i32.const 1472 + i32.const 1560 + i32.const 1552 i32.store - i32.const 1472 + i32.const 1552 global.set $~lib/rt/itcms/fromSpace global.get $~lib/memory/__stack_pointer i32.const 24 @@ -4513,7 +4441,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5548 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4533,122 +4461,101 @@ 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.const 1216 i32.store offset=16 - i32.const 1648 + i32.const 1216 i32.const 1 i32.const 1056 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 1648 + i32.const 1216 i32.store offset=16 - i32.const 1648 + i32.const 1216 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.const 1216 i32.store offset=16 local.get $0 - i32.const 1120 + i32.const 1184 i32.store offset=20 - i32.const 1648 + i32.const 1216 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 1696 i32.store offset=12 + local.get $1 + i32.const 1664 + i32.store offset=8 local.get $0 - i32.const 1696 + i32.const 1664 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 1792 i32.store offset=16 - i32.const 1824 + i32.const 1792 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 1792 i32.store offset=16 - i32.const 1824 + i32.const 1792 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 1792 i32.store offset=16 local.get $0 - i32.const 1120 + i32.const 1184 i32.store offset=20 - i32.const 1824 + i32.const 1792 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 1840 + i32.store offset=8 local.get $0 - i32.const 1872 + i32.const 1840 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 +4570,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5548 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4676,50 +4583,30 @@ 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 3664 i32.store offset=4 local.get $0 - i32.const 3728 + i32.const 3664 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.const 3696 i32.store offset=8 i32.const 1 call $~lib/util/number/itoa32 @@ -4727,12 +4614,12 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 3760 + i32.const 3696 i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 3760 + i32.const 3696 i32.store offset=8 i32.const 2 call $~lib/util/number/itoa32 @@ -4740,18 +4627,18 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 3760 + i32.const 3696 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.const 3696 i32.store offset=8 local.get $0 - i32.const 1120 + i32.const 1184 i32.store offset=16 - i32.const 3760 + i32.const 3696 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer @@ -4759,22 +4646,22 @@ local.get $0 i32.store local.get $1 - i32.const 3808 + i32.const 3744 i32.store offset=4 local.get $0 - i32.const 3808 + i32.const 3744 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 3776 i32.store offset=8 i32.const 1 call $~lib/util/number/itoa32 @@ -4782,12 +4669,12 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 3840 + i32.const 3776 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 3776 i32.store offset=8 i32.const 2 call $~lib/util/number/itoa32 @@ -4795,18 +4682,18 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 3840 + i32.const 3776 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 3776 i32.store offset=8 local.get $0 - i32.const 1120 + i32.const 1184 i32.store offset=16 - i32.const 3840 + i32.const 3776 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer @@ -4814,15 +4701,15 @@ local.get $0 i32.store local.get $1 - i32.const 3888 + i32.const 3824 i32.store offset=4 local.get $0 - i32.const 3888 + i32.const 3824 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 +4724,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5548 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4850,50 +4737,30 @@ 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 5008 i32.store offset=4 local.get $0 - i32.const 5104 + i32.const 5008 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.const 5040 i32.store offset=8 f64.const 1 call $~lib/number/F64#toString @@ -4901,12 +4768,12 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 5136 + i32.const 5040 i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 5136 + i32.const 5040 i32.store offset=8 f64.const 2 call $~lib/number/F64#toString @@ -4914,18 +4781,18 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 5136 + i32.const 5040 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.const 5040 i32.store offset=8 local.get $0 - i32.const 1120 + i32.const 1184 i32.store offset=16 - i32.const 5136 + i32.const 5040 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer @@ -4933,22 +4800,22 @@ local.get $0 i32.store local.get $1 - i32.const 5184 + i32.const 5088 i32.store offset=4 local.get $0 - i32.const 5184 + i32.const 5088 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 5120 i32.store offset=8 f64.const 1 call $~lib/number/F64#toString @@ -4956,12 +4823,12 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 5216 + i32.const 5120 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 5120 i32.store offset=8 f64.const 2 call $~lib/number/F64#toString @@ -4969,18 +4836,18 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 5216 + i32.const 5120 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 5120 i32.store offset=8 local.get $0 - i32.const 1120 + i32.const 1184 i32.store offset=16 - i32.const 5216 + i32.const 5120 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer @@ -4988,15 +4855,15 @@ local.get $0 i32.store local.get $1 - i32.const 5264 + i32.const 5168 i32.store offset=4 local.get $0 - i32.const 5264 + i32.const 5168 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 @@ -5007,11 +4874,48 @@ i32.add global.set $~lib/memory/__stack_pointer 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 5548 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.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 + local.get $1 + i32.const 5216 + i32.store offset=4 + local.get $0 + i32.const 5216 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 30 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + 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 5548 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -5037,50 +4941,30 @@ 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 5280 i32.store offset=12 local.get $2 - i32.const 5376 + i32.const 5280 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 - i32.const 38 + i32.const 1120 + i32.const 44 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 5408 + i32.const 5312 i32.store offset=16 local.get $0 call $templateliteral/Ref#toString @@ -5088,12 +4972,12 @@ global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=20 - i32.const 5408 + i32.const 5312 i32.const 1 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 5408 + i32.const 5312 i32.store offset=16 local.get $1 call $templateliteral/Ref#toString @@ -5101,18 +4985,18 @@ global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=20 - i32.const 5408 + i32.const 5312 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.const 5312 i32.store offset=16 local.get $2 - i32.const 1120 + i32.const 1184 i32.store offset=24 - i32.const 5408 + i32.const 5312 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $2 global.get $~lib/memory/__stack_pointer @@ -5120,22 +5004,22 @@ local.get $2 i32.store offset=8 local.get $3 - i32.const 5456 + i32.const 5360 i32.store offset=12 local.get $2 - i32.const 5456 + i32.const 5360 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 - i32.const 39 + i32.const 1120 + i32.const 45 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 5504 + i32.const 5408 i32.store offset=16 local.get $0 call $templateliteral/Ref#toString @@ -5143,12 +5027,12 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=20 - i32.const 5504 + i32.const 5408 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 5408 i32.store offset=16 local.get $1 call $templateliteral/Ref#toString @@ -5156,18 +5040,18 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=20 - i32.const 5504 + i32.const 5408 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 5408 i32.store offset=16 local.get $0 - i32.const 1120 + i32.const 1184 i32.store offset=24 - i32.const 5504 + i32.const 5408 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer @@ -5175,16 +5059,16 @@ local.get $0 i32.store offset=8 local.get $1 - i32.const 5552 + i32.const 5456 i32.store offset=12 local.get $0 - i32.const 5552 + i32.const 5456 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1584 - i32.const 40 + i32.const 1120 + i32.const 46 i32.const 3 call $~lib/builtins/abort unreachable @@ -5195,13 +5079,82 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 22048 - i32.const 22096 + i32.const 21952 + i32.const 22000 i32.const 1 i32.const 1 call $~lib/builtins/abort unreachable ) + (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 + global.get $~started + if + return + end + i32.const 1 + global.set $~started + call $start:templateliteral + ) (func $templateliteral/Ref#toString (param $0 i32) (result i32) (local $1 i32) (local $2 i32) @@ -5212,7 +5165,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5548 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -5220,7 +5173,7 @@ i64.const 0 i64.store local.get $1 - i32.const 5344 + i32.const 5248 i32.store local.get $0 i32.load @@ -5235,14 +5188,14 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5548 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.const 5244 i32.load i32.const 1 i32.shr_u @@ -5266,7 +5219,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - i32.const 1120 + i32.const 1184 local.set $1 br $__inlined_func$~lib/string/String#concat end @@ -5277,7 +5230,7 @@ local.tee $1 i32.store local.get $1 - i32.const 5344 + i32.const 5248 local.get $2 call $~lib/memory/memory.copy local.get $1 @@ -5298,8 +5251,8 @@ local.get $1 return end - i32.const 22048 - i32.const 22096 + i32.const 21952 + i32.const 22000 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5314,11 +5267,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5548 i32.lt_s if - i32.const 22048 - i32.const 22096 + i32.const 21952 + i32.const 22000 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5334,7 +5287,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - i32.const 2144 + i32.const 2080 return end global.get $~lib/memory/__stack_pointer @@ -5426,11 +5379,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5644 + i32.const 5548 i32.lt_s if - i32.const 22048 - i32.const 22096 + i32.const 21952 + i32.const 22000 i32.const 1 i32.const 1 call $~lib/builtins/abort diff --git a/tests/compiler/templateliteral.ts b/tests/compiler/templateliteral.ts index adbabacd9b..a24385cb50 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,18 @@ 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; + assert(`${a}` == "2"); +} +test_fast_paths_string(); + class Ref { constructor(public value: i32) {} toString(): string { @@ -35,8 +41,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..10a9aa2b55 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,11 +17,11 @@ (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/ASC_SHRINK_LEVEL i32 (i32.const 0)) (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/visitCount (mut i32) (i32.const 0)) @@ -35,70 +35,224 @@ (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 4480)) + (global $~lib/memory/__data_end i32 (i32.const 4524)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20908)) + (global $~lib/memory/__heap_base i32 (i32.const 20908)) (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 - 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 + i32.const 192 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -5837,7 +5809,7 @@ i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 624 + i32.const 192 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -5846,13 +5818,13 @@ i32.const 3 local.get $1 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 624 + i32.const 192 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 @@ -5862,25 +5834,25 @@ 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 640 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 768 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -5889,7 +5861,7 @@ i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 800 + i32.const 768 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -5898,13 +5870,13 @@ i32.const 3 local.get $1 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 800 + i32.const 768 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 +5886,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 816 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 +5931,15 @@ local.set $0 i32.const 2 local.set $1 - i32.const 896 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=8 - local.get $2 - i32.const 1 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 896 - 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.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 i32.store local.get $2 - i32.const 2704 + i32.const 2640 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6003,13 +5949,13 @@ i32.eqz if i32.const 0 - i32.const 560 + i32.const 96 i32.const 13 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 2736 + i32.const 2672 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6025,7 +5971,7 @@ i32.store offset=12 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2736 + i32.const 2672 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6041,13 +5987,13 @@ i32.store offset=12 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2736 + i32.const 2672 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 @@ -6059,7 +6005,7 @@ local.get $2 i32.store local.get $2 - i32.const 2784 + i32.const 2720 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6069,13 +6015,13 @@ i32.eqz if i32.const 0 - i32.const 560 + i32.const 96 i32.const 14 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 2816 + i32.const 2752 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6091,7 +6037,7 @@ i32.store offset=12 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2816 + i32.const 2752 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6107,13 +6053,13 @@ i32.store offset=12 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2816 + i32.const 2752 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 @@ -6125,7 +6071,7 @@ local.get $2 i32.store local.get $2 - i32.const 2864 + i32.const 2800 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6135,7 +6081,7 @@ i32.eqz if i32.const 0 - i32.const 560 + i32.const 96 i32.const 15 i32.const 3 call $~lib/builtins/abort @@ -6168,41 +6114,15 @@ local.set $0 f64.const 2 local.set $1 - i32.const 2912 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=8 - local.get $2 - i32.const 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 offset=12 - local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2912 - 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.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 i32.store local.get $2 - i32.const 4080 + i32.const 3984 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6212,13 +6132,13 @@ i32.eqz if i32.const 0 - i32.const 560 + i32.const 96 i32.const 22 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 4112 + i32.const 4016 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6234,7 +6154,7 @@ i32.store offset=12 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4112 + i32.const 4016 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6250,13 +6170,13 @@ i32.store offset=12 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4112 + i32.const 4016 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 @@ -6268,7 +6188,7 @@ local.get $2 i32.store local.get $2 - i32.const 4160 + i32.const 4064 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6278,13 +6198,13 @@ i32.eqz if i32.const 0 - i32.const 560 + i32.const 96 i32.const 23 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 4192 + i32.const 4096 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6300,7 +6220,7 @@ i32.store offset=12 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4192 + i32.const 4096 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6316,13 +6236,13 @@ i32.store offset=12 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4192 + i32.const 4096 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 @@ -6334,7 +6254,7 @@ local.get $2 i32.store local.get $2 - i32.const 4240 + i32.const 4144 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6344,7 +6264,7 @@ i32.eqz if i32.const 0 - i32.const 560 + i32.const 96 i32.const 24 i32.const 3 call $~lib/builtins/abort @@ -6355,6 +6275,48 @@ i32.add global.set $~lib/memory/__stack_pointer ) + (func $templateliteral/test_fast_paths_string + (local $0 i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + i32.const 2 + local.set $0 + local.get $0 + i32.const 10 + call $~lib/number/I32#toString + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + local.get $1 + i32.const 4192 + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 30 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + 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 @@ -6365,7 +6327,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - i32.const 4320 + i32.const 4224 local.set $1 global.get $~lib/memory/__stack_pointer local.get $1 @@ -6421,40 +6383,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 4256 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6464,13 +6400,13 @@ i32.eqz if i32.const 0 - i32.const 560 - i32.const 38 + i32.const 96 + i32.const 44 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 4384 + i32.const 4288 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6485,7 +6421,7 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4384 + i32.const 4288 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6500,13 +6436,13 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4384 + 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 + i32.const 160 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6518,7 +6454,7 @@ local.get $2 i32.store offset=8 local.get $2 - i32.const 4432 + i32.const 4336 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6528,13 +6464,13 @@ i32.eqz if i32.const 0 - i32.const 560 - i32.const 39 + i32.const 96 + i32.const 45 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 4480 + i32.const 4384 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6549,7 +6485,7 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4480 + i32.const 4384 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6564,13 +6500,13 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4480 + 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 + i32.const 160 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6582,7 +6518,7 @@ local.get $2 i32.store offset=8 local.get $2 - i32.const 4528 + i32.const 4432 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6592,8 +6528,8 @@ i32.eqz if i32.const 0 - i32.const 560 - i32.const 40 + i32.const 96 + i32.const 46 i32.const 3 call $~lib/builtins/abort unreachable @@ -6633,7 +6569,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 +6590,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 +6778,8 @@ i32.gt_s end if - i32.const 928 - i32.const 1056 + i32.const 864 + i32.const 992 i32.const 373 i32.const 5 call $~lib/builtins/abort @@ -6852,7 +6788,7 @@ local.get $0 i32.eqz if - i32.const 1120 + i32.const 1056 local.set $8 global.get $~lib/memory/__stack_pointer i32.const 4 @@ -6998,7 +6934,7 @@ f64.const 0 f64.eq if - i32.const 2944 + i32.const 2848 local.set $3 global.get $~lib/memory/__stack_pointer i32.const 4 @@ -7018,7 +6954,7 @@ local.get $0 f64.ne if - i32.const 2976 + i32.const 2880 local.set $3 global.get $~lib/memory/__stack_pointer i32.const 4 @@ -7027,8 +6963,8 @@ local.get $3 return end - i32.const 3008 - i32.const 3056 + i32.const 2912 + i32.const 2960 local.get $0 f64.const 0 f64.lt @@ -7041,7 +6977,7 @@ local.get $3 return end - i32.const 3088 + i32.const 2992 local.get $0 call $~lib/util/number/dtoa_core i32.const 1 @@ -7054,7 +6990,7 @@ local.tee $2 i32.store local.get $2 - i32.const 3088 + i32.const 2992 local.get $1 call $~lib/memory/memory.copy local.get $2 @@ -7128,7 +7064,7 @@ i32.const 0 i32.eq if - i32.const 96 + i32.const 160 local.set $6 global.get $~lib/memory/__stack_pointer i32.const 4 From b95944e08b35b3131de9c19fd60bdd06583a55be Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 1 Aug 2021 16:45:41 +0300 Subject: [PATCH 02/16] more test --- tests/compiler/templateliteral.optimized.wat | 38 ++++++++++++--- tests/compiler/templateliteral.ts | 2 + tests/compiler/templateliteral.untouched.wat | 51 +++++++++++++++----- 3 files changed, 70 insertions(+), 21 deletions(-) diff --git a/tests/compiler/templateliteral.optimized.wat b/tests/compiler/templateliteral.optimized.wat index 1d3d6635ad..ac97699051 100644 --- a/tests/compiler/templateliteral.optimized.wat +++ b/tests/compiler/templateliteral.optimized.wat @@ -4874,7 +4874,7 @@ i32.add global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 12 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer @@ -4882,18 +4882,25 @@ i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer + local.tee $0 i64.const 0 i64.store + local.get $0 + i32.const 0 + i32.store offset=8 + 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 + i32.store offset=4 local.get $1 i32.const 5216 - i32.store offset=4 + i32.store offset=8 local.get $0 i32.const 5216 call $~lib/string/String.__eq @@ -4901,13 +4908,28 @@ if i32.const 0 i32.const 1120 - i32.const 30 + i32.const 31 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 8 + 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 12 i32.add global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer @@ -4958,7 +4980,7 @@ if i32.const 0 i32.const 1120 - i32.const 44 + i32.const 46 i32.const 3 call $~lib/builtins/abort unreachable @@ -5013,7 +5035,7 @@ if i32.const 0 i32.const 1120 - i32.const 45 + i32.const 47 i32.const 3 call $~lib/builtins/abort unreachable @@ -5068,7 +5090,7 @@ if i32.const 0 i32.const 1120 - i32.const 46 + i32.const 48 i32.const 3 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/templateliteral.ts b/tests/compiler/templateliteral.ts index a24385cb50..ecad9eed69 100644 --- a/tests/compiler/templateliteral.ts +++ b/tests/compiler/templateliteral.ts @@ -27,7 +27,9 @@ test_float(); function test_fast_paths_string(): void { var a = 2; + var b = "b"; assert(`${a}` == "2"); + assert(`${b}` == "b"); } test_fast_paths_string(); diff --git a/tests/compiler/templateliteral.untouched.wat b/tests/compiler/templateliteral.untouched.wat index 10a9aa2b55..ec44356d51 100644 --- a/tests/compiler/templateliteral.untouched.wat +++ b/tests/compiler/templateliteral.untouched.wat @@ -6278,42 +6278,67 @@ (func $templateliteral/test_fast_paths_string (local $0 i32) (local $1 i32) + (local $2 i32) global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 12 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 + i32.const 0 + i32.store offset=8 i32.const 2 local.set $0 + 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 $1 + local.set $2 global.get $~lib/memory/__stack_pointer - local.get $1 - i32.store - local.get $1 + local.get $2 + i32.store offset=4 + local.get $2 i32.const 4192 - local.set $1 + local.set $2 global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + 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.store offset=4 - 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 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 96 - i32.const 30 + i32.const 32 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 12 i32.add global.set $~lib/memory/__stack_pointer ) @@ -6401,7 +6426,7 @@ if i32.const 0 i32.const 96 - i32.const 44 + i32.const 46 i32.const 3 call $~lib/builtins/abort unreachable @@ -6465,7 +6490,7 @@ if i32.const 0 i32.const 96 - i32.const 45 + i32.const 47 i32.const 3 call $~lib/builtins/abort unreachable @@ -6529,7 +6554,7 @@ if i32.const 0 i32.const 96 - i32.const 46 + i32.const 48 i32.const 3 call $~lib/builtins/abort unreachable From fe0abb992aa9619d4dfab0aeb383fb3ba4937626 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 1 Aug 2021 16:57:47 +0300 Subject: [PATCH 03/16] refactor --- src/compiler.ts | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index d0f4268f22..46e115931e 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8146,33 +8146,30 @@ 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; - // Shortcut for `${expr}`, `prefix${expr}`, `${expr}suffix` - if ( - tag === null && - numParts == 2 && - expressions.length == 1 - ) { - // Shortcut for `${expr}` - if (!parts[0].length && !parts[1].length) { - let expression = expressions[0]; - return this.makeToString( - this.compileExpression(expression, stringType), - this.currentType, expression - ); - } - // TODO: Add shortcuts for `prefix${expr}` and `${expr}suffix` - } - // 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}`, `prefix${expr}`, `${expr}suffix` + if (numParts == 2) { + // Shortcut for `${expr}` + if (!parts[0].length && !parts[1].length) { + let expression = expressions[0]; + return this.makeToString( + this.compileExpression(expression, stringType), + this.currentType, expression + ); + } + // TODO: Add shortcuts for `prefix${expr}` and `${expr}suffix` + } + let length = 2 * numParts - 1; let values = new Array(length); values[0] = this.ensureStaticString(parts[0]); From 8fd30c112db52fd3437e79346db937b2987b06a5 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 1 Aug 2021 17:18:41 +0300 Subject: [PATCH 04/16] remove prod --- src/compiler.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 46e115931e..e0a07c9322 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8157,9 +8157,9 @@ export class Compiler extends DiagnosticEmitter { return this.ensureStaticString(parts[0]); } - // Shortcut for `${expr}`, `prefix${expr}`, `${expr}suffix` + // Shortcut for `${expr}`, `${expr}`, `${expr}` if (numParts == 2) { - // Shortcut for `${expr}` + // Shortcut for `${expr}` -> expr.toString() if (!parts[0].length && !parts[1].length) { let expression = expressions[0]; return this.makeToString( @@ -8167,7 +8167,16 @@ export class Compiler extends DiagnosticEmitter { this.currentType, expression ); } - // TODO: Add shortcuts for `prefix${expr}` and `${expr}suffix` + // Shortcut for `${expr}` -> "" + expr.toString() + if (parts[0].length && !parts[1].length) { + let expression = expressions[0]; + let lhs = this.ensureStaticString(parts[0]); + let rhs = this.makeToString( + this.compileExpression(expression, stringType), + this.currentType, expression + ); + } + // TODO: Add shortcuts for `${expr}` } let length = 2 * numParts - 1; From 486e45d35a15155b9b43a00b723da2949cafd957 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 1 Aug 2021 17:44:52 +0300 Subject: [PATCH 05/16] wip --- src/compiler.ts | 38 +- tests/compiler/templateliteral.optimized.wat | 610 ++++++++++++------- tests/compiler/templateliteral.ts | 4 + tests/compiler/templateliteral.untouched.wat | 258 ++++++-- 4 files changed, 601 insertions(+), 309 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index e0a07c9322..40c72fe250 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8159,24 +8159,38 @@ export class Compiler extends DiagnosticEmitter { // Shortcut for `${expr}`, `${expr}`, `${expr}` if (numParts == 2) { - // Shortcut for `${expr}` -> expr.toString() - if (!parts[0].length && !parts[1].length) { - let expression = expressions[0]; + let expression = expressions[0]; + let lhsLen = parts[0].length; + let rhsLen = parts[1].length; + if (!lhsLen && !rhsLen) { + // Shortcut for `${expr}` -> expr.toString() return this.makeToString( this.compileExpression(expression, stringType), this.currentType, expression ); } - // Shortcut for `${expr}` -> "" + expr.toString() - if (parts[0].length && !parts[1].length) { - let expression = expressions[0]; - let lhs = this.ensureStaticString(parts[0]); - let rhs = this.makeToString( - this.compileExpression(expression, stringType), - this.currentType, expression - ); + if ((lhsLen && !rhsLen) || (!lhsLen && rhsLen)) { + let lhs: ExpressionRef; + let rhs: ExpressionRef; + if (lhsLen && !rhsLen) { + // Shortcut for `${expr}` -> "" + expr.toString() + lhs = this.ensureStaticString(parts[0]); + rhs = this.makeToString( + this.compileExpression(expression, stringType), + this.currentType, expression + ); + } else { + // Shortcut for `${expr}` -> expr.toString() + "" + lhs = this.makeToString( + this.compileExpression(expression, stringType), + this.currentType, expression + ); + rhs = this.ensureStaticString(parts[0]); + } + let stringInstance = this.program.stringInstance; + let concatMethod = assert(stringInstance.getMethod("concat")); + return this.makeCallDirect(concatMethod, [ lhs, rhs ], expression); } - // TODO: Add shortcuts for `${expr}` } let length = 2 * numParts - 1; diff --git a/tests/compiler/templateliteral.optimized.wat b/tests/compiler/templateliteral.optimized.wat index ac97699051..4b77645163 100644 --- a/tests/compiler/templateliteral.optimized.wat +++ b/tests/compiler/templateliteral.optimized.wat @@ -1,9 +1,9 @@ (module (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) - (type $none_=>_none (func)) - (type $i32_=>_i32 (func (param i32) (result 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_=>_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))) @@ -27,7 +27,7 @@ (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 21932)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 22092)) (global $~started (mut i32) (i32.const 0)) (memory $0 1) (data (i32.const 1036) "\1c") @@ -107,19 +107,29 @@ (data (i32.const 5196) "\1c") (data (i32.const 5208) "\01\00\00\00\02\00\00\002") (data (i32.const 5228) "\1c") - (data (i32.const 5240) "\01\00\00\00\08\00\00\00r\00e\00f\00#") + (data (i32.const 5240) "\01\00\00\00\08\00\00\00p\00r\00e\00f") (data (i32.const 5260) "\1c") - (data (i32.const 5272) "\01\00\00\00\n\00\00\00r\00e\00f\00#\001") - (data (i32.const 5292) ",") - (data (i32.const 5304) "\03\00\00\00\14\00\00\00\a0\04\00\00\00\00\00\00\a0\04\00\00\00\00\00\00\a0\04") - (data (i32.const 5340) ",") - (data (i32.const 5352) "\01\00\00\00\14\00\00\00r\00e\00f\00#\001\00r\00e\00f\00#\002") - (data (i32.const 5388) ",") - (data (i32.const 5400) "\03\00\00\00\14\00\00\00\a0\06\00\00\00\00\00\00\c0\06\00\00\00\00\00\00\e0\06") - (data (i32.const 5436) "<") - (data (i32.const 5448) "\01\00\00\00$\00\00\00(\00A\00=\00r\00e\00f\00#\001\00,\00 \00B\00=\00r\00e\00f\00#\002\00)") - (data (i32.const 5504) "\05\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 5532) "\04A\00\00\00\00\00\00 ") + (data (i32.const 5272) "\01\00\00\00\n\00\00\00p\00r\00e\00f\002") + (data (i32.const 5292) "\1c") + (data (i32.const 5304) "\01\00\00\00\n\00\00\00p\00r\00e\00f\00b") + (data (i32.const 5324) "\1c") + (data (i32.const 5336) "\01\00\00\00\n\00\00\002\00s\00u\00f\00f") + (data (i32.const 5356) "\1c") + (data (i32.const 5368) "\01\00\00\00\n\00\00\00b\00s\00u\00f\00f") + (data (i32.const 5388) "\1c") + (data (i32.const 5400) "\01\00\00\00\08\00\00\00r\00e\00f\00#") + (data (i32.const 5420) "\1c") + (data (i32.const 5432) "\01\00\00\00\n\00\00\00r\00e\00f\00#\001") + (data (i32.const 5452) ",") + (data (i32.const 5464) "\03\00\00\00\14\00\00\00\a0\04\00\00\00\00\00\00\a0\04\00\00\00\00\00\00\a0\04") + (data (i32.const 5500) ",") + (data (i32.const 5512) "\01\00\00\00\14\00\00\00r\00e\00f\00#\001\00r\00e\00f\00#\002") + (data (i32.const 5548) ",") + (data (i32.const 5560) "\03\00\00\00\14\00\00\00\a0\06\00\00\00\00\00\00\c0\06\00\00\00\00\00\00\e0\06") + (data (i32.const 5596) "<") + (data (i32.const 5608) "\01\00\00\00$\00\00\00(\00A\00=\00r\00e\00f\00#\001\00,\00 \00B\00=\00r\00e\00f\00#\002\00)") + (data (i32.const 5664) "\05\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 5692) "\04A\00\00\00\00\00\00 ") (export "memory" (memory $0)) (export "_start" (func $~start)) (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) @@ -274,7 +284,7 @@ if i32.const 0 local.get $0 - i32.const 21932 + i32.const 22092 i32.lt_u local.get $0 i32.load offset=8 @@ -325,7 +335,7 @@ i32.const 1 else local.get $1 - i32.const 5504 + i32.const 5664 i32.load i32.gt_u if @@ -339,7 +349,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 5508 + i32.const 5668 i32.add i32.load i32.const 32 @@ -1046,10 +1056,10 @@ if unreachable end - i32.const 21936 + i32.const 22096 i32.const 0 i32.store - i32.const 23504 + i32.const 23664 i32.const 0 i32.store loop $for-loop|0 @@ -1060,7 +1070,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 21936 + i32.const 22096 i32.add i32.const 0 i32.store offset=4 @@ -1078,7 +1088,7 @@ i32.add i32.const 2 i32.shl - i32.const 21936 + i32.const 22096 i32.add i32.const 0 i32.store offset=96 @@ -1096,13 +1106,13 @@ br $for-loop|0 end end - i32.const 21936 - i32.const 23508 + i32.const 22096 + i32.const 23668 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 21936 + i32.const 22096 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1186,7 +1196,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 21932 + i32.const 22092 i32.lt_u if local.get $0 @@ -1281,7 +1291,7 @@ unreachable end local.get $0 - i32.const 21932 + i32.const 22092 i32.lt_u if local.get $0 @@ -1304,7 +1314,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 21932 + i32.const 22092 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -2954,11 +2964,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5548 + i32.const 5708 i32.lt_s if - i32.const 21952 - i32.const 22000 + i32.const 22112 + i32.const 22160 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4319,11 +4329,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5548 + i32.const 5708 i32.lt_s if - i32.const 21952 - i32.const 22000 + i32.const 22112 + i32.const 22160 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4398,11 +4408,77 @@ end local.get $1 ) - (func $start:templateliteral + (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 (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 1316 i32.const 1312 i32.store @@ -4414,7 +4490,7 @@ memory.size i32.const 16 i32.shl - i32.const 21932 + i32.const 22092 i32.sub i32.const 1 i32.shr_u @@ -4441,7 +4517,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 5548 + i32.const 5708 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4570,7 +4646,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5548 + i32.const 5708 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4724,7 +4800,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5548 + i32.const 5708 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4874,11 +4950,11 @@ i32.add global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 12 + i32.const 20 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5548 + i32.const 5708 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4886,8 +4962,11 @@ i64.const 0 i64.store local.get $0 + i64.const 0 + i64.store offset=8 + local.get $0 i32.const 0 - i32.store offset=8 + i32.store offset=16 local.get $0 i32.const 1088 i32.store @@ -4929,7 +5008,124 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 12 + i32.const 5248 + 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 5248 + 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 5280 + i32.store offset=8 + local.get $0 + i32.const 5280 + 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 5248 + i32.store offset=12 + i32.const 5248 + 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 5312 + i32.store offset=8 + local.get $0 + i32.const 5312 + 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 1184 + i32.store offset=16 + local.get $0 + i32.const 1184 + 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 5344 + i32.store offset=8 + local.get $0 + i32.const 5344 + 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 1184 + i32.store offset=16 + i32.const 1088 + i32.const 1184 + 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 5376 + i32.store offset=8 + local.get $0 + i32.const 5376 + 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 + global.get $~lib/memory/__stack_pointer + i32.const 20 i32.add global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer @@ -4937,7 +5133,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5548 + i32.const 5708 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4971,22 +5167,22 @@ local.get $2 i32.store offset=8 local.get $3 - i32.const 5280 + i32.const 5440 i32.store offset=12 local.get $2 - i32.const 5280 + i32.const 5440 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 46 + i32.const 50 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 5312 + i32.const 5472 i32.store offset=16 local.get $0 call $templateliteral/Ref#toString @@ -4994,12 +5190,12 @@ global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=20 - i32.const 5312 + i32.const 5472 i32.const 1 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 5312 + i32.const 5472 i32.store offset=16 local.get $1 call $templateliteral/Ref#toString @@ -5007,18 +5203,18 @@ global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=20 - i32.const 5312 + i32.const 5472 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 5312 + i32.const 5472 i32.store offset=16 local.get $2 i32.const 1184 i32.store offset=24 - i32.const 5312 + i32.const 5472 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $2 global.get $~lib/memory/__stack_pointer @@ -5026,22 +5222,22 @@ local.get $2 i32.store offset=8 local.get $3 - i32.const 5360 + i32.const 5520 i32.store offset=12 local.get $2 - i32.const 5360 + i32.const 5520 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 47 + i32.const 51 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 5408 + i32.const 5568 i32.store offset=16 local.get $0 call $templateliteral/Ref#toString @@ -5049,12 +5245,12 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=20 - i32.const 5408 + i32.const 5568 i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 5408 + i32.const 5568 i32.store offset=16 local.get $1 call $templateliteral/Ref#toString @@ -5062,18 +5258,18 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=20 - i32.const 5408 + i32.const 5568 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 5408 + i32.const 5568 i32.store offset=16 local.get $0 i32.const 1184 i32.store offset=24 - i32.const 5408 + i32.const 5568 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer @@ -5081,16 +5277,16 @@ local.get $0 i32.store offset=8 local.get $1 - i32.const 5456 + i32.const 5616 i32.store offset=12 local.get $0 - i32.const 5456 + i32.const 5616 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 48 + i32.const 52 i32.const 3 call $~lib/builtins/abort unreachable @@ -5101,184 +5297,51 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 21952 - i32.const 22000 + i32.const 22112 + i32.const 22160 i32.const 1 i32.const 1 call $~lib/builtins/abort unreachable ) - (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 - global.get $~started - if - return - end - i32.const 1 - global.set $~started - call $start:templateliteral - ) (func $templateliteral/Ref#toString (param $0 i32) (result 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 5548 - 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 5248 - 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 5548 - 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 5244 - i32.load - i32.const 1 - i32.shr_u - i32.const 1 - i32.shl - local.tee $2 - 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 1184 - local.set $1 - br $__inlined_func$~lib/string/String#concat - 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 5248 - 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 - end - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $1 - return + global.get $~lib/memory/__stack_pointer + i32.const 5708 + i32.lt_s + if + i32.const 22112 + i32.const 22160 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable end - i32.const 21952 - i32.const 22000 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable + global.get $~lib/memory/__stack_pointer + local.tee $1 + i64.const 0 + i64.store + local.get $1 + i32.const 5408 + 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 5408 + 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/util/number/itoa32 (param $0 i32) (result i32) (local $1 i32) @@ -5289,11 +5352,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5548 + i32.const 5708 i32.lt_s if - i32.const 21952 - i32.const 22000 + i32.const 22112 + i32.const 22160 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5394,6 +5457,79 @@ global.set $~lib/memory/__stack_pointer local.get $0 ) + (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 5708 + i32.lt_s + if + i32.const 22112 + i32.const 22160 + 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 4 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 1184 + return + end + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.const 1 + 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 $templateliteral/Ref#constructor (param $0 i32) (result i32) (local $1 i32) global.get $~lib/memory/__stack_pointer @@ -5401,11 +5537,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5548 + i32.const 5708 i32.lt_s if - i32.const 21952 - i32.const 22000 + i32.const 22112 + i32.const 22160 i32.const 1 i32.const 1 call $~lib/builtins/abort diff --git a/tests/compiler/templateliteral.ts b/tests/compiler/templateliteral.ts index ecad9eed69..52505c6de8 100644 --- a/tests/compiler/templateliteral.ts +++ b/tests/compiler/templateliteral.ts @@ -30,6 +30,10 @@ function test_fast_paths_string(): void { 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"); } test_fast_paths_string(); diff --git a/tests/compiler/templateliteral.untouched.wat b/tests/compiler/templateliteral.untouched.wat index ec44356d51..52dc9f0111 100644 --- a/tests/compiler/templateliteral.untouched.wat +++ b/tests/compiler/templateliteral.untouched.wat @@ -35,10 +35,10 @@ (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 4480)) - (global $~lib/memory/__data_end i32 (i32.const 4524)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20908)) - (global $~lib/memory/__heap_base i32 (i32.const 20908)) + (global $~lib/rt/__rtti_base i32 (i32.const 4640)) + (global $~lib/memory/__data_end i32 (i32.const 4684)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 21068)) + (global $~lib/memory/__heap_base i32 (i32.const 21068)) (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") @@ -85,13 +85,18 @@ (data (i32.const 4076) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\a0\02\00\00\00\00\00\00\c0\02\00\00\00\00\00\00\e0\02\00\00\00\00\00\00\00\00\00\00") (data (i32.const 4124) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1c\00\00\00(\00A\00=\001\00.\000\00,\00 \00B\00=\002\00.\000\00)\00") (data (i32.const 4172) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\002\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 4204) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\08\00\00\00r\00e\00f\00#\00\00\00\00\00") - (data (i32.const 4236) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00r\00e\00f\00#\001\00\00\00") - (data (i32.const 4268) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\a0\00\00\00\00\00\00\00\a0\00\00\00\00\00\00\00\a0\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 4316) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00r\00e\00f\00#\001\00r\00e\00f\00#\002\00\00\00\00\00\00\00\00\00") - (data (i32.const 4364) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\a0\02\00\00\00\00\00\00\c0\02\00\00\00\00\00\00\e0\02\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 4412) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00$\00\00\00(\00A\00=\00r\00e\00f\00#\001\00,\00 \00B\00=\00r\00e\00f\00#\002\00)\00\00\00\00\00\00\00\00\00") - (data (i32.const 4480) "\05\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\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00") + (data (i32.const 4204) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\08\00\00\00p\00r\00e\00f\00\00\00\00\00") + (data (i32.const 4236) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00p\00r\00e\00f\002\00\00\00") + (data (i32.const 4268) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00p\00r\00e\00f\00b\00\00\00") + (data (i32.const 4300) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\002\00s\00u\00f\00f\00\00\00") + (data (i32.const 4332) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00b\00s\00u\00f\00f\00\00\00") + (data (i32.const 4364) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\08\00\00\00r\00e\00f\00#\00\00\00\00\00") + (data (i32.const 4396) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00r\00e\00f\00#\001\00\00\00") + (data (i32.const 4428) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\a0\00\00\00\00\00\00\00\a0\00\00\00\00\00\00\00\a0\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 4476) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00r\00e\00f\00#\001\00r\00e\00f\00#\002\00\00\00\00\00\00\00\00\00") + (data (i32.const 4524) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\a0\02\00\00\00\00\00\00\c0\02\00\00\00\00\00\00\e0\02\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 4572) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00$\00\00\00(\00A\00=\00r\00e\00f\00#\001\00,\00 \00B\00=\00r\00e\00f\00#\002\00)\00\00\00\00\00\00\00\00\00") + (data (i32.const 4640) "\05\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\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00") (table $0 1 funcref) (elem $0 (i32.const 1)) (export "memory" (memory $0)) @@ -5749,8 +5754,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 20928 - i32.const 20976 + i32.const 21088 + i32.const 21136 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6280,7 +6285,7 @@ (local $1 i32) (local $2 i32) global.get $~lib/memory/__stack_pointer - i32.const 12 + i32.const 20 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check @@ -6288,8 +6293,11 @@ 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=8 + i32.store offset=16 i32.const 2 local.set $0 global.get $~lib/memory/__stack_pointer @@ -6337,8 +6345,138 @@ call $~lib/builtins/abort unreachable end + i32.const 4224 + local.set $2 global.get $~lib/memory/__stack_pointer - i32.const 12 + 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/string/String#concat + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + i32.const 4256 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 33 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 4224 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=12 + local.get $2 + local.get $1 + call $~lib/string/String#concat + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + i32.const 4288 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + 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 + i32.const 160 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=16 + local.get $2 + call $~lib/string/String#concat + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + i32.const 4320 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 35 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 160 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=16 + local.get $2 + call $~lib/string/String#concat + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + i32.const 4352 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + 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 + global.get $~lib/memory/__stack_pointer + i32.const 20 i32.add global.set $~lib/memory/__stack_pointer ) @@ -6352,7 +6490,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - i32.const 4224 + i32.const 4384 local.set $1 global.get $~lib/memory/__stack_pointer local.get $1 @@ -6415,7 +6553,7 @@ local.get $2 i32.store offset=8 local.get $2 - i32.const 4256 + i32.const 4416 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6426,12 +6564,12 @@ if i32.const 0 i32.const 96 - i32.const 46 + i32.const 50 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 4288 + i32.const 4448 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6446,7 +6584,7 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4288 + i32.const 4448 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6461,7 +6599,7 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4288 + i32.const 4448 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6479,7 +6617,7 @@ local.get $2 i32.store offset=8 local.get $2 - i32.const 4336 + i32.const 4496 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6490,12 +6628,12 @@ if i32.const 0 i32.const 96 - i32.const 47 + i32.const 51 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 4384 + i32.const 4544 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6510,7 +6648,7 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4384 + i32.const 4544 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6525,7 +6663,7 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4384 + i32.const 4544 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6543,7 +6681,7 @@ local.get $2 i32.store offset=8 local.get $2 - i32.const 4432 + i32.const 4592 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6554,7 +6692,7 @@ if i32.const 0 i32.const 96 - i32.const 48 + i32.const 52 i32.const 3 call $~lib/builtins/abort unreachable @@ -7026,37 +7164,6 @@ global.set $~lib/memory/__stack_pointer local.get $3 ) - (func $templateliteral/Ref#constructor (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - local.get $0 - i32.eqz - if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.const 4 - call $~lib/rt/itcms/__new - local.tee $0 - i32.store - end - local.get $0 - local.get $1 - call $templateliteral/Ref#set:value - local.get $0 - local.set $2 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - 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) @@ -7122,4 +7229,35 @@ global.set $~lib/memory/__stack_pointer local.get $6 ) + (func $templateliteral/Ref#constructor (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + end + local.get $0 + local.get $1 + call $templateliteral/Ref#set:value + local.get $0 + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + ) ) From 9bd3006e23797f290d7a6f85b212732dd88c3210 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 1 Aug 2021 17:56:46 +0300 Subject: [PATCH 06/16] fix --- src/compiler.ts | 2 +- tests/compiler/templateliteral.optimized.wat | 166 ++++++++++--------- tests/compiler/templateliteral.untouched.wat | 59 +++---- 3 files changed, 115 insertions(+), 112 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 40c72fe250..9ba807c3e4 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8185,7 +8185,7 @@ export class Compiler extends DiagnosticEmitter { this.compileExpression(expression, stringType), this.currentType, expression ); - rhs = this.ensureStaticString(parts[0]); + rhs = this.ensureStaticString(parts[1]); } let stringInstance = this.program.stringInstance; let concatMethod = assert(stringInstance.getMethod("concat")); diff --git a/tests/compiler/templateliteral.optimized.wat b/tests/compiler/templateliteral.optimized.wat index 4b77645163..16d224f05a 100644 --- a/tests/compiler/templateliteral.optimized.wat +++ b/tests/compiler/templateliteral.optimized.wat @@ -27,7 +27,7 @@ (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 22092)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 22124)) (global $~started (mut i32) (i32.const 0)) (memory $0 1) (data (i32.const 1036) "\1c") @@ -113,23 +113,25 @@ (data (i32.const 5292) "\1c") (data (i32.const 5304) "\01\00\00\00\n\00\00\00p\00r\00e\00f\00b") (data (i32.const 5324) "\1c") - (data (i32.const 5336) "\01\00\00\00\n\00\00\002\00s\00u\00f\00f") + (data (i32.const 5336) "\01\00\00\00\08\00\00\00s\00u\00f\00f") (data (i32.const 5356) "\1c") - (data (i32.const 5368) "\01\00\00\00\n\00\00\00b\00s\00u\00f\00f") + (data (i32.const 5368) "\01\00\00\00\n\00\00\002\00s\00u\00f\00f") (data (i32.const 5388) "\1c") - (data (i32.const 5400) "\01\00\00\00\08\00\00\00r\00e\00f\00#") + (data (i32.const 5400) "\01\00\00\00\n\00\00\00b\00s\00u\00f\00f") (data (i32.const 5420) "\1c") - (data (i32.const 5432) "\01\00\00\00\n\00\00\00r\00e\00f\00#\001") - (data (i32.const 5452) ",") - (data (i32.const 5464) "\03\00\00\00\14\00\00\00\a0\04\00\00\00\00\00\00\a0\04\00\00\00\00\00\00\a0\04") - (data (i32.const 5500) ",") - (data (i32.const 5512) "\01\00\00\00\14\00\00\00r\00e\00f\00#\001\00r\00e\00f\00#\002") - (data (i32.const 5548) ",") - (data (i32.const 5560) "\03\00\00\00\14\00\00\00\a0\06\00\00\00\00\00\00\c0\06\00\00\00\00\00\00\e0\06") - (data (i32.const 5596) "<") - (data (i32.const 5608) "\01\00\00\00$\00\00\00(\00A\00=\00r\00e\00f\00#\001\00,\00 \00B\00=\00r\00e\00f\00#\002\00)") - (data (i32.const 5664) "\05\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 5692) "\04A\00\00\00\00\00\00 ") + (data (i32.const 5432) "\01\00\00\00\08\00\00\00r\00e\00f\00#") + (data (i32.const 5452) "\1c") + (data (i32.const 5464) "\01\00\00\00\n\00\00\00r\00e\00f\00#\001") + (data (i32.const 5484) ",") + (data (i32.const 5496) "\03\00\00\00\14\00\00\00\a0\04\00\00\00\00\00\00\a0\04\00\00\00\00\00\00\a0\04") + (data (i32.const 5532) ",") + (data (i32.const 5544) "\01\00\00\00\14\00\00\00r\00e\00f\00#\001\00r\00e\00f\00#\002") + (data (i32.const 5580) ",") + (data (i32.const 5592) "\03\00\00\00\14\00\00\00\a0\06\00\00\00\00\00\00\c0\06\00\00\00\00\00\00\e0\06") + (data (i32.const 5628) "<") + (data (i32.const 5640) "\01\00\00\00$\00\00\00(\00A\00=\00r\00e\00f\00#\001\00,\00 \00B\00=\00r\00e\00f\00#\002\00)") + (data (i32.const 5696) "\05\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 5724) "\04A\00\00\00\00\00\00 ") (export "memory" (memory $0)) (export "_start" (func $~start)) (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) @@ -284,7 +286,7 @@ if i32.const 0 local.get $0 - i32.const 22092 + i32.const 22124 i32.lt_u local.get $0 i32.load offset=8 @@ -335,7 +337,7 @@ i32.const 1 else local.get $1 - i32.const 5664 + i32.const 5696 i32.load i32.gt_u if @@ -349,7 +351,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 5668 + i32.const 5700 i32.add i32.load i32.const 32 @@ -1056,10 +1058,10 @@ if unreachable end - i32.const 22096 + i32.const 22128 i32.const 0 i32.store - i32.const 23664 + i32.const 23696 i32.const 0 i32.store loop $for-loop|0 @@ -1070,7 +1072,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 22096 + i32.const 22128 i32.add i32.const 0 i32.store offset=4 @@ -1088,7 +1090,7 @@ i32.add i32.const 2 i32.shl - i32.const 22096 + i32.const 22128 i32.add i32.const 0 i32.store offset=96 @@ -1106,13 +1108,13 @@ br $for-loop|0 end end - i32.const 22096 - i32.const 23668 + i32.const 22128 + i32.const 23700 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 22096 + i32.const 22128 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1196,7 +1198,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 22092 + i32.const 22124 i32.lt_u if local.get $0 @@ -1291,7 +1293,7 @@ unreachable end local.get $0 - i32.const 22092 + i32.const 22124 i32.lt_u if local.get $0 @@ -1314,7 +1316,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 22092 + i32.const 22124 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -2964,11 +2966,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5708 + i32.const 5740 i32.lt_s if - i32.const 22112 - i32.const 22160 + i32.const 22144 + i32.const 22192 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4329,11 +4331,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5708 + i32.const 5740 i32.lt_s if - i32.const 22112 - i32.const 22160 + i32.const 22144 + i32.const 22192 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4490,7 +4492,7 @@ memory.size i32.const 16 i32.shl - i32.const 22092 + i32.const 22124 i32.sub i32.const 1 i32.shr_u @@ -4517,7 +4519,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 5708 + i32.const 5740 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4646,7 +4648,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5708 + i32.const 5740 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4800,7 +4802,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5708 + i32.const 5740 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4954,7 +4956,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5708 + i32.const 5740 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -5073,10 +5075,10 @@ local.get $0 i32.store offset=12 local.get $1 - i32.const 1184 + i32.const 5344 i32.store offset=16 local.get $0 - i32.const 1184 + i32.const 5344 call $~lib/string/String#concat local.set $0 global.get $~lib/memory/__stack_pointer @@ -5084,10 +5086,10 @@ local.get $0 i32.store offset=4 local.get $1 - i32.const 5344 + i32.const 5376 i32.store offset=8 local.get $0 - i32.const 5344 + i32.const 5376 call $~lib/string/String.__eq i32.eqz if @@ -5099,10 +5101,10 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1184 + i32.const 5344 i32.store offset=16 i32.const 1088 - i32.const 1184 + i32.const 5344 call $~lib/string/String#concat local.set $0 global.get $~lib/memory/__stack_pointer @@ -5110,10 +5112,10 @@ local.get $0 i32.store offset=4 local.get $1 - i32.const 5376 + i32.const 5408 i32.store offset=8 local.get $0 - i32.const 5376 + i32.const 5408 call $~lib/string/String.__eq i32.eqz if @@ -5133,7 +5135,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5708 + i32.const 5740 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -5167,10 +5169,10 @@ local.get $2 i32.store offset=8 local.get $3 - i32.const 5440 + i32.const 5472 i32.store offset=12 local.get $2 - i32.const 5440 + i32.const 5472 call $~lib/string/String.__eq i32.eqz if @@ -5182,7 +5184,7 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 5472 + i32.const 5504 i32.store offset=16 local.get $0 call $templateliteral/Ref#toString @@ -5190,12 +5192,12 @@ global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=20 - i32.const 5472 + i32.const 5504 i32.const 1 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 5472 + i32.const 5504 i32.store offset=16 local.get $1 call $templateliteral/Ref#toString @@ -5203,18 +5205,18 @@ global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=20 - i32.const 5472 + i32.const 5504 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 5472 + i32.const 5504 i32.store offset=16 local.get $2 i32.const 1184 i32.store offset=24 - i32.const 5472 + i32.const 5504 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $2 global.get $~lib/memory/__stack_pointer @@ -5222,10 +5224,10 @@ local.get $2 i32.store offset=8 local.get $3 - i32.const 5520 + i32.const 5552 i32.store offset=12 local.get $2 - i32.const 5520 + i32.const 5552 call $~lib/string/String.__eq i32.eqz if @@ -5237,7 +5239,7 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 5568 + i32.const 5600 i32.store offset=16 local.get $0 call $templateliteral/Ref#toString @@ -5245,12 +5247,12 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=20 - i32.const 5568 + i32.const 5600 i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 5568 + i32.const 5600 i32.store offset=16 local.get $1 call $templateliteral/Ref#toString @@ -5258,18 +5260,18 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=20 - i32.const 5568 + i32.const 5600 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 5568 + i32.const 5600 i32.store offset=16 local.get $0 i32.const 1184 i32.store offset=24 - i32.const 5568 + i32.const 5600 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer @@ -5277,10 +5279,10 @@ local.get $0 i32.store offset=8 local.get $1 - i32.const 5616 + i32.const 5648 i32.store offset=12 local.get $0 - i32.const 5616 + i32.const 5648 call $~lib/string/String.__eq i32.eqz if @@ -5297,8 +5299,8 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 22112 - i32.const 22160 + i32.const 22144 + i32.const 22192 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5311,11 +5313,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5708 + i32.const 5740 i32.lt_s if - i32.const 22112 - i32.const 22160 + i32.const 22144 + i32.const 22192 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5326,7 +5328,7 @@ i64.const 0 i64.store local.get $1 - i32.const 5408 + i32.const 5440 i32.store local.get $0 i32.load @@ -5335,7 +5337,7 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=4 - i32.const 5408 + i32.const 5440 local.get $0 call $~lib/string/String#concat global.get $~lib/memory/__stack_pointer @@ -5352,11 +5354,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5708 + i32.const 5740 i32.lt_s if - i32.const 22112 - i32.const 22160 + i32.const 22144 + i32.const 22192 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5466,11 +5468,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5708 + i32.const 5740 i32.lt_s if - i32.const 22112 - i32.const 22160 + i32.const 22144 + i32.const 22192 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5537,11 +5539,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5708 + i32.const 5740 i32.lt_s if - i32.const 22112 - i32.const 22160 + i32.const 22144 + i32.const 22192 i32.const 1 i32.const 1 call $~lib/builtins/abort diff --git a/tests/compiler/templateliteral.untouched.wat b/tests/compiler/templateliteral.untouched.wat index 52dc9f0111..2c77370e6a 100644 --- a/tests/compiler/templateliteral.untouched.wat +++ b/tests/compiler/templateliteral.untouched.wat @@ -35,10 +35,10 @@ (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 4640)) - (global $~lib/memory/__data_end i32 (i32.const 4684)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 21068)) - (global $~lib/memory/__heap_base i32 (i32.const 21068)) + (global $~lib/rt/__rtti_base i32 (i32.const 4672)) + (global $~lib/memory/__data_end i32 (i32.const 4716)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 21100)) + (global $~lib/memory/__heap_base i32 (i32.const 21100)) (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") @@ -88,15 +88,16 @@ (data (i32.const 4204) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\08\00\00\00p\00r\00e\00f\00\00\00\00\00") (data (i32.const 4236) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00p\00r\00e\00f\002\00\00\00") (data (i32.const 4268) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00p\00r\00e\00f\00b\00\00\00") - (data (i32.const 4300) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\002\00s\00u\00f\00f\00\00\00") - (data (i32.const 4332) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00b\00s\00u\00f\00f\00\00\00") - (data (i32.const 4364) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\08\00\00\00r\00e\00f\00#\00\00\00\00\00") - (data (i32.const 4396) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00r\00e\00f\00#\001\00\00\00") - (data (i32.const 4428) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\a0\00\00\00\00\00\00\00\a0\00\00\00\00\00\00\00\a0\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 4476) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00r\00e\00f\00#\001\00r\00e\00f\00#\002\00\00\00\00\00\00\00\00\00") - (data (i32.const 4524) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\a0\02\00\00\00\00\00\00\c0\02\00\00\00\00\00\00\e0\02\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 4572) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00$\00\00\00(\00A\00=\00r\00e\00f\00#\001\00,\00 \00B\00=\00r\00e\00f\00#\002\00)\00\00\00\00\00\00\00\00\00") - (data (i32.const 4640) "\05\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\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00") + (data (i32.const 4300) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\08\00\00\00s\00u\00f\00f\00\00\00\00\00") + (data (i32.const 4332) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\002\00s\00u\00f\00f\00\00\00") + (data (i32.const 4364) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00b\00s\00u\00f\00f\00\00\00") + (data (i32.const 4396) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\08\00\00\00r\00e\00f\00#\00\00\00\00\00") + (data (i32.const 4428) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00r\00e\00f\00#\001\00\00\00") + (data (i32.const 4460) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\a0\00\00\00\00\00\00\00\a0\00\00\00\00\00\00\00\a0\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 4508) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00r\00e\00f\00#\001\00r\00e\00f\00#\002\00\00\00\00\00\00\00\00\00") + (data (i32.const 4556) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\a0\02\00\00\00\00\00\00\c0\02\00\00\00\00\00\00\e0\02\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 4604) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00$\00\00\00(\00A\00=\00r\00e\00f\00#\001\00,\00 \00B\00=\00r\00e\00f\00#\002\00)\00\00\00\00\00\00\00\00\00") + (data (i32.const 4672) "\05\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\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00") (table $0 1 funcref) (elem $0 (i32.const 1)) (export "memory" (memory $0)) @@ -5754,8 +5755,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 21088 - i32.const 21136 + i32.const 21120 + i32.const 21168 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6418,7 +6419,7 @@ local.get $2 i32.store offset=12 local.get $2 - i32.const 160 + i32.const 4320 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6430,7 +6431,7 @@ local.get $2 i32.store offset=4 local.get $2 - i32.const 4320 + i32.const 4352 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6447,7 +6448,7 @@ unreachable end local.get $1 - i32.const 160 + i32.const 4320 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6459,7 +6460,7 @@ local.get $2 i32.store offset=4 local.get $2 - i32.const 4352 + i32.const 4384 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6490,7 +6491,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - i32.const 4384 + i32.const 4416 local.set $1 global.get $~lib/memory/__stack_pointer local.get $1 @@ -6553,7 +6554,7 @@ local.get $2 i32.store offset=8 local.get $2 - i32.const 4416 + i32.const 4448 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6569,7 +6570,7 @@ call $~lib/builtins/abort unreachable end - i32.const 4448 + i32.const 4480 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6584,7 +6585,7 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4448 + i32.const 4480 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6599,7 +6600,7 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4448 + i32.const 4480 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6617,7 +6618,7 @@ local.get $2 i32.store offset=8 local.get $2 - i32.const 4496 + i32.const 4528 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6633,7 +6634,7 @@ call $~lib/builtins/abort unreachable end - i32.const 4544 + i32.const 4576 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6648,7 +6649,7 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4544 + i32.const 4576 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6663,7 +6664,7 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4544 + i32.const 4576 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6681,7 +6682,7 @@ local.get $2 i32.store offset=8 local.get $2 - i32.const 4592 + i32.const 4624 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 From de583a55ee8fbb23192d628e9f4023c6f3ab0d2e Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 1 Aug 2021 18:02:08 +0300 Subject: [PATCH 07/16] more --- src/compiler.ts | 19 + tests/compiler/templateliteral.optimized.wat | 1628 +++++++++--------- tests/compiler/templateliteral.ts | 1 + tests/compiler/templateliteral.untouched.wat | 958 +++++------ 4 files changed, 1250 insertions(+), 1356 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 9ba807c3e4..584467000f 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8193,6 +8193,25 @@ export class Compiler extends DiagnosticEmitter { } } + // 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 stringInstance = this.program.stringInstance; + let concatMethod = assert(stringInstance.getMethod("concat")); + return this.makeCallDirect(concatMethod, [ lhs, rhs ], expression); + } + let length = 2 * numParts - 1; let values = new Array(length); values[0] = this.ensureStaticString(parts[0]); diff --git a/tests/compiler/templateliteral.optimized.wat b/tests/compiler/templateliteral.optimized.wat index 16d224f05a..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_=>_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,7 +27,7 @@ (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 22124)) + (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") @@ -38,100 +38,94 @@ (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) "\03\00\00\00\14\00\00\00\a0\04\00\00\00\00\00\00\a0\04\00\00\00\00\00\00\a0\04") - (data (i32.const 1244) "<") - (data (i32.const 1256) "\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 1340) "<") - (data (i32.const 1352) "\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 1404) ",") - (data (i32.const 1416) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") - (data (i32.const 1452) "<") - (data (i32.const 1464) "\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 1580) "<") - (data (i32.const 1592) "\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 1644) "\1c") - (data (i32.const 1656) "\01\00\00\00\04\00\00\00a\00b") - (data (i32.const 1676) "\1c") - (data (i32.const 1688) "\01\00\00\00\06\00\00\00(\00A\00=") - (data (i32.const 1708) "\1c") - (data (i32.const 1720) "\01\00\00\00\08\00\00\00,\00 \00B\00=") - (data (i32.const 1740) "\1c") - (data (i32.const 1752) "\01\00\00\00\02\00\00\00)") + (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\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) "\03\00\00\00\14\00\00\00\a0\06\00\00\00\00\00\00\c0\06\00\00\00\00\00\00\e0\06") - (data (i32.const 1820) ",") - (data (i32.const 1832) "\01\00\00\00\14\00\00\00(\00A\00=\00a\00,\00 \00B\00=\00b\00)") - (data (i32.const 1868) "|") - (data (i32.const 1880) "\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 1996) "<") - (data (i32.const 2008) "\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 2060) "\1c") - (data (i32.const 2072) "\01\00\00\00\02\00\00\000") - (data (i32.const 2092) "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 2492) "\1c\04") - (data (i32.const 2504) "\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 3548) "\\") - (data (i32.const 3560) "\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 3644) "\1c") - (data (i32.const 3656) "\01\00\00\00\02\00\00\001") - (data (i32.const 3676) ",") - (data (i32.const 3688) "\03\00\00\00\14\00\00\00\a0\04\00\00\00\00\00\00\a0\04\00\00\00\00\00\00\a0\04") - (data (i32.const 3724) "\1c") - (data (i32.const 3736) "\01\00\00\00\04\00\00\001\002") - (data (i32.const 3756) ",") - (data (i32.const 3768) "\03\00\00\00\14\00\00\00\a0\06\00\00\00\00\00\00\c0\06\00\00\00\00\00\00\e0\06") - (data (i32.const 3804) ",") - (data (i32.const 3816) "\01\00\00\00\14\00\00\00(\00A\00=\001\00,\00 \00B\00=\002\00)") - (data (i32.const 3852) "\1c") - (data (i32.const 3864) "\01\00\00\00\06\00\00\000\00.\000") - (data (i32.const 3884) "\1c") - (data (i32.const 3896) "\01\00\00\00\06\00\00\00N\00a\00N") - (data (i32.const 3916) ",") - (data (i32.const 3928) "\01\00\00\00\12\00\00\00-\00I\00n\00f\00i\00n\00i\00t\00y") - (data (i32.const 3964) ",") - (data (i32.const 3976) "\01\00\00\00\10\00\00\00I\00n\00f\00i\00n\00i\00t\00y") - (data (i32.const 4072) "\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 - local.get $2 - local.tee $1 - if - local.get $0 - i32.eqz - if - i32.const 0 - i32.const 1264 - 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 1360 - call $~lib/rt/itcms/__visit - i32.const 1472 - call $~lib/rt/itcms/__visit - i32.const 2512 - call $~lib/rt/itcms/__visit - i32.const 3568 - 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 1264 - 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 @@ -535,7 +467,7 @@ i32.eqz if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 268 i32.const 14 call $~lib/builtins/abort @@ -549,7 +481,7 @@ i32.lt_u if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 270 i32.const 14 call $~lib/builtins/abort @@ -599,7 +531,7 @@ i32.eqz if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 284 i32.const 14 call $~lib/builtins/abort @@ -689,7 +621,7 @@ i32.eqz if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 201 i32.const 14 call $~lib/builtins/abort @@ -703,7 +635,7 @@ i32.eqz if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 203 i32.const 14 call $~lib/builtins/abort @@ -764,7 +696,7 @@ i32.eqz if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 221 i32.const 16 call $~lib/builtins/abort @@ -797,7 +729,7 @@ i32.lt_u if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 233 i32.const 14 call $~lib/builtins/abort @@ -812,7 +744,7 @@ i32.ne if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 234 i32.const 14 call $~lib/builtins/abort @@ -864,7 +796,7 @@ i32.eqz if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 251 i32.const 14 call $~lib/builtins/abort @@ -934,7 +866,7 @@ i32.gt_u if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 377 i32.const 14 call $~lib/builtins/abort @@ -962,7 +894,7 @@ i32.lt_u if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 384 i32.const 16 call $~lib/builtins/abort @@ -990,7 +922,7 @@ i32.lt_u if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 397 i32.const 5 call $~lib/builtins/abort @@ -1058,10 +990,10 @@ if unreachable end - i32.const 22128 + i32.const 21968 i32.const 0 i32.store - i32.const 23696 + i32.const 23536 i32.const 0 i32.store loop $for-loop|0 @@ -1072,7 +1004,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 22128 + i32.const 21968 i32.add i32.const 0 i32.store offset=4 @@ -1090,7 +1022,7 @@ i32.add i32.const 2 i32.shl - i32.const 22128 + i32.const 21968 i32.add i32.const 0 i32.store offset=96 @@ -1108,13 +1040,13 @@ br $for-loop|0 end end - i32.const 22128 - i32.const 23700 + i32.const 21968 + i32.const 23540 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 22128 + i32.const 21968 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1198,7 +1130,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 22124 + i32.const 21964 i32.lt_u if local.get $0 @@ -1286,14 +1218,14 @@ i32.ne if i32.const 0 - i32.const 1264 + i32.const 1280 i32.const 228 i32.const 20 call $~lib/builtins/abort unreachable end local.get $0 - i32.const 22124 + i32.const 21964 i32.lt_u if local.get $0 @@ -1316,7 +1248,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 22124 + i32.const 21964 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1345,7 +1277,7 @@ end if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 559 i32.const 3 call $~lib/builtins/abort @@ -1438,7 +1370,7 @@ i32.eqz if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 330 i32.const 14 call $~lib/builtins/abort @@ -1490,7 +1422,7 @@ i32.eqz if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 343 i32.const 18 call $~lib/builtins/abort @@ -1522,8 +1454,8 @@ i32.const 1073741804 i32.ge_u if - i32.const 1472 - i32.const 1264 + i32.const 1216 + i32.const 1280 i32.const 260 i32.const 31 call $~lib/builtins/abort @@ -1589,8 +1521,8 @@ i32.const 1073741820 i32.gt_u if - i32.const 1472 - i32.const 1600 + i32.const 1216 + i32.const 1552 i32.const 458 i32.const 29 call $~lib/builtins/abort @@ -1685,7 +1617,7 @@ i32.eqz if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 496 i32.const 16 call $~lib/builtins/abort @@ -1700,7 +1632,7 @@ i32.gt_u if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 498 i32.const 14 call $~lib/builtins/abort @@ -1719,7 +1651,7 @@ i32.and if i32.const 0 - i32.const 1600 + i32.const 1552 i32.const 357 i32.const 14 call $~lib/builtins/abort @@ -2947,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) @@ -2966,11 +2960,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5740 + i32.const 5580 i32.lt_s if - i32.const 22144 - i32.const 22192 + i32.const 21984 + i32.const 22032 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3193,7 +3187,7 @@ i32.div_u i32.const 2 i32.shl - i32.const 2092 + i32.const 2044 i32.add i64.load32_u local.get $3 @@ -3201,7 +3195,7 @@ i32.rem_u i32.const 2 i32.shl - i32.const 2092 + i32.const 2044 i32.add i64.load32_u i64.const 32 @@ -3228,7 +3222,7 @@ i32.rem_u i32.const 2 i32.shl - i32.const 2092 + i32.const 2044 i32.add i32.load i32.store @@ -3251,7 +3245,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 2092 + i32.const 2044 i32.add i32.load i32.store @@ -3476,7 +3470,7 @@ local.get $5 i32.const 1 i32.shl - i32.const 4016 + i32.const 3920 i32.add local.get $3 i32.const 65535 @@ -3511,7 +3505,7 @@ local.get $7 i32.const 2 i32.shl - i32.const 4944 + i32.const 4848 i32.add i64.load32_u local.get $9 @@ -3521,7 +3515,7 @@ local.get $5 i32.const 1 i32.shl - i32.const 4014 + i32.const 3918 i32.add local.tee $7 i32.load16_u @@ -3601,7 +3595,7 @@ local.get $5 i32.const 1 i32.shl - i32.const 4016 + i32.const 3920 i32.add local.get $6 i32.wrap_i64 @@ -3639,7 +3633,7 @@ i32.sub i32.const 2 i32.shl - i32.const 4944 + i32.const 4848 i32.add i64.load32_u i64.mul @@ -3647,7 +3641,7 @@ local.get $5 i32.const 1 i32.shl - i32.const 4014 + i32.const 3918 i32.add local.tee $7 i32.load16_u @@ -4057,7 +4051,7 @@ f64.lt local.tee $8 if (result f64) - i32.const 4016 + i32.const 3920 i32.const 45 i32.store16 local.get $0 @@ -4158,14 +4152,14 @@ i32.sub global.set $~lib/util/number/_K local.get $9 - i32.const 4072 + i32.const 3976 i32.add i64.load global.set $~lib/util/number/_frc_pow local.get $5 i32.const 1 i32.shl - i32.const 4768 + i32.const 4672 i32.add i32.load16_s global.set $~lib/util/number/_exp_pow @@ -4197,7 +4191,7 @@ local.get $8 i32.const 1 i32.shl - i32.const 4016 + i32.const 3920 i32.add local.get $2 local.get $1 @@ -4331,11 +4325,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5740 + i32.const 5580 i32.lt_s if - i32.const 22144 - i32.const 22192 + i32.const 21984 + i32.const 22032 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4353,7 +4347,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - i32.const 3872 + i32.const 3776 local.set $1 br $__inlined_func$~lib/util/number/dtoa end @@ -4371,7 +4365,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - i32.const 3904 + i32.const 3808 local.set $1 br $__inlined_func$~lib/util/number/dtoa end @@ -4379,8 +4373,8 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - i32.const 3936 - i32.const 3984 + i32.const 3840 + i32.const 3888 local.get $0 f64.const 0 f64.lt @@ -4400,7 +4394,7 @@ local.tee $1 i32.store local.get $1 - i32.const 4016 + i32.const 3920 local.get $2 call $~lib/memory/memory.copy global.get $~lib/memory/__stack_pointer @@ -4410,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 - (local $0 i32) + (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 1316 - i32.const 1312 - i32.store - i32.const 1320 - i32.const 1312 - i32.store - i32.const 1312 - global.set $~lib/rt/itcms/toSpace memory.size i32.const 16 i32.shl - i32.const 22124 + i32.const 21964 i32.sub i32.const 1 i32.shr_u global.set $~lib/rt/itcms/threshold - i32.const 1524 - i32.const 1520 + i32.const 1332 + i32.const 1328 i32.store - i32.const 1528 - i32.const 1520 + i32.const 1336 + i32.const 1328 i32.store - i32.const 1520 + i32.const 1328 global.set $~lib/rt/itcms/pinSpace - i32.const 1556 - i32.const 1552 + i32.const 1364 + i32.const 1360 i32.store - i32.const 1560 - i32.const 1552 + 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 1552 + i32.const 1512 + i32.const 1504 + i32.store + i32.const 1504 global.set $~lib/rt/itcms/fromSpace global.get $~lib/memory/__stack_pointer i32.const 24 @@ -4519,7 +4447,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 5740 + i32.const 5580 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4553,39 +4481,19 @@ call $~lib/builtins/abort unreachable end - global.get $~lib/memory/__stack_pointer - i32.const 1216 - i32.store offset=16 - i32.const 1216 - i32.const 1 i32.const 1056 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - i32.const 1216 - i32.store offset=16 - i32.const 1216 - 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 1216 - i32.store offset=16 - local.get $0 - i32.const 1184 - i32.store offset=20 - i32.const 1216 - 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=12 local.get $1 - i32.const 1664 + i32.const 1616 i32.store offset=8 local.get $0 - i32.const 1664 + i32.const 1616 call $~lib/string/String.__eq i32.eqz if @@ -4597,27 +4505,27 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1792 + i32.const 1744 i32.store offset=16 - i32.const 1792 + 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 1792 + i32.const 1744 i32.store offset=16 - i32.const 1792 + 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 1792 + i32.const 1744 i32.store offset=16 local.get $0 i32.const 1184 i32.store offset=20 - i32.const 1792 + i32.const 1744 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer @@ -4625,10 +4533,10 @@ local.get $0 i32.store offset=12 local.get $1 - i32.const 1840 + i32.const 1792 i32.store offset=8 local.get $0 - i32.const 1840 + i32.const 1792 call $~lib/string/String.__eq i32.eqz if @@ -4648,7 +4556,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5740 + i32.const 5580 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4669,10 +4577,10 @@ local.get $0 i32.store local.get $1 - i32.const 3664 + i32.const 3616 i32.store offset=4 local.get $0 - i32.const 3664 + i32.const 3616 call $~lib/string/String.__eq i32.eqz if @@ -4683,51 +4591,31 @@ call $~lib/builtins/abort unreachable end - global.get $~lib/memory/__stack_pointer - i32.const 3696 - 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 3696 - i32.const 1 - local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - i32.const 3696 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 3696 - 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 3696 - i32.store offset=8 local.get $0 - i32.const 1184 - i32.store offset=16 - i32.const 3696 - 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 3744 + i32.const 3648 i32.store offset=4 local.get $0 - i32.const 3744 + i32.const 3648 call $~lib/string/String.__eq i32.eqz if @@ -4739,39 +4627,39 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3776 + 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 3776 + 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 3776 + 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 3776 + 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 3776 + i32.const 3680 i32.store offset=8 local.get $0 i32.const 1184 - i32.store offset=16 - i32.const 3776 + i32.store offset=12 + i32.const 3680 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer @@ -4779,10 +4667,10 @@ local.get $0 i32.store local.get $1 - i32.const 3824 + i32.const 3728 i32.store offset=4 local.get $0 - i32.const 3824 + i32.const 3728 call $~lib/string/String.__eq i32.eqz if @@ -4802,7 +4690,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5740 + i32.const 5580 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4823,10 +4711,10 @@ local.get $0 i32.store local.get $1 - i32.const 5008 + i32.const 4912 i32.store offset=4 local.get $0 - i32.const 5008 + i32.const 4912 call $~lib/string/String.__eq i32.eqz if @@ -4837,51 +4725,31 @@ call $~lib/builtins/abort unreachable end - global.get $~lib/memory/__stack_pointer - i32.const 5040 - 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 5040 - i32.const 1 - local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - i32.const 5040 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 5040 - 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 5040 - i32.store offset=8 local.get $0 - i32.const 1184 - i32.store offset=16 - i32.const 5040 - 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 5088 + i32.const 4944 i32.store offset=4 local.get $0 - i32.const 5088 + i32.const 4944 call $~lib/string/String.__eq i32.eqz if @@ -4893,39 +4761,39 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 5120 + 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 5120 + 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 5120 + 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 5120 + 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 5120 + i32.const 4976 i32.store offset=8 local.get $0 i32.const 1184 - i32.store offset=16 - i32.const 5120 + i32.store offset=12 + i32.const 4976 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer @@ -4933,10 +4801,10 @@ local.get $0 i32.store local.get $1 - i32.const 5168 + i32.const 5024 i32.store offset=4 local.get $0 - i32.const 5168 + i32.const 5024 call $~lib/string/String.__eq i32.eqz if @@ -4951,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 20 + i32.const 28 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5740 + i32.const 5580 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -4967,344 +4836,433 @@ i64.const 0 i64.store offset=8 local.get $0 + i64.const 0 + i64.store offset=16 + local.get $0 i32.const 0 - i32.store offset=16 + i32.store offset=24 local.get $0 - i32.const 1088 + i32.const 1 + call $templateliteral/Ref#constructor + local.tee $0 i32.store - i32.const 2 - call $~lib/util/number/itoa32 - local.set $0 global.get $~lib/memory/__stack_pointer + i32.const 2 + call $templateliteral/Ref#constructor local.tee $1 - local.get $0 i32.store offset=4 - local.get $1 - i32.const 5216 - i32.store offset=8 local.get $0 - i32.const 5216 - 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 + call $templateliteral/Ref#toString + local.set $2 global.get $~lib/memory/__stack_pointer - i32.const 1088 + local.tee $3 + local.get $2 i32.store offset=8 - i32.const 1088 - i32.const 1088 + local.get $3 + i32.const 5360 + i32.store offset=12 + local.get $2 + i32.const 5360 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 32 + i32.const 51 i32.const 3 call $~lib/builtins/abort unreachable end - global.get $~lib/memory/__stack_pointer - i32.const 5248 - i32.store offset=12 - i32.const 2 - call $~lib/util/number/itoa32 - local.set $0 - global.get $~lib/memory/__stack_pointer local.get $0 + call $templateliteral/Ref#toString + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 i32.store offset=16 - i32.const 5248 - local.get $0 + local.get $1 + call $templateliteral/Ref#toString + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=20 + local.get $2 + local.get $3 call $~lib/string/String#concat - local.set $0 + local.set $2 global.get $~lib/memory/__stack_pointer - local.tee $1 - local.get $0 - i32.store offset=4 - local.get $1 - i32.const 5280 + local.tee $3 + local.get $2 i32.store offset=8 - local.get $0 - i32.const 5280 + local.get $3 + i32.const 5392 + i32.store offset=12 + local.get $2 + i32.const 5392 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 33 + i32.const 52 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 5248 - i32.store offset=12 - i32.const 5248 - i32.const 1088 - call $~lib/string/String#concat + i32.const 5440 + i32.store offset=16 + local.get $0 + call $templateliteral/Ref#toString local.set $0 global.get $~lib/memory/__stack_pointer - local.tee $1 local.get $0 - i32.store offset=4 - local.get $1 - i32.const 5312 - i32.store offset=8 + i32.store offset=24 + i32.const 5440 + i32.const 1 local.get $0 - i32.const 5312 - 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 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 5440 + i32.store offset=16 + local.get $1 + call $templateliteral/Ref#toString local.set $0 global.get $~lib/memory/__stack_pointer - local.tee $1 local.get $0 - i32.store offset=12 - local.get $1 - i32.const 5344 + 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 5440 i32.store offset=16 local.get $0 - i32.const 5344 - call $~lib/string/String#concat + 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 local.tee $1 local.get $0 - i32.store offset=4 - local.get $1 - i32.const 5376 i32.store offset=8 + local.get $1 + i32.const 5488 + i32.store offset=12 local.get $0 - i32.const 5376 + i32.const 5488 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1120 - i32.const 35 + i32.const 53 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 5344 - i32.store offset=16 - i32.const 1088 - i32.const 5344 - 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 5408 - i32.store offset=8 - local.get $0 - i32.const 5408 - 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 - global.get $~lib/memory/__stack_pointer - i32.const 20 - i32.add - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer i32.const 28 - i32.sub + i32.add global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 5740 - i32.lt_s - br_if $folding-inner0 - 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 - i64.const 0 - i64.store offset=16 - local.get $0 - i32.const 0 - i32.store offset=24 - local.get $0 - i32.const 1 - call $templateliteral/Ref#constructor - local.tee $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2 - call $templateliteral/Ref#constructor - local.tee $1 - i32.store offset=4 - local.get $0 - call $templateliteral/Ref#toString - local.set $2 - global.get $~lib/memory/__stack_pointer - local.tee $3 - local.get $2 - i32.store offset=8 - local.get $3 - i32.const 5472 - i32.store offset=12 - local.get $2 - i32.const 5472 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1120 - i32.const 50 - i32.const 3 - call $~lib/builtins/abort - unreachable + return + end + i32.const 21984 + i32.const 22032 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (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 - global.get $~lib/memory/__stack_pointer - i32.const 5504 - 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 5504 + 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 - local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - i32.const 5504 - i32.store offset=16 - local.get $1 - call $templateliteral/Ref#toString - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=20 - i32.const 5504 + 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 - local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - local.tee $2 - i32.const 5504 - i32.store offset=16 - local.get $2 - i32.const 1184 - i32.store offset=24 - i32.const 5504 - 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 5552 - i32.store offset=12 - local.get $2 - i32.const 5552 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1120 - i32.const 51 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 5600 - 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 5600 - i32.const 1 - local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - i32.const 5600 - 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 5600 + 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 - local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - global.get $~lib/memory/__stack_pointer - local.tee $0 - i32.const 5600 - i32.store offset=16 - local.get $0 - i32.const 1184 - i32.store offset=24 - i32.const 5600 - 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 5648 - i32.store offset=12 - local.get $0 - i32.const 5648 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1120 - i32.const 52 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 28 - i32.add - global.set $~lib/memory/__stack_pointer - return + call $~lib/builtins/abort + unreachable end - i32.const 22144 - i32.const 22192 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable + 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) @@ -5313,11 +5271,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5740 + i32.const 5580 i32.lt_s if - i32.const 22144 - i32.const 22192 + i32.const 21984 + i32.const 22032 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5328,7 +5286,7 @@ i64.const 0 i64.store local.get $1 - i32.const 5440 + i32.const 5328 i32.store local.get $0 i32.load @@ -5337,7 +5295,7 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=4 - i32.const 5440 + i32.const 5328 local.get $0 call $~lib/string/String#concat global.get $~lib/memory/__stack_pointer @@ -5345,6 +5303,79 @@ 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 4 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 1184 + return + end + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.const 1 + 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) (local $2 i32) @@ -5354,11 +5385,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5740 + i32.const 5580 i32.lt_s if - i32.const 22144 - i32.const 22192 + i32.const 21984 + i32.const 22032 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5374,7 +5405,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - i32.const 2080 + i32.const 2032 return end global.get $~lib/memory/__stack_pointer @@ -5459,79 +5490,6 @@ global.set $~lib/memory/__stack_pointer local.get $0 ) - (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 5740 - i32.lt_s - if - i32.const 22144 - i32.const 22192 - 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 4 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 1184 - return - end - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.const 1 - 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 $templateliteral/Ref#constructor (param $0 i32) (result i32) (local $1 i32) global.get $~lib/memory/__stack_pointer @@ -5539,11 +5497,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 5740 + i32.const 5580 i32.lt_s if - i32.const 22144 - i32.const 22192 + 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 52505c6de8..c015573c32 100644 --- a/tests/compiler/templateliteral.ts +++ b/tests/compiler/templateliteral.ts @@ -34,6 +34,7 @@ function test_fast_paths_string(): void { assert(`pref${b}` == "prefb"); assert(`${a}suff` == "2suff"); assert(`${b}suff` == "bsuff"); + assert(`${a}${b}` == "2b"); } test_fast_paths_string(); diff --git a/tests/compiler/templateliteral.untouched.wat b/tests/compiler/templateliteral.untouched.wat index 2c77370e6a..5dc0782c75 100644 --- a/tests/compiler/templateliteral.untouched.wat +++ b/tests/compiler/templateliteral.untouched.wat @@ -18,14 +18,14 @@ (type $f64_=>_i32 (func (param f64) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) - (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/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) @@ -35,69 +35,66 @@ (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 4672)) - (global $~lib/memory/__data_end i32 (i32.const 4716)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 21100)) - (global $~lib/memory/__heap_base i32 (i32.const 21100)) + (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) "<\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 140) "\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 172) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\a0\00\00\00\00\00\00\00\a0\00\00\00\00\00\00\00\a0\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 220) "<\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 288) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 316) "<\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 380) ",\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 428) "<\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 496) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 528) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 556) "<\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 620) "\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 652) "\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 684) "\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 716) "\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 748) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\a0\02\00\00\00\00\00\00\c0\02\00\00\00\00\00\00\e0\02\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 796) ",\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 844) "|\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 972) "<\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 1036) "\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 1068) "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 1468) "\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 2524) "\\\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 2620) "\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 2652) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\a0\00\00\00\00\00\00\00\a0\00\00\00\00\00\00\00\a0\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2700) "\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 2732) ",\00\00\00\00\00\00\00\00\00\00\00\03\00\00\00\14\00\00\00\a0\02\00\00\00\00\00\00\c0\02\00\00\00\00\00\00\e0\02\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2780) ",\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 2828) "\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 2860) "\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 2892) ",\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 2940) ",\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 2992) "\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 3048) "\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/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 240 - 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 @@ -708,7 +614,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 268 i32.const 14 call $~lib/builtins/abort @@ -728,7 +634,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 270 i32.const 14 call $~lib/builtins/abort @@ -791,7 +697,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 284 i32.const 14 call $~lib/builtins/abort @@ -923,7 +829,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 201 i32.const 14 call $~lib/builtins/abort @@ -940,7 +846,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 203 i32.const 14 call $~lib/builtins/abort @@ -1020,7 +926,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 221 i32.const 16 call $~lib/builtins/abort @@ -1063,7 +969,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 233 i32.const 14 call $~lib/builtins/abort @@ -1081,7 +987,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 234 i32.const 14 call $~lib/builtins/abort @@ -1149,7 +1055,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 251 i32.const 14 call $~lib/builtins/abort @@ -1254,7 +1160,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 377 i32.const 14 call $~lib/builtins/abort @@ -1297,7 +1203,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 384 i32.const 16 call $~lib/builtins/abort @@ -1330,7 +1236,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 397 i32.const 5 call $~lib/builtins/abort @@ -1573,7 +1479,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 559 i32.const 3 call $~lib/builtins/abort @@ -1795,7 +1701,7 @@ i32.eqz if i32.const 0 - i32.const 240 + i32.const 256 i32.const 228 i32.const 20 call $~lib/builtins/abort @@ -1903,8 +1809,8 @@ i32.const 1073741820 i32.gt_u if - i32.const 448 - i32.const 576 + i32.const 192 + i32.const 528 i32.const 458 i32.const 29 call $~lib/builtins/abort @@ -1988,7 +1894,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 330 i32.const 14 call $~lib/builtins/abort @@ -2053,7 +1959,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 343 i32.const 18 call $~lib/builtins/abort @@ -2204,7 +2110,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 357 i32.const 14 call $~lib/builtins/abort @@ -2313,7 +2219,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 496 i32.const 16 call $~lib/builtins/abort @@ -2333,7 +2239,7 @@ i32.eqz if i32.const 0 - i32.const 576 + i32.const 528 i32.const 498 i32.const 14 call $~lib/builtins/abort @@ -2610,8 +2516,8 @@ i32.const 1073741804 i32.ge_u if - i32.const 448 - i32.const 240 + i32.const 192 + i32.const 256 i32.const 260 i32.const 31 call $~lib/builtins/abort @@ -3908,15 +3814,106 @@ end end ) - (func $~lib/staticarray/StaticArray<~lib/string/String>#join (param $0 i32) (param $1 i32) (result i32) - i32.const 0 - drop - i32.const 0 - drop - i32.const 0 - drop - i32.const 0 - i32.const 1 + (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 + 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 + i32.const 0 + drop + i32.const 0 + drop + i32.const 0 + i32.const 1 i32.lt_s drop i32.const 1 @@ -4018,14 +4015,14 @@ i32.const 100 i32.rem_u local.set $7 - i32.const 1068 + i32.const 1020 local.get $6 i32.const 2 i32.shl i32.add i64.load32_u local.set $8 - i32.const 1068 + i32.const 1020 local.get $7 i32.const 2 i32.shl @@ -4068,7 +4065,7 @@ i32.const 2 i32.sub local.set $2 - i32.const 1068 + i32.const 1020 local.get $10 i32.const 2 i32.shl @@ -4091,7 +4088,7 @@ i32.const 2 i32.sub local.set $2 - i32.const 1068 + i32.const 1020 local.get $1 i32.const 2 i32.shl @@ -4141,7 +4138,7 @@ i32.const 1 i32.shl i32.add - i32.const 1488 + i32.const 1440 local.get $1 i32.wrap_i64 i32.const 255 @@ -4163,7 +4160,7 @@ i32.and if local.get $0 - i32.const 1488 + i32.const 1440 local.get $1 i32.wrap_i64 i32.const 6 @@ -4286,7 +4283,7 @@ i32.const 1 i32.shl i32.add - i32.const 2544 + i32.const 2496 local.get $1 local.get $6 i64.and @@ -4322,7 +4319,7 @@ i32.const 1 i32.shl i32.add - i32.const 2544 + i32.const 2496 local.get $1 local.get $6 local.get $4 @@ -4616,7 +4613,7 @@ local.set $22 local.get $18 local.set $21 - i32.const 3920 + i32.const 3824 local.get $13 i32.const 2 i32.shl @@ -4757,7 +4754,7 @@ i32.add global.set $~lib/util/number/_K local.get $10 - i32.const 3920 + i32.const 3824 i32.const 0 local.get $13 i32.sub @@ -5338,14 +5335,14 @@ i32.shl i32.sub global.set $~lib/util/number/_K - i32.const 3048 + i32.const 2952 local.get $14 i32.const 3 i32.shl i32.add i64.load global.set $~lib/util/number/_frc_pow - i32.const 3744 + i32.const 3648 local.get $14 i32.const 1 i32.shl @@ -5616,9 +5613,6 @@ call $~lib/string/String#concat ) (func $start:templateliteral - i32.const 288 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/toSpace memory.size i32.const 16 i32.shl @@ -5627,10 +5621,13 @@ i32.const 1 i32.shr_u global.set $~lib/rt/itcms/threshold - i32.const 496 + i32.const 304 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/pinSpace - i32.const 528 + 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 @@ -5641,16 +5638,16 @@ ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) - i32.const 336 + i32.const 384 local.get $0 call $~lib/rt/itcms/__visit - i32.const 448 + i32.const 192 local.get $0 call $~lib/rt/itcms/__visit - i32.const 1488 + i32.const 1440 local.get $0 call $~lib/rt/itcms/__visit - i32.const 2544 + i32.const 2496 local.get $0 call $~lib/rt/itcms/__visit ) @@ -5755,8 +5752,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 21120 - i32.const 21168 + i32.const 20960 + i32.const 21008 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5806,43 +5803,15 @@ call $~lib/builtins/abort unreachable end - i32.const 192 - 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 192 - 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 192 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=16 - local.get $2 - i32.const 160 - 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=12 local.get $2 - i32.const 640 + i32.const 592 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -5858,7 +5827,7 @@ call $~lib/builtins/abort unreachable end - i32.const 768 + i32.const 720 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -5867,7 +5836,7 @@ i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 768 + i32.const 720 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -5876,7 +5845,7 @@ i32.const 3 local.get $1 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 768 + i32.const 720 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -5894,7 +5863,7 @@ local.get $2 i32.store offset=12 local.get $2 - i32.const 816 + i32.const 768 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -5945,7 +5914,7 @@ local.get $2 i32.store local.get $2 - i32.const 2640 + i32.const 2592 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -5961,29 +5930,14 @@ call $~lib/builtins/abort unreachable end - i32.const 2672 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=8 - local.get $2 - i32.const 1 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 2672 - 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 10 call $~lib/number/I32#toString @@ -5992,26 +5946,13 @@ local.get $2 i32.store offset=12 local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2672 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=8 - local.get $2 - i32.const 160 - 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 local.get $2 - i32.const 2720 + i32.const 2624 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6027,7 +5968,7 @@ call $~lib/builtins/abort unreachable end - i32.const 2752 + i32.const 2656 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6040,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 2752 + i32.const 2656 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6056,10 +5997,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 2752 + i32.const 2656 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6069,7 +6010,7 @@ 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 @@ -6077,7 +6018,7 @@ local.get $2 i32.store local.get $2 - i32.const 2800 + i32.const 2704 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6128,7 +6069,7 @@ local.get $2 i32.store local.get $2 - i32.const 3984 + i32.const 3888 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6144,29 +6085,14 @@ call $~lib/builtins/abort unreachable end - i32.const 4016 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=8 - local.get $2 - i32.const 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 offset=12 - local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4016 - 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 @@ -6175,26 +6101,13 @@ local.get $2 i32.store offset=12 local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4016 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=8 - local.get $2 - i32.const 160 - 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 local.get $2 - i32.const 4064 + i32.const 3920 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6210,7 +6123,7 @@ call $~lib/builtins/abort unreachable end - i32.const 4096 + i32.const 3952 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6223,10 +6136,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 4096 + i32.const 3952 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6239,10 +6152,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 4096 + i32.const 3952 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6252,7 +6165,7 @@ 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 @@ -6260,7 +6173,7 @@ local.get $2 i32.store local.get $2 - i32.const 4144 + i32.const 4000 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6313,7 +6226,7 @@ local.get $2 i32.store offset=4 local.get $2 - i32.const 4192 + i32.const 4048 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6346,7 +6259,7 @@ call $~lib/builtins/abort unreachable end - i32.const 4224 + i32.const 4080 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6366,7 +6279,7 @@ local.get $2 i32.store offset=4 local.get $2 - i32.const 4256 + i32.const 4112 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6382,7 +6295,7 @@ call $~lib/builtins/abort unreachable end - i32.const 4224 + i32.const 4080 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6395,7 +6308,7 @@ local.get $2 i32.store offset=4 local.get $2 - i32.const 4288 + i32.const 4144 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6419,7 +6332,7 @@ local.get $2 i32.store offset=12 local.get $2 - i32.const 4320 + i32.const 4176 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6431,7 +6344,7 @@ local.get $2 i32.store offset=4 local.get $2 - i32.const 4352 + i32.const 4208 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6448,7 +6361,7 @@ unreachable end local.get $1 - i32.const 4320 + i32.const 4176 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6460,7 +6373,7 @@ local.get $2 i32.store offset=4 local.get $2 - i32.const 4384 + i32.const 4240 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6476,6 +6389,37 @@ 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 + local.get $1 + call $~lib/string/String#concat + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + i32.const 4272 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 96 + i32.const 37 + i32.const 3 + call $~lib/builtins/abort + unreachable + end global.get $~lib/memory/__stack_pointer i32.const 20 i32.add @@ -6491,7 +6435,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - i32.const 4416 + i32.const 4304 local.set $1 global.get $~lib/memory/__stack_pointer local.get $1 @@ -6554,7 +6498,7 @@ local.get $2 i32.store offset=8 local.get $2 - i32.const 4448 + i32.const 4336 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6565,33 +6509,18 @@ if i32.const 0 i32.const 96 - i32.const 50 + i32.const 51 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 4480 - 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 4480 - 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 @@ -6599,26 +6528,13 @@ local.get $2 i32.store offset=20 local.get $2 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4480 - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=16 - local.get $2 - i32.const 160 - 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 4528 + i32.const 4368 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6629,12 +6545,12 @@ if i32.const 0 i32.const 96 - i32.const 51 + i32.const 52 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 4576 + i32.const 4416 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6646,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 4576 + i32.const 4416 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6661,10 +6577,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 4576 + i32.const 4416 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6674,7 +6590,7 @@ 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 @@ -6682,7 +6598,7 @@ local.get $2 i32.store offset=8 local.get $2 - i32.const 4624 + i32.const 4464 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6693,7 +6609,7 @@ if i32.const 0 i32.const 96 - i32.const 52 + i32.const 53 i32.const 3 call $~lib/builtins/abort unreachable @@ -6703,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) @@ -6942,8 +6923,8 @@ i32.gt_s end if - i32.const 864 - i32.const 992 + i32.const 816 + i32.const 944 i32.const 373 i32.const 5 call $~lib/builtins/abort @@ -6952,7 +6933,7 @@ local.get $0 i32.eqz if - i32.const 1056 + i32.const 1008 local.set $8 global.get $~lib/memory/__stack_pointer i32.const 4 @@ -7098,7 +7079,7 @@ f64.const 0 f64.eq if - i32.const 2848 + i32.const 2752 local.set $3 global.get $~lib/memory/__stack_pointer i32.const 4 @@ -7118,7 +7099,7 @@ local.get $0 f64.ne if - i32.const 2880 + i32.const 2784 local.set $3 global.get $~lib/memory/__stack_pointer i32.const 4 @@ -7127,8 +7108,8 @@ local.get $3 return end - i32.const 2912 - i32.const 2960 + i32.const 2816 + i32.const 2864 local.get $0 f64.const 0 f64.lt @@ -7141,7 +7122,7 @@ local.get $3 return end - i32.const 2992 + i32.const 2896 local.get $0 call $~lib/util/number/dtoa_core i32.const 1 @@ -7154,7 +7135,7 @@ local.tee $2 i32.store local.get $2 - i32.const 2992 + i32.const 2896 local.get $1 call $~lib/memory/memory.copy local.get $2 @@ -7165,71 +7146,6 @@ global.set $~lib/memory/__stack_pointer local.get $3 ) - (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 $templateliteral/Ref#constructor (param $0 i32) (param $1 i32) (result i32) (local $2 i32) global.get $~lib/memory/__stack_pointer From 1487f6e22a1a8038a9cc32fd1445df839201a29b Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 1 Aug 2021 18:43:16 +0300 Subject: [PATCH 08/16] refactor comments --- src/compiler.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 584467000f..6fd8421b34 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8162,25 +8162,26 @@ export class Compiler extends DiagnosticEmitter { let expression = expressions[0]; let lhsLen = parts[0].length; let rhsLen = parts[1].length; + // Shortcut for `${expr}` -> expr.toString() if (!lhsLen && !rhsLen) { - // Shortcut for `${expr}` -> expr.toString() return this.makeToString( this.compileExpression(expression, stringType), this.currentType, expression ); } + // Shortcuts for + // `${expr}` -> "" + expr.toString() + // `${expr}` -> expr.toString() + "" if ((lhsLen && !rhsLen) || (!lhsLen && rhsLen)) { let lhs: ExpressionRef; let rhs: ExpressionRef; if (lhsLen && !rhsLen) { - // Shortcut for `${expr}` -> "" + expr.toString() lhs = this.ensureStaticString(parts[0]); rhs = this.makeToString( this.compileExpression(expression, stringType), this.currentType, expression ); } else { - // Shortcut for `${expr}` -> expr.toString() + "" lhs = this.makeToString( this.compileExpression(expression, stringType), this.currentType, expression From 67fedcb810841211b56b6822569fdb1ee0cf520c Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 1 Aug 2021 18:44:42 +0300 Subject: [PATCH 09/16] more --- src/compiler.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 6fd8421b34..2670040956 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8149,9 +8149,7 @@ export class Compiler extends DiagnosticEmitter { var module = this.module; var stringType = this.program.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]); @@ -8213,6 +8211,7 @@ export class Compiler extends DiagnosticEmitter { 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]); From 19a8a01110b7350f7f91ba3eaee996327a8ac500 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Mon, 2 Aug 2021 01:07:58 +0300 Subject: [PATCH 10/16] refactor --- src/compiler.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 2670040956..16f203aafd 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8170,16 +8170,19 @@ export class Compiler extends DiagnosticEmitter { // Shortcuts for // `${expr}` -> "" + expr.toString() // `${expr}` -> expr.toString() + "" - if ((lhsLen && !rhsLen) || (!lhsLen && rhsLen)) { + let hasPrefix = lhsLen && !rhsLen; + let hasSuffix = !lhsLen && rhsLen; + if (hasPrefix || hasSuffix) { let lhs: ExpressionRef; let rhs: ExpressionRef; - if (lhsLen && !rhsLen) { + if (hasPrefix) { lhs = this.ensureStaticString(parts[0]); rhs = this.makeToString( this.compileExpression(expression, stringType), this.currentType, expression ); } else { + // suffix lhs = this.makeToString( this.compileExpression(expression, stringType), this.currentType, expression From 69b29161d53dfc073bdce1fca8402e015448466f Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Mon, 2 Aug 2021 01:15:50 +0300 Subject: [PATCH 11/16] more --- src/compiler.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 16f203aafd..20aa94d8a8 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8175,18 +8175,16 @@ export class Compiler extends DiagnosticEmitter { if (hasPrefix || hasSuffix) { 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 = this.makeToString( - this.compileExpression(expression, stringType), - this.currentType, expression - ); + rhs = expr; } else { // suffix - lhs = this.makeToString( - this.compileExpression(expression, stringType), - this.currentType, expression - ); + lhs = expr; rhs = this.ensureStaticString(parts[1]); } let stringInstance = this.program.stringInstance; From c2feb829b879d1fdd62df4d7946c0016e60a3439 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Mon, 2 Aug 2021 01:20:07 +0300 Subject: [PATCH 12/16] optimize stmts array --- src/compiler.ts | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 20aa94d8a8..71bec52d8e 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8225,26 +8225,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()); } From 5bfb1b1edadc519596cacff8af8e6cc52c6a28f1 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Mon, 2 Aug 2021 01:35:33 +0300 Subject: [PATCH 13/16] fix bootstrap --- src/compiler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 71bec52d8e..0894b61cb1 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8170,8 +8170,8 @@ export class Compiler extends DiagnosticEmitter { // Shortcuts for // `${expr}` -> "" + expr.toString() // `${expr}` -> expr.toString() + "" - let hasPrefix = lhsLen && !rhsLen; - let hasSuffix = !lhsLen && rhsLen; + let hasPrefix = lhsLen != 0 && rhsLen == 0; + let hasSuffix = lhsLen == 0 && rhsLen != 0; if (hasPrefix || hasSuffix) { let lhs: ExpressionRef; let rhs: ExpressionRef; From e4f910a7c12f69e93c93c18bf126e66156d19769 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Mon, 2 Aug 2021 08:32:19 +0300 Subject: [PATCH 14/16] use xor instead logical or --- src/compiler.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/compiler.ts b/src/compiler.ts index 0894b61cb1..3c9b164867 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8172,7 +8172,8 @@ export class Compiler extends DiagnosticEmitter { // `${expr}` -> expr.toString() + "" let hasPrefix = lhsLen != 0 && rhsLen == 0; let hasSuffix = lhsLen == 0 && rhsLen != 0; - if (hasPrefix || hasSuffix) { + // @ts-ignore: cast + if (hasPrefix ^ hasSuffix) { let lhs: ExpressionRef; let rhs: ExpressionRef; let expr = this.makeToString( From 83506f11a19cadf3075873e0c2c9bb616702e140 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Mon, 2 Aug 2021 08:38:54 +0300 Subject: [PATCH 15/16] refactor --- src/compiler.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 3c9b164867..fb69045dac 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8170,10 +8170,9 @@ export class Compiler extends DiagnosticEmitter { // Shortcuts for // `${expr}` -> "" + expr.toString() // `${expr}` -> expr.toString() + "" - let hasPrefix = lhsLen != 0 && rhsLen == 0; - let hasSuffix = lhsLen == 0 && rhsLen != 0; + let hasPrefix = lhsLen != 0; // @ts-ignore: cast - if (hasPrefix ^ hasSuffix) { + if (hasPrefix ^ (rhsLen != 0)) { let lhs: ExpressionRef; let rhs: ExpressionRef; let expr = this.makeToString( From 2b89232f68af1a7c2c3f03797d82c2a295e17542 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Mon, 2 Aug 2021 09:31:06 +0300 Subject: [PATCH 16/16] more --- src/compiler.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index fb69045dac..84dbaa101b 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8147,7 +8147,8 @@ export class Compiler extends DiagnosticEmitter { assert(numParts - 1 == expressions.length); var module = this.module; - var stringType = this.program.stringInstance.type; + var stringInstance = this.program.stringInstance; + var stringType = stringInstance.type; if (tag === null) { // Shortcut if just a (multi-line) string @@ -8187,7 +8188,6 @@ export class Compiler extends DiagnosticEmitter { lhs = expr; rhs = this.ensureStaticString(parts[1]); } - let stringInstance = this.program.stringInstance; let concatMethod = assert(stringInstance.getMethod("concat")); return this.makeCallDirect(concatMethod, [ lhs, rhs ], expression); } @@ -8206,8 +8206,6 @@ export class Compiler extends DiagnosticEmitter { this.compileExpression(exprB, stringType), this.currentType, exprB ); - - let stringInstance = this.program.stringInstance; let concatMethod = assert(stringInstance.getMethod("concat")); return this.makeCallDirect(concatMethod, [ lhs, rhs ], expression); } @@ -8253,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