cython

Форк
0
/
exttype_dealloc.pyx 
170 строк · 3.1 Кб
1
# mode: run
2
# tag: dealloc
3

4
import gc
5
import sys
6

7

8
test_results = []
9

10

11
cdef void add_name(obj):
12
    name = type(obj).__name__.rsplit('.', 1)[-1]
13
    test_results.append(name)
14

15

16
def find_name(exttype):
17
    name = exttype.__name__.rsplit('.', 1)[-1]
18
    return test_results.count(name)
19

20

21
cdef class ExtTypeSimple:
22
    """
23
    >>> obj = ExtTypeSimple()
24
    >>> find_name(ExtTypeSimple)
25
    0
26
    >>> obj = None
27
    >>> _ = gc.collect()
28
    >>> find_name(ExtTypeSimple)
29
    1
30
    """
31
    cdef int x
32
    def __dealloc__(self):
33
        add_name(self)
34
        self.x = 0
35

36

37
class PySubTypeSimple(ExtTypeSimple):
38
    """
39
    >>> obj = PySubTypeSimple()
40
    >>> find_name(PySubTypeSimple)
41
    0
42
    >>> obj = None
43
    >>> _ = gc.collect()
44
    >>> find_name(PySubTypeSimple)
45
    1
46
    """
47

48

49
class PySubTypeDel(ExtTypeSimple):
50
    """
51
    >>> obj = PySubTypeDel()
52
    >>> find_name(PySubTypeDel)
53
    0
54
    >>> obj = None
55
    >>> _ = gc.collect()
56
    >>> find_name(PySubTypeDel)
57
    2
58
    """
59
    def __del__(self):
60
        add_name(self)
61

62

63
cdef class ExtSubTypeObjAttr(ExtTypeSimple):
64
    """
65
    >>> obj = ExtSubTypeObjAttr()
66
    >>> find_name(ExtSubTypeObjAttr)
67
    0
68
    >>> obj = None
69
    >>> _ = gc.collect()
70

71
    # both this type and the base class add the same name
72
    >>> find_name(ExtSubTypeObjAttr)
73
    2
74
    """
75
    cdef object attr
76
    def __dealloc__(self):
77
        add_name(self)
78
        self.x = 1
79

80

81
cdef class ExtTypeRaise:
82
    """
83
    >>> obj = ExtTypeRaise()
84
    >>> find_name(ExtTypeRaise)
85
    0
86
    >>> obj = None
87
    >>> _ = gc.collect()
88
    >>> find_name(ExtTypeRaise)
89
    1
90
    """
91
    def __dealloc__(self):
92
        add_name(self)
93
        raise RuntimeError("HUHU !")
94

95

96
class PySubTypeRaise(ExtTypeRaise):
97
    """
98
    >>> obj = PySubTypeRaise()
99
    >>> obj.ref = obj
100
    >>> find_name(PySubTypeRaise)
101
    0
102
    >>> obj = None
103
    >>> _ = gc.collect()
104
    >>> find_name(PySubTypeRaise)
105
    1
106
    """
107

108

109
cdef class ExtTypeRefCycle:
110
    """
111
    >>> obj = ExtTypeRefCycle()
112
    >>> obj.ref = obj
113
    >>> find_name(ExtTypeRefCycle)
114
    0
115
    >>> obj = None
116
    >>> _ = gc.collect()
117
    >>> find_name(ExtTypeRefCycle)
118
    1
119
    """
120
    cdef public object ref
121
    cdef int x
122
    def __dealloc__(self):
123
        add_name(self)
124
        self.x = 1
125

126

127
class PySubTypeRefCycleDel(ExtTypeRefCycle):
128
    """
129
    >>> obj = PySubTypeRefCycleDel()
130
    >>> obj.ref = obj
131
    >>> find_name(PySubTypeRefCycleDel)
132
    0
133
    >>> obj = None
134
    >>> _ = gc.collect()
135

136
    >>> find_name(PySubTypeRefCycleDel)
137
    2
138
    """
139
    def __del__(self):
140
        add_name(self)
141

142

143
cdef class ExtTypeRefCycleRaise:
144
    """
145
    >>> obj = ExtTypeRefCycleRaise()
146
    >>> obj.ref = obj
147
    >>> find_name(ExtTypeRefCycleRaise)
148
    0
149
    >>> obj = None
150
    >>> _ = gc.collect()
151
    >>> find_name(ExtTypeRefCycleRaise)
152
    1
153
    """
154
    cdef public object ref
155
    def __dealloc__(self):
156
        add_name(self)
157
        raise RuntimeError("Cleaning up !")
158

159

160
class PySubTypeRefCycleRaise(ExtTypeRefCycleRaise):
161
    """
162
    >>> obj = PySubTypeRefCycleRaise()
163
    >>> obj.ref = obj
164
    >>> find_name(PySubTypeRefCycleRaise)
165
    0
166
    >>> obj = None
167
    >>> _ = gc.collect()
168
    >>> find_name(PySubTypeRefCycleRaise)
169
    1
170
    """
171

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.