summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Bradshaw <robertwb@gmail.com>2021-04-10 00:54:35 -0700
committerRobert Bradshaw <robertwb@gmail.com>2021-04-10 00:55:34 -0700
commite9aa3db7ba616316319bd31d591be1b715fd8c5a (patch)
tree668583f689544bc2ebb14922db5279ac99f7c194
parent217a93e7b139ab49815ea9ca34142b3e2a116a08 (diff)
downloadcython-e9aa3db7ba616316319bd31d591be1b715fd8c5a.tar.gz
Unconditionally use modified PyType_Ready.
This fixes github issue #4106.
-rw-r--r--Cython/Compiler/Nodes.py26
-rw-r--r--tests/run/cdef_multiple_inheritance_cimport.srctree44
2 files changed, 54 insertions, 16 deletions
diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py
index 719ca7144..0d56a541c 100644
--- a/Cython/Compiler/Nodes.py
+++ b/Cython/Compiler/Nodes.py
@@ -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.globalstate.use_utility_code(
+ UtilityCode.load_cached('PyType_Ready', 'ExtensionTypes.c'))
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,12 +5370,11 @@ 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" % (
- typeobj_cname,
- code.error_goto(entry.pos)))
+ code.globalstate.use_utility_code(
+ UtilityCode.load_cached('MergeVTables', 'ImportExport.c'))
+ code.putln("if (__Pyx_MergeVtables(&%s) < 0) %s" % (
+ typeobj_cname,
+ code.error_goto(entry.pos)))
if not type.scope.is_internal and not type.scope.directives.get('internal'):
# scope.is_internal is set for types defined by
# Cython (such as closures), the 'internal'
diff --git a/tests/run/cdef_multiple_inheritance_cimport.srctree b/tests/run/cdef_multiple_inheritance_cimport.srctree
new file mode 100644
index 000000000..dd56b3e30
--- /dev/null
+++ b/tests/run/cdef_multiple_inheritance_cimport.srctree
@@ -0,0 +1,44 @@
+# 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