diff options
author | Alon Zakai <azakai@google.com> | 2022-07-07 15:43:22 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-07 15:43:22 -0700 |
commit | 19a437500a4c30f48355722653a01a8c44ff6bec (patch) | |
tree | 408bf64e92d17b38561561f138e1d03243774369 /src/wasm | |
parent | 9831b36d339b1cea61d5313f7dfa256fc1ee9bcc (diff) | |
download | binaryen-19a437500a4c30f48355722653a01a8c44ff6bec.tar.gz binaryen-19a437500a4c30f48355722653a01a8c44ff6bec.tar.bz2 binaryen-19a437500a4c30f48355722653a01a8c44ff6bec.zip |
[Strings] string.encode (#4776)
Diffstat (limited to 'src/wasm')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 30 | ||||
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 17 | ||||
-rw-r--r-- | src/wasm/wasm-stack.cpp | 19 | ||||
-rw-r--r-- | src/wasm/wasm.cpp | 8 |
4 files changed, 74 insertions, 0 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index d81aa0ca4..429ff7bae 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -3927,6 +3927,9 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) { if (maybeVisitStringMeasure(curr, opcode)) { break; } + if (maybeVisitStringEncode(curr, opcode)) { + break; + } if (opcode == BinaryConsts::RefIsFunc || opcode == BinaryConsts::RefIsData || opcode == BinaryConsts::RefIsI31) { @@ -7190,6 +7193,33 @@ bool WasmBinaryBuilder::maybeVisitStringMeasure(Expression*& out, return true; } +bool WasmBinaryBuilder::maybeVisitStringEncode(Expression*& out, + uint32_t code) { + StringEncodeOp op; + // TODO: share this code with string.measure? + if (code == BinaryConsts::StringEncodeWTF8) { + auto policy = getU32LEB(); + switch (policy) { + case BinaryConsts::StringPolicy::UTF8: + op = StringEncodeUTF8; + break; + case BinaryConsts::StringPolicy::WTF8: + op = StringEncodeWTF8; + break; + default: + throwError("bad policy for string.encode"); + } + } else if (code == BinaryConsts::StringEncodeWTF16) { + op = StringEncodeWTF16; + } else { + return false; + } + auto* ptr = popNonVoidExpression(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeStringEncode(op, ref, ptr); + return true; +} + void WasmBinaryBuilder::visitRefAs(RefAs* curr, uint8_t code) { BYN_TRACE("zz node: RefAs\n"); switch (code) { diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 98ed64c2d..68bd69104 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -2973,6 +2973,23 @@ Expression* SExpressionWasmBuilder::makeStringMeasure(Element& s, return Builder(wasm).makeStringMeasure(op, parseExpression(s[i])); } +Expression* SExpressionWasmBuilder::makeStringEncode(Element& s, + StringEncodeOp op) { + size_t i = 1; + if (op == StringEncodeWTF8) { + const char* str = s[i++]->c_str(); + if (strncmp(str, "utf8", 4) == 0) { + op = StringEncodeUTF8; + } else if (strncmp(str, "wtf8", 4) == 0) { + op = StringEncodeWTF8; + } else { + throw ParseException("bad string.new op", s.line, s.col); + } + } + return Builder(wasm).makeStringEncode( + op, parseExpression(s[i]), parseExpression(s[i + 1])); +} + // converts an s-expression string representing binary data into an output // sequence of raw bytes this appends to data, which may already contain // content. diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index 9c086bb47..38c8f1661 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -2281,6 +2281,25 @@ void BinaryInstWriter::visitStringMeasure(StringMeasure* curr) { } } +void BinaryInstWriter::visitStringEncode(StringEncode* curr) { + o << int8_t(BinaryConsts::GCPrefix); + switch (curr->op) { + case StringEncodeUTF8: + o << U32LEB(BinaryConsts::StringEncodeWTF8) + << U32LEB(BinaryConsts::StringPolicy::UTF8); + break; + case StringEncodeWTF8: + o << U32LEB(BinaryConsts::StringEncodeWTF8) + << U32LEB(BinaryConsts::StringPolicy::WTF8); + break; + case StringEncodeWTF16: + o << U32LEB(BinaryConsts::StringEncodeWTF16); + break; + default: + WASM_UNREACHABLE("invalid string.new*"); + } +} + void BinaryInstWriter::emitScopeEnd(Expression* curr) { assert(!breakStack.empty()); breakStack.pop_back(); diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp index 749a44339..d4337a87d 100644 --- a/src/wasm/wasm.cpp +++ b/src/wasm/wasm.cpp @@ -1192,6 +1192,14 @@ void StringMeasure::finalize() { } } +void StringEncode::finalize() { + if (ref->type == Type::unreachable || ptr->type == Type::unreachable) { + type = Type::unreachable; + } else { + type = Type::i32; + } +} + size_t Function::getNumParams() { return getParams().size(); } size_t Function::getNumVars() { return vars.size(); } |