[issue25731] Assigning and deleting __new__ attr on the class does not allow to create instances of this class

2016-04-20 Thread jcristau

jcristau added the comment:

Well yes, but as far as I can tell that's why python used B.__new__ for C 
before your change, as that has a compatible layout.

--

___
Python tracker 
<http://bugs.python.org/issue25731>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue25731] Assigning and deleting __new__ attr on the class does not allow to create instances of this class

2016-04-05 Thread jcristau

jcristau added the comment:

This change in 2.7 seems to break things:

$ cat foo.pxd 
cdef class B:
cdef object b
$ cat foo.pyx 
cdef class A:
pass

cdef class B:
def __init__(self, b):
self.b = b
$ cat bar.py
from foo import A, B

class C(A, B):
def __init__(self):
B.__init__(self, 1)

C()
$ cython foo.pyx && gcc -I/usr/include/python2.7 -Wall -shared -fPIC -o foo.so 
foo.c
$ python -c 'import bar'
Segmentation fault

C's tp_new is set to A's tp_new function, thus the b slot is never initialized 
to Py_None, and C's __init__ calls DECREF on a NULL pointer.

Reverting changeset e7062dd9085e makes things work again, with C's tp_new being 
B's tp_new.

--
nosy: +jcristau

___
Python tracker 
<http://bugs.python.org/issue25731>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com