Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

gh-84436 Add integration C API tests for immortal objects #103962

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
May 2, 2023
Prev Previous commit
Next Next commit
Address code review
  • Loading branch information
corona10 committed May 2, 2023
commit e0295b5fcefe8f787bb6cd0e36a58a83e72b8ae7
45 changes: 15 additions & 30 deletions 45 Modules/_testcapi/immortal.c
Original file line number Diff line number Diff line change
@@ -1,62 +1,47 @@
#include "parts.h"

int verify_immortality(PyObject *object)
{
assert(_Py_IsImmortal(object));
Py_ssize_t old_count = Py_REFCNT(object);
for (int j = 0; j < 10000; j++) {
Py_DECREF(object);
}
Py_ssize_t current_count = Py_REFCNT(object);
return old_count == current_count;
}

static PyObject *
test_immortal_bool(PyObject *self, PyObject *Py_UNUSED(ignored))
{
PyObject *objects[] = {Py_True, Py_False};
Py_ssize_t n = Py_ARRAY_LENGTH(objects);
for (Py_ssize_t i = 0; i < n; i++) {
PyObject* obj = objects[i];
assert(_Py_IsImmortal(obj));
Py_ssize_t old_count = Py_REFCNT(obj);
for (int j = 0; j < 10000; j++) {
Py_DECREF(obj);
}
Py_ssize_t current_count = Py_REFCNT(obj);
assert(old_count == current_count);
assert(verify_immortality(objects[i]));
}
Py_RETURN_NONE;
}

static PyObject *
test_immortal_none(PyObject *self, PyObject *Py_UNUSED(ignored))
{
assert(_Py_IsImmortal(Py_None));
Py_ssize_t old_count = Py_REFCNT(Py_None);
for (int i = 0; i < 10000; i++) {
Py_DECREF(Py_None);
}
Py_ssize_t current_count = Py_REFCNT(Py_None);
assert(old_count == current_count);
assert(verify_immortality(Py_None));
Py_RETURN_NONE;
}

static PyObject *
test_immortal_small_ints(PyObject *self, PyObject *Py_UNUSED(ignored))
{
for (int i = -5; i <= 256; i++) {
PyObject *small_int = PyLong_FromLong(i);
assert(_Py_IsImmortal(small_int));
Py_ssize_t old_count = Py_REFCNT(small_int);
for (int j = 0; j < 10000; j++) {
Py_DECREF(small_int);
}
Py_ssize_t current_count = Py_REFCNT(small_int);
assert(old_count == current_count);
assert(verify_immortality(PyLong_FromLong(i)));
}
Py_RETURN_NONE;
}

static PyObject *
test_immortal_ellipsis(PyObject *self, PyObject *Py_UNUSED(ignored))
{
assert(_Py_IsImmortal(Py_Ellipsis));
Py_ssize_t old_count = Py_REFCNT(Py_Ellipsis);
for (int i = 0; i < 10000; i++) {
Py_DECREF(Py_Ellipsis);
}
Py_ssize_t current_count = Py_REFCNT(Py_Ellipsis);
assert(old_count == current_count);
assert(verify_immortality(Py_Ellipsis));
Py_RETURN_NONE;
}

Expand Down
Morty Proxy This is a proxified and sanitized view of the page, visit original site.