diff options
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index e61fd1e27..59276124e 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -3951,6 +3951,12 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) { if (maybeVisitStringIterMove(curr, opcode)) { break; } + if (maybeVisitStringSliceWTF(curr, opcode)) { + break; + } + if (maybeVisitStringSliceIter(curr, opcode)) { + break; + } if (opcode == BinaryConsts::RefIsFunc || opcode == BinaryConsts::RefIsData || opcode == BinaryConsts::RefIsI31) { @@ -7329,6 +7335,34 @@ bool WasmBinaryBuilder::maybeVisitStringIterMove(Expression*& out, return true; } +bool WasmBinaryBuilder::maybeVisitStringSliceWTF(Expression*& out, + uint32_t code) { + StringSliceWTFOp op; + if (code == BinaryConsts::StringViewWTF8Slice) { + op = StringSliceWTF8; + } else if (code == BinaryConsts::StringViewWTF16Slice) { + op = StringSliceWTF16; + } else { + return false; + } + auto* end = popNonVoidExpression(); + auto* start = popNonVoidExpression(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeStringSliceWTF(op, ref, start, end); + return true; +} + +bool WasmBinaryBuilder::maybeVisitStringSliceIter(Expression*& out, + uint32_t code) { + if (code != BinaryConsts::StringViewIterSlice) { + return false; + } + auto* num = popNonVoidExpression(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeStringSliceIter(ref, num); + return true; +} + void WasmBinaryBuilder::visitRefAs(RefAs* curr, uint8_t code) { BYN_TRACE("zz node: RefAs\n"); switch (code) { |