diff options
Diffstat (limited to 'src/ir')
-rw-r--r-- | src/ir/ReFinalize.cpp | 1 | ||||
-rw-r--r-- | src/ir/cost.h | 1 | ||||
-rw-r--r-- | src/ir/effects.h | 6 |
3 files changed, 8 insertions, 0 deletions
diff --git a/src/ir/ReFinalize.cpp b/src/ir/ReFinalize.cpp index 785b36c80..b8d620560 100644 --- a/src/ir/ReFinalize.cpp +++ b/src/ir/ReFinalize.cpp @@ -163,6 +163,7 @@ void ReFinalize::visitArrayNew(ArrayNew* curr) { curr->finalize(); } void ReFinalize::visitArrayGet(ArrayGet* curr) { curr->finalize(); } void ReFinalize::visitArraySet(ArraySet* curr) { curr->finalize(); } void ReFinalize::visitArrayLen(ArrayLen* curr) { curr->finalize(); } +void ReFinalize::visitRefAs(RefAs* curr) { curr->finalize(); } void ReFinalize::visitFunction(Function* curr) { // we may have changed the body from unreachable to none, which might be bad diff --git a/src/ir/cost.h b/src/ir/cost.h index 95c483601..8c23c91f8 100644 --- a/src/ir/cost.h +++ b/src/ir/cost.h @@ -623,6 +623,7 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, Index> { Index visitArrayLen(ArrayLen* curr) { return 1 + nullCheckCost(curr->ref) + visit(curr->ref); } + Index visitRefAs(RefAs* curr) { return 1 + visit(curr->value); } private: Index nullCheckCost(Expression* ref) { diff --git a/src/ir/effects.h b/src/ir/effects.h index 603ed49a3..ca440ce51 100644 --- a/src/ir/effects.h +++ b/src/ir/effects.h @@ -598,6 +598,12 @@ private: parent.implicitTrap = true; } } + void visitRefAs(RefAs* curr) { + // traps when the arg is not valid + if (curr->value->type.isNullable()) { + parent.implicitTrap = true; + } + } }; public: |