diff options
author | Lisandro Dalcin <dalcinl@gmail.com> | 2023-04-21 00:03:19 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-21 00:03:19 +0300 |
commit | a75afc03415f1b887434991ac0db2de0e6555ed7 (patch) | |
tree | 5826f3a48cbc13683b3767047a19ee4e30ccf1f1 | |
parent | f570f8dec0565ef820d888f837645b2ae3b681fa (diff) | |
download | cython-a75afc03415f1b887434991ac0db2de0e6555ed7.tar.gz |
Fix regression in code generation order for cdef classes (GH-5395)
-rw-r--r-- | Cython/Compiler/ModuleNode.py | 2 | ||||
-rw-r--r-- | tests/run/cdef_class_order.pyx | 24 |
2 files changed, 24 insertions, 2 deletions
diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py index 29e810a73..cba8effef 100644 --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@ -651,7 +651,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): dfs(type_dict[v]) result.append(u) - for key in type_order: + for key in reversed(type_order): dfs(type_dict[key]) result.reverse() diff --git a/tests/run/cdef_class_order.pyx b/tests/run/cdef_class_order.pyx index 42f0b4248..dad892d5f 100644 --- a/tests/run/cdef_class_order.pyx +++ b/tests/run/cdef_class_order.pyx @@ -5,11 +5,33 @@ cdef class B cdef class A(object): cdef list dealloc1 +cdef class Y(X): pass +cdef class X(C): pass +cdef class C: pass + cdef class B(A): cdef list dealloc2 +cdef class Z(A): pass + + def test(): """ >>> test() + A + B + C + X + Y + Z """ - A(), B() + A(), B(), C(), X(), Y(), Z() + import sys + py_version = sys.version_info[:2] + if py_version >= (3, 7): # built-in dict is insertion-ordered + global_values = list(globals().values()) + else: + global_values = [A, B, C, X, Y, Z] + for value in global_values: + if isinstance(value, type): + print(value.__name__) |