summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Lublinerman <rluble@gmail.com>2024-03-14 20:48:07 -0700
committerGitHub <noreply@github.com>2024-03-15 03:48:07 +0000
commitc166ca015860b337e9ce07a5e02cb707964056ba (patch)
tree235b8420f2c72d63b81d78e30af4dc5aeb7acbf4
parent419b65ce2cb145dc781a32a565bb75496b7ac668 (diff)
downloadbinaryen-c166ca015860b337e9ce07a5e02cb707964056ba.tar.gz
binaryen-c166ca015860b337e9ce07a5e02cb707964056ba.tar.bz2
binaryen-c166ca015860b337e9ce07a5e02cb707964056ba.zip
[Strings] Implement string.concat in the interpreter (#6403)
-rw-r--r--src/wasm-interpreter.h31
-rw-r--r--test/lit/passes/precompute-strings.wast10
2 files changed, 40 insertions, 1 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index 31039cf28..c35920802 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -1919,6 +1919,36 @@ public:
}
return Literal(int32_t(data->values.size()));
}
+ Flow visitStringConcat(StringConcat* curr) {
+ NOTE_ENTER("StringConcat");
+ Flow flow = visit(curr->left);
+ if (flow.breaking()) {
+ return flow;
+ }
+ auto left = flow.getSingleValue();
+ flow = visit(curr->right);
+ if (flow.breaking()) {
+ return flow;
+ }
+ auto right = flow.getSingleValue();
+ NOTE_EVAL2(left, right);
+ auto leftData = left.getGCData();
+ auto rightData = right.getGCData();
+ if (!leftData || !rightData) {
+ trap("null ref");
+ }
+
+ Literals contents;
+ contents.reserve(leftData->values.size() + rightData->values.size());
+ for (Literal l : leftData->values) {
+ contents.push_back(l);
+ }
+ for (Literal l : rightData->values) {
+ contents.push_back(l);
+ }
+
+ return makeGCData(contents, curr->type);
+ }
Flow visitStringEncode(StringEncode* curr) {
// For now we only support JS-style strings into arrays.
if (curr->op != StringEncodeWTF16Array) {
@@ -1956,7 +1986,6 @@ public:
return Literal(int32_t(refData->values.size()));
}
- Flow visitStringConcat(StringConcat* curr) { return Flow(NONCONSTANT_FLOW); }
Flow visitStringEq(StringEq* curr) {
NOTE_ENTER("StringEq");
Flow flow = visit(curr->left);
diff --git a/test/lit/passes/precompute-strings.wast b/test/lit/passes/precompute-strings.wast
index 3436e0069..f5b1660bc 100644
--- a/test/lit/passes/precompute-strings.wast
+++ b/test/lit/passes/precompute-strings.wast
@@ -22,5 +22,15 @@
(string.const "ab")
)
)
+
+ ;; CHECK: (func $concat (type $0) (result i32)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ (func $concat (export "concat") (result i32)
+ (string.eq
+ (string.concat (string.const "a") (string.const "b"))
+ (string.const "ab")
+ )
+ )
)