diff options
Diffstat (limited to 'src/ir')
-rw-r--r-- | src/ir/ReFinalize.cpp | 1 | ||||
-rw-r--r-- | src/ir/cost.h | 3 | ||||
-rw-r--r-- | src/ir/effects.h | 9 | ||||
-rw-r--r-- | src/ir/possible-contents.cpp | 4 |
4 files changed, 16 insertions, 1 deletions
diff --git a/src/ir/ReFinalize.cpp b/src/ir/ReFinalize.cpp index 59b994ec1..8acffaa34 100644 --- a/src/ir/ReFinalize.cpp +++ b/src/ir/ReFinalize.cpp @@ -175,6 +175,7 @@ void ReFinalize::visitRefAs(RefAs* curr) { curr->finalize(); } void ReFinalize::visitStringNew(StringNew* curr) { curr->finalize(); } void ReFinalize::visitStringConst(StringConst* curr) { curr->finalize(); } void ReFinalize::visitStringMeasure(StringMeasure* curr) { curr->finalize(); } +void ReFinalize::visitStringEncode(StringEncode* 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 372c597a5..afc091ffb 100644 --- a/src/ir/cost.h +++ b/src/ir/cost.h @@ -678,6 +678,9 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, CostType> { CostType visitStringMeasure(StringMeasure* curr) { return 6 + visit(curr->ref); } + CostType visitStringEncode(StringEncode* curr) { + return 6 + visit(curr->ref) + visit(curr->ptr); + } private: CostType nullCheckCost(Expression* ref) { diff --git a/src/ir/effects.h b/src/ir/effects.h index b8007cfba..8e33f65bf 100644 --- a/src/ir/effects.h +++ b/src/ir/effects.h @@ -734,7 +734,14 @@ private: } void visitStringNew(StringNew* curr) {} void visitStringConst(StringConst* curr) {} - void visitStringMeasure(StringMeasure* curr) {} + void visitStringMeasure(StringMeasure* curr) { + // traps when ref is null. + parent.implicitTrap = true; + } + void visitStringEncode(StringEncode* curr) { + // traps when ref is null or we write out of bounds. + parent.implicitTrap = true; + } }; public: diff --git a/src/ir/possible-contents.cpp b/src/ir/possible-contents.cpp index 3b5c19f15..c865585f1 100644 --- a/src/ir/possible-contents.cpp +++ b/src/ir/possible-contents.cpp @@ -685,6 +685,10 @@ struct InfoCollector // TODO: optimize when possible addRoot(curr); } + void visitStringEncode(StringEncode* curr) { + // TODO: optimize when possible + addRoot(curr); + } // TODO: Model which throws can go to which catches. For now, anything thrown // is sent to the location of that tag, and any catch of that tag can |