Trouble with ref counts in C extension

Mark Hammond MarkH at
Mon Dec 3 02:09:31 EST 2001

Michel Pelletier wrote:

> static PyObject *
> FiclVM_pop(FiclVMObject *self, PyObject *args)
> {
>   CELL c;
>   PyObject *ob;
>   if (!PyArg_ParseTuple(args, ":pop"))
>     return NULL;
>   if (!stackDepth(self->ficl_vm->pStack))
>     return NULL; // handle better...
>   c = vmPop(self->ficl_vm);
>   ob = (PyObject*)(c.p);
>   Py_DECREF(ob);

The DECREF is not needed here.

You need one DECREF to remove the reference that was consumed by the 
stack - but you then need one INCREF for the result of the function.

The end result means that the function is reference neutral.


 >   if (!stackDepth(self->ficl_vm->pStack))
 >     return NULL; // handle better...

Should be something like:
    if (!stackDepth(self->ficl_vm->pStack)) {
       PyErr_SetString(PyExc_ValueError, "Out of stack items");
       return NULL;

(or any other exception value you choose)


More information about the Python-list mailing list