I wrote the following module to test the behavior of PyInstance_New.  I
called it something like this:
    import vedel

    class k:
        def __del__(self): print "deleted"

    vedel.g(k)

I get output like:
    after creation, x->refcnt = 1
    doing decref
    deleted
    after decref

Unless there's a cycle and GC gets involved, all there is to deleting
*anything* in Python is correctly managing the refcount.  On the other
hand, you can never free an object while it is still reachable.  Some
local name "x" may never spontaneously lose the thing it refers to.

/*------------------------------------------------------------------------*/
#include <Python.h>

static PyObject *g(PyObject *s, PyObject *o) {
    PyObject *x = PyInstance_New( o, NULL, NULL);
    if(x) {
        printf("after creation, x->refcnt = %d\n", x->ob_refcnt);
        printf("doing decref\n");
        Py_DECREF(x);
        printf("after decref\n");
    } else {
        printf("x == NULL\n");
    }
    Py_INCREF(Py_None);
    return Py_None;
}

static PyMethodDef methods[] = {
    {"g", (PyCFunction)g, METH_O, NULL},
    {NULL},
};

void initvedel(void) {
    Py_InitModule("vedel", methods);
}
/*------------------------------------------------------------------------*/

Attachment: pgp85hc39n0gv.pgp
Description: PGP signature

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to