summaryrefslogtreecommitdiff
path: root/src/wasm-interpreter.h
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2024-02-14 10:30:10 -0800
committerGitHub <noreply@github.com>2024-02-14 10:30:10 -0800
commit5ef1aba98ebff75e29b2c90d8b683b1f0fe1f123 (patch)
treecb1bbc59fb947132b2da46c2a72101e7fc4ce9a8 /src/wasm-interpreter.h
parentdf3784e3df9744d943016b110e1f92af286cec72 (diff)
downloadbinaryen-5ef1aba98ebff75e29b2c90d8b683b1f0fe1f123.tar.gz
binaryen-5ef1aba98ebff75e29b2c90d8b683b1f0fe1f123.tar.bz2
binaryen-5ef1aba98ebff75e29b2c90d8b683b1f0fe1f123.zip
Strings: Add some interpreter support (#6304)
This adds just enough support to be able to --fuzz-exec a small but realistic fuzz testcase from Java. To that end, just implement the minimal ops we need, which are all related to JS-style strings.
Diffstat (limited to 'src/wasm-interpreter.h')
-rw-r--r--src/wasm-interpreter.h58
1 files changed, 55 insertions, 3 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index 1d9c576bc..b65b909c7 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -1902,7 +1902,21 @@ public:
Flow visitStringConst(StringConst* curr) {
return Literal(curr->string.toString());
}
- Flow visitStringMeasure(StringMeasure* curr) { WASM_UNREACHABLE("unimp"); }
+ Flow visitStringMeasure(StringMeasure* curr) {
+ // For now we only support JS-style strings.
+ assert(curr->op == StringMeasureWTF16View);
+
+ Flow flow = visit(curr->ref);
+ if (flow.breaking()) {
+ return flow;
+ }
+ auto value = flow.getSingleValue();
+ auto data = value.getGCData();
+ if (!data) {
+ trap("null ref");
+ }
+ return Literal(int32_t(data->values.size()));
+ }
Flow visitStringEncode(StringEncode* curr) { WASM_UNREACHABLE("unimp"); }
Flow visitStringConcat(StringConcat* curr) { WASM_UNREACHABLE("unimp"); }
Flow visitStringEq(StringEq* curr) {
@@ -1971,11 +1985,49 @@ public:
}
return Literal(result);
}
- Flow visitStringAs(StringAs* curr) { WASM_UNREACHABLE("unimp"); }
+ Flow visitStringAs(StringAs* curr) {
+ // For now we only support JS-style strings.
+ assert(curr->op == StringAsWTF16);
+
+ Flow flow = visit(curr->ref);
+ if (flow.breaking()) {
+ return flow;
+ }
+ auto value = flow.getSingleValue();
+ auto data = value.getGCData();
+ if (!data) {
+ trap("null ref");
+ }
+
+ // A JS-style string can be viewed simply as the underlying data. All we
+ // need to do is fix up the type.
+ return Literal(data, curr->type.getHeapType());
+ }
Flow visitStringWTF8Advance(StringWTF8Advance* curr) {
WASM_UNREACHABLE("unimp");
}
- Flow visitStringWTF16Get(StringWTF16Get* curr) { WASM_UNREACHABLE("unimp"); }
+ Flow visitStringWTF16Get(StringWTF16Get* curr) {
+ NOTE_ENTER("StringEq");
+ Flow ref = visit(curr->ref);
+ if (ref.breaking()) {
+ return ref;
+ }
+ Flow pos = visit(curr->pos);
+ if (pos.breaking()) {
+ return pos;
+ }
+ auto refValue = ref.getSingleValue();
+ auto data = refValue.getGCData();
+ if (!data) {
+ trap("null ref");
+ }
+ auto& values = data->values;
+ Index i = pos.getSingleValue().geti32();
+ if (i >= values.size()) {
+ trap("string oob");
+ }
+ return Literal(values[i].geti32());
+ }
Flow visitStringIterNext(StringIterNext* curr) { WASM_UNREACHABLE("unimp"); }
Flow visitStringIterMove(StringIterMove* curr) { WASM_UNREACHABLE("unimp"); }
Flow visitStringSliceWTF(StringSliceWTF* curr) { WASM_UNREACHABLE("unimp"); }