diff options
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 16950f88f..d81aa0ca4 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -3924,6 +3924,9 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) { if (maybeVisitStringConst(curr, opcode)) { break; } + if (maybeVisitStringMeasure(curr, opcode)) { + break; + } if (opcode == BinaryConsts::RefIsFunc || opcode == BinaryConsts::RefIsData || opcode == BinaryConsts::RefIsI31) { @@ -7127,13 +7130,13 @@ bool WasmBinaryBuilder::maybeVisitStringNew(Expression*& out, uint32_t code) { if (code == BinaryConsts::StringNewWTF8) { auto policy = getU32LEB(); switch (policy) { - case BinaryConsts::StringNewPolicy::UTF8: + case BinaryConsts::StringPolicy::UTF8: op = StringNewUTF8; break; - case BinaryConsts::StringNewPolicy::WTF8: + case BinaryConsts::StringPolicy::WTF8: op = StringNewWTF8; break; - case BinaryConsts::StringNewPolicy::Replace: + case BinaryConsts::StringPolicy::Replace: op = StringNewReplace; break; default: @@ -7162,6 +7165,31 @@ bool WasmBinaryBuilder::maybeVisitStringConst(Expression*& out, uint32_t code) { return true; } +bool WasmBinaryBuilder::maybeVisitStringMeasure(Expression*& out, + uint32_t code) { + StringMeasureOp op; + if (code == BinaryConsts::StringMeasureWTF8) { + auto policy = getU32LEB(); + switch (policy) { + case BinaryConsts::StringPolicy::UTF8: + op = StringMeasureUTF8; + break; + case BinaryConsts::StringPolicy::WTF8: + op = StringMeasureWTF8; + break; + default: + throwError("bad policy for string.measure"); + } + } else if (code == BinaryConsts::StringMeasureWTF16) { + op = StringMeasureWTF16; + } else { + return false; + } + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeStringMeasure(op, ref); + return true; +} + void WasmBinaryBuilder::visitRefAs(RefAs* curr, uint8_t code) { BYN_TRACE("zz node: RefAs\n"); switch (code) { |