bpo-44622: Set line number of END_ASYNC_FOR to match that of iterator. (GH-27160)

This commit is contained in:
Mark Shannon 2021-07-15 14:37:57 +01:00 committed by GitHub
parent b83861f026
commit f333ab0f2e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 2 deletions

View File

@ -943,10 +943,20 @@ if 1:
genexp_lines = [None, 1, 3, 1]
genexp_code = return_genexp.__code__.co_consts[1]
code_lines = [None if line is None else line-return_genexp.__code__.co_firstlineno
code_lines = [ None if line is None else line-return_genexp.__code__.co_firstlineno
for (_, _, line) in genexp_code.co_lines() ]
self.assertEqual(genexp_lines, code_lines)
def test_line_number_implicit_return_after_async_for(self):
async def test(aseq):
async for i in aseq:
body
expected_lines = [None, 1, 2, 1]
code_lines = [ None if line is None else line-test.__code__.co_firstlineno
for (_, _, line) in test.__code__.co_lines() ]
self.assertEqual(expected_lines, code_lines)
def test_big_dict_literal(self):
# The compiler has a flushing point in "compiler_dict" that calls compiles

View File

@ -3002,7 +3002,9 @@ compiler_async_for(struct compiler *c, stmt_ty s)
/* Except block for __anext__ */
compiler_use_next_block(c, except);
UNSET_LOC(c);
/* Use same line number as the iterator,
* as the END_ASYNC_FOR succeeds the `for`, not the body. */
SET_LOC(c, s->v.AsyncFor.iter);
ADDOP(c, END_ASYNC_FOR);
/* `else` block */