https://github.com/python/cpython/commit/d62cbba235df1199b8b2556d2016d37522608973
commit: d62cbba235df1199b8b2556d2016d37522608973
branch: 3.12
author: Jelle Zijlstra <[email protected]>
committer: JelleZijlstra <[email protected]>
date: 2024-06-19T13:19:39Z
summary:
[3.12] gh-120722: Set position on RETURN_VALUE in lambda (GH-120724) (#120739)
(cherry picked from commit d8f27cb1141fd3575de816438ed80a916c0560ed)
files:
A Misc/NEWS.d/next/Core and
Builtins/2024-06-18-22-41-05.gh-issue-120722.rS7tkE.rst
M Lib/test/test_compile.py
M Python/compile.c
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index 6ed7fe2b06597c..4fd71c0c1630dc 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -10,7 +10,7 @@
import textwrap
import warnings
from test import support
-from test.support import (script_helper, requires_debug_ranges,
+from test.support import (script_helper, requires_debug_ranges, run_code,
requires_specialization, C_RECURSION_LIMIT)
from test.support.os_helper import FakePath
@@ -1829,6 +1829,33 @@ def test_load_super_attr(self):
code, "LOAD_GLOBAL", line=3, end_line=3, column=4, end_column=9
)
+ def test_lambda_return_position(self):
+ snippets = [
+ "f = lambda: x",
+ "f = lambda: 42",
+ "f = lambda: 1 + 2",
+ "f = lambda: a + b",
+ ]
+ for snippet in snippets:
+ with self.subTest(snippet=snippet):
+ lamb = run_code(snippet)["f"]
+ positions = lamb.__code__.co_positions()
+ # assert that all positions are within the lambda
+ for i, pos in enumerate(positions):
+ with self.subTest(i=i, pos=pos):
+ start_line, end_line, start_col, end_col = pos
+ if i == 0 and start_col == end_col == 0:
+ # ignore the RESUME in the beginning
+ continue
+ self.assertEqual(start_line, 1)
+ self.assertEqual(end_line, 1)
+ code_start = snippet.find(":") + 2
+ code_end = len(snippet)
+ self.assertGreaterEqual(start_col, code_start)
+ self.assertLessEqual(end_col, code_end)
+ self.assertGreaterEqual(end_col, start_col)
+ self.assertLessEqual(end_col, code_end)
+
class TestExpressionStackSize(unittest.TestCase):
# These tests check that the computed stack size for a code object
diff --git a/Misc/NEWS.d/next/Core and
Builtins/2024-06-18-22-41-05.gh-issue-120722.rS7tkE.rst b/Misc/NEWS.d/next/Core
and Builtins/2024-06-18-22-41-05.gh-issue-120722.rS7tkE.rst
new file mode 100644
index 00000000000000..df83e69c601a32
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and
Builtins/2024-06-18-22-41-05.gh-issue-120722.rS7tkE.rst
@@ -0,0 +1,2 @@
+Correctly set the bytecode position on return instructions within lambdas.
+Patch by Jelle Zijlstra.
diff --git a/Python/compile.c b/Python/compile.c
index 5e96a9665618e5..bd1650e2337866 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -2966,7 +2966,7 @@ compiler_lambda(struct compiler *c, expr_ty e)
co = optimize_and_assemble(c, 0);
}
else {
- location loc = LOCATION(e->lineno, e->lineno, 0, 0);
+ location loc = LOC(e->v.Lambda.body);
ADDOP_IN_SCOPE(c, loc, RETURN_VALUE);
co = optimize_and_assemble(c, 1);
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]