mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
bpo-46841: Quicken code in-place (GH-31888)
* Moves the bytecode to the end of the corresponding PyCodeObject, and quickens it in-place. * Removes the almost-always-unused co_varnames, co_freevars, and co_cellvars member caches * _PyOpcode_Deopt is a new mapping from all opcodes to their un-quickened forms. * _PyOpcode_InlineCacheEntries is renamed to _PyOpcode_Caches * _Py_IncrementCountAndMaybeQuicken is renamed to _PyCode_Warmup * _Py_Quicken is renamed to _PyCode_Quicken * _co_quickened is renamed to _co_code_adaptive (and is now a read-only memoryview). * Do not emit unused nonzero opargs anymore in the compiler.
This commit is contained in:
parent
08eb754d84
commit
2bde6827ea
18 changed files with 832 additions and 688 deletions
|
@ -349,19 +349,17 @@ _PyGen_yf(PyGenObject *gen)
|
|||
|
||||
if (gen->gi_frame_valid) {
|
||||
_PyInterpreterFrame *frame = (_PyInterpreterFrame *)gen->gi_iframe;
|
||||
PyObject *bytecode = gen->gi_code->co_code;
|
||||
unsigned char *code = (unsigned char *)PyBytes_AS_STRING(bytecode);
|
||||
|
||||
if (frame->f_lasti < 1) {
|
||||
/* Return immediately if the frame didn't start yet. SEND
|
||||
always come after LOAD_CONST: a code object should not start
|
||||
with SEND */
|
||||
assert(code[0] != SEND);
|
||||
assert(_Py_OPCODE(_PyCode_CODE(gen->gi_code)[0]) != SEND);
|
||||
return NULL;
|
||||
}
|
||||
int opcode = code[(frame->f_lasti+1)*sizeof(_Py_CODEUNIT)];
|
||||
int oparg = code[(frame->f_lasti+1)*sizeof(_Py_CODEUNIT)+1];
|
||||
if (opcode != RESUME || oparg < 2) {
|
||||
_Py_CODEUNIT next = _PyCode_CODE(gen->gi_code)[frame->f_lasti + 1];
|
||||
if (_PyOpcode_Deopt[_Py_OPCODE(next)] != RESUME || _Py_OPARG(next) < 2)
|
||||
{
|
||||
/* Not in a yield from */
|
||||
return NULL;
|
||||
}
|
||||
|
@ -485,14 +483,15 @@ _gen_throw(PyGenObject *gen, int close_on_genexit,
|
|||
ret = _PyFrame_StackPop((_PyInterpreterFrame *)gen->gi_iframe);
|
||||
assert(ret == yf);
|
||||
Py_DECREF(ret);
|
||||
// XXX: Performing this jump ourselves is awkward and problematic.
|
||||
// See https://github.com/python/cpython/pull/31968.
|
||||
/* Termination repetition of SEND loop */
|
||||
assert(frame->f_lasti >= 0);
|
||||
PyObject *bytecode = gen->gi_code->co_code;
|
||||
unsigned char *code = (unsigned char *)PyBytes_AS_STRING(bytecode);
|
||||
_Py_CODEUNIT *code = _PyCode_CODE(gen->gi_code);
|
||||
/* Backup to SEND */
|
||||
frame->f_lasti--;
|
||||
assert(code[frame->f_lasti*sizeof(_Py_CODEUNIT)] == SEND);
|
||||
int jump = code[frame->f_lasti*sizeof(_Py_CODEUNIT)+1];
|
||||
assert(_Py_OPCODE(code[frame->f_lasti]) == SEND);
|
||||
int jump = _Py_OPARG(code[frame->f_lasti]);
|
||||
frame->f_lasti += jump;
|
||||
if (_PyGen_FetchStopIterationValue(&val) == 0) {
|
||||
ret = gen_send(gen, val);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue