aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/bytecodes.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/bytecodes.c')
-rw-r--r--Python/bytecodes.c56
1 files changed, 33 insertions, 23 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 6f17472e04e..ae459cabadd 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -133,6 +133,7 @@ dummy_func(
}
inst(RESUME, (--)) {
+ #if TIER_ONE
assert(frame == tstate->current_frame);
/* Possibly combine this with eval breaker */
if (_PyFrame_GetCode(frame)->_co_instrumentation_version != tstate->interp->monitoring_version) {
@@ -140,7 +141,9 @@ dummy_func(
ERROR_IF(err, error);
next_instr--;
}
- else if (oparg < 2) {
+ else
+ #endif
+ if (oparg < 2) {
CHECK_EVAL_BREAKER();
}
}
@@ -757,21 +760,37 @@ dummy_func(
return retval;
}
- inst(RETURN_VALUE, (retval --)) {
- STACK_SHRINK(1);
+ // The stack effect here is ambiguous.
+ // We definitely pop the return value off the stack on entry.
+ // We also push it onto the stack on exit, but that's a
+ // different frame, and it's accounted for by _PUSH_FRAME.
+ op(_POP_FRAME, (retval --)) {
assert(EMPTY());
_PyFrame_SetStackPointer(frame, stack_pointer);
_Py_LeaveRecursiveCallPy(tstate);
- assert(frame != &entry_frame);
// GH-99729: We need to unlink the frame *before* clearing it:
_PyInterpreterFrame *dying = frame;
+ #if TIER_ONE
+ assert(frame != &entry_frame);
+ #endif
frame = tstate->current_frame = dying->previous;
- _PyEvalFrameClearAndPop(tstate, dying);
+ _PyEval_FrameClearAndPop(tstate, dying);
frame->prev_instr += frame->return_offset;
_PyFrame_StackPush(frame, retval);
+ #if TIER_ONE
goto resume_frame;
+ #endif
+ #if TIER_TWO
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ ip_offset = (_Py_CODEUNIT *)_PyFrame_GetCode(frame)->co_code_adaptive;
+ #endif
}
+ macro(RETURN_VALUE) =
+ SAVE_IP + // Tier 2 only; special-cased oparg
+ SAVE_CURRENT_IP + // Sets frame->prev_instr
+ _POP_FRAME;
+
inst(INSTRUMENTED_RETURN_VALUE, (retval --)) {
int err = _Py_call_instrumentation_arg(
tstate, PY_MONITORING_EVENT_PY_RETURN,
@@ -785,27 +804,17 @@ dummy_func(
// GH-99729: We need to unlink the frame *before* clearing it:
_PyInterpreterFrame *dying = frame;
frame = tstate->current_frame = dying->previous;
- _PyEvalFrameClearAndPop(tstate, dying);
+ _PyEval_FrameClearAndPop(tstate, dying);
frame->prev_instr += frame->return_offset;
_PyFrame_StackPush(frame, retval);
goto resume_frame;
}
- inst(RETURN_CONST, (--)) {
- PyObject *retval = GETITEM(FRAME_CO_CONSTS, oparg);
- Py_INCREF(retval);
- assert(EMPTY());
- _PyFrame_SetStackPointer(frame, stack_pointer);
- _Py_LeaveRecursiveCallPy(tstate);
- assert(frame != &entry_frame);
- // GH-99729: We need to unlink the frame *before* clearing it:
- _PyInterpreterFrame *dying = frame;
- frame = tstate->current_frame = dying->previous;
- _PyEvalFrameClearAndPop(tstate, dying);
- frame->prev_instr += frame->return_offset;
- _PyFrame_StackPush(frame, retval);
- goto resume_frame;
- }
+ macro(RETURN_CONST) =
+ LOAD_CONST +
+ SAVE_IP + // Tier 2 only; special-cased oparg
+ SAVE_CURRENT_IP + // Sets frame->prev_instr
+ _POP_FRAME;
inst(INSTRUMENTED_RETURN_CONST, (--)) {
PyObject *retval = GETITEM(FRAME_CO_CONSTS, oparg);
@@ -821,7 +830,7 @@ dummy_func(
// GH-99729: We need to unlink the frame *before* clearing it:
_PyInterpreterFrame *dying = frame;
frame = tstate->current_frame = dying->previous;
- _PyEvalFrameClearAndPop(tstate, dying);
+ _PyEval_FrameClearAndPop(tstate, dying);
frame->prev_instr += frame->return_offset;
_PyFrame_StackPush(frame, retval);
goto resume_frame;
@@ -3545,7 +3554,8 @@ dummy_func(
goto error;
}
- func_obj->func_version = ((PyCodeObject *)codeobj)->co_version;
+ _PyFunction_SetVersion(
+ func_obj, ((PyCodeObject *)codeobj)->co_version);
func = (PyObject *)func_obj;
}