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): ...@@ -5246,13 +5246,13 @@ class CClassDefNode(ClassDefNode):
self.type_init_args.generate_disposal_code(code) self.type_init_args.generate_disposal_code(code)
self.type_init_args.free_temps(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: if self.body:
self.body.generate_execution_code(code) self.body.generate_execution_code(code)
# Also called from ModuleNode for early init types. # Also called from ModuleNode for early init types.
@staticmethod @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 # Generate a call to PyType_Ready for an extension
# type defined in this module. # type defined in this module.
type = entry.type type = entry.type
...@@ -5288,15 +5288,10 @@ class CClassDefNode(ClassDefNode): ...@@ -5288,15 +5288,10 @@ class CClassDefNode(ClassDefNode):
code.putln("#else") code.putln("#else")
for slot in TypeSlots.slot_table: for slot in TypeSlots.slot_table:
slot.generate_dynamic_init_code(scope, code) slot.generate_dynamic_init_code(scope, code)
if heap_type_bases: code.globalstate.use_utility_code(
code.globalstate.use_utility_code( UtilityCode.load_cached('PyType_Ready', 'ExtensionTypes.c'))
UtilityCode.load_cached('PyType_Ready', 'ExtensionTypes.c'))
readyfunc = "__Pyx_PyType_Ready"
else:
readyfunc = "PyType_Ready"
code.putln( code.putln(
"if (%s(&%s) < 0) %s" % ( "if (__Pyx_PyType_Ready(&%s) < 0) %s" % (
readyfunc,
typeobj_cname, typeobj_cname,
code.error_goto(entry.pos))) code.error_goto(entry.pos)))
# Don't inherit tp_print from builtin types in Python 2, restoring the # Don't inherit tp_print from builtin types in Python 2, restoring the
...@@ -5375,12 +5370,11 @@ class CClassDefNode(ClassDefNode): ...@@ -5375,12 +5370,11 @@ class CClassDefNode(ClassDefNode):
type.vtabptr_cname, type.vtabptr_cname,
code.error_goto(entry.pos))) code.error_goto(entry.pos)))
code.putln("#endif") code.putln("#endif")
if heap_type_bases: code.globalstate.use_utility_code(
code.globalstate.use_utility_code( UtilityCode.load_cached('MergeVTables', 'ImportExport.c'))
UtilityCode.load_cached('MergeVTables', 'ImportExport.c')) code.putln("if (__Pyx_MergeVtables(&%s) < 0) %s" % (
code.putln("if (__Pyx_MergeVtables(&%s) < 0) %s" % ( typeobj_cname,
typeobj_cname, code.error_goto(entry.pos)))
code.error_goto(entry.pos)))
if not type.scope.is_internal and not type.scope.directives.get('internal'): if not type.scope.is_internal and not type.scope.directives.get('internal'):
# scope.is_internal is set for types defined by # scope.is_internal is set for types defined by
# Cython (such as closures), the 'internal' # Cython (such as closures), the 'internal'
......
# 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