diff options
author | Robert Bradshaw <robertwb@gmail.com> | 2021-04-10 00:54:35 -0700 |
---|---|---|
committer | Robert Bradshaw <robertwb@gmail.com> | 2021-04-10 00:55:34 -0700 |
commit | e9aa3db7ba616316319bd31d591be1b715fd8c5a (patch) | |
tree | 668583f689544bc2ebb14922db5279ac99f7c194 | |
parent | 217a93e7b139ab49815ea9ca34142b3e2a116a08 (diff) | |
download | cython-e9aa3db7ba616316319bd31d591be1b715fd8c5a.tar.gz |
Unconditionally use modified PyType_Ready.
This fixes github issue #4106.
-rw-r--r-- | Cython/Compiler/Nodes.py | 26 | ||||
-rw-r--r-- | tests/run/cdef_multiple_inheritance_cimport.srctree | 44 |
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 |