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 bf8b374

Browse filesBrowse files
authored
gh-111495: Add more tests on PyEval C APIs (#122789)
* Add Lib/test/test_capi/test_eval.py * Add Modules/_testlimitedcapi/eval.c
1 parent 81c739e commit bf8b374
Copy full SHA for bf8b374

File tree

Expand file treeCollapse file tree

9 files changed

+205
-65
lines changed
Filter options
Expand file treeCollapse file tree

9 files changed

+205
-65
lines changed

‎Lib/test/test_capi/test_eval.py

Copy file name to clipboard
+103Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import sys
2+
import unittest
3+
from test.support import import_helper
4+
5+
_testlimitedcapi = import_helper.import_module('_testlimitedcapi')
6+
7+
8+
class Tests(unittest.TestCase):
9+
def test_eval_get_func_name(self):
10+
eval_get_func_name = _testlimitedcapi.eval_get_func_name
11+
12+
def function_example(): ...
13+
14+
class A:
15+
def method_example(self): ...
16+
17+
self.assertEqual(eval_get_func_name(function_example),
18+
"function_example")
19+
self.assertEqual(eval_get_func_name(A.method_example),
20+
"method_example")
21+
self.assertEqual(eval_get_func_name(A().method_example),
22+
"method_example")
23+
self.assertEqual(eval_get_func_name(sum), "sum") # c function
24+
self.assertEqual(eval_get_func_name(A), "type")
25+
26+
def test_eval_get_func_desc(self):
27+
eval_get_func_desc = _testlimitedcapi.eval_get_func_desc
28+
29+
def function_example(): ...
30+
31+
class A:
32+
def method_example(self): ...
33+
34+
self.assertEqual(eval_get_func_desc(function_example),
35+
"()")
36+
self.assertEqual(eval_get_func_desc(A.method_example),
37+
"()")
38+
self.assertEqual(eval_get_func_desc(A().method_example),
39+
"()")
40+
self.assertEqual(eval_get_func_desc(sum), "()") # c function
41+
self.assertEqual(eval_get_func_desc(A), " object")
42+
43+
def test_eval_getlocals(self):
44+
# Test PyEval_GetLocals()
45+
x = 1
46+
self.assertEqual(_testlimitedcapi.eval_getlocals(),
47+
{'self': self,
48+
'x': 1})
49+
50+
y = 2
51+
self.assertEqual(_testlimitedcapi.eval_getlocals(),
52+
{'self': self,
53+
'x': 1,
54+
'y': 2})
55+
56+
def test_eval_getglobals(self):
57+
# Test PyEval_GetGlobals()
58+
self.assertEqual(_testlimitedcapi.eval_getglobals(),
59+
globals())
60+
61+
def test_eval_getbuiltins(self):
62+
# Test PyEval_GetBuiltins()
63+
self.assertEqual(_testlimitedcapi.eval_getbuiltins(),
64+
globals()['__builtins__'])
65+
66+
def test_eval_getframe(self):
67+
# Test PyEval_GetFrame()
68+
self.assertEqual(_testlimitedcapi.eval_getframe(),
69+
sys._getframe())
70+
71+
def test_eval_getframe_builtins(self):
72+
# Test PyEval_GetFrameBuiltins()
73+
self.assertEqual(_testlimitedcapi.eval_getframe_builtins(),
74+
sys._getframe().f_builtins)
75+
76+
def test_eval_getframe_globals(self):
77+
# Test PyEval_GetFrameGlobals()
78+
self.assertEqual(_testlimitedcapi.eval_getframe_globals(),
79+
sys._getframe().f_globals)
80+
81+
def test_eval_getframe_locals(self):
82+
# Test PyEval_GetFrameLocals()
83+
self.assertEqual(_testlimitedcapi.eval_getframe_locals(),
84+
sys._getframe().f_locals)
85+
86+
def test_eval_get_recursion_limit(self):
87+
# Test Py_GetRecursionLimit()
88+
self.assertEqual(_testlimitedcapi.eval_get_recursion_limit(),
89+
sys.getrecursionlimit())
90+
91+
def test_eval_set_recursion_limit(self):
92+
# Test Py_SetRecursionLimit()
93+
old_limit = sys.getrecursionlimit()
94+
try:
95+
limit = old_limit + 123
96+
_testlimitedcapi.eval_set_recursion_limit(limit)
97+
self.assertEqual(sys.getrecursionlimit(), limit)
98+
finally:
99+
sys.setrecursionlimit(old_limit)
100+
101+
102+
if __name__ == "__main__":
103+
unittest.main()

‎Lib/test/test_capi/test_misc.py

Copy file name to clipboardExpand all lines: Lib/test/test_capi/test_misc.py
-43Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -869,36 +869,6 @@ def __init__(self):
869869
_testcapi.clear_managed_dict(c)
870870
self.assertEqual(c.__dict__, {})
871871

872-
def test_eval_get_func_name(self):
873-
def function_example(): ...
874-
875-
class A:
876-
def method_example(self): ...
877-
878-
self.assertEqual(_testcapi.eval_get_func_name(function_example),
879-
"function_example")
880-
self.assertEqual(_testcapi.eval_get_func_name(A.method_example),
881-
"method_example")
882-
self.assertEqual(_testcapi.eval_get_func_name(A().method_example),
883-
"method_example")
884-
self.assertEqual(_testcapi.eval_get_func_name(sum), "sum") # c function
885-
self.assertEqual(_testcapi.eval_get_func_name(A), "type")
886-
887-
def test_eval_get_func_desc(self):
888-
def function_example(): ...
889-
890-
class A:
891-
def method_example(self): ...
892-
893-
self.assertEqual(_testcapi.eval_get_func_desc(function_example),
894-
"()")
895-
self.assertEqual(_testcapi.eval_get_func_desc(A.method_example),
896-
"()")
897-
self.assertEqual(_testcapi.eval_get_func_desc(A().method_example),
898-
"()")
899-
self.assertEqual(_testcapi.eval_get_func_desc(sum), "()") # c function
900-
self.assertEqual(_testcapi.eval_get_func_desc(A), " object")
901-
902872
def test_function_get_code(self):
903873
import types
904874

@@ -1157,19 +1127,6 @@ def genf(): yield
11571127
gen = genf()
11581128
self.assertEqual(_testcapi.gen_get_code(gen), gen.gi_code)
11591129

1160-
def test_pyeval_getlocals(self):
1161-
# Test PyEval_GetLocals()
1162-
x = 1
1163-
self.assertEqual(_testcapi.pyeval_getlocals(),
1164-
{'self': self,
1165-
'x': 1})
1166-
1167-
y = 2
1168-
self.assertEqual(_testcapi.pyeval_getlocals(),
1169-
{'self': self,
1170-
'x': 1,
1171-
'y': 2})
1172-
11731130

11741131
@requires_limited_api
11751132
class TestHeapTypeRelative(unittest.TestCase):

‎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
@@ -163,7 +163,7 @@
163163
@MODULE__TESTBUFFER_TRUE@_testbuffer _testbuffer.c
164164
@MODULE__TESTINTERNALCAPI_TRUE@_testinternalcapi _testinternalcapi.c _testinternalcapi/test_lock.c _testinternalcapi/pytime.c _testinternalcapi/set.c _testinternalcapi/test_critical_sections.c
165165
@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/heaptype.c _testcapi/abstract.c _testcapi/unicode.c _testcapi/dict.c _testcapi/set.c _testcapi/list.c _testcapi/tuple.c _testcapi/getargs.c _testcapi/datetime.c _testcapi/docstring.c _testcapi/mem.c _testcapi/watchers.c _testcapi/long.c _testcapi/float.c _testcapi/complex.c _testcapi/numbers.c _testcapi/structmember.c _testcapi/exceptions.c _testcapi/code.c _testcapi/buffer.c _testcapi/pyatomic.c _testcapi/run.c _testcapi/file.c _testcapi/codec.c _testcapi/immortal.c _testcapi/gc.c _testcapi/hash.c _testcapi/time.c _testcapi/bytes.c _testcapi/object.c _testcapi/monitoring.c
166-
@MODULE__TESTLIMITEDCAPI_TRUE@_testlimitedcapi _testlimitedcapi.c _testlimitedcapi/abstract.c _testlimitedcapi/bytearray.c _testlimitedcapi/bytes.c _testlimitedcapi/complex.c _testlimitedcapi/dict.c _testlimitedcapi/float.c _testlimitedcapi/heaptype_relative.c _testlimitedcapi/list.c _testlimitedcapi/long.c _testlimitedcapi/object.c _testlimitedcapi/pyos.c _testlimitedcapi/set.c _testlimitedcapi/sys.c _testlimitedcapi/unicode.c _testlimitedcapi/vectorcall_limited.c
166+
@MODULE__TESTLIMITEDCAPI_TRUE@_testlimitedcapi _testlimitedcapi.c _testlimitedcapi/abstract.c _testlimitedcapi/bytearray.c _testlimitedcapi/bytes.c _testlimitedcapi/complex.c _testlimitedcapi/dict.c _testlimitedcapi/eval.c _testlimitedcapi/float.c _testlimitedcapi/heaptype_relative.c _testlimitedcapi/list.c _testlimitedcapi/long.c _testlimitedcapi/object.c _testlimitedcapi/pyos.c _testlimitedcapi/set.c _testlimitedcapi/sys.c _testlimitedcapi/unicode.c _testlimitedcapi/vectorcall_limited.c
167167
@MODULE__TESTCLINIC_TRUE@_testclinic _testclinic.c
168168
@MODULE__TESTCLINIC_LIMITED_TRUE@_testclinic_limited _testclinic_limited.c
169169

‎Modules/_testcapimodule.c

Copy file name to clipboardExpand all lines: Modules/_testcapimodule.c
-21Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2655,18 +2655,6 @@ test_frame_getvarstring(PyObject *self, PyObject *args)
26552655
}
26562656

26572657

2658-
static PyObject *
2659-
eval_get_func_name(PyObject *self, PyObject *func)
2660-
{
2661-
return PyUnicode_FromString(PyEval_GetFuncName(func));
2662-
}
2663-
2664-
static PyObject *
2665-
eval_get_func_desc(PyObject *self, PyObject *func)
2666-
{
2667-
return PyUnicode_FromString(PyEval_GetFuncDesc(func));
2668-
}
2669-
26702658
static PyObject *
26712659
gen_get_code(PyObject *self, PyObject *gen)
26722660
{
@@ -3341,12 +3329,6 @@ test_critical_sections(PyObject *module, PyObject *Py_UNUSED(args))
33413329
Py_RETURN_NONE;
33423330
}
33433331

3344-
static PyObject *
3345-
pyeval_getlocals(PyObject *module, PyObject *Py_UNUSED(args))
3346-
{
3347-
return Py_XNewRef(PyEval_GetLocals());
3348-
}
3349-
33503332
static PyMethodDef TestMethods[] = {
33513333
{"set_errno", set_errno, METH_VARARGS},
33523334
{"test_config", test_config, METH_NOARGS},
@@ -3467,8 +3449,6 @@ static PyMethodDef TestMethods[] = {
34673449
{"frame_new", frame_new, METH_VARARGS, NULL},
34683450
{"frame_getvar", test_frame_getvar, METH_VARARGS, NULL},
34693451
{"frame_getvarstring", test_frame_getvarstring, METH_VARARGS, NULL},
3470-
{"eval_get_func_name", eval_get_func_name, METH_O, NULL},
3471-
{"eval_get_func_desc", eval_get_func_desc, METH_O, NULL},
34723452
{"gen_get_code", gen_get_code, METH_O, NULL},
34733453
{"get_feature_macros", get_feature_macros, METH_NOARGS, NULL},
34743454
{"test_code_api", test_code_api, METH_NOARGS, NULL},
@@ -3489,7 +3469,6 @@ static PyMethodDef TestMethods[] = {
34893469
{"test_weakref_capi", test_weakref_capi, METH_NOARGS},
34903470
{"function_set_warning", function_set_warning, METH_NOARGS},
34913471
{"test_critical_sections", test_critical_sections, METH_NOARGS},
3492-
{"pyeval_getlocals", pyeval_getlocals, METH_NOARGS},
34933472
{NULL, NULL} /* sentinel */
34943473
};
34953474

‎Modules/_testlimitedcapi.c

Copy file name to clipboardExpand all lines: Modules/_testlimitedcapi.c
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ PyInit__testlimitedcapi(void)
4444
if (_PyTestLimitedCAPI_Init_Dict(mod) < 0) {
4545
return NULL;
4646
}
47+
if (_PyTestLimitedCAPI_Init_Eval(mod) < 0) {
48+
return NULL;
49+
}
4750
if (_PyTestLimitedCAPI_Init_Float(mod) < 0) {
4851
return NULL;
4952
}

‎Modules/_testlimitedcapi/eval.c

Copy file name to clipboard
+95Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
#include "parts.h"
2+
#include "util.h"
3+
4+
static PyObject *
5+
eval_get_func_name(PyObject *self, PyObject *func)
6+
{
7+
return PyUnicode_FromString(PyEval_GetFuncName(func));
8+
}
9+
10+
static PyObject *
11+
eval_get_func_desc(PyObject *self, PyObject *func)
12+
{
13+
return PyUnicode_FromString(PyEval_GetFuncDesc(func));
14+
}
15+
16+
static PyObject *
17+
eval_getlocals(PyObject *module, PyObject *Py_UNUSED(args))
18+
{
19+
return Py_XNewRef(PyEval_GetLocals());
20+
}
21+
22+
static PyObject *
23+
eval_getglobals(PyObject *module, PyObject *Py_UNUSED(args))
24+
{
25+
return Py_XNewRef(PyEval_GetGlobals());
26+
}
27+
28+
static PyObject *
29+
eval_getbuiltins(PyObject *module, PyObject *Py_UNUSED(args))
30+
{
31+
return Py_XNewRef(PyEval_GetBuiltins());
32+
}
33+
34+
static PyObject *
35+
eval_getframe(PyObject *module, PyObject *Py_UNUSED(args))
36+
{
37+
return Py_XNewRef(PyEval_GetFrame());
38+
}
39+
40+
static PyObject *
41+
eval_getframe_builtins(PyObject *module, PyObject *Py_UNUSED(args))
42+
{
43+
return Py_XNewRef(PyEval_GetFrameBuiltins());
44+
}
45+
46+
static PyObject *
47+
eval_getframe_globals(PyObject *module, PyObject *Py_UNUSED(args))
48+
{
49+
return Py_XNewRef(PyEval_GetFrameGlobals());
50+
}
51+
52+
static PyObject *
53+
eval_getframe_locals(PyObject *module, PyObject *Py_UNUSED(args))
54+
{
55+
return Py_XNewRef(PyEval_GetFrameLocals());
56+
}
57+
58+
static PyObject *
59+
eval_get_recursion_limit(PyObject *module, PyObject *Py_UNUSED(args))
60+
{
61+
int limit = Py_GetRecursionLimit();
62+
return PyLong_FromLong(limit);
63+
}
64+
65+
static PyObject *
66+
eval_set_recursion_limit(PyObject *module, PyObject *args)
67+
{
68+
int limit;
69+
if (!PyArg_ParseTuple(args, "i", &limit)) {
70+
return NULL;
71+
}
72+
Py_SetRecursionLimit(limit);
73+
Py_RETURN_NONE;
74+
}
75+
76+
static PyMethodDef test_methods[] = {
77+
{"eval_get_func_name", eval_get_func_name, METH_O, NULL},
78+
{"eval_get_func_desc", eval_get_func_desc, METH_O, NULL},
79+
{"eval_getlocals", eval_getlocals, METH_NOARGS},
80+
{"eval_getglobals", eval_getglobals, METH_NOARGS},
81+
{"eval_getbuiltins", eval_getbuiltins, METH_NOARGS},
82+
{"eval_getframe", eval_getframe, METH_NOARGS},
83+
{"eval_getframe_builtins", eval_getframe_builtins, METH_NOARGS},
84+
{"eval_getframe_globals", eval_getframe_globals, METH_NOARGS},
85+
{"eval_getframe_locals", eval_getframe_locals, METH_NOARGS},
86+
{"eval_get_recursion_limit", eval_get_recursion_limit, METH_NOARGS},
87+
{"eval_set_recursion_limit", eval_set_recursion_limit, METH_VARARGS},
88+
{NULL},
89+
};
90+
91+
int
92+
_PyTestLimitedCAPI_Init_Eval(PyObject *m)
93+
{
94+
return PyModule_AddFunctions(m, test_methods);
95+
}

‎Modules/_testlimitedcapi/parts.h

Copy file name to clipboardExpand all lines: Modules/_testlimitedcapi/parts.h
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ int _PyTestLimitedCAPI_Init_ByteArray(PyObject *module);
2727
int _PyTestLimitedCAPI_Init_Bytes(PyObject *module);
2828
int _PyTestLimitedCAPI_Init_Complex(PyObject *module);
2929
int _PyTestLimitedCAPI_Init_Dict(PyObject *module);
30+
int _PyTestLimitedCAPI_Init_Eval(PyObject *module);
3031
int _PyTestLimitedCAPI_Init_Float(PyObject *module);
3132
int _PyTestLimitedCAPI_Init_HeaptypeRelative(PyObject *module);
3233
int _PyTestLimitedCAPI_Init_Object(PyObject *module);

‎PCbuild/_testlimitedcapi.vcxproj

Copy file name to clipboardExpand all lines: PCbuild/_testlimitedcapi.vcxproj
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
<ClCompile Include="..\Modules\_testlimitedcapi\bytes.c" />
100100
<ClCompile Include="..\Modules\_testlimitedcapi\complex.c" />
101101
<ClCompile Include="..\Modules\_testlimitedcapi\dict.c" />
102+
<ClCompile Include="..\Modules\_testlimitedcapi\eval.c" />
102103
<ClCompile Include="..\Modules\_testlimitedcapi\float.c" />
103104
<ClCompile Include="..\Modules\_testlimitedcapi\heaptype_relative.c" />
104105
<ClCompile Include="..\Modules\_testlimitedcapi\list.c" />

‎PCbuild/_testlimitedcapi.vcxproj.filters

Copy file name to clipboardExpand all lines: PCbuild/_testlimitedcapi.vcxproj.filters
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<ClCompile Include="..\Modules\_testlimitedcapi\bytes.c" />
1515
<ClCompile Include="..\Modules\_testlimitedcapi\complex.c" />
1616
<ClCompile Include="..\Modules\_testlimitedcapi\dict.c" />
17+
<ClCompile Include="..\Modules\_testlimitedcapi\eval.c" />
1718
<ClCompile Include="..\Modules\_testlimitedcapi\float.c" />
1819
<ClCompile Include="..\Modules\_testlimitedcapi\heaptype_relative.c" />
1920
<ClCompile Include="..\Modules\_testlimitedcapi\list.c" />

0 commit comments

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