diff options
author | Irit Katriel <1055913+iritkatriel@users.noreply.github.com> | 2024-05-21 17:08:51 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-21 17:08:51 (GMT) |
commit | 77ff28bb6776d583e593937df554cbf572cb47b0 (patch) | |
tree | a8a9f4f1338fa786340a720dd741b5db208589ff /Objects | |
parent | f49df4f486e531ff2666eb22854117c564b3de3d (diff) | |
download | cpython-77ff28bb6776d583e593937df554cbf572cb47b0.zip cpython-77ff28bb6776d583e593937df554cbf572cb47b0.tar.gz cpython-77ff28bb6776d583e593937df554cbf572cb47b0.tar.bz2 |
gh-109176: replace _PyFrame_OpAlreadyRan by an assertion that the frame is complete. (#119234)
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/frameobject.c | 35 |
1 files changed, 2 insertions, 33 deletions
diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 64fded8..fc8d6c7 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -1828,32 +1828,6 @@ PyFrame_New(PyThreadState *tstate, PyCodeObject *code, return f; } -static int -_PyFrame_OpAlreadyRan(_PyInterpreterFrame *frame, int opcode, int oparg) -{ - // This only works when opcode is a non-quickened form: - assert(_PyOpcode_Deopt[opcode] == opcode); - int check_oparg = 0; - for (_Py_CODEUNIT *instruction = _PyCode_CODE(_PyFrame_GetCode(frame)); - instruction < frame->instr_ptr; instruction++) - { - int check_opcode = _PyOpcode_Deopt[instruction->op.code]; - check_oparg |= instruction->op.arg; - if (check_opcode == opcode && check_oparg == oparg) { - return 1; - } - if (check_opcode == EXTENDED_ARG) { - check_oparg <<= 8; - } - else { - check_oparg = 0; - } - instruction += _PyOpcode_Caches[check_opcode]; - } - return 0; -} - - // Initialize frame free variables if needed static void frame_init_get_vars(_PyInterpreterFrame *frame) @@ -1907,14 +1881,9 @@ frame_get_var(_PyInterpreterFrame *frame, PyCodeObject *co, int i, value = PyCell_GET(value); } else if (kind & CO_FAST_CELL) { - // Note that no *_DEREF ops can happen before MAKE_CELL - // executes. So there's no need to duplicate the work - // that MAKE_CELL would otherwise do later, if it hasn't - // run yet. if (value != NULL) { - if (PyCell_Check(value) && - _PyFrame_OpAlreadyRan(frame, MAKE_CELL, i)) { - // (likely) MAKE_CELL must have executed already. + if (PyCell_Check(value)) { + assert(!_PyFrame_IsIncomplete(frame)); value = PyCell_GET(value); } // (likely) Otherwise it is an arg (kind & CO_FAST_LOCAL), |