more precise types in keyword argument method lowering #30926
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.
We have a bad interaction between two features: (1) generated methods for keyword arguments need to pass the original function around in case it contains closure data, (2) functions that take a function argument but don't call it aren't specialized on that argument (to avoid excessive specialization). That can lead to slow calls in keyword method shims, but is a bit unpredictable. For example it caused the slowdown observed in #30830 (comment), and likely other intermittent performance changes we've seen.
Long story short, this is before:
and this is after:
Now the front end puts a specific type on the argument slot used to forward the function. After all, it knows exactly what function we're dealing with...right? Well, it can be quite difficult to do for closures, where we need to ensure everything is defined in just the right order, since there are some circular dependencies (method A calls method B, but method B needs to mention A in its signature). I hope this works.