[Numpy-discussion] Reference counting question

Sasha ndarray at mac.com
Thu Feb 16 13:42:06 EST 2006

I was looking at the code implementing array_new in arrayobject.c and
for a while I could not convince myself that it handles ref. counts
correctly.  The cleanup code (at the "fail:" label contains 
Py_XDECREF(descr), meaning that descr is unreferenced on failure
unless it is NULL.  This makes sense because descr is created inside
array_new  by PyArray_DescrConverter,  but  if the failure is detected
in PyArg_ParseTupleAndKeywords, descr may be NULL.    What was
puzzling to me,  failures of  PyArray_NewFromDescr are handled by "if
(ret == NULL) {descr=NULL;goto fail;}" that sets descr to NULL before
jumping to cleanup.  As I investigated further, I've discovered the
following helpful comment preceding PyArray_NewFromDescr : /* steals a
reference to descr (even on failure) */ that explains  why descr=NULL
is necessary.

I wonder what was the motivation for this design choice.  I don't
think this is a natural behavior for python C-API functions.  I am not
proposing to make any changes, just curious about the design.

More information about the NumPy-Discussion mailing list