mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-43933: Force RETURN_VALUE bytecodes to have line numbers (GH-26054)
This commit is contained in:
parent
6574334a68
commit
cb6f3d7163
4 changed files with 2995 additions and 2944 deletions
|
@ -7276,6 +7276,34 @@ insert_generator_prefix(struct compiler *c, basicblock *entryblock) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Make sure that all returns have a line number, even if early passes
|
||||
* have failed to propagate a correct line number.
|
||||
* The resulting line number may not be correct according to PEP 626,
|
||||
* but should be "good enough", and no worse than in older versions. */
|
||||
static void
|
||||
guarantee_lineno_for_exits(struct assembler *a, int firstlineno) {
|
||||
int lineno = firstlineno;
|
||||
assert(lineno > 0);
|
||||
for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
|
||||
if (b->b_iused == 0) {
|
||||
continue;
|
||||
}
|
||||
struct instr *last = &b->b_instr[b->b_iused-1];
|
||||
if (last->i_lineno < 0) {
|
||||
if (last->i_opcode == RETURN_VALUE)
|
||||
{
|
||||
for (int i = 0; i < b->b_iused; i++) {
|
||||
assert(b->b_instr[i].i_lineno < 0);
|
||||
b->b_instr[i].i_lineno = lineno;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
lineno = last->i_lineno;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static PyCodeObject *
|
||||
assemble(struct compiler *c, int addNone)
|
||||
{
|
||||
|
@ -7338,6 +7366,7 @@ assemble(struct compiler *c, int addNone)
|
|||
if (optimize_cfg(c, &a, consts)) {
|
||||
goto error;
|
||||
}
|
||||
guarantee_lineno_for_exits(&a, c->u->u_firstlineno);
|
||||
|
||||
int maxdepth = stackdepth(c);
|
||||
if (maxdepth < 0) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue