summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/gen-s-parser.py1
-rw-r--r--src/gen-s-parser.inc10
-rw-r--r--src/passes/Print.cpp3
-rw-r--r--src/wasm-binary.h1
-rw-r--r--src/wasm.h1
-rw-r--r--src/wasm/wasm-binary.cpp2
-rw-r--r--src/wasm/wasm-stack.cpp3
-rw-r--r--test/lit/strings.wast21
8 files changed, 42 insertions, 0 deletions
diff --git a/scripts/gen-s-parser.py b/scripts/gen-s-parser.py
index 796732bbf..3e6889ab9 100755
--- a/scripts/gen-s-parser.py
+++ b/scripts/gen-s-parser.py
@@ -635,6 +635,7 @@ instructions = [
("stringview_wtf8.slice", "makeStringSliceWTF(s, StringSliceWTF8)"),
("stringview_wtf16.slice", "makeStringSliceWTF(s, StringSliceWTF16)"),
("stringview_iter.slice", "makeStringSliceIter(s)"),
+ ("stringview_wtf16.length", "makeStringMeasure(s, StringMeasureWTF16View)"),
]
diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc
index dd7b57917..1c3a24749 100644
--- a/src/gen-s-parser.inc
+++ b/src/gen-s-parser.inc
@@ -3234,6 +3234,9 @@ switch (op[0]) {
case 'g':
if (strcmp(op, "stringview_wtf16.get_codeunit") == 0) { return makeStringWTF16Get(s); }
goto parse_error;
+ case 'l':
+ if (strcmp(op, "stringview_wtf16.length") == 0) { return makeStringMeasure(s, StringMeasureWTF16View); }
+ goto parse_error;
case 's':
if (strcmp(op, "stringview_wtf16.slice") == 0) { return makeStringSliceWTF(s, StringSliceWTF16); }
goto parse_error;
@@ -8981,6 +8984,13 @@ switch (op[0]) {
return *ret;
}
goto parse_error;
+ case 'l':
+ if (op == "stringview_wtf16.length"sv) {
+ auto ret = makeStringMeasure(ctx, in, StringMeasureWTF16View);
+ CHECK_ERR(ret);
+ return *ret;
+ }
+ goto parse_error;
case 's':
if (op == "stringview_wtf16.slice"sv) {
auto ret = makeStringSliceWTF(ctx, in, StringSliceWTF16);
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp
index 526059a66..208833357 100644
--- a/src/passes/Print.cpp
+++ b/src/passes/Print.cpp
@@ -2256,6 +2256,9 @@ struct PrintExpressionContents
case StringMeasureIsUSV:
printMedium(o, "string.is_usv_sequence");
break;
+ case StringMeasureWTF16View:
+ printMedium(o, "stringview_wtf16.length");
+ break;
default:
WASM_UNREACHABLE("invalid string.measure*");
}
diff --git a/src/wasm-binary.h b/src/wasm-binary.h
index ba8d547d8..23b7ace5a 100644
--- a/src/wasm-binary.h
+++ b/src/wasm-binary.h
@@ -1151,6 +1151,7 @@ enum ASTNodes {
StringViewWTF8Advance = 0x91,
StringViewWTF8Slice = 0x93,
StringAsWTF16 = 0x98,
+ StringViewWTF16Length = 0x99,
StringViewWTF16GetCodePoint = 0x9a,
StringViewWTF16Slice = 0x9c,
StringAsIter = 0xa0,
diff --git a/src/wasm.h b/src/wasm.h
index 357c613a7..a2f361917 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -595,6 +595,7 @@ enum StringMeasureOp {
StringMeasureWTF8,
StringMeasureWTF16,
StringMeasureIsUSV,
+ StringMeasureWTF16View,
};
enum StringEncodeOp {
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index 59276124e..8108027d4 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -7214,6 +7214,8 @@ bool WasmBinaryBuilder::maybeVisitStringMeasure(Expression*& out,
op = StringMeasureWTF16;
} else if (code == BinaryConsts::StringIsUSV) {
op = StringMeasureIsUSV;
+ } else if (code == BinaryConsts::StringViewWTF16Length) {
+ op = StringMeasureWTF16View;
} else {
return false;
}
diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp
index 3707848d1..0e39862e7 100644
--- a/src/wasm/wasm-stack.cpp
+++ b/src/wasm/wasm-stack.cpp
@@ -2279,6 +2279,9 @@ void BinaryInstWriter::visitStringMeasure(StringMeasure* curr) {
case StringMeasureIsUSV:
o << U32LEB(BinaryConsts::StringIsUSV);
break;
+ case StringMeasureWTF16View:
+ o << U32LEB(BinaryConsts::StringViewWTF16Length);
+ break;
default:
WASM_UNREACHABLE("invalid string.new*");
}
diff --git a/test/lit/strings.wast b/test/lit/strings.wast
index 1b2d77bd8..25ec73326 100644
--- a/test/lit/strings.wast
+++ b/test/lit/strings.wast
@@ -15,6 +15,8 @@
;; CHECK: (type $none_=>_none (func))
+ ;; CHECK: (type $ref?|stringview_wtf16|_=>_none (func (param stringview_wtf16)))
+
;; CHECK: (global $string-const stringref (string.const "string in a global"))
(global $string-const stringref (string.const "string in a global"))
@@ -404,4 +406,23 @@
)
)
)
+
+ ;; CHECK: (func $string.length (param $ref stringview_wtf16)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.eqz
+ ;; CHECK-NEXT: (stringview_wtf16.length
+ ;; CHECK-NEXT: (local.get $ref)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $string.length (param $ref stringview_wtf16)
+ (drop
+ (i32.eqz ;; validate the output is i32
+ (stringview_wtf16.length
+ (local.get $ref)
+ )
+ )
+ )
+ )
)