From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Mon, 11 Aug 2025 14:07:19 +0000 (+0200) Subject: [3.14] gh-137200: support frame lineno setter with `BRANCH_LEFT` and `BRANCH_RIGHT... X-Git-Tag: v3.14.0rc2~15 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=019238ab18348710f7c6a7f835ee1d371e91fcc0;p=thirdparty%2FPython%2Fcpython.git [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> --- diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py index 263e4e6f3941..28895d16c570 100644 --- a/Lib/test/test_monitoring.py +++ b/Lib/test/test_monitoring.py @@ -3,6 +3,7 @@ import collections import dis import functools +import inspect import math import operator import sys @@ -1709,6 +1710,27 @@ class TestBranchAndJumpEvents(CheckEvents): ('branch right', 'func', 6, 8), ('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): diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 76b52efccf80..944e98e062d1 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -1671,6 +1671,8 @@ frame_lineno_set_impl(PyFrameObject *self, PyObject *value) case PY_MONITORING_EVENT_PY_RESUME: case PY_MONITORING_EVENT_JUMP: 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_PY_YIELD: /* Setting f_lineno is allowed for the above events */