Skip to content

Commit b5476c6

Browse files
authored
[Strings] Add string.compare (#5453)
See WebAssembly/stringref#58
1 parent 17d120a commit b5476c6

14 files changed

+112
-33
lines changed

scripts/gen-s-parser.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,8 @@
620620
("string.encode_wtf8_array", "makeStringEncode(s, StringEncodeWTF8Array)"),
621621
("string.encode_wtf16_array", "makeStringEncode(s, StringEncodeWTF16Array)"),
622622
("string.concat", "makeStringConcat(s)"),
623-
("string.eq", "makeStringEq(s)"),
623+
("string.eq", "makeStringEq(s, StringEqEqual)"),
624+
("string.compare", "makeStringEq(s, StringEqCompare)"),
624625
("string.as_wtf8", "makeStringAs(s, StringAsWTF8)"),
625626
("string.as_wtf16", "makeStringAs(s, StringAsWTF16)"),
626627
("string.as_iter", "makeStringAs(s, StringAsIter)"),

src/binaryen-c.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1880,7 +1880,7 @@ BinaryenExpressionRef BinaryenStringEq(BinaryenModuleRef module,
18801880
BinaryenExpressionRef right) {
18811881
return static_cast<Expression*>(
18821882
Builder(*(Module*)module)
1883-
.makeStringEq((Expression*)left, (Expression*)right));
1883+
.makeStringEq(StringEqEqual, (Expression*)left, (Expression*)right));
18841884
}
18851885
BinaryenExpressionRef BinaryenStringAs(BinaryenModuleRef module,
18861886
BinaryenOp op,

src/gen-s-parser.inc

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3138,13 +3138,21 @@ switch (buf[0]) {
31383138
}
31393139
}
31403140
case 'c': {
3141-
switch (buf[10]) {
3142-
case 'c':
3143-
if (op == "string.concat"sv) { return makeStringConcat(s); }
3144-
goto parse_error;
3145-
case 's':
3146-
if (op == "string.const"sv) { return makeStringConst(s); }
3141+
switch (buf[9]) {
3142+
case 'm':
3143+
if (op == "string.compare"sv) { return makeStringEq(s, StringEqCompare); }
31473144
goto parse_error;
3145+
case 'n': {
3146+
switch (buf[10]) {
3147+
case 'c':
3148+
if (op == "string.concat"sv) { return makeStringConcat(s); }
3149+
goto parse_error;
3150+
case 's':
3151+
if (op == "string.const"sv) { return makeStringConst(s); }
3152+
goto parse_error;
3153+
default: goto parse_error;
3154+
}
3155+
}
31483156
default: goto parse_error;
31493157
}
31503158
}
@@ -3178,7 +3186,7 @@ switch (buf[0]) {
31783186
}
31793187
}
31803188
case 'q':
3181-
if (op == "string.eq"sv) { return makeStringEq(s); }
3189+
if (op == "string.eq"sv) { return makeStringEq(s, StringEqEqual); }
31823190
goto parse_error;
31833191
default: goto parse_error;
31843192
}
@@ -8812,21 +8820,33 @@ switch (buf[0]) {
88128820
}
88138821
}
88148822
case 'c': {
8815-
switch (buf[10]) {
8816-
case 'c':
8817-
if (op == "string.concat"sv) {
8818-
auto ret = makeStringConcat(ctx, pos);
8823+
switch (buf[9]) {
8824+
case 'm':
8825+
if (op == "string.compare"sv) {
8826+
auto ret = makeStringEq(ctx, pos, StringEqCompare);
88198827
CHECK_ERR(ret);
88208828
return *ret;
88218829
}
88228830
goto parse_error;
8823-
case 's':
8824-
if (op == "string.const"sv) {
8825-
auto ret = makeStringConst(ctx, pos);
8826-
CHECK_ERR(ret);
8827-
return *ret;
8831+
case 'n': {
8832+
switch (buf[10]) {
8833+
case 'c':
8834+
if (op == "string.concat"sv) {
8835+
auto ret = makeStringConcat(ctx, pos);
8836+
CHECK_ERR(ret);
8837+
return *ret;
8838+
}
8839+
goto parse_error;
8840+
case 's':
8841+
if (op == "string.const"sv) {
8842+
auto ret = makeStringConst(ctx, pos);
8843+
CHECK_ERR(ret);
8844+
return *ret;
8845+
}
8846+
goto parse_error;
8847+
default: goto parse_error;
88288848
}
8829-
goto parse_error;
8849+
}
88308850
default: goto parse_error;
88318851
}
88328852
}
@@ -8877,7 +8897,7 @@ switch (buf[0]) {
88778897
}
88788898
case 'q':
88798899
if (op == "string.eq"sv) {
8880-
auto ret = makeStringEq(ctx, pos);
8900+
auto ret = makeStringEq(ctx, pos, StringEqEqual);
88818901
CHECK_ERR(ret);
88828902
return *ret;
88838903
}

src/passes/Print.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2424,7 +2424,18 @@ struct PrintExpressionContents
24242424
void visitStringConcat(StringConcat* curr) {
24252425
printMedium(o, "string.concat");
24262426
}
2427-
void visitStringEq(StringEq* curr) { printMedium(o, "string.eq"); }
2427+
void visitStringEq(StringEq* curr) {
2428+
switch (curr->op) {
2429+
case StringEqEqual:
2430+
printMedium(o, "string.eq");
2431+
break;
2432+
case StringEqCompare:
2433+
printMedium(o, "string.compare");
2434+
break;
2435+
default:
2436+
WASM_UNREACHABLE("invalid string.eq*");
2437+
}
2438+
}
24282439
void visitStringAs(StringAs* curr) {
24292440
switch (curr->op) {
24302441
case StringAsWTF8:

src/wasm-binary.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,6 +1162,7 @@ enum ASTNodes {
11621162
StringViewIterAdvance = 0xa2,
11631163
StringViewIterRewind = 0xa3,
11641164
StringViewIterSlice = 0xa4,
1165+
StringCompare = 0xa8,
11651166
StringNewWTF8Array = 0xb0,
11661167
StringNewWTF16Array = 0xb1,
11671168
StringEncodeWTF8Array = 0xb2,

src/wasm-builder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1057,8 +1057,9 @@ class Builder {
10571057
ret->finalize();
10581058
return ret;
10591059
}
1060-
StringEq* makeStringEq(Expression* left, Expression* right) {
1060+
StringEq* makeStringEq(StringEqOp op, Expression* left, Expression* right) {
10611061
auto* ret = wasm.allocator.alloc<StringEq>();
1062+
ret->op = op;
10621063
ret->left = left;
10631064
ret->right = right;
10641065
ret->finalize();

src/wasm-delegations-fields.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,7 @@ switch (DELEGATE_ID) {
757757
}
758758
case Expression::Id::StringEqId: {
759759
DELEGATE_START(StringEq);
760+
DELEGATE_FIELD_INT(StringEq, op);
760761
DELEGATE_FIELD_CHILD(StringEq, right);
761762
DELEGATE_FIELD_CHILD(StringEq, left);
762763
DELEGATE_END(StringEq);

src/wasm-s-parser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ class SExpressionWasmBuilder {
309309
Expression* makeStringMeasure(Element& s, StringMeasureOp op);
310310
Expression* makeStringEncode(Element& s, StringEncodeOp op);
311311
Expression* makeStringConcat(Element& s);
312-
Expression* makeStringEq(Element& s);
312+
Expression* makeStringEq(Element& s, StringEqOp op);
313313
Expression* makeStringAs(Element& s, StringAsOp op);
314314
Expression* makeStringWTF8Advance(Element& s);
315315
Expression* makeStringWTF16Get(Element& s);

src/wasm.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,11 @@ enum StringEncodeOp {
605605
StringEncodeWTF16Array,
606606
};
607607

608+
enum StringEqOp {
609+
StringEqEqual,
610+
StringEqCompare,
611+
};
612+
608613
enum StringAsOp {
609614
StringAsWTF8,
610615
StringAsWTF16,
@@ -1748,6 +1753,8 @@ class StringEq : public SpecificExpression<Expression::StringEqId> {
17481753
public:
17491754
StringEq(MixedArena& allocator) {}
17501755

1756+
StringEqOp op;
1757+
17511758
Expression* left;
17521759
Expression* right;
17531760

src/wasm/wasm-binary.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7345,12 +7345,17 @@ bool WasmBinaryBuilder::maybeVisitStringConcat(Expression*& out,
73457345
}
73467346

73477347
bool WasmBinaryBuilder::maybeVisitStringEq(Expression*& out, uint32_t code) {
7348-
if (code != BinaryConsts::StringEq) {
7348+
StringEqOp op;
7349+
if (code == BinaryConsts::StringEq) {
7350+
op = StringEqEqual;
7351+
} else if (code == BinaryConsts::StringCompare) {
7352+
op = StringEqCompare;
7353+
} else {
73497354
return false;
73507355
}
73517356
auto* right = popNonVoidExpression();
73527357
auto* left = popNonVoidExpression();
7353-
out = Builder(wasm).makeStringEq(left, right);
7358+
out = Builder(wasm).makeStringEq(op, left, right);
73547359
return true;
73557360
}
73567361

0 commit comments

Comments
 (0)