Skip to content

Commit 39eaca8

Browse files
[3.11] gh-94808: Cover PyFunction_GetCode, PyFunction_GetGlobals,… (#98317)
[3.11] gh-94808: Cover `PyFunction_GetCode`, `PyFunction_GetGlobals`, `PyFunction_GetModule` (GH-98158). (cherry picked from commit 7b48d02) Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
1 parent 75357cd commit 39eaca8

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

Lib/test/test_capi.py

+35
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,41 @@ def method_example(self): ...
739739
self.assertEqual(_testcapi.eval_get_func_name(sum), "sum") # c function
740740
self.assertEqual(_testcapi.eval_get_func_name(A), "type")
741741

742+
def test_function_get_code(self):
743+
import types
744+
745+
def some():
746+
pass
747+
748+
code = _testcapi.function_get_code(some)
749+
self.assertIsInstance(code, types.CodeType)
750+
self.assertEqual(code, some.__code__)
751+
752+
with self.assertRaises(SystemError):
753+
_testcapi.function_get_code(None) # not a function
754+
755+
def test_function_get_globals(self):
756+
def some():
757+
pass
758+
759+
globals_ = _testcapi.function_get_globals(some)
760+
self.assertIsInstance(globals_, dict)
761+
self.assertEqual(globals_, some.__globals__)
762+
763+
with self.assertRaises(SystemError):
764+
_testcapi.function_get_globals(None) # not a function
765+
766+
def test_function_get_module(self):
767+
def some():
768+
pass
769+
770+
module = _testcapi.function_get_module(some)
771+
self.assertIsInstance(module, str)
772+
self.assertEqual(module, some.__module__)
773+
774+
with self.assertRaises(SystemError):
775+
_testcapi.function_get_module(None) # not a function
776+
742777

743778
class TestPendingCalls(unittest.TestCase):
744779

Modules/_testcapimodule.c

+40
Original file line numberDiff line numberDiff line change
@@ -6081,6 +6081,43 @@ settrace_to_record(PyObject *self, PyObject *list)
60816081
}
60826082

60836083
static PyObject *negative_dictoffset(PyObject *, PyObject *);
6084+
6085+
static PyObject *
6086+
function_get_code(PyObject *self, PyObject *func)
6087+
{
6088+
PyObject *code = PyFunction_GetCode(func);
6089+
if (code != NULL) {
6090+
Py_INCREF(code);
6091+
return code;
6092+
} else {
6093+
return NULL;
6094+
}
6095+
}
6096+
6097+
static PyObject *
6098+
function_get_globals(PyObject *self, PyObject *func)
6099+
{
6100+
PyObject *globals = PyFunction_GetGlobals(func);
6101+
if (globals != NULL) {
6102+
Py_INCREF(globals);
6103+
return globals;
6104+
} else {
6105+
return NULL;
6106+
}
6107+
}
6108+
6109+
static PyObject *
6110+
function_get_module(PyObject *self, PyObject *func)
6111+
{
6112+
PyObject *module = PyFunction_GetModule(func);
6113+
if (module != NULL) {
6114+
Py_INCREF(module);
6115+
return module;
6116+
} else {
6117+
return NULL;
6118+
}
6119+
}
6120+
60846121
static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
60856122
static PyObject *getargs_s_hash_int(PyObject *, PyObject *, PyObject*);
60866123
static PyObject *getargs_s_hash_int2(PyObject *, PyObject *, PyObject*);
@@ -6382,6 +6419,9 @@ static PyMethodDef TestMethods[] = {
63826419
{"get_feature_macros", get_feature_macros, METH_NOARGS, NULL},
63836420
{"test_code_api", test_code_api, METH_NOARGS, NULL},
63846421
{"settrace_to_record", settrace_to_record, METH_O, NULL},
6422+
{"function_get_code", function_get_code, METH_O, NULL},
6423+
{"function_get_globals", function_get_globals, METH_O, NULL},
6424+
{"function_get_module", function_get_module, METH_O, NULL},
63856425
{NULL, NULL} /* sentinel */
63866426
};
63876427

0 commit comments

Comments
 (0)