[capi-sig] Does PyObject_SetAttrString am PyArg_Parse steal an object reference?
hniksic at xemacs.org
Thu Dec 6 08:42:20 CET 2012
Robert Steckroth <robertsteckroth at gmail.com> writes:
> In the below example, is there an extra reference to the align object
> when the Py_RETURN_NONE IS hit?
There is. Since PyObject_SetAttrString doesn't steal the reference
count to its argument, the Py_XINCREF is unnecessary. Also, I'd use
Py_INCREF there, since you already aren't entering the if-clause if
align is NULL.
> Also, why do I have to Py_INCREF(s_obj)?
You don't. PyArg_ParseTupleAndKeywords doesn't increase reference count
of its arguments, and neither should the code calling it -- it is the
responsibility of the caller to provide arguments that it either owns or
are globally available (Py_None, type objects).
> If I do not, I end up with crashes. Is this a bug?
It's most likely a bug somewhere else in your code or an extension
you're using that gets hidden by the extra incref. This can sometimes
happen in Python/C; the correct solution is to remove the extraneous
incref and carefully inspect the rest of your code for incorrect
reference count handling.
More information about the capi-sig