|
1 | 1 | #include "parts.h"
|
2 | 2 |
|
| 3 | +int verify_immortality(PyObject *object) |
| 4 | +{ |
| 5 | + assert(_Py_IsImmortal(object)); |
| 6 | + Py_ssize_t old_count = Py_REFCNT(object); |
| 7 | + for (int j = 0; j < 10000; j++) { |
| 8 | + Py_DECREF(object); |
| 9 | + } |
| 10 | + Py_ssize_t current_count = Py_REFCNT(object); |
| 11 | + return old_count == current_count; |
| 12 | +} |
| 13 | + |
3 | 14 | static PyObject *
|
4 | 15 | test_immortal_bool(PyObject *self, PyObject *Py_UNUSED(ignored))
|
5 | 16 | {
|
6 | 17 | PyObject *objects[] = {Py_True, Py_False};
|
7 | 18 | Py_ssize_t n = Py_ARRAY_LENGTH(objects);
|
8 | 19 | for (Py_ssize_t i = 0; i < n; i++) {
|
9 |
| - PyObject* obj = objects[i]; |
10 |
| - assert(_Py_IsImmortal(obj)); |
11 |
| - Py_ssize_t old_count = Py_REFCNT(obj); |
12 |
| - for (int j = 0; j < 10000; j++) { |
13 |
| - Py_DECREF(obj); |
14 |
| - } |
15 |
| - Py_ssize_t current_count = Py_REFCNT(obj); |
16 |
| - assert(old_count == current_count); |
| 20 | + assert(verify_immortality(objects[i])); |
17 | 21 | }
|
18 | 22 | Py_RETURN_NONE;
|
19 | 23 | }
|
20 | 24 |
|
21 | 25 | static PyObject *
|
22 | 26 | test_immortal_none(PyObject *self, PyObject *Py_UNUSED(ignored))
|
23 | 27 | {
|
24 |
| - assert(_Py_IsImmortal(Py_None)); |
25 |
| - Py_ssize_t old_count = Py_REFCNT(Py_None); |
26 |
| - for (int i = 0; i < 10000; i++) { |
27 |
| - Py_DECREF(Py_None); |
28 |
| - } |
29 |
| - Py_ssize_t current_count = Py_REFCNT(Py_None); |
30 |
| - assert(old_count == current_count); |
| 28 | + assert(verify_immortality(Py_None)); |
31 | 29 | Py_RETURN_NONE;
|
32 | 30 | }
|
33 | 31 |
|
34 | 32 | static PyObject *
|
35 | 33 | test_immortal_small_ints(PyObject *self, PyObject *Py_UNUSED(ignored))
|
36 | 34 | {
|
37 | 35 | for (int i = -5; i <= 256; i++) {
|
38 |
| - PyObject *small_int = PyLong_FromLong(i); |
39 |
| - assert(_Py_IsImmortal(small_int)); |
40 |
| - Py_ssize_t old_count = Py_REFCNT(small_int); |
41 |
| - for (int j = 0; j < 10000; j++) { |
42 |
| - Py_DECREF(small_int); |
43 |
| - } |
44 |
| - Py_ssize_t current_count = Py_REFCNT(small_int); |
45 |
| - assert(old_count == current_count); |
| 36 | + assert(verify_immortality(PyLong_FromLong(i))); |
46 | 37 | }
|
47 | 38 | Py_RETURN_NONE;
|
48 | 39 | }
|
49 | 40 |
|
50 | 41 | static PyObject *
|
51 | 42 | test_immortal_ellipsis(PyObject *self, PyObject *Py_UNUSED(ignored))
|
52 | 43 | {
|
53 |
| - assert(_Py_IsImmortal(Py_Ellipsis)); |
54 |
| - Py_ssize_t old_count = Py_REFCNT(Py_Ellipsis); |
55 |
| - for (int i = 0; i < 10000; i++) { |
56 |
| - Py_DECREF(Py_Ellipsis); |
57 |
| - } |
58 |
| - Py_ssize_t current_count = Py_REFCNT(Py_Ellipsis); |
59 |
| - assert(old_count == current_count); |
| 44 | + assert(verify_immortality(Py_Ellipsis)); |
60 | 45 | Py_RETURN_NONE;
|
61 | 46 | }
|
62 | 47 |
|
|
0 commit comments