Commit e9aa3db7 authored by Robert Bradshaw's avatar Robert Bradshaw

Unconditionally use modified PyType_Ready.

This fixes github issue #4106.
parent 217a93e7
......@@ -5246,13 +5246,13 @@ class CClassDefNode(ClassDefNode):
self.type_init_args.generate_disposal_code(code)
self.type_init_args.free_temps(code)
self.generate_type_ready_code(self.entry, code, True)
self.generate_type_ready_code(self.entry, code)
if self.body:
self.body.generate_execution_code(code)
# Also called from ModuleNode for early init types.
@staticmethod
def generate_type_ready_code(entry, code, heap_type_bases=False):
def generate_type_ready_code(entry, code):
# Generate a call to PyType_Ready for an extension
# type defined in this module.
type = entry.type
......@@ -5288,15 +5288,10 @@ class CClassDefNode(ClassDefNode):
code.putln("#else")
for slot in TypeSlots.slot_table:
slot.generate_dynamic_init_code(scope, code)
if heap_type_bases:
code.globalstate.use_utility_code(
UtilityCode.load_cached('PyType_Ready', 'ExtensionTypes.c'))
readyfunc = "__Pyx_PyType_Ready"
else:
readyfunc = "PyType_Ready"
code.putln(
"if (%s(&%s) < 0) %s" % (
readyfunc,
"if (__Pyx_PyType_Ready(&%s) < 0) %s" % (
typeobj_cname,
code.error_goto(entry.pos)))
# Don't inherit tp_print from builtin types in Python 2, restoring the
......@@ -5375,7 +5370,6 @@ class CClassDefNode(ClassDefNode):
type.vtabptr_cname,
code.error_goto(entry.pos)))
code.putln("#endif")
if heap_type_bases:
code.globalstate.use_utility_code(
UtilityCode.load_cached('MergeVTables', 'ImportExport.c'))
code.putln("if (__Pyx_MergeVtables(&%s) < 0) %s" % (
......
# Test for https://github.com/cython/cython/issues/4106
PYTHON setup.py build_ext --inplace
PYTHON -c "import sub"
######## setup.py ########
from Cython.Build import cythonize
from distutils.core import setup
setup(
ext_modules = cythonize("*.pyx"),
)
######## base.pxd ########
cdef class A:
cdef dict __dict__
cdef int a(self)
cdef class B(A):
cdef int b(self)
######## base.pyx ########
cdef class A:
cdef int a(self):
return 1
class PyA:
pass
cdef class B(A, PyA):
cdef int b(self):
return 2
######## sub.pyx ########
from base cimport B
print(B)
cdef class C(B):
cdef int c(self):
return 3
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment