summaryrefslogtreecommitdiff
path: root/src/ir
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir')
-rw-r--r--src/ir/cost.h19
-rw-r--r--src/ir/effects.h18
2 files changed, 24 insertions, 13 deletions
diff --git a/src/ir/cost.h b/src/ir/cost.h
index 0c5a13819..b71e1ea0e 100644
--- a/src/ir/cost.h
+++ b/src/ir/cost.h
@@ -586,12 +586,21 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, Index> {
return 1 + nullCheckCost(curr->ref) + visit(curr->ref);
}
Index visitStructSet(StructSet* curr) {
- return 1 + nullCheckCost(curr->ref) + visit(curr->ref) + visit(curr->value);
+ return 2 + nullCheckCost(curr->ref) + visit(curr->ref) + visit(curr->value);
+ }
+ Index visitArrayNew(ArrayNew* curr) {
+ return 4 + visit(curr->rtt) + visit(curr->size) + visit(curr->init);
+ }
+ Index visitArrayGet(ArrayGet* curr) {
+ return 1 + nullCheckCost(curr->ref) + visit(curr->ref) + visit(curr->index);
+ }
+ Index visitArraySet(ArraySet* curr) {
+ return 2 + nullCheckCost(curr->ref) + visit(curr->ref) +
+ visit(curr->index) + visit(curr->value);
+ }
+ Index visitArrayLen(ArrayLen* curr) {
+ return 1 + nullCheckCost(curr->ref) + visit(curr->ref);
}
- Index visitArrayNew(ArrayNew* curr) { WASM_UNREACHABLE("TODO: GC"); }
- Index visitArrayGet(ArrayGet* curr) { WASM_UNREACHABLE("TODO: GC"); }
- Index visitArraySet(ArraySet* curr) { WASM_UNREACHABLE("TODO: GC"); }
- Index visitArrayLen(ArrayLen* curr) { WASM_UNREACHABLE("TODO: GC"); }
private:
Index nullCheckCost(Expression* ref) {
diff --git a/src/ir/effects.h b/src/ir/effects.h
index e4907b082..94387c2cf 100644
--- a/src/ir/effects.h
+++ b/src/ir/effects.h
@@ -556,8 +556,7 @@ private:
}
void visitRttCanon(RttCanon* curr) {}
void visitRttSub(RttSub* curr) {}
- void visitStructNew(StructNew* curr) {
- }
+ void visitStructNew(StructNew* curr) {}
void visitStructGet(StructGet* curr) {
// traps when the arg is null
if (curr->ref->type.isNullable()) {
@@ -570,17 +569,20 @@ private:
parent.implicitTrap = true;
}
}
- void visitArrayNew(ArrayNew* curr) {
- WASM_UNREACHABLE("TODO (gc): array.new");
- }
+ void visitArrayNew(ArrayNew* curr) {}
void visitArrayGet(ArrayGet* curr) {
- WASM_UNREACHABLE("TODO (gc): array.get");
+ // traps when the arg is null or the index out of bounds
+ parent.implicitTrap = true;
}
void visitArraySet(ArraySet* curr) {
- WASM_UNREACHABLE("TODO (gc): array.set");
+ // traps when the arg is null or the index out of bounds
+ parent.implicitTrap = true;
}
void visitArrayLen(ArrayLen* curr) {
- WASM_UNREACHABLE("TODO (gc): array.len");
+ // traps when the arg is null
+ if (curr->ref->type.isNullable()) {
+ parent.implicitTrap = true;
+ }
}
};