(root)/
Python-3.12.0/
Modules/
_testcapi/
immortal.c
       1  #include "parts.h"
       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  
      14  static PyObject *
      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 *
      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
      41  _PyTestCapi_Init_Immortal(PyObject *mod)
      42  {
      43      if (PyModule_AddFunctions(mod, test_methods) < 0) {
      44          return -1;
      45      }
      46      return 0;
      47  }