summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/gen-s-parser.py1
-rw-r--r--src/gen-s-parser.inc3
-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.wast19
8 files changed, 33 insertions, 0 deletions
diff --git a/scripts/gen-s-parser.py b/scripts/gen-s-parser.py
index 451430cc9..d0848622f 100755
--- a/scripts/gen-s-parser.py
+++ b/scripts/gen-s-parser.py
@@ -619,6 +619,7 @@ instructions = [
("string.const", "makeStringConst(s)"),
("string.measure_wtf8", "makeStringMeasure(s, StringMeasureWTF8)"),
("string.measure_wtf16", "makeStringMeasure(s, StringMeasureWTF16)"),
+ ("string.is_usv_sequence", "makeStringMeasure(s, StringMeasureIsUSV)"),
("string.encode_wtf8", "makeStringEncode(s, StringEncodeWTF8)"),
("string.encode_wtf16", "makeStringEncode(s, StringEncodeWTF16)"),
("string.concat", "makeStringConcat(s)"),
diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc
index 9c3fa90e4..7001cb10b 100644
--- a/src/gen-s-parser.inc
+++ b/src/gen-s-parser.inc
@@ -3159,6 +3159,9 @@ switch (op[0]) {
default: goto parse_error;
}
}
+ case 'i':
+ if (strcmp(op, "string.is_usv_sequence") == 0) { return makeStringMeasure(s, StringMeasureIsUSV); }
+ goto parse_error;
case 'm': {
switch (op[18]) {
case '1':
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp
index cf4e6c9e9..ec9926a30 100644
--- a/src/passes/Print.cpp
+++ b/src/passes/Print.cpp
@@ -2253,6 +2253,9 @@ struct PrintExpressionContents
case StringMeasureWTF16:
printMedium(o, "string.measure_wtf16");
break;
+ case StringMeasureIsUSV:
+ printMedium(o, "string.is_usv_sequence");
+ break;
default:
WASM_UNREACHABLE("invalid string.measure*");
}
diff --git a/src/wasm-binary.h b/src/wasm-binary.h
index f89391186..97f6bc24e 100644
--- a/src/wasm-binary.h
+++ b/src/wasm-binary.h
@@ -1146,6 +1146,7 @@ enum ASTNodes {
StringEncodeWTF16 = 0x87,
StringConcat = 0x88,
StringEq = 0x89,
+ StringIsUSV = 0x8a,
};
enum MemoryAccess {
diff --git a/src/wasm.h b/src/wasm.h
index 41eaf328a..42de60a98 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -594,6 +594,7 @@ enum StringMeasureOp {
StringMeasureUTF8,
StringMeasureWTF8,
StringMeasureWTF16,
+ StringMeasureIsUSV,
};
enum StringEncodeOp {
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index ef564db6e..0ae17f47c 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -7191,6 +7191,8 @@ bool WasmBinaryBuilder::maybeVisitStringMeasure(Expression*& out,
}
} else if (code == BinaryConsts::StringMeasureWTF16) {
op = StringMeasureWTF16;
+ } else if (code == BinaryConsts::StringIsUSV) {
+ op = StringMeasureIsUSV;
} else {
return false;
}
diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp
index 9a5db2928..e1b093b26 100644
--- a/src/wasm/wasm-stack.cpp
+++ b/src/wasm/wasm-stack.cpp
@@ -2276,6 +2276,9 @@ void BinaryInstWriter::visitStringMeasure(StringMeasure* curr) {
case StringMeasureWTF16:
o << U32LEB(BinaryConsts::StringMeasureWTF16);
break;
+ case StringMeasureIsUSV:
+ o << U32LEB(BinaryConsts::StringIsUSV);
+ break;
default:
WASM_UNREACHABLE("invalid string.new*");
}
diff --git a/test/lit/strings.wast b/test/lit/strings.wast
index 687de8e3d..d1a9fd053 100644
--- a/test/lit/strings.wast
+++ b/test/lit/strings.wast
@@ -225,4 +225,23 @@
)
)
)
+
+ ;; CHECK: (func $string.is_usv_sequence (param $ref stringref)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.eqz
+ ;; CHECK-NEXT: (string.is_usv_sequence
+ ;; CHECK-NEXT: (local.get $ref)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $string.is_usv_sequence (param $ref stringref)
+ (drop
+ (i32.eqz ;; validate the output is i32
+ (string.is_usv_sequence
+ (local.get $ref)
+ )
+ )
+ )
+ )
)