summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/wasm/wasm-binary.cpp12
-rw-r--r--src/wasm/wasm-stack.cpp31
-rw-r--r--test/lit/strings.wast8
3 files changed, 37 insertions, 14 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index 0b4a3d2f4..5399be0b7 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -6984,6 +6984,9 @@ bool WasmBinaryBuilder::maybeVisitStringNew(Expression*& out, uint32_t code) {
Expression* start = nullptr;
Expression* end = nullptr;
if (code == BinaryConsts::StringNewWTF8) {
+ if (getInt8() != 0) {
+ throwError("Unexpected nonzero memory index");
+ }
auto policy = getU32LEB();
switch (policy) {
case BinaryConsts::StringPolicy::UTF8:
@@ -7000,6 +7003,9 @@ bool WasmBinaryBuilder::maybeVisitStringNew(Expression*& out, uint32_t code) {
}
length = popNonVoidExpression();
} else if (code == BinaryConsts::StringNewWTF16) {
+ if (getInt8() != 0) {
+ throwError("Unexpected nonzero memory index");
+ }
op = StringNewWTF16;
length = popNonVoidExpression();
} else if (code == BinaryConsts::StringNewWTF8Array) {
@@ -7080,6 +7086,9 @@ bool WasmBinaryBuilder::maybeVisitStringEncode(Expression*& out,
Expression* start = nullptr;
// TODO: share this code with string.measure?
if (code == BinaryConsts::StringEncodeWTF8) {
+ if (getInt8() != 0) {
+ throwError("Unexpected nonzero memory index");
+ }
auto policy = getU32LEB();
switch (policy) {
case BinaryConsts::StringPolicy::UTF8:
@@ -7092,6 +7101,9 @@ bool WasmBinaryBuilder::maybeVisitStringEncode(Expression*& out,
throwError("bad policy for string.encode");
}
} else if (code == BinaryConsts::StringEncodeWTF16) {
+ if (getInt8() != 0) {
+ throwError("Unexpected nonzero memory index");
+ }
op = StringEncodeWTF16;
} else if (code == BinaryConsts::StringEncodeWTF8Array) {
auto policy = getU32LEB();
diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp
index 95da14c72..83586f559 100644
--- a/src/wasm/wasm-stack.cpp
+++ b/src/wasm/wasm-stack.cpp
@@ -2176,19 +2176,23 @@ void BinaryInstWriter::visitStringNew(StringNew* curr) {
o << int8_t(BinaryConsts::GCPrefix);
switch (curr->op) {
case StringNewUTF8:
- o << int8_t(BinaryConsts::StringNewWTF8)
- << U32LEB(BinaryConsts::StringPolicy::UTF8);
+ o << int8_t(BinaryConsts::StringNewWTF8);
+ o << int8_t(0); // Memory index.
+ o << U32LEB(BinaryConsts::StringPolicy::UTF8);
break;
case StringNewWTF8:
- o << int8_t(BinaryConsts::StringNewWTF8)
- << U32LEB(BinaryConsts::StringPolicy::WTF8);
+ o << int8_t(BinaryConsts::StringNewWTF8);
+ o << int8_t(0); // Memory index.
+ o << U32LEB(BinaryConsts::StringPolicy::WTF8);
break;
case StringNewReplace:
- o << int8_t(BinaryConsts::StringNewWTF8)
- << U32LEB(BinaryConsts::StringPolicy::Replace);
+ o << int8_t(BinaryConsts::StringNewWTF8);
+ o << int8_t(0); // Memory index.
+ o << U32LEB(BinaryConsts::StringPolicy::Replace);
break;
case StringNewWTF16:
o << int8_t(BinaryConsts::StringNewWTF16);
+ o << int8_t(0); // Memory index.
break;
case StringNewUTF8Array:
o << int8_t(BinaryConsts::StringNewWTF8Array)
@@ -2244,19 +2248,22 @@ void BinaryInstWriter::visitStringEncode(StringEncode* curr) {
o << int8_t(BinaryConsts::GCPrefix);
switch (curr->op) {
case StringEncodeUTF8:
- o << int8_t(BinaryConsts::StringEncodeWTF8)
- << U32LEB(BinaryConsts::StringPolicy::UTF8);
+ o << int8_t(BinaryConsts::StringEncodeWTF8);
+ o << int8_t(0); // Memory index.
+ o << U32LEB(BinaryConsts::StringPolicy::UTF8);
break;
case StringEncodeWTF8:
- o << int8_t(BinaryConsts::StringEncodeWTF8)
- << U32LEB(BinaryConsts::StringPolicy::WTF8);
+ o << int8_t(BinaryConsts::StringEncodeWTF8);
+ o << int8_t(0); // Memory index.
+ o << U32LEB(BinaryConsts::StringPolicy::WTF8);
break;
case StringEncodeWTF16:
o << int8_t(BinaryConsts::StringEncodeWTF16);
+ o << int8_t(0); // Memory index.
break;
case StringEncodeUTF8Array:
- o << int8_t(BinaryConsts::StringEncodeWTF8Array)
- << U32LEB(BinaryConsts::StringPolicy::UTF8);
+ o << int8_t(BinaryConsts::StringEncodeWTF8Array);
+ o << U32LEB(BinaryConsts::StringPolicy::UTF8);
break;
case StringEncodeWTF8Array:
o << int8_t(BinaryConsts::StringEncodeWTF8Array)
diff --git a/test/lit/strings.wast b/test/lit/strings.wast
index 5867a95ed..4e9b87d39 100644
--- a/test/lit/strings.wast
+++ b/test/lit/strings.wast
@@ -8,14 +8,16 @@
;; RUN: foreach %s %t wasm-opt --enable-strings --enable-reference-types --enable-gc --roundtrip --precompute -S -o - | filecheck %s
(module
+ (memory 10 10)
+
;; CHECK: (type $stringref_=>_none (func (param stringref)))
;; CHECK: (type $stringref_stringview_wtf8_stringview_wtf16_stringview_iter_=>_none (func (param stringref stringview_wtf8 stringview_wtf16 stringview_iter)))
;; CHECK: (type $stringref_stringref_=>_none (func (param stringref stringref)))
- ;; CHECK: (type $array (array i32))
- (type $array (array_subtype i32 data))
+ ;; CHECK: (type $array (array i8))
+ (type $array (array_subtype i8 data))
;; CHECK: (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 (func (param 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))))
@@ -30,6 +32,8 @@
;; CHECK: (global $string-const stringref (string.const "string in a global"))
(global $string-const stringref (string.const "string in a global"))
+ ;; CHECK: (memory $0 10 10)
+
;; CHECK: (func $string.new (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