diff options
author | Alon Zakai <azakai@google.com> | 2024-02-14 10:30:10 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-14 10:30:10 -0800 |
commit | 5ef1aba98ebff75e29b2c90d8b683b1f0fe1f123 (patch) | |
tree | cb1bbc59fb947132b2da46c2a72101e7fc4ce9a8 /src/wasm-interpreter.h | |
parent | df3784e3df9744d943016b110e1f92af286cec72 (diff) | |
download | binaryen-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.h | 58 |
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"); } |