Embedding: Creating / Deleting CObjects?!
Bernhard Herzog
herzog at online.de
Wed Jul 21 16:34:25 EDT 1999
More information about the Python-list mailing list
Wed Jul 21 16:34:25 EDT 1999
- Previous message (by thread): [Tutor] I want to learn to hack
- Next message (by thread): Embedding: Creating / Deleting CObjects?!
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Bjoern Giesler <un4e at rz.uni-karlsruhe.de> writes: > I'm truly baffled. I'm trying to define a backend for my embedded Python > system, and the corresponding C routines seem to work, but the program > crashes somewhere in the Python library routines, dances the Fandango all > over my internal object representation, and whatnot. > > I'm posting a couple of fragments of my code, just so that somebody can tell > me whether this is the canonical way of handling things (this side of Python > is not exactly well documented...) > > /* Content destructor function */ > static void > PLPythonDestructor(proplist_t obj) > { > PLRelease(obj); > } > > /* CObject Creator */ > static PyObject * > PLPythonNewInstance(PyObject *self, PyObject *args) > { > proplist_t plClassName, plArgs; > instance_t instance; > char *className; > PyObject *pyArgs, *retval; > > printf("NewInstanceVar\n"); > > if(!PyArg_ParseTuple(args, "sO", &className, &pyArgs)) > return NULL; > > plArgs = PLPy2PLObject(pyArgs); /* NULL is OK here */ > plClassName = PLMakeString(className); > instance = PLObjectNewInstance(plClassName, plArgs); /* [My own braindead > class system. > Works, though.] */ > if(plClassName) > PLRelease(plClassName); > if(plArgs) > PLRelease(plArgs); > > if(!instance) > { > PyErr_SetString(PyExc_RuntimeError, "Couldn't create new instance"); > return NULL; > } > retval = PyCObject_FromVoidPtr((void *)instance, > PLPythonDestructor); > Py_INCREF(retval); This INCREF creates a memory leak. PyCObject_FromVoidPtr returns a new CObject which you can return as is. > return retval; > } > > /* CObject Destructor */ > static PyObject * > PLPythonDeleteInstance(PyObject *self, PyObject *args) > { > instance_t instance; > PyObject *instanceObject; > > printf("DeleteInstance\n"); > > if(!PyArg_ParseTuple(args, "O", &instanceObject)) > return NULL; > > /* > instance = (instance_t) PyCObject_AsVoidPtr(instanceObject); > PLObjectDeleteInstance(instance); > */ > > Py_XDECREF(instanceObject); This DECREF is wrong here, because PyArg_ParseTuple does not increase the refcount of *instanceObject. > return Py_None; > } -- Bernhard Herzog | Sketch, a python based drawing program herzog at online.de | http://www.online.de/home/sketch/
- Previous message (by thread): [Tutor] I want to learn to hack
- Next message (by thread): Embedding: Creating / Deleting CObjects?!
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list