• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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