summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2024-02-05 13:31:41 -0800
committerGitHub <noreply@github.com>2024-02-05 21:31:41 +0000
commita549c5991584038fc3f56df8512b52c1a81fa946 (patch)
treea1f9800498995c00fa1468e18dcbfd53d5786879 /src
parentbe13e0f115c6627b286343368fb125e18d332486 (diff)
downloadbinaryen-a549c5991584038fc3f56df8512b52c1a81fa946.tar.gz
binaryen-a549c5991584038fc3f56df8512b52c1a81fa946.tar.bz2
binaryen-a549c5991584038fc3f56df8512b52c1a81fa946.zip
wasm-ctor-eval: Properly eval strings (#6276)
#6244 tried to do this but was not quite right. It treated a string like an array or a struct, which means create a global for it. But just creating a global isn't enough, as it needs to also be sorted in the right place etc. which requires changes in other places. But there is a much simpler solution here: string constants are just constants, which we can emit in-line, so do that.
Diffstat (limited to 'src')
-rw-r--r--src/tools/wasm-ctor-eval.cpp11
1 files changed, 3 insertions, 8 deletions
diff --git a/src/tools/wasm-ctor-eval.cpp b/src/tools/wasm-ctor-eval.cpp
index 9aa41c04d..d476bb2cc 100644
--- a/src/tools/wasm-ctor-eval.cpp
+++ b/src/tools/wasm-ctor-eval.cpp
@@ -838,8 +838,9 @@ public:
// GC data (structs and arrays) must be handled with the special global-
// creating logic later down. But MVP types as well as i31s (even
// externalized i31s) can be handled by the general makeConstantExpression
- // logic (which knows how to handle externalization, for i31s).
- if (!value.isData()) {
+ // logic (which knows how to handle externalization, for i31s; and it also
+ // can handle string constants).
+ if (!value.isData() || value.type.getHeapType().isString()) {
return builder.makeConstantExpression(original);
}
@@ -889,12 +890,6 @@ public:
} else if (heapType.isArray()) {
// TODO: for repeated identical values, can use ArrayNew
init = builder.makeArrayNewFixed(heapType, args);
- } else if (heapType.isString()) {
- std::string s;
- for (auto c : values) {
- s += char(c.getInteger());
- }
- init = builder.makeStringConst(s);
} else {
WASM_UNREACHABLE("bad gc type");
}