diff options
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 8108027d4..e2588422c 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -7157,6 +7157,7 @@ bool WasmBinaryBuilder::maybeVisitArrayCopy(Expression*& out, uint32_t code) { bool WasmBinaryBuilder::maybeVisitStringNew(Expression*& out, uint32_t code) { StringNewOp op; + Expression* length = nullptr; if (code == BinaryConsts::StringNewWTF8) { auto policy = getU32LEB(); switch (policy) { @@ -7172,12 +7173,30 @@ bool WasmBinaryBuilder::maybeVisitStringNew(Expression*& out, uint32_t code) { default: throwError("bad policy for string.new"); } + length = popNonVoidExpression(); } else if (code == BinaryConsts::StringNewWTF16) { op = StringNewWTF16; + length = popNonVoidExpression(); + } else if (code == BinaryConsts::StringNewWTF8Array) { + auto policy = getU32LEB(); + switch (policy) { + case BinaryConsts::StringPolicy::UTF8: + op = StringNewUTF8Array; + break; + case BinaryConsts::StringPolicy::WTF8: + op = StringNewWTF8Array; + break; + case BinaryConsts::StringPolicy::Replace: + op = StringNewReplaceArray; + break; + default: + throwError("bad policy for string.new"); + } + } else if (code == BinaryConsts::StringNewWTF16Array) { + op = StringNewWTF16Array; } else { return false; } - auto* length = popNonVoidExpression(); auto* ptr = popNonVoidExpression(); out = Builder(wasm).makeStringNew(op, ptr, length); return true; |