[capi-sig] Does PyObject_SetAttrString am PyArg_Parse steal an object reference?

Hrvoje Niksic 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 mailing list