Skip to content

Commit

Permalink
wasm-ctor-eval: Properly eval strings (#6276)
Browse files Browse the repository at this point in the history
#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.
  • Loading branch information
kripken authored Feb 5, 2024
1 parent be13e0f commit a549c59
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 12 deletions.
11 changes: 3 additions & 8 deletions src/tools/wasm-ctor-eval.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -838,8 +838,9 @@ struct CtorEvalExternalInterface : EvallingModuleRunner::ExternalInterface {
// 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);
}

Expand Down Expand Up @@ -889,12 +890,6 @@ struct CtorEvalExternalInterface : EvallingModuleRunner::ExternalInterface {
} 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");
}
Expand Down
7 changes: 3 additions & 4 deletions test/lit/ctor-eval/string.wast
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@
;; the output, as precomputing a string results in an identical string.

(module
;; CHECK: (type $0 (func (result anyref)))

;; CHECK: (global $global (ref string) (string.const "one"))
(global $global (ref string) (string.const "one"))

(export "test" (func $test))
Expand All @@ -16,8 +13,10 @@
(global.get $global)
)
)
;; CHECK: (type $0 (func (result anyref)))

;; CHECK: (export "test" (func $test_1))

;; CHECK: (func $test_1 (type $0) (result anyref)
;; CHECK-NEXT: (global.get $global)
;; CHECK-NEXT: (string.const "one")
;; CHECK-NEXT: )

0 comments on commit a549c59

Please sign in to comment.