mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
[3.9] gh-92311: Let frame_setlineno jump over listcomps (#92740)
This commit is contained in:
parent
f6bd1bd19a
commit
801f77119d
3 changed files with 53 additions and 1 deletions
|
@ -1603,6 +1603,54 @@ output.append(4)
|
|||
next(gen())
|
||||
output.append(5)
|
||||
|
||||
@jump_test(2, 3, [1, 3])
|
||||
def test_jump_forward_over_listcomp(output):
|
||||
output.append(1)
|
||||
x = [i for i in range(10)]
|
||||
output.append(3)
|
||||
|
||||
# checking for segfaults.
|
||||
# See https://github.com/python/cpython/issues/92311
|
||||
@jump_test(3, 1, [])
|
||||
def test_jump_backward_over_listcomp(output):
|
||||
a = 1
|
||||
x = [i for i in range(10)]
|
||||
c = 3
|
||||
|
||||
@jump_test(8, 2, [2, 7, 2])
|
||||
def test_jump_backward_over_listcomp_v2(output):
|
||||
flag = False
|
||||
output.append(2)
|
||||
if flag:
|
||||
return
|
||||
x = [i for i in range(5)]
|
||||
flag = 6
|
||||
output.append(7)
|
||||
output.append(8)
|
||||
|
||||
@async_jump_test(2, 3, [1, 3])
|
||||
async def test_jump_forward_over_async_listcomp(output):
|
||||
output.append(1)
|
||||
x = [i async for i in asynciter(range(10))]
|
||||
output.append(3)
|
||||
|
||||
@async_jump_test(3, 1, [])
|
||||
async def test_jump_backward_over_async_listcomp(output):
|
||||
a = 1
|
||||
x = [i async for i in asynciter(range(10))]
|
||||
c = 3
|
||||
|
||||
@async_jump_test(8, 2, [2, 7, 2])
|
||||
async def test_jump_backward_over_async_listcomp_v2(output):
|
||||
flag = False
|
||||
output.append(2)
|
||||
if flag:
|
||||
return
|
||||
x = [i async for i in asynciter(range(5))]
|
||||
flag = 6
|
||||
output.append(7)
|
||||
output.append(8)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Fixed a bug where setting ``frame.f_lineno`` to jump over a list comprehension could misbehave or crash.
|
|
@ -173,7 +173,10 @@ markblocks(PyCodeObject *code_obj, int len)
|
|||
break;
|
||||
case GET_ITER:
|
||||
case GET_AITER:
|
||||
block_stack = push_block(block_stack, Loop);
|
||||
// For-loops get a Loop block, but comprehensions do not.
|
||||
if (_Py_OPCODE(code[i + 1]) != CALL_FUNCTION) {
|
||||
block_stack = push_block(block_stack, Loop);
|
||||
}
|
||||
blocks[i+1] = block_stack;
|
||||
break;
|
||||
case FOR_ITER:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue