diff options
Diffstat (limited to 'src/ir')
-rw-r--r-- | src/ir/cost.h | 19 | ||||
-rw-r--r-- | src/ir/effects.h | 18 |
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; + } } }; |