Skip to content

Commit 22f87dc

Browse files
authored
[Strings] Implement string.test (#7684)
1 parent ec1d0b6 commit 22f87dc

36 files changed

+364
-172
lines changed

scripts/gen-s-parser.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,7 @@
678678
("string.concat", "makeStringConcat()"),
679679
("string.eq", "makeStringEq(StringEqEqual)"),
680680
("string.compare", "makeStringEq(StringEqCompare)"),
681+
("string.test", "makeStringTest()"),
681682
("stringview_wtf16.get_codeunit", "makeStringWTF16Get()"),
682683
("stringview_wtf16.slice", "makeStringSliceWTF()"),
683684
# Ignored in input

src/gen-s-parser.inc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5139,6 +5139,12 @@ switch (buf[0]) {
51395139
default: goto parse_error;
51405140
}
51415141
}
5142+
case 't':
5143+
if (op == "string.test"sv) {
5144+
CHECK_ERR(makeStringTest(ctx, pos, annotations));
5145+
return Ok{};
5146+
}
5147+
goto parse_error;
51425148
default: goto parse_error;
51435149
}
51445150
}

src/interpreter/interpreter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ struct ExpressionInterpreter : OverriddenVisitor<ExpressionInterpreter, Flow> {
273273
Flow visitStringEncode(StringEncode* curr) { WASM_UNREACHABLE("TODO"); }
274274
Flow visitStringConcat(StringConcat* curr) { WASM_UNREACHABLE("TODO"); }
275275
Flow visitStringEq(StringEq* curr) { WASM_UNREACHABLE("TODO"); }
276+
Flow visitStringTest(StringTest* curr) { WASM_UNREACHABLE("TODO"); }
276277
Flow visitStringWTF16Get(StringWTF16Get* curr) { WASM_UNREACHABLE("TODO"); }
277278
Flow visitStringSliceWTF(StringSliceWTF* curr) { WASM_UNREACHABLE("TODO"); }
278279
Flow visitContNew(ContNew* curr) { WASM_UNREACHABLE("TODO"); }

src/ir/ReFinalize.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ void ReFinalize::visitStringMeasure(StringMeasure* curr) { curr->finalize(); }
182182
void ReFinalize::visitStringEncode(StringEncode* curr) { curr->finalize(); }
183183
void ReFinalize::visitStringConcat(StringConcat* curr) { curr->finalize(); }
184184
void ReFinalize::visitStringEq(StringEq* curr) { curr->finalize(); }
185+
void ReFinalize::visitStringTest(StringTest* curr) { curr->finalize(); }
185186
void ReFinalize::visitStringWTF16Get(StringWTF16Get* curr) { curr->finalize(); }
186187
void ReFinalize::visitStringSliceWTF(StringSliceWTF* curr) { curr->finalize(); }
187188
void ReFinalize::visitContNew(ContNew* curr) { curr->finalize(); }

src/ir/child-typer.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,6 +1226,11 @@ template<typename Subtype> struct ChildTyper : OverriddenVisitor<Subtype> {
12261226
note(&curr->right, stringref);
12271227
}
12281228

1229+
void visitStringTest(StringTest* curr) {
1230+
auto stringref = Type(HeapType::ext, Nullable);
1231+
note(&curr->ref, stringref);
1232+
}
1233+
12291234
void visitStringWTF16Get(StringWTF16Get* curr) {
12301235
note(&curr->ref, Type(HeapType::string, Nullable));
12311236
note(&curr->pos, Type::i32);

src/ir/cost.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,10 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, CostType> {
788788
// "3" is chosen since strings might or might not be interned in the engine.
789789
return 3 + visit(curr->left) + visit(curr->right);
790790
}
791+
CostType visitStringTest(StringTest* curr) {
792+
// "3" copied from `visitStringEq`.
793+
return 3 + visit(curr->ref);
794+
}
791795
CostType visitStringWTF16Get(StringWTF16Get* curr) {
792796
return 1 + visit(curr->ref) + visit(curr->pos);
793797
}

src/ir/effects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,6 +1081,7 @@ class EffectAnalyzer {
10811081
}
10821082
}
10831083
}
1084+
void visitStringTest(StringTest* curr) {}
10841085
void visitStringWTF16Get(StringWTF16Get* curr) {
10851086
// traps when ref is null.
10861087
parent.implicitTrap = true;

src/ir/possible-contents.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -662,9 +662,7 @@ struct InfoCollector
662662
info.calledFromOutside.insert(curr->func);
663663
}
664664
}
665-
void visitRefEq(RefEq* curr) {
666-
addRoot(curr);
667-
}
665+
void visitRefEq(RefEq* curr) { addRoot(curr); }
668666
void visitTableGet(TableGet* curr) {
669667
// TODO: be more precise
670668
addRoot(curr);
@@ -1143,6 +1141,10 @@ struct InfoCollector
11431141
// TODO: optimize when possible
11441142
addRoot(curr);
11451143
}
1144+
void visitStringTest(StringTest* curr) {
1145+
// TODO: optimize when possible
1146+
addRoot(curr);
1147+
}
11461148
void visitStringWTF16Get(StringWTF16Get* curr) {
11471149
// TODO: optimize when possible
11481150
addRoot(curr);

src/ir/subtype-exprs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ struct SubtypingDiscoverer : public OverriddenVisitor<SubType> {
429429
void visitStringEncode(StringEncode* curr) {}
430430
void visitStringConcat(StringConcat* curr) {}
431431
void visitStringEq(StringEq* curr) {}
432+
void visitStringTest(StringTest* curr) {}
432433
void visitStringWTF16Get(StringWTF16Get* curr) {}
433434
void visitStringSliceWTF(StringSliceWTF* curr) {}
434435

src/parser/contexts.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,9 @@ struct NullInstrParserCtx {
890890
Result<> makeStringEq(Index, const std::vector<Annotation>&, StringEqOp) {
891891
return Ok{};
892892
}
893+
Result<> makeStringTest(Index, const std::vector<Annotation>&) {
894+
return Ok{};
895+
}
893896
Result<> makeStringWTF8Advance(Index, const std::vector<Annotation>&) {
894897
return Ok{};
895898
}
@@ -2823,6 +2826,11 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx>, AnnotationParserCtx {
28232826
return withLoc(pos, irBuilder.makeStringEq(op));
28242827
}
28252828

2829+
Result<> makeStringTest(Index pos,
2830+
const std::vector<Annotation>& annotations) {
2831+
return withLoc(pos, irBuilder.makeStringTest());
2832+
}
2833+
28262834
Result<> makeStringWTF16Get(Index pos,
28272835
const std::vector<Annotation>& annotations) {
28282836
return withLoc(pos, irBuilder.makeStringWTF16Get());

0 commit comments

Comments
 (0)