diff options
-rwxr-xr-x | scripts/gen-s-parser.py | 1 | ||||
-rw-r--r-- | src/gen-s-parser.inc | 10 | ||||
-rw-r--r-- | src/passes/Print.cpp | 3 | ||||
-rw-r--r-- | src/wasm-binary.h | 1 | ||||
-rw-r--r-- | src/wasm.h | 1 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 2 | ||||
-rw-r--r-- | src/wasm/wasm-stack.cpp | 3 | ||||
-rw-r--r-- | test/lit/strings.wast | 13 |
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) + ) + ) ) |