1# mode: run
2# tag: cyclicgc
3
4
5cimport cython
6
7@cython.test_fail_if_path_exists('//CClassDefNode[@scope.has_cyclic_pyobject_attrs = True]')
8@cython.test_assert_path_exists('//CClassDefNode',
9                                '//CClassDefNode[@scope]',
10                                '//CClassDefNode[@scope.has_cyclic_pyobject_attrs = False]')
11cdef class ExtTypeNoGC:
12    """
13    >>> obj = ExtTypeNoGC()
14    >>> obj = ExtTypeNoGC()
15    >>> obj = ExtTypeNoGC()
16    >>> obj = ExtTypeNoGC()
17    >>> obj = ExtTypeNoGC()
18    >>> obj = ExtTypeNoGC()
19    """
20
21
22@cython.test_fail_if_path_exists('//CClassDefNode[@scope.has_cyclic_pyobject_attrs = True]')
23@cython.test_assert_path_exists('//CClassDefNode',
24                                '//CClassDefNode[@scope]',
25                                '//CClassDefNode[@scope.has_cyclic_pyobject_attrs = False]')
26@cython.final
27cdef class ExtTypeFinalNoGC:
28    """
29    >>> obj = ExtTypeFinalNoGC()
30    >>> obj = ExtTypeFinalNoGC()
31    >>> obj = ExtTypeFinalNoGC()
32    >>> obj = ExtTypeFinalNoGC()
33    >>> obj = ExtTypeFinalNoGC()
34    >>> obj = ExtTypeFinalNoGC()
35    """
36    cdef bytes s
37
38
39@cython.test_fail_if_path_exists('//CClassDefNode[@scope.has_cyclic_pyobject_attrs = True]')
40@cython.test_assert_path_exists('//CClassDefNode',
41                                '//CClassDefNode[@scope]',
42                                '//CClassDefNode[@scope.has_cyclic_pyobject_attrs = False]')
43cdef class ExtSubTypeNoGC(ExtTypeNoGC):
44    """
45    >>> obj = ExtSubTypeNoGC()
46    >>> obj = ExtSubTypeNoGC()
47    >>> obj = ExtSubTypeNoGC()
48    >>> obj = ExtSubTypeNoGC()
49    >>> obj = ExtSubTypeNoGC()
50    >>> obj = ExtSubTypeNoGC()
51    """
52
53
54@cython.test_fail_if_path_exists('//CClassDefNode[@scope.has_cyclic_pyobject_attrs = True]')
55@cython.test_assert_path_exists('//CClassDefNode',
56                                '//CClassDefNode[@scope]',
57                                '//CClassDefNode[@scope.has_cyclic_pyobject_attrs = False]')
58cdef class ExtTypePyArgsNoGC:
59    """
60    >>> obj = ExtTypePyArgsNoGC()
61    >>> obj = ExtTypePyArgsNoGC()
62    >>> obj = ExtTypePyArgsNoGC()
63    >>> obj = ExtTypePyArgsNoGC()
64    >>> obj = ExtTypePyArgsNoGC()
65    >>> obj = ExtTypePyArgsNoGC()
66    """
67    cdef bytes b
68    cdef str s
69    cdef unicode u
70# eventually, this should work, too:
71#    cdef ExtTypeFinalNoGC x
72
73
74@cython.test_fail_if_path_exists('//CClassDefNode[@scope.has_cyclic_pyobject_attrs = True]')
75@cython.test_assert_path_exists('//CClassDefNode',
76                                '//CClassDefNode[@scope]',
77                                '//CClassDefNode[@scope.has_cyclic_pyobject_attrs = False]')
78cdef class ExtSubTypePyArgsNoGC(ExtTypePyArgsNoGC):
79    """
80    >>> obj = ExtSubTypePyArgsNoGC()
81    >>> obj = ExtSubTypePyArgsNoGC()
82    >>> obj = ExtSubTypePyArgsNoGC()
83    >>> obj = ExtSubTypePyArgsNoGC()
84    >>> obj = ExtSubTypePyArgsNoGC()
85    >>> obj = ExtSubTypePyArgsNoGC()
86    """
87
88
89@cython.test_fail_if_path_exists('//CClassDefNode[@scope.has_cyclic_pyobject_attrs = False]')
90@cython.test_assert_path_exists('//CClassDefNode',
91                                '//CClassDefNode[@scope]',
92                                '//CClassDefNode[@scope.has_cyclic_pyobject_attrs = True]')
93cdef class ExtTypePyArgsWithGC:
94    """
95    >>> obj = ExtTypePyArgsWithGC()
96    >>> obj = ExtTypePyArgsWithGC()
97    >>> obj = ExtTypePyArgsWithGC()
98    >>> obj = ExtTypePyArgsWithGC()
99    >>> obj = ExtTypePyArgsWithGC()
100    >>> obj = ExtTypePyArgsWithGC()
101    >>> obj.create_cycle()
102    """
103    cdef bytes b
104    cdef str s
105    cdef unicode u
106    cdef list l
107
108    def create_cycle(self):
109        self.l = [self]
110
111
112@cython.test_fail_if_path_exists('//CClassDefNode[@scope.has_cyclic_pyobject_attrs = True]')
113@cython.test_assert_path_exists('//CClassDefNode',
114                                '//CClassDefNode[@scope]',
115                                '//CClassDefNode[@scope.has_cyclic_pyobject_attrs = False]')
116cdef class ExtSubTypePyArgsWithGC(ExtTypePyArgsWithGC):
117    """
118    >>> obj = ExtSubTypePyArgsWithGC()
119    >>> obj = ExtSubTypePyArgsWithGC()
120    >>> obj = ExtSubTypePyArgsWithGC()
121    >>> obj = ExtSubTypePyArgsWithGC()
122    >>> obj = ExtSubTypePyArgsWithGC()
123    >>> obj = ExtSubTypePyArgsWithGC()
124    >>> obj.create_cycle()
125    """
126
127
128@cython.test_fail_if_path_exists('//CClassDefNode[@scope.has_cyclic_pyobject_attrs = True]')
129@cython.test_assert_path_exists('//CClassDefNode',
130                                '//CClassDefNode[@scope]',
131                                '//CClassDefNode[@scope.has_cyclic_pyobject_attrs = False]')
132cdef class ExtSubTypePlusPyArgsWithGC(ExtSubTypePyArgsWithGC):
133    """
134    >>> obj = ExtSubTypePlusPyArgsWithGC()
135    >>> obj = ExtSubTypePlusPyArgsWithGC()
136    >>> obj = ExtSubTypePlusPyArgsWithGC()
137    >>> obj = ExtSubTypePlusPyArgsWithGC()
138    >>> obj = ExtSubTypePlusPyArgsWithGC()
139    >>> obj = ExtSubTypePlusPyArgsWithGC()
140    >>> obj.create_cycle()
141    """
142    cdef bytes b2
143    cdef unicode u2
144
145
146@cython.test_fail_if_path_exists('//CClassDefNode[@scope.has_cyclic_pyobject_attrs = False]')
147@cython.test_assert_path_exists('//CClassDefNode',
148                                '//CClassDefNode[@scope]',
149                                '//CClassDefNode[@scope.has_cyclic_pyobject_attrs = True]')
150cdef class ExtSubTypePlusGCPyArgsWithGC(ExtSubTypePlusPyArgsWithGC):
151    """
152    >>> obj = ExtSubTypePlusGCPyArgsWithGC()
153    >>> obj = ExtSubTypePlusGCPyArgsWithGC()
154    >>> obj = ExtSubTypePlusGCPyArgsWithGC()
155    >>> obj = ExtSubTypePlusGCPyArgsWithGC()
156    >>> obj = ExtSubTypePlusGCPyArgsWithGC()
157    >>> obj = ExtSubTypePlusGCPyArgsWithGC()
158    >>> obj.create_cycle()
159    """
160    cdef tuple t
161