mirror of
https://github.com/python/cpython.git
synced 2025-10-21 14:12:27 +00:00
bpo-44525: Copy free variables in bytecode to allow calls to inner functions to be specialized (GH-29595)
* Make internal APIs that take PyFrameConstructor take a PyFunctionObject instead. * Add reference to function to frame, borrow references to builtins and globals. * Add COPY_FREE_VARS instruction to allow specialization of calls to inner functions.
This commit is contained in:
parent
d82f2caf94
commit
135cabd328
25 changed files with 268 additions and 156 deletions
|
@ -1171,6 +1171,7 @@ stack_effect(int opcode, int oparg, int jump)
|
|||
|
||||
/* Closures */
|
||||
case MAKE_CELL:
|
||||
case COPY_FREE_VARS:
|
||||
return 0;
|
||||
case LOAD_CLOSURE:
|
||||
return 1;
|
||||
|
@ -7611,7 +7612,7 @@ insert_instruction(basicblock *block, int pos, struct instr *instr) {
|
|||
|
||||
static int
|
||||
insert_prefix_instructions(struct compiler *c, basicblock *entryblock,
|
||||
int *fixed)
|
||||
int *fixed, int nfreevars)
|
||||
{
|
||||
|
||||
int flags = compute_code_flags(c);
|
||||
|
@ -7684,6 +7685,22 @@ insert_prefix_instructions(struct compiler *c, basicblock *entryblock,
|
|||
}
|
||||
}
|
||||
|
||||
if (nfreevars) {
|
||||
struct instr copy_frees = {
|
||||
.i_opcode = COPY_FREE_VARS,
|
||||
.i_oparg = nfreevars,
|
||||
.i_lineno = -1,
|
||||
.i_col_offset = -1,
|
||||
.i_end_lineno = -1,
|
||||
.i_end_col_offset = -1,
|
||||
.i_target = NULL,
|
||||
};
|
||||
if (insert_instruction(entryblock, 0, ©_frees) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -7818,7 +7835,7 @@ assemble(struct compiler *c, int addNone)
|
|||
}
|
||||
|
||||
// This must be called before fix_cell_offsets().
|
||||
if (insert_prefix_instructions(c, entryblock, cellfixedoffsets)) {
|
||||
if (insert_prefix_instructions(c, entryblock, cellfixedoffsets, nfreevars)) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue