summaryrefslogtreecommitdiff
path: root/src/ir
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir')
-rw-r--r--src/ir/ReFinalize.cpp1
-rw-r--r--src/ir/cost.h3
-rw-r--r--src/ir/effects.h9
-rw-r--r--src/ir/possible-contents.cpp4
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