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.wast13
8 files changed, 34 insertions, 0 deletions
diff --git a/scripts/gen-s-parser.py b/scripts/gen-s-parser.py
index f8ad5fce2..1bcbae46a 100755
--- a/scripts/gen-s-parser.py
+++ b/scripts/gen-s-parser.py
@@ -618,6 +618,7 @@ instructions = [
("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_wtf8", "makeStringEncode(s, StringEncodeWTF8)"),
("string.encode_wtf16", "makeStringEncode(s, StringEncodeWTF16)"),
("string.encode_wtf8_array", "makeStringEncode(s, StringEncodeWTF8Array)"),
diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc
index 489066284..6bb1ed7dd 100644
--- a/src/gen-s-parser.inc
+++ b/src/gen-s-parser.inc
@@ -3194,6 +3194,9 @@ switch (buf[0]) {
case 'f':
if (op == "string.from_code_point"sv) { return makeStringNew(s, StringNewFromCodePoint, false); }
goto parse_error;
+ case 'h':
+ if (op == "string.hash"sv) { return makeStringMeasure(s, StringMeasureHash); }
+ goto parse_error;
case 'i':
if (op == "string.is_usv_sequence"sv) { return makeStringMeasure(s, StringMeasureIsUSV); }
goto parse_error;
@@ -8931,6 +8934,13 @@ switch (buf[0]) {
return *ret;
}
goto parse_error;
+ case 'h':
+ if (op == "string.hash"sv) {
+ auto ret = makeStringMeasure(ctx, pos, StringMeasureHash);
+ CHECK_ERR(ret);
+ return *ret;
+ }
+ goto parse_error;
case 'i':
if (op == "string.is_usv_sequence"sv) {
auto ret = makeStringMeasure(ctx, pos, StringMeasureIsUSV);
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp
index 8c112d6a5..f7cfb7746 100644
--- a/src/passes/Print.cpp
+++ b/src/passes/Print.cpp
@@ -2404,6 +2404,9 @@ struct PrintExpressionContents
case StringMeasureWTF16View:
printMedium(o, "stringview_wtf16.length");
break;
+ case StringMeasureHash:
+ printMedium(o, "string.hash");
+ break;
default:
WASM_UNREACHABLE("invalid string.measure*");
}
diff --git a/src/wasm-binary.h b/src/wasm-binary.h
index a40a96c00..4d9f4f5ae 100644
--- a/src/wasm-binary.h
+++ b/src/wasm-binary.h
@@ -1165,6 +1165,7 @@ enum ASTNodes {
StringViewIterSlice = 0xa4,
StringCompare = 0xa8,
StringFromCodePoint = 0xa9,
+ StringHash = 0xaa,
StringNewWTF8Array = 0xb0,
StringNewWTF16Array = 0xb1,
StringEncodeWTF8Array = 0xb2,
diff --git a/src/wasm.h b/src/wasm.h
index 931c560c1..eec68ebd5 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -596,6 +596,7 @@ enum StringMeasureOp {
StringMeasureWTF16,
StringMeasureIsUSV,
StringMeasureWTF16View,
+ StringMeasureHash,
};
enum StringEncodeOp {
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index 431c39631..b616b5a31 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -7286,6 +7286,8 @@ bool WasmBinaryBuilder::maybeVisitStringMeasure(Expression*& out,
op = StringMeasureIsUSV;
} else if (code == BinaryConsts::StringViewWTF16Length) {
op = StringMeasureWTF16View;
+ } else if (code == BinaryConsts::StringHash) {
+ op = StringMeasureHash;
} else {
return false;
}
diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp
index a2fba3907..1c12718ce 100644
--- a/src/wasm/wasm-stack.cpp
+++ b/src/wasm/wasm-stack.cpp
@@ -2338,6 +2338,9 @@ void BinaryInstWriter::visitStringMeasure(StringMeasure* curr) {
case StringMeasureWTF16View:
o << U32LEB(BinaryConsts::StringViewWTF16Length);
break;
+ case StringMeasureHash:
+ o << U32LEB(BinaryConsts::StringHash);
+ break;
default:
WASM_UNREACHABLE("invalid string.new*");
}
diff --git a/test/lit/strings.wast b/test/lit/strings.wast
index a871811e5..63139d900 100644
--- a/test/lit/strings.wast
+++ b/test/lit/strings.wast
@@ -37,6 +37,8 @@
;; CHECK: (type $ref|$array|_=>_none (func (param (ref $array))))
+ ;; CHECK: (type $stringref_=>_i32 (func (param stringref) (result i32)))
+
;; CHECK: (global $string-const stringref (string.const "string in a global \01\ff\00\t\t\n\n\r\r\"\"\'\'\\\\"))
(global $string-const stringref (string.const "string in a global \01\ff\00\t\09\n\0a\r\0d\"\22\'\27\\\5c"))
@@ -626,4 +628,15 @@
)
)
)
+
+ ;; CHECK: (func $string.hash (type $stringref_=>_i32) (param $ref stringref) (result i32)
+ ;; CHECK-NEXT: (string.hash
+ ;; CHECK-NEXT: (local.get $ref)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $string.hash (param $ref stringref) (result i32)
+ (string.hash
+ (local.get $ref)
+ )
+ )
)