> On 25 Jan 2022, at 14:50, Tony Flury via Python-list <python-list@python.org> 
> wrote:
> 
> 
>> On 20/01/2022 23:12, Chris Angelico wrote:
>>> On Fri, 21 Jan 2022 at 10:10, Greg Ewing <greg.ew...@canterbury.ac.nz> 
>>> wrote:
>>> On 20/01/22 12:09 am, Chris Angelico wrote:
>>>> At this point, the refcount has indeed been increased.
>>>> 
>>>>>           return self;
>>>>>      }
>>>> And then you say "my return value is this object".
>>>> 
>>>> So you're incrementing the refcount, then returning it without
>>>> incrementing the refcount. Your code is actually equivalent to "return
>>>> self".
>>> Chris, you're not making any sense. This is C code, so there's no
>>> way that "return x" can change the reference count of x.
>> Yeah, I wasn't clear there. It was equivalent to *the Python code*
>> "return self". My apologies.
>> 
>>>  > The normal thing to do is to add a reference to whatever you're
>>>  > returning. For instance, Py_RETURN_NONE will incref None and then
>>>  > return it.
>>>  >
>>> 
>>> The OP understands that this is not a normal thing to do. He's
>>> trying to deliberately leak a reference for the purpose of diagnosing
>>> a problem.
>>> 
>>> It would be interesting to see what the actual refcount is after
>>> calling this function.
> 
> After calling this without a double increment in the function the ref count 
> is still only 1 - which means that the 'return self' effectively does a 
> double decrement. My original message includes the Python code which calls 
> this 'leaky' function and you can see that despite the 'leaky POC' doing an 
> increment ref count drops back to one after the return.
> 
> You are right this is not a normal thing to do, I am trying to understand the 
> behaviour so my library does the correct thing in all cases - for example - 
> imagine you have two nodes in a tree :
> 
> A --- > B
> 
> And your Python code has a named reference to A, and B also maintains a 
> reference to A as it's parent.
> 
> In this case I would expect A to have a reference count of 2 (counted as 3 
> through sys.getrefcount() - one for the named reference in the Python code - 
> and one for the link from B back to A; I would also expect B to have a 
> reference count here of 1 (just the reference from A - assuming nothing else 
> referenced B).
> 
> My original code was incrementing the ref counts of A and B and then 
> returning A. within the Python test code A had a refcount of 1 (and not the 
> expected 2), but the refcount from B was correct as far as I could tell.
> 
> 
>> Yes, and that's why I was saying it would need a *second* incref.
>> 
>> ChrisA
> 
> Thank you to all of you for trying to help - I accept that the only way to 
> make the code work is to do a 2nd increment.
> 
> I don't understand why doing a 'return self' would result in a double 
> decrement - that seems utterly bizzare behaviour - it obviously works, but 
> why.

The return self in C will not change the ref count.

I would suggest setting a break point in your code and stepping out of the 
function and seeing that python’s code does to the ref count.

Barry
> 
> 
> 
> -- 
> Anthony Flury
> email : anthony.fl...@btinternet.com
> 
> -- 
> https://mail.python.org/mailman/listinfo/python-list
> 

-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to