[3.12] gh-120722: Set position on RETURN_VALUE in lambda (GH-120724) (#120739)

(cherry picked from commit d8f27cb114)
This commit is contained in:
Jelle Zijlstra 2024-06-19 06:19:39 -07:00 committed by GitHub
parent cde976d85c
commit d62cbba235
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 31 additions and 2 deletions

View file

@ -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

View file

@ -0,0 +1,2 @@
Correctly set the bytecode position on return instructions within lambdas.
Patch by Jelle Zijlstra.

View file

@ -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);
}