Skip to content

Commit e73224a

Browse files
authored
Implement elem.drop (#7658)
Fixes #7209.
1 parent c91c052 commit e73224a

31 files changed

+231
-50
lines changed

scripts/gen-s-parser.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,7 @@
582582
("table.fill", "makeTableFill()"),
583583
("table.copy", "makeTableCopy()"),
584584
("table.init", "makeTableInit()"),
585+
("elem.drop", "makeElemDrop()"),
585586
# exception handling instructions
586587
("try", "makeTry()"),
587588
("try_table", "makeTryTable()"),

scripts/test/shared.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,6 @@ def get_tests(test_dir, extensions=[], recursive=False):
416416
'address.wast', # 64-bit offset allowed by memory64
417417
'align.wast', # Alignment bit 6 used by multi-memory
418418
'binary.wast', # memory.grow reserved byte a LEB in multi-memory
419-
'bulk.wast', # Requires support for elem.drop
420419
'comments.wast', # Issue with carriage returns being treated as newlines
421420
'const.wast', # Hex float constant not recognized as out of range
422421
'conversions.wast', # Promoted NaN should be canonical
@@ -450,7 +449,6 @@ def get_tests(test_dir, extensions=[], recursive=False):
450449
'type-equivalence.wast', # Recursive types allowed by GC
451450
'unreached-invalid.wast', # Requires more precise unreachable validation
452451
'array.wast', # Requires support for table default elements
453-
'array_init_elem.wast', # Requires support for elem.drop
454452
'br_if.wast', # Requires more precise branch validation
455453
'br_on_cast.wast', # Requires host references to not be externalized i31refs
456454
'br_on_cast_fail.wast', # Requires host references to not be externalized i31refs

src/gen-s-parser.inc

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -401,25 +401,36 @@ switch (buf[0]) {
401401
}
402402
}
403403
case 'e': {
404-
switch (buf[7]) {
405-
case 'c':
406-
if (op == "extern.convert_any"sv) {
407-
CHECK_ERR(makeRefAs(ctx, pos, annotations, ExternConvertAny));
408-
return Ok{};
409-
}
410-
goto parse_error;
411-
case 'e':
412-
if (op == "extern.externalize"sv) {
413-
CHECK_ERR(makeRefAs(ctx, pos, annotations, ExternConvertAny));
404+
switch (buf[1]) {
405+
case 'l':
406+
if (op == "elem.drop"sv) {
407+
CHECK_ERR(makeElemDrop(ctx, pos, annotations));
414408
return Ok{};
415409
}
416410
goto parse_error;
417-
case 'i':
418-
if (op == "extern.internalize"sv) {
419-
CHECK_ERR(makeRefAs(ctx, pos, annotations, AnyConvertExtern));
420-
return Ok{};
411+
case 'x': {
412+
switch (buf[7]) {
413+
case 'c':
414+
if (op == "extern.convert_any"sv) {
415+
CHECK_ERR(makeRefAs(ctx, pos, annotations, ExternConvertAny));
416+
return Ok{};
417+
}
418+
goto parse_error;
419+
case 'e':
420+
if (op == "extern.externalize"sv) {
421+
CHECK_ERR(makeRefAs(ctx, pos, annotations, ExternConvertAny));
422+
return Ok{};
423+
}
424+
goto parse_error;
425+
case 'i':
426+
if (op == "extern.internalize"sv) {
427+
CHECK_ERR(makeRefAs(ctx, pos, annotations, AnyConvertExtern));
428+
return Ok{};
429+
}
430+
goto parse_error;
431+
default: goto parse_error;
421432
}
422-
goto parse_error;
433+
}
423434
default: goto parse_error;
424435
}
425436
}

src/interpreter/interpreter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ struct ExpressionInterpreter : OverriddenVisitor<ExpressionInterpreter, Flow> {
233233
Flow visitTableFill(TableFill* curr) { WASM_UNREACHABLE("TODO"); }
234234
Flow visitTableCopy(TableCopy* curr) { WASM_UNREACHABLE("TODO"); }
235235
Flow visitTableInit(TableInit* curr) { WASM_UNREACHABLE("TODO"); }
236+
Flow visitElemDrop(ElemDrop* curr) { WASM_UNREACHABLE("TODO"); }
236237
Flow visitTry(Try* curr) { WASM_UNREACHABLE("TODO"); }
237238
Flow visitTryTable(TryTable* curr) { WASM_UNREACHABLE("TODO"); }
238239
Flow visitThrow(Throw* curr) { WASM_UNREACHABLE("TODO"); }

src/ir/ReFinalize.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ void ReFinalize::visitTableGrow(TableGrow* curr) { curr->finalize(); }
127127
void ReFinalize::visitTableFill(TableFill* curr) { curr->finalize(); }
128128
void ReFinalize::visitTableCopy(TableCopy* curr) { curr->finalize(); }
129129
void ReFinalize::visitTableInit(TableInit* curr) { curr->finalize(); }
130+
void ReFinalize::visitElemDrop(ElemDrop* curr) { curr->finalize(); }
130131
void ReFinalize::visitTry(Try* curr) { curr->finalize(); }
131132
void ReFinalize::visitTryTable(TryTable* curr) {
132133
curr->finalize();

src/ir/child-typer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,6 +804,8 @@ template<typename Subtype> struct ChildTyper : OverriddenVisitor<Subtype> {
804804
note(&curr->size, Type::i32);
805805
}
806806

807+
void visitElemDrop(ElemDrop* curr) {}
808+
807809
void visitTry(Try* curr) {
808810
note(&curr->body, curr->type);
809811
for (auto& expr : curr->catchBodies) {

src/ir/cost.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,7 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, CostType> {
631631
CostType visitTableInit(TableInit* curr) {
632632
return 6 + visit(curr->dest) + visit(curr->offset) + visit(curr->size);
633633
}
634+
CostType visitElemDrop(ElemDrop* curr) { return 6; }
634635
CostType visitTry(Try* curr) {
635636
// We assume no exception will be thrown in most cases
636637
return visit(curr->body);

src/ir/effects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,7 @@ class EffectAnalyzer {
782782
parent.writesTable = true;
783783
parent.implicitTrap = true;
784784
}
785+
void visitElemDrop(ElemDrop* curr) { parent.writesTable = true; }
785786
void visitTry(Try* curr) {
786787
if (curr->delegateTarget.is()) {
787788
parent.delegateTargets.insert(curr->delegateTarget);

src/ir/possible-contents.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,7 @@ struct InfoCollector
675675
void visitTableFill(TableFill* curr) { addRoot(curr); }
676676
void visitTableCopy(TableCopy* curr) { addRoot(curr); }
677677
void visitTableInit(TableInit* curr) {}
678+
void visitElemDrop(ElemDrop* curr) {}
678679

679680
void visitNop(Nop* curr) {}
680681
void visitUnreachable(Unreachable* curr) {}

src/ir/subtype-exprs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ struct SubtypingDiscoverer : public OverriddenVisitor<SubType> {
243243
self()->noteSubtype(seg->type,
244244
self()->getModule()->getTable(curr->table)->type);
245245
}
246+
void visitElemDrop(ElemDrop* curr) {}
246247
void visitTry(Try* curr) {
247248
self()->noteSubtype(curr->body, curr);
248249
for (auto* body : curr->catchBodies) {

0 commit comments

Comments
 (0)