diff options
author | Alon Zakai <azakai@google.com> | 2022-07-14 17:10:15 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-15 00:10:15 +0000 |
commit | 2b31aeb98a0fc8a5a505b3998d44990ed14e8c38 (patch) | |
tree | b7e28f6ad6e3f77222e724afdb6d8668054410ea /src/ir | |
parent | c0151e99996a7b51d3d135fd5018c69e146b5c02 (diff) | |
download | binaryen-2b31aeb98a0fc8a5a505b3998d44990ed14e8c38.tar.gz binaryen-2b31aeb98a0fc8a5a505b3998d44990ed14e8c38.tar.bz2 binaryen-2b31aeb98a0fc8a5a505b3998d44990ed14e8c38.zip |
[Strings] stringview_*.slice (#4805)
Unfortunately one slice is the same as python [start:end], using 2 params,
and the other slice is one param, [CURR:CURR+num] (where CURR is implied
by the current state in the iter). So we can't use a single class here. Perhaps
a different name would be good, like slice vs substring (like JS does), but
I picked names to match the current spec.
Diffstat (limited to 'src/ir')
-rw-r--r-- | src/ir/ReFinalize.cpp | 4 | ||||
-rw-r--r-- | src/ir/cost.h | 8 | ||||
-rw-r--r-- | src/ir/effects.h | 8 | ||||
-rw-r--r-- | src/ir/possible-contents.cpp | 8 |
4 files changed, 27 insertions, 1 deletions
diff --git a/src/ir/ReFinalize.cpp b/src/ir/ReFinalize.cpp index 2c3b6c1f0..771553e11 100644 --- a/src/ir/ReFinalize.cpp +++ b/src/ir/ReFinalize.cpp @@ -185,6 +185,10 @@ void ReFinalize::visitStringWTF8Advance(StringWTF8Advance* curr) { void ReFinalize::visitStringWTF16Get(StringWTF16Get* curr) { curr->finalize(); } void ReFinalize::visitStringIterNext(StringIterNext* curr) { curr->finalize(); } void ReFinalize::visitStringIterMove(StringIterMove* curr) { curr->finalize(); } +void ReFinalize::visitStringSliceWTF(StringSliceWTF* curr) { curr->finalize(); } +void ReFinalize::visitStringSliceIter(StringSliceIter* 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 3ed37e297..8ebc6eb9b 100644 --- a/src/ir/cost.h +++ b/src/ir/cost.h @@ -672,7 +672,7 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, CostType> { } CostType visitRefAs(RefAs* curr) { return 1 + visit(curr->value); } CostType visitStringNew(StringNew* curr) { - return 4 + visit(curr->ptr) + visit(curr->length); + return 8 + visit(curr->ptr) + visit(curr->length); } CostType visitStringConst(StringConst* curr) { return 4; } CostType visitStringMeasure(StringMeasure* curr) { @@ -701,6 +701,12 @@ struct CostAnalyzer : public OverriddenVisitor<CostAnalyzer, CostType> { CostType visitStringIterMove(StringIterMove* curr) { return 4 + visit(curr->ref) + visit(curr->num); } + CostType visitStringSliceWTF(StringSliceWTF* curr) { + return 8 + visit(curr->ref) + visit(curr->start) + visit(curr->end); + } + CostType visitStringSliceIter(StringSliceIter* curr) { + return 8 + visit(curr->ref) + visit(curr->num); + } private: CostType nullCheckCost(Expression* ref) { diff --git a/src/ir/effects.h b/src/ir/effects.h index 7045d9382..58480f0ff 100644 --- a/src/ir/effects.h +++ b/src/ir/effects.h @@ -777,6 +777,14 @@ private: parent.readsArray = true; parent.writesArray = true; } + void visitStringSliceWTF(StringSliceWTF* curr) { + // traps when ref is null. + parent.implicitTrap = true; + } + void visitStringSliceIter(StringSliceIter* curr) { + // traps when ref is null. + parent.implicitTrap = true; + } }; public: diff --git a/src/ir/possible-contents.cpp b/src/ir/possible-contents.cpp index 35a855614..a0e64e236 100644 --- a/src/ir/possible-contents.cpp +++ b/src/ir/possible-contents.cpp @@ -717,6 +717,14 @@ struct InfoCollector // TODO: optimize when possible addRoot(curr); } + void visitStringSliceWTF(StringSliceWTF* curr) { + // TODO: optimize when possible + addRoot(curr); + } + void visitStringSliceIter(StringSliceIter* 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 |