diff options
Diffstat (limited to 'src/wasm')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 10 | ||||
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 3 |
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); } |