better handling in deduperreload for patching functions with freevars #14960
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.
This PR should fix #14958. When patching a decorated function, rather than giving it the union of the old version's and new version's freevars, we give it the old version's for anything callable, and the new version's for everything else. This ensure we use the old
__class__
attribute and avoid errors such as "TypeError: super(type, obj): obj must be an instance or subtype of type". Using old versions of other callables is also better since these references are the ones we maintain in deduperreload, rather than the new references. It does, however, mean that we need to reload changed decorated functions twice: once without decorators (to ensure the old version gets patched), and once with. This PR handles that as well.Test plan: all the other unit tests pass + additionally added a new one which exercises this case.