Hi Musbur,

While python-dev is specifically for core development, the "specific
interest group" mailing lists are for both change proposals and existing
usage questions.

I've cc'ed capi-sig on this reply.

Cheers,
Nick.

On Sat., 4 Apr. 2020, 2:02 am Musbur, <mus...@posteo.org> wrote:

> Hello,
>
> (I've asked this question before on python-list but only got scarce
> and ultimately unhelpful answers. Although this isn't about Python
> development itself, I'm assuming that there is more CPython
> knowledge on this list than on the other, so please bear with me.)
>
> I've written a C extension module, each defining a class
> (called Series and CLHist, respectively). I can import both modules in
> Python and use the classes. Everything works fine, also according to
> valgrind.
>
> Now I want to return a Series instance directly from a CLHist
> method, and that immediately crashes Python with a segfault.
>
> Here's a bit of code and just the _new, _init, and _finalize methods
> which I've sprinkled with debugging code. When I instantiate a Series
> object from Python, I see output from all three methods. When I call
> pyseries_new() from C, none of the three functions are called and it
> crashes.
>
> At some point I thought maybe I should call PyType_Ready() from the C
> side before instantiating Series. In a "standard" (system) Python
> installation, it printed the desired debugging output and crashed
> later. Under a debugging Python installation I built it outputs
> nothing except an interesting post-mortem "Fatal Python error: UNREF
> invalid object" (see below).
>
> Here's my C code with the boilerplate stuff left out.
>
> typedef struct {
>     PyObject_HEAD
>     struct clh_series *series;
> } Series;
>
> static PyObject *Series_new(PyTypeObject *type,
>         PyObject *args, PyObject *kw) {
>     Series *self;
>
>     self = (Series *) type->tp_alloc(type, 0);
>     fprintf(stderr, "Series_new(%p)\n", self);
>     self->series = NULL;
>     return (PyObject*)self;
> }
>
> static int Series_init(Series *self, PyObject *args, PyObject *kw) {
>     fprintf(stderr, "Series_init(%p)\n", self);
>     self->series = NULL;
>     return 0;
> }
>
> static void Series_finalize(PyObject *self) {
>     fprintf(stderr, "Series_finalize(%p)\n", self);
>     clh_series_free(((Series*)self)->series);
> }
>
> /* To create a new Series object directly from C */
> PyObject *pyseries_new(struct clh_series *series) {
>     Series *pyseries;
>
>     pyseries = PyObject_New(Series, &series_type);
>     PyObject_Init((PyObject *)pyseries, &series_type);
>     pyseries->series = series;
>     return (PyObject *) pyseries;
> }
>
> Here's the debugging output:
>
> * ob
> object  : <refcnt 0 at 0x7f1a4e2f97a8>
> type    : tuple
> refcount: 0
> address : 0x7f1a4e2f97a8
> * op->_ob_prev->_ob_next
> object  : <_Series object at 0x7f1a4e2ee9d0>
> type    : _Series
> refcount: 1
> address : 0x7f1a4e2ee9d0
> * op->_ob_next->_ob_prev
> object  : <refcnt 0 at 0x7f1a4e2f97a8>
> type    : tuple
> refcount: 0
> address : 0x7f1a4e2f97a8
> Fatal Python error: UNREF invalid object
> _______________________________________________
> Python-Dev mailing list -- python-dev@python.org
> To unsubscribe send an email to python-dev-le...@python.org
> https://mail.python.org/mailman3/lists/python-dev.python.org/
> Message archived at
> https://mail.python.org/archives/list/python-dev@python.org/message/ILMRMQ64P7H6KHH2BZQPDYGXW773MOII/
> Code of Conduct: http://python.org/psf/codeofconduct/
>
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/PLSKLZQYP64CG6F7DR3VZBXOFQ3YA3A6/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to