diff options
-rwxr-xr-x | scripts/gen-s-parser.py | 9 | ||||
-rw-r--r-- | src/gen-s-parser.inc | 260 | ||||
-rw-r--r-- | src/passes/Print.cpp | 28 | ||||
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 64 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.txt | 28 | ||||
-rw-r--r-- | test/lit/passes/simplify-locals-strings.wast | 52 | ||||
-rw-r--r-- | test/lit/strings.wast | 204 |
7 files changed, 501 insertions, 144 deletions
diff --git a/scripts/gen-s-parser.py b/scripts/gen-s-parser.py index f82156b43..7e8a5b830 100755 --- a/scripts/gen-s-parser.py +++ b/scripts/gen-s-parser.py @@ -597,20 +597,29 @@ instructions = [ ("ref.as_non_null", "makeRefAs(s, RefAsNonNull)"), ("extern.internalize", "makeRefAs(s, ExternInternalize)"), ("extern.externalize", "makeRefAs(s, ExternExternalize)"), + ("string.new_utf8", "makeStringNew(s, StringNewUTF8, false)"), + ("string.new_lossy_utf8", "makeStringNew(s, StringNewLossyUTF8, false)"), ("string.new_wtf8", "makeStringNew(s, StringNewWTF8, false)"), ("string.new_wtf16", "makeStringNew(s, StringNewWTF16, false)"), + ("string.new_utf8_array", "makeStringNew(s, StringNewUTF8Array, false)"), + ("string.new_lossy_utf8_array", "makeStringNew(s, StringNewLossyUTF8Array, false)"), ("string.new_wtf8_array", "makeStringNew(s, StringNewWTF8Array, false)"), ("string.new_wtf16_array", "makeStringNew(s, StringNewWTF16Array, false)"), ("string.from_code_point", "makeStringNew(s, StringNewFromCodePoint, false)"), ("string.new_utf8_try", "makeStringNew(s, StringNewUTF8, true)"), ("string.new_utf8_array_try", "makeStringNew(s, StringNewUTF8Array, true)"), ("string.const", "makeStringConst(s)"), + ("string.measure_utf8", "makeStringMeasure(s, StringMeasureUTF8)"), ("string.measure_wtf8", "makeStringMeasure(s, StringMeasureWTF8)"), ("string.measure_wtf16", "makeStringMeasure(s, StringMeasureWTF16)"), ("string.is_usv_sequence", "makeStringMeasure(s, StringMeasureIsUSV)"), ("string.hash", "makeStringMeasure(s, StringMeasureHash)"), + ("string.encode_utf8", "makeStringEncode(s, StringEncodeUTF8)"), + ("string.encode_lossy_utf8", "makeStringEncode(s, StringEncodeLossyUTF8)"), ("string.encode_wtf8", "makeStringEncode(s, StringEncodeWTF8)"), ("string.encode_wtf16", "makeStringEncode(s, StringEncodeWTF16)"), + ("string.encode_utf8_array", "makeStringEncode(s, StringEncodeUTF8Array)"), + ("string.encode_lossy_utf8_array", "makeStringEncode(s, StringEncodeLossyUTF8Array)"), ("string.encode_wtf8_array", "makeStringEncode(s, StringEncodeWTF8Array)"), ("string.encode_wtf16_array", "makeStringEncode(s, StringEncodeWTF16Array)"), ("string.concat", "makeStringConcat(s)"), diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc index ce7baadd5..14386334e 100644 --- a/src/gen-s-parser.inc +++ b/src/gen-s-parser.inc @@ -3089,29 +3089,56 @@ switch (buf[0]) { case 'e': { switch (buf[8]) { case 'n': { - switch (buf[17]) { - case '1': { - switch (buf[19]) { + switch (buf[14]) { + case 'l': { + switch (buf[24]) { case '\0': - if (op == "string.encode_wtf16"sv) { return makeStringEncode(s, StringEncodeWTF16); } + if (op == "string.encode_lossy_utf8"sv) { return makeStringEncode(s, StringEncodeLossyUTF8); } goto parse_error; case '_': - if (op == "string.encode_wtf16_array"sv) { return makeStringEncode(s, StringEncodeWTF16Array); } + if (op == "string.encode_lossy_utf8_array"sv) { return makeStringEncode(s, StringEncodeLossyUTF8Array); } goto parse_error; default: goto parse_error; } } - case '8': { + case 'u': { switch (buf[18]) { case '\0': - if (op == "string.encode_wtf8"sv) { return makeStringEncode(s, StringEncodeWTF8); } + if (op == "string.encode_utf8"sv) { return makeStringEncode(s, StringEncodeUTF8); } goto parse_error; case '_': - if (op == "string.encode_wtf8_array"sv) { return makeStringEncode(s, StringEncodeWTF8Array); } + if (op == "string.encode_utf8_array"sv) { return makeStringEncode(s, StringEncodeUTF8Array); } goto parse_error; default: goto parse_error; } } + case 'w': { + switch (buf[17]) { + case '1': { + switch (buf[19]) { + case '\0': + if (op == "string.encode_wtf16"sv) { return makeStringEncode(s, StringEncodeWTF16); } + goto parse_error; + case '_': + if (op == "string.encode_wtf16_array"sv) { return makeStringEncode(s, StringEncodeWTF16Array); } + goto parse_error; + default: goto parse_error; + } + } + case '8': { + switch (buf[18]) { + case '\0': + if (op == "string.encode_wtf8"sv) { return makeStringEncode(s, StringEncodeWTF8); } + goto parse_error; + case '_': + if (op == "string.encode_wtf8_array"sv) { return makeStringEncode(s, StringEncodeWTF8Array); } + goto parse_error; + default: goto parse_error; + } + } + default: goto parse_error; + } + } default: goto parse_error; } } @@ -3131,29 +3158,64 @@ switch (buf[0]) { if (op == "string.is_usv_sequence"sv) { return makeStringMeasure(s, StringMeasureIsUSV); } goto parse_error; case 'm': { - switch (buf[18]) { - case '1': - if (op == "string.measure_wtf16"sv) { return makeStringMeasure(s, StringMeasureWTF16); } - goto parse_error; - case '8': - if (op == "string.measure_wtf8"sv) { return makeStringMeasure(s, StringMeasureWTF8); } + switch (buf[15]) { + case 'u': + if (op == "string.measure_utf8"sv) { return makeStringMeasure(s, StringMeasureUTF8); } goto parse_error; + case 'w': { + switch (buf[18]) { + case '1': + if (op == "string.measure_wtf16"sv) { return makeStringMeasure(s, StringMeasureWTF16); } + goto parse_error; + case '8': + if (op == "string.measure_wtf8"sv) { return makeStringMeasure(s, StringMeasureWTF8); } + goto parse_error; + default: goto parse_error; + } + } default: goto parse_error; } } case 'n': { switch (buf[11]) { - case 'u': { - switch (buf[16]) { - case 'a': - if (op == "string.new_utf8_array_try"sv) { return makeStringNew(s, StringNewUTF8Array, true); } + case 'l': { + switch (buf[21]) { + case '\0': + if (op == "string.new_lossy_utf8"sv) { return makeStringNew(s, StringNewLossyUTF8, false); } goto parse_error; - case 't': - if (op == "string.new_utf8_try"sv) { return makeStringNew(s, StringNewUTF8, true); } + case '_': + if (op == "string.new_lossy_utf8_array"sv) { return makeStringNew(s, StringNewLossyUTF8Array, false); } goto parse_error; default: goto parse_error; } } + case 'u': { + switch (buf[15]) { + case '\0': + if (op == "string.new_utf8"sv) { return makeStringNew(s, StringNewUTF8, false); } + goto parse_error; + case '_': { + switch (buf[16]) { + case 'a': { + switch (buf[21]) { + case '\0': + if (op == "string.new_utf8_array"sv) { return makeStringNew(s, StringNewUTF8Array, false); } + goto parse_error; + case '_': + if (op == "string.new_utf8_array_try"sv) { return makeStringNew(s, StringNewUTF8Array, true); } + goto parse_error; + default: goto parse_error; + } + } + case 't': + if (op == "string.new_utf8_try"sv) { return makeStringNew(s, StringNewUTF8, true); } + goto parse_error; + default: goto parse_error; + } + } + default: goto parse_error; + } + } case 'w': { switch (buf[14]) { case '1': { @@ -8695,19 +8757,19 @@ switch (buf[0]) { case 'e': { switch (buf[8]) { case 'n': { - switch (buf[17]) { - case '1': { - switch (buf[19]) { + switch (buf[14]) { + case 'l': { + switch (buf[24]) { case '\0': - if (op == "string.encode_wtf16"sv) { - auto ret = makeStringEncode(ctx, pos, StringEncodeWTF16); + if (op == "string.encode_lossy_utf8"sv) { + auto ret = makeStringEncode(ctx, pos, StringEncodeLossyUTF8); CHECK_ERR(ret); return *ret; } goto parse_error; case '_': - if (op == "string.encode_wtf16_array"sv) { - auto ret = makeStringEncode(ctx, pos, StringEncodeWTF16Array); + if (op == "string.encode_lossy_utf8_array"sv) { + auto ret = makeStringEncode(ctx, pos, StringEncodeLossyUTF8Array); CHECK_ERR(ret); return *ret; } @@ -8715,18 +8777,18 @@ switch (buf[0]) { default: goto parse_error; } } - case '8': { + case 'u': { switch (buf[18]) { case '\0': - if (op == "string.encode_wtf8"sv) { - auto ret = makeStringEncode(ctx, pos, StringEncodeWTF8); + if (op == "string.encode_utf8"sv) { + auto ret = makeStringEncode(ctx, pos, StringEncodeUTF8); CHECK_ERR(ret); return *ret; } goto parse_error; case '_': - if (op == "string.encode_wtf8_array"sv) { - auto ret = makeStringEncode(ctx, pos, StringEncodeWTF8Array); + if (op == "string.encode_utf8_array"sv) { + auto ret = makeStringEncode(ctx, pos, StringEncodeUTF8Array); CHECK_ERR(ret); return *ret; } @@ -8734,6 +8796,49 @@ switch (buf[0]) { default: goto parse_error; } } + case 'w': { + switch (buf[17]) { + case '1': { + switch (buf[19]) { + case '\0': + if (op == "string.encode_wtf16"sv) { + auto ret = makeStringEncode(ctx, pos, StringEncodeWTF16); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + case '_': + if (op == "string.encode_wtf16_array"sv) { + auto ret = makeStringEncode(ctx, pos, StringEncodeWTF16Array); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + default: goto parse_error; + } + } + case '8': { + switch (buf[18]) { + case '\0': + if (op == "string.encode_wtf8"sv) { + auto ret = makeStringEncode(ctx, pos, StringEncodeWTF8); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + case '_': + if (op == "string.encode_wtf8_array"sv) { + auto ret = makeStringEncode(ctx, pos, StringEncodeWTF8Array); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + default: goto parse_error; + } + } + default: goto parse_error; + } + } default: goto parse_error; } } @@ -8769,38 +8874,50 @@ switch (buf[0]) { } goto parse_error; case 'm': { - switch (buf[18]) { - case '1': - if (op == "string.measure_wtf16"sv) { - auto ret = makeStringMeasure(ctx, pos, StringMeasureWTF16); + switch (buf[15]) { + case 'u': + if (op == "string.measure_utf8"sv) { + auto ret = makeStringMeasure(ctx, pos, StringMeasureUTF8); CHECK_ERR(ret); return *ret; } goto parse_error; - case '8': - if (op == "string.measure_wtf8"sv) { - auto ret = makeStringMeasure(ctx, pos, StringMeasureWTF8); - CHECK_ERR(ret); - return *ret; + case 'w': { + switch (buf[18]) { + case '1': + if (op == "string.measure_wtf16"sv) { + auto ret = makeStringMeasure(ctx, pos, StringMeasureWTF16); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + case '8': + if (op == "string.measure_wtf8"sv) { + auto ret = makeStringMeasure(ctx, pos, StringMeasureWTF8); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + default: goto parse_error; } - goto parse_error; + } default: goto parse_error; } } case 'n': { switch (buf[11]) { - case 'u': { - switch (buf[16]) { - case 'a': - if (op == "string.new_utf8_array_try"sv) { - auto ret = makeStringNew(ctx, pos, StringNewUTF8Array, true); + case 'l': { + switch (buf[21]) { + case '\0': + if (op == "string.new_lossy_utf8"sv) { + auto ret = makeStringNew(ctx, pos, StringNewLossyUTF8, false); CHECK_ERR(ret); return *ret; } goto parse_error; - case 't': - if (op == "string.new_utf8_try"sv) { - auto ret = makeStringNew(ctx, pos, StringNewUTF8, true); + case '_': + if (op == "string.new_lossy_utf8_array"sv) { + auto ret = makeStringNew(ctx, pos, StringNewLossyUTF8Array, false); CHECK_ERR(ret); return *ret; } @@ -8808,6 +8925,49 @@ switch (buf[0]) { default: goto parse_error; } } + case 'u': { + switch (buf[15]) { + case '\0': + if (op == "string.new_utf8"sv) { + auto ret = makeStringNew(ctx, pos, StringNewUTF8, false); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + case '_': { + switch (buf[16]) { + case 'a': { + switch (buf[21]) { + case '\0': + if (op == "string.new_utf8_array"sv) { + auto ret = makeStringNew(ctx, pos, StringNewUTF8Array, false); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + case '_': + if (op == "string.new_utf8_array_try"sv) { + auto ret = makeStringNew(ctx, pos, StringNewUTF8Array, true); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + default: goto parse_error; + } + } + case 't': + if (op == "string.new_utf8_try"sv) { + auto ret = makeStringNew(ctx, pos, StringNewUTF8, true); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; + default: goto parse_error; + } + } + default: goto parse_error; + } + } case 'w': { switch (buf[14]) { case '1': { diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index dee23d67d..4e7ae3730 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -2301,32 +2301,32 @@ struct PrintExpressionContents switch (curr->op) { case StringNewUTF8: if (!curr->try_) { - printMedium(o, "string.new_wtf8 utf8"); + printMedium(o, "string.new_utf8"); } else { printMedium(o, "string.new_utf8_try"); } break; case StringNewWTF8: - printMedium(o, "string.new_wtf8 wtf8"); + printMedium(o, "string.new_wtf8"); break; case StringNewLossyUTF8: - printMedium(o, "string.new_wtf8 replace"); + printMedium(o, "string.new_lossy_utf8"); break; case StringNewWTF16: printMedium(o, "string.new_wtf16"); break; case StringNewUTF8Array: if (!curr->try_) { - printMedium(o, "string.new_wtf8_array utf8"); + printMedium(o, "string.new_utf8_array"); } else { printMedium(o, "string.new_utf8_array_try"); } break; case StringNewWTF8Array: - printMedium(o, "string.new_wtf8_array wtf8"); + printMedium(o, "string.new_wtf8_array"); break; case StringNewLossyUTF8Array: - printMedium(o, "string.new_wtf8_array replace"); + printMedium(o, "string.new_lossy_utf8_array"); break; case StringNewWTF16Array: printMedium(o, "string.new_wtf16_array"); @@ -2345,10 +2345,10 @@ struct PrintExpressionContents void visitStringMeasure(StringMeasure* curr) { switch (curr->op) { case StringMeasureUTF8: - printMedium(o, "string.measure_wtf8 utf8"); + printMedium(o, "string.measure_utf8"); break; case StringMeasureWTF8: - printMedium(o, "string.measure_wtf8 wtf8"); + printMedium(o, "string.measure_wtf8"); break; case StringMeasureWTF16: printMedium(o, "string.measure_wtf16"); @@ -2369,25 +2369,25 @@ struct PrintExpressionContents void visitStringEncode(StringEncode* curr) { switch (curr->op) { case StringEncodeUTF8: - printMedium(o, "string.encode_wtf8 utf8"); + printMedium(o, "string.encode_utf8"); break; case StringEncodeLossyUTF8: - printMedium(o, "string.encode_wtf8 replace"); + printMedium(o, "string.encode_lossy_utf8"); break; case StringEncodeWTF8: - printMedium(o, "string.encode_wtf8 wtf8"); + printMedium(o, "string.encode_wtf8"); break; case StringEncodeWTF16: printMedium(o, "string.encode_wtf16"); break; case StringEncodeUTF8Array: - printMedium(o, "string.encode_wtf8_array utf8"); + printMedium(o, "string.encode_utf8_array"); break; case StringEncodeLossyUTF8Array: - printMedium(o, "string.encode_wtf8_array replace"); + printMedium(o, "string.encode_lossy_utf8_array"); break; case StringEncodeWTF8Array: - printMedium(o, "string.encode_wtf8_array wtf8"); + printMedium(o, "string.encode_wtf8_array"); break; case StringEncodeWTF16Array: printMedium(o, "string.encode_wtf16_array"); diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 1f215135e..b6b9a40fb 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -3111,8 +3111,9 @@ Expression* SExpressionWasmBuilder::makeStringNew(Element& s, StringNewOp op, bool try_) { size_t i = 1; Expression* length = nullptr; - if (op == StringNewWTF8 || op == StringNewUTF8) { - if (!try_) { + if (op == StringNewWTF8) { + if (s[i]->isStr()) { + // legacy syntax std::string_view str = s[i++]->str().str; if (str == "utf8") { op = StringNewUTF8; @@ -3126,11 +3127,13 @@ SExpressionWasmBuilder::makeStringNew(Element& s, StringNewOp op, bool try_) { } length = parseExpression(s[i + 1]); return Builder(wasm).makeStringNew(op, parseExpression(s[i]), length, try_); - } else if (op == StringNewWTF16) { + } else if (op == StringNewUTF8 || op == StringNewLossyUTF8 || + op == StringNewWTF16) { length = parseExpression(s[i + 1]); return Builder(wasm).makeStringNew(op, parseExpression(s[i]), length, try_); - } else if (op == StringNewWTF8Array || op == StringNewUTF8Array) { - if (!try_) { + } else if (op == StringNewWTF8Array) { + if (s[i]->isStr()) { + // legacy syntax std::string_view str = s[i++]->str().str; if (str == "utf8") { op = StringNewUTF8Array; @@ -3146,7 +3149,8 @@ SExpressionWasmBuilder::makeStringNew(Element& s, StringNewOp op, bool try_) { auto* end = parseExpression(s[i + 2]); return Builder(wasm).makeStringNew( op, parseExpression(s[i]), start, end, try_); - } else if (op == StringNewWTF16Array) { + } else if (op == StringNewUTF8Array || op == StringNewLossyUTF8Array || + op == StringNewWTF16Array) { auto* start = parseExpression(s[i + 1]); auto* end = parseExpression(s[i + 2]); return Builder(wasm).makeStringNew( @@ -3169,7 +3173,8 @@ Expression* SExpressionWasmBuilder::makeStringConst(Element& s) { Expression* SExpressionWasmBuilder::makeStringMeasure(Element& s, StringMeasureOp op) { size_t i = 1; - if (op == StringMeasureWTF8) { + if (op == StringMeasureWTF8 && s[i]->isStr()) { + // legacy syntax std::string_view str = s[i++]->str().str; if (str == "utf8") { op = StringMeasureUTF8; @@ -3187,29 +3192,36 @@ Expression* SExpressionWasmBuilder::makeStringEncode(Element& s, size_t i = 1; Expression* start = nullptr; if (op == StringEncodeWTF8) { - std::string_view str = s[i++]->str().str; - if (str == "utf8") { - op = StringEncodeUTF8; - } else if (str == "replace") { - op = StringEncodeLossyUTF8; - } else if (str == "wtf8") { - op = StringEncodeWTF8; - } else { - throw ParseException("bad string.new op", s.line, s.col); + if (s[i]->isStr()) { + // legacy syntax + std::string_view str = s[i++]->str().str; + if (str == "utf8") { + op = StringEncodeUTF8; + } else if (str == "replace") { + op = StringEncodeLossyUTF8; + } else if (str == "wtf8") { + op = StringEncodeWTF8; + } else { + throw ParseException("bad string.new op", s.line, s.col); + } } } else if (op == StringEncodeWTF8Array) { - std::string_view str = s[i++]->str().str; - if (str == "utf8") { - op = StringEncodeUTF8Array; - } else if (str == "replace") { - op = StringEncodeLossyUTF8Array; - } else if (str == "wtf8") { - op = StringEncodeWTF8Array; - } else { - throw ParseException("bad string.new op", s.line, s.col); + if (s[i]->isStr()) { + // legacy syntax + std::string_view str = s[i++]->str().str; + if (str == "utf8") { + op = StringEncodeUTF8Array; + } else if (str == "replace") { + op = StringEncodeLossyUTF8Array; + } else if (str == "wtf8") { + op = StringEncodeWTF8Array; + } else { + throw ParseException("bad string.new op", s.line, s.col); + } } start = parseExpression(s[i + 2]); - } else if (op == StringEncodeWTF16Array) { + } else if (op == StringEncodeUTF8Array || op == StringEncodeLossyUTF8Array || + op == StringEncodeWTF16Array) { start = parseExpression(s[i + 2]); } return Builder(wasm).makeStringEncode( diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt index 1276a5a6a..edcc0b91e 100644 --- a/test/example/c-api-kitchen-sink.txt +++ b/test/example/c-api-kitchen-sink.txt @@ -2328,7 +2328,7 @@ BinaryenFeatureAll: 126975 (i32.const 2) ) (drop - (string.new_wtf8 utf8 + (string.new_utf8 (i32.const 0) (i32.const 0) ) @@ -2340,13 +2340,13 @@ BinaryenFeatureAll: 126975 ) ) (drop - (string.new_wtf8 wtf8 + (string.new_wtf8 (i32.const 0) (i32.const 0) ) ) (drop - (string.new_wtf8 replace + (string.new_lossy_utf8 (i32.const 0) (i32.const 0) ) @@ -2358,7 +2358,7 @@ BinaryenFeatureAll: 126975 ) ) (drop - (string.new_wtf8_array utf8 + (string.new_utf8_array (global.get $i8Array-global) (i32.const 0) (i32.const 0) @@ -2372,14 +2372,14 @@ BinaryenFeatureAll: 126975 ) ) (drop - (string.new_wtf8_array wtf8 + (string.new_wtf8_array (global.get $i8Array-global) (i32.const 0) (i32.const 0) ) ) (drop - (string.new_wtf8_array replace + (string.new_lossy_utf8_array (global.get $i8Array-global) (i32.const 0) (i32.const 0) @@ -2401,12 +2401,12 @@ BinaryenFeatureAll: 126975 (string.const "hello world") ) (drop - (string.measure_wtf8 utf8 + (string.measure_utf8 (global.get $string-global) ) ) (drop - (string.measure_wtf8 wtf8 + (string.measure_wtf8 (global.get $string-global) ) ) @@ -2428,19 +2428,19 @@ BinaryenFeatureAll: 126975 ) ) (drop - (string.encode_wtf8 utf8 + (string.encode_utf8 (global.get $string-global) (i32.const 0) ) ) (drop - (string.encode_wtf8 replace + (string.encode_lossy_utf8 (global.get $string-global) (i32.const 0) ) ) (drop - (string.encode_wtf8 wtf8 + (string.encode_wtf8 (global.get $string-global) (i32.const 0) ) @@ -2452,21 +2452,21 @@ BinaryenFeatureAll: 126975 ) ) (drop - (string.encode_wtf8_array utf8 + (string.encode_utf8_array (global.get $string-global) (global.get $i8Array-global) (i32.const 0) ) ) (drop - (string.encode_wtf8_array replace + (string.encode_lossy_utf8_array (global.get $string-global) (global.get $i8Array-global) (i32.const 0) ) ) (drop - (string.encode_wtf8_array wtf8 + (string.encode_wtf8_array (global.get $string-global) (global.get $i8Array-global) (i32.const 0) diff --git a/test/lit/passes/simplify-locals-strings.wast b/test/lit/passes/simplify-locals-strings.wast index 646eee6bd..ada49f3da 100644 --- a/test/lit/passes/simplify-locals-strings.wast +++ b/test/lit/passes/simplify-locals-strings.wast @@ -13,7 +13,7 @@ ;; CHECK: (func $no-new-past-store (type $none_=>_none) ;; CHECK-NEXT: (local $temp stringref) ;; CHECK-NEXT: (local.set $temp - ;; CHECK-NEXT: (string.new_wtf8 utf8 + ;; CHECK-NEXT: (string.new_utf8 ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) @@ -26,7 +26,7 @@ ;; CHECK-NEXT: (local.get $temp) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $temp - ;; CHECK-NEXT: (string.new_wtf8 wtf8 + ;; CHECK-NEXT: (string.new_wtf8 ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) @@ -39,7 +39,7 @@ ;; CHECK-NEXT: (local.get $temp) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $temp - ;; CHECK-NEXT: (string.new_wtf8 replace + ;; CHECK-NEXT: (string.new_lossy_utf8 ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) @@ -69,7 +69,7 @@ (local $temp stringref) ;; A string.new cannot be moved past a memory store. (local.set $temp - (string.new_wtf8 utf8 + (string.new_utf8 (i32.const 1) (i32.const 2) ) @@ -82,7 +82,7 @@ (local.get $temp) ) (local.set $temp - (string.new_wtf8 wtf8 + (string.new_wtf8 (i32.const 1) (i32.const 2) ) @@ -95,7 +95,7 @@ (local.get $temp) ) (local.set $temp - (string.new_wtf8 replace + (string.new_lossy_utf8 (i32.const 1) (i32.const 2) ) @@ -131,7 +131,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.new_wtf8 utf8 + ;; CHECK-NEXT: (string.new_utf8 ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) @@ -141,7 +141,7 @@ (local $temp stringref) ;; A string.new can be moved past a memory load. (local.set $temp - (string.new_wtf8 utf8 + (string.new_utf8 (i32.const 1) (i32.const 2) ) @@ -159,7 +159,7 @@ ;; CHECK: (func $no-new-past-store-gc (type $ref|$array|_ref|$array16|_=>_none) (param $array (ref $array)) (param $array16 (ref $array16)) ;; CHECK-NEXT: (local $temp stringref) ;; CHECK-NEXT: (local.set $temp - ;; CHECK-NEXT: (string.new_wtf8_array utf8 + ;; CHECK-NEXT: (string.new_utf8_array ;; CHECK-NEXT: (local.get $array) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 2) @@ -174,7 +174,7 @@ ;; CHECK-NEXT: (local.get $temp) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $temp - ;; CHECK-NEXT: (string.new_wtf8_array wtf8 + ;; CHECK-NEXT: (string.new_wtf8_array ;; CHECK-NEXT: (local.get $array) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 2) @@ -189,7 +189,7 @@ ;; CHECK-NEXT: (local.get $temp) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $temp - ;; CHECK-NEXT: (string.new_wtf8_array replace + ;; CHECK-NEXT: (string.new_lossy_utf8_array ;; CHECK-NEXT: (local.get $array) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 2) @@ -223,7 +223,7 @@ (local $temp stringref) ;; A string.new_***_array cannot be moved past a GC store. (local.set $temp - (string.new_wtf8_array utf8 + (string.new_utf8_array (local.get $array) (i32.const 1) (i32.const 2) @@ -238,7 +238,7 @@ (local.get $temp) ) (local.set $temp - (string.new_wtf8_array wtf8 + (string.new_wtf8_array (local.get $array) (i32.const 1) (i32.const 2) @@ -253,7 +253,7 @@ (local.get $temp) ) (local.set $temp - (string.new_wtf8_array replace + (string.new_lossy_utf8_array (local.get $array) (i32.const 1) (i32.const 2) @@ -292,7 +292,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.encode_wtf8 wtf8 + ;; CHECK-NEXT: (string.encode_wtf8 ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: (i32.const 10) ;; CHECK-NEXT: ) @@ -306,7 +306,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.encode_wtf8 utf8 + ;; CHECK-NEXT: (string.encode_utf8 ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: (i32.const 20) ;; CHECK-NEXT: ) @@ -320,7 +320,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.encode_wtf8 replace + ;; CHECK-NEXT: (string.encode_lossy_utf8 ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: (i32.const 30) ;; CHECK-NEXT: ) @@ -352,7 +352,7 @@ ) ) (drop - (string.encode_wtf8 wtf8 + (string.encode_wtf8 (local.get $ref) (i32.const 10) ) @@ -366,7 +366,7 @@ ) ) (drop - (string.encode_wtf8 utf8 + (string.encode_utf8 (local.get $ref) (i32.const 20) ) @@ -380,7 +380,7 @@ ) ) (drop - (string.encode_wtf8 replace + (string.encode_lossy_utf8 (local.get $ref) (i32.const 30) ) @@ -413,7 +413,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.encode_wtf8_array wtf8 + ;; CHECK-NEXT: (string.encode_wtf8_array ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: (local.get $array) ;; CHECK-NEXT: (i32.const 10) @@ -429,7 +429,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.encode_wtf8_array utf8 + ;; CHECK-NEXT: (string.encode_utf8_array ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: (local.get $array) ;; CHECK-NEXT: (i32.const 20) @@ -445,7 +445,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.encode_wtf8_array replace + ;; CHECK-NEXT: (string.encode_lossy_utf8_array ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: (local.get $array) ;; CHECK-NEXT: (i32.const 30) @@ -482,7 +482,7 @@ ) ) (drop - (string.encode_wtf8_array wtf8 + (string.encode_wtf8_array (local.get $ref) (local.get $array) (i32.const 10) @@ -498,7 +498,7 @@ ) ) (drop - (string.encode_wtf8_array utf8 + (string.encode_utf8_array (local.get $ref) (local.get $array) (i32.const 20) @@ -514,7 +514,7 @@ ) ) (drop - (string.encode_wtf8_array replace + (string.encode_lossy_utf8_array (local.get $ref) (local.get $array) (i32.const 30) diff --git a/test/lit/strings.wast b/test/lit/strings.wast index dcb1bffd2..6668ffd58 100644 --- a/test/lit/strings.wast +++ b/test/lit/strings.wast @@ -48,19 +48,19 @@ ;; CHECK: (func $string.new (type $stringref_stringview_wtf8_stringview_wtf16_stringview_iter_stringref_stringview_wtf8_stringview_wtf16_stringview_iter_ref|string|_ref|stringview_wtf8|_ref|stringview_wtf16|_ref|stringview_iter|_=>_none) (param $a stringref) (param $b stringview_wtf8) (param $c stringview_wtf16) (param $d stringview_iter) (param $e stringref) (param $f stringview_wtf8) (param $g stringview_wtf16) (param $h stringview_iter) (param $i (ref string)) (param $j (ref stringview_wtf8)) (param $k (ref stringview_wtf16)) (param $l (ref stringview_iter)) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.new_wtf8 utf8 + ;; CHECK-NEXT: (string.new_utf8 ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.new_wtf8 wtf8 + ;; CHECK-NEXT: (string.new_wtf8 ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.new_wtf8 replace + ;; CHECK-NEXT: (string.new_lossy_utf8 ;; CHECK-NEXT: (i32.const 5) ;; CHECK-NEXT: (i32.const 6) ;; CHECK-NEXT: ) @@ -71,6 +71,24 @@ ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (string.new_utf8 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (string.new_wtf8 + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (string.new_lossy_utf8 + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $string.new (param $a stringref) @@ -109,6 +127,24 @@ (i32.const 8) ) ) + (drop + (string.new_utf8 + (i32.const 1) + (i32.const 2) + ) + ) + (drop + (string.new_wtf8 + (i32.const 3) + (i32.const 4) + ) + ) + (drop + (string.new_lossy_utf8 + (i32.const 5) + (i32.const 6) + ) + ) ) ;; CHECK: (func $string.const (type $ref|string|_=>_none) (param $param (ref string)) @@ -138,13 +174,13 @@ ;; CHECK: (func $string.measure (type $stringref_=>_none) (param $ref stringref) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (string.measure_wtf8 wtf8 + ;; CHECK-NEXT: (string.measure_wtf8 ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.measure_wtf8 utf8 + ;; CHECK-NEXT: (string.measure_utf8 ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -153,6 +189,16 @@ ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (string.measure_wtf8 + ;; CHECK-NEXT: (local.get $ref) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (string.measure_utf8 + ;; CHECK-NEXT: (local.get $ref) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $string.measure (param $ref stringref) (drop @@ -172,12 +218,22 @@ (local.get $ref) ) ) + (drop + (string.measure_wtf8 + (local.get $ref) + ) + ) + (drop + (string.measure_utf8 + (local.get $ref) + ) + ) ) ;; CHECK: (func $string.encode (type $stringref_=>_none) (param $ref stringref) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (string.encode_wtf8 wtf8 + ;; CHECK-NEXT: (string.encode_wtf8 ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: (i32.const 10) ;; CHECK-NEXT: ) @@ -185,14 +241,14 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (string.encode_wtf8 replace + ;; CHECK-NEXT: (string.encode_lossy_utf8 ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: (i32.const 10) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.encode_wtf8 utf8 + ;; CHECK-NEXT: (string.encode_utf8 ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: (i32.const 20) ;; CHECK-NEXT: ) @@ -203,6 +259,24 @@ ;; CHECK-NEXT: (i32.const 30) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (string.encode_wtf8 + ;; CHECK-NEXT: (local.get $ref) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (string.encode_lossy_utf8 + ;; CHECK-NEXT: (local.get $ref) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (string.encode_utf8 + ;; CHECK-NEXT: (local.get $ref) + ;; CHECK-NEXT: (i32.const 20) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $string.encode (param $ref stringref) (drop @@ -233,6 +307,24 @@ (i32.const 30) ) ) + (drop + (string.encode_wtf8 + (local.get $ref) + (i32.const 10) + ) + ) + (drop + (string.encode_lossy_utf8 + (local.get $ref) + (i32.const 10) + ) + ) + (drop + (string.encode_utf8 + (local.get $ref) + (i32.const 20) + ) + ) ) ;; CHECK: (func $string.concat (type $stringref_stringref_=>_none) (param $a stringref) (param $b stringref) @@ -492,21 +584,21 @@ ;; CHECK: (func $string.new.gc (type $ref|$array|_ref|$array16|_=>_none) (param $array (ref $array)) (param $array16 (ref $array16)) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.new_wtf8_array utf8 + ;; CHECK-NEXT: (string.new_utf8_array ;; CHECK-NEXT: (local.get $array) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.new_wtf8_array wtf8 + ;; CHECK-NEXT: (string.new_wtf8_array ;; CHECK-NEXT: (local.get $array) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.new_wtf8_array replace + ;; CHECK-NEXT: (string.new_lossy_utf8_array ;; CHECK-NEXT: (local.get $array) ;; CHECK-NEXT: (i32.const 5) ;; CHECK-NEXT: (i32.const 6) @@ -519,6 +611,27 @@ ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (string.new_utf8_array + ;; CHECK-NEXT: (local.get $array) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (string.new_wtf8_array + ;; CHECK-NEXT: (local.get $array) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (string.new_lossy_utf8_array + ;; CHECK-NEXT: (local.get $array) + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $string.new.gc (param $array (ref $array)) (param $array16 (ref $array16)) (drop @@ -549,12 +662,33 @@ (i32.const 8) ) ) + (drop + (string.new_utf8_array + (local.get $array) + (i32.const 1) + (i32.const 2) + ) + ) + (drop + (string.new_wtf8_array + (local.get $array) + (i32.const 3) + (i32.const 4) + ) + ) + (drop + (string.new_lossy_utf8_array + (local.get $array) + (i32.const 5) + (i32.const 6) + ) + ) ) ;; CHECK: (func $string.encode.gc (type $stringref_ref|$array|_ref|$array16|_=>_none) (param $ref stringref) (param $array (ref $array)) (param $array16 (ref $array16)) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (string.encode_wtf8_array wtf8 + ;; CHECK-NEXT: (string.encode_wtf8_array ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: (local.get $array) ;; CHECK-NEXT: (i32.const 10) @@ -563,7 +697,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (string.encode_wtf8_array replace + ;; CHECK-NEXT: (string.encode_lossy_utf8_array ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: (local.get $array) ;; CHECK-NEXT: (i32.const 10) @@ -571,7 +705,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (string.encode_wtf8_array utf8 + ;; CHECK-NEXT: (string.encode_utf8_array ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: (local.get $array) ;; CHECK-NEXT: (i32.const 20) @@ -584,6 +718,27 @@ ;; CHECK-NEXT: (i32.const 30) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (string.encode_wtf8_array + ;; CHECK-NEXT: (local.get $ref) + ;; CHECK-NEXT: (local.get $array) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (string.encode_lossy_utf8_array + ;; CHECK-NEXT: (local.get $ref) + ;; CHECK-NEXT: (local.get $array) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (string.encode_utf8_array + ;; CHECK-NEXT: (local.get $ref) + ;; CHECK-NEXT: (local.get $array) + ;; CHECK-NEXT: (i32.const 20) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $string.encode.gc (param $ref stringref) (param $array (ref $array)) (param $array16 (ref $array16)) (drop @@ -618,6 +773,27 @@ (i32.const 30) ) ) + (drop + (string.encode_wtf8_array + (local.get $ref) + (local.get $array) + (i32.const 10) + ) + ) + (drop + (string.encode_lossy_utf8_array + (local.get $ref) + (local.get $array) + (i32.const 10) + ) + ) + (drop + (string.encode_utf8_array + (local.get $ref) + (local.get $array) + (i32.const 20) + ) + ) ) ;; CHECK: (func $string.from_code_point (type $none_=>_none) |