[mypyc]Fix reference leak in mypyc bytes concatenation#21469
Open
colinxu2020 wants to merge 2 commits into
Open
[mypyc]Fix reference leak in mypyc bytes concatenation#21469colinxu2020 wants to merge 2 commits into
colinxu2020 wants to merge 2 commits into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Fixes Mypyc #1192
Fix a reference leak in mypyc-generated code for
bytes + bytes.The
bytes + bytesprimitive forCPyBytes_Concatwas marked as stealing theleft operand with
steals=[True, False]. However,CPyBytes_Concatdoes notsteal or decref either argument; it allocates and returns a new
bytesobject.Because of this mismatch, the refcount pass skipped emitting a
dec_refforowned left operands. For code such as:
the generated IR decrefed only the right operand after
CPyBytes_Concat, leavingthe owned left operand alive. Chained concatenations amplified the leak because
intermediate concat results could also become leaked left operands.
This PR removes the incorrect
steals=[True, False]annotation from thebytes + bytesprimitive, so both operands are treated as non-stolen and ownedoperands are decrefed normally after the call.
The tests verify that the generated IR decrefs both owned operands after
CPyBytes_Concat.