This repository was archived by the owner on Dec 15, 2022. It is now read-only.
Avoid the possibility of stack overflow in spliceArray helper #204
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
We're seeing some errors like this in bugsnag:
The problem is that we're calling
Array.splice
with a large number of arguments. We cap the argument count at 100,000, which was an attempt to avoid stack overflows, but depending on how many stack frames deep we are when callingDisplayLayer.updateSpatialIndex
, and the size of those stack frames, this cap may still be too high.The largest splice that I can perform in the dev tools is 125,000. So I think this error may have emerged in 1.14.0 because we are calling
splice
with 100,000 elements in a slightly deeper stack frame than before.updateSpatialIndex
is also a pretty hefty stack frame, because it has a ton of local variables.I've fixed this problem by rewriting
spliceArray
to not useArray.splice
at all. We now move the items that follow the splice using an explicit loop, and then write the new items into place with another explicit loop. There's less native code being used this way, but we also avoid several large allocations, because we used to repeatedlyslice
the inserted array, andArray.splice
also returns an array of removed items that we weren't using./cc @nathansobo