diff options
author | Alon Zakai <azakai@google.com> | 2022-07-13 14:38:10 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-13 14:38:10 -0700 |
commit | 9671e95adbfcf0984a7e9800a7ea2ed33e1670ad (patch) | |
tree | d7273e64ed26429d18568439cdfb7b1fb6369645 /src/wasm/wasm-binary.cpp | |
parent | 7b9c18b98c020f887aa9cb1750543751ebe5c530 (diff) | |
download | binaryen-9671e95adbfcf0984a7e9800a7ea2ed33e1670ad.tar.gz binaryen-9671e95adbfcf0984a7e9800a7ea2ed33e1670ad.tar.bz2 binaryen-9671e95adbfcf0984a7e9800a7ea2ed33e1670ad.zip |
[Strings] stringview access operations (#4798)
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index ee1f4929b..e61fd1e27 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -3939,6 +3939,18 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) { if (maybeVisitStringAs(curr, opcode)) { break; } + if (maybeVisitStringWTF8Advance(curr, opcode)) { + break; + } + if (maybeVisitStringWTF16Get(curr, opcode)) { + break; + } + if (maybeVisitStringIterNext(curr, opcode)) { + break; + } + if (maybeVisitStringIterMove(curr, opcode)) { + break; + } if (opcode == BinaryConsts::RefIsFunc || opcode == BinaryConsts::RefIsData || opcode == BinaryConsts::RefIsI31) { @@ -7268,6 +7280,55 @@ bool WasmBinaryBuilder::maybeVisitStringAs(Expression*& out, uint32_t code) { return true; } +bool WasmBinaryBuilder::maybeVisitStringWTF8Advance(Expression*& out, + uint32_t code) { + if (code != BinaryConsts::StringViewWTF8Advance) { + return false; + } + auto* bytes = popNonVoidExpression(); + auto* pos = popNonVoidExpression(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeStringWTF8Advance(ref, pos, bytes); + return true; +} + +bool WasmBinaryBuilder::maybeVisitStringWTF16Get(Expression*& out, + uint32_t code) { + if (code != BinaryConsts::StringViewWTF16GetCodePoint) { + return false; + } + auto* pos = popNonVoidExpression(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeStringWTF16Get(ref, pos); + return true; +} + +bool WasmBinaryBuilder::maybeVisitStringIterNext(Expression*& out, + uint32_t code) { + if (code != BinaryConsts::StringViewIterNext) { + return false; + } + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeStringIterNext(ref); + return true; +} + +bool WasmBinaryBuilder::maybeVisitStringIterMove(Expression*& out, + uint32_t code) { + StringIterMoveOp op; + if (code == BinaryConsts::StringViewIterAdvance) { + op = StringIterMoveAdvance; + } else if (code == BinaryConsts::StringViewIterRewind) { + op = StringIterMoveRewind; + } else { + return false; + } + auto* num = popNonVoidExpression(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeStringIterMove(op, ref, num); + return true; +} + void WasmBinaryBuilder::visitRefAs(RefAs* curr, uint8_t code) { BYN_TRACE("zz node: RefAs\n"); switch (code) { |