<p dir="ltr"><br>
On 1 Mar 2014 01:22, "Barry Warsaw" <<a href="mailto:barry@python.org">barry@python.org</a>> wrote:<br>
><br>
> On Feb 28, 2014, at 10:27 PM, Nick Coghlan wrote:<br>
><br>
> >With the new macro in place, the existing Py_CLEAR(x) macro would be<br>
> >equivalent to Py_SETREF(x, NULL).<br>
> ><br>
> >Originally I was also concerned about the "how will people know there's no<br>
> >implicit incref?", but I've since become satisfied with the fact that the<br>
> >precedent set by the reference stealing SET_ITEM macros is strong enough to<br>
> >justify the shorter name.<br>
><br>
> I haven't had time to follow this discussion at all, but for a macro to be<br>
> called Py_SETREF and *not* increment the reference counter seems at best<br>
> confusing.  Despite my hesitation to paint a bike shed I haven't had time to<br>
> inspect, something more akin to Py_SET_POINTER seems more appropriate<br>
> (i.e. don't put "REF" in the name if it isn't playing refcounting games).</p>
<p dir="ltr">It *is* playing refcounting games - it's decrefing the existing target while stealing a reference to the new target, just like the existing SET_ITEM macros and somewhat like Py_CLEAR (although in that case, it's more obvious that we will never incref NULL).</p>

<p dir="ltr">The whole point of this macro is to take an *existing* reference and safely *overwrite* another existing reference, exactly as the SET_ITEM macros do.</p>
<p dir="ltr">That actually gives me an idea that wasn't on Serhiy's original list: Py_SET_ATTR(target, value).</p>
<p dir="ltr">After all, setting attributes safely from C is the main use case for this, and I think it strengthens the parallel with the SET_ITEM macros on the concrete types.</p>
<p dir="ltr">Cheers,<br>
Nick.</p>
<p dir="ltr">><br>
> -Barry<br>
> _______________________________________________<br>
> Python-Dev mailing list<br>
> <a href="mailto:Python-Dev@python.org">Python-Dev@python.org</a><br>
> <a href="https://mail.python.org/mailman/listinfo/python-dev">https://mail.python.org/mailman/listinfo/python-dev</a><br>
> Unsubscribe: <a href="https://mail.python.org/mailman/options/python-dev/ncoghlan%40gmail.com">https://mail.python.org/mailman/options/python-dev/ncoghlan%40gmail.com</a></p>