mirror of
https://github.com/python/cpython.git
synced 2025-12-31 04:23:37 +00:00
[3.14] gh-137200: support frame lineno setter with BRANCH_LEFT and BRANCH_RIGHT events (GH-137229) (#137280)
Co-authored-by: Xuanteng Huang <44627253+xuantengh@users.noreply.github.com>
This commit is contained in:
parent
1bf7462e34
commit
019238ab18
2 changed files with 24 additions and 0 deletions
|
|
@ -3,6 +3,7 @@
|
||||||
import collections
|
import collections
|
||||||
import dis
|
import dis
|
||||||
import functools
|
import functools
|
||||||
|
import inspect
|
||||||
import math
|
import math
|
||||||
import operator
|
import operator
|
||||||
import sys
|
import sys
|
||||||
|
|
@ -1709,6 +1710,27 @@ def func(v=1):
|
||||||
('branch right', 'func', 6, 8),
|
('branch right', 'func', 6, 8),
|
||||||
('branch right', 'func', 2, 10)])
|
('branch right', 'func', 2, 10)])
|
||||||
|
|
||||||
|
def test_callback_set_frame_lineno(self):
|
||||||
|
def func(s: str) -> int:
|
||||||
|
if s.startswith("t"):
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def callback(code, from_, to):
|
||||||
|
# try set frame.f_lineno
|
||||||
|
frame = inspect.currentframe()
|
||||||
|
while frame and frame.f_code is not code:
|
||||||
|
frame = frame.f_back
|
||||||
|
|
||||||
|
self.assertIsNotNone(frame)
|
||||||
|
frame.f_lineno = frame.f_lineno + 1 # run next instruction
|
||||||
|
|
||||||
|
sys.monitoring.set_local_events(TEST_TOOL, func.__code__, E.BRANCH_LEFT)
|
||||||
|
sys.monitoring.register_callback(TEST_TOOL, E.BRANCH_LEFT, callback)
|
||||||
|
|
||||||
|
self.assertEqual(func("true"), 1)
|
||||||
|
|
||||||
|
|
||||||
class TestBranchConsistency(MonitoringTestBase, unittest.TestCase):
|
class TestBranchConsistency(MonitoringTestBase, unittest.TestCase):
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1671,6 +1671,8 @@ frame_lineno_set_impl(PyFrameObject *self, PyObject *value)
|
||||||
case PY_MONITORING_EVENT_PY_RESUME:
|
case PY_MONITORING_EVENT_PY_RESUME:
|
||||||
case PY_MONITORING_EVENT_JUMP:
|
case PY_MONITORING_EVENT_JUMP:
|
||||||
case PY_MONITORING_EVENT_BRANCH:
|
case PY_MONITORING_EVENT_BRANCH:
|
||||||
|
case PY_MONITORING_EVENT_BRANCH_LEFT:
|
||||||
|
case PY_MONITORING_EVENT_BRANCH_RIGHT:
|
||||||
case PY_MONITORING_EVENT_LINE:
|
case PY_MONITORING_EVENT_LINE:
|
||||||
case PY_MONITORING_EVENT_PY_YIELD:
|
case PY_MONITORING_EVENT_PY_YIELD:
|
||||||
/* Setting f_lineno is allowed for the above events */
|
/* Setting f_lineno is allowed for the above events */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue