summaryrefslogtreecommitdiff
path: root/src/wasm
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm')
-rw-r--r--src/wasm/wasm-binary.cpp10
-rw-r--r--src/wasm/wasm-s-parser.cpp3
2 files changed, 12 insertions, 1 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index b74ef017b..44b07f945 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -6981,6 +6981,8 @@ bool WasmBinaryBuilder::maybeVisitArrayCopy(Expression*& out, uint32_t code) {
bool WasmBinaryBuilder::maybeVisitStringNew(Expression*& out, uint32_t code) {
StringNewOp op;
Expression* length = nullptr;
+ Expression* start = nullptr;
+ Expression* end = nullptr;
if (code == BinaryConsts::StringNewWTF8) {
auto policy = getU32LEB();
switch (policy) {
@@ -7015,13 +7017,19 @@ bool WasmBinaryBuilder::maybeVisitStringNew(Expression*& out, uint32_t code) {
default:
throwError("bad policy for string.new");
}
+ end = popNonVoidExpression();
+ start = popNonVoidExpression();
} else if (code == BinaryConsts::StringNewWTF16Array) {
op = StringNewWTF16Array;
} else {
return false;
}
auto* ptr = popNonVoidExpression();
- out = Builder(wasm).makeStringNew(op, ptr, length);
+ if (length) {
+ out = Builder(wasm).makeStringNew(op, ptr, length);
+ } else {
+ out = Builder(wasm).makeStringNew(op, ptr, start, end);
+ }
return true;
}
diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp
index f13091c91..c1285c647 100644
--- a/src/wasm/wasm-s-parser.cpp
+++ b/src/wasm/wasm-s-parser.cpp
@@ -2837,6 +2837,9 @@ Expression* SExpressionWasmBuilder::makeStringNew(Element& s, StringNewOp op) {
} else {
throw ParseException("bad string.new op", s.line, s.col);
}
+ auto* start = parseExpression(s[i + 1]);
+ auto* end = parseExpression(s[i + 2]);
+ return Builder(wasm).makeStringNew(op, parseExpression(s[i]), start, end);
}
return Builder(wasm).makeStringNew(op, parseExpression(s[i]), length);
}