mirror of
https://github.com/python/cpython.git
synced 2025-08-30 21:48:47 +00:00
gh-98442: fix locations of with statement's cleanup instructions (#120763)
gh-98442: fix location of with statement's cleanup instructions
This commit is contained in:
parent
8bc76ae45f
commit
55596ae044
3 changed files with 38 additions and 1 deletions
|
@ -2055,6 +2055,39 @@ class TestSourcePositions(unittest.TestCase):
|
|||
self.assertGreaterEqual(end_col, start_col)
|
||||
self.assertLessEqual(end_col, code_end)
|
||||
|
||||
def test_return_in_with_positions(self):
|
||||
# See gh-98442
|
||||
def f():
|
||||
with xyz:
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
return R
|
||||
|
||||
# All instructions should have locations on a single line
|
||||
for instr in dis.get_instructions(f):
|
||||
start_line, end_line, _, _ = instr.positions
|
||||
self.assertEqual(start_line, end_line)
|
||||
|
||||
# Expect three load None instructions for the no-exception __exit__ call,
|
||||
# and one RETURN_VALUE.
|
||||
# They should all have the locations of the context manager ('xyz').
|
||||
|
||||
load_none = [instr for instr in dis.get_instructions(f) if
|
||||
instr.opname == 'LOAD_CONST' and instr.argval is None]
|
||||
return_value = [instr for instr in dis.get_instructions(f) if
|
||||
instr.opname == 'RETURN_VALUE']
|
||||
|
||||
self.assertEqual(len(load_none), 3)
|
||||
self.assertEqual(len(return_value), 1)
|
||||
for instr in load_none + return_value:
|
||||
start_line, end_line, start_col, end_col = instr.positions
|
||||
self.assertEqual(start_line, f.__code__.co_firstlineno + 1)
|
||||
self.assertEqual(end_line, f.__code__.co_firstlineno + 1)
|
||||
self.assertEqual(start_col, 17)
|
||||
self.assertEqual(end_col, 20)
|
||||
|
||||
|
||||
class TestExpectedAttributes(unittest.TestCase):
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue