summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLisandro Dalcin <dalcinl@gmail.com>2023-04-21 00:03:19 +0300
committerGitHub <noreply@github.com>2023-04-21 00:03:19 +0300
commita75afc03415f1b887434991ac0db2de0e6555ed7 (patch)
tree5826f3a48cbc13683b3767047a19ee4e30ccf1f1
parentf570f8dec0565ef820d888f837645b2ae3b681fa (diff)
downloadcython-a75afc03415f1b887434991ac0db2de0e6555ed7.tar.gz
Fix regression in code generation order for cdef classes (GH-5395)
-rw-r--r--Cython/Compiler/ModuleNode.py2
-rw-r--r--tests/run/cdef_class_order.pyx24
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__)