1 #include "parts.h"
2
verify_immortality(PyObject * object)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
14 static PyObject *
test_immortal_builtins(PyObject * self,PyObject * Py_UNUSED (ignored))15 test_immortal_builtins(PyObject *self, PyObject *Py_UNUSED(ignored))
16 {
17 PyObject *objects[] = {Py_True, Py_False, Py_None, Py_Ellipsis};
18 Py_ssize_t n = Py_ARRAY_LENGTH(objects);
19 for (Py_ssize_t i = 0; i < n; i++) {
20 assert(verify_immortality(objects[i]));
21 }
22 Py_RETURN_NONE;
23 }
24
25 static PyObject *
test_immortal_small_ints(PyObject * self,PyObject * Py_UNUSED (ignored))26 test_immortal_small_ints(PyObject *self, PyObject *Py_UNUSED(ignored))
27 {
28 for (int i = -5; i <= 256; i++) {
29 assert(verify_immortality(PyLong_FromLong(i)));
30 }
31 Py_RETURN_NONE;
32 }
33
34 static PyMethodDef test_methods[] = {
35 {"test_immortal_builtins", test_immortal_builtins, METH_NOARGS},
36 {"test_immortal_small_ints", test_immortal_small_ints, METH_NOARGS},
37 {NULL},
38 };
39
40 int
_PyTestCapi_Init_Immortal(PyObject * mod)41 _PyTestCapi_Init_Immortal(PyObject *mod)
42 {
43 if (PyModule_AddFunctions(mod, test_methods) < 0) {
44 return -1;
45 }
46 return 0;
47 }
48