Fix slow token rescanning during preprocessing. #442
Merged
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.
The loop to rescan tokens during preprocessing can become very slow when expanding a macro that consists of many tokens. For instance, preprocessing the following can take several minutes:
You can add more lines of As to make it take an arbitrarily long amount of time.
The problem is the calls like
replTokens = replTokens.subList(...)
on each iteration of the loop.subList
doesn't return a new list but aSubList
that's a "view" of the existing list. And callingsubList
on aSubList
doesn't create a view of the underlying list but instead creates a view of theSubList
or a 'view of a view". After running through the loop a few times you now have a "view of a view of a view of a view of ..." which gets very slow.Modifying the existing list in-place solves this problem.
I'd like to have a test for this but I'm not sure how to write one when the only observable difference in behavior is how long it takes to run.