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

Commit d81ca7e

Browse filesBrowse files
authored
gh-84436: Add integration C API tests for immortal objects (gh-103962)
1 parent 87223f3 commit d81ca7e
Copy full SHA for d81ca7e

File tree

6 files changed

+69
-1
lines changed
Filter options

6 files changed

+69
-1
lines changed

‎Lib/test/test_capi/test_immortal.py

Copy file name to clipboard
+16Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import unittest
2+
from test.support import import_helper
3+
4+
_testcapi = import_helper.import_module('_testcapi')
5+
6+
7+
class TestCAPI(unittest.TestCase):
8+
def test_immortal_builtins(self):
9+
_testcapi.test_immortal_builtins()
10+
11+
def test_immortal_small_ints(self):
12+
_testcapi.test_immortal_small_ints()
13+
14+
15+
if __name__ == "__main__":
16+
unittest.main()

‎Modules/Setup.stdlib.in

Copy file name to clipboardExpand all lines: Modules/Setup.stdlib.in
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@
169169
@MODULE__XXTESTFUZZ_TRUE@_xxtestfuzz _xxtestfuzz/_xxtestfuzz.c _xxtestfuzz/fuzzer.c
170170
@MODULE__TESTBUFFER_TRUE@_testbuffer _testbuffer.c
171171
@MODULE__TESTINTERNALCAPI_TRUE@_testinternalcapi _testinternalcapi.c
172-
@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/unicode.c _testcapi/getargs.c _testcapi/pytime.c _testcapi/datetime.c _testcapi/docstring.c _testcapi/mem.c _testcapi/watchers.c _testcapi/long.c _testcapi/float.c _testcapi/structmember.c _testcapi/exceptions.c _testcapi/code.c _testcapi/pyos.c
172+
@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/unicode.c _testcapi/getargs.c _testcapi/pytime.c _testcapi/datetime.c _testcapi/docstring.c _testcapi/mem.c _testcapi/watchers.c _testcapi/long.c _testcapi/float.c _testcapi/structmember.c _testcapi/exceptions.c _testcapi/code.c _testcapi/pyos.c _testcapi/immortal.c
173173
@MODULE__TESTCLINIC_TRUE@_testclinic _testclinic.c
174174

175175
# Some testing modules MUST be built as shared libraries.

‎Modules/_testcapi/immortal.c

Copy file name to clipboard
+47Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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+
}

‎Modules/_testcapi/parts.h

Copy file name to clipboardExpand all lines: Modules/_testcapi/parts.h
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ int _PyTestCapi_Init_Structmember(PyObject *module);
3939
int _PyTestCapi_Init_Exceptions(PyObject *module);
4040
int _PyTestCapi_Init_Code(PyObject *module);
4141
int _PyTestCapi_Init_PyOS(PyObject *module);
42+
int _PyTestCapi_Init_Immortal(PyObject *module);
4243

4344
#ifdef LIMITED_API_AVAILABLE
4445
int _PyTestCapi_Init_VectorcallLimited(PyObject *module);

‎Modules/_testcapimodule.c

Copy file name to clipboardExpand all lines: Modules/_testcapimodule.c
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4313,6 +4313,9 @@ PyInit__testcapi(void)
43134313
if (_PyTestCapi_Init_PyOS(m) < 0) {
43144314
return NULL;
43154315
}
4316+
if (_PyTestCapi_Init_Immortal(m) < 0) {
4317+
return NULL;
4318+
}
43164319

43174320
#ifndef LIMITED_API_AVAILABLE
43184321
PyModule_AddObjectRef(m, "LIMITED_API_AVAILABLE", Py_False);

‎PCbuild/_testcapi.vcxproj

Copy file name to clipboardExpand all lines: PCbuild/_testcapi.vcxproj
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
<ClCompile Include="..\Modules\_testcapi\exceptions.c" />
111111
<ClCompile Include="..\Modules\_testcapi\code.c" />
112112
<ClCompile Include="..\Modules\_testcapi\pyos.c" />
113+
<ClCompile Include="..\Modules\_testcapi\immortal.c" />
113114
</ItemGroup>
114115
<ItemGroup>
115116
<ResourceCompile Include="..\PC\python_nt.rc" />

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.