Recently, Oren Milman fixed multiple bugs when an __init__() method
was called twice. IMHO Py_SETREF() was nicely used in __init__():

https://github.com/python/cpython/commit/e56ab746a965277ffcc4396d8a0902b6e072d049

https://github.com/python/cpython/commit/c0cabc23bbe474d542ff8a4f1243f4ec3cce5549

While it's possible to rewrite the code *correctly* without
PY_SETREF(), it would be much more verbose. Here the fix remains a
single line:

- self->archive = filename;
+ Py_XSETREF(self->archive, filename);

Victor

2017-11-09 3:08 GMT+01:00 Raymond Hettinger <raymond.hettin...@gmail.com>:
>
>> On Nov 8, 2017, at 8:30 AM, Serhiy Storchaka <storch...@gmail.com> wrote:
>>
>> Macros Py_SETREF and Py_XSETREF were introduced in 3.6 and backported to all 
>> maintained versions ([1] and [2]). Despite their names they are private. I 
>> think that they are enough stable now and would be helpful in third-party 
>> code. Are there any objections against adding them to the stable C API? [3]
>
> I have mixed feeling about this.  You and Victor seem to really like these 
> macros, but they have been problematic for me.  I'm not sure whether it is a 
> conceptual issue or a naming issue, but the presence of these macros impairs 
> my ability to read code and determine whether the refcounts are correct.  I 
> usually end-up replacing the code with the unrolled macro so that I can count 
> the refs across all the code paths.
>
> The other issue is that when there are multiple occurrences of these macros 
> for multiple variables, it interferes with my best practice of deferring all 
> decrefs until the data structures are in a fully consistent state.  Any one 
> of these can cause arbitrary code to run.  I greatly prefer putting all the 
> decrefs at the end to increase my confidence that it is okay to run other 
> code that might reenter the current code.  Pure python functions effectively 
> have this built-in because the locals all get decreffed at the end of the 
> function when a return-statement is encountered.  That practice helps me 
> avoid hard to spot re-entrancy issues.
>
> Lastly, I think we should have a preference to not grow the stable C API.  
> Bigger APIs are harder to learn and remember, not so much for you and Victor 
> who use these frequently, but for everyone else who has to lookup all the 
> macros whose function isn't immediately self-evident.
>
>
> Raymond
>
> _______________________________________________
> Python-Dev mailing list
> Python-Dev@python.org
> https://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: 
> https://mail.python.org/mailman/options/python-dev/victor.stinner%40gmail.com
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to