Skip to content

Commit 044a593

Browse files
authored
gh-91348: Restore frame argument to sys._getframe audit event (GH-94928)
1 parent 5c19dda commit 044a593

File tree

4 files changed

+31
-6
lines changed

4 files changed

+31
-6
lines changed

Doc/library/sys.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -774,7 +774,7 @@ always available.
774774
that is deeper than the call stack, :exc:`ValueError` is raised. The default
775775
for *depth* is zero, returning the frame at the top of the call stack.
776776

777-
.. audit-event:: sys._getframe "" sys._getframe
777+
.. audit-event:: sys._getframe frame sys._getframe
778778

779779
.. impl-detail::
780780

Lib/test/audit-tests.py

+11
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,17 @@ def hook(event, *args):
408408
raise RuntimeError("Expected sqlite3.load_extension to fail")
409409

410410

411+
def test_sys_getframe():
412+
import sys
413+
414+
def hook(event, args):
415+
if event.startswith("sys."):
416+
print(event, args[0].f_code.co_name)
417+
418+
sys.addaudithook(hook)
419+
sys._getframe()
420+
421+
411422
if __name__ == "__main__":
412423
from test.support import suppress_msvcrt_asserts
413424

Lib/test/test_audit.py

+12
Original file line numberDiff line numberDiff line change
@@ -176,5 +176,17 @@ def test_sqlite3(self):
176176
self.assertEqual(actual, expected)
177177

178178

179+
def test_sys_getframe(self):
180+
returncode, events, stderr = self.run_python("test_sys_getframe")
181+
if returncode:
182+
self.fail(stderr)
183+
184+
if support.verbose:
185+
print(*events, sep='\n')
186+
actual = [(ev[0], ev[2]) for ev in events]
187+
expected = [("sys._getframe", "test_sys_getframe")]
188+
189+
self.assertEqual(actual, expected)
190+
179191
if __name__ == "__main__":
180192
unittest.main()

Python/sysmodule.c

+7-5
Original file line numberDiff line numberDiff line change
@@ -1772,10 +1772,6 @@ sys__getframe_impl(PyObject *module, int depth)
17721772
PyThreadState *tstate = _PyThreadState_GET();
17731773
_PyInterpreterFrame *frame = tstate->cframe->current_frame;
17741774

1775-
if (_PySys_Audit(tstate, "sys._getframe", NULL) < 0) {
1776-
return NULL;
1777-
}
1778-
17791775
if (frame != NULL) {
17801776
while (depth > 0) {
17811777
frame = frame->previous;
@@ -1793,7 +1789,13 @@ sys__getframe_impl(PyObject *module, int depth)
17931789
"call stack is not deep enough");
17941790
return NULL;
17951791
}
1796-
return _Py_XNewRef((PyObject *)_PyFrame_GetFrameObject(frame));
1792+
1793+
PyObject *pyFrame = Py_XNewRef((PyObject *)_PyFrame_GetFrameObject(frame));
1794+
if (pyFrame && _PySys_Audit(tstate, "sys._getframe", "(O)", pyFrame) < 0) {
1795+
Py_DECREF(pyFrame);
1796+
return NULL;
1797+
}
1798+
return pyFrame;
17971799
}
17981800

17991801
/*[clinic input]

0 commit comments

Comments
 (0)