On 16.12.15 16:53, Random832 wrote:
At the risk of bikeshedding, this needs do { ... } while(0), or
it almost certainly will eventually be called incorrectly in an
if/else statement.  Yes, it's ugly, but that's part of the cost
of using macros.

Yes, of course, and the patch for issue20440 uses this idiom. Here it is omitted for clearness.

If it were implemented as below, then it could evaluate ptr only
once at the cost of requiring it to refer to an addressable
pointer object:
     PyObject **__tmpp__ == &(ptr);
     PyObject *__tmp__ = *__tmpp__;
     *__tmpp__ = (new_value);
     PY_DECREF(__tmp__);

I'm not entirely sure of the benefit of a macro over an inline
function.

Because the first argument is passed by reference (as in Py_INCREF etc).

Or why it doesn't INCREF the new value, maintaining
the invariant that ptr is an owned reference.

Because in the majority of using cases stealing a reference is what is needed. Otherwise we would virtually always need to decref a reference just after using this macro. And couldn't use it as Py_XXX(obj->attr, PySomething_New()).

I think "SET" names imply that it's safe if the original
reference is NULL. This isn't an objection to the names, but if
it is given one of those names I think it should use Py_XDECREF.

Originally I proposed pairs of functions with and withot X in the name (as Py_DECREF/Py_XDECREF). In this poll this detail is omitted for clearness. Later we can create a new poll if needed.

_______________________________________________
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