enhancements refnanny
DagSverreSeljebotn edited this page Mar 31, 2009
·
10 revisions
The "refnanny" is a system used while testing Cython, to make sure that no refcount errors happen through the execution path the Cython testcases takes. It only tests the correct operation of Cython itself, not user code.
- Many calls to
Py_INCREF
etc. are replaced with__Pyx_INCREF
etc. (but not in utility code which is in general trusted and doesn't use the nanny)- New calls are added:
__Pyx_GOTREF, __Pyx_GIVEREF, __Pyx_XGIVEREF, __Pyx_XGOTREF
which are called after getting a reference from another function and before giving away a reference to a function/array/struct field. I.e:
__Pyx_GIVEREF(obj)
PyList_SET_ITEM(..., obj, ...)
and
obj = Py_Get...
if (!obj) { ... }
__Pyx_GOTREF(obj)
(Also, XGIVEREF
is called on __pyx_r
prior to returning.)
- One can get reference count errors (which are printed to output and/or logged in a module variable, see
refnanny.pyx
) for two reasons: -
- The required calls to
__Pyx_GOTREF
and__Pyx_GIVEREF
is missing in a given situation. This is also a "breach of contract" and should be fixed, but there's no need to i.e. make new releases if such bugs are discovered, as they don't impact running code. - There's a genuine reference counting problem.
- The required calls to
Default in runtests.py, can be turned off by --no-refnanny
.
If you want to run it on your own project, assuming you have a standard install of Cython (with the refnanny module in Cython.Runtime.refnanny), simply compile with -DCYTHON_REFNANNY
.