Stefan Behnel, 10.01.2014 17:30: > Nils Bruin, 22.11.2013 00:10: >> With the following classes: >> >> cdef class A(object): >> cdef int a >> pass >> cdef class B(object): >> pass >> >> and the following multiply inherited classes: >> >> The problem arises >> >> class C(object): >> pass >> class D(C,B): >> pass >> class F(B,C): >> pass >> class E(C,A): >> pass >> class G(A,C): >> pass >> >> I observe: >> >>>>> D.__new__(D) >> >> B.__new__(D) is not safe, use object.__new__() >> >>>>> E.__new__(E) >> >> <__main__.E object at 0x6c56488> >> >>>>> F.__new__(F) >> >> <__main__.F object at 0x6c4fdd0> >>>>> G.__new__(G) >> <__main__.G object at 0x6c4fdd0> >> >> >> As you can see, a problem only arises for D, in which case there is >> actually NOT a layout problem: when the class A is involved, where it does >> matter which __new__ is used, that right one (I assume) is chosen in all >> cases. A little googling suggests that this error might be coming from >> tp_new_wrapper in Objects/typeobject.c, which tries to do some sanity >> checks before calling type->tp_new. It is not clear to me, however, why >> those sanity checks fail for D.__new__(D) and succeed for E.__new__(E) > > I came up with this fix: > > https://github.com/cython/cython/commit/ec37469dc61e0e24db448e9455b2483797afe936 > > It passes your test case and doesn't seem to break others so far. > > However, this is a bit of a deep change, so I'd like to see some serious > user side testing before I'll happily push for its inclusion in Cython 0.20.
And, not entirely unexpected, it breaks Sage pretty much completely: https://sage.math.washington.edu:8091/hudson/job/sage-tests/1645/consoleFull Stefan _______________________________________________ cython-devel mailing list cython-devel@python.org https://mail.python.org/mailman/listinfo/cython-devel