@@ -1902,7 +1902,21 @@ class ExpressionRunner : public OverriddenVisitor<SubType, Flow> {
19021902 Flow visitStringConst (StringConst* curr) {
19031903 return Literal (curr->string .toString ());
19041904 }
1905- Flow visitStringMeasure (StringMeasure* curr) { WASM_UNREACHABLE (" unimp" ); }
1905+ Flow visitStringMeasure (StringMeasure* curr) {
1906+ // For now we only support JS-style strings.
1907+ assert (curr->op == StringMeasureWTF16View);
1908+
1909+ Flow flow = visit (curr->ref );
1910+ if (flow.breaking ()) {
1911+ return flow;
1912+ }
1913+ auto value = flow.getSingleValue ();
1914+ auto data = value.getGCData ();
1915+ if (!data) {
1916+ trap (" null ref" );
1917+ }
1918+ return Literal (int32_t (data->values .size ()));
1919+ }
19061920 Flow visitStringEncode (StringEncode* curr) { WASM_UNREACHABLE (" unimp" ); }
19071921 Flow visitStringConcat (StringConcat* curr) { WASM_UNREACHABLE (" unimp" ); }
19081922 Flow visitStringEq (StringEq* curr) {
@@ -1971,11 +1985,49 @@ class ExpressionRunner : public OverriddenVisitor<SubType, Flow> {
19711985 }
19721986 return Literal (result);
19731987 }
1974- Flow visitStringAs (StringAs* curr) { WASM_UNREACHABLE (" unimp" ); }
1988+ Flow visitStringAs (StringAs* curr) {
1989+ // For now we only support JS-style strings.
1990+ assert (curr->op == StringAsWTF16);
1991+
1992+ Flow flow = visit (curr->ref );
1993+ if (flow.breaking ()) {
1994+ return flow;
1995+ }
1996+ auto value = flow.getSingleValue ();
1997+ auto data = value.getGCData ();
1998+ if (!data) {
1999+ trap (" null ref" );
2000+ }
2001+
2002+ // A JS-style string can be viewed simply as the underlying data. All we
2003+ // need to do is fix up the type.
2004+ return Literal (data, curr->type .getHeapType ());
2005+ }
19752006 Flow visitStringWTF8Advance (StringWTF8Advance* curr) {
19762007 WASM_UNREACHABLE (" unimp" );
19772008 }
1978- Flow visitStringWTF16Get (StringWTF16Get* curr) { WASM_UNREACHABLE (" unimp" ); }
2009+ Flow visitStringWTF16Get (StringWTF16Get* curr) {
2010+ NOTE_ENTER (" StringEq" );
2011+ Flow ref = visit (curr->ref );
2012+ if (ref.breaking ()) {
2013+ return ref;
2014+ }
2015+ Flow pos = visit (curr->pos );
2016+ if (pos.breaking ()) {
2017+ return pos;
2018+ }
2019+ auto refValue = ref.getSingleValue ();
2020+ auto data = refValue.getGCData ();
2021+ if (!data) {
2022+ trap (" null ref" );
2023+ }
2024+ auto & values = data->values ;
2025+ Index i = pos.getSingleValue ().geti32 ();
2026+ if (i >= values.size ()) {
2027+ trap (" string oob" );
2028+ }
2029+ return Literal (values[i].geti32 ());
2030+ }
19792031 Flow visitStringIterNext (StringIterNext* curr) { WASM_UNREACHABLE (" unimp" ); }
19802032 Flow visitStringIterMove (StringIterMove* curr) { WASM_UNREACHABLE (" unimp" ); }
19812033 Flow visitStringSliceWTF (StringSliceWTF* curr) { WASM_UNREACHABLE (" unimp" ); }
0 commit comments