From c64365869e399e97b27553f7deb44c19e5567453 Mon Sep 17 00:00:00 2001 From: dcode Date: Sat, 6 Mar 2021 01:58:45 +0100 Subject: [PATCH 01/13] Implement parsing of template literals --- src/ast.ts | 23 +++++++++++++++ src/compiler.ts | 22 +++++++++++++++ src/extra/ast.ts | 44 ++++++++++++++++++++++++++--- src/parser.ts | 20 +++++++++++++ src/resolver.ts | 3 +- src/tokenizer.ts | 34 +++++++++++++--------- tests/parser/literals.ts | 16 ++++++++++- tests/parser/literals.ts.fixture.ts | 31 ++++++++++++++------ 8 files changed, 164 insertions(+), 29 deletions(-) diff --git a/src/ast.ts b/src/ast.ts index c26c794f8d..e3af84f03f 100644 --- a/src/ast.ts +++ b/src/ast.ts @@ -378,6 +378,14 @@ export abstract class Node { return new SuperExpression(range); } + static createTemplateLiteralExpression( + parts: string[], + expressions: Expression[], + range: Range + ): TemplateLiteralExpression { + return new TemplateLiteralExpression(parts, expressions, range); + } + static createThisExpression( range: Range ): ThisExpression { @@ -1087,6 +1095,7 @@ export enum LiteralKind { FLOAT, INTEGER, STRING, + TEMPLATE, REGEXP, ARRAY, OBJECT @@ -1443,6 +1452,20 @@ export class SuperExpression extends IdentifierExpression { } } +/** Represents a template literal expression. */ +export class TemplateLiteralExpression extends LiteralExpression { + constructor( + /** String parts. */ + public parts: string[], + /** Expression parts. */ + public expressions: Expression[], + /** Source range. */ + range: Range + ) { + super(LiteralKind.TEMPLATE, range); + } +} + /** Represents a `this` expression. */ export class ThisExpression extends IdentifierExpression { constructor( diff --git a/src/compiler.ts b/src/compiler.ts index 7a6a435a72..ece5e8f172 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -167,6 +167,7 @@ import { TernaryExpression, ArrayLiteralExpression, StringLiteralExpression, + TemplateLiteralExpression, UnaryPostfixExpression, UnaryPrefixExpression, @@ -7979,6 +7980,10 @@ export class Compiler extends DiagnosticEmitter { assert(!implicitlyNegate); return this.compileStringLiteral(expression, constraints); } + case LiteralKind.TEMPLATE: { + assert(!implicitlyNegate); + return this.compileTemplateLiteral(expression, constraints); + } case LiteralKind.OBJECT: { assert(!implicitlyNegate); return this.compileObjectLiteral(expression, contextualType); @@ -8004,6 +8009,23 @@ export class Compiler extends DiagnosticEmitter { return this.ensureStaticString(expression.value); } + private compileTemplateLiteral( + expression: TemplateLiteralExpression, + constraints: Constraints + ): ExpressionRef { + var parts = expression.parts; + if (parts.length == 1) { + return this.ensureStaticString(parts[0]); + } + // TODO + this.error( + DiagnosticCode.Not_implemented_0, + expression.range, "Template Literals can only be used for multi-line strings. Interpolation is not supported." + ); + this.currentType = this.program.stringInstance.type; + return this.module.unreachable(); + } + private compileArrayLiteral( expression: ArrayLiteralExpression, contextualType: Type, diff --git a/src/extra/ast.ts b/src/extra/ast.ts index 9c0dfa26c1..859db32ebf 100644 --- a/src/extra/ast.ts +++ b/src/extra/ast.ts @@ -25,6 +25,7 @@ import { FloatLiteralExpression, IntegerLiteralExpression, StringLiteralExpression, + TemplateLiteralExpression, RegexpLiteralExpression, ArrayLiteralExpression, AssertionExpression, @@ -637,6 +638,10 @@ export class ASTBuilder { this.visitStringLiteralExpression(node); break; } + case LiteralKind.TEMPLATE: { + this.visitTemplateLiteralExpression(node); + break; + } case LiteralKind.REGEXP: { this.visitRegexpLiteralExpression(node); break; @@ -672,9 +677,15 @@ export class ASTBuilder { visitStringLiteral(str: string, singleQuoted: bool = false): void { var sb = this.sb; - var off = 0; var quote = singleQuoted ? "'" : "\""; sb.push(quote); + this.visitRawString(str, singleQuoted ? CharCode.SINGLEQUOTE : CharCode.DOUBLEQUOTE); + sb.push(quote); + } + + private visitRawString(str: string, quote: CharCode): void { + var sb = this.sb; + var off = 0; var i = 0; for (let k = str.length; i < k;) { switch (str.charCodeAt(i)) { @@ -721,7 +732,7 @@ export class ASTBuilder { break; } case CharCode.DOUBLEQUOTE: { - if (!singleQuoted) { + if (quote == CharCode.DOUBLEQUOTE) { if (i > off) sb.push(str.substring(off, i)); sb.push("\\\""); off = ++i; @@ -731,7 +742,7 @@ export class ASTBuilder { break; } case CharCode.SINGLEQUOTE: { - if (singleQuoted) { + if (quote == CharCode.SINGLEQUOTE) { if (i > off) sb.push(str.substring(off, i)); sb.push("\\'"); off = ++i; @@ -746,6 +757,16 @@ export class ASTBuilder { off = ++i; break; } + case CharCode.BACKTICK: { + if (quote == CharCode.BACKTICK) { + if (i > off) sb.push(str.substring(off, i)); + sb.push("\\'"); + off = ++i; + } else { + ++i; + } + break; + } default: { ++i; break; @@ -753,13 +774,28 @@ export class ASTBuilder { } } if (i > off) sb.push(str.substring(off, i)); - sb.push(quote); } visitStringLiteralExpression(node: StringLiteralExpression): void { this.visitStringLiteral(node.value); } + visitTemplateLiteralExpression(node: TemplateLiteralExpression): void { + var sb = this.sb; + var parts = node.parts; + var expressions = node.expressions; + sb.push("`"); + this.visitRawString(parts[0], CharCode.BACKTICK); + assert(parts.length == expressions.length + 1); + for (let i = 0, k = expressions.length; i < k; ++i) { + sb.push("${"); + this.visitNode(expressions[i]); + sb.push("}"); + this.visitRawString(parts[i + 1], CharCode.BACKTICK); + } + sb.push("`"); + } + visitRegexpLiteralExpression(node: RegexpLiteralExpression): void { var sb = this.sb; sb.push("/"); diff --git a/src/parser.ts b/src/parser.ts index d8817403fc..c652e51e76 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -29,6 +29,7 @@ import { } from "./diagnostics"; import { + CharCode, normalizePath } from "./util"; @@ -3799,6 +3800,25 @@ export class Parser extends DiagnosticEmitter { case Token.STRINGLITERAL: { return Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos)); } + case Token.TEMPLATELITERAL: { + let parts = new Array(); + parts.push(tn.readString()); + let exprs = new Array(); + while (tn.readingTemplate) { + let expr = this.parseExpression(tn); + if (!expr) return null; + exprs.push(expr); + if (!tn.skip(Token.CLOSEBRACE)) { + this.error( + DiagnosticCode._0_expected, + tn.range(), "}" + ); + return null; + } + parts.push(tn.readString(CharCode.BACKTICK)); + } + return Node.createTemplateLiteralExpression(parts, exprs, tn.range(startPos, tn.pos)); + } case Token.INTEGERLITERAL: { let value = tn.readInteger(); tn.checkForIdentifierStartAfterNumericLiteral(); diff --git a/src/resolver.ts b/src/resolver.ts index 82c9acf7fe..e2d4b1dd25 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -2212,7 +2212,8 @@ export class Resolver extends DiagnosticEmitter { let fltType = ctxType == Type.f32 ? Type.f32 : Type.f64; return assert(fltType.getClassOrWrapper(this.program)); } - case LiteralKind.STRING: { + case LiteralKind.STRING: + case LiteralKind.TEMPLATE: { return this.program.stringInstance; } case LiteralKind.ARRAY: { diff --git a/src/tokenizer.ts b/src/tokenizer.ts index 9e0fa66aae..cfde7087ef 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -161,6 +161,7 @@ export enum Token { IDENTIFIER, STRINGLITERAL, + TEMPLATELITERAL, INTEGERLITERAL, FLOATLITERAL, @@ -553,10 +554,13 @@ export class Tokenizer extends DiagnosticEmitter { return Token.EXCLAMATION; } case CharCode.DOUBLEQUOTE: - case CharCode.SINGLEQUOTE: - case CharCode.BACKTICK: { // TODO + case CharCode.SINGLEQUOTE: { this.pos = pos; - return Token.STRINGLITERAL; // expects a call to readString + return Token.STRINGLITERAL; + } + case CharCode.BACKTICK: { + this.pos = pos; + return Token.TEMPLATELITERAL; } case CharCode.PERCENT: { ++pos; @@ -1063,22 +1067,16 @@ export class Tokenizer extends DiagnosticEmitter { return text.substring(start, pos); } - readString(): string { + readingTemplate: bool = false; + + readString(quote: i32 = 0): string { var text = this.source.text; var end = this.end; var pos = this.pos; - var quote = text.charCodeAt(pos++); + var quote = quote || text.charCodeAt(pos++); var start = pos; var result = ""; - if (quote == CharCode.BACKTICK) { - this.warning( - DiagnosticCode.Not_implemented_0, - this.range(start - 1, end), - "Template Literals can only be used for multi-line strings. Interpolation is not supported." - ); - } - while (true) { if (pos >= end) { result += text.substring(start, pos); @@ -1101,7 +1099,14 @@ export class Tokenizer extends DiagnosticEmitter { start = pos; continue; } - if (isLineBreak(c) && quote != CharCode.BACKTICK) { + if (quote == CharCode.BACKTICK) { + if (c == CharCode.DOLLAR && pos + 1 < end && text.charCodeAt(pos + 1) == CharCode.OPENBRACE) { + result += text.substring(start, pos); + this.pos = pos + 2; + this.readingTemplate = true; + return result; + } + } else if (isLineBreak(c)) { result += text.substring(start, pos); this.error( DiagnosticCode.Unterminated_string_literal, @@ -1112,6 +1117,7 @@ export class Tokenizer extends DiagnosticEmitter { ++pos; } this.pos = pos; + this.readingTemplate = false; return result; } diff --git a/tests/parser/literals.ts b/tests/parser/literals.ts index 02e0a0f5d1..eace89b039 100644 --- a/tests/parser/literals.ts +++ b/tests/parser/literals.ts @@ -56,10 +56,25 @@ 1.0e+1; 1e-1; 1.0e-1; +""; "123"; "1\"23"; "1\"2\\3"; "\0\n\\n\r"; +``; +`123`; +`123${a}`; +`123${a}456`; +`123${a}456${b}`; +`123${a}456${b}789`; +`${a}`; +`${a}456`; +`${a}456${b}`; +`${a}456${b}789`; +`${a}${b}`; +`${a}456${b}`; +`123${a}${b}`; +`${a}${b}789`; // invalid 1..; @@ -70,7 +85,6 @@ 7_; 1.a; 2.0b; -`123`; // technically invalid, but not handled by AS yet, TS1005: ';' expected 3 4; diff --git a/tests/parser/literals.ts.fixture.ts b/tests/parser/literals.ts.fixture.ts index ef01ffd9f0..375aa19d15 100644 --- a/tests/parser/literals.ts.fixture.ts +++ b/tests/parser/literals.ts.fixture.ts @@ -56,10 +56,25 @@ 10; 0.1; 0.1; +""; "123"; "1\"23"; "1\"2\\3"; "\0\n\\n\r"; +``; +`123`; +`123${a}`; +`123${a}456`; +`123${a}456${b}`; +`123${a}456${b}789`; +`${a}`; +`${a}456`; +`${a}456${b}`; +`${a}456${b}789`; +`${a}${b}`; +`${a}456${b}`; +`123${a}${b}`; +`${a}${b}789`; 4; b; 7; @@ -67,7 +82,6 @@ b; a; 2; b; -"123"; 3; 4; 5; @@ -76,11 +90,10 @@ c; d; a; b; -// ERROR 1109: "Expression expected." in literals.ts(65,4+1) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(66,2+0) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(67,2+0) -// ERROR 1109: "Expression expected." in literals.ts(68,3+1) -// ERROR 6188: "Numeric separators are not allowed here." in literals.ts(70,2+0) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(71,3+0) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(72,4+0) -// WARNING 100: "Not implemented: Template Literals can only be used for multi-line strings. Interpolation is not supported." in literals.ts(73,1+102) +// ERROR 1109: "Expression expected." in literals.ts(80,4+1) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(81,2+0) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(82,2+0) +// ERROR 1109: "Expression expected." in literals.ts(83,3+1) +// ERROR 6188: "Numeric separators are not allowed here." in literals.ts(85,2+0) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(86,3+0) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(87,4+0) From 22b736a6e6847be05cd4136175db7f8a85005eec Mon Sep 17 00:00:00 2001 From: dcode Date: Sat, 6 Mar 2021 02:02:44 +0100 Subject: [PATCH 02/13] fix --- src/parser.ts | 2 +- src/tokenizer.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/parser.ts b/src/parser.ts index c652e51e76..4fede3b26f 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -3804,7 +3804,7 @@ export class Parser extends DiagnosticEmitter { let parts = new Array(); parts.push(tn.readString()); let exprs = new Array(); - while (tn.readingTemplate) { + while (tn.readingTemplateString) { let expr = this.parseExpression(tn); if (!expr) return null; exprs.push(expr); diff --git a/src/tokenizer.ts b/src/tokenizer.ts index cfde7087ef..33c4c31e13 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -1067,13 +1067,13 @@ export class Tokenizer extends DiagnosticEmitter { return text.substring(start, pos); } - readingTemplate: bool = false; + readingTemplateString: bool = false; readString(quote: i32 = 0): string { var text = this.source.text; var end = this.end; var pos = this.pos; - var quote = quote || text.charCodeAt(pos++); + if (!quote) quote = text.charCodeAt(pos++); var start = pos; var result = ""; @@ -1103,7 +1103,7 @@ export class Tokenizer extends DiagnosticEmitter { if (c == CharCode.DOLLAR && pos + 1 < end && text.charCodeAt(pos + 1) == CharCode.OPENBRACE) { result += text.substring(start, pos); this.pos = pos + 2; - this.readingTemplate = true; + this.readingTemplateString = true; return result; } } else if (isLineBreak(c)) { @@ -1117,7 +1117,7 @@ export class Tokenizer extends DiagnosticEmitter { ++pos; } this.pos = pos; - this.readingTemplate = false; + this.readingTemplateString = false; return result; } From 84395194b6c2a979089f0adc62e2f1fe2d2e3949 Mon Sep 17 00:00:00 2001 From: dcode Date: Sat, 6 Mar 2021 02:09:41 +0100 Subject: [PATCH 03/13] remove unused singleQuoted parameter --- src/extra/ast.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/extra/ast.ts b/src/extra/ast.ts index 859db32ebf..fe6158a820 100644 --- a/src/extra/ast.ts +++ b/src/extra/ast.ts @@ -675,12 +675,11 @@ export class ASTBuilder { this.sb.push(i64_to_string(node.value)); } - visitStringLiteral(str: string, singleQuoted: bool = false): void { + visitStringLiteral(str: string): void { var sb = this.sb; - var quote = singleQuoted ? "'" : "\""; - sb.push(quote); - this.visitRawString(str, singleQuoted ? CharCode.SINGLEQUOTE : CharCode.DOUBLEQUOTE); - sb.push(quote); + sb.push("\""); + this.visitRawString(str, CharCode.DOUBLEQUOTE); + sb.push("\""); } private visitRawString(str: string, quote: CharCode): void { From f23ca8ca54a13b27c87526158ef49f15c3471f76 Mon Sep 17 00:00:00 2001 From: dcode Date: Sat, 6 Mar 2021 02:13:09 +0100 Subject: [PATCH 04/13] fix backtick escape --- src/extra/ast.ts | 2 +- tests/parser/literals.ts | 3 +++ tests/parser/literals.ts.fixture.ts | 17 ++++++++++------- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/extra/ast.ts b/src/extra/ast.ts index fe6158a820..f0b08521b1 100644 --- a/src/extra/ast.ts +++ b/src/extra/ast.ts @@ -759,7 +759,7 @@ export class ASTBuilder { case CharCode.BACKTICK: { if (quote == CharCode.BACKTICK) { if (i > off) sb.push(str.substring(off, i)); - sb.push("\\'"); + sb.push("\\`"); off = ++i; } else { ++i; diff --git a/tests/parser/literals.ts b/tests/parser/literals.ts index eace89b039..ef28a9ddb9 100644 --- a/tests/parser/literals.ts +++ b/tests/parser/literals.ts @@ -57,6 +57,7 @@ 1e-1; 1.0e-1; ""; +"\""; "123"; "1\"23"; "1\"2\\3"; @@ -75,6 +76,8 @@ `${a}456${b}`; `123${a}${b}`; `${a}${b}789`; +`\``; +`\`${a}\`${b}\``; // invalid 1..; diff --git a/tests/parser/literals.ts.fixture.ts b/tests/parser/literals.ts.fixture.ts index 375aa19d15..62adf8a1c0 100644 --- a/tests/parser/literals.ts.fixture.ts +++ b/tests/parser/literals.ts.fixture.ts @@ -57,6 +57,7 @@ 0.1; 0.1; ""; +"\""; "123"; "1\"23"; "1\"2\\3"; @@ -75,6 +76,8 @@ `${a}456${b}`; `123${a}${b}`; `${a}${b}789`; +`\``; +`\`${a}\`${b}\``; 4; b; 7; @@ -90,10 +93,10 @@ c; d; a; b; -// ERROR 1109: "Expression expected." in literals.ts(80,4+1) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(81,2+0) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(82,2+0) -// ERROR 1109: "Expression expected." in literals.ts(83,3+1) -// ERROR 6188: "Numeric separators are not allowed here." in literals.ts(85,2+0) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(86,3+0) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(87,4+0) +// ERROR 1109: "Expression expected." in literals.ts(83,4+1) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(84,2+0) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(85,2+0) +// ERROR 1109: "Expression expected." in literals.ts(86,3+1) +// ERROR 6188: "Numeric separators are not allowed here." in literals.ts(88,2+0) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(89,3+0) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(90,4+0) From 02d2f97970dedda0db96f376053123e956a413b9 Mon Sep 17 00:00:00 2001 From: dcode Date: Sat, 6 Mar 2021 14:47:07 +0100 Subject: [PATCH 05/13] parse tags --- src/ast.ts | 5 +++- src/compiler.ts | 8 +++--- src/extra/ast.ts | 2 ++ src/parser.ts | 9 +++++-- src/tokenizer.ts | 39 ++++++++++++----------------- src/util/text.ts | 5 ---- tests/parser/literals.ts | 1 + tests/parser/literals.ts.fixture.ts | 13 +++++----- 8 files changed, 42 insertions(+), 40 deletions(-) diff --git a/src/ast.ts b/src/ast.ts index e3af84f03f..f45644b503 100644 --- a/src/ast.ts +++ b/src/ast.ts @@ -379,11 +379,12 @@ export abstract class Node { } static createTemplateLiteralExpression( + tag: string | null, parts: string[], expressions: Expression[], range: Range ): TemplateLiteralExpression { - return new TemplateLiteralExpression(parts, expressions, range); + return new TemplateLiteralExpression(tag, parts, expressions, range); } static createThisExpression( @@ -1455,6 +1456,8 @@ export class SuperExpression extends IdentifierExpression { /** Represents a template literal expression. */ export class TemplateLiteralExpression extends LiteralExpression { constructor( + /** Template tag, if any. */ + public tag: string | null, /** String parts. */ public parts: string[], /** Expression parts. */ diff --git a/src/compiler.ts b/src/compiler.ts index ece5e8f172..708695e47c 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8013,9 +8013,11 @@ export class Compiler extends DiagnosticEmitter { expression: TemplateLiteralExpression, constraints: Constraints ): ExpressionRef { - var parts = expression.parts; - if (parts.length == 1) { - return this.ensureStaticString(parts[0]); + if (!expression.tag) { + let parts = expression.parts; + if (parts.length == 1) { + return this.ensureStaticString(parts[0]); + } } // TODO this.error( diff --git a/src/extra/ast.ts b/src/extra/ast.ts index f0b08521b1..c9148daa7f 100644 --- a/src/extra/ast.ts +++ b/src/extra/ast.ts @@ -781,8 +781,10 @@ export class ASTBuilder { visitTemplateLiteralExpression(node: TemplateLiteralExpression): void { var sb = this.sb; + var tag = node.tag; var parts = node.parts; var expressions = node.expressions; + if (tag !== null) sb.push(tag); sb.push("`"); this.visitRawString(parts[0], CharCode.BACKTICK); assert(parts.length == expressions.length + 1); diff --git a/src/parser.ts b/src/parser.ts index 4fede3b26f..45cc6d82b8 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -3800,7 +3800,12 @@ export class Parser extends DiagnosticEmitter { case Token.STRINGLITERAL: { return Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos)); } - case Token.TEMPLATELITERAL: { + case Token.TEMPLATELITERAL: + case Token.TAGGEDTEMPLATELITERAL: { + let tag: string | null = null; + if (token == Token.TAGGEDTEMPLATELITERAL) { + tag = tn.readIdentifier(); + } let parts = new Array(); parts.push(tn.readString()); let exprs = new Array(); @@ -3817,7 +3822,7 @@ export class Parser extends DiagnosticEmitter { } parts.push(tn.readString(CharCode.BACKTICK)); } - return Node.createTemplateLiteralExpression(parts, exprs, tn.range(startPos, tn.pos)); + return Node.createTemplateLiteralExpression(tag, parts, exprs, tn.range(startPos, tn.pos)); } case Token.INTEGERLITERAL: { let value = tn.readInteger(); diff --git a/src/tokenizer.ts b/src/tokenizer.ts index 33c4c31e13..42ae600501 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -29,8 +29,7 @@ import { isIdentifierStart, isIdentifierPart, isDecimalDigit, - isOctalDigit, - isKeywordCharacter + isOctalDigit } from "./util"; /** Named token types. */ @@ -161,9 +160,10 @@ export enum Token { IDENTIFIER, STRINGLITERAL, - TEMPLATELITERAL, INTEGERLITERAL, FLOATLITERAL, + TEMPLATELITERAL, + TAGGEDTEMPLATELITERAL, // meta @@ -910,34 +910,26 @@ export class Tokenizer extends DiagnosticEmitter { } default: { if (isIdentifierStart(c)) { - if (isKeywordCharacter(c)) { - let posBefore = pos; - while ( - ++pos < end && - isIdentifierPart(c = text.charCodeAt(pos)) - ) { - if (!isKeywordCharacter(c)) { - this.pos = posBefore; - return Token.IDENTIFIER; - } - } - let keywordText = text.substring(posBefore, pos); - let keywordToken = tokenFromKeyword(keywordText); + let posBefore = pos; + while ( + ++pos < end && + isIdentifierPart(c = text.charCodeAt(pos)) + ) { /* nop */ } + if (identifierHandling != IdentifierHandling.ALWAYS) { + let maybeKeywordToken = tokenFromKeyword(text.substring(posBefore, pos)); if ( - keywordToken !== Token.INVALID && - identifierHandling !== IdentifierHandling.ALWAYS && + maybeKeywordToken !== Token.INVALID && !( identifierHandling === IdentifierHandling.PREFER && - tokenIsAlsoIdentifier(keywordToken) + tokenIsAlsoIdentifier(maybeKeywordToken) ) ) { this.pos = pos; - return keywordToken; + return maybeKeywordToken; } - this.pos = pos = posBefore; } - this.pos = pos; - return Token.IDENTIFIER; // expects a call to readIdentifier + this.pos = posBefore; + return c == CharCode.BACKTICK ? Token.TAGGEDTEMPLATELITERAL : Token.IDENTIFIER; } else if (isWhiteSpace(c)) { ++pos; break; @@ -1067,6 +1059,7 @@ export class Tokenizer extends DiagnosticEmitter { return text.substring(start, pos); } + templateTag: string | null = null; readingTemplateString: bool = false; readString(quote: i32 = 0): string { diff --git a/src/util/text.ts b/src/util/text.ts index 22b2063d2c..d4652d8352 100644 --- a/src/util/text.ts +++ b/src/util/text.ts @@ -201,11 +201,6 @@ export function isIdentifierStart(c: i32): bool { || c > 0x7F && isUnicodeIdentifierStart(c); } -/** Tests if the specified character code is a valid keyword character. */ -export function isKeywordCharacter(c: i32): bool { - return c >= CharCode.a && c <= CharCode.z; -} - /** Tests if the specified character code is a valid part of an identifier. */ export function isIdentifierPart(c: i32): bool { const c0 = c | 32; // unify uppercases and lowercases a|A - z|Z diff --git a/tests/parser/literals.ts b/tests/parser/literals.ts index ef28a9ddb9..9bb1c8a246 100644 --- a/tests/parser/literals.ts +++ b/tests/parser/literals.ts @@ -78,6 +78,7 @@ `${a}${b}789`; `\``; `\`${a}\`${b}\``; +tag`123`; // invalid 1..; diff --git a/tests/parser/literals.ts.fixture.ts b/tests/parser/literals.ts.fixture.ts index 62adf8a1c0..e23c4e7603 100644 --- a/tests/parser/literals.ts.fixture.ts +++ b/tests/parser/literals.ts.fixture.ts @@ -78,6 +78,7 @@ `${a}${b}789`; `\``; `\`${a}\`${b}\``; +tag`123`; 4; b; 7; @@ -93,10 +94,10 @@ c; d; a; b; -// ERROR 1109: "Expression expected." in literals.ts(83,4+1) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(84,2+0) +// ERROR 1109: "Expression expected." in literals.ts(84,4+1) // ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(85,2+0) -// ERROR 1109: "Expression expected." in literals.ts(86,3+1) -// ERROR 6188: "Numeric separators are not allowed here." in literals.ts(88,2+0) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(89,3+0) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(90,4+0) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(86,2+0) +// ERROR 1109: "Expression expected." in literals.ts(87,3+1) +// ERROR 6188: "Numeric separators are not allowed here." in literals.ts(89,2+0) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(90,3+0) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(91,4+0) From aef10756b2c849fac10e5ac5eb3bd8ac4676bc53 Mon Sep 17 00:00:00 2001 From: dcode Date: Sat, 6 Mar 2021 16:22:34 +0100 Subject: [PATCH 06/13] ecma things --- src/parser.ts | 9 ++-- src/tokenizer.ts | 80 +++++++++++++++++++---------- src/util/text.ts | 7 ++- tests/parser/literals.ts | 2 + tests/parser/literals.ts.fixture.ts | 17 +++--- 5 files changed, 75 insertions(+), 40 deletions(-) diff --git a/src/parser.ts b/src/parser.ts index 45cc6d82b8..2fc77db358 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -3802,12 +3802,11 @@ export class Parser extends DiagnosticEmitter { } case Token.TEMPLATELITERAL: case Token.TAGGEDTEMPLATELITERAL: { + let isTaggedTemplate = token == Token.TAGGEDTEMPLATELITERAL; let tag: string | null = null; - if (token == Token.TAGGEDTEMPLATELITERAL) { - tag = tn.readIdentifier(); - } + if (isTaggedTemplate) tag = tn.readIdentifier(); let parts = new Array(); - parts.push(tn.readString()); + parts.push(tn.readString(0, isTaggedTemplate)); let exprs = new Array(); while (tn.readingTemplateString) { let expr = this.parseExpression(tn); @@ -3820,7 +3819,7 @@ export class Parser extends DiagnosticEmitter { ); return null; } - parts.push(tn.readString(CharCode.BACKTICK)); + parts.push(tn.readString(CharCode.BACKTICK, isTaggedTemplate)); } return Node.createTemplateLiteralExpression(tag, parts, exprs, tn.range(startPos, tn.pos)); } diff --git a/src/tokenizer.ts b/src/tokenizer.ts index 42ae600501..648b285b5d 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -1059,10 +1059,9 @@ export class Tokenizer extends DiagnosticEmitter { return text.substring(start, pos); } - templateTag: string | null = null; readingTemplateString: bool = false; - readString(quote: i32 = 0): string { + readString(quote: i32 = 0, isTaggedTemplate: bool = false): string { var text = this.source.text; var end = this.end; var pos = this.pos; @@ -1087,7 +1086,7 @@ export class Tokenizer extends DiagnosticEmitter { if (c == CharCode.BACKSLASH) { result += text.substring(start, pos); this.pos = pos; // save - result += this.readEscapeSequence(); + result += this.readEscapeSequence(isTaggedTemplate); pos = this.pos; // restore start = pos; continue; @@ -1114,7 +1113,9 @@ export class Tokenizer extends DiagnosticEmitter { return result; } - readEscapeSequence(): string { + readEscapeSequence(isTaggedTemplate: bool = false): string { + // for context on isTaggedTemplate, see: https://tc39.es/proposal-template-literal-revision/ + var start = this.pos; var end = this.end; if (++this.pos >= end) { this.error( @@ -1127,7 +1128,13 @@ export class Tokenizer extends DiagnosticEmitter { var text = this.source.text; var c = text.charCodeAt(this.pos++); switch (c) { - case CharCode._0: return "\0"; + case CharCode._0: { + if (isTaggedTemplate && this.pos < end && isDecimalDigit(text.charCodeAt(this.pos))) { + ++this.pos; + return text.substring(start, this.pos); + } + return "\0"; + } case CharCode.b: return "\b"; case CharCode.t: return "\t"; case CharCode.n: return "\n"; @@ -1142,12 +1149,12 @@ export class Tokenizer extends DiagnosticEmitter { text.charCodeAt(this.pos) == CharCode.OPENBRACE ) { ++this.pos; - return this.readExtendedUnicodeEscape(); // \u{DDDDDDDD} + return this.readExtendedUnicodeEscape(isTaggedTemplate ? start : -1); // \u{DDDDDDDD} } - return this.readUnicodeEscape(); // \uDDDD + return this.readUnicodeEscape(isTaggedTemplate ? start : -1); // \uDDDD } case CharCode.x: { - return this.readHexadecimalEscape(); // \xDD + return this.readHexadecimalEscape(2, isTaggedTemplate ? start : - 1); // \xDD } case CharCode.CARRIAGERETURN: { if ( @@ -1584,7 +1591,7 @@ export class Tokenizer extends DiagnosticEmitter { throw new Error("not implemented"); // TBD } - readHexadecimalEscape(remain: i32 = 2): string { + readHexadecimalEscape(remain: i32 = 2, startIfTaggedTemplate: i32 = -1): string { var value = 0; var text = this.source.text; var pos = this.pos; @@ -1598,21 +1605,28 @@ export class Tokenizer extends DiagnosticEmitter { } else if (c >= CharCode.a && c <= CharCode.f) { value = (value << 4) + c + (10 - CharCode.a); } else { + this.pos = pos; + if (~startIfTaggedTemplate) { + remain = 1; // invalid + break; + } this.error( DiagnosticCode.Hexadecimal_digit_expected, this.range(pos - 1, pos) ); - this.pos = pos; return ""; } if (--remain == 0) break; } - if (remain) { + if (remain) { // invalid + this.pos = pos; + if (~startIfTaggedTemplate) { + return text.substring(startIfTaggedTemplate, pos); + } this.error( DiagnosticCode.Unexpected_end_of_text, this.range(pos) ); - this.pos = pos; return ""; } this.pos = pos; @@ -1630,11 +1644,11 @@ export class Tokenizer extends DiagnosticEmitter { } } - readUnicodeEscape(): string { - return this.readHexadecimalEscape(4); + readUnicodeEscape(startIfTaggedTemplate: i32 = -1): string { + return this.readHexadecimalEscape(4, startIfTaggedTemplate); } - private readExtendedUnicodeEscape(): string { + private readExtendedUnicodeEscape(startIfTaggedTemplate: i32 = -1): string { var start = this.pos; var value = this.readHexInteger(); var value32 = i64_low(value); @@ -1642,32 +1656,42 @@ export class Tokenizer extends DiagnosticEmitter { assert(!i64_high(value)); if (value32 > 0x10FFFF) { - this.error( - DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive, - this.range(start, this.pos) - ); + if (startIfTaggedTemplate == -1) { + this.error( + DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive, + this.range(start, this.pos) + ); + } invalid = true; } var end = this.end; var text = this.source.text; if (this.pos >= end) { - this.error( - DiagnosticCode.Unexpected_end_of_text, - this.range(start, end) - ); + if (startIfTaggedTemplate == -1) { + this.error( + DiagnosticCode.Unexpected_end_of_text, + this.range(start, end) + ); + } invalid = true; } else if (text.charCodeAt(this.pos) == CharCode.CLOSEBRACE) { ++this.pos; } else { - this.error( - DiagnosticCode.Unterminated_Unicode_escape_sequence, - this.range(start, this.pos) - ); + if (startIfTaggedTemplate == -1) { + this.error( + DiagnosticCode.Unterminated_Unicode_escape_sequence, + this.range(start, this.pos) + ); + } invalid = true; } - if (invalid) return ""; + if (invalid) { + return ~startIfTaggedTemplate + ? text.substring(startIfTaggedTemplate, this.pos) + : ""; + } return value32 < 0x10000 ? String.fromCharCode(value32) : String.fromCharCode( diff --git a/src/util/text.ts b/src/util/text.ts index d4652d8352..8df6c407a6 100644 --- a/src/util/text.ts +++ b/src/util/text.ts @@ -185,6 +185,11 @@ export function isOctalDigit(c: i32): bool { return c >= CharCode._0 && c <= CharCode._7; } +/** Tests if the specified character code is a valid hexadecimal digit. */ +export function isHexDigit(c: i32): bool { + return isDecimalDigit(c) || ((c | 32) >= CharCode.a && (c | 32) <= CharCode.f); +} + /** Tests if the specified character code is trivially alphanumeric. */ export function isTrivialAlphanum(code: i32): bool { return code >= CharCode.a && code <= CharCode.z @@ -194,7 +199,7 @@ export function isTrivialAlphanum(code: i32): bool { /** Tests if the specified character code is a valid start of an identifier. */ export function isIdentifierStart(c: i32): bool { - const c0 = c | 32; // unify uppercases and lowercases a|A - z|Z + let c0 = c | 32; // unify uppercases and lowercases a|A - z|Z return c0 >= CharCode.a && c0 <= CharCode.z || c == CharCode._ || c == CharCode.DOLLAR diff --git a/tests/parser/literals.ts b/tests/parser/literals.ts index 9bb1c8a246..a073ac2669 100644 --- a/tests/parser/literals.ts +++ b/tests/parser/literals.ts @@ -79,6 +79,7 @@ `\``; `\`${a}\`${b}\``; tag`123`; +tag`\unicode\xGG\u\x`; // see https://tc39.es/proposal-template-literal-revision/ // invalid 1..; @@ -89,6 +90,7 @@ tag`123`; 7_; 1.a; 2.0b; +`\unicode\xGG\u\x`; // technically invalid, but not handled by AS yet, TS1005: ';' expected 3 4; diff --git a/tests/parser/literals.ts.fixture.ts b/tests/parser/literals.ts.fixture.ts index e23c4e7603..19a569c698 100644 --- a/tests/parser/literals.ts.fixture.ts +++ b/tests/parser/literals.ts.fixture.ts @@ -79,6 +79,7 @@ `\``; `\`${a}\`${b}\``; tag`123`; +tag`\\unicode\\xGG\\u\\x`; 4; b; 7; @@ -86,6 +87,7 @@ b; a; 2; b; +`icodeGx`; 3; 4; 5; @@ -94,10 +96,13 @@ c; d; a; b; -// ERROR 1109: "Expression expected." in literals.ts(84,4+1) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(85,2+0) +// ERROR 1109: "Expression expected." in literals.ts(85,4+1) // ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(86,2+0) -// ERROR 1109: "Expression expected." in literals.ts(87,3+1) -// ERROR 6188: "Numeric separators are not allowed here." in literals.ts(89,2+0) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(90,3+0) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(91,4+0) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(87,2+0) +// ERROR 1109: "Expression expected." in literals.ts(88,3+1) +// ERROR 6188: "Numeric separators are not allowed here." in literals.ts(90,2+0) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(91,3+0) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(92,4+0) +// ERROR 1125: "Hexadecimal digit expected." in literals.ts(93,4+1) +// ERROR 1125: "Hexadecimal digit expected." in literals.ts(93,12+1) +// ERROR 1125: "Hexadecimal digit expected." in literals.ts(93,16+1) From 3ff35212ec3e757feb25d11ebca287506d1ae8b2 Mon Sep 17 00:00:00 2001 From: dcode Date: Wed, 10 Mar 2021 16:30:48 +0100 Subject: [PATCH 07/13] compile untagged to StaticArray#join? --- src/compiler.ts | 62 +- src/module.ts | 123 +- src/program.ts | 12 + std/assembly/string.ts | 6 + tests/compiler/templateliteral.json | 4 + tests/compiler/templateliteral.optimized.wat | 2452 ++++++++++ tests/compiler/templateliteral.ts | 3 + tests/compiler/templateliteral.untouched.wat | 4322 ++++++++++++++++++ 8 files changed, 6967 insertions(+), 17 deletions(-) create mode 100644 tests/compiler/templateliteral.json create mode 100644 tests/compiler/templateliteral.optimized.wat create mode 100644 tests/compiler/templateliteral.ts create mode 100644 tests/compiler/templateliteral.untouched.wat diff --git a/src/compiler.ts b/src/compiler.ts index 708695e47c..32285a6658 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -400,7 +400,7 @@ export class Compiler extends DiagnosticEmitter { super(program.diagnostics); this.program = program; var options = program.options; - var module = Module.create(options.stackSize > 0); + var module = Module.create(options.stackSize > 0, options.nativeSizeType); this.module = module; if (options.memoryBase) { this.memoryOffset = i64_new(options.memoryBase); @@ -1994,9 +1994,12 @@ export class Compiler extends DiagnosticEmitter { } /** Adds an array header to static memory and returns the created segment. */ - private addStaticArrayHeader(elementType: Type, bufferSegment: MemorySegment): MemorySegment { + private addStaticArrayHeader( + elementType: Type, + bufferSegment: MemorySegment, + arrayPrototype: ClassPrototype = this.program.arrayPrototype + ): MemorySegment { var program = this.program; - var arrayPrototype = assert(program.arrayPrototype); var arrayInstance = assert(this.resolver.resolveClass(arrayPrototype, [ elementType ])); var bufferLength = readI32(bufferSegment.buffer, program.OBJECTInstance.offsetof("rtSize")); var arrayLength = i32(bufferLength / elementType.byteSize); @@ -8013,16 +8016,59 @@ export class Compiler extends DiagnosticEmitter { expression: TemplateLiteralExpression, constraints: Constraints ): ExpressionRef { - if (!expression.tag) { - let parts = expression.parts; - if (parts.length == 1) { - return this.ensureStaticString(parts[0]); + var tag = expression.tag; + var parts = expression.parts; + var numParts = parts.length; + var expressions = expression.expressions; + assert(numParts - 1 == expressions.length); + + // Shortcut if just a string + if (tag === null && numParts == 1) { + return this.ensureStaticString(parts[0]); + } + + var module = this.module; + var stringType = this.program.stringInstance.type; + + // Compile to a `StaticArray#join("")` if untagged + if (tag === null) { + let length = 2 * numParts - 1; + let values = new Array(length); + values[0] = this.ensureStaticString(parts[0]); + for (let i = 1; i < numParts; ++i) { + values[2 * i - 1] = module.usize(0); + values[2 * i] = this.ensureStaticString(parts[i]); + } + let arrayInstance = assert(this.resolver.resolveClass(this.program.staticArrayPrototype, [ stringType ])); + let segment = this.addStaticBuffer(stringType, values, arrayInstance.id); + 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(); + for (let i = 0, k = numParts - 1; i < k; ++i) { + // TODO: toString + let expr = this.compileExpression(expressions[i], stringType, Constraints.CONV_IMPLICIT); + stmts.push( + this.makeCallDirect(indexedSetInstance, [ + module.usize(offset), + module.i32(2 * i + 1), + expr + ], expression) + ); } + stmts.push( + this.makeCallDirect(joinInstance, [ + module.usize(offset), + this.ensureStaticString("") + ], expression) + ); + return module.flatten(stmts, stringType.toNativeType()); } + // TODO this.error( DiagnosticCode.Not_implemented_0, - expression.range, "Template Literals can only be used for multi-line strings. Interpolation is not supported." + expression.range, "Tagged template literals" ); this.currentType = this.program.stringInstance.type; return this.module.unreachable(); diff --git a/src/module.ts b/src/module.ts index f76331ed00..1c55be4e4e 100644 --- a/src/module.ts +++ b/src/module.ts @@ -281,7 +281,14 @@ export enum UnaryOp { TruncSatZeroF64x2ToI32x4 = 125 /* TODO_BinaryenTruncSatZeroSVecF64x2ToVecI32x4 */, TruncSatZeroF64x2ToU32x4 = 126 /* TODO_BinaryenTruncSatZeroUVecF64x2ToVecI32x4 */, DemoteZeroF64x2ToF32x4 = 127 /* TODO_BinaryenDemoteZeroVecF64x2ToVecF32x4 */, - PromoteLowF32x4ToF64x2 = 128 /* TODO_BinaryenPromoteLowVecF32x4ToVecF64x2 */ + PromoteLowF32x4ToF64x2 = 128 /* TODO_BinaryenPromoteLowVecF32x4ToVecF64x2 */, + _last = PromoteLowF32x4ToF64x2, + + // Target dependent + ClzSize, + CtzSize, + PopcntSize, + EqzSize } export enum BinaryOp { @@ -484,7 +491,35 @@ export enum BinaryOp { NarrowU16x8ToU8x16 = 188 /* _BinaryenNarrowUVecI16x8ToVecI8x16 */, NarrowI32x4ToI16x8 = 189 /* _BinaryenNarrowSVecI32x4ToVecI16x8 */, NarrowU32x4ToU16x8 = 190 /* _BinaryenNarrowUVecI32x4ToVecI16x8 */, - SwizzleV8x16 = 191 /* _BinaryenSwizzleVec8x16 */ + SwizzleV8x16 = 191 /* _BinaryenSwizzleVec8x16 */, + _last = SwizzleV8x16, + + // Target dependent + AddSize, + SubSize, + MulSize, + DivISize, + DivUSize, + RemISize, + RemUSize, + AndSize, + OrSize, + XorSize, + ShlSize, + ShrISize, + ShrUSize, + RotlSize, + RotrSize, + EqSize, + NeSize, + LtISize, + LtUSize, + LeISize, + LeUSize, + GtISize, + GtUSize, + GeISize, + GeUSize } export enum AtomicRMWOp { @@ -617,20 +652,23 @@ export class Module { /** Binaryen module reference. */ public ref: ModuleRef, /** Whether a shadow stack is used. */ - public useShadowStack: bool + public useShadowStack: bool, + /** Architecture-dependent size type. */ + public sizeType: NativeType ) { + assert(sizeType == NativeType.I32 || sizeType == NativeType.I64); this.lit = binaryen._malloc(binaryen._BinaryenSizeofLiteral()); } private lit: usize; - static create(useShadowStack: bool): Module { - return new Module(binaryen._BinaryenModuleCreate(), useShadowStack); + static create(useShadowStack: bool, sizeType: NativeType): Module { + return new Module(binaryen._BinaryenModuleCreate(), useShadowStack, sizeType); } - static createFrom(buffer: Uint8Array, useShadowStack: bool): Module { + static createFrom(buffer: Uint8Array, useShadowStack: bool, sizeType: NativeType): Module { var cArr = allocU8Array(buffer); - var module = new Module(binaryen._BinaryenModuleRead(cArr, buffer.length), useShadowStack); + var module = new Module(binaryen._BinaryenModuleRead(cArr, buffer.length), useShadowStack, sizeType); binaryen._free(changetype(cArr)); return module; } @@ -649,6 +687,32 @@ export class Module { return binaryen._BinaryenConst(this.ref, out); } + isize(value: T): ExpressionRef { + if (i64_is(value)) { + if (this.sizeType == NativeType.I64) { + return this.i64(i64_low(value), i64_high(value)); + } + assert(i64_is_i32(value)); + return this.i32(i64_low(value)); + } + return this.sizeType == NativeType.I64 + ? this.i64(i32(value), i32(value) < 0 ? -1 : 0) + : this.i32(i32(value)); + } + + usize(value: T): ExpressionRef { + if (i64_is(value)) { + if (this.sizeType == NativeType.I64) { + return this.i64(i64_low(value), i64_high(value)); + } + assert(i64_is_u32(value)); + return this.i32(i64_low(value)); + } + return this.sizeType == NativeType.I64 + ? this.i64(i32(value)) + : this.i32(i32(value)); + } + f32(value: f32): ExpressionRef { var out = this.lit; binaryen._BinaryenLiteralFloat32(out, value); @@ -683,9 +747,19 @@ export class Module { unary( op: UnaryOp, - expr: ExpressionRef + value: ExpressionRef ): ExpressionRef { - return binaryen._BinaryenUnary(this.ref, op, expr); + if (op > UnaryOp._last) { + let isWam64 = this.sizeType == NativeType.I64; + switch (op) { + case UnaryOp.ClzSize: return this.unary(isWam64 ? UnaryOp.ClzI64 : UnaryOp.ClzI32, value); + case UnaryOp.CtzSize: return this.unary(isWam64 ? UnaryOp.CtzI64 : UnaryOp.CtzI32, value); + case UnaryOp.PopcntSize: return this.unary(isWam64 ? UnaryOp.PopcntI64 : UnaryOp.PopcntI32, value); + case UnaryOp.EqzSize: return this.unary(isWam64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32, value); + } + assert(false); + } + return binaryen._BinaryenUnary(this.ref, op, value); } binary( @@ -693,6 +767,37 @@ export class Module { left: ExpressionRef, right: ExpressionRef ): ExpressionRef { + if (op > BinaryOp._last) { + let isWasm64 = this.sizeType == NativeType.I64; + switch (op) { + case BinaryOp.AddSize: return this.binary(isWasm64 ? BinaryOp.AddI64 : BinaryOp.AddI32, left, right); + case BinaryOp.SubSize: return this.binary(isWasm64 ? BinaryOp.SubI64 : BinaryOp.SubI32, left, right); + case BinaryOp.MulSize: return this.binary(isWasm64 ? BinaryOp.MulI64 : BinaryOp.MulI32, left, right); + case BinaryOp.DivISize: return this.binary(isWasm64 ? BinaryOp.DivI64 : BinaryOp.DivI32, left, right); + case BinaryOp.DivUSize: return this.binary(isWasm64 ? BinaryOp.DivU64 : BinaryOp.DivU32, left, right); + case BinaryOp.RemISize: return this.binary(isWasm64 ? BinaryOp.RemI64 : BinaryOp.RemI32, left, right); + case BinaryOp.RemUSize: return this.binary(isWasm64 ? BinaryOp.RemU64 : BinaryOp.RemU32, left, right); + case BinaryOp.AndSize: return this.binary(isWasm64 ? BinaryOp.AndI64 : BinaryOp.AndI32, left, right); + case BinaryOp.OrSize: return this.binary(isWasm64 ? BinaryOp.OrI64 : BinaryOp.OrI32, left, right); + case BinaryOp.XorSize: return this.binary(isWasm64 ? BinaryOp.XorI64 : BinaryOp.XorI32, left, right); + case BinaryOp.ShlSize: return this.binary(isWasm64 ? BinaryOp.ShlI64 : BinaryOp.ShlI32, left, right); + case BinaryOp.ShrISize: return this.binary(isWasm64 ? BinaryOp.ShrI64 : BinaryOp.ShrI32, left, right); + case BinaryOp.ShrUSize: return this.binary(isWasm64 ? BinaryOp.ShrU64 : BinaryOp.ShrU32, left, right); + case BinaryOp.RotlSize: return this.binary(isWasm64 ? BinaryOp.RotlI64 : BinaryOp.RotlI32, left, right); + case BinaryOp.RotrSize: return this.binary(isWasm64 ? BinaryOp.RotrI64 : BinaryOp.RotrI32, left, right); + case BinaryOp.EqSize: return this.binary(isWasm64 ? BinaryOp.EqI64 : BinaryOp.EqI32, left, right); + case BinaryOp.NeSize: return this.binary(isWasm64 ? BinaryOp.NeI64 : BinaryOp.NeI32, left, right); + case BinaryOp.LtISize: return this.binary(isWasm64 ? BinaryOp.LtI64 : BinaryOp.LtI32, left, right); + case BinaryOp.LtUSize: return this.binary(isWasm64 ? BinaryOp.LtU64 : BinaryOp.LtU32, left, right); + case BinaryOp.LeISize: return this.binary(isWasm64 ? BinaryOp.LeI64 : BinaryOp.LeI32, left, right); + case BinaryOp.LeUSize: return this.binary(isWasm64 ? BinaryOp.LeU64 : BinaryOp.LeU32, left, right); + case BinaryOp.GtISize: return this.binary(isWasm64 ? BinaryOp.GtI64 : BinaryOp.GtI32, left, right); + case BinaryOp.GtUSize: return this.binary(isWasm64 ? BinaryOp.GtU64 : BinaryOp.GtU32, left, right); + case BinaryOp.GeISize: return this.binary(isWasm64 ? BinaryOp.GeI64 : BinaryOp.GeI32, left, right); + case BinaryOp.GeUSize: return this.binary(isWasm64 ? BinaryOp.GeU64 : BinaryOp.GeU32, left, right); + } + assert(false); + } return binaryen._BinaryenBinary(this.ref, op, left, right); } diff --git a/src/program.ts b/src/program.ts index c8b7c73484..4e2be13705 100644 --- a/src/program.ts +++ b/src/program.ts @@ -4326,6 +4326,18 @@ export class Class extends TypedElement { return this.parent.lookup(name); } + /** Gets the method of the specified name, resolved with the given type arguments. */ + getMethod(name: string, typeArguments: Type[] | null = null): Function | null { + var members = this.members; + if (members !== null && members.has(name)) { + let bound = changetype(members.get(name)); + if (bound.kind == ElementKind.FUNCTION_PROTOTYPE) { + return this.program.resolver.resolveFunction(bound, typeArguments); + } + } + return null; + } + /** Calculates the memory offset of the specified field. */ offsetof(fieldName: string): u32 { var members = assert(this.members); diff --git a/std/assembly/string.ts b/std/assembly/string.ts index 09f9bbaf60..9697694cc5 100644 --- a/std/assembly/string.ts +++ b/std/assembly/string.ts @@ -820,3 +820,9 @@ export namespace String { } } } + +/* eslint-disable @typescript-eslint/no-unused-vars */ + +class TemplateStringsArray extends Array { + readonly raw: string; +} diff --git a/tests/compiler/templateliteral.json b/tests/compiler/templateliteral.json new file mode 100644 index 0000000000..73d40f91f2 --- /dev/null +++ b/tests/compiler/templateliteral.json @@ -0,0 +1,4 @@ +{ + "asc_flags": [ + ] +} \ No newline at end of file diff --git a/tests/compiler/templateliteral.optimized.wat b/tests/compiler/templateliteral.optimized.wat new file mode 100644 index 0000000000..93f94d7636 --- /dev/null +++ b/tests/compiler/templateliteral.optimized.wat @@ -0,0 +1,2452 @@ +(module + (type $i32_i32_=>_none (func (param i32 i32))) + (type $none_=>_none (func)) + (type $i32_=>_none (func (param i32))) + (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) + (type $i32_=>_i32 (func (param i32) (result i32))) + (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + (type $none_=>_i32 (func (result i32))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (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\00\00\00\06\00\00\00(\00a\00=") + (data (i32.const 1132) "\1c") + (data (i32.const 1144) "\01\00\00\00\08\00\00\00,\00 \00b\00=") + (data (i32.const 1164) "\1c") + (data (i32.const 1176) "\01\00\00\00\02\00\00\00)") + (data (i32.const 1196) ",") + (data (i32.const 1208) "\03\00\00\00\14\00\00\00`\04\00\00\00\00\00\00\80\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) "\1c") + (data (i32.const 1464) "\01") + (data (i32.const 1484) "\1c") + (data (i32.const 1496) "\01\00\00\00\08\00\00\00n\00u\00l\00l") + (data (i32.const 1516) "<") + (data (i32.const 1528) "\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 1644) "<") + (data (i32.const 1656) "\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 1708) ",") + (data (i32.const 1720) "\01\00\00\00\14\00\00\00(\00a\00=\00a\00,\00 \00b\00=\00b\00)") + (data (i32.const 1756) "<") + (data (i32.const 1768) "\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 1824) "\04\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 1852) "\04A") + (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/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (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/memory/__stack_pointer (mut i32) (i32.const 18244)) + (export "memory" (memory $0)) + (start $~start) + (func $~lib/rt/itcms/Object#set:next (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.or + i32.store offset=4 + ) + (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) + local.get $0 + local.get $0 + i32.store offset=4 + local.get $0 + local.get $0 + i32.store offset=8 + local.get $0 + ) + (func $~lib/rt/itcms/Object#linkTo (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + local.get $1 + i32.load offset=8 + local.set $3 + local.get $0 + local.get $1 + local.get $2 + i32.or + i32.store offset=4 + local.get $0 + local.get $3 + i32.store offset=8 + local.get $3 + local.get $0 + call $~lib/rt/itcms/Object#set:next + local.get $1 + local.get $0 + i32.store offset=8 + ) + (func $~lib/rt/itcms/Object#makeGray (param $0 i32) + (local $1 i32) + (local $2 i32) + local.get $0 + global.get $~lib/rt/itcms/iter + i32.eq + if + local.get $0 + i32.load offset=8 + local.tee $1 + i32.eqz + if + i32.const 0 + i32.const 1264 + i32.const 147 + i32.const 30 + call $~lib/builtins/abort + unreachable + end + local.get $1 + global.set $~lib/rt/itcms/iter + end + block $__inlined_func$~lib/rt/itcms/Object#unlink + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.tee $1 + i32.eqz + if + i32.const 0 + local.get $0 + i32.const 18244 + i32.lt_u + local.get $0 + i32.load offset=8 + select + i32.eqz + if + i32.const 0 + i32.const 1264 + i32.const 127 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + br $__inlined_func$~lib/rt/itcms/Object#unlink + end + local.get $0 + i32.load offset=8 + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 1264 + i32.const 131 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $1 + local.get $2 + i32.store offset=8 + local.get $2 + local.get $1 + call $~lib/rt/itcms/Object#set:next + end + local.get $0 + global.get $~lib/rt/itcms/toSpace + local.get $0 + i32.load offset=12 + local.tee $1 + i32.const 1 + i32.le_u + if (result i32) + i32.const 1 + else + local.get $1 + i32.const 1824 + i32.load + i32.gt_u + if + i32.const 1360 + i32.const 1424 + i32.const 22 + i32.const 28 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 3 + i32.shl + i32.const 1828 + i32.add + i32.load + i32.const 32 + i32.and + end + if (result i32) + global.get $~lib/rt/itcms/white + i32.eqz + else + i32.const 2 + end + call $~lib/rt/itcms/Object#linkTo + ) + (func $~lib/staticarray/StaticArray<~lib/string/String>#__uset (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + i32.const 2 + i32.shl + i32.const 1216 + i32.add + local.get $1 + i32.store + local.get $1 + if + global.get $~lib/rt/itcms/white + local.get $1 + i32.const 20 + i32.sub + local.tee $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.eq + if + i32.const 1200 + i32.load + i32.const 3 + i32.and + local.tee $1 + local.set $2 + local.get $1 + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + if + i32.const 1196 + 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 $0 + call $~lib/rt/itcms/Object#makeGray + end + end + end + end + ) + (func $~lib/rt/itcms/visitRoots + (local $0 i32) + (local $1 i32) + i32.const 1056 + call $~lib/rt/itcms/__visit + i32.const 1088 + call $~lib/rt/itcms/__visit + i32.const 1360 + call $~lib/rt/itcms/__visit + i32.const 1536 + 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/Object#set:color (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + i32.or + i32.store offset=4 + ) + (func $~lib/rt/itcms/__visit (param $0 i32) + local.get $0 + i32.eqz + if + return + end + global.get $~lib/rt/itcms/white + local.get $0 + i32.const 20 + i32.sub + local.tee $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.eq + if + local.get $0 + call $~lib/rt/itcms/Object#makeGray + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.add + global.set $~lib/rt/itcms/visitCount + end + ) + (func $~lib/rt/tlsf/removeBlock (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $1 + i32.load + local.tee $2 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1664 + i32.const 273 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $2 + i32.const -4 + i32.and + local.tee $2 + i32.const 1073741820 + i32.lt_u + i32.const 0 + local.get $2 + i32.const 12 + i32.ge_u + select + i32.eqz + if + i32.const 0 + i32.const 1664 + i32.const 275 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $2 + i32.const 256 + i32.lt_u + if + local.get $2 + i32.const 4 + i32.shr_u + local.set $2 + else + local.get $2 + i32.const 31 + local.get $2 + i32.clz + i32.sub + local.tee $3 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + local.set $2 + local.get $3 + i32.const 7 + i32.sub + local.set $3 + end + local.get $2 + i32.const 16 + i32.lt_u + i32.const 0 + local.get $3 + i32.const 23 + i32.lt_u + select + i32.eqz + if + i32.const 0 + i32.const 1664 + i32.const 288 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load offset=8 + local.set $4 + local.get $1 + i32.load offset=4 + local.tee $5 + if + local.get $5 + local.get $4 + i32.store offset=8 + end + local.get $4 + if + local.get $4 + local.get $5 + i32.store offset=4 + end + local.get $1 + local.get $0 + local.get $2 + local.get $3 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + i32.eq + if + local.get $0 + local.get $2 + local.get $3 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + local.get $4 + i32.store offset=96 + local.get $4 + i32.eqz + if + local.get $0 + local.get $3 + i32.const 2 + i32.shl + i32.add + local.tee $4 + i32.load offset=4 + i32.const -2 + local.get $2 + i32.rotl + i32.and + local.set $1 + local.get $4 + local.get $1 + i32.store offset=4 + local.get $1 + i32.eqz + if + local.get $0 + local.get $0 + i32.load + i32.const -2 + local.get $3 + i32.rotl + i32.and + i32.store + end + end + end + ) + (func $~lib/rt/tlsf/insertBlock (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + local.get $1 + i32.eqz + if + i32.const 0 + i32.const 1664 + i32.const 201 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load + local.tee $4 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1664 + i32.const 203 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 4 + i32.add + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $5 + i32.load + local.tee $2 + i32.const 1 + i32.and + if + local.get $4 + i32.const -4 + i32.and + i32.const 4 + i32.add + local.get $2 + i32.const -4 + i32.and + i32.add + local.tee $3 + i32.const 1073741820 + i32.lt_u + if + local.get $0 + local.get $5 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $3 + local.get $4 + i32.const 3 + i32.and + i32.or + local.tee $4 + i32.store + local.get $1 + i32.const 4 + i32.add + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $5 + i32.load + local.set $2 + end + end + local.get $4 + i32.const 2 + i32.and + if + local.get $1 + i32.const 4 + i32.sub + i32.load + local.tee $3 + i32.load + local.tee $7 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1664 + i32.const 224 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $7 + i32.const -4 + i32.and + i32.const 4 + i32.add + local.get $4 + i32.const -4 + i32.and + i32.add + local.tee $8 + i32.const 1073741820 + i32.lt_u + if (result i32) + local.get $0 + local.get $3 + call $~lib/rt/tlsf/removeBlock + local.get $3 + local.get $8 + local.get $7 + i32.const 3 + i32.and + i32.or + local.tee $4 + i32.store + local.get $3 + else + local.get $1 + end + local.set $1 + end + local.get $5 + local.get $2 + i32.const 2 + i32.or + i32.store + local.get $4 + i32.const -4 + i32.and + local.tee $3 + i32.const 1073741820 + i32.lt_u + i32.const 0 + local.get $3 + i32.const 12 + i32.ge_u + select + i32.eqz + if + i32.const 0 + i32.const 1664 + i32.const 239 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $5 + local.get $3 + local.get $1 + i32.const 4 + i32.add + i32.add + i32.ne + if + i32.const 0 + i32.const 1664 + i32.const 240 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $5 + i32.const 4 + i32.sub + local.get $1 + i32.store + local.get $3 + i32.const 256 + i32.lt_u + if + local.get $3 + i32.const 4 + i32.shr_u + local.set $3 + else + local.get $3 + i32.const 31 + local.get $3 + i32.clz + i32.sub + local.tee $4 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + local.set $3 + local.get $4 + i32.const 7 + i32.sub + local.set $6 + end + local.get $3 + i32.const 16 + i32.lt_u + i32.const 0 + local.get $6 + i32.const 23 + i32.lt_u + select + i32.eqz + if + i32.const 0 + i32.const 1664 + i32.const 256 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $3 + local.get $6 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $4 + local.get $1 + i32.const 0 + i32.store offset=4 + local.get $1 + local.get $4 + i32.store offset=8 + local.get $4 + if + local.get $4 + local.get $1 + i32.store offset=4 + end + local.get $0 + local.get $3 + local.get $6 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + local.get $1 + i32.store offset=96 + local.get $0 + local.get $0 + i32.load + i32.const 1 + local.get $6 + i32.shl + i32.or + i32.store + local.get $0 + local.get $6 + i32.const 2 + i32.shl + i32.add + local.tee $0 + local.get $0 + i32.load offset=4 + i32.const 1 + local.get $3 + i32.shl + i32.or + i32.store offset=4 + ) + (func $~lib/rt/tlsf/addMemory (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + local.get $1 + local.get $2 + i32.gt_u + if + i32.const 0 + i32.const 1664 + i32.const 381 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 19 + i32.add + i32.const -16 + i32.and + i32.const 4 + i32.sub + local.set $1 + local.get $2 + i32.const -16 + i32.and + local.get $0 + i32.load offset=1568 + local.tee $2 + if + local.get $1 + local.get $2 + i32.const 4 + i32.add + i32.lt_u + if + i32.const 0 + i32.const 1664 + i32.const 388 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $2 + local.get $1 + i32.const 16 + i32.sub + i32.eq + if + local.get $2 + i32.load + local.set $4 + local.get $1 + i32.const 16 + i32.sub + local.set $1 + end + else + local.get $1 + local.get $0 + i32.const 1572 + i32.add + i32.lt_u + if + i32.const 0 + i32.const 1664 + i32.const 401 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + end + local.get $1 + i32.sub + local.tee $2 + i32.const 20 + i32.lt_u + if + return + end + local.get $1 + local.get $4 + i32.const 2 + i32.and + local.get $2 + i32.const 8 + i32.sub + local.tee $2 + i32.const 1 + i32.or + i32.or + i32.store + local.get $1 + i32.const 0 + i32.store offset=4 + local.get $1 + i32.const 0 + i32.store offset=8 + local.get $2 + local.get $1 + i32.const 4 + i32.add + i32.add + local.tee $2 + i32.const 2 + i32.store + local.get $0 + local.get $2 + i32.store offset=1568 + local.get $0 + local.get $1 + call $~lib/rt/tlsf/insertBlock + ) + (func $~lib/rt/tlsf/initialize + (local $0 i32) + (local $1 i32) + memory.size + local.tee $0 + i32.const 1 + i32.lt_s + if (result i32) + i32.const 1 + local.get $0 + i32.sub + memory.grow + i32.const 0 + i32.lt_s + else + i32.const 0 + end + if + unreachable + end + i32.const 18256 + i32.const 0 + i32.store + i32.const 19824 + i32.const 0 + i32.store + loop $for-loop|0 + local.get $1 + i32.const 23 + i32.lt_u + if + local.get $1 + i32.const 2 + i32.shl + i32.const 18256 + i32.add + i32.const 0 + i32.store offset=4 + i32.const 0 + local.set $0 + loop $for-loop|1 + local.get $0 + i32.const 16 + i32.lt_u + if + local.get $0 + local.get $1 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.const 18256 + i32.add + i32.const 0 + i32.store offset=96 + local.get $0 + i32.const 1 + i32.add + local.set $0 + br $for-loop|1 + end + end + local.get $1 + i32.const 1 + i32.add + local.set $1 + br $for-loop|0 + end + end + i32.const 18256 + i32.const 19828 + memory.size + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + i32.const 18256 + global.set $~lib/rt/tlsf/ROOT + ) + (func $~lib/rt/itcms/step (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + block $folding-inner0 + block $break|0 + block $case2|0 + block $case1|0 + block $case0|0 + global.get $~lib/rt/itcms/state + br_table $case0|0 $case1|0 $case2|0 $break|0 + end + i32.const 1 + global.set $~lib/rt/itcms/state + i32.const 0 + global.set $~lib/rt/itcms/visitCount + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/iter + br $folding-inner0 + end + global.get $~lib/rt/itcms/white + i32.eqz + local.set $1 + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|1 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $0 + global.set $~lib/rt/itcms/iter + local.get $1 + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.ne + if + local.get $0 + local.get $1 + call $~lib/rt/itcms/Object#set:color + i32.const 0 + global.set $~lib/rt/itcms/visitCount + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + br $folding-inner0 + end + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|1 + end + end + i32.const 0 + global.set $~lib/rt/itcms/visitCount + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + i32.eq + if + global.get $~lib/memory/__stack_pointer + local.set $0 + loop $while-continue|0 + local.get $0 + i32.const 18244 + i32.lt_u + if + local.get $0 + i32.load + call $~lib/rt/itcms/__visit + local.get $0 + i32.const 4 + i32.add + local.set $0 + br $while-continue|0 + end + end + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|2 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $1 + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.ne + if + local.get $0 + local.get $1 + call $~lib/rt/itcms/Object#set:color + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + end + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|2 + end + end + global.get $~lib/rt/itcms/fromSpace + local.set $0 + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/fromSpace + local.get $0 + global.set $~lib/rt/itcms/toSpace + local.get $1 + global.set $~lib/rt/itcms/white + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + global.set $~lib/rt/itcms/iter + i32.const 2 + global.set $~lib/rt/itcms/state + end + br $folding-inner0 + end + global.get $~lib/rt/itcms/iter + local.tee $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/white + i32.eqz + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.ne + if + i32.const 0 + i32.const 1264 + i32.const 228 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 18244 + i32.lt_u + if + local.get $0 + i32.const 0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store offset=8 + else + global.get $~lib/rt/itcms/total + local.get $0 + i32.load + i32.const -4 + i32.and + i32.const 4 + i32.add + i32.sub + global.set $~lib/rt/itcms/total + local.get $0 + i32.const 4 + i32.add + local.tee $1 + i32.const 18244 + i32.ge_u + if + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $1 + i32.const 4 + i32.sub + local.set $0 + local.get $1 + i32.const 15 + i32.and + i32.eqz + i32.const 0 + local.get $1 + select + if (result i32) + local.get $0 + i32.load + i32.const 1 + i32.and + i32.eqz + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1664 + i32.const 565 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $0 + i32.load + i32.const 1 + i32.or + i32.store + local.get $0 + call $~lib/rt/tlsf/insertBlock + end + end + i32.const 10 + return + end + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + i32.store offset=4 + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + i32.store offset=8 + i32.const 0 + global.set $~lib/rt/itcms/state + end + i32.const 0 + return + end + global.get $~lib/rt/itcms/visitCount + ) + (func $~lib/rt/tlsf/searchBlock (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $1 + i32.const 256 + i32.lt_u + if + local.get $1 + i32.const 4 + i32.shr_u + local.set $1 + else + i32.const 31 + local.get $1 + i32.const 1 + i32.const 27 + local.get $1 + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + local.get $1 + local.get $1 + i32.const 536870910 + i32.lt_u + select + local.tee $1 + i32.clz + i32.sub + local.set $2 + local.get $1 + local.get $2 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + local.set $1 + local.get $2 + i32.const 7 + i32.sub + local.set $2 + end + local.get $1 + i32.const 16 + i32.lt_u + i32.const 0 + local.get $2 + i32.const 23 + i32.lt_u + select + i32.eqz + if + i32.const 0 + i32.const 1664 + i32.const 334 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $2 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + i32.const -1 + local.get $1 + i32.shl + i32.and + local.tee $1 + if (result i32) + local.get $0 + local.get $1 + i32.ctz + local.get $2 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + else + local.get $0 + i32.load + i32.const -1 + local.get $2 + i32.const 1 + i32.add + i32.shl + i32.and + local.tee $1 + if (result i32) + local.get $0 + local.get $1 + i32.ctz + local.tee $1 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 1664 + i32.const 347 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $2 + i32.ctz + local.get $1 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + else + i32.const 0 + end + end + ) + (func $~lib/rt/tlsf/allocateBlock (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + local.get $1 + i32.const 1073741820 + i32.ge_u + if + i32.const 1536 + i32.const 1664 + i32.const 462 + i32.const 30 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 12 + local.get $1 + i32.const 19 + i32.add + i32.const -16 + i32.and + i32.const 4 + i32.sub + local.get $1 + i32.const 12 + i32.le_u + select + local.tee $2 + call $~lib/rt/tlsf/searchBlock + local.tee $1 + i32.eqz + if + i32.const 4 + memory.size + local.tee $1 + i32.const 16 + i32.shl + i32.const 4 + i32.sub + local.get $0 + i32.load offset=1568 + i32.ne + i32.shl + local.get $2 + i32.const 1 + i32.const 27 + local.get $2 + i32.clz + i32.sub + i32.shl + i32.const 1 + i32.sub + i32.add + local.get $2 + local.get $2 + i32.const 536870910 + i32.lt_u + select + i32.add + i32.const 65535 + i32.add + i32.const -65536 + i32.and + i32.const 16 + i32.shr_u + local.set $3 + local.get $1 + local.get $3 + local.get $1 + local.get $3 + i32.gt_s + select + memory.grow + i32.const 0 + i32.lt_s + if + local.get $3 + memory.grow + i32.const 0 + i32.lt_s + if + unreachable + end + end + local.get $0 + local.get $1 + i32.const 16 + i32.shl + memory.size + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + local.get $0 + local.get $2 + call $~lib/rt/tlsf/searchBlock + local.tee $1 + i32.eqz + if + i32.const 0 + i32.const 1664 + i32.const 500 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + end + local.get $2 + local.get $1 + i32.load + i32.const -4 + i32.and + i32.gt_u + if + i32.const 0 + i32.const 1664 + i32.const 502 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + call $~lib/rt/tlsf/removeBlock + local.get $1 + i32.load + local.set $3 + local.get $2 + i32.const 4 + i32.add + i32.const 15 + i32.and + if + i32.const 0 + i32.const 1664 + i32.const 361 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const -4 + i32.and + local.get $2 + i32.sub + local.tee $4 + i32.const 16 + i32.ge_u + if + local.get $1 + local.get $2 + local.get $3 + i32.const 2 + i32.and + i32.or + i32.store + local.get $2 + local.get $1 + i32.const 4 + i32.add + i32.add + local.tee $2 + local.get $4 + i32.const 4 + i32.sub + i32.const 1 + i32.or + i32.store + local.get $0 + local.get $2 + call $~lib/rt/tlsf/insertBlock + else + local.get $1 + local.get $3 + i32.const -2 + i32.and + i32.store + local.get $1 + i32.const 4 + i32.add + local.tee $0 + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.get $0 + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + i32.load + i32.const -3 + i32.and + i32.store + end + local.get $1 + ) + (func $~lib/memory/memory.fill (param $0 i32) (param $1 i32) + (local $2 i32) + block $~lib/util/memory/memset|inlined.0 + local.get $1 + i32.eqz + br_if $~lib/util/memory/memset|inlined.0 + local.get $0 + i32.const 0 + i32.store8 + local.get $0 + local.get $1 + i32.add + i32.const 4 + i32.sub + local.tee $2 + i32.const 0 + i32.store8 offset=3 + local.get $1 + i32.const 2 + i32.le_u + br_if $~lib/util/memory/memset|inlined.0 + local.get $0 + i32.const 0 + i32.store8 offset=1 + local.get $0 + i32.const 0 + i32.store8 offset=2 + local.get $2 + i32.const 0 + i32.store8 offset=2 + local.get $2 + i32.const 0 + i32.store8 offset=1 + local.get $1 + i32.const 6 + i32.le_u + br_if $~lib/util/memory/memset|inlined.0 + local.get $0 + i32.const 0 + i32.store8 offset=3 + local.get $2 + i32.const 0 + i32.store8 + local.get $1 + i32.const 8 + i32.le_u + br_if $~lib/util/memory/memset|inlined.0 + local.get $0 + i32.const 0 + local.get $0 + i32.sub + i32.const 3 + i32.and + local.tee $2 + i32.add + local.tee $0 + i32.const 0 + i32.store + local.get $0 + local.get $1 + local.get $2 + i32.sub + i32.const -4 + i32.and + local.tee $2 + i32.add + i32.const 28 + i32.sub + local.tee $1 + i32.const 0 + i32.store offset=24 + local.get $2 + i32.const 8 + i32.le_u + br_if $~lib/util/memory/memset|inlined.0 + local.get $0 + i32.const 0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store offset=8 + local.get $1 + i32.const 0 + i32.store offset=16 + local.get $1 + i32.const 0 + i32.store offset=20 + local.get $2 + i32.const 24 + i32.le_u + br_if $~lib/util/memory/memset|inlined.0 + local.get $0 + i32.const 0 + i32.store offset=12 + local.get $0 + i32.const 0 + i32.store offset=16 + local.get $0 + i32.const 0 + i32.store offset=20 + local.get $0 + i32.const 0 + i32.store offset=24 + local.get $1 + i32.const 0 + i32.store + local.get $1 + i32.const 0 + i32.store offset=4 + local.get $1 + i32.const 0 + i32.store offset=8 + local.get $1 + i32.const 0 + i32.store offset=12 + local.get $0 + local.get $0 + i32.const 4 + i32.and + i32.const 24 + i32.add + local.tee $1 + i32.add + local.set $0 + local.get $2 + local.get $1 + i32.sub + local.set $1 + loop $while-continue|0 + local.get $1 + i32.const 32 + i32.ge_u + if + local.get $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 + i64.const 0 + i64.store offset=24 + local.get $1 + i32.const 32 + i32.sub + local.set $1 + local.get $0 + i32.const 32 + i32.add + local.set $0 + br $while-continue|0 + end + end + end + ) + (func $~lib/rt/itcms/__new (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.const 1073741804 + i32.ge_u + if + i32.const 1536 + i32.const 1264 + i32.const 260 + i32.const 31 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.ge_u + if + block $__inlined_func$~lib/rt/itcms/interrupt + i32.const 2048 + local.set $1 + loop $do-continue|0 + local.get $1 + call $~lib/rt/itcms/step + i32.sub + local.set $1 + global.get $~lib/rt/itcms/state + i32.eqz + if + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i64.const 200 + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + br $__inlined_func$~lib/rt/itcms/interrupt + end + local.get $1 + i32.const 0 + i32.gt_s + br_if $do-continue|0 + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.sub + i32.const 1024 + i32.lt_u + i32.const 10 + i32.shl + i32.add + global.set $~lib/rt/itcms/threshold + end + end + local.get $0 + i32.const 16 + i32.add + local.set $1 + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $1 + call $~lib/rt/tlsf/allocateBlock + local.tee $1 + i32.const 1 + i32.store offset=12 + local.get $1 + local.get $0 + i32.store offset=16 + local.get $1 + global.get $~lib/rt/itcms/fromSpace + global.get $~lib/rt/itcms/white + call $~lib/rt/itcms/Object#linkTo + global.get $~lib/rt/itcms/total + local.get $1 + i32.load + i32.const -4 + i32.and + i32.const 4 + i32.add + i32.add + global.set $~lib/rt/itcms/total + local.get $1 + i32.const 20 + i32.add + local.tee $1 + local.get $0 + call $~lib/memory/memory.fill + local.get $1 + ) + (func $~lib/memory/memory.copy (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + block $~lib/util/memory/memmove|inlined.0 + local.get $2 + local.set $4 + local.get $0 + local.get $1 + i32.eq + br_if $~lib/util/memory/memmove|inlined.0 + local.get $0 + local.get $1 + i32.lt_u + if + local.get $1 + i32.const 7 + i32.and + local.get $0 + i32.const 7 + i32.and + i32.eq + if + loop $while-continue|0 + local.get $0 + i32.const 7 + i32.and + if + local.get $4 + i32.eqz + br_if $~lib/util/memory/memmove|inlined.0 + local.get $4 + i32.const 1 + i32.sub + local.set $4 + local.get $0 + local.tee $2 + i32.const 1 + i32.add + local.set $0 + local.get $1 + local.tee $3 + i32.const 1 + i32.add + local.set $1 + local.get $2 + local.get $3 + i32.load8_u + i32.store8 + br $while-continue|0 + end + end + loop $while-continue|1 + local.get $4 + i32.const 8 + i32.ge_u + if + local.get $0 + local.get $1 + i64.load + i64.store + local.get $4 + i32.const 8 + i32.sub + local.set $4 + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + br $while-continue|1 + end + end + end + loop $while-continue|2 + local.get $4 + if + local.get $0 + local.tee $2 + i32.const 1 + i32.add + local.set $0 + local.get $1 + local.tee $3 + i32.const 1 + i32.add + local.set $1 + local.get $2 + local.get $3 + i32.load8_u + i32.store8 + local.get $4 + i32.const 1 + i32.sub + local.set $4 + br $while-continue|2 + end + end + else + local.get $1 + i32.const 7 + i32.and + local.get $0 + i32.const 7 + i32.and + i32.eq + if + loop $while-continue|3 + local.get $0 + local.get $4 + i32.add + i32.const 7 + i32.and + if + local.get $4 + i32.eqz + br_if $~lib/util/memory/memmove|inlined.0 + local.get $4 + i32.const 1 + i32.sub + local.tee $4 + local.get $0 + i32.add + local.get $1 + local.get $4 + i32.add + i32.load8_u + i32.store8 + br $while-continue|3 + end + end + loop $while-continue|4 + local.get $4 + i32.const 8 + i32.ge_u + if + local.get $4 + i32.const 8 + i32.sub + local.tee $4 + local.get $0 + i32.add + local.get $1 + local.get $4 + i32.add + i64.load + i64.store + br $while-continue|4 + end + end + end + loop $while-continue|5 + local.get $4 + if + local.get $4 + i32.const 1 + i32.sub + local.tee $4 + local.get $0 + i32.add + local.get $1 + local.get $4 + i32.add + i32.load8_u + i32.store8 + br $while-continue|5 + end + end + end + end + ) + (func $~lib/rt/__visit_members (param $0 i32) + (local $1 i32) + (local $2 i32) + block $invalid + 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> $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 + unreachable + ) + (func $~start + call $start:templateliteral + ) + (func $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 1860 + i32.lt_s + if + i32.const 18272 + i32.const 18320 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (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 + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.const 1504 + local.get $0 + select + local.tee $2 + i32.store + 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 + block $__inlined_func$~lib/string/String#concat + local.get $1 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 1504 + i32.store + i32.const 1504 + local.set $1 + end + 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 + local.get $2 + 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 $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 1472 + local.set $0 + br $__inlined_func$~lib/string/String#concat + end + global.get $~lib/memory/__stack_pointer + local.get $0 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store offset=4 + local.get $0 + local.get $2 + local.get $3 + call $~lib/memory/memory.copy + local.get $0 + local.get $3 + i32.add + local.get $1 + local.get $4 + call $~lib/memory/memory.copy + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $~lib/util/string/joinReferenceArray<~lib/string/String> (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + global.get $~lib/memory/__stack_pointer + 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 + local.get $0 + i32.const 1 + i32.sub + local.tee $1 + i32.const 0 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 1472 + return + end + local.get $1 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 1216 + i32.load + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + i32.const 1472 + local.get $0 + select + return + end + i32.const 1472 + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 1472 + i32.store offset=4 + i32.const 1468 + i32.load + i32.const 1 + i32.shr_u + local.set $4 + loop $for-loop|0 + local.get $1 + local.get $2 + i32.gt_s + if + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.const 2 + i32.shl + i32.const 1216 + i32.add + i32.load + local.tee $3 + i32.store + local.get $3 + if + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $0 + local.get $3 + call $~lib/string/String.__concat + local.tee $0 + i32.store offset=4 + end + local.get $4 + if + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.const 1472 + call $~lib/string/String.__concat + local.tee $0 + i32.store offset=4 + end + local.get $2 + i32.const 1 + i32.add + local.set $2 + br $for-loop|0 + end + end + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.const 2 + i32.shl + i32.const 1216 + i32.add + i32.load + local.tee $1 + i32.store + local.get $1 + if + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $0 + local.get $1 + call $~lib/string/String.__concat + local.tee $0 + i32.store offset=4 + end + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $start:templateliteral + (local $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=16 + i32.const 1312 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + memory.size + i32.const 16 + i32.shl + i32.const 18244 + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 1584 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 1616 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace + global.get $~lib/memory/__stack_pointer + i32.const 1216 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=12 + 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=8 + global.get $~lib/memory/__stack_pointer + i32.const 1088 + i32.store offset=12 + i32.const 3 + i32.const 1088 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 1216 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 1472 + i32.store offset=16 + i32.const 1212 + i32.load + i32.const 2 + i32.shr_u + call $~lib/util/string/joinReferenceArray<~lib/string/String> + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1728 + i32.store offset=4 + block $__inlined_func$~lib/string/String.__eq (result i32) + i32.const 1 + local.get $4 + i32.const 1728 + i32.eq + br_if $__inlined_func$~lib/string/String.__eq + drop + i32.const 0 + local.get $4 + i32.eqz + br_if $__inlined_func$~lib/string/String.__eq + drop + i32.const 0 + local.get $4 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $1 + i32.const 1724 + i32.load + i32.const 1 + i32.shr_u + i32.ne + br_if $__inlined_func$~lib/string/String.__eq + drop + block $__inlined_func$~lib/util/string/compareImpl (result i32) + i32.const 1728 + local.set $3 + local.get $4 + i32.const 7 + i32.and + i32.eqz + i32.const 0 + local.get $1 + i32.const 4 + i32.ge_u + select + if + loop $do-continue|0 + local.get $4 + i64.load + local.get $3 + i64.load + i64.eq + if + local.get $4 + i32.const 8 + i32.add + local.set $4 + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $1 + i32.const 4 + i32.sub + local.tee $1 + i32.const 4 + i32.ge_u + br_if $do-continue|0 + end + end + end + loop $while-continue|1 + local.get $1 + local.tee $0 + i32.const 1 + i32.sub + local.set $1 + local.get $0 + if + local.get $4 + i32.load16_u + local.tee $2 + local.get $3 + i32.load16_u + local.tee $0 + i32.ne + if + local.get $2 + local.get $0 + i32.sub + br $__inlined_func$~lib/util/string/compareImpl + end + local.get $4 + i32.const 2 + i32.add + local.set $4 + local.get $3 + i32.const 2 + i32.add + local.set $3 + br $while-continue|1 + end + end + i32.const 0 + end + i32.eqz + end + i32.eqz + if + i32.const 0 + i32.const 1776 + i32.const 3 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.add + global.set $~lib/memory/__stack_pointer + ) +) diff --git a/tests/compiler/templateliteral.ts b/tests/compiler/templateliteral.ts new file mode 100644 index 0000000000..04d25c4f87 --- /dev/null +++ b/tests/compiler/templateliteral.ts @@ -0,0 +1,3 @@ +var a = "a"; +var b = "b"; +assert(`(a=${a}, b=${b})` == "(a=a, b=b)"); diff --git a/tests/compiler/templateliteral.untouched.wat b/tests/compiler/templateliteral.untouched.wat new file mode 100644 index 0000000000..7d96f07fe0 --- /dev/null +++ b/tests/compiler/templateliteral.untouched.wat @@ -0,0 +1,4322 @@ +(module + (type $i32_i32_=>_none (func (param i32 i32))) + (type $i32_=>_i32 (func (param i32) (result i32))) + (type $i32_=>_none (func (param i32))) + (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) + (type $none_=>_none (func)) + (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + (type $i32_i32_i32_=>_i32 (func (param 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))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (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\06\00\00\00(\00a\00=\00\00\00\00\00\00\00") + (data (i32.const 108) "\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 140) "\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 172) ",\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\80\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) "\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 460) "<\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 528) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 560) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 588) "<\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 652) ",\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 700) "<\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 768) "\04\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") + (table $0 1 funcref) + (global $templateliteral/a (mut i32) (i32.const 32)) + (global $templateliteral/b (mut i32) (i32.const 64)) + (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)) + (global $~lib/rt/itcms/pinSpace (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)) + (global $~lib/rt/__rtti_base i32 (i32.const 768)) + (global $~lib/memory/__data_end i32 (i32.const 804)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17188)) + (global $~lib/memory/__heap_base i32 (i32.const 17188)) + (export "memory" (memory $0)) + (start $~start) + (func $~lib/rt/itcms/Object#get:color (param $0 i32) (result i32) + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + ) + (func $~lib/rt/itcms/Object#get:next (param $0 i32) (result i32) + local.get $0 + i32.load offset=4 + i32.const 3 + i32.const -1 + i32.xor + i32.and + ) + (func $~lib/rt/itcms/Object#set:prev (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store offset=8 + ) + (func $~lib/rt/itcms/Object#set:nextWithColor (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store offset=4 + ) + (func $~lib/rt/itcms/Object#set:next (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + ) + (func $~lib/rt/itcms/Object#unlink (param $0 i32) + (local $1 i32) + (local $2 i32) + local.get $0 + call $~lib/rt/itcms/Object#get:next + local.set $1 + local.get $1 + i32.const 0 + i32.eq + if + i32.const 1 + drop + local.get $0 + i32.load offset=8 + i32.const 0 + i32.eq + if (result i32) + local.get $0 + global.get $~lib/memory/__heap_base + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 240 + i32.const 127 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + return + end + local.get $0 + i32.load offset=8 + local.set $2 + i32.const 1 + drop + local.get $2 + i32.eqz + if + i32.const 0 + i32.const 240 + i32.const 131 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $1 + local.get $2 + call $~lib/rt/itcms/Object#set:prev + local.get $2 + local.get $1 + call $~lib/rt/itcms/Object#set:next + ) + (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) + local.get $0 + local.get $0 + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $0 + local.get $0 + call $~lib/rt/itcms/Object#set:prev + local.get $0 + ) + (func $~lib/rt/__typeinfo (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/rt/__rtti_base + local.set $1 + local.get $0 + local.get $1 + i32.load + i32.gt_u + if + i32.const 336 + i32.const 400 + i32.const 22 + i32.const 28 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 4 + i32.add + local.get $0 + i32.const 8 + i32.mul + i32.add + i32.load + ) + (func $~lib/rt/itcms/Object#get:isPointerfree (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.load offset=12 + local.set $1 + local.get $1 + i32.const 1 + i32.le_u + if (result i32) + i32.const 1 + else + local.get $1 + call $~lib/rt/__typeinfo + i32.const 32 + i32.and + i32.const 0 + i32.ne + end + ) + (func $~lib/rt/itcms/Object#linkTo (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + local.get $1 + i32.load offset=8 + local.set $3 + local.get $0 + local.get $1 + local.get $2 + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $0 + local.get $3 + call $~lib/rt/itcms/Object#set:prev + local.get $3 + local.get $0 + call $~lib/rt/itcms/Object#set:next + local.get $1 + local.get $0 + call $~lib/rt/itcms/Object#set:prev + ) + (func $~lib/rt/itcms/Object#makeGray (param $0 i32) + (local $1 i32) + local.get $0 + global.get $~lib/rt/itcms/iter + i32.eq + if + local.get $0 + i32.load offset=8 + local.tee $1 + i32.eqz + if (result i32) + i32.const 0 + i32.const 240 + i32.const 147 + i32.const 30 + call $~lib/builtins/abort + unreachable + else + local.get $1 + end + global.set $~lib/rt/itcms/iter + end + local.get $0 + call $~lib/rt/itcms/Object#unlink + local.get $0 + global.get $~lib/rt/itcms/toSpace + local.get $0 + call $~lib/rt/itcms/Object#get:isPointerfree + if (result i32) + global.get $~lib/rt/itcms/white + i32.eqz + else + i32.const 2 + end + call $~lib/rt/itcms/Object#linkTo + ) + (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 240 + 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/string/String#get:length (param $0 i32) (result i32) + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + ) + (func $~lib/rt/itcms/visitRoots (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + call $~lib/rt/__visit_globals + global.get $~lib/rt/itcms/pinSpace + local.set $1 + local.get $1 + call $~lib/rt/itcms/Object#get:next + local.set $2 + loop $while-continue|0 + local.get $2 + local.get $1 + i32.ne + local.set $3 + local.get $3 + if + i32.const 1 + drop + local.get $2 + call $~lib/rt/itcms/Object#get:color + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 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 + i32.eqz + if + return + end + local.get $0 + i32.const 20 + i32.sub + local.set $2 + i32.const 0 + drop + local.get $2 + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eq + if + local.get $2 + call $~lib/rt/itcms/Object#makeGray + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.add + global.set $~lib/rt/itcms/visitCount + end + ) + (func $~lib/rt/itcms/visitStack (param $0 i32) + (local $1 i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + local.set $1 + loop $while-continue|0 + local.get $1 + global.get $~lib/memory/__heap_base + i32.lt_u + local.set $2 + local.get $2 + if + local.get $1 + i32.load + local.get $0 + call $~lib/rt/itcms/__visit + local.get $1 + i32.const 4 + i32.add + local.set $1 + br $while-continue|0 + end + end + ) + (func $~lib/rt/itcms/Object#get:size (param $0 i32) (result i32) + i32.const 4 + local.get $0 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + ) + (func $~lib/rt/tlsf/Root#set:flMap (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store + ) + (func $~lib/rt/common/BLOCK#set:mmInfo (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store + ) + (func $~lib/rt/tlsf/Block#set:prev (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store offset=4 + ) + (func $~lib/rt/tlsf/Block#set:next (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store offset=8 + ) + (func $~lib/rt/tlsf/removeBlock (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + local.get $1 + i32.load + local.set $2 + i32.const 1 + drop + local.get $2 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 273 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $2 + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.set $3 + i32.const 1 + drop + local.get $3 + i32.const 12 + i32.ge_u + if (result i32) + local.get $3 + i32.const 1073741820 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 275 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $4 + local.get $3 + i32.const 4 + i32.shr_u + local.set $5 + else + i32.const 31 + local.get $3 + i32.clz + i32.sub + local.set $4 + local.get $3 + local.get $4 + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $5 + local.get $4 + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $4 + end + i32.const 1 + drop + local.get $4 + i32.const 23 + i32.lt_u + if (result i32) + local.get $5 + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 288 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load offset=4 + local.set $6 + local.get $1 + i32.load offset=8 + local.set $7 + local.get $6 + if + local.get $6 + local.get $7 + call $~lib/rt/tlsf/Block#set:next + end + local.get $7 + if + local.get $7 + local.get $6 + call $~lib/rt/tlsf/Block#set:prev + end + local.get $1 + local.get $0 + local.set $10 + local.get $4 + local.set $9 + local.get $5 + local.set $8 + local.get $10 + local.get $9 + i32.const 4 + i32.shl + local.get $8 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + i32.eq + if + local.get $0 + local.set $11 + local.get $4 + local.set $10 + local.get $5 + local.set $9 + local.get $7 + local.set $8 + local.get $11 + local.get $10 + i32.const 4 + i32.shl + local.get $9 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $8 + i32.store offset=96 + local.get $7 + i32.eqz + if + local.get $0 + local.set $9 + local.get $4 + local.set $8 + local.get $9 + local.get $8 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + local.set $9 + local.get $0 + local.set $8 + local.get $4 + local.set $11 + local.get $9 + i32.const 1 + local.get $5 + i32.shl + i32.const -1 + i32.xor + i32.and + local.tee $9 + local.set $10 + local.get $8 + local.get $11 + i32.const 2 + i32.shl + i32.add + local.get $10 + i32.store offset=4 + local.get $9 + i32.eqz + if + local.get $0 + local.get $0 + i32.load + i32.const 1 + local.get $4 + i32.shl + i32.const -1 + i32.xor + i32.and + call $~lib/rt/tlsf/Root#set:flMap + end + end + end + ) + (func $~lib/rt/tlsf/insertBlock (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + (local $13 i32) + i32.const 1 + drop + local.get $1 + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 201 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load + local.set $2 + i32.const 1 + drop + local.get $2 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 203 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + local.set $3 + local.get $3 + i32.const 4 + i32.add + local.get $3 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.set $4 + local.get $4 + i32.load + local.set $5 + local.get $5 + i32.const 1 + i32.and + if + local.get $2 + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.add + local.get $5 + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.set $3 + local.get $3 + i32.const 1073741820 + i32.lt_u + if + local.get $0 + local.get $4 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $2 + i32.const 3 + i32.and + local.get $3 + i32.or + local.tee $2 + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $1 + local.set $6 + local.get $6 + i32.const 4 + i32.add + local.get $6 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.set $4 + local.get $4 + i32.load + local.set $5 + end + end + local.get $2 + i32.const 2 + i32.and + if + local.get $1 + local.set $6 + local.get $6 + i32.const 4 + i32.sub + i32.load + local.set $6 + local.get $6 + i32.load + local.set $3 + i32.const 1 + drop + local.get $3 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 224 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.add + local.get $2 + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.set $7 + local.get $7 + i32.const 1073741820 + i32.lt_u + if + local.get $0 + local.get $6 + call $~lib/rt/tlsf/removeBlock + local.get $6 + local.get $3 + i32.const 3 + i32.and + local.get $7 + i32.or + local.tee $2 + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $6 + local.set $1 + end + end + local.get $4 + local.get $5 + i32.const 2 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $2 + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.set $8 + i32.const 1 + drop + local.get $8 + i32.const 12 + i32.ge_u + if (result i32) + local.get $8 + i32.const 1073741820 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 239 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + drop + local.get $1 + i32.const 4 + i32.add + local.get $8 + i32.add + local.get $4 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 240 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 4 + i32.sub + local.get $1 + i32.store + local.get $8 + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $9 + local.get $8 + i32.const 4 + i32.shr_u + local.set $10 + else + i32.const 31 + local.get $8 + i32.clz + i32.sub + local.set $9 + local.get $8 + local.get $9 + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $10 + local.get $9 + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $9 + end + i32.const 1 + drop + local.get $9 + i32.const 23 + i32.lt_u + if (result i32) + local.get $10 + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 256 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.set $7 + local.get $9 + local.set $3 + local.get $10 + local.set $6 + local.get $7 + local.get $3 + i32.const 4 + i32.shl + local.get $6 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $11 + local.get $1 + i32.const 0 + call $~lib/rt/tlsf/Block#set:prev + local.get $1 + local.get $11 + call $~lib/rt/tlsf/Block#set:next + local.get $11 + if + local.get $11 + local.get $1 + call $~lib/rt/tlsf/Block#set:prev + end + local.get $0 + local.set $12 + local.get $9 + local.set $7 + local.get $10 + local.set $3 + local.get $1 + local.set $6 + local.get $12 + local.get $7 + i32.const 4 + i32.shl + local.get $3 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $6 + i32.store offset=96 + local.get $0 + local.get $0 + i32.load + i32.const 1 + local.get $9 + i32.shl + i32.or + call $~lib/rt/tlsf/Root#set:flMap + local.get $0 + local.set $13 + local.get $9 + local.set $12 + local.get $0 + local.set $3 + local.get $9 + local.set $6 + local.get $3 + local.get $6 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + i32.const 1 + local.get $10 + i32.shl + i32.or + local.set $7 + local.get $13 + local.get $12 + i32.const 2 + i32.shl + i32.add + local.get $7 + i32.store offset=4 + ) + (func $~lib/rt/tlsf/addMemory (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + i32.const 1 + drop + local.get $1 + local.get $2 + i32.le_u + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 381 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 4 + i32.add + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.sub + local.set $1 + local.get $2 + i32.const 15 + i32.const -1 + i32.xor + i32.and + local.set $2 + local.get $0 + local.set $3 + local.get $3 + i32.load offset=1568 + local.set $4 + i32.const 0 + local.set $5 + local.get $4 + if + i32.const 1 + drop + local.get $1 + local.get $4 + i32.const 4 + i32.add + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 388 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 16 + i32.sub + local.get $4 + i32.eq + if + local.get $1 + i32.const 16 + i32.sub + local.set $1 + local.get $4 + i32.load + local.set $5 + else + nop + end + else + i32.const 1 + drop + local.get $1 + local.get $0 + i32.const 1572 + i32.add + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 401 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + end + local.get $2 + local.get $1 + i32.sub + local.set $6 + local.get $6 + i32.const 4 + i32.const 12 + i32.add + i32.const 4 + i32.add + i32.lt_u + if + i32.const 0 + return + end + local.get $6 + i32.const 2 + i32.const 4 + i32.mul + i32.sub + local.set $7 + local.get $1 + local.set $8 + local.get $8 + local.get $7 + i32.const 1 + i32.or + local.get $5 + i32.const 2 + i32.and + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $8 + i32.const 0 + call $~lib/rt/tlsf/Block#set:prev + local.get $8 + i32.const 0 + call $~lib/rt/tlsf/Block#set:next + local.get $1 + i32.const 4 + i32.add + local.get $7 + i32.add + local.set $4 + local.get $4 + i32.const 0 + i32.const 2 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $0 + local.set $9 + local.get $4 + local.set $3 + local.get $9 + local.get $3 + i32.store offset=1568 + local.get $0 + local.get $8 + call $~lib/rt/tlsf/insertBlock + i32.const 1 + ) + (func $~lib/rt/tlsf/initialize + (local $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + i32.const 0 + drop + global.get $~lib/memory/__heap_base + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + local.set $0 + memory.size + local.set $1 + local.get $0 + i32.const 1572 + i32.add + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $2 + local.get $2 + local.get $1 + i32.gt_s + if (result i32) + local.get $2 + local.get $1 + i32.sub + memory.grow + i32.const 0 + i32.lt_s + else + i32.const 0 + end + if + unreachable + end + local.get $0 + local.set $3 + local.get $3 + i32.const 0 + call $~lib/rt/tlsf/Root#set:flMap + local.get $3 + local.set $5 + i32.const 0 + local.set $4 + local.get $5 + local.get $4 + i32.store offset=1568 + i32.const 0 + local.set $5 + loop $for-loop|0 + local.get $5 + i32.const 23 + i32.lt_u + local.set $4 + local.get $4 + if + local.get $3 + local.set $8 + local.get $5 + local.set $7 + i32.const 0 + local.set $6 + local.get $8 + local.get $7 + i32.const 2 + i32.shl + i32.add + local.get $6 + i32.store offset=4 + i32.const 0 + local.set $8 + loop $for-loop|1 + local.get $8 + i32.const 16 + i32.lt_u + local.set $7 + local.get $7 + if + local.get $3 + local.set $11 + local.get $5 + local.set $10 + local.get $8 + local.set $9 + i32.const 0 + local.set $6 + local.get $11 + local.get $10 + i32.const 4 + i32.shl + local.get $9 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $6 + i32.store offset=96 + local.get $8 + i32.const 1 + i32.add + local.set $8 + br $for-loop|1 + end + end + local.get $5 + i32.const 1 + i32.add + local.set $5 + br $for-loop|0 + end + end + local.get $0 + i32.const 1572 + i32.add + local.set $12 + i32.const 0 + drop + local.get $3 + local.get $12 + memory.size + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + drop + local.get $3 + global.set $~lib/rt/tlsf/ROOT + ) + (func $~lib/rt/tlsf/checkUsedBlock (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.const 4 + i32.sub + local.set $1 + local.get $0 + i32.const 0 + i32.ne + if (result i32) + local.get $0 + i32.const 15 + i32.and + i32.eqz + else + i32.const 0 + end + if (result i32) + local.get $1 + i32.load + i32.const 1 + i32.and + i32.eqz + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 565 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $1 + ) + (func $~lib/rt/tlsf/freeBlock (param $0 i32) (param $1 i32) + i32.const 0 + drop + local.get $1 + local.get $1 + i32.load + i32.const 1 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $0 + local.get $1 + call $~lib/rt/tlsf/insertBlock + ) + (func $~lib/rt/tlsf/__free (param $0 i32) + local.get $0 + global.get $~lib/memory/__heap_base + i32.lt_u + if + return + end + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $0 + call $~lib/rt/tlsf/checkUsedBlock + call $~lib/rt/tlsf/freeBlock + ) + (func $~lib/rt/itcms/free (param $0 i32) + local.get $0 + global.get $~lib/memory/__heap_base + i32.lt_u + if + local.get $0 + i32.const 0 + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $0 + i32.const 0 + call $~lib/rt/itcms/Object#set:prev + else + global.get $~lib/rt/itcms/total + local.get $0 + call $~lib/rt/itcms/Object#get:size + i32.sub + global.set $~lib/rt/itcms/total + i32.const 0 + drop + local.get $0 + i32.const 4 + i32.add + call $~lib/rt/tlsf/__free + end + ) + (func $~lib/rt/itcms/step (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + block $break|0 + block $case2|0 + block $case1|0 + block $case0|0 + global.get $~lib/rt/itcms/state + local.set $1 + local.get $1 + i32.const 0 + i32.eq + br_if $case0|0 + local.get $1 + i32.const 1 + i32.eq + br_if $case1|0 + local.get $1 + i32.const 2 + i32.eq + br_if $case2|0 + br $break|0 + end + i32.const 1 + global.set $~lib/rt/itcms/state + i32.const 0 + global.set $~lib/rt/itcms/visitCount + i32.const 0 + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + global.get $~lib/rt/itcms/white + i32.eqz + local.set $1 + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $0 + loop $while-continue|1 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + local.set $2 + local.get $2 + if + local.get $0 + global.set $~lib/rt/itcms/iter + local.get $0 + call $~lib/rt/itcms/Object#get:color + local.get $1 + i32.ne + if + local.get $0 + local.get $1 + call $~lib/rt/itcms/Object#set:color + i32.const 0 + global.set $~lib/rt/itcms/visitCount + local.get $0 + i32.const 20 + i32.add + i32.const 0 + call $~lib/rt/__visit_members + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + local.get $0 + call $~lib/rt/itcms/Object#get:next + local.set $0 + br $while-continue|1 + end + end + i32.const 0 + global.set $~lib/rt/itcms/visitCount + i32.const 0 + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $0 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.eq + if + i32.const 0 + call $~lib/rt/itcms/visitStack + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $0 + loop $while-continue|2 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + local.set $2 + local.get $2 + if + local.get $0 + call $~lib/rt/itcms/Object#get:color + local.get $1 + i32.ne + if + local.get $0 + local.get $1 + call $~lib/rt/itcms/Object#set:color + local.get $0 + i32.const 20 + i32.add + i32.const 0 + call $~lib/rt/__visit_members + end + local.get $0 + call $~lib/rt/itcms/Object#get:next + local.set $0 + br $while-continue|2 + end + end + global.get $~lib/rt/itcms/fromSpace + local.set $2 + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/fromSpace + local.get $2 + global.set $~lib/rt/itcms/toSpace + local.get $1 + global.set $~lib/rt/itcms/white + local.get $2 + call $~lib/rt/itcms/Object#get:next + global.set $~lib/rt/itcms/iter + i32.const 2 + global.set $~lib/rt/itcms/state + end + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + global.get $~lib/rt/itcms/iter + local.set $0 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $0 + call $~lib/rt/itcms/Object#get:next + global.set $~lib/rt/itcms/iter + i32.const 1 + drop + local.get $0 + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + i32.eqz + if + i32.const 0 + i32.const 240 + i32.const 228 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + local.get $0 + call $~lib/rt/itcms/free + i32.const 10 + return + end + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + call $~lib/rt/itcms/Object#set:nextWithColor + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + call $~lib/rt/itcms/Object#set:prev + i32.const 0 + global.set $~lib/rt/itcms/state + br $break|0 + end + i32.const 0 + ) + (func $~lib/rt/itcms/interrupt + (local $0 i32) + (local $1 i32) + i32.const 0 + drop + i32.const 0 + drop + i32.const 1024 + i32.const 200 + i32.mul + i32.const 100 + i32.div_u + local.set $0 + loop $do-continue|0 + local.get $0 + call $~lib/rt/itcms/step + i32.sub + local.set $0 + global.get $~lib/rt/itcms/state + i32.const 0 + i32.eq + if + i32.const 0 + drop + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i64.const 200 + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + return + end + local.get $0 + i32.const 0 + i32.gt_s + local.set $1 + local.get $1 + br_if $do-continue|0 + end + i32.const 0 + drop + global.get $~lib/rt/itcms/total + i32.const 1024 + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.sub + i32.const 1024 + i32.lt_u + i32.mul + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + ) + (func $~lib/rt/tlsf/computeSize (param $0 i32) (result i32) + local.get $0 + i32.const 12 + i32.le_u + if (result i32) + i32.const 12 + else + local.get $0 + i32.const 4 + i32.add + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.sub + end + ) + (func $~lib/rt/tlsf/prepareSize (param $0 i32) (result i32) + local.get $0 + i32.const 1073741820 + i32.ge_u + if + i32.const 480 + i32.const 608 + i32.const 462 + i32.const 30 + call $~lib/builtins/abort + unreachable + end + local.get $0 + call $~lib/rt/tlsf/computeSize + ) + (func $~lib/rt/tlsf/searchBlock (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + local.get $1 + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $2 + local.get $1 + i32.const 4 + i32.shr_u + local.set $3 + else + local.get $1 + i32.const 536870910 + i32.lt_u + if (result i32) + local.get $1 + i32.const 1 + i32.const 27 + local.get $1 + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + else + local.get $1 + end + local.set $4 + i32.const 31 + local.get $4 + i32.clz + i32.sub + local.set $2 + local.get $4 + local.get $2 + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $3 + local.get $2 + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $2 + end + i32.const 1 + drop + local.get $2 + i32.const 23 + i32.lt_u + if (result i32) + local.get $3 + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 334 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.set $5 + local.get $2 + local.set $4 + local.get $5 + local.get $4 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + i32.const 0 + i32.const -1 + i32.xor + local.get $3 + i32.shl + i32.and + local.set $6 + i32.const 0 + local.set $7 + local.get $6 + i32.eqz + if + local.get $0 + i32.load + i32.const 0 + i32.const -1 + i32.xor + local.get $2 + i32.const 1 + i32.add + i32.shl + i32.and + local.set $5 + local.get $5 + i32.eqz + if + i32.const 0 + local.set $7 + else + local.get $5 + i32.ctz + local.set $2 + local.get $0 + local.set $8 + local.get $2 + local.set $4 + local.get $8 + local.get $4 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + local.set $6 + i32.const 1 + drop + local.get $6 + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 347 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.set $9 + local.get $2 + local.set $8 + local.get $6 + i32.ctz + local.set $4 + local.get $9 + local.get $8 + i32.const 4 + i32.shl + local.get $4 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $7 + end + else + local.get $0 + local.set $9 + local.get $2 + local.set $8 + local.get $6 + i32.ctz + local.set $4 + local.get $9 + local.get $8 + i32.const 4 + i32.shl + local.get $4 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $7 + end + local.get $7 + ) + (func $~lib/rt/tlsf/growMemory (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + i32.const 0 + drop + local.get $1 + i32.const 536870910 + i32.lt_u + if + local.get $1 + i32.const 1 + i32.const 27 + local.get $1 + i32.clz + i32.sub + i32.shl + i32.const 1 + i32.sub + i32.add + local.set $1 + end + memory.size + local.set $2 + local.get $1 + i32.const 4 + local.get $2 + i32.const 16 + i32.shl + i32.const 4 + i32.sub + local.get $0 + local.set $3 + local.get $3 + i32.load offset=1568 + i32.ne + i32.shl + i32.add + local.set $1 + local.get $1 + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $4 + local.get $2 + local.tee $3 + local.get $4 + local.tee $5 + local.get $3 + local.get $5 + i32.gt_s + select + local.set $6 + local.get $6 + memory.grow + i32.const 0 + i32.lt_s + if + local.get $4 + memory.grow + i32.const 0 + i32.lt_s + if + unreachable + end + end + memory.size + local.set $7 + local.get $0 + local.get $2 + i32.const 16 + i32.shl + local.get $7 + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + drop + ) + (func $~lib/rt/tlsf/prepareBlock (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $1 + i32.load + local.set $3 + i32.const 1 + drop + local.get $2 + i32.const 4 + i32.add + i32.const 15 + i32.and + i32.eqz + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 361 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $2 + i32.sub + local.set $4 + local.get $4 + i32.const 4 + i32.const 12 + i32.add + i32.ge_u + if + local.get $1 + local.get $2 + local.get $3 + i32.const 2 + i32.and + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $1 + i32.const 4 + i32.add + local.get $2 + i32.add + local.set $5 + local.get $5 + local.get $4 + i32.const 4 + i32.sub + i32.const 1 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $0 + local.get $5 + call $~lib/rt/tlsf/insertBlock + else + local.get $1 + local.get $3 + i32.const 1 + i32.const -1 + i32.xor + i32.and + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $1 + local.set $5 + local.get $5 + i32.const 4 + i32.add + local.get $5 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.get $1 + local.set $5 + local.get $5 + i32.const 4 + i32.add + local.get $5 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + i32.load + i32.const 2 + i32.const -1 + i32.xor + i32.and + call $~lib/rt/common/BLOCK#set:mmInfo + end + ) + (func $~lib/rt/tlsf/allocateBlock (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + local.get $1 + call $~lib/rt/tlsf/prepareSize + local.set $2 + local.get $0 + local.get $2 + call $~lib/rt/tlsf/searchBlock + local.set $3 + local.get $3 + i32.eqz + if + local.get $0 + local.get $2 + call $~lib/rt/tlsf/growMemory + local.get $0 + local.get $2 + call $~lib/rt/tlsf/searchBlock + local.set $3 + i32.const 1 + drop + local.get $3 + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 500 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + end + i32.const 1 + drop + local.get $3 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $2 + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 502 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $3 + call $~lib/rt/tlsf/removeBlock + local.get $0 + local.get $3 + local.get $2 + call $~lib/rt/tlsf/prepareBlock + i32.const 0 + drop + local.get $3 + ) + (func $~lib/rt/tlsf/__alloc (param $0 i32) (result i32) + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $0 + call $~lib/rt/tlsf/allocateBlock + i32.const 4 + i32.add + ) + (func $~lib/rt/itcms/Object#set:rtId (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store offset=12 + ) + (func $~lib/rt/itcms/Object#set:rtSize (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store offset=16 + ) + (func $~lib/memory/memory.fill (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i64) + (local $10 i32) + block $~lib/util/memory/memset|inlined.0 + local.get $0 + local.set $5 + local.get $1 + local.set $4 + local.get $2 + local.set $3 + i32.const 0 + i32.const 1 + i32.gt_s + drop + local.get $3 + i32.eqz + if + br $~lib/util/memory/memset|inlined.0 + end + local.get $5 + local.get $3 + i32.add + i32.const 4 + i32.sub + local.set $6 + local.get $5 + local.get $4 + i32.store8 + local.get $6 + local.get $4 + i32.store8 offset=3 + local.get $3 + i32.const 2 + i32.le_u + if + br $~lib/util/memory/memset|inlined.0 + end + local.get $5 + local.get $4 + i32.store8 offset=1 + local.get $5 + local.get $4 + i32.store8 offset=2 + local.get $6 + local.get $4 + i32.store8 offset=2 + local.get $6 + local.get $4 + i32.store8 offset=1 + local.get $3 + i32.const 6 + i32.le_u + if + br $~lib/util/memory/memset|inlined.0 + end + local.get $5 + local.get $4 + i32.store8 offset=3 + local.get $6 + local.get $4 + i32.store8 + local.get $3 + i32.const 8 + i32.le_u + if + br $~lib/util/memory/memset|inlined.0 + end + i32.const 0 + local.get $5 + i32.sub + i32.const 3 + i32.and + local.set $7 + local.get $5 + local.get $7 + i32.add + local.set $5 + local.get $3 + local.get $7 + i32.sub + local.set $3 + local.get $3 + i32.const -4 + i32.and + local.set $3 + i32.const -1 + i32.const 255 + i32.div_u + local.get $4 + i32.const 255 + i32.and + i32.mul + local.set $8 + local.get $5 + local.get $3 + i32.add + i32.const 28 + i32.sub + local.set $6 + local.get $5 + local.get $8 + i32.store + local.get $6 + local.get $8 + i32.store offset=24 + local.get $3 + i32.const 8 + i32.le_u + if + br $~lib/util/memory/memset|inlined.0 + end + local.get $5 + local.get $8 + i32.store offset=4 + local.get $5 + local.get $8 + i32.store offset=8 + local.get $6 + local.get $8 + i32.store offset=16 + local.get $6 + local.get $8 + i32.store offset=20 + local.get $3 + i32.const 24 + i32.le_u + if + br $~lib/util/memory/memset|inlined.0 + end + local.get $5 + local.get $8 + i32.store offset=12 + local.get $5 + local.get $8 + i32.store offset=16 + local.get $5 + local.get $8 + i32.store offset=20 + local.get $5 + local.get $8 + i32.store offset=24 + local.get $6 + local.get $8 + i32.store + local.get $6 + local.get $8 + i32.store offset=4 + local.get $6 + local.get $8 + i32.store offset=8 + local.get $6 + local.get $8 + i32.store offset=12 + i32.const 24 + local.get $5 + i32.const 4 + i32.and + i32.add + local.set $7 + local.get $5 + local.get $7 + i32.add + local.set $5 + local.get $3 + local.get $7 + i32.sub + local.set $3 + local.get $8 + i64.extend_i32_u + local.get $8 + i64.extend_i32_u + i64.const 32 + i64.shl + i64.or + local.set $9 + loop $while-continue|0 + local.get $3 + i32.const 32 + i32.ge_u + local.set $10 + local.get $10 + if + local.get $5 + local.get $9 + i64.store + local.get $5 + local.get $9 + i64.store offset=8 + local.get $5 + local.get $9 + i64.store offset=16 + local.get $5 + local.get $9 + i64.store offset=24 + local.get $3 + i32.const 32 + i32.sub + local.set $3 + local.get $5 + i32.const 32 + i32.add + local.set $5 + br $while-continue|0 + end + end + end + ) + (func $~lib/rt/itcms/__new (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + local.get $0 + i32.const 1073741804 + i32.ge_u + if + i32.const 480 + i32.const 240 + i32.const 260 + i32.const 31 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.ge_u + if + call $~lib/rt/itcms/interrupt + end + i32.const 16 + local.get $0 + i32.add + call $~lib/rt/tlsf/__alloc + i32.const 4 + i32.sub + local.set $2 + local.get $2 + local.get $1 + call $~lib/rt/itcms/Object#set:rtId + local.get $2 + local.get $0 + call $~lib/rt/itcms/Object#set:rtSize + local.get $2 + global.get $~lib/rt/itcms/fromSpace + global.get $~lib/rt/itcms/white + call $~lib/rt/itcms/Object#linkTo + global.get $~lib/rt/itcms/total + local.get $2 + call $~lib/rt/itcms/Object#get:size + i32.add + global.set $~lib/rt/itcms/total + local.get $2 + i32.const 20 + i32.add + local.set $3 + local.get $3 + i32.const 0 + local.get $0 + call $~lib/memory/memory.fill + local.get $3 + ) + (func $~lib/util/memory/memcpy (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + loop $while-continue|0 + local.get $2 + if (result i32) + local.get $1 + i32.const 3 + i32.and + else + i32.const 0 + end + local.set $5 + local.get $5 + if + local.get $0 + local.tee $6 + i32.const 1 + i32.add + local.set $0 + local.get $6 + local.get $1 + local.tee $6 + i32.const 1 + i32.add + local.set $1 + local.get $6 + i32.load8_u + i32.store8 + local.get $2 + i32.const 1 + i32.sub + local.set $2 + br $while-continue|0 + end + end + local.get $0 + i32.const 3 + i32.and + i32.const 0 + i32.eq + if + loop $while-continue|1 + local.get $2 + i32.const 16 + i32.ge_u + local.set $5 + local.get $5 + if + local.get $0 + local.get $1 + i32.load + i32.store + local.get $0 + i32.const 4 + i32.add + local.get $1 + i32.const 4 + i32.add + i32.load + i32.store + local.get $0 + i32.const 8 + i32.add + local.get $1 + i32.const 8 + i32.add + i32.load + i32.store + local.get $0 + i32.const 12 + i32.add + local.get $1 + i32.const 12 + i32.add + i32.load + i32.store + local.get $1 + i32.const 16 + i32.add + local.set $1 + local.get $0 + i32.const 16 + i32.add + local.set $0 + local.get $2 + i32.const 16 + i32.sub + local.set $2 + br $while-continue|1 + end + end + local.get $2 + i32.const 8 + i32.and + if + local.get $0 + local.get $1 + i32.load + i32.store + local.get $0 + i32.const 4 + i32.add + local.get $1 + i32.const 4 + i32.add + i32.load + i32.store + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + end + local.get $2 + i32.const 4 + i32.and + if + local.get $0 + local.get $1 + i32.load + i32.store + local.get $0 + i32.const 4 + i32.add + local.set $0 + local.get $1 + i32.const 4 + i32.add + local.set $1 + end + local.get $2 + i32.const 2 + i32.and + if + local.get $0 + local.get $1 + i32.load16_u + i32.store16 + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $1 + i32.const 2 + i32.add + local.set $1 + end + local.get $2 + i32.const 1 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + return + end + local.get $2 + i32.const 32 + i32.ge_u + if + block $break|2 + block $case2|2 + block $case1|2 + block $case0|2 + local.get $0 + i32.const 3 + i32.and + local.set $5 + local.get $5 + i32.const 1 + i32.eq + br_if $case0|2 + local.get $5 + i32.const 2 + i32.eq + br_if $case1|2 + local.get $5 + i32.const 3 + i32.eq + br_if $case2|2 + br $break|2 + end + local.get $1 + i32.load + local.set $3 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $2 + i32.const 3 + i32.sub + local.set $2 + loop $while-continue|3 + local.get $2 + i32.const 17 + i32.ge_u + local.set $5 + local.get $5 + if + local.get $1 + i32.const 1 + i32.add + i32.load + local.set $4 + local.get $0 + local.get $3 + i32.const 24 + i32.shr_u + local.get $4 + i32.const 8 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 5 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 4 + i32.add + local.get $4 + i32.const 24 + i32.shr_u + local.get $3 + i32.const 8 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 9 + i32.add + i32.load + local.set $4 + local.get $0 + i32.const 8 + i32.add + local.get $3 + i32.const 24 + i32.shr_u + local.get $4 + i32.const 8 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 13 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 12 + i32.add + local.get $4 + i32.const 24 + i32.shr_u + local.get $3 + i32.const 8 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 16 + i32.add + local.set $1 + local.get $0 + i32.const 16 + i32.add + local.set $0 + local.get $2 + i32.const 16 + i32.sub + local.set $2 + br $while-continue|3 + end + end + br $break|2 + end + local.get $1 + i32.load + local.set $3 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $2 + i32.const 2 + i32.sub + local.set $2 + loop $while-continue|4 + local.get $2 + i32.const 18 + i32.ge_u + local.set $5 + local.get $5 + if + local.get $1 + i32.const 2 + i32.add + i32.load + local.set $4 + local.get $0 + local.get $3 + i32.const 16 + i32.shr_u + local.get $4 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 6 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 4 + i32.add + local.get $4 + i32.const 16 + i32.shr_u + local.get $3 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 10 + i32.add + i32.load + local.set $4 + local.get $0 + i32.const 8 + i32.add + local.get $3 + i32.const 16 + i32.shr_u + local.get $4 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 14 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 12 + i32.add + local.get $4 + i32.const 16 + i32.shr_u + local.get $3 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 16 + i32.add + local.set $1 + local.get $0 + i32.const 16 + i32.add + local.set $0 + local.get $2 + i32.const 16 + i32.sub + local.set $2 + br $while-continue|4 + end + end + br $break|2 + end + local.get $1 + i32.load + local.set $3 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $2 + i32.const 1 + i32.sub + local.set $2 + loop $while-continue|5 + local.get $2 + i32.const 19 + i32.ge_u + local.set $5 + local.get $5 + if + local.get $1 + i32.const 3 + i32.add + i32.load + local.set $4 + local.get $0 + local.get $3 + i32.const 8 + i32.shr_u + local.get $4 + i32.const 24 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 7 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 4 + i32.add + local.get $4 + i32.const 8 + i32.shr_u + local.get $3 + i32.const 24 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 11 + i32.add + i32.load + local.set $4 + local.get $0 + i32.const 8 + i32.add + local.get $3 + i32.const 8 + i32.shr_u + local.get $4 + i32.const 24 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 15 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 12 + i32.add + local.get $4 + i32.const 8 + i32.shr_u + local.get $3 + i32.const 24 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 16 + i32.add + local.set $1 + local.get $0 + i32.const 16 + i32.add + local.set $0 + local.get $2 + i32.const 16 + i32.sub + local.set $2 + br $while-continue|5 + end + end + br $break|2 + end + end + local.get $2 + i32.const 16 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + local.get $2 + i32.const 8 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + local.get $2 + i32.const 4 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + local.get $2 + i32.const 2 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + local.get $2 + i32.const 1 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + ) + (func $~lib/memory/memory.copy (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + block $~lib/util/memory/memmove|inlined.0 + local.get $0 + local.set $5 + local.get $1 + local.set $4 + local.get $2 + local.set $3 + local.get $5 + local.get $4 + i32.eq + if + br $~lib/util/memory/memmove|inlined.0 + end + i32.const 0 + i32.const 1 + i32.lt_s + drop + local.get $4 + local.get $5 + i32.sub + local.get $3 + i32.sub + i32.const 0 + local.get $3 + i32.const 1 + i32.shl + i32.sub + i32.le_u + if + local.get $5 + local.get $4 + local.get $3 + call $~lib/util/memory/memcpy + br $~lib/util/memory/memmove|inlined.0 + end + local.get $5 + local.get $4 + i32.lt_u + if + i32.const 0 + i32.const 2 + i32.lt_s + drop + local.get $4 + i32.const 7 + i32.and + local.get $5 + i32.const 7 + i32.and + i32.eq + if + loop $while-continue|0 + local.get $5 + i32.const 7 + i32.and + local.set $6 + local.get $6 + if + local.get $3 + i32.eqz + if + br $~lib/util/memory/memmove|inlined.0 + end + local.get $3 + i32.const 1 + i32.sub + local.set $3 + local.get $5 + local.tee $7 + i32.const 1 + i32.add + local.set $5 + local.get $7 + local.get $4 + local.tee $7 + i32.const 1 + i32.add + local.set $4 + local.get $7 + i32.load8_u + i32.store8 + br $while-continue|0 + end + end + loop $while-continue|1 + local.get $3 + i32.const 8 + i32.ge_u + local.set $6 + local.get $6 + if + local.get $5 + local.get $4 + i64.load + i64.store + local.get $3 + i32.const 8 + i32.sub + local.set $3 + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $4 + i32.const 8 + i32.add + local.set $4 + br $while-continue|1 + end + end + end + loop $while-continue|2 + local.get $3 + local.set $6 + local.get $6 + if + local.get $5 + local.tee $7 + i32.const 1 + i32.add + local.set $5 + local.get $7 + local.get $4 + local.tee $7 + i32.const 1 + i32.add + local.set $4 + local.get $7 + i32.load8_u + i32.store8 + local.get $3 + i32.const 1 + i32.sub + local.set $3 + br $while-continue|2 + end + end + else + i32.const 0 + i32.const 2 + i32.lt_s + drop + local.get $4 + i32.const 7 + i32.and + local.get $5 + i32.const 7 + i32.and + i32.eq + if + loop $while-continue|3 + local.get $5 + local.get $3 + i32.add + i32.const 7 + i32.and + local.set $6 + local.get $6 + if + local.get $3 + i32.eqz + if + br $~lib/util/memory/memmove|inlined.0 + end + local.get $5 + local.get $3 + i32.const 1 + i32.sub + local.tee $3 + i32.add + local.get $4 + local.get $3 + i32.add + i32.load8_u + i32.store8 + br $while-continue|3 + end + end + loop $while-continue|4 + local.get $3 + i32.const 8 + i32.ge_u + local.set $6 + local.get $6 + if + local.get $3 + i32.const 8 + i32.sub + local.set $3 + local.get $5 + local.get $3 + i32.add + local.get $4 + local.get $3 + i32.add + i64.load + i64.store + br $while-continue|4 + end + end + end + loop $while-continue|5 + local.get $3 + local.set $6 + local.get $6 + if + local.get $5 + local.get $3 + i32.const 1 + i32.sub + local.tee $3 + i32.add + local.get $4 + local.get $3 + i32.add + i32.load8_u + i32.store8 + br $while-continue|5 + end + end + end + end + ) + (func $~lib/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 + drop + local.get $0 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#get:length + local.get $1 + call $~lib/util/string/joinStringArray + return + ) + (func $~lib/util/string/compareImpl (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add + local.set $5 + local.get $2 + local.get $3 + i32.const 1 + i32.shl + i32.add + local.set $6 + i32.const 0 + i32.const 2 + i32.lt_s + drop + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $do-break|0 + loop $do-continue|0 + local.get $5 + i64.load + local.get $6 + i64.load + i64.ne + if + br $do-break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 + i32.sub + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + local.set $7 + local.get $7 + br_if $do-continue|0 + end + end + end + loop $while-continue|1 + local.get $4 + local.tee $7 + i32.const 1 + i32.sub + local.set $4 + local.get $7 + local.set $7 + local.get $7 + if + local.get $5 + i32.load16_u + local.set $8 + local.get $6 + i32.load16_u + local.set $9 + local.get $8 + local.get $9 + i32.ne + if + local.get $8 + local.get $9 + i32.sub + return + end + local.get $5 + i32.const 2 + i32.add + local.set $5 + local.get $6 + i32.const 2 + i32.add + local.set $6 + br $while-continue|1 + end + end + i32.const 0 + ) + (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $0 + local.get $1 + i32.eq + if + i32.const 1 + return + end + local.get $0 + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $1 + i32.const 0 + i32.eq + end + if + i32.const 0 + return + end + local.get $0 + call $~lib/string/String#get:length + local.set $2 + local.get $2 + local.get $1 + call $~lib/string/String#get:length + i32.ne + if + i32.const 0 + return + end + local.get $0 + i32.const 0 + local.get $1 + i32.const 0 + local.get $2 + call $~lib/util/string/compareImpl + i32.eqz + ) + (func $~lib/rt/__visit_globals (param $0 i32) + (local $1 i32) + global.get $templateliteral/a + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end + global.get $templateliteral/b + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end + i32.const 336 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 480 + local.get $0 + call $~lib/rt/itcms/__visit + ) + (func $~lib/arraybuffer/ArrayBufferView~visit (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + i32.load + local.tee $2 + if + local.get $2 + local.get $1 + call $~lib/rt/itcms/__visit + end + ) + (func $~lib/staticarray/StaticArray<~lib/string/String>#__visit (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + i32.const 1 + drop + local.get $0 + local.set $2 + local.get $2 + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.add + local.set $3 + loop $while-continue|0 + local.get $2 + local.get $3 + i32.lt_u + local.set $4 + local.get $4 + if + local.get $2 + i32.load + local.set $5 + local.get $5 + if + local.get $5 + local.get $1 + call $~lib/rt/itcms/__visit + end + local.get $2 + i32.const 4 + i32.add + local.set $2 + br $while-continue|0 + end + end + ) + (func $~lib/staticarray/StaticArray<~lib/string/String>~visit (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/staticarray/StaticArray<~lib/string/String>#__visit + ) + (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) + block $invalid + 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> $invalid + end + return + end + return + end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit + return + end + local.get $0 + local.get $1 + call $~lib/staticarray/StaticArray<~lib/string/String>~visit + return + end + unreachable + ) + (func $~start + call $start:templateliteral + ) + (func $~stack_check + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__data_end + i32.lt_s + if + i32.const 17216 + i32.const 17264 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (func $start:templateliteral + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=16 + i32.const 288 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + memory.size + i32.const 16 + i32.shl + global.get $~lib/memory/__heap_base + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 528 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 560 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace + i32.const 192 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + i32.const 1 + global.get $templateliteral/a + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=12 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + i32.const 192 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + i32.const 3 + global.get $templateliteral/b + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=12 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + i32.const 192 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + i32.const 448 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=16 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 672 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 3 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/util/string/joinStringArray (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + global.get $~lib/memory/__stack_pointer + 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 + local.get $1 + i32.const 1 + i32.sub + local.set $3 + local.get $3 + i32.const 0 + i32.lt_s + if + i32.const 448 + local.set $12 + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $12 + return + end + local.get $3 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.load + local.tee $4 + i32.store + local.get $4 + if (result i32) + local.get $4 + else + i32.const 448 + end + local.set $12 + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $12 + return + end + i32.const 0 + local.set $5 + i32.const 0 + local.set $4 + loop $for-loop|0 + local.get $4 + local.get $1 + i32.lt_s + local.set $7 + local.get $7 + if + global.get $~lib/memory/__stack_pointer + local.get $0 + local.get $4 + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $6 + i32.store offset=4 + local.get $6 + i32.const 0 + i32.ne + if + local.get $5 + local.get $6 + call $~lib/string/String#get:length + i32.add + local.set $5 + end + local.get $4 + i32.const 1 + i32.add + local.set $4 + br $for-loop|0 + end + end + i32.const 0 + local.set $8 + local.get $2 + call $~lib/string/String#get:length + local.set $9 + global.get $~lib/memory/__stack_pointer + local.get $5 + local.get $9 + local.get $3 + i32.mul + i32.add + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $10 + i32.store offset=8 + i32.const 0 + local.set $4 + loop $for-loop|1 + local.get $4 + local.get $3 + i32.lt_s + local.set $7 + local.get $7 + if + global.get $~lib/memory/__stack_pointer + local.get $0 + local.get $4 + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $6 + i32.store offset=4 + local.get $6 + i32.const 0 + i32.ne + if + local.get $6 + call $~lib/string/String#get:length + local.set $11 + local.get $10 + local.get $8 + i32.const 1 + i32.shl + i32.add + local.get $6 + local.get $11 + i32.const 1 + i32.shl + call $~lib/memory/memory.copy + local.get $8 + local.get $11 + i32.add + local.set $8 + end + local.get $9 + if + local.get $10 + local.get $8 + i32.const 1 + i32.shl + i32.add + local.get $2 + local.get $9 + i32.const 1 + i32.shl + call $~lib/memory/memory.copy + local.get $8 + local.get $9 + i32.add + local.set $8 + end + local.get $4 + i32.const 1 + i32.add + local.set $4 + br $for-loop|1 + end + end + global.get $~lib/memory/__stack_pointer + local.get $0 + local.get $3 + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $6 + i32.store offset=4 + local.get $6 + i32.const 0 + i32.ne + if + local.get $10 + local.get $8 + i32.const 1 + i32.shl + i32.add + local.get $6 + local.get $6 + call $~lib/string/String#get:length + i32.const 1 + i32.shl + call $~lib/memory/memory.copy + end + local.get $10 + local.set $12 + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $12 + ) +) From ede61f8fa5ba0f42ee0c61e02b6d942adc96b808 Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 11 Mar 2021 04:20:10 +0100 Subject: [PATCH 08/13] implicit toString --- src/compiler.ts | 59 +- src/module.ts | 24 +- tests/compiler/templateliteral.optimized.wat | 2804 ++++++++++--- tests/compiler/templateliteral.ts | 45 +- tests/compiler/templateliteral.untouched.wat | 3675 ++++++++++++++++-- 5 files changed, 5719 insertions(+), 888 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 32285a6658..077c7144a4 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -6463,8 +6463,7 @@ export class Compiler extends DiagnosticEmitter { if (hasRest) { this.error( DiagnosticCode.Not_implemented_0, - reportNode.range, - "Rest parameters" + reportNode.range, "Rest parameters" ); return false; } @@ -8046,13 +8045,15 @@ export class Compiler extends DiagnosticEmitter { let indexedSetInstance = assert(arrayInstance.lookupOverload(OperatorKind.INDEXED_SET, true)); let stmts = new Array(); for (let i = 0, k = numParts - 1; i < k; ++i) { - // TODO: toString - let expr = this.compileExpression(expressions[i], stringType, Constraints.CONV_IMPLICIT); + let expression = expressions[i]; stmts.push( this.makeCallDirect(indexedSetInstance, [ module.usize(offset), module.i32(2 * i + 1), - expr + this.makeToString( + this.compileExpression(expression, stringType), + this.currentType, expression + ) ], expression) ); } @@ -10020,6 +10021,54 @@ export class Compiler extends DiagnosticEmitter { } } + /** Makes a string conversion of the given expression. */ + makeToString(expr: ExpressionRef, type: Type, reportNode: Node): ExpressionRef { + var stringType = this.program.stringInstance.type; + if (type == stringType) { + return expr; + } + var classType = type.getClassOrWrapper(this.program); + if (classType) { + let toStringInstance = classType.getMethod("toString"); + if (toStringInstance) { + let toStringSignature = toStringInstance.signature; + if (!this.checkCallSignature( // reports + toStringSignature, + 0, + true, + reportNode + )) { + this.currentType = stringType; + return this.module.unreachable(); + } + if (!type.isStrictlyAssignableTo(assert(toStringSignature.thisType))) { + this.errorRelated( + DiagnosticCode.The_this_types_of_each_signature_are_incompatible, + reportNode.range, toStringInstance.identifierAndSignatureRange + ); + this.currentType = stringType; + return this.module.unreachable(); + } + let toStringReturnType = toStringSignature.returnType; + if (!toStringReturnType.isStrictlyAssignableTo(stringType)) { + this.errorRelated( + DiagnosticCode.Type_0_is_not_assignable_to_type_1, + reportNode.range, toStringInstance.identifierAndSignatureRange, toStringReturnType.toString(), stringType.toString() + ); + this.currentType = stringType; + return this.module.unreachable(); + } + return this.makeCallDirect(toStringInstance, [ expr ], reportNode); + } + } + this.error( + DiagnosticCode.Type_0_is_not_assignable_to_type_1, + reportNode.range, type.toString(), stringType.toString() + ); + this.currentType = stringType; + return this.module.unreachable(); + } + /** Makes an allocation suitable to hold the data of an instance of the given class. */ makeAllocation( classInstance: Class diff --git a/src/module.ts b/src/module.ts index 1c55be4e4e..b44922c97d 100644 --- a/src/module.ts +++ b/src/module.ts @@ -687,18 +687,18 @@ export class Module { return binaryen._BinaryenConst(this.ref, out); } - isize(value: T): ExpressionRef { - if (i64_is(value)) { - if (this.sizeType == NativeType.I64) { - return this.i64(i64_low(value), i64_high(value)); - } - assert(i64_is_i32(value)); - return this.i32(i64_low(value)); - } - return this.sizeType == NativeType.I64 - ? this.i64(i32(value), i32(value) < 0 ? -1 : 0) - : this.i32(i32(value)); - } + // isize(value: T): ExpressionRef { + // if (i64_is(value)) { + // if (this.sizeType == NativeType.I64) { + // return this.i64(i64_low(value), i64_high(value)); + // } + // assert(i64_is_i32(value)); + // return this.i32(i64_low(value)); + // } + // return this.sizeType == NativeType.I64 + // ? this.i64(i32(value), i32(value) < 0 ? -1 : 0) + // : this.i32(i32(value)); + // } usize(value: T): ExpressionRef { if (i64_is(value)) { diff --git a/tests/compiler/templateliteral.optimized.wat b/tests/compiler/templateliteral.optimized.wat index 93f94d7636..ee12cbc05d 100644 --- a/tests/compiler/templateliteral.optimized.wat +++ b/tests/compiler/templateliteral.optimized.wat @@ -1,12 +1,15 @@ (module - (type $i32_i32_=>_none (func (param i32 i32))) (type $none_=>_none (func)) - (type $i32_=>_none (func (param i32))) - (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + (type $i32_i32_=>_none (func (param i32 i32))) + (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) + (type $i32_=>_none (func (param i32))) + (type $f64_=>_i32 (func (param f64) (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 (func (param i32 i32 i32) (result i32))) + (type $i64_i32_i64_i32_i64_i32_=>_i32 (func (param i64 i32 i64 i32 i64 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) (data (i32.const 1036) "\1c") @@ -14,33 +17,96 @@ (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\00\00\00\06\00\00\00(\00a\00=") + (data (i32.const 1112) "\01") (data (i32.const 1132) "\1c") - (data (i32.const 1144) "\01\00\00\00\08\00\00\00,\00 \00b\00=") - (data (i32.const 1164) "\1c") - (data (i32.const 1176) "\01\00\00\00\02\00\00\00)") - (data (i32.const 1196) ",") - (data (i32.const 1208) "\03\00\00\00\14\00\00\00`\04\00\00\00\00\00\00\80\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) "\1c") - (data (i32.const 1464) "\01") - (data (i32.const 1484) "\1c") - (data (i32.const 1496) "\01\00\00\00\08\00\00\00n\00u\00l\00l") - (data (i32.const 1516) "<") - (data (i32.const 1528) "\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 1644) "<") - (data (i32.const 1656) "\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 1708) ",") - (data (i32.const 1720) "\01\00\00\00\14\00\00\00(\00a\00=\00a\00,\00 \00b\00=\00b\00)") - (data (i32.const 1756) "<") - (data (i32.const 1768) "\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 1824) "\04\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 1852) "\04A") + (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) "\1c") + (data (i32.const 1384) "\01\00\00\00\08\00\00\00n\00u\00l\00l") + (data (i32.const 1404) "<") + (data (i32.const 1416) "\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 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) "<") + (data (i32.const 1608) "\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 1660) ",") + (data (i32.const 1672) "\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 1708) "\1c") + (data (i32.const 1720) "\01\00\00\00\04\00\00\00a\00b") + (data (i32.const 1740) "\1c") + (data (i32.const 1752) "\01\00\00\00\06\00\00\00(\00A\00=") + (data (i32.const 1772) "\1c") + (data (i32.const 1784) "\01\00\00\00\08\00\00\00,\00 \00B\00=") + (data (i32.const 1804) "\1c") + (data (i32.const 1816) "\01\00\00\00\02\00\00\00)") + (data (i32.const 1836) ",") + (data (i32.const 1848) "\03\00\00\00\14\00\00\00\e0\06\00\00\00\00\00\00\00\07\00\00\00\00\00\00 \07") + (data (i32.const 1884) ",") + (data (i32.const 1896) "\01\00\00\00\14\00\00\00(\00A\00=\00a\00,\00 \00B\00=\00b\00)") + (data (i32.const 1932) "\1c") + (data (i32.const 1944) "\03\00\00\00\0c\00\00\00`\04\00\00\00\00\00\00`\04") + (data (i32.const 1964) "|") + (data (i32.const 1976) "\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 2092) "<") + (data (i32.const 2104) "\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 2156) "\1c") + (data (i32.const 2168) "\01\00\00\00\02\00\00\000") + (data (i32.const 2188) "\\") + (data (i32.const 2200) "\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 2284) "\1c") + (data (i32.const 2296) "\01\00\00\00\02\00\00\001") + (data (i32.const 2316) ",") + (data (i32.const 2328) "\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 2364) "\1c") + (data (i32.const 2376) "\01\00\00\00\04\00\00\001\002") + (data (i32.const 2396) ",") + (data (i32.const 2408) "\03\00\00\00\14\00\00\00\e0\06\00\00\00\00\00\00\00\07\00\00\00\00\00\00 \07") + (data (i32.const 2444) ",") + (data (i32.const 2456) "\01\00\00\00\14\00\00\00(\00A\00=\001\00,\00 \00B\00=\002\00)") + (data (i32.const 2492) "\1c") + (data (i32.const 2504) "\03\00\00\00\0c\00\00\00`\04\00\00\00\00\00\00`\04") + (data (i32.const 2524) "\1c") + (data (i32.const 2536) "\01\00\00\00\06\00\00\000\00.\000") + (data (i32.const 2556) "\1c") + (data (i32.const 2568) "\01\00\00\00\06\00\00\00N\00a\00N") + (data (i32.const 2588) ",") + (data (i32.const 2600) "\01\00\00\00\12\00\00\00-\00I\00n\00f\00i\00n\00i\00t\00y") + (data (i32.const 2636) ",") + (data (i32.const 2648) "\01\00\00\00\10\00\00\00I\00n\00f\00i\00n\00i\00t\00y") + (data (i32.const 2744) "\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#__uset (param $0 i32) (param $1 i32) - (local $2 i32) + (func $~lib/staticarray/StaticArray<~lib/string/String>#__uset (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) local.get $0 + local.get $1 i32.const 2 i32.shl - i32.const 1216 i32.add - local.get $1 + local.get $2 i32.store - local.get $1 + local.get $2 if + local.get $0 + i32.eqz + if + i32.const 0 + i32.const 1184 + i32.const 294 + i32.const 14 + call $~lib/builtins/abort + unreachable + end global.get $~lib/rt/itcms/white - local.get $1 + local.get $2 i32.const 20 i32.sub - local.tee $0 + local.tee $1 i32.load offset=4 i32.const 3 i32.and i32.eq if - i32.const 1200 - i32.load + local.get $0 + i32.const 20 + i32.sub + local.tee $0 + i32.load offset=4 i32.const 3 i32.and - local.tee $1 - local.set $2 - local.get $1 + local.tee $2 + local.set $3 + local.get $2 global.get $~lib/rt/itcms/white i32.eqz i32.eq if - i32.const 1196 + 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 + local.get $3 i32.const 3 i32.eq select if - local.get $0 + local.get $1 call $~lib/rt/itcms/Object#makeGray end end @@ -253,13 +338,11 @@ (func $~lib/rt/itcms/visitRoots (local $0 i32) (local $1 i32) - i32.const 1056 - call $~lib/rt/itcms/__visit - i32.const 1088 + i32.const 1280 call $~lib/rt/itcms/__visit - i32.const 1360 + i32.const 1424 call $~lib/rt/itcms/__visit - i32.const 1536 + i32.const 2208 call $~lib/rt/itcms/__visit global.get $~lib/rt/itcms/pinSpace local.tee $1 @@ -280,7 +363,7 @@ i32.ne if i32.const 0 - i32.const 1264 + i32.const 1184 i32.const 159 i32.const 16 call $~lib/builtins/abort @@ -346,7 +429,7 @@ i32.eqz if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 273 i32.const 14 call $~lib/builtins/abort @@ -366,7 +449,7 @@ i32.eqz if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 275 i32.const 14 call $~lib/builtins/abort @@ -409,7 +492,7 @@ i32.eqz if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 288 i32.const 14 call $~lib/builtins/abort @@ -501,7 +584,7 @@ i32.eqz if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 201 i32.const 14 call $~lib/builtins/abort @@ -515,7 +598,7 @@ i32.eqz if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 203 i32.const 14 call $~lib/builtins/abort @@ -588,7 +671,7 @@ i32.eqz if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 224 i32.const 16 call $~lib/builtins/abort @@ -643,7 +726,7 @@ i32.eqz if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 239 i32.const 14 call $~lib/builtins/abort @@ -658,7 +741,7 @@ i32.ne if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 240 i32.const 14 call $~lib/builtins/abort @@ -706,7 +789,7 @@ i32.eqz if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 256 i32.const 14 call $~lib/builtins/abort @@ -776,7 +859,7 @@ i32.gt_u if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 381 i32.const 14 call $~lib/builtins/abort @@ -804,7 +887,7 @@ i32.lt_u if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 388 i32.const 16 call $~lib/builtins/abort @@ -832,7 +915,7 @@ i32.lt_u if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 401 i32.const 5 call $~lib/builtins/abort @@ -900,10 +983,10 @@ if unreachable end - i32.const 18256 + i32.const 20608 i32.const 0 i32.store - i32.const 19824 + i32.const 22176 i32.const 0 i32.store loop $for-loop|0 @@ -914,7 +997,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 18256 + i32.const 20608 i32.add i32.const 0 i32.store offset=4 @@ -932,7 +1015,7 @@ i32.add i32.const 2 i32.shl - i32.const 18256 + i32.const 20608 i32.add i32.const 0 i32.store offset=96 @@ -950,13 +1033,13 @@ br $for-loop|0 end end - i32.const 18256 - i32.const 19828 + i32.const 20608 + i32.const 22180 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 18256 + i32.const 20608 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1035,7 +1118,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 18244 + i32.const 20604 i32.lt_u if local.get $0 @@ -1118,14 +1201,14 @@ i32.ne if i32.const 0 - i32.const 1264 + i32.const 1184 i32.const 228 i32.const 20 call $~lib/builtins/abort unreachable end local.get $0 - i32.const 18244 + i32.const 20604 i32.lt_u if local.get $0 @@ -1148,7 +1231,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 18244 + i32.const 20604 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1180,7 +1263,7 @@ i32.eqz if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 565 i32.const 3 call $~lib/builtins/abort @@ -1268,7 +1351,7 @@ i32.eqz if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 334 i32.const 14 call $~lib/builtins/abort @@ -1320,7 +1403,7 @@ i32.eqz if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 347 i32.const 18 call $~lib/builtins/abort @@ -1350,8 +1433,8 @@ i32.const 1073741820 i32.ge_u if - i32.const 1536 - i32.const 1664 + i32.const 1424 + i32.const 1552 i32.const 462 i32.const 30 call $~lib/builtins/abort @@ -1442,7 +1525,7 @@ i32.eqz if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 500 i32.const 16 call $~lib/builtins/abort @@ -1457,7 +1540,7 @@ i32.gt_u if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 502 i32.const 14 call $~lib/builtins/abort @@ -1476,7 +1559,7 @@ i32.and if i32.const 0 - i32.const 1664 + i32.const 1552 i32.const 361 i32.const 14 call $~lib/builtins/abort @@ -1699,14 +1782,14 @@ end end ) - (func $~lib/rt/itcms/__new (param $0 i32) (result i32) - (local $1 i32) + (func $~lib/rt/itcms/__new (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) local.get $0 i32.const 1073741804 i32.ge_u if - i32.const 1536 - i32.const 1264 + i32.const 1424 + i32.const 1184 i32.const 260 i32.const 31 call $~lib/builtins/abort @@ -1718,12 +1801,12 @@ if block $__inlined_func$~lib/rt/itcms/interrupt i32.const 2048 - local.set $1 + local.set $2 loop $do-continue|0 - local.get $1 + local.get $2 call $~lib/rt/itcms/step i32.sub - local.set $1 + local.set $2 global.get $~lib/rt/itcms/state i32.eqz if @@ -1739,7 +1822,7 @@ global.set $~lib/rt/itcms/threshold br $__inlined_func$~lib/rt/itcms/interrupt end - local.get $1 + local.get $2 i32.const 0 i32.gt_s br_if $do-continue|0 @@ -1759,27 +1842,27 @@ local.get $0 i32.const 16 i32.add - local.set $1 + local.set $2 global.get $~lib/rt/tlsf/ROOT i32.eqz if call $~lib/rt/tlsf/initialize end global.get $~lib/rt/tlsf/ROOT - local.get $1 + local.get $2 call $~lib/rt/tlsf/allocateBlock - local.tee $1 - i32.const 1 - i32.store offset=12 + local.tee $2 local.get $1 + i32.store offset=12 + local.get $2 local.get $0 i32.store offset=16 - local.get $1 + local.get $2 global.get $~lib/rt/itcms/fromSpace global.get $~lib/rt/itcms/white call $~lib/rt/itcms/Object#linkTo global.get $~lib/rt/itcms/total - local.get $1 + local.get $2 i32.load i32.const -4 i32.and @@ -1787,7 +1870,7 @@ i32.add i32.add global.set $~lib/rt/itcms/total - local.get $1 + local.get $2 i32.const 20 i32.add local.tee $1 @@ -1968,83 +2051,201 @@ end end ) - (func $~lib/rt/__visit_members (param $0 i32) - (local $1 i32) + (func $~lib/staticarray/StaticArray<~lib/string/String>#join (param $0 i32) (result i32) + local.get $0 + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 2 + i32.shr_u + call $~lib/util/string/joinReferenceArray<~lib/string/String> + ) + (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) (local $2 i32) - block $invalid - 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> $invalid - end - return + (local $3 i32) + (local $4 i32) + local.get $0 + local.get $1 + i32.eq + if + i32.const 1 + return + end + local.get $1 + i32.eqz + i32.const 1 + local.get $0 + select + if + i32.const 0 + return + end + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $2 + local.get $1 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + i32.ne + if + i32.const 0 + return + end + block $__inlined_func$~lib/util/string/compareImpl (result i32) + local.get $0 + local.tee $3 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + local.tee $0 + i32.const 4 + i32.ge_u + select + if + loop $do-continue|0 + local.get $3 + i64.load + local.get $1 + i64.load + i64.eq + if + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $0 + i32.const 4 + i32.sub + local.tee $0 + i32.const 4 + i32.ge_u + br_if $do-continue|0 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 + loop $while-continue|1 local.get $0 - local.get $1 - i32.lt_u + local.tee $2 + i32.const 1 + i32.sub + local.set $0 + local.get $2 if - local.get $0 - i32.load + local.get $3 + i32.load16_u local.tee $2 + local.get $1 + i32.load16_u + local.tee $4 + i32.ne if local.get $2 - call $~lib/rt/itcms/__visit + local.get $4 + i32.sub + br $__inlined_func$~lib/util/string/compareImpl end - local.get $0 - i32.const 4 + local.get $3 + i32.const 2 i32.add - local.set $0 - br $while-continue|0 + local.set $3 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $while-continue|1 end end - return + i32.const 0 end - unreachable + i32.eqz ) - (func $~start - call $start:templateliteral + (func $~lib/util/number/decimalCount32 (param $0 i32) (result i32) + local.get $0 + i32.const 10 + i32.ge_u + i32.const 1 + i32.add + local.get $0 + i32.const 10000 + i32.ge_u + i32.const 3 + i32.add + local.get $0 + i32.const 1000 + i32.ge_u + i32.add + local.get $0 + i32.const 100 + i32.lt_u + select + local.get $0 + i32.const 1000000 + i32.ge_u + i32.const 6 + i32.add + local.get $0 + i32.const 1000000000 + i32.ge_u + i32.const 8 + i32.add + local.get $0 + i32.const 100000000 + i32.ge_u + i32.add + local.get $0 + i32.const 10000000 + i32.lt_u + select + local.get $0 + i32.const 100000 + i32.lt_u + select ) - (func $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 1860 - i32.lt_s - if - i32.const 18272 - i32.const 18320 + (func $~lib/util/number/utoa_dec_simple (param $0 i32) (param $1 i32) (param $2 i32) + loop $do-continue|0 + local.get $0 + local.get $2 i32.const 1 + i32.sub + local.tee $2 i32.const 1 - call $~lib/builtins/abort - unreachable + i32.shl + i32.add + local.get $1 + i32.const 10 + i32.rem_u + i32.const 48 + i32.add + i32.store16 + local.get $1 + i32.const 10 + i32.div_u + local.tee $1 + br_if $do-continue|0 end ) - (func $~lib/string/String.__concat (param $0 i32) (param $1 i32) (result i32) + (func $~lib/number/I32#toString (param $0 i32) (result i32) + (local $1 i32) (local $2 i32) (local $3 i32) - (local $4 i32) global.get $~lib/memory/__stack_pointer i32.const 4 i32.sub @@ -2053,222 +2254,1866 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.const 1504 - local.get $0 - select - local.tee $2 - i32.store - 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 - block $__inlined_func$~lib/string/String#concat - local.get $1 + block $__inlined_func$~lib/util/number/itoa32 + local.get $0 i32.eqz if global.get $~lib/memory/__stack_pointer - i32.const 1504 - i32.store - i32.const 1504 - local.set $1 + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 2176 + local.set $0 + br $__inlined_func$~lib/util/number/itoa32 end - local.get $1 - i32.const 20 + i32.const 0 + local.get $0 i32.sub - i32.load offset=16 - i32.const 1 + local.get $0 + local.get $0 + i32.const 31 i32.shr_u + local.tee $1 + select + local.tee $2 + call $~lib/util/number/decimalCount32 + local.get $1 + i32.add + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 i32.const 1 i32.shl - local.tee $4 - local.get $2 - 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 $0 - i32.eqz - if - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 1472 - local.set $0 - br $__inlined_func$~lib/string/String#concat - end - global.get $~lib/memory/__stack_pointer - local.get $0 call $~lib/rt/itcms/__new local.tee $0 - i32.store offset=4 + i32.store local.get $0 local.get $2 local.get $3 - call $~lib/memory/memory.copy - local.get $0 - local.get $3 - i32.add + call $~lib/util/number/utoa_dec_simple local.get $1 - local.get $4 - call $~lib/memory/memory.copy + if + local.get $0 + i32.const 45 + i32.store16 + end global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer local.get $0 ) - (func $~lib/util/string/joinReferenceArray<~lib/string/String> (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - global.get $~lib/memory/__stack_pointer - 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 + (func $~lib/util/number/genDigits (param $0 i64) (param $1 i32) (param $2 i64) (param $3 i32) (param $4 i64) (param $5 i32) (result i32) + (local $6 i64) + (local $7 i32) + (local $8 i64) + (local $9 i32) + (local $10 i64) + (local $11 i64) + local.get $2 local.get $0 - i32.const 1 + i64.sub + local.set $8 + local.get $2 + i64.const 1 + i32.const 0 + local.get $3 i32.sub + local.tee $9 + i64.extend_i32_s + i64.shl + local.tee $10 + i64.const 1 + i64.sub + local.tee $11 + i64.and + local.set $6 + local.get $2 + local.get $9 + i64.extend_i32_s + i64.shr_u + i32.wrap_i64 local.tee $1 - i32.const 0 - i32.lt_s - if - global.get $~lib/memory/__stack_pointer - i32.const 12 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 1472 - return - end - local.get $1 - i32.eqz - if - global.get $~lib/memory/__stack_pointer - i32.const 1216 - i32.load - local.tee $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 12 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $0 - i32.const 1472 - local.get $0 - select - return - end - i32.const 1472 - local.set $0 - global.get $~lib/memory/__stack_pointer - i32.const 1472 - i32.store offset=4 - i32.const 1468 - i32.load - i32.const 1 - i32.shr_u - local.set $4 - loop $for-loop|0 - local.get $1 - local.get $2 + call $~lib/util/number/decimalCount32 + local.set $7 + loop $while-continue|0 + local.get $7 + i32.const 0 i32.gt_s if - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.const 2 - i32.shl - i32.const 1216 - i32.add - i32.load - local.tee $3 - i32.store + block $break|1 + block $case10|1 + block $case9|1 + block $case8|1 + block $case7|1 + block $case6|1 + block $case5|1 + block $case4|1 + block $case3|1 + block $case2|1 + block $case1|1 + block $case0|1 + local.get $7 + i32.const 1 + i32.sub + br_table $case9|1 $case8|1 $case7|1 $case6|1 $case5|1 $case4|1 $case3|1 $case2|1 $case1|1 $case0|1 $case10|1 + end + local.get $1 + i32.const 1000000000 + i32.div_u + local.set $3 + local.get $1 + i32.const 1000000000 + i32.rem_u + local.set $1 + br $break|1 + end + local.get $1 + i32.const 100000000 + i32.div_u + local.set $3 + local.get $1 + i32.const 100000000 + i32.rem_u + local.set $1 + br $break|1 + end + local.get $1 + i32.const 10000000 + i32.div_u + local.set $3 + local.get $1 + i32.const 10000000 + i32.rem_u + local.set $1 + br $break|1 + end + local.get $1 + i32.const 1000000 + i32.div_u + local.set $3 + local.get $1 + i32.const 1000000 + i32.rem_u + local.set $1 + br $break|1 + end + local.get $1 + i32.const 100000 + i32.div_u + local.set $3 + local.get $1 + i32.const 100000 + i32.rem_u + local.set $1 + br $break|1 + end + local.get $1 + i32.const 10000 + i32.div_u + local.set $3 + local.get $1 + i32.const 10000 + i32.rem_u + local.set $1 + br $break|1 + end + local.get $1 + i32.const 1000 + i32.div_u + local.set $3 + local.get $1 + i32.const 1000 + i32.rem_u + local.set $1 + br $break|1 + end + local.get $1 + i32.const 100 + i32.div_u + local.set $3 + local.get $1 + i32.const 100 + i32.rem_u + local.set $1 + br $break|1 + end + local.get $1 + i32.const 10 + i32.div_u + local.set $3 + local.get $1 + i32.const 10 + i32.rem_u + local.set $1 + br $break|1 + end + local.get $1 + local.set $3 + i32.const 0 + local.set $1 + br $break|1 + end + i32.const 0 + local.set $3 + end local.get $3 + local.get $5 + i32.or if - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store offset=8 - global.get $~lib/memory/__stack_pointer - local.get $0 + local.get $5 + i32.const 1 + i32.shl + i32.const 2688 + i32.add local.get $3 - call $~lib/string/String.__concat - local.tee $0 - i32.store offset=4 + i32.const 65535 + i32.and + i32.const 48 + i32.add + i32.store16 + local.get $5 + i32.const 1 + i32.add + local.set $5 end + local.get $7 + i32.const 1 + i32.sub + local.set $7 + local.get $6 + local.get $1 + i64.extend_i32_u + local.get $9 + i64.extend_i32_s + i64.shl + i64.add + local.tee $0 local.get $4 + i64.le_u if - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.const 1472 - call $~lib/string/String.__concat - local.tee $0 - i32.store offset=4 + local.get $7 + global.get $~lib/util/number/_K + i32.add + global.set $~lib/util/number/_K + local.get $7 + i32.const 2 + i32.shl + i32.const 3616 + i32.add + i64.load32_u + local.get $9 + i64.extend_i32_s + i64.shl + local.set $2 + local.get $5 + i32.const 1 + i32.shl + i32.const 2686 + i32.add + local.tee $3 + i32.load16_u + local.set $1 + loop $while-continue|3 + i32.const 1 + local.get $8 + local.get $0 + i64.sub + local.get $0 + local.get $2 + i64.add + local.tee $6 + local.get $8 + i64.sub + i64.gt_u + local.get $6 + local.get $8 + i64.lt_u + select + i32.const 0 + local.get $2 + local.get $4 + local.get $0 + i64.sub + i64.le_u + i32.const 0 + local.get $0 + local.get $8 + i64.lt_u + select + select + if + local.get $1 + i32.const 1 + i32.sub + local.set $1 + local.get $0 + local.get $2 + i64.add + local.set $0 + br $while-continue|3 + end + end + local.get $3 + local.get $1 + i32.store16 + local.get $5 + return end - local.get $2 + br $while-continue|0 + end + end + local.get $9 + i64.extend_i32_s + local.set $0 + loop $while-continue|4 + local.get $4 + i64.const 10 + i64.mul + local.set $4 + local.get $6 + i64.const 10 + i64.mul + local.tee $2 + local.get $0 + i64.shr_u + local.tee $6 + local.get $5 + i64.extend_i32_s + i64.or + i64.const 0 + i64.ne + if + local.get $5 i32.const 1 + i32.shl + i32.const 2688 i32.add - local.set $2 - br $for-loop|0 + local.get $6 + i32.wrap_i64 + i32.const 65535 + i32.and + i32.const 48 + i32.add + i32.store16 + local.get $5 + i32.const 1 + i32.add + local.set $5 end + local.get $7 + i32.const 1 + i32.sub + local.set $7 + local.get $4 + local.get $2 + local.get $11 + i64.and + local.tee $6 + i64.le_u + br_if $while-continue|4 + end + local.get $7 + global.get $~lib/util/number/_K + i32.add + global.set $~lib/util/number/_K + local.get $6 + local.set $0 + local.get $8 + i32.const 0 + local.get $7 + i32.sub + i32.const 2 + i32.shl + i32.const 3616 + i32.add + i64.load32_u + i64.mul + local.set $2 + local.get $5 + i32.const 1 + i32.shl + i32.const 2686 + i32.add + local.tee $3 + i32.load16_u + local.set $1 + loop $while-continue|6 + i32.const 1 + local.get $2 + local.get $0 + i64.sub + local.get $0 + local.get $10 + i64.add + local.tee $6 + local.get $2 + i64.sub + i64.gt_u + local.get $2 + local.get $6 + i64.gt_u + select + i32.const 0 + local.get $10 + local.get $4 + local.get $0 + i64.sub + i64.le_u + i32.const 0 + local.get $0 + local.get $2 + i64.lt_u + select + select + if + local.get $1 + i32.const 1 + i32.sub + local.set $1 + local.get $0 + local.get $10 + i64.add + local.set $0 + br $while-continue|6 + end + end + local.get $3 + local.get $1 + i32.store16 + local.get $5 + ) + (func $~lib/util/number/prettify (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + local.get $2 + i32.eqz + if + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add + i32.const 3145774 + i32.store + local.get $1 + i32.const 2 + i32.add + return + end + local.get $1 + local.get $2 + i32.add + local.tee $3 + i32.const 21 + i32.le_s + i32.const 0 + local.get $1 + local.get $3 + i32.le_s + select + if (result i32) + loop $for-loop|0 + local.get $1 + local.get $3 + i32.lt_s + if + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add + i32.const 48 + i32.store16 + local.get $1 + i32.const 1 + i32.add + local.set $1 + br $for-loop|0 + end + end + local.get $0 + local.get $3 + i32.const 1 + i32.shl + i32.add + i32.const 3145774 + i32.store + local.get $3 + i32.const 2 + i32.add + else + local.get $3 + i32.const 21 + i32.le_s + i32.const 0 + local.get $3 + i32.const 0 + i32.gt_s + select + if (result i32) + local.get $0 + local.get $3 + i32.const 1 + i32.shl + i32.add + local.tee $0 + i32.const 2 + i32.add + local.get $0 + i32.const 0 + local.get $2 + i32.sub + i32.const 1 + i32.shl + call $~lib/memory/memory.copy + local.get $0 + i32.const 46 + i32.store16 + local.get $1 + i32.const 1 + i32.add + else + local.get $3 + i32.const 0 + i32.le_s + i32.const 0 + local.get $3 + i32.const -6 + i32.gt_s + select + if (result i32) + local.get $0 + i32.const 2 + local.get $3 + i32.sub + local.tee $3 + i32.const 1 + i32.shl + i32.add + local.get $0 + local.get $1 + i32.const 1 + i32.shl + call $~lib/memory/memory.copy + local.get $0 + i32.const 3014704 + i32.store + i32.const 2 + local.set $2 + loop $for-loop|1 + local.get $2 + local.get $3 + i32.lt_s + if + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + i32.const 48 + i32.store16 + local.get $2 + i32.const 1 + i32.add + local.set $2 + br $for-loop|1 + end + end + local.get $1 + local.get $3 + i32.add + else + local.get $1 + i32.const 1 + i32.eq + if (result i32) + local.get $0 + i32.const 101 + i32.store16 offset=2 + local.get $0 + local.tee $1 + i32.const 4 + i32.add + local.get $3 + i32.const 1 + i32.sub + local.tee $0 + i32.const 0 + i32.lt_s + local.tee $2 + if + i32.const 0 + local.get $0 + i32.sub + local.set $0 + end + local.get $0 + local.get $0 + call $~lib/util/number/decimalCount32 + i32.const 1 + i32.add + local.tee $0 + call $~lib/util/number/utoa_dec_simple + local.get $1 + i32.const 45 + i32.const 43 + local.get $2 + select + i32.store16 offset=4 + local.get $0 + i32.const 2 + i32.add + else + local.get $0 + i32.const 4 + i32.add + local.get $0 + i32.const 2 + i32.add + local.get $1 + i32.const 1 + i32.shl + local.tee $2 + i32.const 2 + i32.sub + call $~lib/memory/memory.copy + local.get $0 + i32.const 46 + i32.store16 offset=2 + local.get $0 + local.get $2 + i32.add + local.tee $0 + i32.const 101 + i32.store16 offset=2 + local.get $0 + local.tee $2 + i32.const 4 + i32.add + local.get $3 + i32.const 1 + i32.sub + local.tee $0 + i32.const 0 + i32.lt_s + local.tee $3 + if + i32.const 0 + local.get $0 + i32.sub + local.set $0 + end + local.get $0 + local.get $0 + call $~lib/util/number/decimalCount32 + i32.const 1 + i32.add + local.tee $0 + call $~lib/util/number/utoa_dec_simple + local.get $2 + i32.const 45 + i32.const 43 + local.get $3 + select + i32.store16 offset=4 + local.get $0 + local.get $1 + i32.add + i32.const 2 + i32.add + end + end + end + end + ) + (func $~lib/util/number/dtoa_core (param $0 f64) (result i32) + (local $1 i64) + (local $2 i32) + (local $3 i64) + (local $4 i64) + (local $5 i64) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i64) + (local $10 i64) + (local $11 i64) + local.get $0 + f64.const 0 + f64.lt + local.tee $8 + if (result f64) + i32.const 2688 + i32.const 45 + i32.store16 + local.get $0 + f64.neg + else + local.get $0 + end + i64.reinterpret_f64 + local.tee $3 + i64.const 9218868437227405312 + i64.and + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.tee $6 + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 52 + i64.shl + local.get $3 + i64.const 4503599627370495 + i64.and + i64.add + local.tee $1 + i64.const 1 + i64.shl + i64.const 1 + i64.add + local.tee $3 + i64.clz + i32.wrap_i64 + local.set $2 + local.get $3 + local.get $2 + i64.extend_i32_s + i64.shl + global.set $~lib/util/number/_frc_plus + local.get $6 + i32.const 1 + local.get $6 + select + i32.const 1075 + i32.sub + local.tee $6 + i32.const 1 + i32.sub + local.get $2 + i32.sub + local.set $2 + local.get $1 + local.get $1 + i64.const 4503599627370496 + i64.eq + i32.const 1 + i32.add + local.tee $7 + i64.extend_i32_s + i64.shl + i64.const 1 + i64.sub + local.get $6 + local.get $7 + i32.sub + local.get $2 + i32.sub + i64.extend_i32_s + i64.shl + global.set $~lib/util/number/_frc_minus + local.get $2 + global.set $~lib/util/number/_exp + i32.const 348 + i32.const -61 + global.get $~lib/util/number/_exp + i32.sub + f64.convert_i32_s + f64.const 0.30102999566398114 + f64.mul + f64.const 347 + f64.add + local.tee $0 + i32.trunc_f64_s + local.tee $2 + local.get $0 + local.get $2 + f64.convert_i32_s + f64.ne + i32.add + i32.const 3 + i32.shr_s + i32.const 1 + i32.add + local.tee $2 + i32.const 3 + i32.shl + local.tee $7 + i32.sub + global.set $~lib/util/number/_K + local.get $7 + i32.const 2744 + i32.add + i64.load + global.set $~lib/util/number/_frc_pow + local.get $2 + i32.const 1 + i32.shl + i32.const 3440 + i32.add + i32.load16_s + global.set $~lib/util/number/_exp_pow + global.get $~lib/util/number/_frc_pow + local.tee $4 + i64.const 32 + i64.shr_u + local.set $3 + local.get $4 + i64.const 4294967295 + i64.and + local.tee $4 + global.get $~lib/util/number/_frc_plus + local.tee $5 + i64.const 32 + i64.shr_u + local.tee $10 + i64.mul + local.get $4 + local.get $5 + i64.const 4294967295 + i64.and + local.tee $11 + i64.mul + i64.const 32 + i64.shr_u + i64.add + local.set $5 + local.get $8 + i32.const 1 + i32.shl + i32.const 2688 + i32.add + local.get $3 + local.get $1 + local.get $1 + i64.clz + i32.wrap_i64 + local.tee $2 + i64.extend_i32_s + i64.shl + local.tee $1 + i64.const 32 + i64.shr_u + local.tee $9 + i64.mul + local.get $4 + local.get $9 + i64.mul + local.get $4 + local.get $1 + i64.const 4294967295 + i64.and + local.tee $1 + i64.mul + i64.const 32 + i64.shr_u + i64.add + local.tee $9 + i64.const 32 + i64.shr_u + i64.add + local.get $1 + local.get $3 + i64.mul + local.get $9 + i64.const 4294967295 + i64.and + i64.add + i64.const 2147483647 + i64.add + i64.const 32 + i64.shr_u + i64.add + global.get $~lib/util/number/_exp_pow + local.tee $7 + local.get $6 + local.get $2 + i32.sub + i32.add + i32.const -64 + i32.sub + local.get $3 + local.get $10 + i64.mul + local.get $5 + i64.const 32 + i64.shr_u + i64.add + local.get $3 + local.get $11 + i64.mul + local.get $5 + i64.const 4294967295 + i64.and + i64.add + i64.const 2147483647 + i64.add + i64.const 32 + i64.shr_u + i64.add + i64.const 1 + i64.sub + local.tee $1 + local.get $7 + global.get $~lib/util/number/_exp + i32.add + i32.const -64 + i32.sub + local.get $1 + local.get $3 + global.get $~lib/util/number/_frc_minus + local.tee $1 + i64.const 32 + i64.shr_u + local.tee $5 + i64.mul + local.get $4 + local.get $5 + i64.mul + local.get $4 + local.get $1 + i64.const 4294967295 + i64.and + local.tee $4 + i64.mul + i64.const 32 + i64.shr_u + i64.add + local.tee $1 + i64.const 32 + i64.shr_u + i64.add + local.get $3 + local.get $4 + i64.mul + local.get $1 + i64.const 4294967295 + i64.and + i64.add + i64.const 2147483647 + i64.add + i64.const 32 + i64.shr_u + i64.add + i64.const 1 + i64.add + i64.sub + local.get $8 + call $~lib/util/number/genDigits + local.get $8 + i32.sub + global.get $~lib/util/number/_K + call $~lib/util/number/prettify + local.get $8 + i32.add + ) + (func $~lib/number/F64#toString (param $0 f64) (result i32) + (local $1 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 + block $__inlined_func$~lib/util/number/dtoa + local.get $0 + f64.const 0 + f64.eq + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 2544 + local.set $1 + br $__inlined_func$~lib/util/number/dtoa + end + local.get $0 + local.get $0 + f64.sub + f64.const 0 + f64.ne + if + local.get $0 + local.get $0 + f64.ne + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 2576 + local.set $1 + br $__inlined_func$~lib/util/number/dtoa + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 2608 + i32.const 2656 + local.get $0 + f64.const 0 + f64.lt + select + local.set $1 + br $__inlined_func$~lib/util/number/dtoa + end + local.get $0 + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $1 + i32.store + local.get $1 + i32.const 2688 + local.get $2 + call $~lib/memory/memory.copy + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + 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 + i32.const 1232 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + memory.size + i32.const 16 + i32.shl + i32.const 20604 + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 1472 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 1504 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace + call $templateliteral/test_string + call $templateliteral/test_integer + call $templateliteral/test_float + call $templateliteral/test_ref + ) + (func $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 4220 + i32.lt_s + if + i32.const 20624 + i32.const 20672 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (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 + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.const 1392 + local.get $0 + select + local.tee $2 + i32.store + 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 + block $__inlined_func$~lib/string/String#concat + local.get $1 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 1392 + i32.store + i32.const 1392 + local.set $1 + end + 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 + local.get $2 + 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 $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 1120 + local.set $0 + br $__inlined_func$~lib/string/String#concat + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store offset=4 + local.get $0 + local.get $2 + local.get $3 + call $~lib/memory/memory.copy + local.get $0 + local.get $3 + i32.add + local.get $1 + local.get $4 + call $~lib/memory/memory.copy + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $~lib/util/string/joinReferenceArray<~lib/string/String> (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + 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 + local.get $1 + i32.const 1 + i32.sub + local.tee $2 + i32.const 0 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 1120 + return + end + local.get $2 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.load + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + i32.const 1120 + local.get $0 + select + return + end + i32.const 1120 + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 1120 + i32.store offset=4 + i32.const 1116 + i32.load + i32.const 1 + i32.shr_u + local.set $5 + loop $for-loop|0 + local.get $2 + local.get $3 + i32.gt_s + if + global.get $~lib/memory/__stack_pointer + local.get $0 + local.get $3 + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $4 + i32.store + local.get $4 + if + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $1 + local.get $4 + call $~lib/string/String.__concat + local.tee $1 + i32.store offset=4 + end + local.get $5 + if + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.const 1120 + call $~lib/string/String.__concat + local.tee $1 + i32.store offset=4 + end + local.get $3 + i32.const 1 + i32.add + local.set $3 + br $for-loop|0 + end + end + global.get $~lib/memory/__stack_pointer + local.get $0 + local.get $2 + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $0 + i32.store + local.get $0 + if + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $1 + local.get $0 + call $~lib/string/String.__concat + local.tee $1 + i32.store offset=4 + end + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $templateliteral/test_string + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1088 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + 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 + i32.const 1152 + i32.store offset=16 + global.get $~lib/memory/__stack_pointer + 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.get $0 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + 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 1616 + i32.const 4 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1680 + i32.store offset=16 + i32.const 1680 + i32.const 1 + i32.const 1056 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 1680 + i32.store offset=16 + i32.const 1680 + i32.const 3 + i32.const 1088 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 1680 + i32.store offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 1120 + i32.store offset=20 + i32.const 1680 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 1728 + i32.store offset=12 + local.get $0 + i32.const 1728 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1616 + i32.const 5 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1856 + i32.store offset=16 + i32.const 1856 + i32.const 1 + i32.const 1056 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 1856 + i32.store offset=16 + i32.const 1856 + i32.const 3 + i32.const 1088 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 1856 + i32.store offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 1120 + i32.store offset=20 + i32.const 1856 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 1904 + i32.store offset=12 + local.get $0 + i32.const 1904 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1616 + i32.const 6 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $templateliteral/test_integer + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 1952 + i32.store offset=8 + i32.const 1 + call $~lib/number/I32#toString + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=12 + i32.const 1952 + i32.const 1 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 1952 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 1120 + i32.store offset=16 + i32.const 1952 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2304 + i32.store offset=4 + local.get $0 + i32.const 2304 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1616 + i32.const 13 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2336 + i32.store offset=8 + i32.const 1 + call $~lib/number/I32#toString + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=12 + i32.const 2336 + i32.const 1 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 2336 + i32.store offset=8 + i32.const 2 + call $~lib/number/I32#toString + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=12 + i32.const 2336 + i32.const 3 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 2336 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 1120 + i32.store offset=16 + i32.const 2336 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2384 + i32.store offset=4 + local.get $0 + i32.const 2384 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1616 + i32.const 14 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2416 + i32.store offset=8 + i32.const 1 + call $~lib/number/I32#toString + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=12 + i32.const 2416 + i32.const 1 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 2416 + i32.store offset=8 + i32.const 2 + call $~lib/number/I32#toString + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=12 + i32.const 2416 + i32.const 3 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 2416 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 1120 + i32.store offset=16 + i32.const 2416 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2464 + i32.store offset=4 + local.get $0 + i32.const 2464 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1616 + i32.const 15 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $templateliteral/test_float + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 2512 + 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 2512 + i32.const 1 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 2512 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 1120 + i32.store offset=16 + i32.const 2512 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3680 + i32.store offset=4 + local.get $0 + i32.const 3680 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1616 + i32.const 22 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3712 + 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 3712 + i32.const 1 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 3712 + 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 3712 + i32.const 3 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 3712 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 1120 + i32.store offset=16 + i32.const 3712 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3760 + i32.store offset=4 + local.get $0 + i32.const 3760 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1616 + i32.const 23 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3792 + 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 3792 + i32.const 1 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 3792 + 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 3792 + i32.const 3 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 3792 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 1120 + i32.store offset=16 + i32.const 3792 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3840 + i32.store offset=4 + local.get $0 + i32.const 3840 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1616 + i32.const 24 + i32.const 3 + call $~lib/builtins/abort + unreachable end global.get $~lib/memory/__stack_pointer - local.get $1 - i32.const 2 - i32.shl - i32.const 1216 + i32.const 20 i32.add - i32.load - local.tee $1 + global.set $~lib/memory/__stack_pointer + ) + (func $templateliteral/Ref#toString (param $0 i32) (result 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 + global.get $~lib/memory/__stack_pointer + i32.const 3920 i32.store - local.get $1 - if - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.store offset=8 - global.get $~lib/memory/__stack_pointer - local.get $0 - local.get $1 - call $~lib/string/String.__concat - local.tee $0 - i32.store offset=4 - end + local.get $0 + i32.load + call $~lib/number/I32#toString + local.set $0 global.get $~lib/memory/__stack_pointer - i32.const 12 + local.get $0 + i32.store offset=4 + i32.const 3920 + 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 - local.get $0 ) - (func $start:templateliteral + (func $templateliteral/test_ref (local $0 i32) (local $1 i32) (local $2 i32) - (local $3 i32) - (local $4 i32) global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 28 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check @@ -2279,174 +4124,195 @@ i64.const 0 i64.store offset=8 global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=16 + global.get $~lib/memory/__stack_pointer i32.const 0 + i32.store offset=24 + global.get $~lib/memory/__stack_pointer + i32.const 1 + call $templateliteral/Ref#constructor + local.tee $1 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2 + call $templateliteral/Ref#constructor + local.tee $2 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 3888 i32.store offset=16 - i32.const 1312 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/toSpace - memory.size - i32.const 16 - i32.shl - i32.const 18244 - i32.sub + 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 3888 i32.const 1 - i32.shr_u - global.set $~lib/rt/itcms/threshold - i32.const 1584 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/pinSpace - i32.const 1616 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/fromSpace + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 3888 + i32.store offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 1120 + i32.store offset=24 + i32.const 3888 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $0 global.get $~lib/memory/__stack_pointer - i32.const 1216 + local.get $0 i32.store offset=8 global.get $~lib/memory/__stack_pointer - i32.const 1056 + i32.const 3952 i32.store offset=12 + local.get $0 + i32.const 3952 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1616 + i32.const 38 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3984 + 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 3984 i32.const 1 - i32.const 1056 + local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 1216 - i32.store offset=8 + i32.const 3984 + i32.store offset=16 + local.get $2 + call $templateliteral/Ref#toString + local.set $0 global.get $~lib/memory/__stack_pointer - i32.const 1088 - i32.store offset=12 + local.get $0 + i32.store offset=20 + i32.const 3984 i32.const 3 - i32.const 1088 + local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 1216 - i32.store offset=8 - global.get $~lib/memory/__stack_pointer - i32.const 1472 + i32.const 3984 i32.store offset=16 - i32.const 1212 - i32.load - i32.const 2 - i32.shr_u - call $~lib/util/string/joinReferenceArray<~lib/string/String> - local.set $4 global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store + i32.const 1120 + i32.store offset=24 + i32.const 3984 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $0 global.get $~lib/memory/__stack_pointer - i32.const 1728 - i32.store offset=4 - block $__inlined_func$~lib/string/String.__eq (result i32) - i32.const 1 - local.get $4 - i32.const 1728 - i32.eq - br_if $__inlined_func$~lib/string/String.__eq - drop - i32.const 0 - local.get $4 - i32.eqz - br_if $__inlined_func$~lib/string/String.__eq - drop + local.get $0 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 4032 + i32.store offset=12 + local.get $0 + i32.const 4032 + call $~lib/string/String.__eq + i32.eqz + if i32.const 0 - local.get $4 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - local.tee $1 - i32.const 1724 - i32.load - i32.const 1 - i32.shr_u - i32.ne - br_if $__inlined_func$~lib/string/String.__eq - drop - block $__inlined_func$~lib/util/string/compareImpl (result i32) - i32.const 1728 - local.set $3 - local.get $4 - i32.const 7 - i32.and - i32.eqz - i32.const 0 - local.get $1 - i32.const 4 - i32.ge_u - select - if - loop $do-continue|0 - local.get $4 - i64.load - local.get $3 - i64.load - i64.eq - if - local.get $4 - i32.const 8 - i32.add - local.set $4 - local.get $3 - i32.const 8 - i32.add - local.set $3 - local.get $1 - i32.const 4 - i32.sub - local.tee $1 - i32.const 4 - i32.ge_u - br_if $do-continue|0 - end - end - end - loop $while-continue|1 - local.get $1 - local.tee $0 - i32.const 1 - i32.sub - local.set $1 - local.get $0 - if - local.get $4 - i32.load16_u - local.tee $2 - local.get $3 - i32.load16_u - local.tee $0 - i32.ne - if - local.get $2 - local.get $0 - i32.sub - br $__inlined_func$~lib/util/string/compareImpl - end - local.get $4 - i32.const 2 - i32.add - local.set $4 - local.get $3 - i32.const 2 - i32.add - local.set $3 - br $while-continue|1 - end - end - i32.const 0 - end - i32.eqz + i32.const 1616 + i32.const 39 + i32.const 3 + call $~lib/builtins/abort + unreachable end + global.get $~lib/memory/__stack_pointer + i32.const 4080 + i32.store offset=16 + local.get $1 + call $templateliteral/Ref#toString + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=20 + i32.const 4080 + i32.const 1 + local.get $1 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 4080 + i32.store offset=16 + local.get $2 + call $templateliteral/Ref#toString + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=20 + i32.const 4080 + i32.const 3 + local.get $1 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 4080 + i32.store offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 1120 + i32.store offset=24 + i32.const 4080 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 4128 + i32.store offset=12 + local.get $1 + i32.const 4128 + call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1776 + i32.const 1616 + i32.const 40 i32.const 3 - i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 28 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $templateliteral/Ref#constructor (param $0 i32) (result i32) + (local $1 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 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $1 + i32.store + local.get $1 + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer + local.get $1 ) ) diff --git a/tests/compiler/templateliteral.ts b/tests/compiler/templateliteral.ts index 04d25c4f87..485255b39f 100644 --- a/tests/compiler/templateliteral.ts +++ b/tests/compiler/templateliteral.ts @@ -1,3 +1,42 @@ -var a = "a"; -var b = "b"; -assert(`(a=${a}, b=${b})` == "(a=a, b=b)"); +function test_string(): void { + var a = "a"; + var b = "b"; + assert(`${a}`== "a"); + assert(`${a}${b}`== "ab"); + assert(`(A=${a}, B=${b})` == "(A=a, B=b)"); +} +test_string(); + +function test_integer(): void { + var a = 1; + var b = 2; + assert(`${a}`== "1"); + assert(`${a}${b}`== "12"); + assert(`(A=${a}, B=${b})` == "(A=1, B=2)"); +} +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=${a}, B=${b})` == "(A=1.0, B=2.0)"); +} +test_float(); + +class Ref { + constructor(public value: i32) {} + toString(): string { + return "ref#" + this.value.toString(); + } +} + +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=${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 7d96f07fe0..6940eb0899 100644 --- a/tests/compiler/templateliteral.untouched.wat +++ b/tests/compiler/templateliteral.untouched.wat @@ -1,37 +1,79 @@ (module (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_=>_i32 (func (param i32) (result i32))) - (type $i32_=>_none (func (param i32))) - (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) - (type $none_=>_none (func)) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + (type $none_=>_none (func)) + (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_=>_none (func (param i32 i32 i32 i32))) + (type $i32_i64_i32_=>_none (func (param i32 i64 i32))) + (type $i32_i64_i32_i32_=>_none (func (param i32 i64 i32 i32))) (type $none_=>_i32 (func (result i32))) + (type $f64_=>_i32 (func (param f64) (result i32))) (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) + (type $i32_i64_i32_i64_i32_i64_i32_=>_i32 (func (param i32 i64 i32 i64 i32 i64 i32) (result i32))) + (type $i32_f64_=>_i32 (func (param i32 f64) (result i32))) + (type $i64_i32_=>_i32 (func (param i64 i32) (result i32))) + (type $f64_i32_=>_i32 (func (param f64 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (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\06\00\00\00(\00a\00=\00\00\00\00\00\00\00") - (data (i32.const 108) "\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 140) "\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 172) ",\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\80\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) "\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 460) "<\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 528) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 560) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 588) "<\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 652) ",\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 700) "<\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 768) "\04\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") + (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#__visit (param $0 i32) (param $1 i32) - (local $2 i32) + (func $~lib/util/number/utoa32_dec_lut (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) - i32.const 1 - drop - local.get $0 - local.set $2 - local.get $2 - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 - i32.add - local.set $3 + (local $6 i32) + (local $7 i32) + (local $8 i64) + (local $9 i64) + (local $10 i32) + (local $11 i32) loop $while-continue|0 - local.get $2 + local.get $1 + i32.const 10000 + i32.ge_u + local.set $3 local.get $3 - i32.lt_u - local.set $4 - local.get $4 if - local.get $2 - i32.load + local.get $1 + i32.const 10000 + i32.div_u + local.set $4 + local.get $1 + i32.const 10000 + i32.rem_u local.set $5 + local.get $4 + local.set $1 local.get $5 - if - local.get $5 - local.get $1 - call $~lib/rt/itcms/__visit - end + i32.const 100 + i32.div_u + local.set $6 + local.get $5 + i32.const 100 + i32.rem_u + local.set $7 + i32.const 1132 + local.get $6 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.set $8 + i32.const 1132 + local.get $7 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.set $9 local.get $2 i32.const 4 - i32.add + i32.sub local.set $2 + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $8 + local.get $9 + i64.const 32 + i64.shl + i64.or + i64.store br $while-continue|0 end end - ) - (func $~lib/staticarray/StaticArray<~lib/string/String>~visit (param $0 i32) (param $1 i32) - local.get $0 local.get $1 - call $~lib/staticarray/StaticArray<~lib/string/String>#__visit + i32.const 100 + i32.ge_u + if + local.get $1 + i32.const 100 + i32.div_u + local.set $3 + local.get $1 + i32.const 100 + i32.rem_u + local.set $10 + local.get $3 + local.set $1 + local.get $2 + i32.const 2 + i32.sub + local.set $2 + i32.const 1132 + local.get $10 + i32.const 2 + i32.shl + i32.add + i32.load + local.set $11 + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $11 + i32.store + end + local.get $1 + i32.const 10 + i32.ge_u + if + local.get $2 + i32.const 2 + i32.sub + local.set $2 + i32.const 1132 + local.get $1 + i32.const 2 + i32.shl + i32.add + i32.load + local.set $11 + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $11 + i32.store + else + local.get $2 + i32.const 1 + i32.sub + local.set $2 + i32.const 48 + local.get $1 + i32.add + local.set $11 + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $11 + i32.store16 + end ) - (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) - block $invalid - 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> $invalid - end - return - end - return - end + (func $~lib/util/number/utoa_hex_lut (param $0 i32) (param $1 i64) (param $2 i32) + (local $3 i32) + loop $while-continue|0 + local.get $2 + i32.const 2 + i32.ge_u + local.set $3 + local.get $3 + if + local.get $2 + i32.const 2 + i32.sub + local.set $2 local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + i32.const 1552 local.get $1 - call $~lib/arraybuffer/ArrayBufferView~visit - return + i32.wrap_i64 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.add + i32.load + i32.store + local.get $1 + i64.const 8 + i64.shr_u + local.set $1 + br $while-continue|0 end + end + local.get $2 + i32.const 1 + i32.and + if local.get $0 + i32.const 1552 local.get $1 - call $~lib/staticarray/StaticArray<~lib/string/String>~visit - return + i32.wrap_i64 + i32.const 6 + i32.shl + i32.add + i32.load16_u + i32.store16 end - unreachable - ) - (func $~start - call $start:templateliteral ) - (func $~stack_check - global.get $~lib/memory/__stack_pointer - global.get $~lib/memory/__data_end - i32.lt_s + (func $~lib/util/number/ulog_base (param $0 i64) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i64) + (local $4 i64) + (local $5 i32) + local.get $1 + local.set $2 + local.get $2 + i32.popcnt + i32.const 1 + i32.eq + if + i32.const 63 + local.get $0 + i64.clz + i32.wrap_i64 + i32.sub + i32.const 31 + local.get $1 + i32.clz + i32.sub + i32.div_u + i32.const 1 + i32.add + return + end + local.get $1 + i64.extend_i32_s + local.set $3 + local.get $3 + local.set $4 + i32.const 1 + local.set $5 + loop $while-continue|0 + local.get $0 + local.get $4 + i64.ge_u + local.set $2 + local.get $2 + if + local.get $0 + local.get $4 + i64.div_u + local.set $0 + local.get $4 + local.get $4 + i64.mul + local.set $4 + local.get $5 + i32.const 1 + i32.shl + local.set $5 + br $while-continue|0 + end + end + loop $while-continue|1 + local.get $0 + i64.const 1 + i64.ge_u + local.set $2 + local.get $2 + if + local.get $0 + local.get $3 + i64.div_u + local.set $0 + local.get $5 + i32.const 1 + i32.add + local.set $5 + br $while-continue|1 + end + end + local.get $5 + i32.const 1 + i32.sub + ) + (func $~lib/util/number/utoa64_any_core (param $0 i32) (param $1 i64) (param $2 i32) (param $3 i32) + (local $4 i64) + (local $5 i64) + (local $6 i64) + (local $7 i32) + local.get $3 + i64.extend_i32_s + local.set $4 + local.get $3 + local.get $3 + i32.const 1 + i32.sub + i32.and + i32.const 0 + i32.eq + if + local.get $3 + i32.ctz + i32.const 7 + i32.and + i64.extend_i32_s + local.set $5 + local.get $4 + i64.const 1 + i64.sub + local.set $6 + loop $do-continue|0 + local.get $2 + i32.const 1 + i32.sub + local.set $2 + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + i32.const 2608 + local.get $1 + local.get $6 + i64.and + i32.wrap_i64 + i32.const 1 + i32.shl + i32.add + i32.load16_u + i32.store16 + local.get $1 + local.get $5 + i64.shr_u + local.set $1 + local.get $1 + i64.const 0 + i64.ne + local.set $7 + local.get $7 + br_if $do-continue|0 + end + else + loop $do-continue|1 + local.get $2 + i32.const 1 + i32.sub + local.set $2 + local.get $1 + local.get $4 + i64.div_u + local.set $6 + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + i32.const 2608 + local.get $1 + local.get $6 + local.get $4 + i64.mul + i64.sub + i32.wrap_i64 + i32.const 1 + i32.shl + i32.add + i32.load16_u + i32.store16 + local.get $6 + local.set $1 + local.get $1 + i64.const 0 + i64.ne + local.set $7 + local.get $7 + br_if $do-continue|1 + end + end + ) + (func $~lib/number/I32#toString (param $0 i32) (param $1 i32) (result i32) + local.get $0 + local.get $1 + call $~lib/util/number/itoa32 + ) + (func $~lib/util/number/genDigits (param $0 i32) (param $1 i64) (param $2 i32) (param $3 i64) (param $4 i32) (param $5 i64) (param $6 i32) (result i32) + (local $7 i32) + (local $8 i64) + (local $9 i64) + (local $10 i64) + (local $11 i32) + (local $12 i64) + (local $13 i32) + (local $14 i32) + (local $15 i32) + (local $16 i32) + (local $17 i32) + (local $18 i64) + (local $19 i64) + (local $20 i64) + (local $21 i64) + (local $22 i64) + (local $23 i32) + (local $24 i32) + (local $25 i32) + (local $26 i32) + (local $27 i64) + i32.const 0 + local.get $4 + i32.sub + local.set $7 + i64.const 1 + local.get $7 + i64.extend_i32_s + i64.shl + local.set $8 + local.get $8 + i64.const 1 + i64.sub + local.set $9 + local.get $3 + local.get $1 + i64.sub + local.set $10 + local.get $3 + local.get $7 + i64.extend_i32_s + i64.shr_u + i32.wrap_i64 + local.set $11 + local.get $3 + local.get $9 + i64.and + local.set $12 + local.get $11 + call $~lib/util/number/decimalCount32 + local.set $13 + local.get $6 + local.set $14 + loop $while-continue|0 + local.get $13 + i32.const 0 + i32.gt_s + local.set $15 + local.get $15 + if + block $break|1 + block $case10|1 + block $case9|1 + block $case8|1 + block $case7|1 + block $case6|1 + block $case5|1 + block $case4|1 + block $case3|1 + block $case2|1 + block $case1|1 + block $case0|1 + local.get $13 + local.set $17 + local.get $17 + i32.const 10 + i32.eq + br_if $case0|1 + local.get $17 + i32.const 9 + i32.eq + br_if $case1|1 + local.get $17 + i32.const 8 + i32.eq + br_if $case2|1 + local.get $17 + i32.const 7 + i32.eq + br_if $case3|1 + local.get $17 + i32.const 6 + i32.eq + br_if $case4|1 + local.get $17 + i32.const 5 + i32.eq + br_if $case5|1 + local.get $17 + i32.const 4 + i32.eq + br_if $case6|1 + local.get $17 + i32.const 3 + i32.eq + br_if $case7|1 + local.get $17 + i32.const 2 + i32.eq + br_if $case8|1 + local.get $17 + i32.const 1 + i32.eq + br_if $case9|1 + br $case10|1 + end + local.get $11 + i32.const 1000000000 + i32.div_u + local.set $16 + local.get $11 + i32.const 1000000000 + i32.rem_u + local.set $11 + br $break|1 + end + local.get $11 + i32.const 100000000 + i32.div_u + local.set $16 + local.get $11 + i32.const 100000000 + i32.rem_u + local.set $11 + br $break|1 + end + local.get $11 + i32.const 10000000 + i32.div_u + local.set $16 + local.get $11 + i32.const 10000000 + i32.rem_u + local.set $11 + br $break|1 + end + local.get $11 + i32.const 1000000 + i32.div_u + local.set $16 + local.get $11 + i32.const 1000000 + i32.rem_u + local.set $11 + br $break|1 + end + local.get $11 + i32.const 100000 + i32.div_u + local.set $16 + local.get $11 + i32.const 100000 + i32.rem_u + local.set $11 + br $break|1 + end + local.get $11 + i32.const 10000 + i32.div_u + local.set $16 + local.get $11 + i32.const 10000 + i32.rem_u + local.set $11 + br $break|1 + end + local.get $11 + i32.const 1000 + i32.div_u + local.set $16 + local.get $11 + i32.const 1000 + i32.rem_u + local.set $11 + br $break|1 + end + local.get $11 + i32.const 100 + i32.div_u + local.set $16 + local.get $11 + i32.const 100 + i32.rem_u + local.set $11 + br $break|1 + end + local.get $11 + i32.const 10 + i32.div_u + local.set $16 + local.get $11 + i32.const 10 + i32.rem_u + local.set $11 + br $break|1 + end + local.get $11 + local.set $16 + i32.const 0 + local.set $11 + br $break|1 + end + i32.const 0 + local.set $16 + br $break|1 + end + local.get $16 + local.get $14 + i32.or + if + local.get $0 + local.get $14 + local.tee $17 + i32.const 1 + i32.add + local.set $14 + local.get $17 + i32.const 1 + i32.shl + i32.add + i32.const 48 + local.get $16 + i32.const 65535 + i32.and + i32.add + i32.store16 + end + local.get $13 + i32.const 1 + i32.sub + local.set $13 + local.get $11 + i64.extend_i32_u + local.get $7 + i64.extend_i32_s + i64.shl + local.get $12 + i64.add + local.set $18 + local.get $18 + local.get $5 + i64.le_u + if + global.get $~lib/util/number/_K + local.get $13 + i32.add + global.set $~lib/util/number/_K + local.get $0 + local.set $23 + local.get $14 + local.set $17 + local.get $5 + local.set $22 + local.get $18 + local.set $21 + i32.const 4016 + local.get $13 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.get $7 + i64.extend_i32_s + i64.shl + local.set $20 + local.get $10 + local.set $19 + local.get $23 + local.get $17 + i32.const 1 + i32.sub + i32.const 1 + i32.shl + i32.add + local.set $24 + local.get $24 + i32.load16_u + local.set $25 + loop $while-continue|3 + local.get $21 + local.get $19 + i64.lt_u + if (result i32) + local.get $22 + local.get $21 + i64.sub + local.get $20 + i64.ge_u + else + i32.const 0 + end + if (result i32) + local.get $21 + local.get $20 + i64.add + local.get $19 + i64.lt_u + if (result i32) + i32.const 1 + else + local.get $19 + local.get $21 + i64.sub + local.get $21 + local.get $20 + i64.add + local.get $19 + i64.sub + i64.gt_u + end + else + i32.const 0 + end + local.set $26 + local.get $26 + if + local.get $25 + i32.const 1 + i32.sub + local.set $25 + local.get $21 + local.get $20 + i64.add + local.set $21 + br $while-continue|3 + end + end + local.get $24 + local.get $25 + i32.store16 + local.get $14 + return + end + br $while-continue|0 + end + end + loop $while-continue|4 + i32.const 1 + local.set $15 + local.get $15 + if + local.get $12 + i64.const 10 + i64.mul + local.set $12 + local.get $5 + i64.const 10 + i64.mul + local.set $5 + local.get $12 + local.get $7 + i64.extend_i32_s + i64.shr_u + local.set $22 + local.get $22 + local.get $14 + i64.extend_i32_s + i64.or + i64.const 0 + i64.ne + if + local.get $0 + local.get $14 + local.tee $25 + i32.const 1 + i32.add + local.set $14 + local.get $25 + i32.const 1 + i32.shl + i32.add + i32.const 48 + local.get $22 + i32.wrap_i64 + i32.const 65535 + i32.and + i32.add + i32.store16 + end + local.get $12 + local.get $9 + i64.and + local.set $12 + local.get $13 + i32.const 1 + i32.sub + local.set $13 + local.get $12 + local.get $5 + i64.lt_u + if + global.get $~lib/util/number/_K + local.get $13 + i32.add + global.set $~lib/util/number/_K + local.get $10 + i32.const 4016 + i32.const 0 + local.get $13 + i32.sub + i32.const 2 + i32.shl + i32.add + i64.load32_u + i64.mul + local.set $10 + local.get $0 + local.set $17 + local.get $14 + local.set $26 + local.get $5 + local.set $27 + local.get $12 + local.set $21 + local.get $8 + local.set $20 + local.get $10 + local.set $19 + local.get $17 + local.get $26 + i32.const 1 + i32.sub + i32.const 1 + i32.shl + i32.add + local.set $25 + local.get $25 + i32.load16_u + local.set $24 + loop $while-continue|6 + local.get $21 + local.get $19 + i64.lt_u + if (result i32) + local.get $27 + local.get $21 + i64.sub + local.get $20 + i64.ge_u + else + i32.const 0 + end + if (result i32) + local.get $21 + local.get $20 + i64.add + local.get $19 + i64.lt_u + if (result i32) + i32.const 1 + else + local.get $19 + local.get $21 + i64.sub + local.get $21 + local.get $20 + i64.add + local.get $19 + i64.sub + i64.gt_u + end + else + i32.const 0 + end + local.set $23 + local.get $23 + if + local.get $24 + i32.const 1 + i32.sub + local.set $24 + local.get $21 + local.get $20 + i64.add + local.set $21 + br $while-continue|6 + end + end + local.get $25 + local.get $24 + i32.store16 + local.get $14 + return + end + br $while-continue|4 + end + end + unreachable + ) + (func $~lib/util/number/prettify (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + local.get $2 + i32.eqz + if + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add + i32.const 46 + i32.const 48 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 2 + i32.add + return + end + local.get $1 + local.get $2 + i32.add + local.set $3 + local.get $1 + local.get $3 + i32.le_s + if (result i32) + local.get $3 + i32.const 21 + i32.le_s + else + i32.const 0 + end + if + local.get $1 + local.set $4 + loop $for-loop|0 + local.get $4 + local.get $3 + i32.lt_s + local.set $5 + local.get $5 + if + local.get $0 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.const 48 + i32.store16 + local.get $4 + i32.const 1 + i32.add + local.set $4 + br $for-loop|0 + end + end + local.get $0 + local.get $3 + i32.const 1 + i32.shl + i32.add + i32.const 46 + i32.const 48 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $3 + i32.const 2 + i32.add + return + else + local.get $3 + i32.const 0 + i32.gt_s + if (result i32) + local.get $3 + i32.const 21 + i32.le_s + else + i32.const 0 + end + if + local.get $0 + local.get $3 + i32.const 1 + i32.shl + i32.add + local.set $4 + local.get $4 + i32.const 2 + i32.add + local.get $4 + i32.const 0 + local.get $2 + i32.sub + i32.const 1 + i32.shl + call $~lib/memory/memory.copy + local.get $0 + local.get $3 + i32.const 1 + i32.shl + i32.add + i32.const 46 + i32.store16 + local.get $1 + i32.const 1 + i32.add + return + else + i32.const -6 + local.get $3 + i32.lt_s + if (result i32) + local.get $3 + i32.const 0 + i32.le_s + else + i32.const 0 + end + if + i32.const 2 + local.get $3 + i32.sub + local.set $4 + local.get $0 + local.get $4 + i32.const 1 + i32.shl + i32.add + local.get $0 + local.get $1 + i32.const 1 + i32.shl + call $~lib/memory/memory.copy + local.get $0 + i32.const 48 + i32.const 46 + i32.const 16 + i32.shl + i32.or + i32.store + i32.const 2 + local.set $5 + loop $for-loop|1 + local.get $5 + local.get $4 + i32.lt_s + local.set $6 + local.get $6 + if + local.get $0 + local.get $5 + i32.const 1 + i32.shl + i32.add + i32.const 48 + i32.store16 + local.get $5 + i32.const 1 + i32.add + local.set $5 + br $for-loop|1 + end + end + local.get $1 + local.get $4 + i32.add + return + else + local.get $1 + i32.const 1 + i32.eq + if + local.get $0 + i32.const 101 + i32.store16 offset=2 + local.get $0 + i32.const 4 + i32.add + local.set $5 + local.get $3 + i32.const 1 + i32.sub + local.set $6 + local.get $6 + i32.const 0 + i32.lt_s + local.set $4 + local.get $4 + if + i32.const 0 + local.get $6 + i32.sub + local.set $6 + end + local.get $6 + call $~lib/util/number/decimalCount32 + i32.const 1 + i32.add + local.set $7 + local.get $5 + local.set $10 + local.get $6 + local.set $9 + local.get $7 + local.set $8 + i32.const 0 + i32.const 1 + i32.ge_s + drop + local.get $10 + local.get $9 + local.get $8 + call $~lib/util/number/utoa32_dec_lut + local.get $5 + i32.const 45 + i32.const 43 + local.get $4 + select + i32.store16 + local.get $7 + local.set $1 + local.get $1 + i32.const 2 + i32.add + return + else + local.get $1 + i32.const 1 + i32.shl + local.set $7 + local.get $0 + i32.const 4 + i32.add + local.get $0 + i32.const 2 + i32.add + local.get $7 + i32.const 2 + i32.sub + call $~lib/memory/memory.copy + local.get $0 + i32.const 46 + i32.store16 offset=2 + local.get $0 + local.get $7 + i32.add + i32.const 101 + i32.store16 offset=2 + local.get $1 + local.get $0 + local.get $7 + i32.add + i32.const 4 + i32.add + local.set $9 + local.get $3 + i32.const 1 + i32.sub + local.set $8 + local.get $8 + i32.const 0 + i32.lt_s + local.set $4 + local.get $4 + if + i32.const 0 + local.get $8 + i32.sub + local.set $8 + end + local.get $8 + call $~lib/util/number/decimalCount32 + i32.const 1 + i32.add + local.set $5 + local.get $9 + local.set $11 + local.get $8 + local.set $6 + local.get $5 + local.set $10 + i32.const 0 + i32.const 1 + i32.ge_s + drop + local.get $11 + local.get $6 + local.get $10 + call $~lib/util/number/utoa32_dec_lut + local.get $9 + i32.const 45 + i32.const 43 + local.get $4 + select + i32.store16 + local.get $5 + i32.add + local.set $1 + local.get $1 + i32.const 2 + i32.add + return + end + unreachable + end + unreachable + end + unreachable + end + unreachable + ) + (func $~lib/util/number/dtoa_core (param $0 i32) (param $1 f64) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 f64) + (local $6 i64) + (local $7 i32) + (local $8 i64) + (local $9 i64) + (local $10 i32) + (local $11 i64) + (local $12 i64) + (local $13 i32) + (local $14 i32) + (local $15 i32) + (local $16 f64) + (local $17 i64) + (local $18 i64) + (local $19 i64) + (local $20 i64) + (local $21 i64) + (local $22 i64) + (local $23 i64) + (local $24 i64) + (local $25 i64) + (local $26 i32) + (local $27 i64) + (local $28 i32) + local.get $1 + f64.const 0 + f64.lt + local.set $2 + local.get $2 + if + local.get $1 + f64.neg + local.set $1 + local.get $0 + i32.const 45 + i32.store16 + end + local.get $1 + local.set $5 + local.get $0 + local.set $4 + local.get $2 + local.set $3 + local.get $5 + i64.reinterpret_f64 + local.set $6 + local.get $6 + i64.const 9218868437227405312 + i64.and + i64.const 52 + i64.shr_u + i32.wrap_i64 + local.set $7 + local.get $6 + i64.const 4503599627370495 + i64.and + local.set $8 + local.get $7 + i32.const 0 + i32.ne + i64.extend_i32_u + i64.const 52 + i64.shl + local.get $8 + i64.add + local.set $9 + local.get $7 + i32.const 1 + local.get $7 + select + i32.const 1023 + i32.const 52 + i32.add + i32.sub + local.set $7 + local.get $9 + local.set $11 + local.get $7 + local.set $10 + local.get $11 + i64.const 1 + i64.shl + i64.const 1 + i64.add + local.set $12 + local.get $10 + i32.const 1 + i32.sub + local.set $13 + local.get $12 + i64.clz + i32.wrap_i64 + local.set $14 + local.get $12 + local.get $14 + i64.extend_i32_s + i64.shl + local.set $12 + local.get $13 + local.get $14 + i32.sub + local.set $13 + i32.const 1 + local.get $11 + i64.const 4503599627370496 + i64.eq + i32.add + local.set $15 + local.get $12 + global.set $~lib/util/number/_frc_plus + local.get $11 + local.get $15 + i64.extend_i32_s + i64.shl + i64.const 1 + i64.sub + local.get $10 + local.get $15 + i32.sub + local.get $13 + i32.sub + i64.extend_i32_s + i64.shl + global.set $~lib/util/number/_frc_minus + local.get $13 + global.set $~lib/util/number/_exp + global.get $~lib/util/number/_exp + local.set $10 + i32.const -61 + local.get $10 + i32.sub + f64.convert_i32_s + f64.const 0.30102999566398114 + f64.mul + f64.const 347 + f64.add + local.set $16 + local.get $16 + i32.trunc_f64_s + local.set $15 + local.get $15 + local.get $15 + f64.convert_i32_s + local.get $16 + f64.ne + i32.add + local.set $15 + local.get $15 + i32.const 3 + i32.shr_s + i32.const 1 + i32.add + local.set $14 + i32.const 348 + local.get $14 + i32.const 3 + i32.shl + i32.sub + global.set $~lib/util/number/_K + i32.const 3144 + local.get $14 + i32.const 3 + i32.shl + i32.add + i64.load + global.set $~lib/util/number/_frc_pow + i32.const 3840 + local.get $14 + i32.const 1 + i32.shl + i32.add + i32.load16_s + global.set $~lib/util/number/_exp_pow + local.get $9 + i64.clz + i32.wrap_i64 + local.set $14 + local.get $9 + local.get $14 + i64.extend_i32_s + i64.shl + local.set $9 + local.get $7 + local.get $14 + i32.sub + local.set $7 + global.get $~lib/util/number/_frc_pow + local.set $12 + global.get $~lib/util/number/_exp_pow + local.set $15 + local.get $9 + local.set $17 + local.get $12 + local.set $11 + local.get $17 + i64.const 4294967295 + i64.and + local.set $18 + local.get $11 + i64.const 4294967295 + i64.and + local.set $19 + local.get $17 + i64.const 32 + i64.shr_u + local.set $20 + local.get $11 + i64.const 32 + i64.shr_u + local.set $21 + local.get $18 + local.get $19 + i64.mul + local.set $22 + local.get $20 + local.get $19 + i64.mul + local.get $22 + i64.const 32 + i64.shr_u + i64.add + local.set $23 + local.get $18 + local.get $21 + i64.mul + local.get $23 + i64.const 4294967295 + i64.and + i64.add + local.set $24 + local.get $24 + i64.const 2147483647 + i64.add + local.set $24 + local.get $23 + i64.const 32 + i64.shr_u + local.set $23 + local.get $24 + i64.const 32 + i64.shr_u + local.set $24 + local.get $20 + local.get $21 + i64.mul + local.get $23 + i64.add + local.get $24 + i64.add + local.set $24 + local.get $7 + local.set $10 + local.get $15 + local.set $13 + local.get $10 + local.get $13 + i32.add + i32.const 64 + i32.add + local.set $10 + global.get $~lib/util/number/_frc_plus + local.set $17 + local.get $12 + local.set $11 + local.get $17 + i64.const 4294967295 + i64.and + local.set $23 + local.get $11 + i64.const 4294967295 + i64.and + local.set $22 + local.get $17 + i64.const 32 + i64.shr_u + local.set $21 + local.get $11 + i64.const 32 + i64.shr_u + local.set $20 + local.get $23 + local.get $22 + i64.mul + local.set $19 + local.get $21 + local.get $22 + i64.mul + local.get $19 + i64.const 32 + i64.shr_u + i64.add + local.set $18 + local.get $23 + local.get $20 + i64.mul + local.get $18 + i64.const 4294967295 + i64.and + i64.add + local.set $25 + local.get $25 + i64.const 2147483647 + i64.add + local.set $25 + local.get $18 + i64.const 32 + i64.shr_u + local.set $18 + local.get $25 + i64.const 32 + i64.shr_u + local.set $25 + local.get $21 + local.get $20 + i64.mul + local.get $18 + i64.add + local.get $25 + i64.add + i64.const 1 + i64.sub + local.set $25 + global.get $~lib/util/number/_exp + local.set $26 + local.get $15 + local.set $13 + local.get $26 + local.get $13 + i32.add + i32.const 64 + i32.add + local.set $26 + global.get $~lib/util/number/_frc_minus + local.set $17 + local.get $12 + local.set $11 + local.get $17 + i64.const 4294967295 + i64.and + local.set $18 + local.get $11 + i64.const 4294967295 + i64.and + local.set $19 + local.get $17 + i64.const 32 + i64.shr_u + local.set $20 + local.get $11 + i64.const 32 + i64.shr_u + local.set $21 + local.get $18 + local.get $19 + i64.mul + local.set $22 + local.get $20 + local.get $19 + i64.mul + local.get $22 + i64.const 32 + i64.shr_u + i64.add + local.set $23 + local.get $18 + local.get $21 + i64.mul + local.get $23 + i64.const 4294967295 + i64.and + i64.add + local.set $27 + local.get $27 + i64.const 2147483647 + i64.add + local.set $27 + local.get $23 + i64.const 32 + i64.shr_u + local.set $23 + local.get $27 + i64.const 32 + i64.shr_u + local.set $27 + local.get $20 + local.get $21 + i64.mul + local.get $23 + i64.add + local.get $27 + i64.add + i64.const 1 + i64.add + local.set $27 + local.get $25 + local.get $27 + i64.sub + local.set $23 + local.get $4 + local.get $24 + local.get $10 + local.get $25 + local.get $26 + local.get $23 + local.get $3 + call $~lib/util/number/genDigits + local.set $28 + local.get $0 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $28 + local.get $2 + i32.sub + global.get $~lib/util/number/_K + call $~lib/util/number/prettify + local.set $28 + local.get $28 + local.get $2 + i32.add + ) + (func $~lib/number/F64#toString (param $0 f64) (param $1 i32) (result i32) + local.get $0 + call $~lib/util/number/dtoa + ) + (func $templateliteral/Ref#set:value (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store + ) + (func $start:templateliteral + i32.const 208 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + memory.size + i32.const 16 + i32.shl + global.get $~lib/memory/__heap_base + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 416 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 448 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace + call $templateliteral/test_string + call $templateliteral/test_integer + call $templateliteral/test_float + call $templateliteral/test_ref + ) + (func $~lib/rt/__visit_globals (param $0 i32) + (local $1 i32) + i32.const 256 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 368 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 1552 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 2608 + local.get $0 + call $~lib/rt/itcms/__visit + ) + (func $~lib/arraybuffer/ArrayBufferView~visit (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + i32.load + local.tee $2 + if + local.get $2 + local.get $1 + call $~lib/rt/itcms/__visit + end + ) + (func $~lib/staticarray/StaticArray<~lib/string/String>#__visit (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + i32.const 1 + drop + local.get $0 + local.set $2 + local.get $2 + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.add + local.set $3 + loop $while-continue|0 + local.get $2 + local.get $3 + i32.lt_u + local.set $4 + local.get $4 + if + local.get $2 + i32.load + local.set $5 + local.get $5 + if + local.get $5 + local.get $1 + call $~lib/rt/itcms/__visit + end + local.get $2 + i32.const 4 + i32.add + local.set $2 + br $while-continue|0 + end + end + ) + (func $~lib/staticarray/StaticArray<~lib/string/String>~visit (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/staticarray/StaticArray<~lib/string/String>#__visit + ) + (func $~lib/rt/__visit_members (param $0 i32) (param $1 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 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit + return + end + local.get $0 + local.get $1 + call $~lib/staticarray/StaticArray<~lib/string/String>~visit + return + end + return + end + unreachable + ) + (func $~start + call $start:templateliteral + ) + (func $~stack_check + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__data_end + i32.lt_s + if + i32.const 21056 + i32.const 21104 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (func $templateliteral/test_string + (local $0 i32) + (local $1 i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 32 + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 64 + local.tee $1 + i32.store offset=4 + i32.const 128 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=16 + local.get $2 + i32.const 1 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + i32.const 128 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=16 + local.get $2 + i32.const 96 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=20 + local.get $2 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + i32.const 32 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=12 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 4 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 624 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=16 + local.get $2 + i32.const 1 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + i32.const 624 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=16 + local.get $2 + i32.const 3 + local.get $1 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + i32.const 624 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=16 + local.get $2 + i32.const 96 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=20 + local.get $2 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + i32.const 672 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=12 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 5 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 800 + 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 800 + 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 800 + 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 848 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=12 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 6 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $templateliteral/test_integer + (local $0 i32) + (local $1 i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=16 + i32.const 1 + 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 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 13 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 2736 + 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 2736 + 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 + 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 2736 + 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 2784 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 14 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 2816 + 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 2816 + 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 + 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 2816 + 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 2864 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 15 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $templateliteral/test_float + (local $0 f64) + (local $1 f64) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=16 + f64.const 1 + local.set $0 + f64.const 2 + local.set $1 + 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 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 22 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 4112 + 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 4112 + 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 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=12 + local.get $2 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + i32.const 4112 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + i32.const 96 + 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 4160 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 23 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 4192 + 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 4192 + 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 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=12 + local.get $2 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + i32.const 4192 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + i32.const 96 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=16 + local.get $2 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + i32.const 4240 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 24 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 20 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/string/String.__concat (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.const 4352 + local.get $0 + i32.const 0 + i32.ne + select + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + local.get $1 + call $~lib/string/String#concat + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + ) + (func $templateliteral/Ref#toString (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + i32.const 4320 + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + local.get $1 + local.get $0 + i32.load + i32.const 10 + call $~lib/number/I32#toString + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + call $~lib/string/String.__concat + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $templateliteral/test_ref + (local $0 i32) + (local $1 i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 28 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=24 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 1 + call $templateliteral/Ref#constructor + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 2 + 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 4384 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=12 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 38 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 4416 + 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 4416 + 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 + 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 4416 + 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 4464 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=12 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 39 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 4512 + 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 4512 + 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 + 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 4512 + 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 4560 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=12 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 40 + 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 + ) + (func $~lib/util/string/joinStringArray (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + global.get $~lib/memory/__stack_pointer + 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 + local.get $1 + i32.const 1 + i32.sub + local.set $3 + local.get $3 + i32.const 0 + i32.lt_s + if + i32.const 96 + local.set $12 + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $12 + return + end + local.get $3 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.load + local.tee $4 + i32.store + local.get $4 + if (result i32) + local.get $4 + else + i32.const 96 + end + local.set $12 + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $12 + return + end + i32.const 0 + local.set $5 + i32.const 0 + local.set $4 + loop $for-loop|0 + local.get $4 + local.get $1 + i32.lt_s + local.set $7 + local.get $7 + if + global.get $~lib/memory/__stack_pointer + local.get $0 + local.get $4 + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $6 + i32.store offset=4 + local.get $6 + i32.const 0 + i32.ne + if + local.get $5 + local.get $6 + call $~lib/string/String#get:length + i32.add + local.set $5 + end + local.get $4 + i32.const 1 + i32.add + local.set $4 + br $for-loop|0 + end + end + i32.const 0 + local.set $8 + local.get $2 + call $~lib/string/String#get:length + local.set $9 + global.get $~lib/memory/__stack_pointer + local.get $5 + local.get $9 + local.get $3 + i32.mul + i32.add + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $10 + i32.store offset=8 + i32.const 0 + local.set $4 + loop $for-loop|1 + local.get $4 + local.get $3 + i32.lt_s + local.set $7 + local.get $7 + if + global.get $~lib/memory/__stack_pointer + local.get $0 + local.get $4 + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $6 + i32.store offset=4 + local.get $6 + i32.const 0 + i32.ne + if + local.get $6 + call $~lib/string/String#get:length + local.set $11 + local.get $10 + local.get $8 + i32.const 1 + i32.shl + i32.add + local.get $6 + local.get $11 + i32.const 1 + i32.shl + call $~lib/memory/memory.copy + local.get $8 + local.get $11 + i32.add + local.set $8 + end + local.get $9 + if + local.get $10 + local.get $8 + i32.const 1 + i32.shl + i32.add + local.get $2 + local.get $9 + i32.const 1 + i32.shl + call $~lib/memory/memory.copy + local.get $8 + local.get $9 + i32.add + local.set $8 + end + local.get $4 + i32.const 1 + i32.add + local.set $4 + br $for-loop|1 + end + end + global.get $~lib/memory/__stack_pointer + local.get $0 + local.get $3 + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $6 + i32.store offset=4 + local.get $6 + i32.const 0 + i32.ne if - i32.const 17216 - i32.const 17264 + local.get $10 + local.get $8 i32.const 1 + i32.shl + i32.add + local.get $6 + local.get $6 + call $~lib/string/String#get:length i32.const 1 - call $~lib/builtins/abort - unreachable + i32.shl + call $~lib/memory/memory.copy end + local.get $10 + local.set $12 + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $12 ) - (func $start:templateliteral - (local $0 i32) + (func $~lib/util/number/itoa32 (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 4 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store offset=8 - global.get $~lib/memory/__stack_pointer i32.const 0 - i32.store offset=16 - i32.const 288 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/toSpace - memory.size - i32.const 16 - i32.shl - global.get $~lib/memory/__heap_base - i32.sub - i32.const 1 - i32.shr_u - global.set $~lib/rt/itcms/threshold - i32.const 528 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/pinSpace - i32.const 560 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/fromSpace - i32.const 192 - local.set $0 - global.get $~lib/memory/__stack_pointer + i32.store + local.get $1 + i32.const 2 + i32.lt_s + if (result i32) + i32.const 1 + else + local.get $1 + i32.const 36 + i32.gt_s + end + if + i32.const 928 + i32.const 1056 + i32.const 373 + i32.const 5 + call $~lib/builtins/abort + unreachable + end local.get $0 - i32.store offset=8 + i32.eqz + if + i32.const 1120 + local.set $8 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $8 + return + end local.get $0 - i32.const 1 - global.get $templateliteral/a - local.set $0 + i32.const 31 + i32.shr_u + local.set $2 + local.get $2 + if + i32.const 0 + local.get $0 + i32.sub + local.set $0 + end + local.get $1 + i32.const 10 + i32.eq + if + local.get $0 + call $~lib/util/number/decimalCount32 + local.get $2 + i32.add + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $3 + i32.store + local.get $3 + local.set $7 + local.get $0 + local.set $6 + local.get $4 + local.set $5 + i32.const 0 + i32.const 1 + i32.ge_s + drop + local.get $7 + local.get $6 + local.get $5 + call $~lib/util/number/utoa32_dec_lut + else + local.get $1 + i32.const 16 + i32.eq + if + i32.const 31 + local.get $0 + i32.clz + i32.sub + i32.const 2 + i32.shr_s + i32.const 1 + i32.add + local.get $2 + i32.add + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $3 + i32.store + local.get $3 + local.set $7 + local.get $0 + local.set $6 + local.get $4 + local.set $5 + i32.const 0 + i32.const 1 + i32.ge_s + drop + local.get $7 + local.get $6 + i64.extend_i32_u + local.get $5 + call $~lib/util/number/utoa_hex_lut + else + local.get $0 + local.set $4 + local.get $4 + i64.extend_i32_u + local.get $1 + call $~lib/util/number/ulog_base + local.get $2 + i32.add + local.set $7 + global.get $~lib/memory/__stack_pointer + local.get $7 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $3 + i32.store + local.get $3 + local.get $4 + i64.extend_i32_u + local.get $7 + local.get $1 + call $~lib/util/number/utoa64_any_core + end + end + local.get $2 + if + local.get $3 + i32.const 45 + i32.store16 + end + local.get $3 + local.set $8 global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=12 - local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 192 - local.set $0 + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $8 + ) + (func $~lib/util/number/dtoa (param $0 f64) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - i32.const 3 - global.get $templateliteral/b - local.set $0 + 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.store offset=12 + f64.const 0 + f64.eq + if + i32.const 2944 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + end local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 192 - local.set $0 - global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=8 + f64.sub + f64.const 0 + f64.eq + i32.eqz + if + local.get $0 + local.get $0 + f64.ne + if + i32.const 2976 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + end + i32.const 3008 + i32.const 3056 + local.get $0 + f64.const 0 + f64.lt + select + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + end + i32.const 3088 local.get $0 - i32.const 448 - local.set $0 + call $~lib/util/number/dtoa_core + i32.const 1 + i32.shl + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $2 + i32.store + local.get $2 + i32.const 3088 + local.get $1 + call $~lib/memory/memory.copy + local.get $2 + local.set $3 global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=16 - local.get $0 - call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $0 + i32.const 4 + i32.add + 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 - local.get $0 - i32.store - local.get $0 - i32.const 672 - local.set $0 + 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.store offset=4 - local.get $0 - call $~lib/string/String.__eq i32.eqz if - i32.const 0 - i32.const 720 - i32.const 3 - i32.const 1 - call $~lib/builtins/abort - unreachable + 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 20 + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer + local.get $2 ) - (func $~lib/util/string/joinStringArray (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (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) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) global.get $~lib/memory/__stack_pointer - i32.const 12 + 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 - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store offset=8 local.get $1 - i32.const 1 - i32.sub - local.set $3 - local.get $3 i32.const 0 - i32.lt_s - if - i32.const 448 - local.set $12 - global.get $~lib/memory/__stack_pointer - i32.const 12 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $12 - return - end - local.get $3 - i32.eqz + i32.eq if global.get $~lib/memory/__stack_pointer - local.get $0 - i32.load - local.tee $4 + i32.const 4352 + local.tee $1 i32.store - local.get $4 - if (result i32) - local.get $4 - else - i32.const 448 - end - local.set $12 - global.get $~lib/memory/__stack_pointer - i32.const 12 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $12 - return - end - i32.const 0 - local.set $5 - i32.const 0 - local.set $4 - loop $for-loop|0 - local.get $4 - local.get $1 - i32.lt_s - local.set $7 - local.get $7 - if - global.get $~lib/memory/__stack_pointer - local.get $0 - local.get $4 - i32.const 2 - i32.shl - i32.add - i32.load - local.tee $6 - i32.store offset=4 - local.get $6 - i32.const 0 - i32.ne - if - local.get $5 - local.get $6 - call $~lib/string/String#get:length - i32.add - local.set $5 - end - local.get $4 - i32.const 1 - i32.add - local.set $4 - br $for-loop|0 - end end - i32.const 0 - local.set $8 - local.get $2 + local.get $0 call $~lib/string/String#get:length - local.set $9 - global.get $~lib/memory/__stack_pointer - local.get $5 - local.get $9 - local.get $3 - i32.mul - i32.add i32.const 1 i32.shl + local.set $2 + local.get $1 + call $~lib/string/String#get:length i32.const 1 - call $~lib/rt/itcms/__new - local.tee $10 - i32.store offset=8 - i32.const 0 - local.set $4 - loop $for-loop|1 - local.get $4 - local.get $3 - i32.lt_s - local.set $7 - local.get $7 - if - global.get $~lib/memory/__stack_pointer - local.get $0 - local.get $4 - i32.const 2 - i32.shl - i32.add - i32.load - local.tee $6 - i32.store offset=4 - local.get $6 - i32.const 0 - i32.ne - if - local.get $6 - call $~lib/string/String#get:length - local.set $11 - local.get $10 - local.get $8 - i32.const 1 - i32.shl - i32.add - local.get $6 - local.get $11 - i32.const 1 - i32.shl - call $~lib/memory/memory.copy - local.get $8 - local.get $11 - i32.add - local.set $8 - end - local.get $9 - if - local.get $10 - local.get $8 - i32.const 1 - i32.shl - i32.add - local.get $2 - local.get $9 - i32.const 1 - i32.shl - call $~lib/memory/memory.copy - local.get $8 - local.get $9 - i32.add - local.set $8 - end - local.get $4 - i32.const 1 - i32.add - local.set $4 - br $for-loop|1 - end - end - global.get $~lib/memory/__stack_pointer - local.get $0 - local.get $3 - i32.const 2 i32.shl + local.set $3 + local.get $2 + local.get $3 i32.add - i32.load - local.tee $6 - i32.store offset=4 - local.get $6 + local.set $4 + local.get $4 i32.const 0 - i32.ne + i32.eq if - local.get $10 - local.get $8 - i32.const 1 - i32.shl + i32.const 96 + local.set $6 + global.get $~lib/memory/__stack_pointer + i32.const 8 i32.add + global.set $~lib/memory/__stack_pointer local.get $6 - local.get $6 - call $~lib/string/String#get:length - i32.const 1 - i32.shl - call $~lib/memory/memory.copy + return end - local.get $10 - local.set $12 global.get $~lib/memory/__stack_pointer - i32.const 12 + local.get $4 + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $5 + i32.store offset=4 + 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 8 i32.add global.set $~lib/memory/__stack_pointer - local.get $12 + local.get $6 ) ) From 79fe1f9b7f735158ddce5dced461d797db9cdbd1 Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 11 Mar 2021 04:57:39 +0100 Subject: [PATCH 09/13] update tests --- .../features/reference-types.optimized.wat | 123 +++- tests/compiler/std-wasi/crypto.optimized.wat | 241 +++---- tests/compiler/std-wasi/crypto.untouched.wat | 91 +-- tests/compiler/std-wasi/process.optimized.wat | 2 +- tests/compiler/std-wasi/process.untouched.wat | 2 +- tests/compiler/templateliteral.optimized.wat | 617 +++++++++--------- tests/compiler/templateliteral.untouched.wat | 97 +-- 7 files changed, 571 insertions(+), 602 deletions(-) diff --git a/tests/compiler/features/reference-types.optimized.wat b/tests/compiler/features/reference-types.optimized.wat index 4c85c5303c..793f8f4a35 100644 --- a/tests/compiler/features/reference-types.optimized.wat +++ b/tests/compiler/features/reference-types.optimized.wat @@ -1,6 +1,7 @@ (module - (type $externref_=>_externref (func (param externref) (result externref))) (type $none_=>_none (func)) + (type $none_=>_externref (func (result externref))) + (type $externref_=>_externref (func (param externref) (result externref))) (type $externref_=>_none (func (param externref))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $externref_externref_=>_i32 (func (param externref externref) (result i32))) @@ -11,22 +12,26 @@ (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (import "console" "log" (func $~lib/bindings/console/log (param externref))) (import "Reflect" "get" (func $~lib/bindings/Reflect/get (param externref externref) (result externref))) + (import "reference-types" "somethingReal" (func $features/reference-types/somethingReal (result externref))) + (import "reference-types" "somethingNull" (func $features/reference-types/somethingNull (result externref))) (import "reference-types" "external" (func $features/reference-types/external (param externref) (result externref))) (memory $0 1) (data (i32.const 1036) "L") (data (i32.const 1048) "\01\00\00\006\00\00\00f\00e\00a\00t\00u\00r\00e\00s\00/\00r\00e\00f\00e\00r\00e\00n\00c\00e\00-\00t\00y\00p\00e\00s\00.\00t\00s") (global $features/reference-types/funcGlobal (mut funcref) (ref.null func)) + (global $features/reference-types/funcGlobalInit (mut funcref) (ref.null func)) + (global $features/reference-types/externGlobal (mut externref) (ref.null extern)) + (global $features/reference-types/anyGlobal (mut anyref) (ref.null any)) (export "external" (func $features/reference-types/external)) + (export "somethingReal" (func $features/reference-types/somethingReal)) + (export "somethingNull" (func $features/reference-types/somethingNull)) (export "internal" (func $features/reference-types/internal)) (export "memory" (memory $0)) (start $~start) - (func $features/reference-types/internal (param $0 externref) (result externref) - local.get $0 - call $features/reference-types/external - call $features/reference-types/external - call $features/reference-types/external + (func $features/reference-types/someFunc + nop ) - (func $~start + (func $start:features/reference-types global.get $features/reference-types/someObject global.get $features/reference-types/someKey call $~lib/bindings/Reflect/has @@ -34,7 +39,7 @@ if i32.const 0 i32.const 1056 - i32.const 19 + i32.const 21 i32.const 1 call $~lib/builtins/abort unreachable @@ -47,23 +52,111 @@ global.get $features/reference-types/someKey call $~lib/bindings/Reflect/get call $~lib/bindings/console/log + call $features/reference-types/somethingReal + ref.is_null + if + i32.const 0 + i32.const 1056 + i32.const 33 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + call $features/reference-types/somethingNull + ref.is_null + i32.eqz + if + i32.const 0 + i32.const 1056 + i32.const 38 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + call $features/reference-types/somethingReal + ref.is_null + if + i32.const 0 + i32.const 1056 + i32.const 43 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + call $features/reference-types/somethingNull + ref.is_null + i32.eqz + if + i32.const 0 + i32.const 1056 + i32.const 46 + i32.const 3 + call $~lib/builtins/abort + unreachable + end global.get $features/reference-types/funcGlobal ref.is_null + i32.eqz if i32.const 0 i32.const 1056 - i32.const 32 + i32.const 72 i32.const 1 call $~lib/builtins/abort unreachable end ref.null func global.set $features/reference-types/funcGlobal - i32.const 0 - i32.const 1056 - i32.const 34 - i32.const 1 - call $~lib/builtins/abort - unreachable + ref.null func + global.set $features/reference-types/funcGlobalInit + global.get $features/reference-types/externGlobal + ref.is_null + i32.eqz + if + i32.const 0 + i32.const 1056 + i32.const 79 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ref.null extern + global.set $features/reference-types/externGlobal + global.get $features/reference-types/anyGlobal + ref.is_null + i32.eqz + if + i32.const 0 + i32.const 1056 + i32.const 86 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ref.null any + global.set $features/reference-types/anyGlobal + ref.func $features/reference-types/someFunc + global.set $features/reference-types/funcGlobal + global.get $features/reference-types/funcGlobalInit + ref.is_null + if + i32.const 0 + i32.const 1056 + i32.const 108 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $features/reference-types/funcGlobal + global.set $features/reference-types/anyGlobal + ) + (func $features/reference-types/internal (param $0 externref) (result externref) + local.get $0 + call $features/reference-types/external + call $features/reference-types/external + call $features/reference-types/external + ) + (func $~start + call $start:features/reference-types ) ) diff --git a/tests/compiler/std-wasi/crypto.optimized.wat b/tests/compiler/std-wasi/crypto.optimized.wat index 94640f460f..db24d5fef1 100644 --- a/tests/compiler/std-wasi/crypto.optimized.wat +++ b/tests/compiler/std-wasi/crypto.optimized.wat @@ -201,16 +201,14 @@ (data (i32.const 4984) "\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 5068) "\1c") (data (i32.const 5080) "\01\00\00\00\02\00\00\00,") - (data (i32.const 5100) "\1c") - (data (i32.const 5112) "\01\00\00\00\08\00\00\00n\00u\00l\00l") - (data (i32.const 5164) "<") - (data (i32.const 5176) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00p\00r\00o\00c\00e\00s\00s\00.\00t\00s") - (data (i32.const 5228) "\1c") - (data (i32.const 5240) "\01\00\00\00\02\00\00\00\n") - (data (i32.const 5260) "<") - (data (i32.const 5272) "\01\00\00\00$\00\00\00s\00t\00d\00-\00w\00a\00s\00i\00/\00c\00r\00y\00p\00t\00o\00.\00t\00s") - (data (i32.const 5328) "\04\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 5356) "A\00\00\00\02") + (data (i32.const 5132) "<") + (data (i32.const 5144) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00p\00r\00o\00c\00e\00s\00s\00.\00t\00s") + (data (i32.const 5196) "\1c") + (data (i32.const 5208) "\01\00\00\00\02\00\00\00\n") + (data (i32.const 5228) "<") + (data (i32.const 5240) "\01\00\00\00$\00\00\00s\00t\00d\00-\00w\00a\00s\00i\00/\00c\00r\00y\00p\00t\00o\00.\00t\00s") + (data (i32.const 5296) "\04\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 5324) "A\00\00\00\02") (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)) @@ -225,7 +223,7 @@ (global $std-wasi/crypto/buf (mut i32) (i32.const 0)) (global $std-wasi/crypto/b1 (mut i32) (i32.const 0)) (global $std-wasi/crypto/b2 (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 21748)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 21716)) (global $~started (mut i32) (i32.const 0)) (export "memory" (memory $0)) (export "_start" (func $~start)) @@ -722,7 +720,7 @@ if i32.const 0 local.get $0 - i32.const 21748 + i32.const 21716 i32.lt_u local.get $0 i32.load offset=8 @@ -768,7 +766,7 @@ i32.const 1 else local.get $1 - i32.const 5328 + i32.const 5296 i32.load i32.gt_u if @@ -782,7 +780,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 5332 + i32.const 5300 i32.add i32.load i32.const 32 @@ -1387,10 +1385,10 @@ if unreachable end - i32.const 21760 + i32.const 21728 i32.const 0 i32.store - i32.const 23328 + i32.const 23296 i32.const 0 i32.store loop $for-loop|0 @@ -1401,7 +1399,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 21760 + i32.const 21728 i32.add i32.const 0 i32.store offset=4 @@ -1419,7 +1417,7 @@ i32.add i32.const 2 i32.shl - i32.const 21760 + i32.const 21728 i32.add i32.const 0 i32.store offset=96 @@ -1437,20 +1435,20 @@ br $for-loop|0 end end - i32.const 21760 - i32.const 23332 + i32.const 21728 + i32.const 23300 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 21760 + i32.const 21728 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/tlsf/__free (param $0 i32) (local $1 i32) (local $2 i32) local.get $0 - i32.const 21748 + i32.const 21716 i32.lt_u if return @@ -1574,7 +1572,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 21748 + i32.const 21716 i32.lt_u if local.get $0 @@ -1664,7 +1662,7 @@ unreachable end local.get $0 - i32.const 21748 + i32.const 21716 i32.lt_u if local.get $0 @@ -2919,6 +2917,71 @@ end end ) + (func $~lib/string/String.__concat (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + block $__inlined_func$~lib/string/String#concat + local.get $0 + local.tee $1 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + i32.const 1 + i32.shl + local.tee $3 + i32.const 4652 + i32.load + i32.const 1 + i32.shr_u + i32.const 1 + i32.shl + local.tee $2 + i32.add + local.tee $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 4736 + local.set $0 + br $__inlined_func$~lib/string/String#concat + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + local.get $0 + i32.const 4656 + local.get $2 + call $~lib/memory/memory.copy + local.get $0 + local.get $2 + i32.add + local.get $1 + 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 + local.get $0 + ) (func $~lib/process/writeString (param $0 i32) (local $1 i32) (local $2 i32) @@ -2971,10 +3034,10 @@ i32.const 128 i32.ge_u br_if $break|0 - i32.const 5136 - i32.const 5144 + i32.const 5104 + i32.const 5112 i32.store - i32.const 5140 + i32.const 5108 local.get $3 i32.const -1 i32.ne @@ -2989,7 +3052,7 @@ i32.ne i32.add i32.store - i32.const 5144 + i32.const 5112 local.get $2 local.get $3 i32.const 8 @@ -3005,9 +3068,9 @@ i32.or i32.store i32.const 1 - i32.const 5136 + i32.const 5104 i32.const 1 - i32.const 5148 + i32.const 5116 call $~lib/bindings/wasi_snapshot_preview1/fd_write local.tee $0 i32.const 65535 @@ -3015,7 +3078,7 @@ if local.get $0 call $~lib/bindings/wasi_snapshot_preview1/errnoToString - i32.const 5184 + i32.const 5152 i32.const 178 i32.const 16 call $~lib/wasi/index/abort @@ -3118,22 +3181,22 @@ i32.ne if i32.const 0 - i32.const 5184 + i32.const 5152 i32.const 184 i32.const 3 call $~lib/wasi/index/abort unreachable end - i32.const 5136 + i32.const 5104 local.get $1 i32.store - i32.const 5140 + i32.const 5108 local.get $2 i32.store i32.const 1 - i32.const 5136 + i32.const 5104 i32.const 1 - i32.const 5144 + i32.const 5112 call $~lib/bindings/wasi_snapshot_preview1/fd_write local.set $0 local.get $1 @@ -3144,7 +3207,7 @@ if local.get $0 call $~lib/bindings/wasi_snapshot_preview1/errnoToString - i32.const 5184 + i32.const 5152 i32.const 189 i32.const 12 call $~lib/wasi/index/abort @@ -3214,11 +3277,11 @@ ) (func $~stack_check global.get $~lib/memory/__stack_pointer - i32.const 5364 + i32.const 5332 i32.lt_s if - i32.const 21776 - i32.const 21824 + i32.const 21744 + i32.const 21792 i32.const 1 i32.const 1 call $~lib/wasi/index/abort @@ -3247,94 +3310,6 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/string/String.__concat (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 4656 - i32.store - 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 - block $__inlined_func$~lib/string/String#concat - local.get $0 - i32.eqz - if - global.get $~lib/memory/__stack_pointer - i32.const 5120 - i32.store - i32.const 5120 - local.set $0 - end - 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.const 4652 - i32.load - i32.const 1 - i32.shr_u - i32.const 1 - i32.shl - local.tee $2 - i32.add - local.tee $1 - i32.eqz - if - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 4736 - 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 offset=4 - local.get $1 - i32.const 4656 - 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 8 - i32.add - global.set $~lib/memory/__stack_pointer - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $1 - ) (func $~lib/console/console.log (param $0 i32) global.get $~lib/memory/__stack_pointer i32.const 4 @@ -3347,9 +3322,9 @@ local.get $0 call $~lib/process/writeString global.get $~lib/memory/__stack_pointer - i32.const 5248 + i32.const 5216 i32.store - i32.const 5248 + i32.const 5216 call $~lib/process/writeString global.get $~lib/memory/__stack_pointer i32.const 4 @@ -3374,7 +3349,7 @@ memory.size i32.const 16 i32.shl - i32.const 21748 + i32.const 21716 i32.sub i32.const 1 i32.shr_u @@ -3530,7 +3505,7 @@ i32.ne if i32.const 0 - i32.const 5280 + i32.const 5248 i32.const 17 i32.const 3 call $~lib/wasi/index/abort @@ -3571,7 +3546,7 @@ i32.ne if i32.const 0 - i32.const 5280 + i32.const 5248 i32.const 20 i32.const 3 call $~lib/wasi/index/abort diff --git a/tests/compiler/std-wasi/crypto.untouched.wat b/tests/compiler/std-wasi/crypto.untouched.wat index 74f12ae1e3..cef52d8a40 100644 --- a/tests/compiler/std-wasi/crypto.untouched.wat +++ b/tests/compiler/std-wasi/crypto.untouched.wat @@ -115,12 +115,11 @@ (data (i32.const 4348) "\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 5404) "\\\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 5500) "\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 5532) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\08\00\00\00n\00u\00l\00l\00\00\00\00\00") - (data (i32.const 5568) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5596) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00p\00r\00o\00c\00e\00s\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5660) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\n\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5692) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00$\00\00\00s\00t\00d\00-\00w\00a\00s\00i\00/\00c\00r\00y\00p\00t\00o\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data (i32.const 5760) "\04\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00A\00\00\00\02\00\00\00") + (data (i32.const 5536) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5564) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00p\00r\00o\00c\00e\00s\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5628) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\n\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5660) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00$\00\00\00s\00t\00d\00-\00w\00a\00s\00i\00/\00c\00r\00y\00p\00t\00o\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 5728) "\04\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00A\00\00\00\02\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -137,15 +136,15 @@ (global $std-wasi/crypto/ab (mut i32) (i32.const 0)) (global $std-wasi/crypto/buf (mut i32) (i32.const 0)) (global $~lib/process/process.stdout i32 (i32.const 1)) - (global $~lib/process/iobuf i32 (i32.const 5568)) + (global $~lib/process/iobuf i32 (i32.const 5536)) (global $~lib/builtins/i32.MAX_VALUE i32 (i32.const 2147483647)) (global $std-wasi/crypto/b1 (mut i32) (i32.const 0)) (global $std-wasi/crypto/b2 (mut i32) (i32.const 0)) (global $~argumentsLength (mut i32) (i32.const 0)) - (global $~lib/rt/__rtti_base i32 (i32.const 5760)) - (global $~lib/memory/__data_end i32 (i32.const 5796)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 22180)) - (global $~lib/memory/__heap_base i32 (i32.const 22180)) + (global $~lib/rt/__rtti_base i32 (i32.const 5728)) + (global $~lib/memory/__data_end i32 (i32.const 5764)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 22148)) + (global $~lib/memory/__heap_base i32 (i32.const 22148)) (global $~started (mut i32) (i32.const 0)) (export "memory" (memory $0)) (export "_start" (func $~start)) @@ -5329,6 +5328,11 @@ local.get $1 call $~lib/util/string/joinIntegerArray ) + (func $~lib/string/String.__concat (param $0 i32) (param $1 i32) (result i32) + local.get $0 + local.get $1 + call $~lib/string/String#concat + ) (func $~lib/string/String.UTF8.byteLength (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) @@ -5571,7 +5575,7 @@ if local.get $6 call $~lib/bindings/wasi_snapshot_preview1/errnoToString - i32.const 5616 + i32.const 5584 i32.const 178 i32.const 16 call $~lib/wasi/index/abort @@ -5598,7 +5602,7 @@ i32.eqz if i32.const 0 - i32.const 5616 + i32.const 5584 i32.const 184 i32.const 3 call $~lib/wasi/index/abort @@ -5628,7 +5632,7 @@ if local.get $9 call $~lib/bindings/wasi_snapshot_preview1/errnoToString - i32.const 5616 + i32.const 5584 i32.const 189 i32.const 12 call $~lib/wasi/index/abort @@ -5807,8 +5811,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 22208 - i32.const 22256 + i32.const 22176 + i32.const 22224 i32.const 1 i32.const 1 call $~lib/wasi/index/abort @@ -5840,36 +5844,6 @@ global.set $~lib/memory/__stack_pointer local.get $1 ) - (func $~lib/string/String.__concat (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.const 5552 - local.get $0 - i32.const 0 - i32.ne - select - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store - local.get $2 - local.get $1 - call $~lib/string/String#concat - 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/console/console.log (param $0 i32) (local $1 i32) (local $2 i32) @@ -5887,7 +5861,7 @@ local.get $0 call $~lib/process/WritableStream#write<~lib/string/String> local.get $1 - i32.const 5680 + i32.const 5648 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6080,7 +6054,7 @@ i32.eqz if i32.const 0 - i32.const 5712 + i32.const 5680 i32.const 17 i32.const 3 call $~lib/wasi/index/abort @@ -6124,7 +6098,7 @@ i32.eqz if i32.const 0 - i32.const 5712 + i32.const 5680 i32.const 20 i32.const 3 call $~lib/wasi/index/abort @@ -6752,22 +6726,13 @@ (local $5 i32) (local $6 i32) global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store - local.get $1 i32.const 0 - i32.eq - if - global.get $~lib/memory/__stack_pointer - i32.const 5552 - local.tee $1 - i32.store - end + i32.store local.get $0 call $~lib/string/String#get:length i32.const 1 @@ -6789,7 +6754,7 @@ i32.const 3712 local.set $6 global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer local.get $6 @@ -6800,7 +6765,7 @@ i32.const 1 call $~lib/rt/itcms/__new local.tee $5 - i32.store offset=4 + i32.store local.get $5 local.get $0 local.get $2 @@ -6814,7 +6779,7 @@ local.get $5 local.set $6 global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer local.get $6 diff --git a/tests/compiler/std-wasi/process.optimized.wat b/tests/compiler/std-wasi/process.optimized.wat index b6432771ad..6bb2d4436a 100644 --- a/tests/compiler/std-wasi/process.optimized.wat +++ b/tests/compiler/std-wasi/process.optimized.wat @@ -4736,7 +4736,7 @@ if i32.const 0 i32.const 4816 - i32.const 749 + i32.const 746 i32.const 7 call $~lib/wasi/index/abort unreachable diff --git a/tests/compiler/std-wasi/process.untouched.wat b/tests/compiler/std-wasi/process.untouched.wat index bc8bad5708..0fad52a6fb 100644 --- a/tests/compiler/std-wasi/process.untouched.wat +++ b/tests/compiler/std-wasi/process.untouched.wat @@ -7680,7 +7680,7 @@ if i32.const 0 i32.const 3792 - i32.const 749 + i32.const 746 i32.const 7 call $~lib/wasi/index/abort unreachable diff --git a/tests/compiler/templateliteral.optimized.wat b/tests/compiler/templateliteral.optimized.wat index ee12cbc05d..55b8e967a9 100644 --- a/tests/compiler/templateliteral.optimized.wat +++ b/tests/compiler/templateliteral.optimized.wat @@ -26,87 +26,85 @@ (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) "\1c") - (data (i32.const 1384) "\01\00\00\00\08\00\00\00n\00u\00l\00l") - (data (i32.const 1404) "<") - (data (i32.const 1416) "\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 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) "<") - (data (i32.const 1608) "\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 1660) ",") - (data (i32.const 1672) "\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 1372) "<") + (data (i32.const 1384) "\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") + (data (i32.const 1500) "<") + (data (i32.const 1512) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") + (data (i32.const 1564) "<") + (data (i32.const 1576) "\01\00\00\00$\00\00\00t\00e\00m\00p\00l\00a\00t\00e\00l\00i\00t\00e\00r\00a\00l\00.\00t\00s") + (data (i32.const 1628) ",") + (data (i32.const 1640) "\03\00\00\00\14\00\00\00`\04\00\00\00\00\00\00`\04\00\00\00\00\00\00`\04") + (data (i32.const 1676) "\1c") + (data (i32.const 1688) "\01\00\00\00\04\00\00\00a\00b") (data (i32.const 1708) "\1c") - (data (i32.const 1720) "\01\00\00\00\04\00\00\00a\00b") + (data (i32.const 1720) "\01\00\00\00\06\00\00\00(\00A\00=") (data (i32.const 1740) "\1c") - (data (i32.const 1752) "\01\00\00\00\06\00\00\00(\00A\00=") + (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\08\00\00\00,\00 \00B\00=") - (data (i32.const 1804) "\1c") - (data (i32.const 1816) "\01\00\00\00\02\00\00\00)") - (data (i32.const 1836) ",") - (data (i32.const 1848) "\03\00\00\00\14\00\00\00\e0\06\00\00\00\00\00\00\00\07\00\00\00\00\00\00 \07") - (data (i32.const 1884) ",") - (data (i32.const 1896) "\01\00\00\00\14\00\00\00(\00A\00=\00a\00,\00 \00B\00=\00b\00)") - (data (i32.const 1932) "\1c") - (data (i32.const 1944) "\03\00\00\00\0c\00\00\00`\04\00\00\00\00\00\00`\04") - (data (i32.const 1964) "|") - (data (i32.const 1976) "\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 2092) "<") - (data (i32.const 2104) "\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 2156) "\1c") - (data (i32.const 2168) "\01\00\00\00\02\00\00\000") - (data (i32.const 2188) "\\") - (data (i32.const 2200) "\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 2284) "\1c") - (data (i32.const 2296) "\01\00\00\00\02\00\00\001") - (data (i32.const 2316) ",") - (data (i32.const 2328) "\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 2364) "\1c") - (data (i32.const 2376) "\01\00\00\00\04\00\00\001\002") - (data (i32.const 2396) ",") - (data (i32.const 2408) "\03\00\00\00\14\00\00\00\e0\06\00\00\00\00\00\00\00\07\00\00\00\00\00\00 \07") - (data (i32.const 2444) ",") - (data (i32.const 2456) "\01\00\00\00\14\00\00\00(\00A\00=\001\00,\00 \00B\00=\002\00)") + (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) "\\") + (data (i32.const 2168) "\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 2252) "\1c") + (data (i32.const 2264) "\01\00\00\00\02\00\00\001") + (data (i32.const 2284) ",") + (data (i32.const 2296) "\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 2332) "\1c") + (data (i32.const 2344) "\01\00\00\00\04\00\00\001\002") + (data (i32.const 2364) ",") + (data (i32.const 2376) "\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 2412) ",") + (data (i32.const 2424) "\01\00\00\00\14\00\00\00(\00A\00=\001\00,\00 \00B\00=\002\00)") + (data (i32.const 2460) "\1c") + (data (i32.const 2472) "\03\00\00\00\0c\00\00\00`\04\00\00\00\00\00\00`\04") (data (i32.const 2492) "\1c") - (data (i32.const 2504) "\03\00\00\00\0c\00\00\00`\04\00\00\00\00\00\00`\04") + (data (i32.const 2504) "\01\00\00\00\06\00\00\000\00.\000") (data (i32.const 2524) "\1c") - (data (i32.const 2536) "\01\00\00\00\06\00\00\000\00.\000") - (data (i32.const 2556) "\1c") - (data (i32.const 2568) "\01\00\00\00\06\00\00\00N\00a\00N") - (data (i32.const 2588) ",") - (data (i32.const 2600) "\01\00\00\00\12\00\00\00-\00I\00n\00f\00i\00n\00i\00t\00y") - (data (i32.const 2636) ",") - (data (i32.const 2648) "\01\00\00\00\10\00\00\00I\00n\00f\00i\00n\00i\00t\00y") - (data (i32.const 2744) "\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#join (param $0 i32) (result i32) local.get $0 local.get $0 @@ -2262,7 +2327,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - i32.const 2176 + i32.const 2144 local.set $0 br $__inlined_func$~lib/util/number/itoa32 end @@ -2466,7 +2531,7 @@ local.get $5 i32.const 1 i32.shl - i32.const 2688 + i32.const 2656 i32.add local.get $3 i32.const 65535 @@ -2501,7 +2566,7 @@ local.get $7 i32.const 2 i32.shl - i32.const 3616 + i32.const 3584 i32.add i64.load32_u local.get $9 @@ -2511,7 +2576,7 @@ local.get $5 i32.const 1 i32.shl - i32.const 2686 + i32.const 2654 i32.add local.tee $3 i32.load16_u @@ -2589,7 +2654,7 @@ local.get $5 i32.const 1 i32.shl - i32.const 2688 + i32.const 2656 i32.add local.get $6 i32.wrap_i64 @@ -2627,7 +2692,7 @@ i32.sub i32.const 2 i32.shl - i32.const 3616 + i32.const 3584 i32.add i64.load32_u i64.mul @@ -2635,7 +2700,7 @@ local.get $5 i32.const 1 i32.shl - i32.const 2686 + i32.const 2654 i32.add local.tee $3 i32.load16_u @@ -2945,7 +3010,7 @@ f64.lt local.tee $8 if (result f64) - i32.const 2688 + i32.const 2656 i32.const 45 i32.store16 local.get $0 @@ -3045,14 +3110,14 @@ i32.sub global.set $~lib/util/number/_K local.get $7 - i32.const 2744 + i32.const 2712 i32.add i64.load global.set $~lib/util/number/_frc_pow local.get $2 i32.const 1 i32.shl - i32.const 3440 + i32.const 3408 i32.add i32.load16_s global.set $~lib/util/number/_exp_pow @@ -3084,7 +3149,7 @@ local.get $8 i32.const 1 i32.shl - i32.const 2688 + i32.const 2656 i32.add local.get $3 local.get $1 @@ -3230,7 +3295,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - i32.const 2544 + i32.const 2512 local.set $1 br $__inlined_func$~lib/util/number/dtoa end @@ -3248,7 +3313,7 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - i32.const 2576 + i32.const 2544 local.set $1 br $__inlined_func$~lib/util/number/dtoa end @@ -3256,8 +3321,8 @@ i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - i32.const 2608 - i32.const 2656 + i32.const 2576 + i32.const 2624 local.get $0 f64.const 0 f64.lt @@ -3277,7 +3342,7 @@ local.tee $1 i32.store local.get $1 - i32.const 2688 + i32.const 2656 local.get $2 call $~lib/memory/memory.copy global.get $~lib/memory/__stack_pointer @@ -3354,15 +3419,15 @@ memory.size i32.const 16 i32.shl - i32.const 20604 + i32.const 20572 i32.sub i32.const 1 i32.shr_u global.set $~lib/rt/itcms/threshold - i32.const 1472 + i32.const 1440 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/pinSpace - i32.const 1504 + i32.const 1472 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/fromSpace call $templateliteral/test_string @@ -3372,111 +3437,17 @@ ) (func $~stack_check global.get $~lib/memory/__stack_pointer - i32.const 4220 + i32.const 4188 i32.lt_s if - i32.const 20624 - i32.const 20672 + i32.const 20592 + i32.const 20640 i32.const 1 i32.const 1 call $~lib/builtins/abort unreachable end ) - (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 - call $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.const 1392 - local.get $0 - select - local.tee $2 - i32.store - 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 - block $__inlined_func$~lib/string/String#concat - local.get $1 - i32.eqz - if - global.get $~lib/memory/__stack_pointer - i32.const 1392 - i32.store - i32.const 1392 - local.set $1 - end - 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 - local.get $2 - 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 $0 - i32.eqz - if - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const 1120 - local.set $0 - br $__inlined_func$~lib/string/String#concat - end - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.const 1 - call $~lib/rt/itcms/__new - local.tee $0 - i32.store offset=4 - local.get $0 - local.get $2 - local.get $3 - call $~lib/memory/memory.copy - local.get $0 - local.get $3 - i32.add - local.get $1 - local.get $4 - call $~lib/memory/memory.copy - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $0 - ) (func $~lib/util/string/joinReferenceArray<~lib/string/String> (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) @@ -3654,89 +3625,89 @@ i32.eqz if i32.const 0 - i32.const 1616 + i32.const 1584 i32.const 4 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1680 + i32.const 1648 i32.store offset=16 - i32.const 1680 + i32.const 1648 i32.const 1 i32.const 1056 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 1680 + i32.const 1648 i32.store offset=16 - i32.const 1680 + i32.const 1648 i32.const 3 i32.const 1088 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 1680 + i32.const 1648 i32.store offset=16 global.get $~lib/memory/__stack_pointer i32.const 1120 i32.store offset=20 - i32.const 1680 + i32.const 1648 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=8 global.get $~lib/memory/__stack_pointer - i32.const 1728 + i32.const 1696 i32.store offset=12 local.get $0 - i32.const 1728 + i32.const 1696 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1616 + i32.const 1584 i32.const 5 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1856 + i32.const 1824 i32.store offset=16 - i32.const 1856 + i32.const 1824 i32.const 1 i32.const 1056 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 1856 + i32.const 1824 i32.store offset=16 - i32.const 1856 + i32.const 1824 i32.const 3 i32.const 1088 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 1856 + i32.const 1824 i32.store offset=16 global.get $~lib/memory/__stack_pointer i32.const 1120 i32.store offset=20 - i32.const 1856 + i32.const 1824 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=8 global.get $~lib/memory/__stack_pointer - i32.const 1904 + i32.const 1872 i32.store offset=12 local.get $0 - i32.const 1904 + i32.const 1872 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1616 + i32.const 1584 i32.const 6 i32.const 3 call $~lib/builtins/abort @@ -3764,7 +3735,7 @@ i32.const 0 i32.store offset=16 global.get $~lib/memory/__stack_pointer - i32.const 1952 + i32.const 1920 i32.store offset=8 i32.const 1 call $~lib/number/I32#toString @@ -3772,39 +3743,39 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 1952 + i32.const 1920 i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 1952 + i32.const 1920 i32.store offset=8 global.get $~lib/memory/__stack_pointer i32.const 1120 i32.store offset=16 - i32.const 1952 + i32.const 1920 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2304 + i32.const 2272 i32.store offset=4 local.get $0 - i32.const 2304 + i32.const 2272 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1616 + i32.const 1584 i32.const 13 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2336 + i32.const 2304 i32.store offset=8 i32.const 1 call $~lib/number/I32#toString @@ -3812,12 +3783,12 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 2336 + i32.const 2304 i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 2336 + i32.const 2304 i32.store offset=8 i32.const 2 call $~lib/number/I32#toString @@ -3825,39 +3796,39 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 2336 + i32.const 2304 i32.const 3 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 2336 + i32.const 2304 i32.store offset=8 global.get $~lib/memory/__stack_pointer i32.const 1120 i32.store offset=16 - i32.const 2336 + i32.const 2304 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2384 + i32.const 2352 i32.store offset=4 local.get $0 - i32.const 2384 + i32.const 2352 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1616 + i32.const 1584 i32.const 14 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2416 + i32.const 2384 i32.store offset=8 i32.const 1 call $~lib/number/I32#toString @@ -3865,12 +3836,12 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 2416 + i32.const 2384 i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 2416 + i32.const 2384 i32.store offset=8 i32.const 2 call $~lib/number/I32#toString @@ -3878,32 +3849,32 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 2416 + i32.const 2384 i32.const 3 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 2416 + i32.const 2384 i32.store offset=8 global.get $~lib/memory/__stack_pointer i32.const 1120 i32.store offset=16 - i32.const 2416 + i32.const 2384 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2464 + i32.const 2432 i32.store offset=4 local.get $0 - i32.const 2464 + i32.const 2432 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1616 + i32.const 1584 i32.const 15 i32.const 3 call $~lib/builtins/abort @@ -3931,7 +3902,7 @@ i32.const 0 i32.store offset=16 global.get $~lib/memory/__stack_pointer - i32.const 2512 + i32.const 2480 i32.store offset=8 f64.const 1 call $~lib/number/F64#toString @@ -3939,39 +3910,39 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 2512 + i32.const 2480 i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 2512 + i32.const 2480 i32.store offset=8 global.get $~lib/memory/__stack_pointer i32.const 1120 i32.store offset=16 - i32.const 2512 + i32.const 2480 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3680 + i32.const 3648 i32.store offset=4 local.get $0 - i32.const 3680 + i32.const 3648 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1616 + i32.const 1584 i32.const 22 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3712 + i32.const 3680 i32.store offset=8 f64.const 1 call $~lib/number/F64#toString @@ -3979,12 +3950,12 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 3712 + 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 3712 + i32.const 3680 i32.store offset=8 f64.const 2 call $~lib/number/F64#toString @@ -3992,39 +3963,39 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 3712 + i32.const 3680 i32.const 3 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 3712 + i32.const 3680 i32.store offset=8 global.get $~lib/memory/__stack_pointer i32.const 1120 i32.store offset=16 - i32.const 3712 + i32.const 3680 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3760 + i32.const 3728 i32.store offset=4 local.get $0 - i32.const 3760 + i32.const 3728 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1616 + i32.const 1584 i32.const 23 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3792 + i32.const 3760 i32.store offset=8 f64.const 1 call $~lib/number/F64#toString @@ -4032,12 +4003,12 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 3792 + i32.const 3760 i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 3792 + i32.const 3760 i32.store offset=8 f64.const 2 call $~lib/number/F64#toString @@ -4045,32 +4016,32 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 - i32.const 3792 + i32.const 3760 i32.const 3 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 3792 + i32.const 3760 i32.store offset=8 global.get $~lib/memory/__stack_pointer i32.const 1120 i32.store offset=16 - i32.const 3792 + i32.const 3760 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3840 + i32.const 3808 i32.store offset=4 local.get $0 - i32.const 3840 + i32.const 3808 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1616 + i32.const 1584 i32.const 24 i32.const 3 call $~lib/builtins/abort @@ -4091,7 +4062,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - i32.const 3920 + i32.const 3888 i32.store local.get $0 i32.load @@ -4100,7 +4071,7 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=4 - i32.const 3920 + i32.const 3888 local.get $0 call $~lib/string/String.__concat global.get $~lib/memory/__stack_pointer @@ -4140,7 +4111,7 @@ local.tee $2 i32.store offset=4 global.get $~lib/memory/__stack_pointer - i32.const 3888 + i32.const 3856 i32.store offset=16 local.get $1 call $templateliteral/Ref#toString @@ -4148,39 +4119,39 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=20 - i32.const 3888 + i32.const 3856 i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 3888 + i32.const 3856 i32.store offset=16 global.get $~lib/memory/__stack_pointer i32.const 1120 i32.store offset=24 - i32.const 3888 + i32.const 3856 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=8 global.get $~lib/memory/__stack_pointer - i32.const 3952 + i32.const 3920 i32.store offset=12 local.get $0 - i32.const 3952 + i32.const 3920 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1616 + i32.const 1584 i32.const 38 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3984 + i32.const 3952 i32.store offset=16 local.get $1 call $templateliteral/Ref#toString @@ -4188,12 +4159,12 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=20 - i32.const 3984 + i32.const 3952 i32.const 1 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 3984 + i32.const 3952 i32.store offset=16 local.get $2 call $templateliteral/Ref#toString @@ -4201,39 +4172,39 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=20 - i32.const 3984 + i32.const 3952 i32.const 3 local.get $0 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 3984 + i32.const 3952 i32.store offset=16 global.get $~lib/memory/__stack_pointer i32.const 1120 i32.store offset=24 - i32.const 3984 + i32.const 3952 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=8 global.get $~lib/memory/__stack_pointer - i32.const 4032 + i32.const 4000 i32.store offset=12 local.get $0 - i32.const 4032 + i32.const 4000 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1616 + i32.const 1584 i32.const 39 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 4080 + i32.const 4048 i32.store offset=16 local.get $1 call $templateliteral/Ref#toString @@ -4241,12 +4212,12 @@ global.get $~lib/memory/__stack_pointer local.get $1 i32.store offset=20 - i32.const 4080 + i32.const 4048 i32.const 1 local.get $1 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 4080 + i32.const 4048 i32.store offset=16 local.get $2 call $templateliteral/Ref#toString @@ -4254,32 +4225,32 @@ global.get $~lib/memory/__stack_pointer local.get $1 i32.store offset=20 - i32.const 4080 + i32.const 4048 i32.const 3 local.get $1 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset global.get $~lib/memory/__stack_pointer - i32.const 4080 + i32.const 4048 i32.store offset=16 global.get $~lib/memory/__stack_pointer i32.const 1120 i32.store offset=24 - i32.const 4080 + i32.const 4048 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $1 global.get $~lib/memory/__stack_pointer local.get $1 i32.store offset=8 global.get $~lib/memory/__stack_pointer - i32.const 4128 + i32.const 4096 i32.store offset=12 local.get $1 - i32.const 4128 + i32.const 4096 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1616 + i32.const 1584 i32.const 40 i32.const 3 call $~lib/builtins/abort diff --git a/tests/compiler/templateliteral.untouched.wat b/tests/compiler/templateliteral.untouched.wat index 6940eb0899..673cf440bc 100644 --- a/tests/compiler/templateliteral.untouched.wat +++ b/tests/compiler/templateliteral.untouched.wat @@ -66,13 +66,12 @@ (data (i32.const 4220) ",\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 4268) "\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 4300) "\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 4332) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\08\00\00\00n\00u\00l\00l\00\00\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\00r\00e\00f\00#\001\00\00\00") - (data (i32.const 4396) ",\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 4444) ",\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 4492) ",\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 4540) "<\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 4608) "\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 4332) "\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 4364) ",\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 4412) ",\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 4460) ",\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 4508) "<\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 4576) "\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) (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) @@ -92,10 +91,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 4608)) - (global $~lib/memory/__data_end i32 (i32.const 4652)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 21036)) - (global $~lib/memory/__heap_base i32 (i32.const 21036)) + (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)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/Object#get:color (param $0 i32) (result i32) @@ -5614,6 +5613,11 @@ local.get $1 i32.store ) + (func $~lib/string/String.__concat (param $0 i32) (param $1 i32) (result i32) + local.get $0 + local.get $1 + call $~lib/string/String#concat + ) (func $start:templateliteral i32.const 208 call $~lib/rt/itcms/initLazy @@ -5747,8 +5751,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 21056 - i32.const 21104 + i32.const 21024 + i32.const 21072 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6351,36 +6355,6 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/string/String.__concat (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.const 4352 - local.get $0 - i32.const 0 - i32.ne - select - local.set $2 - global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store - local.get $2 - local.get $1 - call $~lib/string/String#concat - local.set $2 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $2 - ) (func $templateliteral/Ref#toString (param $0 i32) (result i32) (local $1 i32) global.get $~lib/memory/__stack_pointer @@ -6480,7 +6454,7 @@ local.get $2 i32.store offset=8 local.get $2 - i32.const 4384 + i32.const 4352 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6496,7 +6470,7 @@ call $~lib/builtins/abort unreachable end - i32.const 4416 + i32.const 4384 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6511,7 +6485,7 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4416 + i32.const 4384 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6526,7 +6500,7 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4416 + i32.const 4384 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6544,7 +6518,7 @@ local.get $2 i32.store offset=8 local.get $2 - i32.const 4464 + i32.const 4432 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6560,7 +6534,7 @@ call $~lib/builtins/abort unreachable end - i32.const 4512 + i32.const 4480 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6575,7 +6549,7 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4512 + i32.const 4480 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6590,7 +6564,7 @@ i32.store offset=20 local.get $2 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4512 + i32.const 4480 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -6608,7 +6582,7 @@ local.get $2 i32.store offset=8 local.get $2 - i32.const 4560 + i32.const 4528 local.set $2 global.get $~lib/memory/__stack_pointer local.get $2 @@ -7129,22 +7103,13 @@ (local $5 i32) (local $6 i32) global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store - local.get $1 i32.const 0 - i32.eq - if - global.get $~lib/memory/__stack_pointer - i32.const 4352 - local.tee $1 - i32.store - end + i32.store local.get $0 call $~lib/string/String#get:length i32.const 1 @@ -7166,7 +7131,7 @@ i32.const 96 local.set $6 global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer local.get $6 @@ -7177,7 +7142,7 @@ i32.const 1 call $~lib/rt/itcms/__new local.tee $5 - i32.store offset=4 + i32.store local.get $5 local.get $0 local.get $2 @@ -7191,7 +7156,7 @@ local.get $5 local.set $6 global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer local.get $6 From 82725f9d5fb0c69b0ce6b75aa66ab6df40215b05 Mon Sep 17 00:00:00 2001 From: dcode Date: Fri, 12 Mar 2021 16:29:22 +0100 Subject: [PATCH 10/13] tags --- src/ast.ts | 37 +- src/common.ts | 1 + src/compiler.ts | 95 +++- src/extra/ast.ts | 2 +- src/parser.ts | 60 ++- src/program.ts | 10 + src/tokenizer.ts | 3 +- std/assembly/index.d.ts | 4 + std/assembly/string.ts | 4 +- tests/compiler/templateliteral.json | 1 + tests/compiler/templateliteral.optimized.wat | 522 ++++++++++++++++--- tests/compiler/templateliteral.ts | 24 + tests/compiler/templateliteral.untouched.wat | 519 +++++++++++++++++- tests/parser/literals.ts | 1 + tests/parser/literals.ts.fixture.ts | 19 +- 15 files changed, 1157 insertions(+), 145 deletions(-) diff --git a/src/ast.ts b/src/ast.ts index f45644b503..c3e345cb69 100644 --- a/src/ast.ts +++ b/src/ast.ts @@ -33,6 +33,14 @@ import { isTrivialAlphanum } from "./util"; +import { + ExpressionRef +} from "./module"; + +import { + Type +} from "./types"; + /** Indicates the kind of a node. */ export enum NodeKind { @@ -69,6 +77,7 @@ export enum NodeKind { CONSTRUCTOR, UNARYPOSTFIX, UNARYPREFIX, + COMPILED, // statements BLOCK, @@ -379,7 +388,7 @@ export abstract class Node { } static createTemplateLiteralExpression( - tag: string | null, + tag: Expression | null, parts: string[], expressions: Expression[], range: Range @@ -415,6 +424,14 @@ export abstract class Node { return new UnaryPrefixExpression(operator, operand, range); } + static createCompiledExpression( + expr: ExpressionRef, + type: Type, + range: Range + ): Expression { + return new CompiledExpression(expr, type, range); + } + // statements static createBlockStatement( @@ -1456,8 +1473,8 @@ export class SuperExpression extends IdentifierExpression { /** Represents a template literal expression. */ export class TemplateLiteralExpression extends LiteralExpression { constructor( - /** Template tag, if any. */ - public tag: string | null, + /** Tag expression, if any. */ + public tag: Expression | null, /** String parts. */ public parts: string[], /** Expression parts. */ @@ -1546,6 +1563,20 @@ export class UnaryPrefixExpression extends UnaryExpression { } } +/** Represents a special pre-compiled expression. If the expression has side-effects, special care has to be taken. */ +export class CompiledExpression extends Expression { + constructor( + /** Compiled expression. */ + public expr: ExpressionRef, + /** Type of the compiled expression. */ + public type: Type, + /** Source range. */ + range: Range + ) { + super(NodeKind.COMPILED, range); + } +} + // statements /** Base class of all statement nodes. */ diff --git a/src/common.ts b/src/common.ts index 55ad0eee06..0beb11c26b 100644 --- a/src/common.ts +++ b/src/common.ts @@ -222,6 +222,7 @@ export namespace CommonNames { export const Uint64Array = "Uint64Array"; export const Float32Array = "Float32Array"; export const Float64Array = "Float64Array"; + export const TemplateStringsArray = "TemplateStringsArray"; export const Error = "Error"; // runtime export const abort = "abort"; diff --git a/src/compiler.ts b/src/compiler.ts index 747530d045..cc7f80a19a 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -170,7 +170,9 @@ import { TemplateLiteralExpression, UnaryPostfixExpression, UnaryPrefixExpression, + CompiledExpression, + TypeNode, NamedTypeNode, findDecorator, @@ -1878,8 +1880,15 @@ export class Compiler extends DiagnosticEmitter { return segment; } - /** Ensures that a string exists in static memory and returns a pointer to it. Deduplicates. */ + /** Ensures that a string exists in static memory and returns a pointer expression. Deduplicates. */ ensureStaticString(stringValue: string): ExpressionRef { + var ptr = this.ensureStaticStringPtr(stringValue); + this.currentType = this.program.stringInstance.type; + return this.module.usize(ptr); + } + + /** Ensures that a string exists in static memory and returns a pointer to it. Deduplicates. */ + ensureStaticStringPtr(stringValue: string): i64 { var program = this.program; var totalOverhead = program.totalOverhead; var stringInstance = assert(program.stringInstance); @@ -1896,14 +1905,7 @@ export class Compiler extends DiagnosticEmitter { stringSegment = this.addRuntimeMemorySegment(buf); segments.set(stringValue, stringSegment); } - var ptr = i64_add(stringSegment.offset, i64_new(totalOverhead)); - this.currentType = stringInstance.type; - if (this.options.isWasm64) { - return this.module.i64(i64_low(ptr), i64_high(ptr)); - } else { - assert(i64_is_u32(ptr)); - return this.module.i32(i64_low(ptr)); - } + return i64_add(stringSegment.offset, i64_new(totalOverhead)); } /** Writes a series of static values of the specified type to a buffer. */ @@ -1997,10 +1999,13 @@ export class Compiler extends DiagnosticEmitter { private addStaticArrayHeader( elementType: Type, bufferSegment: MemorySegment, - arrayPrototype: ClassPrototype = this.program.arrayPrototype + /** Optional array instance override. */ + arrayInstance: Class | null = null ): MemorySegment { var program = this.program; - var arrayInstance = assert(this.resolver.resolveClass(arrayPrototype, [ elementType ])); + if (!arrayInstance) { + arrayInstance = assert(this.resolver.resolveClass(this.program.arrayPrototype, [ elementType ])); + } var bufferLength = readI32(bufferSegment.buffer, program.OBJECTInstance.offsetof("rtSize")); var arrayLength = i32(bufferLength / elementType.byteSize); var bufferAddress = i64_add(bufferSegment.offset, i64_new(program.totalOverhead)); @@ -3473,6 +3478,12 @@ export class Compiler extends DiagnosticEmitter { expr = this.compileUnaryPrefixExpression(expression, contextualType, constraints); break; } + case NodeKind.COMPILED: { + let compiled = expression; + expr = compiled.expr; + this.currentType = compiled.type; + break; + } default: { assert(false); expr = this.module.unreachable(); @@ -6374,6 +6385,35 @@ export class Compiler extends DiagnosticEmitter { ); } + /** Compiles the given arguments like a call expression according to the specified context. */ + private compileCallExpressionLike( + /** Called expression. */ + expression: Expression, + /** Call type arguments. */ + typeArguments: TypeNode[] | null, + /** Call arguments. */ + args: Expression[], + /** Diagnostic range. */ + range: Range, + /** Contextual type indicating the return type the caller expects, if any. */ + contextualType: Type, + /** Constraints indicating contextual conditions. */ + constraints: Constraints = Constraints.NONE + ): ExpressionRef { + // Desugaring like this can happen many times. Let's cache the intermediate allocation. + var call = this._reusableCallExpression; + if (call) { + call.expression = expression; + call.typeArguments = typeArguments; + call.args = args; + call.range = range; + } else { + this._reusableCallExpression = call = Node.createCallExpression(expression, typeArguments, args, range); + } + return this.compileCallExpression(call, contextualType, constraints); + } + private _reusableCallExpression: CallExpression | null = null; + private compileCallExpressionBuiltin( prototype: FunctionPrototype, expression: CallExpression, @@ -8021,7 +8061,7 @@ export class Compiler extends DiagnosticEmitter { var expressions = expression.expressions; assert(numParts - 1 == expressions.length); - // Shortcut if just a string + // Shortcut if just a (multi-line) string if (tag === null && numParts == 1) { return this.ensureStaticString(parts[0]); } @@ -8066,13 +8106,32 @@ export class Compiler extends DiagnosticEmitter { return module.flatten(stmts, stringType.toNativeType()); } - // TODO - this.error( - DiagnosticCode.Not_implemented_0, - expression.range, "Tagged template literals" + // Otherwise compile to a call to the tag function + var flow = this.currentFlow; + var target = this.resolver.lookupExpression(tag, flow); // reports + if (!target) { + this.currentType = this.program.stringInstance.type; + return module.unreachable(); + } + var partExprs = new Array(numParts); + for (let i = 0; i < numParts; ++i) { + partExprs[i] = this.ensureStaticString(parts[i]); + } + var arrayInstance = this.program.templateStringsArrayInstance; + var bufferSegment = this.addStaticBuffer(this.options.usizeType, partExprs); + var headerSegment = this.addStaticArrayHeader(stringType, bufferSegment, arrayInstance); + arrayInstance.writeField("raw", this.ensureStaticStringPtr(""), headerSegment.buffer); // TODO + + // Desugar to compileCallExpression + var args = expressions.slice(); + args.unshift( + Node.createCompiledExpression( + module.usize(i64_add(headerSegment.offset, i64_new(this.program.totalOverhead))), + arrayInstance.type, + this.program.nativeRange + ) ); - this.currentType = this.program.stringInstance.type; - return this.module.unreachable(); + return this.compileCallExpressionLike(tag, null, args, expression.range, stringType); } private compileArrayLiteral( diff --git a/src/extra/ast.ts b/src/extra/ast.ts index c9148daa7f..c0fe3781ca 100644 --- a/src/extra/ast.ts +++ b/src/extra/ast.ts @@ -784,7 +784,7 @@ export class ASTBuilder { var tag = node.tag; var parts = node.parts; var expressions = node.expressions; - if (tag !== null) sb.push(tag); + if (tag) this.visitNode(tag); sb.push("`"); this.visitRawString(parts[0], CharCode.BACKTICK); assert(parts.length == expressions.length + 1); diff --git a/src/parser.ts b/src/parser.ts index 2fc77db358..43fee92b8e 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -3767,6 +3767,9 @@ export class Parser extends DiagnosticEmitter { let identifierText = tn.readIdentifier(); if (identifierText == "null") return Node.createNullExpression(tn.range()); // special let identifier = Node.createIdentifierExpression(identifierText, tn.range(startPos, tn.pos)); + if (tn.skip(Token.TEMPLATELITERAL)) { + return this.parseTemplateLiteral(tn, identifier); + } if (tn.peek(true) == Token.EQUALS_GREATERTHAN && !tn.nextTokenOnNewLine) { return this.parseFunctionExpressionCommon( tn, @@ -3800,28 +3803,8 @@ export class Parser extends DiagnosticEmitter { case Token.STRINGLITERAL: { return Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos)); } - case Token.TEMPLATELITERAL: - case Token.TAGGEDTEMPLATELITERAL: { - let isTaggedTemplate = token == Token.TAGGEDTEMPLATELITERAL; - let tag: string | null = null; - if (isTaggedTemplate) tag = tn.readIdentifier(); - let parts = new Array(); - parts.push(tn.readString(0, isTaggedTemplate)); - let exprs = new Array(); - while (tn.readingTemplateString) { - let expr = this.parseExpression(tn); - if (!expr) return null; - exprs.push(expr); - if (!tn.skip(Token.CLOSEBRACE)) { - this.error( - DiagnosticCode._0_expected, - tn.range(), "}" - ); - return null; - } - parts.push(tn.readString(CharCode.BACKTICK, isTaggedTemplate)); - } - return Node.createTemplateLiteralExpression(tag, parts, exprs, tn.range(startPos, tn.pos)); + case Token.TEMPLATELITERAL: { + return this.parseTemplateLiteral(tn); } case Token.INTEGERLITERAL: { let value = tn.readInteger(); @@ -4096,7 +4079,12 @@ export class Parser extends DiagnosticEmitter { return null; } } - expr = this.maybeParseCallExpression(tn, expr, true); + if (tn.skip(Token.TEMPLATELITERAL)) { + expr = this.parseTemplateLiteral(tn, expr); + if (!expr) return null; + } else { + expr = this.maybeParseCallExpression(tn, expr, true); + } break; } // BinaryExpression (right associative) @@ -4152,6 +4140,28 @@ export class Parser extends DiagnosticEmitter { return expr; } + private parseTemplateLiteral(tn: Tokenizer, tag: Expression | null = null): Expression | null { + // at '`': ... '`' + var startPos = tag ? tag.range.start : tn.tokenPos; + var parts = new Array(); + var exprs = new Array(); + parts.push(tn.readString(0, tag != null)); + while (tn.readingTemplateString) { + let expr = this.parseExpression(tn); + if (!expr) return null; + exprs.push(expr); + if (!tn.skip(Token.CLOSEBRACE)) { + this.error( + DiagnosticCode._0_expected, + tn.range(), "}" + ); + return null; + } + parts.push(tn.readString(CharCode.BACKTICK, tag != null)); + } + return Node.createTemplateLiteralExpression(tag, parts, exprs, tn.range(startPos, tn.pos)); + } + private joinPropertyCall( tn: Tokenizer, startPos: i32, @@ -4229,7 +4239,8 @@ export class Parser extends DiagnosticEmitter { tn.readIdentifier(); break; } - case Token.STRINGLITERAL: { + case Token.STRINGLITERAL: + case Token.TEMPLATELITERAL: { tn.readString(); break; } @@ -4249,6 +4260,7 @@ export class Parser extends DiagnosticEmitter { } } } while (true); + tn.readingTemplateString = false; } /** Skips over a block on errors in an attempt to reduce unnecessary diagnostic noise. */ diff --git a/src/program.ts b/src/program.ts index 4e2be13705..833a9682d4 100644 --- a/src/program.ts +++ b/src/program.ts @@ -449,6 +449,8 @@ export class Program extends DiagnosticEmitter { diagnosticsOffset: i32 = 0; /** Special native code source. */ nativeSource: Source; + /** Special native code range. */ + get nativeRange(): Range { return this.nativeSource.range; } /** Special native code file. */ nativeFile!: File; /** Next class id. */ @@ -629,6 +631,14 @@ export class Program extends DiagnosticEmitter { } private _stringInstance: Class | null = null; + /** Gets the standard `TemplateStringsArray` instance. */ + get templateStringsArrayInstance(): Class { + var cached = this._templateStringsArrayInstance; + if (!cached) this._templateStringsArrayInstance = cached = this.requireClass(CommonNames.TemplateStringsArray); + return cached; + } + private _templateStringsArrayInstance: Class | null = null; + /** Gets the standard `abort` instance, if not explicitly disabled. */ get abortInstance(): Function | null { var prototype = this.lookup(CommonNames.abort); diff --git a/src/tokenizer.ts b/src/tokenizer.ts index 648b285b5d..7bd7ee3924 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -163,7 +163,6 @@ export enum Token { INTEGERLITERAL, FLOATLITERAL, TEMPLATELITERAL, - TAGGEDTEMPLATELITERAL, // meta @@ -929,7 +928,7 @@ export class Tokenizer extends DiagnosticEmitter { } } this.pos = posBefore; - return c == CharCode.BACKTICK ? Token.TAGGEDTEMPLATELITERAL : Token.IDENTIFIER; + return Token.IDENTIFIER; } else if (isWhiteSpace(c)) { ++pos; break; diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index 89ca2f76be..e20e571775 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -1687,6 +1687,10 @@ declare namespace String { } } +declare class TemplateStringsArray extends Array { + readonly raw: string; +} + declare class Object { /** The Object.is() method determines whether two values are the same value. */ static is(value1: T, value2: T): bool; diff --git a/std/assembly/string.ts b/std/assembly/string.ts index 05a8d579e7..659e90e4b2 100644 --- a/std/assembly/string.ts +++ b/std/assembly/string.ts @@ -818,8 +818,6 @@ export namespace String { } } -/* eslint-disable @typescript-eslint/no-unused-vars */ - -class TemplateStringsArray extends Array { +export class TemplateStringsArray extends Array { readonly raw: string; } diff --git a/tests/compiler/templateliteral.json b/tests/compiler/templateliteral.json index 73d40f91f2..65091e5197 100644 --- a/tests/compiler/templateliteral.json +++ b/tests/compiler/templateliteral.json @@ -1,4 +1,5 @@ { "asc_flags": [ + "--explicitStart" ] } \ No newline at end of file diff --git a/tests/compiler/templateliteral.optimized.wat b/tests/compiler/templateliteral.optimized.wat index 55b8e967a9..82b8fe0223 100644 --- a/tests/compiler/templateliteral.optimized.wat +++ b/tests/compiler/templateliteral.optimized.wat @@ -1,13 +1,13 @@ (module (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_i32_=>_none (func (param i32 i32))) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_none (func (param i32))) + (type $none_=>_i32 (func (result i32))) (type $f64_=>_i32 (func (param f64) (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 (func (param i32 i32 i32) (result i32))) (type $i64_i32_i64_i32_i64_i32_=>_i32 (func (param i64 i32 i64 i32 i64 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) @@ -103,8 +103,28 @@ (data (i32.const 4040) "\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 4076) "<") (data (i32.const 4088) "\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 4144) "\05\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 4172) "\04A\00\00\00\00\00\00 ") + (data (i32.const 4140) "\1c") + (data (i32.const 4156) "\08\00\00\00 \04\00\00@\04") + (data (i32.const 4172) ",") + (data (i32.const 4184) "\05\00\00\00\14\00\00\00@\10\00\00@\10\00\00\08\00\00\00\02\00\00\00`\04") + (data (i32.const 4220) ",") + (data (i32.const 4232) "\01\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") + (data (i32.const 4268) "|") + (data (i32.const 4280) "\01\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y") + (data (i32.const 4396) "\1c") + (data (i32.const 4408) "\01\00\00\00\06\00\00\00a\001\00b") + (data (i32.const 4428) "\1c") + (data (i32.const 4440) "\01\00\00\00\02\00\00\00c") + (data (i32.const 4460) "\1c") + (data (i32.const 4472) "\01\00\00\00\02\00\00\00d") + (data (i32.const 4492) "\1c") + (data (i32.const 4508) "\08\00\00\00`\11\00\00\80\11") + (data (i32.const 4524) ",") + (data (i32.const 4536) "\05\00\00\00\14\00\00\00\a0\11\00\00\a0\11\00\00\08\00\00\00\02\00\00\00`\04") + (data (i32.const 4572) "\1c") + (data (i32.const 4584) "\01\00\00\00\06\00\00\00c\002\00d") + (data (i32.const 4608) "\07\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 4636) "\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A\00\00\06\00\00\00\02A") (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)) @@ -121,9 +141,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/memory/__stack_pointer (mut i32) (i32.const 20572)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 21052)) + (global $~started (mut i32) (i32.const 0)) (export "memory" (memory $0)) - (start $~start) + (export "_start" (func $~start)) (func $~lib/rt/itcms/Object#set:next (param $0 i32) (param $1 i32) local.get $0 local.get $1 @@ -195,7 +216,7 @@ if i32.const 0 local.get $0 - i32.const 20572 + i32.const 21052 i32.lt_u local.get $0 i32.load offset=8 @@ -241,7 +262,7 @@ i32.const 1 else local.get $1 - i32.const 4144 + i32.const 4608 i32.load i32.gt_u if @@ -255,7 +276,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 4148 + i32.const 4612 i32.add i32.load i32.const 32 @@ -338,6 +359,8 @@ (local $1 i32) i32.const 1280 call $~lib/rt/itcms/__visit + i32.const 4288 + call $~lib/rt/itcms/__visit i32.const 1392 call $~lib/rt/itcms/__visit i32.const 2176 @@ -981,10 +1004,10 @@ if unreachable end - i32.const 20576 + i32.const 21056 i32.const 0 i32.store - i32.const 22144 + i32.const 22624 i32.const 0 i32.store loop $for-loop|0 @@ -995,7 +1018,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 20576 + i32.const 21056 i32.add i32.const 0 i32.store offset=4 @@ -1013,7 +1036,7 @@ i32.add i32.const 2 i32.shl - i32.const 20576 + i32.const 21056 i32.add i32.const 0 i32.store offset=96 @@ -1031,13 +1054,13 @@ br $for-loop|0 end end - i32.const 20576 - i32.const 22148 + i32.const 21056 + i32.const 22628 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 20576 + i32.const 21056 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1116,7 +1139,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 20572 + i32.const 21052 i32.lt_u if local.get $0 @@ -1206,7 +1229,7 @@ unreachable end local.get $0 - i32.const 20572 + i32.const 21052 i32.lt_u if local.get $0 @@ -1229,7 +1252,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 20572 + i32.const 21052 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -3352,74 +3375,129 @@ end local.get $1 ) + (func $~lib/array/Array<~lib/string/String>#__visit (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + i32.load offset=4 + local.tee $1 + local.get $0 + i32.load offset=12 + i32.const 2 + i32.shl + i32.add + local.set $2 + loop $while-continue|0 + local.get $1 + local.get $2 + i32.lt_u + if + local.get $1 + i32.load + local.tee $3 + if + local.get $3 + call $~lib/rt/itcms/__visit + end + local.get $1 + i32.const 4 + i32.add + local.set $1 + br $while-continue|0 + end + end + local.get $0 + i32.load + call $~lib/rt/itcms/__visit + ) (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 + block $~lib/array/Array<~lib/string/String> + block $~lib/string/TemplateStringsArray + 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 $~lib/string/TemplateStringsArray $~lib/array/Array<~lib/string/String> $invalid + end + return + end + return + end + local.get $0 + i32.load + local.tee $0 + if 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 + call $~lib/rt/itcms/__visit end return end - return - end - local.get $0 - i32.load - local.tee $0 - if local.get $0 - call $~lib/rt/itcms/__visit + 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 local.get $0 + call $~lib/array/Array<~lib/string/String>#__visit 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 + call $~lib/array/Array<~lib/string/String>#__visit return end + local.get $0 + call $~lib/array/Array<~lib/string/String>#__visit return end unreachable ) (func $~start + (local $0 i32) + global.get $~started + if + return + end + i32.const 1 + global.set $~started i32.const 1232 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/toSpace memory.size i32.const 16 i32.shl - i32.const 20572 + i32.const 21052 i32.sub i32.const 1 i32.shr_u @@ -3434,14 +3512,75 @@ call $templateliteral/test_integer call $templateliteral/test_float call $templateliteral/test_ref + global.get $~lib/memory/__stack_pointer + 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 + global.get $~lib/memory/__stack_pointer + i32.const 4192 + i32.store offset=8 + call $templateliteral/tag + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4416 + i32.store offset=4 + local.get $0 + i32.const 4416 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1584 + i32.const 63 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4544 + i32.store offset=8 + call $templateliteral/ns.tag + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4592 + i32.store offset=4 + local.get $0 + i32.const 4592 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1584 + i32.const 64 + 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 ) (func $~stack_check global.get $~lib/memory/__stack_pointer - i32.const 4188 + i32.const 4668 i32.lt_s if - i32.const 20592 - i32.const 20640 + i32.const 21072 + i32.const 21120 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4261,6 +4400,216 @@ i32.add global.set $~lib/memory/__stack_pointer ) + (func $templateliteral/tag (result i32) + (local $0 i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + i32.const 4204 + i32.load + i32.const 2 + i32.ne + if + i32.const 0 + i32.const 1584 + i32.const 45 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 4192 + i32.const 0 + call $~lib/array/Array<~lib/string/String>#__get + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=4 + local.get $0 + i32.const 1056 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1584 + i32.const 46 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 4192 + i32.const 1 + call $~lib/array/Array<~lib/string/String>#__get + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1088 + i32.store offset=4 + local.get $0 + i32.const 1088 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1584 + i32.const 47 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 4192 + i32.const 0 + call $~lib/array/Array<~lib/string/String>#__get + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + i32.const 1 + call $~lib/number/I32#toString + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=12 + local.get $0 + local.get $1 + call $~lib/string/String.__concat + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + i32.const 4192 + i32.const 1 + call $~lib/array/Array<~lib/string/String>#__get + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $0 + local.get $1 + call $~lib/string/String.__concat + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $templateliteral/ns.tag (result i32) + (local $0 i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + i32.const 4556 + i32.load + i32.const 2 + i32.ne + if + i32.const 0 + i32.const 1584 + i32.const 54 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + i32.const 4544 + i32.const 0 + call $~lib/array/Array<~lib/string/String>#__get + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4448 + i32.store offset=4 + local.get $0 + i32.const 4448 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1584 + i32.const 55 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + i32.const 4544 + i32.const 1 + call $~lib/array/Array<~lib/string/String>#__get + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4480 + i32.store offset=4 + local.get $0 + i32.const 4480 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1584 + i32.const 56 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + i32.const 4544 + i32.const 0 + call $~lib/array/Array<~lib/string/String>#__get + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + i32.const 2 + call $~lib/number/I32#toString + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=12 + local.get $0 + local.get $1 + call $~lib/string/String.__concat + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + i32.const 4544 + i32.const 1 + call $~lib/array/Array<~lib/string/String>#__get + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $0 + local.get $1 + call $~lib/string/String.__concat + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + ) (func $templateliteral/Ref#constructor (param $0 i32) (result i32) (local $1 i32) global.get $~lib/memory/__stack_pointer @@ -4286,4 +4635,51 @@ global.set $~lib/memory/__stack_pointer local.get $1 ) + (func $~lib/array/Array<~lib/string/String>#__get (param $0 i32) (param $1 i32) (result 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 $1 + local.get $0 + i32.load offset=12 + i32.ge_u + if + i32.const 1280 + i32.const 4240 + i32.const 92 + i32.const 42 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.load offset=4 + local.get $1 + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $0 + i32.store + local.get $0 + i32.eqz + if + i32.const 4288 + i32.const 4240 + i32.const 96 + i32.const 40 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) ) diff --git a/tests/compiler/templateliteral.ts b/tests/compiler/templateliteral.ts index 485255b39f..b2a4bd27e3 100644 --- a/tests/compiler/templateliteral.ts +++ b/tests/compiler/templateliteral.ts @@ -40,3 +40,27 @@ function test_ref(): void { assert(`(A=${a}, B=${b})` == "(A=ref#1, B=ref#2)"); } test_ref(); + +function tag(parts: TemplateStringsArray, a: i32): string { + assert(parts.length == 2); + assert(parts[0] == "a"); + assert(parts[1] == "b"); + assert(a == 1); + return parts[0] + a.toString() + parts[1]; +} + +namespace ns { + export function tag(parts: string[] /* ! */, a: i32): string { + assert(parts.length == 2); + assert(parts[0] == "c"); + assert(parts[1] == "d"); + assert(a == 2); + return parts[0] + a.toString() + parts[1]; + } +} + +function test_tag(): void { + assert(tag`a${1}b` == "a1b"); + assert(ns.tag`c${2}d` == "c2d"); +} +test_tag(); diff --git a/tests/compiler/templateliteral.untouched.wat b/tests/compiler/templateliteral.untouched.wat index 673cf440bc..d43e95093a 100644 --- a/tests/compiler/templateliteral.untouched.wat +++ b/tests/compiler/templateliteral.untouched.wat @@ -71,7 +71,17 @@ (data (i32.const 4412) ",\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 4460) ",\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 4508) "<\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 4576) "\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 4572) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\08\00\00\00 \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\05\00\00\00\14\00\00\00\f0\11\00\00\f0\11\00\00\08\00\00\00\02\00\00\00`\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 4652) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") + (data (i32.const 4700) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 4828) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\001\00b\00\00\00\00\00\00\00") + (data (i32.const 4860) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00c\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 4892) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00d\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 4924) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\08\00\00\00\10\13\00\000\13\00\00\00\00\00\00") + (data (i32.const 4956) ",\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\14\00\00\00P\13\00\00P\13\00\00\08\00\00\00\02\00\00\00`\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5004) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00c\002\00d\00\00\00\00\00\00\00") + (data (i32.const 5040) "\07\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A\00\00\06\00\00\00\02A\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) @@ -91,12 +101,13 @@ (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 5040)) + (global $~lib/memory/__data_end i32 (i32.const 5100)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 21484)) + (global $~lib/memory/__heap_base i32 (i32.const 21484)) + (global $~started (mut i32) (i32.const 0)) (export "memory" (memory $0)) - (start $~start) + (export "_start" (func $~start)) (func $~lib/rt/itcms/Object#get:color (param $0 i32) (result i32) local.get $0 i32.load offset=4 @@ -5618,6 +5629,10 @@ local.get $1 call $~lib/string/String#concat ) + (func $~lib/array/Array<~lib/string/String>#get:length (param $0 i32) (result i32) + local.get $0 + i32.load offset=12 + ) (func $start:templateliteral i32.const 208 call $~lib/rt/itcms/initLazy @@ -5640,12 +5655,16 @@ call $templateliteral/test_integer call $templateliteral/test_float call $templateliteral/test_ref + call $templateliteral/test_tag ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) i32.const 256 local.get $0 call $~lib/rt/itcms/__visit + i32.const 4720 + local.get $0 + call $~lib/rt/itcms/__visit i32.const 368 local.get $0 call $~lib/rt/itcms/__visit @@ -5712,38 +5731,114 @@ local.get $1 call $~lib/staticarray/StaticArray<~lib/string/String>#__visit ) + (func $~lib/array/Array<~lib/string/String>#__visit (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + i32.const 1 + drop + local.get $0 + i32.load offset=4 + local.set $2 + local.get $2 + local.get $0 + i32.load offset=12 + i32.const 2 + i32.shl + i32.add + local.set $3 + loop $while-continue|0 + local.get $2 + local.get $3 + i32.lt_u + local.set $4 + local.get $4 + if + local.get $2 + i32.load + local.set $5 + local.get $5 + if + local.get $5 + local.get $1 + call $~lib/rt/itcms/__visit + end + local.get $2 + i32.const 4 + i32.add + local.set $2 + br $while-continue|0 + end + end + local.get $0 + i32.load + local.get $1 + call $~lib/rt/itcms/__visit + ) + (func $~lib/string/TemplateStringsArray~visit (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/array/Array<~lib/string/String>~visit + local.get $0 + local.get $1 + call $~lib/array/Array<~lib/string/String>#__visit + ) + (func $~lib/array/Array<~lib/string/String>~visit (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/array/Array<~lib/string/String>#__visit + ) (func $~lib/rt/__visit_members (param $0 i32) (param $1 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 + block $~lib/array/Array<~lib/string/String> + block $~lib/string/TemplateStringsArray + 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 $~lib/string/TemplateStringsArray $~lib/array/Array<~lib/string/String> $invalid + end + return + end + return end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit return end + local.get $0 + local.get $1 + call $~lib/staticarray/StaticArray<~lib/string/String>~visit return end - local.get $0 - local.get $1 - call $~lib/arraybuffer/ArrayBufferView~visit return end local.get $0 local.get $1 - call $~lib/staticarray/StaticArray<~lib/string/String>~visit + call $~lib/string/TemplateStringsArray~visit return end + local.get $0 + local.get $1 + call $~lib/array/Array<~lib/string/String>~visit return end unreachable ) (func $~start + global.get $~started + if + return + end + i32.const 1 + global.set $~started call $start:templateliteral ) (func $~stack_check @@ -5751,8 +5846,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 21024 - i32.const 21072 + i32.const 21504 + i32.const 21552 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6603,6 +6698,330 @@ i32.add global.set $~lib/memory/__stack_pointer ) + (func $templateliteral/tag (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + local.get $0 + call $~lib/array/Array<~lib/string/String>#get:length + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 45 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 0 + call $~lib/array/Array<~lib/string/String>#__get + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + i32.const 32 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 46 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 1 + call $~lib/array/Array<~lib/string/String>#__get + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + i32.const 64 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 47 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 48 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 0 + call $~lib/array/Array<~lib/string/String>#__get + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + local.get $1 + i32.const 10 + call $~lib/number/I32#toString + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=12 + local.get $2 + call $~lib/string/String.__concat + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + local.get $0 + i32.const 1 + call $~lib/array/Array<~lib/string/String>#__get + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String.__concat + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + ) + (func $templateliteral/ns.tag (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + local.get $0 + call $~lib/array/Array<~lib/string/String>#get:length + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 54 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 0 + call $~lib/array/Array<~lib/string/String>#__get + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + i32.const 4880 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 55 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 1 + call $~lib/array/Array<~lib/string/String>#__get + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + i32.const 4912 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 56 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 57 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 0 + call $~lib/array/Array<~lib/string/String>#__get + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + local.get $1 + i32.const 10 + call $~lib/number/I32#toString + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=12 + local.get $2 + call $~lib/string/String.__concat + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + local.get $0 + i32.const 1 + call $~lib/array/Array<~lib/string/String>#__get + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String.__concat + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + ) + (func $templateliteral/test_tag + (local $0 i32) + global.get $~lib/memory/__stack_pointer + 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 4624 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + i32.const 1 + call $templateliteral/tag + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 4848 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 63 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 4976 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + i32.const 2 + call $templateliteral/ns.tag + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 5024 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 64 + 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 + ) (func $~lib/util/string/joinStringArray (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) @@ -7161,4 +7580,60 @@ global.set $~lib/memory/__stack_pointer local.get $6 ) + (func $~lib/array/Array<~lib/string/String>#__get (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $1 + local.get $0 + i32.load offset=12 + i32.ge_u + if + i32.const 256 + i32.const 4672 + i32.const 92 + i32.const 42 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.load offset=4 + local.get $1 + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $2 + i32.store + i32.const 1 + drop + i32.const 0 + i32.eqz + drop + local.get $2 + i32.eqz + if + i32.const 4720 + i32.const 4672 + i32.const 96 + i32.const 40 + call $~lib/builtins/abort + unreachable + end + local.get $2 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + ) ) diff --git a/tests/parser/literals.ts b/tests/parser/literals.ts index a073ac2669..1f445aeb77 100644 --- a/tests/parser/literals.ts +++ b/tests/parser/literals.ts @@ -79,6 +79,7 @@ `\``; `\`${a}\`${b}\``; tag`123`; +ns.tag`123`; tag`\unicode\xGG\u\x`; // see https://tc39.es/proposal-template-literal-revision/ // invalid diff --git a/tests/parser/literals.ts.fixture.ts b/tests/parser/literals.ts.fixture.ts index 19a569c698..8f7d004851 100644 --- a/tests/parser/literals.ts.fixture.ts +++ b/tests/parser/literals.ts.fixture.ts @@ -79,6 +79,7 @@ `\``; `\`${a}\`${b}\``; tag`123`; +ns.tag`123`; tag`\\unicode\\xGG\\u\\x`; 4; b; @@ -96,13 +97,13 @@ c; d; a; b; -// ERROR 1109: "Expression expected." in literals.ts(85,4+1) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(86,2+0) +// ERROR 1109: "Expression expected." in literals.ts(86,4+1) // ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(87,2+0) -// ERROR 1109: "Expression expected." in literals.ts(88,3+1) -// ERROR 6188: "Numeric separators are not allowed here." in literals.ts(90,2+0) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(91,3+0) -// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(92,4+0) -// ERROR 1125: "Hexadecimal digit expected." in literals.ts(93,4+1) -// ERROR 1125: "Hexadecimal digit expected." in literals.ts(93,12+1) -// ERROR 1125: "Hexadecimal digit expected." in literals.ts(93,16+1) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(88,2+0) +// ERROR 1109: "Expression expected." in literals.ts(89,3+1) +// ERROR 6188: "Numeric separators are not allowed here." in literals.ts(91,2+0) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(92,3+0) +// ERROR 1351: "An identifier or keyword cannot immediately follow a numeric literal." in literals.ts(93,4+0) +// ERROR 1125: "Hexadecimal digit expected." in literals.ts(94,4+1) +// ERROR 1125: "Hexadecimal digit expected." in literals.ts(94,12+1) +// ERROR 1125: "Hexadecimal digit expected." in literals.ts(94,16+1) From 92490f7912f4df35aa0246e8ef6e14453f1a2beb Mon Sep 17 00:00:00 2001 From: dcode Date: Sun, 14 Mar 2021 00:42:22 +0100 Subject: [PATCH 11/13] detect TSAs, fixes --- src/ast.ts | 5 +- src/compiler.ts | 65 ++- src/parser.ts | 5 +- src/tokenizer.ts | 14 +- std/assembly/index.d.ts | 2 +- std/assembly/string.ts | 2 +- tests/compiler/templateliteral.optimized.wat | 449 ++++++++++++--- tests/compiler/templateliteral.ts | 28 +- tests/compiler/templateliteral.untouched.wat | 562 +++++++++++++++---- 9 files changed, 927 insertions(+), 205 deletions(-) diff --git a/src/ast.ts b/src/ast.ts index c3e345cb69..38114d8fae 100644 --- a/src/ast.ts +++ b/src/ast.ts @@ -390,10 +390,11 @@ export abstract class Node { static createTemplateLiteralExpression( tag: Expression | null, parts: string[], + rawParts: string[], expressions: Expression[], range: Range ): TemplateLiteralExpression { - return new TemplateLiteralExpression(tag, parts, expressions, range); + return new TemplateLiteralExpression(tag, parts, rawParts, expressions, range); } static createThisExpression( @@ -1477,6 +1478,8 @@ export class TemplateLiteralExpression extends LiteralExpression { public tag: Expression | null, /** String parts. */ public parts: string[], + /** Raw string parts. */ + public rawParts: string[], /** Expression parts. */ public expressions: Expression[], /** Source range. */ diff --git a/src/compiler.ts b/src/compiler.ts index cc7f80a19a..ca2bb41692 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8106,27 +8106,70 @@ export class Compiler extends DiagnosticEmitter { return module.flatten(stmts, stringType.toNativeType()); } - // Otherwise compile to a call to the tag function - var flow = this.currentFlow; - var target = this.resolver.lookupExpression(tag, flow); // reports - if (!target) { - this.currentType = this.program.stringInstance.type; - return module.unreachable(); + // Try to find out whether the template function takes a full-blown TemplateStringsArray or if + // it is sufficient to compile to a normal array. While technically incorrect, this allows us + // to avoid generating unnecessary static data that is not explicitly signaled to be used. + var tsaArrayInstance = this.program.templateStringsArrayInstance; + var arrayInstance = tsaArrayInstance; + var target = this.resolver.lookupExpression(tag, this.currentFlow, Type.auto, ReportMode.SWALLOW); + if (target) { + switch (target.kind) { + case ElementKind.FUNCTION_PROTOTYPE: { + let instance = this.resolver.resolveFunction(target, null, uniqueMap(), ReportMode.SWALLOW); + if (!instance) break; + target = instance; + // fall-through + } + case ElementKind.FUNCTION: { + let instance = target; + let parameterTypes = instance.signature.parameterTypes; + if (parameterTypes.length) { + let first = parameterTypes[0].getClass(); + if (first !== null && !first.extends(tsaArrayInstance.prototype)) { + arrayInstance = assert(this.resolver.resolveClass(this.program.arrayPrototype, [ stringType ])); + } + } + break; + } + } } + + // Compile to a call to the tag function + var rawParts = expression.rawParts; + assert(rawParts.length == numParts); var partExprs = new Array(numParts); for (let i = 0; i < numParts; ++i) { partExprs[i] = this.ensureStaticString(parts[i]); } - var arrayInstance = this.program.templateStringsArrayInstance; - var bufferSegment = this.addStaticBuffer(this.options.usizeType, partExprs); - var headerSegment = this.addStaticArrayHeader(stringType, bufferSegment, arrayInstance); - arrayInstance.writeField("raw", this.ensureStaticStringPtr(""), headerSegment.buffer); // TODO + var arraySegment: MemorySegment; + if (arrayInstance == tsaArrayInstance) { + var rawExprs = new Array(numParts); + for (let i = 0; i < numParts; ++i) { + rawExprs[i] = this.ensureStaticString(rawParts[i]); + } + arraySegment = this.addStaticArrayHeader(stringType, + this.addStaticBuffer(this.options.usizeType, partExprs), + arrayInstance + ); + var rawHeaderSegment = this.addStaticArrayHeader(stringType, + this.addStaticBuffer(this.options.usizeType, rawExprs) + ); + arrayInstance.writeField("raw", + i64_add(rawHeaderSegment.offset, i64_new(this.program.totalOverhead)), + arraySegment.buffer + ); + } else { + arraySegment = this.addStaticArrayHeader(stringType, + this.addStaticBuffer(this.options.usizeType, partExprs), + arrayInstance + ); + } // Desugar to compileCallExpression var args = expressions.slice(); args.unshift( Node.createCompiledExpression( - module.usize(i64_add(headerSegment.offset, i64_new(this.program.totalOverhead))), + module.usize(i64_add(arraySegment.offset, i64_new(this.program.totalOverhead))), arrayInstance.type, this.program.nativeRange ) diff --git a/src/parser.ts b/src/parser.ts index 43fee92b8e..10bda6f48a 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -4144,8 +4144,10 @@ export class Parser extends DiagnosticEmitter { // at '`': ... '`' var startPos = tag ? tag.range.start : tn.tokenPos; var parts = new Array(); + var rawParts = new Array(); var exprs = new Array(); parts.push(tn.readString(0, tag != null)); + rawParts.push(tn.source.text.substring(tn.readStringStart, tn.readStringEnd)); while (tn.readingTemplateString) { let expr = this.parseExpression(tn); if (!expr) return null; @@ -4158,8 +4160,9 @@ export class Parser extends DiagnosticEmitter { return null; } parts.push(tn.readString(CharCode.BACKTICK, tag != null)); + rawParts.push(tn.source.text.substring(tn.readStringStart, tn.readStringEnd)); } - return Node.createTemplateLiteralExpression(tag, parts, exprs, tn.range(startPos, tn.pos)); + return Node.createTemplateLiteralExpression(tag, parts, rawParts, exprs, tn.range(startPos, tn.pos)); } private joinPropertyCall( diff --git a/src/tokenizer.ts b/src/tokenizer.ts index 7bd7ee3924..e535d06ffa 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -1059,6 +1059,8 @@ export class Tokenizer extends DiagnosticEmitter { } readingTemplateString: bool = false; + readStringStart: i32 = 0; + readStringEnd: i32 = 0; readString(quote: i32 = 0, isTaggedTemplate: bool = false): string { var text = this.source.text; @@ -1066,6 +1068,7 @@ export class Tokenizer extends DiagnosticEmitter { var pos = this.pos; if (!quote) quote = text.charCodeAt(pos++); var start = pos; + this.readStringStart = start; var result = ""; while (true) { @@ -1075,10 +1078,12 @@ export class Tokenizer extends DiagnosticEmitter { DiagnosticCode.Unterminated_string_literal, this.range(start - 1, end) ); + this.readStringEnd = end; break; } let c = text.charCodeAt(pos); if (c == quote) { + this.readStringEnd = pos; result += text.substring(start, pos++); break; } @@ -1093,6 +1098,7 @@ export class Tokenizer extends DiagnosticEmitter { if (quote == CharCode.BACKTICK) { if (c == CharCode.DOLLAR && pos + 1 < end && text.charCodeAt(pos + 1) == CharCode.OPENBRACE) { result += text.substring(start, pos); + this.readStringEnd = pos; this.pos = pos + 2; this.readingTemplateString = true; return result; @@ -1103,6 +1109,7 @@ export class Tokenizer extends DiagnosticEmitter { DiagnosticCode.Unterminated_string_literal, this.range(start - 1, pos) ); + this.readStringEnd = pos; break; } ++pos; @@ -1603,12 +1610,11 @@ export class Tokenizer extends DiagnosticEmitter { value = (value << 4) + c + (10 - CharCode.A); } else if (c >= CharCode.a && c <= CharCode.f) { value = (value << 4) + c + (10 - CharCode.a); + } else if (~startIfTaggedTemplate) { + this.pos = --pos; + return text.substring(startIfTaggedTemplate, pos); } else { this.pos = pos; - if (~startIfTaggedTemplate) { - remain = 1; // invalid - break; - } this.error( DiagnosticCode.Hexadecimal_digit_expected, this.range(pos - 1, pos) diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index e20e571775..ea8688ccbf 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -1688,7 +1688,7 @@ declare namespace String { } declare class TemplateStringsArray extends Array { - readonly raw: string; + readonly raw: string[]; } declare class Object { diff --git a/std/assembly/string.ts b/std/assembly/string.ts index 659e90e4b2..1007790ca4 100644 --- a/std/assembly/string.ts +++ b/std/assembly/string.ts @@ -819,5 +819,5 @@ export namespace String { } export class TemplateStringsArray extends Array { - readonly raw: string; + readonly raw: string[]; } diff --git a/tests/compiler/templateliteral.optimized.wat b/tests/compiler/templateliteral.optimized.wat index 82b8fe0223..f90c1a2739 100644 --- a/tests/compiler/templateliteral.optimized.wat +++ b/tests/compiler/templateliteral.optimized.wat @@ -1,7 +1,7 @@ (module (type $none_=>_none (func)) - (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_=>_i32 (func (param i32) (result i32))) + (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_none (func (param i32))) @@ -106,25 +106,57 @@ (data (i32.const 4140) "\1c") (data (i32.const 4156) "\08\00\00\00 \04\00\00@\04") (data (i32.const 4172) ",") - (data (i32.const 4184) "\05\00\00\00\14\00\00\00@\10\00\00@\10\00\00\08\00\00\00\02\00\00\00`\04") - (data (i32.const 4220) ",") - (data (i32.const 4232) "\01\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") - (data (i32.const 4268) "|") - (data (i32.const 4280) "\01\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y") - (data (i32.const 4396) "\1c") - (data (i32.const 4408) "\01\00\00\00\06\00\00\00a\001\00b") - (data (i32.const 4428) "\1c") - (data (i32.const 4440) "\01\00\00\00\02\00\00\00c") - (data (i32.const 4460) "\1c") - (data (i32.const 4472) "\01\00\00\00\02\00\00\00d") - (data (i32.const 4492) "\1c") - (data (i32.const 4508) "\08\00\00\00`\11\00\00\80\11") - (data (i32.const 4524) ",") - (data (i32.const 4536) "\05\00\00\00\14\00\00\00\a0\11\00\00\a0\11\00\00\08\00\00\00\02\00\00\00`\04") + (data (i32.const 4184) "\05\00\00\00\14\00\00\00@\10\00\00@\10\00\00\08\00\00\00\02\00\00\00\b0\10") + (data (i32.const 4220) "\1c") + (data (i32.const 4236) "\08\00\00\00 \04\00\00@\04") + (data (i32.const 4252) ",") + (data (i32.const 4264) "\06\00\00\00\10\00\00\00\90\10\00\00\90\10\00\00\08\00\00\00\02") + (data (i32.const 4300) ",") + (data (i32.const 4312) "\01\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") + (data (i32.const 4348) "|") + (data (i32.const 4360) "\01\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y") + (data (i32.const 4476) "\1c") + (data (i32.const 4488) "\01\00\00\00\06\00\00\00a\001\00b") + (data (i32.const 4508) "\1c") + (data (i32.const 4520) "\01\00\00\00\02\00\00\00r") + (data (i32.const 4540) "\1c") + (data (i32.const 4552) "\01\00\00\00\02\00\00\00d") (data (i32.const 4572) "\1c") - (data (i32.const 4584) "\01\00\00\00\06\00\00\00c\002\00d") - (data (i32.const 4608) "\07\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 4636) "\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A\00\00\06\00\00\00\02A") + (data (i32.const 4588) "\0c\00\00\00\b0\11\00\00\d0\11\00\00`\04") + (data (i32.const 4604) ",") + (data (i32.const 4616) "\06\00\00\00\10\00\00\00\f0\11\00\00\f0\11\00\00\0c\00\00\00\03") + (data (i32.const 4652) "\1c") + (data (i32.const 4664) "\01\00\00\00\08\00\00\00r\002\00d\002") + (data (i32.const 4684) "\1c") + (data (i32.const 4700) "\04\00\00\00`\04") + (data (i32.const 4716) ",") + (data (i32.const 4728) "\05\00\00\00\14\00\00\00`\12\00\00`\12\00\00\04\00\00\00\01\00\00\00\d0\12") + (data (i32.const 4764) "\1c") + (data (i32.const 4780) "\04\00\00\00`\04") + (data (i32.const 4796) ",") + (data (i32.const 4808) "\06\00\00\00\10\00\00\00\b0\12\00\00\b0\12\00\00\04\00\00\00\01") + (data (i32.const 4844) "\1c") + (data (i32.const 4856) "\01\00\00\00\04\00\00\00\\\00u") + (data (i32.const 4876) "\1c") + (data (i32.const 4892) "\04\00\00\00\00\13") + (data (i32.const 4908) ",") + (data (i32.const 4920) "\05\00\00\00\14\00\00\00 \13\00\00 \13\00\00\04\00\00\00\01\00\00\00\90\13") + (data (i32.const 4956) "\1c") + (data (i32.const 4972) "\04\00\00\00\00\13") + (data (i32.const 4988) ",") + (data (i32.const 5000) "\06\00\00\00\10\00\00\00p\13\00\00p\13\00\00\04\00\00\00\01") + (data (i32.const 5036) "\1c") + (data (i32.const 5048) "\01\00\00\00\06\00\00\00\\\00u\001") + (data (i32.const 5068) "\1c") + (data (i32.const 5084) "\04\00\00\00\c0\13") + (data (i32.const 5100) ",") + (data (i32.const 5112) "\05\00\00\00\14\00\00\00\e0\13\00\00\e0\13\00\00\04\00\00\00\01\00\00\00P\14") + (data (i32.const 5148) "\1c") + (data (i32.const 5164) "\04\00\00\00\c0\13") + (data (i32.const 5180) ",") + (data (i32.const 5192) "\06\00\00\00\10\00\00\000\14\00\000\14\00\00\04\00\00\00\01") + (data (i32.const 5232) "\07\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 5260) "\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A\00\00\06\00\00\00\02A") (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)) @@ -141,7 +173,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 21052)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 21676)) (global $~started (mut i32) (i32.const 0)) (export "memory" (memory $0)) (export "_start" (func $~start)) @@ -216,7 +248,7 @@ if i32.const 0 local.get $0 - i32.const 21052 + i32.const 21676 i32.lt_u local.get $0 i32.load offset=8 @@ -262,7 +294,7 @@ i32.const 1 else local.get $1 - i32.const 4608 + i32.const 5232 i32.load i32.gt_u if @@ -276,7 +308,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 4612 + i32.const 5236 i32.add i32.load i32.const 32 @@ -359,7 +391,7 @@ (local $1 i32) i32.const 1280 call $~lib/rt/itcms/__visit - i32.const 4288 + i32.const 4368 call $~lib/rt/itcms/__visit i32.const 1392 call $~lib/rt/itcms/__visit @@ -1004,10 +1036,10 @@ if unreachable end - i32.const 21056 + i32.const 21680 i32.const 0 i32.store - i32.const 22624 + i32.const 23248 i32.const 0 i32.store loop $for-loop|0 @@ -1018,7 +1050,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 21056 + i32.const 21680 i32.add i32.const 0 i32.store offset=4 @@ -1036,7 +1068,7 @@ i32.add i32.const 2 i32.shl - i32.const 21056 + i32.const 21680 i32.add i32.const 0 i32.store offset=96 @@ -1054,13 +1086,13 @@ br $for-loop|0 end end - i32.const 21056 - i32.const 22628 + i32.const 21680 + i32.const 23252 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 21056 + i32.const 21680 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1139,7 +1171,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 21052 + i32.const 21676 i32.lt_u if local.get $0 @@ -1229,7 +1261,7 @@ unreachable end local.get $0 - i32.const 21052 + i32.const 21676 i32.lt_u if local.get $0 @@ -1252,7 +1284,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 21052 + i32.const 21676 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -3497,7 +3529,7 @@ memory.size i32.const 16 i32.shl - i32.const 21052 + i32.const 21676 i32.sub i32.const 1 i32.shr_u @@ -3532,22 +3564,22 @@ local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 4416 + i32.const 4496 i32.store offset=4 local.get $0 - i32.const 4416 + i32.const 4496 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1584 - i32.const 63 + i32.const 70 i32.const 3 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 4544 + i32.const 4624 i32.store offset=8 call $templateliteral/ns.tag local.set $0 @@ -3555,16 +3587,16 @@ local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 4592 + i32.const 4672 i32.store offset=4 local.get $0 - i32.const 4592 + i32.const 4672 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1584 - i32.const 64 + i32.const 71 i32.const 3 call $~lib/builtins/abort unreachable @@ -3573,14 +3605,15 @@ i32.const 12 i32.add global.set $~lib/memory/__stack_pointer + call $templateliteral/test_raw ) (func $~stack_check global.get $~lib/memory/__stack_pointer - i32.const 4668 + i32.const 5292 i32.lt_s if - i32.const 21072 - i32.const 21120 + i32.const 21696 + i32.const 21744 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4404,7 +4437,7 @@ (local $0 i32) (local $1 i32) global.get $~lib/memory/__stack_pointer - i32.const 16 + i32.const 20 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check @@ -4414,6 +4447,14 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 4208 + i32.load + local.tee $0 + i32.store i32.const 4204 i32.load i32.const 2 @@ -4421,7 +4462,19 @@ if i32.const 0 i32.const 1584 - i32.const 45 + i32.const 46 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.load offset=12 + i32.const 2 + i32.ne + if + i32.const 0 + i32.const 1584 + i32.const 47 i32.const 3 call $~lib/builtins/abort unreachable @@ -4429,21 +4482,43 @@ i32.const 4192 i32.const 0 call $~lib/array/Array<~lib/string/String>#__get - local.set $0 + local.set $1 global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store + local.get $1 + i32.store offset=4 global.get $~lib/memory/__stack_pointer i32.const 1056 - i32.store offset=4 + i32.store offset=8 + local.get $1 + i32.const 1056 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1584 + i32.const 48 + i32.const 3 + call $~lib/builtins/abort + unreachable + end local.get $0 + i32.const 0 + call $~lib/array/Array<~lib/string/String>#__get + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=8 + local.get $1 i32.const 1056 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1584 - i32.const 46 + i32.const 49 i32.const 3 call $~lib/builtins/abort unreachable @@ -4451,13 +4526,35 @@ i32.const 4192 i32.const 1 call $~lib/array/Array<~lib/string/String>#__get + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 1088 + i32.store offset=8 + local.get $1 + i32.const 1088 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1584 + i32.const 50 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 1 + call $~lib/array/Array<~lib/string/String>#__get local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store + i32.store offset=4 global.get $~lib/memory/__stack_pointer i32.const 1088 - i32.store offset=4 + i32.store offset=8 local.get $0 i32.const 1088 call $~lib/string/String.__eq @@ -4465,7 +4562,7 @@ if i32.const 0 i32.const 1584 - i32.const 47 + i32.const 51 i32.const 3 call $~lib/builtins/abort unreachable @@ -4476,32 +4573,32 @@ local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=8 + i32.store offset=12 i32.const 1 call $~lib/number/I32#toString local.set $1 global.get $~lib/memory/__stack_pointer local.get $1 - i32.store offset=12 + i32.store offset=16 local.get $0 local.get $1 call $~lib/string/String.__concat local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store + i32.store offset=4 i32.const 4192 i32.const 1 call $~lib/array/Array<~lib/string/String>#__get local.set $1 global.get $~lib/memory/__stack_pointer local.get $1 - i32.store offset=4 + i32.store offset=8 local.get $0 local.get $1 call $~lib/string/String.__concat global.get $~lib/memory/__stack_pointer - i32.const 16 + i32.const 20 i32.add global.set $~lib/memory/__stack_pointer ) @@ -4509,7 +4606,7 @@ (local $0 i32) (local $1 i32) global.get $~lib/memory/__stack_pointer - i32.const 16 + i32.const 24 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check @@ -4519,19 +4616,57 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store offset=8 - i32.const 4556 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=16 + block $__inlined_func$~lib/rt/__instanceof (result i32) + i32.const 4616 + i32.load + local.tee $0 + i32.const 5232 + i32.load + i32.le_u + if + loop $do-continue|0 + i32.const 1 + local.get $0 + i32.const 5 + i32.eq + br_if $__inlined_func$~lib/rt/__instanceof + drop + local.get $0 + i32.const 3 + i32.shl + i32.const 5236 + i32.add + i32.load offset=4 + local.tee $0 + br_if $do-continue|0 + end + end + i32.const 0 + end + if + i32.const 0 + i32.const 1584 + i32.const 58 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + i32.const 4636 i32.load - i32.const 2 + i32.const 3 i32.ne if i32.const 0 i32.const 1584 - i32.const 54 + i32.const 59 i32.const 5 call $~lib/builtins/abort unreachable end - i32.const 4544 + i32.const 4624 i32.const 0 call $~lib/array/Array<~lib/string/String>#__get local.set $0 @@ -4539,21 +4674,21 @@ local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 4448 + i32.const 4528 i32.store offset=4 local.get $0 - i32.const 4448 + i32.const 4528 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1584 - i32.const 55 + i32.const 60 i32.const 5 call $~lib/builtins/abort unreachable end - i32.const 4544 + i32.const 4624 i32.const 1 call $~lib/array/Array<~lib/string/String>#__get local.set $0 @@ -4561,52 +4696,204 @@ local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 4480 + i32.const 4560 i32.store offset=4 local.get $0 - i32.const 4480 + i32.const 4560 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1584 - i32.const 56 + i32.const 61 i32.const 5 call $~lib/builtins/abort unreachable end - i32.const 4544 + i32.const 4624 + i32.const 2 + call $~lib/array/Array<~lib/string/String>#__get + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1120 + i32.store offset=4 + local.get $0 + i32.const 1120 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1584 + i32.const 62 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + i32.const 4624 i32.const 0 call $~lib/array/Array<~lib/string/String>#__get local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=8 + i32.store offset=16 i32.const 2 call $~lib/number/I32#toString local.set $1 global.get $~lib/memory/__stack_pointer local.get $1 - i32.store offset=12 + i32.store offset=20 local.get $0 local.get $1 call $~lib/string/String.__concat local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store - i32.const 4544 + i32.store offset=8 + i32.const 4624 i32.const 1 call $~lib/array/Array<~lib/string/String>#__get local.set $1 global.get $~lib/memory/__stack_pointer local.get $1 + i32.store offset=12 + local.get $0 + local.get $1 + call $~lib/string/String.__concat + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + i32.const 2 + call $~lib/number/I32#toString + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 i32.store offset=4 local.get $0 local.get $1 call $~lib/string/String.__concat global.get $~lib/memory/__stack_pointer - i32.const 16 + i32.const 24 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $templateliteral/raw (param $0 i32) (result 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 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.load offset=16 + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1120 + i32.store offset=4 + local.get $0 + i32.load offset=4 + local.get $0 + i32.load offset=12 + call $~lib/util/string/joinReferenceArray<~lib/string/String> + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $templateliteral/test_raw + (local $0 i32) + global.get $~lib/memory/__stack_pointer + 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 + global.get $~lib/memory/__stack_pointer + i32.const 4736 + i32.store offset=8 + i32.const 4736 + call $templateliteral/raw + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1120 + i32.store offset=4 + local.get $0 + i32.const 1120 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1584 + i32.const 80 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4928 + i32.store offset=8 + i32.const 4928 + call $templateliteral/raw + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4864 + i32.store offset=4 + local.get $0 + i32.const 4864 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1584 + i32.const 81 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 5120 + i32.store offset=8 + i32.const 5120 + call $templateliteral/raw + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 5056 + i32.store offset=4 + local.get $0 + i32.const 5056 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1584 + i32.const 82 + 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 ) @@ -4650,7 +4937,7 @@ i32.ge_u if i32.const 1280 - i32.const 4240 + i32.const 4320 i32.const 92 i32.const 42 call $~lib/builtins/abort @@ -4669,8 +4956,8 @@ local.get $0 i32.eqz if - i32.const 4288 - i32.const 4240 + i32.const 4368 + i32.const 4320 i32.const 96 i32.const 40 call $~lib/builtins/abort diff --git a/tests/compiler/templateliteral.ts b/tests/compiler/templateliteral.ts index b2a4bd27e3..3ee42b38d0 100644 --- a/tests/compiler/templateliteral.ts +++ b/tests/compiler/templateliteral.ts @@ -42,25 +42,43 @@ function test_ref(): void { test_ref(); function tag(parts: TemplateStringsArray, a: i32): string { + var raw = parts.raw; assert(parts.length == 2); + assert(raw.length == 2); assert(parts[0] == "a"); + assert(raw[0] == "a"); assert(parts[1] == "b"); + assert(raw[1] == "b"); assert(a == 1); return parts[0] + a.toString() + parts[1]; } namespace ns { - export function tag(parts: string[] /* ! */, a: i32): string { - assert(parts.length == 2); - assert(parts[0] == "c"); + export function tag(parts: string[] /* ! */, a: i32, b: i32): string { + assert(!(parts instanceof TemplateStringsArray)); // optimized away + assert(parts.length == 3); + assert(parts[0] == "r"); assert(parts[1] == "d"); + assert(parts[2] == ""); assert(a == 2); - return parts[0] + a.toString() + parts[1]; + assert(b == 2); + return parts[0] + a.toString() + parts[1] + b.toString(); } } function test_tag(): void { assert(tag`a${1}b` == "a1b"); - assert(ns.tag`c${2}d` == "c2d"); + assert(ns.tag`r${2}d${2}` == "r2d2"); } test_tag(); + +function raw(parts: TemplateStringsArray): string { + return parts.raw.join(""); +} + +function test_raw(): void { + assert(raw`` == ""); + assert(raw`\u` == "\\u"); + assert(raw`\u1` == "\\u1"); +} +test_raw(); diff --git a/tests/compiler/templateliteral.untouched.wat b/tests/compiler/templateliteral.untouched.wat index d43e95093a..7dd36335d6 100644 --- a/tests/compiler/templateliteral.untouched.wat +++ b/tests/compiler/templateliteral.untouched.wat @@ -72,16 +72,32 @@ (data (i32.const 4460) ",\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 4508) "<\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 4572) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\08\00\00\00 \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\05\00\00\00\14\00\00\00\f0\11\00\00\f0\11\00\00\08\00\00\00\02\00\00\00`\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 4652) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") - (data (i32.const 4700) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 4828) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\001\00b\00\00\00\00\00\00\00") - (data (i32.const 4860) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00c\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 4892) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00d\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 4924) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\08\00\00\00\10\13\00\000\13\00\00\00\00\00\00") - (data (i32.const 4956) ",\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\14\00\00\00P\13\00\00P\13\00\00\08\00\00\00\02\00\00\00`\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5004) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00c\002\00d\00\00\00\00\00\00\00") - (data (i32.const 5040) "\07\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A\00\00\06\00\00\00\02A\00\00\00\00\00\00") + (data (i32.const 4604) ",\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\14\00\00\00\f0\11\00\00\f0\11\00\00\08\00\00\00\02\00\00\00`\12\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 4652) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\08\00\00\00 \00\00\00@\00\00\00\00\00\00\00") + (data (i32.const 4684) ",\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\10\00\00\00@\12\00\00@\12\00\00\08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 4732) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") + (data (i32.const 4780) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 4908) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\001\00b\00\00\00\00\00\00\00") + (data (i32.const 4940) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00r\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 4972) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00d\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5004) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00`\13\00\00\80\13\00\00`\00\00\00") + (data (i32.const 5036) ",\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\10\00\00\00\a0\13\00\00\a0\13\00\00\0c\00\00\00\03\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5084) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\08\00\00\00r\002\00d\002\00\00\00\00\00") + (data (i32.const 5116) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00`\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5148) ",\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\14\00\00\00\10\14\00\00\10\14\00\00\04\00\00\00\01\00\00\00\80\14\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5196) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00`\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5228) ",\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\10\00\00\00`\14\00\00`\14\00\00\04\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5276) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00\\\00u\00\00\00\00\00\00\00\00\00") + (data (i32.const 5308) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00\b0\14\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5340) ",\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\14\00\00\00\d0\14\00\00\d0\14\00\00\04\00\00\00\01\00\00\00@\15\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5388) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00\b0\14\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5420) ",\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\10\00\00\00 \15\00\00 \15\00\00\04\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5468) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00\\\00u\001\00\00\00\00\00\00\00") + (data (i32.const 5500) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00p\15\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5532) ",\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\14\00\00\00\90\15\00\00\90\15\00\00\04\00\00\00\01\00\00\00\00\16\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5580) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00p\15\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5612) ",\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\10\00\00\00\e0\15\00\00\e0\15\00\00\04\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5664) "\07\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A\00\00\06\00\00\00\02A\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) @@ -101,10 +117,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 5040)) - (global $~lib/memory/__data_end i32 (i32.const 5100)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 21484)) - (global $~lib/memory/__heap_base i32 (i32.const 21484)) + (global $~lib/rt/__rtti_base i32 (i32.const 5664)) + (global $~lib/memory/__data_end i32 (i32.const 5724)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 22108)) + (global $~lib/memory/__heap_base i32 (i32.const 22108)) (global $~started (mut i32) (i32.const 0)) (export "memory" (memory $0)) (export "_start" (func $~start)) @@ -5633,6 +5649,73 @@ local.get $0 i32.load offset=12 ) + (func $~lib/rt/__instanceof (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + local.get $0 + i32.const 20 + i32.sub + i32.load offset=12 + local.set $2 + global.get $~lib/rt/__rtti_base + local.set $3 + local.get $2 + local.get $3 + i32.load + i32.le_u + if + loop $do-continue|0 + local.get $2 + local.get $1 + i32.eq + if + i32.const 1 + return + end + local.get $3 + i32.const 4 + i32.add + local.get $2 + i32.const 8 + i32.mul + i32.add + i32.load offset=4 + local.tee $2 + local.set $4 + local.get $4 + br_if $do-continue|0 + end + end + i32.const 0 + ) + (func $~lib/array/Array<~lib/string/String>#join (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + local.get $0 + i32.load offset=4 + local.set $2 + local.get $0 + i32.load offset=12 + local.set $3 + 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 + drop + local.get $2 + local.get $3 + local.get $1 + call $~lib/util/string/joinStringArray + return + ) (func $start:templateliteral i32.const 208 call $~lib/rt/itcms/initLazy @@ -5656,13 +5739,14 @@ call $templateliteral/test_float call $templateliteral/test_ref call $templateliteral/test_tag + call $templateliteral/test_raw ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) i32.const 256 local.get $0 call $~lib/rt/itcms/__visit - i32.const 4720 + i32.const 4800 local.get $0 call $~lib/rt/itcms/__visit i32.const 368 @@ -5846,8 +5930,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 21504 - i32.const 21552 + i32.const 22128 + i32.const 22176 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6700,8 +6784,9 @@ ) (func $templateliteral/tag (param $0 i32) (param $1 i32) (result i32) (local $2 i32) + (local $3 i32) global.get $~lib/memory/__stack_pointer - i32.const 16 + i32.const 20 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check @@ -6711,6 +6796,14 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=16 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.load offset=16 + local.tee $2 + i32.store local.get $0 call $~lib/array/Array<~lib/string/String>#get:length i32.const 2 @@ -6719,7 +6812,20 @@ if i32.const 0 i32.const 560 - i32.const 45 + i32.const 46 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $2 + call $~lib/array/Array<~lib/string/String>#get:length + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 47 i32.const 3 call $~lib/builtins/abort unreachable @@ -6727,23 +6833,47 @@ local.get $0 i32.const 0 call $~lib/array/Array<~lib/string/String>#__get - local.set $2 + local.set $3 global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store - local.get $2 + local.get $3 + i32.store offset=4 + local.get $3 i32.const 32 - local.set $2 + local.set $3 global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=8 + local.get $3 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 48 + i32.const 3 + call $~lib/builtins/abort + unreachable + end local.get $2 + i32.const 0 + call $~lib/array/Array<~lib/string/String>#__get + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 i32.store offset=4 - local.get $2 + local.get $3 + i32.const 32 + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=8 + local.get $3 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 560 - i32.const 46 + i32.const 49 i32.const 3 call $~lib/builtins/abort unreachable @@ -6751,23 +6881,47 @@ local.get $0 i32.const 1 call $~lib/array/Array<~lib/string/String>#__get - local.set $2 + local.set $3 global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store - local.get $2 + local.get $3 + i32.store offset=4 + local.get $3 i32.const 64 - local.set $2 + local.set $3 global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=8 + local.get $3 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 50 + i32.const 3 + call $~lib/builtins/abort + unreachable + end local.get $2 + i32.const 1 + call $~lib/array/Array<~lib/string/String>#__get + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 i32.store offset=4 - local.get $2 + local.get $3 + i32.const 64 + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=8 + local.get $3 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 560 - i32.const 47 + i32.const 51 i32.const 3 call $~lib/builtins/abort unreachable @@ -6779,7 +6933,7 @@ if i32.const 0 i32.const 560 - i32.const 48 + i32.const 52 i32.const 3 call $~lib/builtins/abort unreachable @@ -6787,45 +6941,46 @@ local.get $0 i32.const 0 call $~lib/array/Array<~lib/string/String>#__get - local.set $2 + local.set $3 global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=8 - local.get $2 + local.get $3 + i32.store offset=12 + local.get $3 local.get $1 i32.const 10 call $~lib/number/I32#toString - local.set $2 + local.set $3 global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=12 - local.get $2 + local.get $3 + i32.store offset=16 + local.get $3 call $~lib/string/String.__concat - local.set $2 + local.set $3 global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store - local.get $2 + local.get $3 + i32.store offset=4 + local.get $3 local.get $0 i32.const 1 call $~lib/array/Array<~lib/string/String>#__get - local.set $2 + local.set $3 global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=4 - local.get $2 + local.get $3 + i32.store offset=8 + local.get $3 call $~lib/string/String.__concat - local.set $2 + local.set $3 global.get $~lib/memory/__stack_pointer - i32.const 16 + i32.const 20 i32.add global.set $~lib/memory/__stack_pointer - local.get $2 + local.get $3 ) - (func $templateliteral/ns.tag (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) + (func $templateliteral/ns.tag (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) global.get $~lib/memory/__stack_pointer - i32.const 16 + i32.const 24 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check @@ -6835,15 +6990,38 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store offset=8 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=16 + local.get $0 + local.tee $3 + i32.eqz + if (result i32) + i32.const 0 + else + local.get $3 + i32.const 5 + call $~lib/rt/__instanceof + end + i32.eqz + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 58 + i32.const 5 + call $~lib/builtins/abort + unreachable + end local.get $0 call $~lib/array/Array<~lib/string/String>#get:length - i32.const 2 + i32.const 3 i32.eq i32.eqz if i32.const 0 i32.const 560 - i32.const 54 + i32.const 59 i32.const 5 call $~lib/builtins/abort unreachable @@ -6851,23 +7029,23 @@ local.get $0 i32.const 0 call $~lib/array/Array<~lib/string/String>#__get - local.set $2 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $4 i32.store - local.get $2 - i32.const 4880 - local.set $2 + local.get $4 + i32.const 4960 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $4 i32.store offset=4 - local.get $2 + local.get $4 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 560 - i32.const 55 + i32.const 60 i32.const 5 call $~lib/builtins/abort unreachable @@ -6875,23 +7053,47 @@ local.get $0 i32.const 1 call $~lib/array/Array<~lib/string/String>#__get - local.set $2 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $4 i32.store - local.get $2 - i32.const 4912 - local.set $2 + local.get $4 + i32.const 4992 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $4 i32.store offset=4 - local.get $2 + local.get $4 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 61 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 2 + call $~lib/array/Array<~lib/string/String>#__get + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + i32.const 96 + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 560 - i32.const 56 + i32.const 62 i32.const 5 call $~lib/builtins/abort unreachable @@ -6903,7 +7105,19 @@ if i32.const 0 i32.const 560 - i32.const 57 + i32.const 63 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + local.get $2 + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 64 i32.const 5 call $~lib/builtins/abort unreachable @@ -6911,40 +7125,54 @@ local.get $0 i32.const 0 call $~lib/array/Array<~lib/string/String>#__get - local.set $2 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=8 - local.get $2 + local.get $4 + i32.store offset=16 + local.get $4 local.get $1 i32.const 10 call $~lib/number/I32#toString - local.set $2 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store offset=12 - local.get $2 + local.get $4 + i32.store offset=20 + local.get $4 call $~lib/string/String.__concat - local.set $2 + local.set $4 global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store - local.get $2 + local.get $4 + i32.store offset=8 + local.get $4 local.get $0 i32.const 1 call $~lib/array/Array<~lib/string/String>#__get - local.set $2 + local.set $4 global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=12 + local.get $4 + call $~lib/string/String.__concat + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 local.get $2 + i32.const 10 + call $~lib/number/I32#toString + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 i32.store offset=4 - local.get $2 + local.get $4 call $~lib/string/String.__concat - local.set $2 + local.set $4 global.get $~lib/memory/__stack_pointer - i32.const 16 + i32.const 24 i32.add global.set $~lib/memory/__stack_pointer - local.get $2 + local.get $4 ) (func $templateliteral/test_tag (local $0 i32) @@ -6972,7 +7200,7 @@ local.get $0 i32.store local.get $0 - i32.const 4848 + i32.const 4928 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6983,25 +7211,26 @@ if i32.const 0 i32.const 560 - i32.const 63 + i32.const 70 i32.const 3 call $~lib/builtins/abort unreachable end - i32.const 4976 + i32.const 5056 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=8 local.get $0 i32.const 2 + i32.const 2 call $templateliteral/ns.tag local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store local.get $0 - i32.const 5024 + i32.const 5104 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -7012,7 +7241,140 @@ if i32.const 0 i32.const 560 - i32.const 64 + i32.const 71 + 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 + ) + (func $templateliteral/raw (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $0 + i32.load offset=16 + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + local.get $1 + i32.const 96 + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + call $~lib/array/Array<~lib/string/String>#join + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $templateliteral/test_raw + (local $0 i32) + global.get $~lib/memory/__stack_pointer + 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 5168 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $templateliteral/raw + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 96 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 80 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 5360 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $templateliteral/raw + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 5296 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 81 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + i32.const 5552 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $templateliteral/raw + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 5488 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 82 i32.const 3 call $~lib/builtins/abort unreachable @@ -7597,7 +7959,7 @@ i32.ge_u if i32.const 256 - i32.const 4672 + i32.const 4752 i32.const 92 i32.const 42 call $~lib/builtins/abort @@ -7621,8 +7983,8 @@ local.get $2 i32.eqz if - i32.const 4720 - i32.const 4672 + i32.const 4800 + i32.const 4752 i32.const 96 i32.const 40 call $~lib/builtins/abort From b0f3e83db63533fa4cf32f54828eb3cbc38694ae Mon Sep 17 00:00:00 2001 From: dcode Date: Sun, 14 Mar 2021 01:06:27 +0100 Subject: [PATCH 12/13] fix? --- .eslintignore | 3 + tests/compiler/templateliteral.optimized.wat | 80 ++++++++++++++------ tests/compiler/templateliteral.ts | 1 + tests/compiler/templateliteral.untouched.wat | 48 ++++++++++-- 4 files changed, 103 insertions(+), 29 deletions(-) diff --git a/.eslintignore b/.eslintignore index 5057a1b4d7..1f981fe5e5 100644 --- a/.eslintignore +++ b/.eslintignore @@ -5,3 +5,6 @@ lib/parse/index.js out/ raw/ tests/parser/ + +# FIXME: Tagged template literal tests with invalid escapes +tests/compiler/templateliteral.ts diff --git a/tests/compiler/templateliteral.optimized.wat b/tests/compiler/templateliteral.optimized.wat index f90c1a2739..52997c1e5e 100644 --- a/tests/compiler/templateliteral.optimized.wat +++ b/tests/compiler/templateliteral.optimized.wat @@ -155,8 +155,20 @@ (data (i32.const 5164) "\04\00\00\00\c0\13") (data (i32.const 5180) ",") (data (i32.const 5192) "\06\00\00\00\10\00\00\000\14\00\000\14\00\00\04\00\00\00\01") - (data (i32.const 5232) "\07\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 5260) "\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A\00\00\06\00\00\00\02A") + (data (i32.const 5228) "\1c") + (data (i32.const 5240) "\01\00\00\00\02\00\00\00\00\10") + (data (i32.const 5260) "\1c") + (data (i32.const 5272) "\01\00\00\00\0c\00\00\00\\\00u\001\000\000\000") + (data (i32.const 5292) "\1c") + (data (i32.const 5308) "\04\00\00\00\80\14") + (data (i32.const 5324) ",") + (data (i32.const 5336) "\05\00\00\00\14\00\00\00\c0\14\00\00\c0\14\00\00\04\00\00\00\01\00\00\000\15") + (data (i32.const 5372) "\1c") + (data (i32.const 5388) "\04\00\00\00\a0\14") + (data (i32.const 5404) ",") + (data (i32.const 5416) "\06\00\00\00\10\00\00\00\10\15\00\00\10\15\00\00\04\00\00\00\01") + (data (i32.const 5456) "\07\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 5484) "\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A\00\00\06\00\00\00\02A") (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)) @@ -173,7 +185,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 21676)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 21900)) (global $~started (mut i32) (i32.const 0)) (export "memory" (memory $0)) (export "_start" (func $~start)) @@ -248,7 +260,7 @@ if i32.const 0 local.get $0 - i32.const 21676 + i32.const 21900 i32.lt_u local.get $0 i32.load offset=8 @@ -294,7 +306,7 @@ i32.const 1 else local.get $1 - i32.const 5232 + i32.const 5456 i32.load i32.gt_u if @@ -308,7 +320,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 5236 + i32.const 5460 i32.add i32.load i32.const 32 @@ -1036,10 +1048,10 @@ if unreachable end - i32.const 21680 + i32.const 21904 i32.const 0 i32.store - i32.const 23248 + i32.const 23472 i32.const 0 i32.store loop $for-loop|0 @@ -1050,7 +1062,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 21680 + i32.const 21904 i32.add i32.const 0 i32.store offset=4 @@ -1068,7 +1080,7 @@ i32.add i32.const 2 i32.shl - i32.const 21680 + i32.const 21904 i32.add i32.const 0 i32.store offset=96 @@ -1086,13 +1098,13 @@ br $for-loop|0 end end - i32.const 21680 - i32.const 23252 + i32.const 21904 + i32.const 23476 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 21680 + i32.const 21904 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1171,7 +1183,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 21676 + i32.const 21900 i32.lt_u if local.get $0 @@ -1261,7 +1273,7 @@ unreachable end local.get $0 - i32.const 21676 + i32.const 21900 i32.lt_u if local.get $0 @@ -1284,7 +1296,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 21676 + i32.const 21900 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -3529,7 +3541,7 @@ memory.size i32.const 16 i32.shl - i32.const 21676 + i32.const 21900 i32.sub i32.const 1 i32.shr_u @@ -3609,11 +3621,11 @@ ) (func $~stack_check global.get $~lib/memory/__stack_pointer - i32.const 5292 + i32.const 5516 i32.lt_s if - i32.const 21696 - i32.const 21744 + i32.const 21920 + i32.const 21968 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4623,7 +4635,7 @@ i32.const 4616 i32.load local.tee $0 - i32.const 5232 + i32.const 5456 i32.load i32.le_u if @@ -4637,7 +4649,7 @@ local.get $0 i32.const 3 i32.shl - i32.const 5236 + i32.const 5460 i32.add i32.load offset=4 local.tee $0 @@ -4893,6 +4905,30 @@ unreachable end global.get $~lib/memory/__stack_pointer + i32.const 5344 + i32.store offset=8 + i32.const 5344 + call $templateliteral/raw + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 5280 + i32.store offset=4 + local.get $0 + i32.const 5280 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1584 + i32.const 83 + 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 diff --git a/tests/compiler/templateliteral.ts b/tests/compiler/templateliteral.ts index 3ee42b38d0..f63b827c65 100644 --- a/tests/compiler/templateliteral.ts +++ b/tests/compiler/templateliteral.ts @@ -80,5 +80,6 @@ function test_raw(): void { assert(raw`` == ""); assert(raw`\u` == "\\u"); assert(raw`\u1` == "\\u1"); + assert(raw`\u1000` == "\\u1000"); } test_raw(); diff --git a/tests/compiler/templateliteral.untouched.wat b/tests/compiler/templateliteral.untouched.wat index 7dd36335d6..28f5486304 100644 --- a/tests/compiler/templateliteral.untouched.wat +++ b/tests/compiler/templateliteral.untouched.wat @@ -97,7 +97,13 @@ (data (i32.const 5532) ",\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\14\00\00\00\90\15\00\00\90\15\00\00\04\00\00\00\01\00\00\00\00\16\00\00\00\00\00\00\00\00\00\00") (data (i32.const 5580) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00p\15\00\00\00\00\00\00\00\00\00\00") (data (i32.const 5612) ",\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\10\00\00\00\e0\15\00\00\e0\15\00\00\04\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5664) "\07\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A\00\00\06\00\00\00\02A\00\00\00\00\00\00") + (data (i32.const 5660) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\10\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5692) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00\\\00u\001\000\000\000\00") + (data (i32.const 5724) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\000\16\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5756) ",\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\14\00\00\00p\16\00\00p\16\00\00\04\00\00\00\01\00\00\00\e0\16\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5804) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00P\16\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5836) ",\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\10\00\00\00\c0\16\00\00\c0\16\00\00\04\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 5888) "\07\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A\00\00\06\00\00\00\02A\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) @@ -117,10 +123,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 5664)) - (global $~lib/memory/__data_end i32 (i32.const 5724)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 22108)) - (global $~lib/memory/__heap_base i32 (i32.const 22108)) + (global $~lib/rt/__rtti_base i32 (i32.const 5888)) + (global $~lib/memory/__data_end i32 (i32.const 5948)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 22332)) + (global $~lib/memory/__heap_base i32 (i32.const 22332)) (global $~started (mut i32) (i32.const 0)) (export "memory" (memory $0)) (export "_start" (func $~start)) @@ -5930,8 +5936,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 22128 - i32.const 22176 + i32.const 22352 + i32.const 22400 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -7379,6 +7385,34 @@ call $~lib/builtins/abort unreachable end + i32.const 5776 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $templateliteral/raw + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 5712 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 560 + i32.const 83 + i32.const 3 + call $~lib/builtins/abort + unreachable + end global.get $~lib/memory/__stack_pointer i32.const 12 i32.add From 1e2a245102b2fa3bb220799a240764b3bfd02600 Mon Sep 17 00:00:00 2001 From: dcode Date: Fri, 26 Mar 2021 10:01:56 +0100 Subject: [PATCH 13/13] error on tags for now, add String.raw stub --- src/builtins.ts | 16 + src/compiler.ts | 5 + std/assembly/index.d.ts | 1 + std/assembly/string.ts | 2 + tests/compiler/std-wasi/process.optimized.wat | 2 +- tests/compiler/std-wasi/process.untouched.wat | 2 +- .../std/string-encoding.optimized.wat | 2 +- .../std/string-encoding.untouched.wat | 2 +- tests/compiler/std/string.optimized.wat | 4 +- tests/compiler/std/string.untouched.wat | 4 +- tests/compiler/templateliteral.optimized.wat | 856 ++-------------- tests/compiler/templateliteral.ts | 4 +- tests/compiler/templateliteral.untouched.wat | 954 +----------------- 13 files changed, 151 insertions(+), 1703 deletions(-) diff --git a/src/builtins.ts b/src/builtins.ts index 2b9a5252a3..cbd765b0f4 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -649,6 +649,9 @@ export namespace BuiltinNames { export const Float32Array = "~lib/typedarray/Float32Array"; export const Float64Array = "~lib/typedarray/Float64Array"; + // std/string.ts + export const String_raw = "~lib/string/String.raw"; + // std/bindings/wasi.ts export const wasiAbort = "~lib/wasi/index/abort"; export const wasiTrace = "~lib/wasi/index/trace"; @@ -3337,6 +3340,19 @@ function builtin_function_call(ctx: BuiltinContext): ExpressionRef { } function_builtins.set("call", builtin_function_call); +// String.raw(parts: TemplateStringsArray, ...values: unknown[]): string +function builtin_string_raw(ctx: BuiltinContext): ExpressionRef { + var compiler = ctx.compiler; + var module = compiler.module; + compiler.currentType = ctx.compiler.program.stringInstance.type; + compiler.error( + DiagnosticCode.Not_implemented_0, + ctx.reportNode.range, "String.raw" + ); + return module.unreachable(); +} +builtins.set(BuiltinNames.String_raw, builtin_string_raw); + // === Portable type conversions ============================================================== function builtin_conversion(ctx: BuiltinContext, toType: Type): ExpressionRef { diff --git a/src/compiler.ts b/src/compiler.ts index ca2bb41692..69b2db85e6 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8174,6 +8174,11 @@ export class Compiler extends DiagnosticEmitter { this.program.nativeRange ) ); + // TODO: Requires ReadonlyArray to be safe + this.error( + DiagnosticCode.Not_implemented_0, + expression.range, "Tagged template literals" + ); return this.compileCallExpressionLike(tag, null, args, expression.range, stringType); } diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index ea8688ccbf..ade4dec847 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -1627,6 +1627,7 @@ declare class String { static fromCharCodes(arr: u16[]): string; static fromCodePoint(code: i32): string; static fromCodePoints(arr: i32[]): string; + static raw(parts: TemplateStringsArray, ...args: any[]): string; readonly length: i32; at(index: i32): string; charAt(index: i32): string; diff --git a/std/assembly/string.ts b/std/assembly/string.ts index 1007790ca4..3624f63d3e 100644 --- a/std/assembly/string.ts +++ b/std/assembly/string.ts @@ -44,6 +44,8 @@ import { Array } from "./array"; return out; } + @builtin static raw(parts: TemplateStringsArray, ...args: unknown[]): string { return unreachable(); } + get length(): i32 { return changetype(changetype(this) - TOTAL_OVERHEAD).rtSize >> 1; } diff --git a/tests/compiler/std-wasi/process.optimized.wat b/tests/compiler/std-wasi/process.optimized.wat index 6bb2d4436a..332d85d383 100644 --- a/tests/compiler/std-wasi/process.optimized.wat +++ b/tests/compiler/std-wasi/process.optimized.wat @@ -4736,7 +4736,7 @@ if i32.const 0 i32.const 4816 - i32.const 746 + i32.const 748 i32.const 7 call $~lib/wasi/index/abort unreachable diff --git a/tests/compiler/std-wasi/process.untouched.wat b/tests/compiler/std-wasi/process.untouched.wat index 0fad52a6fb..18b25b013c 100644 --- a/tests/compiler/std-wasi/process.untouched.wat +++ b/tests/compiler/std-wasi/process.untouched.wat @@ -7680,7 +7680,7 @@ if i32.const 0 i32.const 3792 - i32.const 746 + i32.const 748 i32.const 7 call $~lib/wasi/index/abort unreachable diff --git a/tests/compiler/std/string-encoding.optimized.wat b/tests/compiler/std/string-encoding.optimized.wat index f33ee60c28..410c4ad402 100644 --- a/tests/compiler/std/string-encoding.optimized.wat +++ b/tests/compiler/std/string-encoding.optimized.wat @@ -3896,7 +3896,7 @@ if i32.const 0 i32.const 1712 - i32.const 746 + i32.const 748 i32.const 7 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/string-encoding.untouched.wat b/tests/compiler/std/string-encoding.untouched.wat index ca934935ea..e72b3b5d89 100644 --- a/tests/compiler/std/string-encoding.untouched.wat +++ b/tests/compiler/std/string-encoding.untouched.wat @@ -5966,7 +5966,7 @@ if i32.const 0 i32.const 688 - i32.const 746 + i32.const 748 i32.const 7 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/string.optimized.wat b/tests/compiler/std/string.optimized.wat index df0376e497..3ac63f9a92 100644 --- a/tests/compiler/std/string.optimized.wat +++ b/tests/compiler/std/string.optimized.wat @@ -2783,7 +2783,7 @@ if i32.const 1264 i32.const 1328 - i32.const 54 + i32.const 56 i32.const 31 call $~lib/builtins/abort unreachable @@ -20981,7 +20981,7 @@ if i32.const 13648 i32.const 1328 - i32.const 330 + i32.const 332 i32.const 7 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/string.untouched.wat b/tests/compiler/std/string.untouched.wat index ea515a1aa6..a73886baf7 100644 --- a/tests/compiler/std/string.untouched.wat +++ b/tests/compiler/std/string.untouched.wat @@ -3097,7 +3097,7 @@ if i32.const 240 i32.const 304 - i32.const 54 + i32.const 56 i32.const 31 call $~lib/builtins/abort unreachable @@ -26062,7 +26062,7 @@ if i32.const 12624 i32.const 304 - i32.const 330 + i32.const 332 i32.const 7 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/templateliteral.optimized.wat b/tests/compiler/templateliteral.optimized.wat index 52997c1e5e..cb6d15913a 100644 --- a/tests/compiler/templateliteral.optimized.wat +++ b/tests/compiler/templateliteral.optimized.wat @@ -5,9 +5,9 @@ (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_none (func (param i32))) - (type $none_=>_i32 (func (result i32))) (type $f64_=>_i32 (func (param f64) (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 (func (param i32 i32 i32) (result i32))) (type $i64_i32_i64_i32_i64_i32_=>_i32 (func (param i64 i32 i64 i32 i64 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) @@ -103,72 +103,8 @@ (data (i32.const 4040) "\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 4076) "<") (data (i32.const 4088) "\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 4140) "\1c") - (data (i32.const 4156) "\08\00\00\00 \04\00\00@\04") - (data (i32.const 4172) ",") - (data (i32.const 4184) "\05\00\00\00\14\00\00\00@\10\00\00@\10\00\00\08\00\00\00\02\00\00\00\b0\10") - (data (i32.const 4220) "\1c") - (data (i32.const 4236) "\08\00\00\00 \04\00\00@\04") - (data (i32.const 4252) ",") - (data (i32.const 4264) "\06\00\00\00\10\00\00\00\90\10\00\00\90\10\00\00\08\00\00\00\02") - (data (i32.const 4300) ",") - (data (i32.const 4312) "\01\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") - (data (i32.const 4348) "|") - (data (i32.const 4360) "\01\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y") - (data (i32.const 4476) "\1c") - (data (i32.const 4488) "\01\00\00\00\06\00\00\00a\001\00b") - (data (i32.const 4508) "\1c") - (data (i32.const 4520) "\01\00\00\00\02\00\00\00r") - (data (i32.const 4540) "\1c") - (data (i32.const 4552) "\01\00\00\00\02\00\00\00d") - (data (i32.const 4572) "\1c") - (data (i32.const 4588) "\0c\00\00\00\b0\11\00\00\d0\11\00\00`\04") - (data (i32.const 4604) ",") - (data (i32.const 4616) "\06\00\00\00\10\00\00\00\f0\11\00\00\f0\11\00\00\0c\00\00\00\03") - (data (i32.const 4652) "\1c") - (data (i32.const 4664) "\01\00\00\00\08\00\00\00r\002\00d\002") - (data (i32.const 4684) "\1c") - (data (i32.const 4700) "\04\00\00\00`\04") - (data (i32.const 4716) ",") - (data (i32.const 4728) "\05\00\00\00\14\00\00\00`\12\00\00`\12\00\00\04\00\00\00\01\00\00\00\d0\12") - (data (i32.const 4764) "\1c") - (data (i32.const 4780) "\04\00\00\00`\04") - (data (i32.const 4796) ",") - (data (i32.const 4808) "\06\00\00\00\10\00\00\00\b0\12\00\00\b0\12\00\00\04\00\00\00\01") - (data (i32.const 4844) "\1c") - (data (i32.const 4856) "\01\00\00\00\04\00\00\00\\\00u") - (data (i32.const 4876) "\1c") - (data (i32.const 4892) "\04\00\00\00\00\13") - (data (i32.const 4908) ",") - (data (i32.const 4920) "\05\00\00\00\14\00\00\00 \13\00\00 \13\00\00\04\00\00\00\01\00\00\00\90\13") - (data (i32.const 4956) "\1c") - (data (i32.const 4972) "\04\00\00\00\00\13") - (data (i32.const 4988) ",") - (data (i32.const 5000) "\06\00\00\00\10\00\00\00p\13\00\00p\13\00\00\04\00\00\00\01") - (data (i32.const 5036) "\1c") - (data (i32.const 5048) "\01\00\00\00\06\00\00\00\\\00u\001") - (data (i32.const 5068) "\1c") - (data (i32.const 5084) "\04\00\00\00\c0\13") - (data (i32.const 5100) ",") - (data (i32.const 5112) "\05\00\00\00\14\00\00\00\e0\13\00\00\e0\13\00\00\04\00\00\00\01\00\00\00P\14") - (data (i32.const 5148) "\1c") - (data (i32.const 5164) "\04\00\00\00\c0\13") - (data (i32.const 5180) ",") - (data (i32.const 5192) "\06\00\00\00\10\00\00\000\14\00\000\14\00\00\04\00\00\00\01") - (data (i32.const 5228) "\1c") - (data (i32.const 5240) "\01\00\00\00\02\00\00\00\00\10") - (data (i32.const 5260) "\1c") - (data (i32.const 5272) "\01\00\00\00\0c\00\00\00\\\00u\001\000\000\000") - (data (i32.const 5292) "\1c") - (data (i32.const 5308) "\04\00\00\00\80\14") - (data (i32.const 5324) ",") - (data (i32.const 5336) "\05\00\00\00\14\00\00\00\c0\14\00\00\c0\14\00\00\04\00\00\00\01\00\00\000\15") - (data (i32.const 5372) "\1c") - (data (i32.const 5388) "\04\00\00\00\a0\14") - (data (i32.const 5404) ",") - (data (i32.const 5416) "\06\00\00\00\10\00\00\00\10\15\00\00\10\15\00\00\04\00\00\00\01") - (data (i32.const 5456) "\07\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 5484) "\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A\00\00\06\00\00\00\02A") + (data (i32.const 4144) "\05\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 4172) "\04A\00\00\00\00\00\00 ") (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)) @@ -185,7 +121,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 21900)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20572)) (global $~started (mut i32) (i32.const 0)) (export "memory" (memory $0)) (export "_start" (func $~start)) @@ -260,7 +196,7 @@ if i32.const 0 local.get $0 - i32.const 21900 + i32.const 20572 i32.lt_u local.get $0 i32.load offset=8 @@ -306,7 +242,7 @@ i32.const 1 else local.get $1 - i32.const 5456 + i32.const 4144 i32.load i32.gt_u if @@ -320,7 +256,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 5460 + i32.const 4148 i32.add i32.load i32.const 32 @@ -403,8 +339,6 @@ (local $1 i32) i32.const 1280 call $~lib/rt/itcms/__visit - i32.const 4368 - call $~lib/rt/itcms/__visit i32.const 1392 call $~lib/rt/itcms/__visit i32.const 2176 @@ -1048,10 +982,10 @@ if unreachable end - i32.const 21904 + i32.const 20576 i32.const 0 i32.store - i32.const 23472 + i32.const 22144 i32.const 0 i32.store loop $for-loop|0 @@ -1062,7 +996,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 21904 + i32.const 20576 i32.add i32.const 0 i32.store offset=4 @@ -1080,7 +1014,7 @@ i32.add i32.const 2 i32.shl - i32.const 21904 + i32.const 20576 i32.add i32.const 0 i32.store offset=96 @@ -1098,13 +1032,13 @@ br $for-loop|0 end end - i32.const 21904 - i32.const 23476 + i32.const 20576 + i32.const 22148 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 21904 + i32.const 20576 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1183,7 +1117,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 21900 + i32.const 20572 i32.lt_u if local.get $0 @@ -1273,7 +1207,7 @@ unreachable end local.get $0 - i32.const 21900 + i32.const 20572 i32.lt_u if local.get $0 @@ -1296,7 +1230,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 21900 + i32.const 20572 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -3419,116 +3353,67 @@ end local.get $1 ) - (func $~lib/array/Array<~lib/string/String>#__visit (param $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - local.get $0 - i32.load offset=4 - local.tee $1 - local.get $0 - i32.load offset=12 - i32.const 2 - i32.shl - i32.add - local.set $2 - loop $while-continue|0 - local.get $1 - local.get $2 - i32.lt_u - if - local.get $1 - i32.load - local.tee $3 - if - local.get $3 - call $~lib/rt/itcms/__visit - end - local.get $1 - i32.const 4 - i32.add - local.set $1 - br $while-continue|0 - end - end - local.get $0 - i32.load - call $~lib/rt/itcms/__visit - ) (func $~lib/rt/__visit_members (param $0 i32) (local $1 i32) (local $2 i32) block $invalid - block $~lib/array/Array<~lib/string/String> - block $~lib/string/TemplateStringsArray - 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 $~lib/string/TemplateStringsArray $~lib/array/Array<~lib/string/String> $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 + 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 - 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 + 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 - call $~lib/array/Array<~lib/string/String>#__visit local.get $0 - call $~lib/array/Array<~lib/string/String>#__visit + 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 - local.get $0 - call $~lib/array/Array<~lib/string/String>#__visit return end unreachable ) (func $~start - (local $0 i32) global.get $~started if return @@ -3541,7 +3426,7 @@ memory.size i32.const 16 i32.shl - i32.const 21900 + i32.const 20572 i32.sub i32.const 1 i32.shr_u @@ -3556,76 +3441,14 @@ call $templateliteral/test_integer call $templateliteral/test_float call $templateliteral/test_ref - global.get $~lib/memory/__stack_pointer - 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 - global.get $~lib/memory/__stack_pointer - i32.const 4192 - i32.store offset=8 - call $templateliteral/tag - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 4496 - i32.store offset=4 - local.get $0 - i32.const 4496 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1584 - i32.const 70 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 4624 - i32.store offset=8 - call $templateliteral/ns.tag - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 4672 - i32.store offset=4 - local.get $0 - i32.const 4672 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1584 - i32.const 71 - 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 - call $templateliteral/test_raw ) (func $~stack_check global.get $~lib/memory/__stack_pointer - i32.const 5516 + i32.const 4188 i32.lt_s if - i32.const 21920 - i32.const 21968 + i32.const 20592 + i32.const 20640 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4445,564 +4268,29 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $templateliteral/tag (result i32) - (local $0 i32) + (func $templateliteral/Ref#constructor (param $0 i32) (result i32) (local $1 i32) global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 4 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store offset=8 - global.get $~lib/memory/__stack_pointer i32.const 0 - i32.store offset=16 - global.get $~lib/memory/__stack_pointer - i32.const 4208 - i32.load - local.tee $0 i32.store - i32.const 4204 - i32.load - i32.const 2 - i32.ne - if - i32.const 0 - i32.const 1584 - i32.const 46 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - local.get $0 - i32.load offset=12 - i32.const 2 - i32.ne - if - i32.const 0 - i32.const 1584 - i32.const 47 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - i32.const 4192 - i32.const 0 - call $~lib/array/Array<~lib/string/String>#__get - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.store offset=4 global.get $~lib/memory/__stack_pointer - i32.const 1056 - i32.store offset=8 + i32.const 4 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $1 + i32.store local.get $1 - i32.const 1056 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1584 - i32.const 48 - i32.const 3 - call $~lib/builtins/abort - unreachable - end local.get $0 - i32.const 0 - call $~lib/array/Array<~lib/string/String>#__get - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.store offset=4 - global.get $~lib/memory/__stack_pointer - i32.const 1056 - i32.store offset=8 - local.get $1 - i32.const 1056 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1584 - i32.const 49 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - i32.const 4192 - i32.const 1 - call $~lib/array/Array<~lib/string/String>#__get - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.store offset=4 + i32.store global.get $~lib/memory/__stack_pointer - i32.const 1088 - i32.store offset=8 + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer local.get $1 - i32.const 1088 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1584 - i32.const 50 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - local.get $0 - i32.const 1 - call $~lib/array/Array<~lib/string/String>#__get - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - global.get $~lib/memory/__stack_pointer - i32.const 1088 - i32.store offset=8 - local.get $0 - i32.const 1088 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1584 - i32.const 51 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - i32.const 4192 - i32.const 0 - call $~lib/array/Array<~lib/string/String>#__get - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=12 - i32.const 1 - call $~lib/number/I32#toString - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.store offset=16 - local.get $0 - local.get $1 - call $~lib/string/String.__concat - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - i32.const 4192 - i32.const 1 - call $~lib/array/Array<~lib/string/String>#__get - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.store offset=8 - local.get $0 - local.get $1 - call $~lib/string/String.__concat - global.get $~lib/memory/__stack_pointer - i32.const 20 - i32.add - global.set $~lib/memory/__stack_pointer - ) - (func $templateliteral/ns.tag (result i32) - (local $0 i32) - (local $1 i32) - global.get $~lib/memory/__stack_pointer - i32.const 24 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store offset=8 - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store offset=16 - block $__inlined_func$~lib/rt/__instanceof (result i32) - i32.const 4616 - i32.load - local.tee $0 - i32.const 5456 - i32.load - i32.le_u - if - loop $do-continue|0 - i32.const 1 - local.get $0 - i32.const 5 - i32.eq - br_if $__inlined_func$~lib/rt/__instanceof - drop - local.get $0 - i32.const 3 - i32.shl - i32.const 5460 - i32.add - i32.load offset=4 - local.tee $0 - br_if $do-continue|0 - end - end - i32.const 0 - end - if - i32.const 0 - i32.const 1584 - i32.const 58 - i32.const 5 - call $~lib/builtins/abort - unreachable - end - i32.const 4636 - i32.load - i32.const 3 - i32.ne - if - i32.const 0 - i32.const 1584 - i32.const 59 - i32.const 5 - call $~lib/builtins/abort - unreachable - end - i32.const 4624 - i32.const 0 - call $~lib/array/Array<~lib/string/String>#__get - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 4528 - i32.store offset=4 - local.get $0 - i32.const 4528 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1584 - i32.const 60 - i32.const 5 - call $~lib/builtins/abort - unreachable - end - i32.const 4624 - i32.const 1 - call $~lib/array/Array<~lib/string/String>#__get - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 4560 - i32.store offset=4 - local.get $0 - i32.const 4560 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1584 - i32.const 61 - i32.const 5 - call $~lib/builtins/abort - unreachable - end - i32.const 4624 - i32.const 2 - call $~lib/array/Array<~lib/string/String>#__get - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1120 - i32.store offset=4 - local.get $0 - i32.const 1120 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1584 - i32.const 62 - i32.const 5 - call $~lib/builtins/abort - unreachable - end - i32.const 4624 - i32.const 0 - call $~lib/array/Array<~lib/string/String>#__get - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=16 - i32.const 2 - call $~lib/number/I32#toString - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.store offset=20 - local.get $0 - local.get $1 - call $~lib/string/String.__concat - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - i32.const 4624 - i32.const 1 - call $~lib/array/Array<~lib/string/String>#__get - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.store offset=12 - local.get $0 - local.get $1 - call $~lib/string/String.__concat - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - i32.const 2 - call $~lib/number/I32#toString - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.store offset=4 - local.get $0 - local.get $1 - call $~lib/string/String.__concat - global.get $~lib/memory/__stack_pointer - i32.const 24 - i32.add - global.set $~lib/memory/__stack_pointer - ) - (func $templateliteral/raw (param $0 i32) (result 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 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.load offset=16 - local.tee $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1120 - i32.store offset=4 - local.get $0 - i32.load offset=4 - local.get $0 - i32.load offset=12 - call $~lib/util/string/joinReferenceArray<~lib/string/String> - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - ) - (func $templateliteral/test_raw - (local $0 i32) - global.get $~lib/memory/__stack_pointer - 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 - global.get $~lib/memory/__stack_pointer - i32.const 4736 - i32.store offset=8 - i32.const 4736 - call $templateliteral/raw - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1120 - i32.store offset=4 - local.get $0 - i32.const 1120 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1584 - i32.const 80 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 4928 - i32.store offset=8 - i32.const 4928 - call $templateliteral/raw - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 4864 - i32.store offset=4 - local.get $0 - i32.const 4864 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1584 - i32.const 81 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 5120 - i32.store offset=8 - i32.const 5120 - call $templateliteral/raw - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 5056 - i32.store offset=4 - local.get $0 - i32.const 5056 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1584 - i32.const 82 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 5344 - i32.store offset=8 - i32.const 5344 - call $templateliteral/raw - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 5280 - i32.store offset=4 - local.get $0 - i32.const 5280 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1584 - i32.const 83 - 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 - ) - (func $templateliteral/Ref#constructor (param $0 i32) (result i32) - (local $1 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 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.const 4 - call $~lib/rt/itcms/__new - local.tee $1 - i32.store - local.get $1 - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $1 - ) - (func $~lib/array/Array<~lib/string/String>#__get (param $0 i32) (param $1 i32) (result 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 $1 - local.get $0 - i32.load offset=12 - i32.ge_u - if - i32.const 1280 - i32.const 4320 - i32.const 92 - i32.const 42 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.load offset=4 - local.get $1 - i32.const 2 - i32.shl - i32.add - i32.load - local.tee $0 - i32.store - local.get $0 - i32.eqz - if - i32.const 4368 - i32.const 4320 - i32.const 96 - i32.const 40 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $0 ) ) diff --git a/tests/compiler/templateliteral.ts b/tests/compiler/templateliteral.ts index f63b827c65..adbabacd9b 100644 --- a/tests/compiler/templateliteral.ts +++ b/tests/compiler/templateliteral.ts @@ -70,7 +70,7 @@ function test_tag(): void { assert(tag`a${1}b` == "a1b"); assert(ns.tag`r${2}d${2}` == "r2d2"); } -test_tag(); +// test_tag(); // TODO: Requires ReadonlyArray to be safe function raw(parts: TemplateStringsArray): string { return parts.raw.join(""); @@ -82,4 +82,4 @@ function test_raw(): void { assert(raw`\u1` == "\\u1"); assert(raw`\u1000` == "\\u1000"); } -test_raw(); +// test_raw(); // TODO: Requires ReadonlyArray to be safe diff --git a/tests/compiler/templateliteral.untouched.wat b/tests/compiler/templateliteral.untouched.wat index 28f5486304..34c67aca1e 100644 --- a/tests/compiler/templateliteral.untouched.wat +++ b/tests/compiler/templateliteral.untouched.wat @@ -71,39 +71,7 @@ (data (i32.const 4412) ",\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 4460) ",\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 4508) "<\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 4572) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\08\00\00\00 \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\05\00\00\00\14\00\00\00\f0\11\00\00\f0\11\00\00\08\00\00\00\02\00\00\00`\12\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 4652) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\08\00\00\00 \00\00\00@\00\00\00\00\00\00\00") - (data (i32.const 4684) ",\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\10\00\00\00@\12\00\00@\12\00\00\08\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 4732) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") - (data (i32.const 4780) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 4908) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\001\00b\00\00\00\00\00\00\00") - (data (i32.const 4940) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00r\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 4972) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00d\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5004) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00`\13\00\00\80\13\00\00`\00\00\00") - (data (i32.const 5036) ",\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\10\00\00\00\a0\13\00\00\a0\13\00\00\0c\00\00\00\03\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5084) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\08\00\00\00r\002\00d\002\00\00\00\00\00") - (data (i32.const 5116) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00`\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5148) ",\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\14\00\00\00\10\14\00\00\10\14\00\00\04\00\00\00\01\00\00\00\80\14\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5196) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00`\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5228) ",\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\10\00\00\00`\14\00\00`\14\00\00\04\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5276) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00\\\00u\00\00\00\00\00\00\00\00\00") - (data (i32.const 5308) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00\b0\14\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5340) ",\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\14\00\00\00\d0\14\00\00\d0\14\00\00\04\00\00\00\01\00\00\00@\15\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5388) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00\b0\14\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5420) ",\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\10\00\00\00 \15\00\00 \15\00\00\04\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5468) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00\\\00u\001\00\00\00\00\00\00\00") - (data (i32.const 5500) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00p\15\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5532) ",\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\14\00\00\00\90\15\00\00\90\15\00\00\04\00\00\00\01\00\00\00\00\16\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5580) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00p\15\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5612) ",\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\10\00\00\00\e0\15\00\00\e0\15\00\00\04\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5660) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\10\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5692) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00\\\00u\001\000\000\000\00") - (data (i32.const 5724) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\000\16\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5756) ",\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\14\00\00\00p\16\00\00p\16\00\00\04\00\00\00\01\00\00\00\e0\16\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5804) "\1c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00P\16\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5836) ",\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\10\00\00\00\c0\16\00\00\c0\16\00\00\04\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 5888) "\07\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\04A\00\00\00\00\00\00 \00\00\00\00\00\00\00\02A\00\00\06\00\00\00\02A\00\00\00\00\00\00") + (data (i32.const 4576) "\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) (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) @@ -123,10 +91,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 5888)) - (global $~lib/memory/__data_end i32 (i32.const 5948)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 22332)) - (global $~lib/memory/__heap_base i32 (i32.const 22332)) + (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 $~started (mut i32) (i32.const 0)) (export "memory" (memory $0)) (export "_start" (func $~start)) @@ -5651,77 +5619,6 @@ local.get $1 call $~lib/string/String#concat ) - (func $~lib/array/Array<~lib/string/String>#get:length (param $0 i32) (result i32) - local.get $0 - i32.load offset=12 - ) - (func $~lib/rt/__instanceof (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - local.get $0 - i32.const 20 - i32.sub - i32.load offset=12 - local.set $2 - global.get $~lib/rt/__rtti_base - local.set $3 - local.get $2 - local.get $3 - i32.load - i32.le_u - if - loop $do-continue|0 - local.get $2 - local.get $1 - i32.eq - if - i32.const 1 - return - end - local.get $3 - i32.const 4 - i32.add - local.get $2 - i32.const 8 - i32.mul - i32.add - i32.load offset=4 - local.tee $2 - local.set $4 - local.get $4 - br_if $do-continue|0 - end - end - i32.const 0 - ) - (func $~lib/array/Array<~lib/string/String>#join (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - local.get $0 - i32.load offset=4 - local.set $2 - local.get $0 - i32.load offset=12 - local.set $3 - 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 - drop - local.get $2 - local.get $3 - local.get $1 - call $~lib/util/string/joinStringArray - return - ) (func $start:templateliteral i32.const 208 call $~lib/rt/itcms/initLazy @@ -5744,17 +5641,12 @@ call $templateliteral/test_integer call $templateliteral/test_float call $templateliteral/test_ref - call $templateliteral/test_tag - call $templateliteral/test_raw ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) i32.const 256 local.get $0 call $~lib/rt/itcms/__visit - i32.const 4800 - local.get $0 - call $~lib/rt/itcms/__visit i32.const 368 local.get $0 call $~lib/rt/itcms/__visit @@ -5821,103 +5713,33 @@ local.get $1 call $~lib/staticarray/StaticArray<~lib/string/String>#__visit ) - (func $~lib/array/Array<~lib/string/String>#__visit (param $0 i32) (param $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - i32.const 1 - drop - local.get $0 - i32.load offset=4 - local.set $2 - local.get $2 - local.get $0 - i32.load offset=12 - i32.const 2 - i32.shl - i32.add - local.set $3 - loop $while-continue|0 - local.get $2 - local.get $3 - i32.lt_u - local.set $4 - local.get $4 - if - local.get $2 - i32.load - local.set $5 - local.get $5 - if - local.get $5 - local.get $1 - call $~lib/rt/itcms/__visit - end - local.get $2 - i32.const 4 - i32.add - local.set $2 - br $while-continue|0 - end - end - local.get $0 - i32.load - local.get $1 - call $~lib/rt/itcms/__visit - ) - (func $~lib/string/TemplateStringsArray~visit (param $0 i32) (param $1 i32) - local.get $0 - local.get $1 - call $~lib/array/Array<~lib/string/String>~visit - local.get $0 - local.get $1 - call $~lib/array/Array<~lib/string/String>#__visit - ) - (func $~lib/array/Array<~lib/string/String>~visit (param $0 i32) (param $1 i32) - local.get $0 - local.get $1 - call $~lib/array/Array<~lib/string/String>#__visit - ) (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) block $invalid - block $~lib/array/Array<~lib/string/String> - block $~lib/string/TemplateStringsArray - 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 $~lib/string/TemplateStringsArray $~lib/array/Array<~lib/string/String> $invalid - end - return - end - return + 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 - local.get $0 - local.get $1 - call $~lib/arraybuffer/ArrayBufferView~visit return end - local.get $0 - local.get $1 - call $~lib/staticarray/StaticArray<~lib/string/String>~visit return end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit return end local.get $0 local.get $1 - call $~lib/string/TemplateStringsArray~visit + call $~lib/staticarray/StaticArray<~lib/string/String>~visit return end - local.get $0 - local.get $1 - call $~lib/array/Array<~lib/string/String>~visit return end unreachable @@ -5936,8 +5758,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 22352 - i32.const 22400 + i32.const 21024 + i32.const 21072 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6788,11 +6610,19 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $templateliteral/tag (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) + (func $~lib/util/string/joinStringArray (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 12 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check @@ -6800,662 +6630,24 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store offset=8 - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store offset=16 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.load offset=16 - local.tee $2 - i32.store - local.get $0 - call $~lib/array/Array<~lib/string/String>#get:length - i32.const 2 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 46 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - local.get $2 - call $~lib/array/Array<~lib/string/String>#get:length - i32.const 2 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 47 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - local.get $0 i32.const 0 - call $~lib/array/Array<~lib/string/String>#__get - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store offset=4 - local.get $3 - i32.const 32 - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 i32.store offset=8 - local.get $3 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 48 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - local.get $2 - i32.const 0 - call $~lib/array/Array<~lib/string/String>#__get - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store offset=4 - local.get $3 - i32.const 32 + local.get $1 + i32.const 1 + i32.sub local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store offset=8 local.get $3 - call $~lib/string/String.__eq - i32.eqz + i32.const 0 + i32.lt_s if - i32.const 0 - i32.const 560 - i32.const 49 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - local.get $0 - i32.const 1 - call $~lib/array/Array<~lib/string/String>#__get - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store offset=4 - local.get $3 - i32.const 64 - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store offset=8 - local.get $3 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 50 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - local.get $2 - i32.const 1 - call $~lib/array/Array<~lib/string/String>#__get - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store offset=4 - local.get $3 - i32.const 64 - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store offset=8 - local.get $3 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 51 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - local.get $1 - i32.const 1 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 52 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - local.get $0 - i32.const 0 - call $~lib/array/Array<~lib/string/String>#__get - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store offset=12 - local.get $3 - local.get $1 - i32.const 10 - call $~lib/number/I32#toString - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store offset=16 - local.get $3 - call $~lib/string/String.__concat - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store offset=4 - local.get $3 - local.get $0 - i32.const 1 - call $~lib/array/Array<~lib/string/String>#__get - local.set $3 - global.get $~lib/memory/__stack_pointer - local.get $3 - i32.store offset=8 - local.get $3 - call $~lib/string/String.__concat - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 20 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - ) - (func $templateliteral/ns.tag (param $0 i32) (param $1 i32) (param $2 i32) (result i32) - (local $3 i32) - (local $4 i32) - global.get $~lib/memory/__stack_pointer - i32.const 24 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store offset=8 - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store offset=16 - local.get $0 - local.tee $3 - i32.eqz - if (result i32) - i32.const 0 - else - local.get $3 - i32.const 5 - call $~lib/rt/__instanceof - end - i32.eqz - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 58 - i32.const 5 - call $~lib/builtins/abort - unreachable - end - local.get $0 - call $~lib/array/Array<~lib/string/String>#get:length - i32.const 3 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 59 - i32.const 5 - call $~lib/builtins/abort - unreachable - end - local.get $0 - i32.const 0 - call $~lib/array/Array<~lib/string/String>#__get - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store - local.get $4 - i32.const 4960 - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store offset=4 - local.get $4 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 60 - i32.const 5 - call $~lib/builtins/abort - unreachable - end - local.get $0 - i32.const 1 - call $~lib/array/Array<~lib/string/String>#__get - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store - local.get $4 - i32.const 4992 - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store offset=4 - local.get $4 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 61 - i32.const 5 - call $~lib/builtins/abort - unreachable - end - local.get $0 - i32.const 2 - call $~lib/array/Array<~lib/string/String>#__get - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store - local.get $4 - i32.const 96 - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store offset=4 - local.get $4 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 62 - i32.const 5 - call $~lib/builtins/abort - unreachable - end - local.get $1 - i32.const 2 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 63 - i32.const 5 - call $~lib/builtins/abort - unreachable - end - local.get $2 - i32.const 2 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 64 - i32.const 5 - call $~lib/builtins/abort - unreachable - end - local.get $0 - i32.const 0 - call $~lib/array/Array<~lib/string/String>#__get - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store offset=16 - local.get $4 - local.get $1 - i32.const 10 - call $~lib/number/I32#toString - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store offset=20 - local.get $4 - call $~lib/string/String.__concat - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store offset=8 - local.get $4 - local.get $0 - i32.const 1 - call $~lib/array/Array<~lib/string/String>#__get - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store offset=12 - local.get $4 - call $~lib/string/String.__concat - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store - local.get $4 - local.get $2 - i32.const 10 - call $~lib/number/I32#toString - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store offset=4 - local.get $4 - call $~lib/string/String.__concat - local.set $4 - global.get $~lib/memory/__stack_pointer - i32.const 24 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $4 - ) - (func $templateliteral/test_tag - (local $0 i32) - global.get $~lib/memory/__stack_pointer - 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 4624 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - i32.const 1 - call $templateliteral/tag - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 4928 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 70 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - i32.const 5056 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - i32.const 2 - i32.const 2 - call $templateliteral/ns.tag - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 5104 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 71 - 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 - ) - (func $templateliteral/raw (param $0 i32) (result i32) - (local $1 i32) - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store - local.get $0 - i32.load offset=16 - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.store - local.get $1 - i32.const 96 - local.set $1 - global.get $~lib/memory/__stack_pointer - local.get $1 - i32.store offset=4 - local.get $1 - call $~lib/array/Array<~lib/string/String>#join - local.set $1 - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $1 - ) - (func $templateliteral/test_raw - (local $0 i32) - global.get $~lib/memory/__stack_pointer - 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 5168 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $templateliteral/raw - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 96 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 80 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - i32.const 5360 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $templateliteral/raw - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 5296 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 81 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - i32.const 5552 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $templateliteral/raw - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 5488 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 82 - i32.const 3 - call $~lib/builtins/abort - unreachable - end - i32.const 5776 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $templateliteral/raw - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 5712 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 560 - i32.const 83 - 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 - ) - (func $~lib/util/string/joinStringArray (param $0 i32) (param $1 i32) (param $2 i32) (result i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - global.get $~lib/memory/__stack_pointer - 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 - local.get $1 - i32.const 1 - i32.sub - local.set $3 - local.get $3 - i32.const 0 - i32.lt_s - if - i32.const 96 - local.set $12 - global.get $~lib/memory/__stack_pointer - i32.const 12 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $12 - return + i32.const 96 + local.set $12 + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $12 + return end local.get $3 i32.eqz @@ -7976,60 +7168,4 @@ global.set $~lib/memory/__stack_pointer local.get $6 ) - (func $~lib/array/Array<~lib/string/String>#__get (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - local.get $1 - local.get $0 - i32.load offset=12 - i32.ge_u - if - i32.const 256 - i32.const 4752 - i32.const 92 - i32.const 42 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.load offset=4 - local.get $1 - i32.const 2 - i32.shl - i32.add - i32.load - local.tee $2 - i32.store - i32.const 1 - drop - i32.const 0 - i32.eqz - drop - local.get $2 - i32.eqz - if - i32.const 4800 - i32.const 4752 - i32.const 96 - i32.const 40 - call $~lib/builtins/abort - unreachable - end - local.get $2 - local.set $3 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $3 - ) )