From 54206741b64b25e205f36f86e684262498866b60 Mon Sep 17 00:00:00 2001 From: Roberto Lublinerman Date: Thu, 14 Mar 2024 16:30:19 -0700 Subject: [PATCH 1/6] Implement StringConcat in the interpreter. --- src/wasm-interpreter.h | 28 ++++++++++++++++++++++++- test/lit/passes/precompute-strings.wast | 10 +++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 46e5c175288..3466475c4c6 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -1920,7 +1920,33 @@ class ExpressionRunner : public OverriddenVisitor { return Literal(int32_t(data->values.size())); } Flow visitStringEncode(StringEncode* curr) { return Flow(NONCONSTANT_FLOW); } - Flow visitStringConcat(StringConcat* curr) { return Flow(NONCONSTANT_FLOW); } + 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(); + char array[leftData->values.size() + rightData->values.size()+1]; + int i =0; + for (Literal l : leftData->values) { + array[i++] = l.getInteger(); + } + + for (Literal l : rightData->values) { + array[i++] = l.getInteger(); + } + array[i] = 0; + return Literal(std::string(array)); + } 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 3436e006920..0c359e9fd77 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") + ) + ) ) From 880b3676af52a979ed45b6f3ff9a20b853d0c6ea Mon Sep 17 00:00:00 2001 From: Roberto Lublinerman Date: Thu, 14 Mar 2024 17:00:33 -0700 Subject: [PATCH 2/6] Added trap when null and fixed formatting. More fixes. --- src/wasm-interpreter.h | 8 +++++--- test/lit/passes/precompute-strings.wast | 8 ++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 75bb8b221ab..40dfbee057c 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -1934,16 +1934,18 @@ class ExpressionRunner : public OverriddenVisitor { NOTE_EVAL2(left, right); auto leftData = left.getGCData(); auto rightData = right.getGCData(); - char array[leftData->values.size() + rightData->values.size()+1]; + if (!leftData || !rightData) { + trap("null ref"); + } + + char array[leftData->values.size() + rightData->values.size()]; int i =0; for (Literal l : leftData->values) { array[i++] = l.getInteger(); } - for (Literal l : rightData->values) { array[i++] = l.getInteger(); } - array[i] = 0; return Literal(std::string(array)); } Flow visitStringEncode(StringEncode* curr) { diff --git a/test/lit/passes/precompute-strings.wast b/test/lit/passes/precompute-strings.wast index 0c359e9fd77..f5b1660bcc9 100644 --- a/test/lit/passes/precompute-strings.wast +++ b/test/lit/passes/precompute-strings.wast @@ -23,10 +23,10 @@ ) ) - ;; CHECK: (func $concat (type $0) (result i32) - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: ) - (func $concat (export "concat") (result i32) + ;; 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") From 3c83deb60e2b20271fdc248d2b769d4267d405bc Mon Sep 17 00:00:00 2001 From: Roberto Lublinerman Date: Thu, 14 Mar 2024 17:24:57 -0700 Subject: [PATCH 3/6] Use makeGCData rather than manually building the string literal. --- src/wasm-interpreter.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 40dfbee057c..99733bc64da 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -1938,15 +1938,16 @@ class ExpressionRunner : public OverriddenVisitor { trap("null ref"); } - char array[leftData->values.size() + rightData->values.size()]; - int i =0; + Literals contents; + contents.reserve(leftData->values.size() + rightData->values.size()); for (Literal l : leftData->values) { - array[i++] = l.getInteger(); + contents.push_back(l); } for (Literal l : rightData->values) { - array[i++] = l.getInteger(); + contents.push_back(l); } - return Literal(std::string(array)); + + return makeGCData(contents, curr->type); } Flow visitStringEncode(StringEncode* curr) { // For now we only support JS-style strings into arrays. From b372d5e026670cc705ee977bb76fa9dc31fc8dfd Mon Sep 17 00:00:00 2001 From: Roberto Lublinerman Date: Thu, 14 Mar 2024 20:09:45 -0700 Subject: [PATCH 4/6] Fix formatting. --- src/wasm-interpreter.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 99733bc64da..7b40ff67761 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -1935,10 +1935,10 @@ class ExpressionRunner : public OverriddenVisitor { auto leftData = left.getGCData(); auto rightData = right.getGCData(); if (!leftData || !rightData) { - trap("null ref"); + trap("null ref"); } - Literals contents; + Litesrals contents; contents.reserve(leftData->values.size() + rightData->values.size()); for (Literal l : leftData->values) { contents.push_back(l); From 0858f80eb6a0bfd727f54f096d6f5881136a51db Mon Sep 17 00:00:00 2001 From: Roberto Lublinerman Date: Thu, 14 Mar 2024 20:12:22 -0700 Subject: [PATCH 5/6] Fix bad commit. --- src/wasm-interpreter.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 7b40ff67761..99733bc64da 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -1935,10 +1935,10 @@ class ExpressionRunner : public OverriddenVisitor { auto leftData = left.getGCData(); auto rightData = right.getGCData(); if (!leftData || !rightData) { - trap("null ref"); + trap("null ref"); } - Litesrals contents; + Literals contents; contents.reserve(leftData->values.size() + rightData->values.size()); for (Literal l : leftData->values) { contents.push_back(l); From 38d8111cafc458bb62bf2308e771bbc88b797872 Mon Sep 17 00:00:00 2001 From: Roberto Lublinerman Date: Thu, 14 Mar 2024 20:23:40 -0700 Subject: [PATCH 6/6] Fix formatting. --- src/wasm-interpreter.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 99733bc64da..c3592080284 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -1919,7 +1919,7 @@ class ExpressionRunner : public OverriddenVisitor { } return Literal(int32_t(data->values.size())); } - Flow visitStringConcat(StringConcat* curr) { + Flow visitStringConcat(StringConcat* curr) { NOTE_ENTER("StringConcat"); Flow flow = visit(curr->left); if (flow.breaking()) { @@ -1986,7 +1986,6 @@ class ExpressionRunner : public OverriddenVisitor { return Literal(int32_t(refData->values.size())); } - Flow visitStringEq(StringEq* curr) { NOTE_ENTER("StringEq"); Flow flow = visit(curr->left);