mirror of https://github.com/python/cpython
[3.13] gh-122728: Fix SystemError in PyEval_GetLocals() (GH-122735) (#122757)
gh-122728: Fix SystemError in PyEval_GetLocals() (GH-122735)
Fix PyEval_GetLocals() to avoid SystemError ("bad argument to
internal function"). Don't redefine the 'ret' variable in the if
block.
Add an unit test on PyEval_GetLocals().
(cherry picked from commit 4767a6e31c
)
Co-authored-by: Victor Stinner <vstinner@python.org>
This commit is contained in:
parent
e808146af1
commit
5c161cb832
|
@ -1180,6 +1180,19 @@ class CAPITest(unittest.TestCase):
|
|||
gen = genf()
|
||||
self.assertEqual(_testcapi.gen_get_code(gen), gen.gi_code)
|
||||
|
||||
def test_pyeval_getlocals(self):
|
||||
# Test PyEval_GetLocals()
|
||||
x = 1
|
||||
self.assertEqual(_testcapi.pyeval_getlocals(),
|
||||
{'self': self,
|
||||
'x': 1})
|
||||
|
||||
y = 2
|
||||
self.assertEqual(_testcapi.pyeval_getlocals(),
|
||||
{'self': self,
|
||||
'x': 1,
|
||||
'y': 2})
|
||||
|
||||
|
||||
@requires_limited_api
|
||||
class TestHeapTypeRelative(unittest.TestCase):
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix :c:func:`PyEval_GetLocals` to avoid :exc:`SystemError` ("bad argument to
|
||||
internal function"). Patch by Victor Stinner.
|
|
@ -3332,6 +3332,12 @@ test_critical_sections(PyObject *module, PyObject *Py_UNUSED(args))
|
|||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
pyeval_getlocals(PyObject *module, PyObject *Py_UNUSED(args))
|
||||
{
|
||||
return Py_XNewRef(PyEval_GetLocals());
|
||||
}
|
||||
|
||||
static PyMethodDef TestMethods[] = {
|
||||
{"set_errno", set_errno, METH_VARARGS},
|
||||
{"test_config", test_config, METH_NOARGS},
|
||||
|
@ -3476,6 +3482,7 @@ static PyMethodDef TestMethods[] = {
|
|||
{"test_weakref_capi", test_weakref_capi, METH_NOARGS},
|
||||
{"function_set_warning", function_set_warning, METH_NOARGS},
|
||||
{"test_critical_sections", test_critical_sections, METH_NOARGS},
|
||||
{"pyeval_getlocals", pyeval_getlocals, METH_NOARGS},
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
|
|
|
@ -2482,7 +2482,7 @@ PyEval_GetLocals(void)
|
|||
PyFrameObject *f = _PyFrame_GetFrameObject(current_frame);
|
||||
PyObject *ret = f->f_locals_cache;
|
||||
if (ret == NULL) {
|
||||
PyObject *ret = PyDict_New();
|
||||
ret = PyDict_New();
|
||||
if (ret == NULL) {
|
||||
Py_DECREF(locals);
|
||||
return NULL;
|
||||
|
|
Loading…
Reference in New Issue