summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-binary.cpp
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2022-07-13 14:38:10 -0700
committerGitHub <noreply@github.com>2022-07-13 14:38:10 -0700
commit9671e95adbfcf0984a7e9800a7ea2ed33e1670ad (patch)
treed7273e64ed26429d18568439cdfb7b1fb6369645 /src/wasm/wasm-binary.cpp
parent7b9c18b98c020f887aa9cb1750543751ebe5c530 (diff)
downloadbinaryen-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.cpp61
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) {