summaryrefslogtreecommitdiff
path: root/Python/compile.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/compile.c')
-rw-r--r--Python/compile.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/Python/compile.c b/Python/compile.c
index 0dd1082151..f9b5ac4a52 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -638,11 +638,16 @@ compiler_next_instr(struct compiler *c, basicblock *b)
return b->b_iused++;
}
-/* Set the i_lineno member of the instruction at offse off if the
- line number for the current expression/statement (?) has not
+/* Set the i_lineno member of the instruction at offset off if the
+ line number for the current expression/statement has not
already been set. If it has been set, the call has no effect.
- Every time a new node is b
+ The line number is reset in the following cases:
+ - when entering a new scope
+ - on each statement
+ - on each expression that start a new line
+ - before the "except" clause
+ - before the "for" and "while" expressions
*/
static void
@@ -1611,9 +1616,8 @@ compiler_for(struct compiler *c, stmt_ty s)
VISIT(c, expr, s->v.For.iter);
ADDOP(c, GET_ITER);
compiler_use_next_block(c, start);
- /* XXX(nnorwitz): is there a better way to handle this?
- for loops are special, we want to be able to trace them
- each time around, so we need to set an extra line number. */
+ /* for expressions must be traced on each iteration,
+ so we need to set an extra line number. */
c->u->u_lineno_set = false;
ADDOP_JREL(c, FOR_ITER, cleanup);
VISIT(c, expr, s->v.For.target);
@@ -1660,6 +1664,9 @@ compiler_while(struct compiler *c, stmt_ty s)
if (!compiler_push_fblock(c, LOOP, loop))
return 0;
if (constant == -1) {
+ /* while expressions must be traced on each iteration,
+ so we need to set an extra line number. */
+ c->u->u_lineno_set = false;
VISIT(c, expr, s->v.While.test);
ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
ADDOP(c, POP_TOP);
@@ -1840,8 +1847,8 @@ compiler_try_except(struct compiler *c, stmt_ty s)
s->v.TryExcept.handlers, i);
if (!handler->type && i < n-1)
return compiler_error(c, "default 'except:' must be last");
- c->u->u_lineno_set = false;
- c->u->u_lineno = handler->lineno;
+ c->u->u_lineno_set = false;
+ c->u->u_lineno = handler->lineno;
except = compiler_new_block(c);
if (except == NULL)
return 0;
@@ -3553,12 +3560,6 @@ assemble_lnotab(struct assembler *a, struct instr *i)
assert(d_bytecode >= 0);
assert(d_lineno >= 0);
- /* XXX(nnorwitz): is there a better way to handle this?
- for loops are special, we want to be able to trace them
- each time around, so we need to set an extra line number. */
- if (d_lineno == 0 && i->i_opcode != FOR_ITER)
- return 1;
-
if (d_bytecode > 255) {
int j, nbytes, ncodes = d_bytecode / 255;
nbytes = a->a_lnotab_off + 2 * ncodes;