[UNPACK_SEQUENCE_TUPLE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG },
[UNPACK_SEQUENCE_TWO_TUPLE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
[WITH_EXCEPT_START] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
- [YIELD_VALUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG },
+ [YIELD_VALUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ESCAPES_FLAG },
[ANNOTATIONS_PLACEHOLDER] = { true, -1, HAS_PURE_FLAG },
[JUMP] = { true, -1, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[JUMP_IF_FALSE] = { true, -1, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[_GET_ANEXT] = HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG,
[_GET_AWAITABLE] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_SEND_GEN_FRAME] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
- [_YIELD_VALUE] = HAS_ARG_FLAG,
+ [_YIELD_VALUE] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG,
[_POP_EXCEPT] = HAS_ESCAPES_FLAG,
[_LOAD_COMMON_CONSTANT] = HAS_ARG_FLAG,
[_LOAD_BUILD_CLASS] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
gen_frame->previous = NULL;
/* We don't know which of these is relevant here, so keep them equal */
assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
- #if TIER_ONE
- assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
- frame->instr_ptr->op.code == INSTRUMENTED_INSTRUCTION ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == SEND ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == FOR_ITER ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == INTERPRETER_EXIT ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == ENTER_EXECUTOR);
+ #if TIER_ONE && defined(Py_DEBUG)
+ if (!PyStackRef_IsNone(frame->f_executable)) {
+ int i = frame->instr_ptr - _PyFrame_GetBytecode(frame);
+ int opcode = _Py_GetBaseCodeUnit(_PyFrame_GetCode(frame), i).op.code;
+ assert(opcode == SEND || opcode == FOR_ITER);
+ }
#endif
RELOAD_STACK();
LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND);
frame = tstate->current_frame = frame->previous;
gen_frame->previous = NULL;
assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
- #if TIER_ONE
- assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
- frame->instr_ptr->op.code == INSTRUMENTED_INSTRUCTION ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == SEND ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == FOR_ITER ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == INTERPRETER_EXIT ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == ENTER_EXECUTOR);
+ #if TIER_ONE && defined(Py_DEBUG)
+ if (!PyStackRef_IsNone(frame->f_executable)) {
+ int i = frame->instr_ptr - _PyFrame_GetBytecode(frame);
+ int opcode = _Py_GetBaseCodeUnit(_PyFrame_GetCode(frame), i).op.code;
+ assert(opcode == SEND || opcode == FOR_ITER);
+ }
#endif
stack_pointer = _PyFrame_GetStackPointer(frame);
LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND);
frame->instr_ptr = next_instr;
next_instr += 1;
INSTRUCTION_STATS(INSTRUMENTED_YIELD_VALUE);
+ opcode = INSTRUMENTED_YIELD_VALUE;
_PyStackRef val;
_PyStackRef retval;
_PyStackRef value;
frame = tstate->current_frame = frame->previous;
gen_frame->previous = NULL;
assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
- #if TIER_ONE
- assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
- frame->instr_ptr->op.code == INSTRUMENTED_INSTRUCTION ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == SEND ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == FOR_ITER ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == INTERPRETER_EXIT ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == ENTER_EXECUTOR);
+ #if TIER_ONE && defined(Py_DEBUG)
+ if (!PyStackRef_IsNone(frame->f_executable)) {
+ int i = frame->instr_ptr - _PyFrame_GetBytecode(frame);
+ int opcode = _Py_GetBaseCodeUnit(_PyFrame_GetCode(frame), i).op.code;
+ assert(opcode == SEND || opcode == FOR_ITER);
+ }
#endif
stack_pointer = _PyFrame_GetStackPointer(frame);
LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND);
frame->instr_ptr = next_instr;
next_instr += 1;
INSTRUCTION_STATS(YIELD_VALUE);
+ opcode = YIELD_VALUE;
_PyStackRef retval;
_PyStackRef value;
retval = stack_pointer[-1];
frame = tstate->current_frame = frame->previous;
gen_frame->previous = NULL;
assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
- #if TIER_ONE
- assert(frame->instr_ptr->op.code == INSTRUMENTED_LINE ||
- frame->instr_ptr->op.code == INSTRUMENTED_INSTRUCTION ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == SEND ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == FOR_ITER ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == INTERPRETER_EXIT ||
- _PyOpcode_Deopt[frame->instr_ptr->op.code] == ENTER_EXECUTOR);
+ #if TIER_ONE && defined(Py_DEBUG)
+ if (!PyStackRef_IsNone(frame->f_executable)) {
+ int i = frame->instr_ptr - _PyFrame_GetBytecode(frame);
+ int opcode = _Py_GetBaseCodeUnit(_PyFrame_GetCode(frame), i).op.code;
+ assert(opcode == SEND || opcode == FOR_ITER);
+ }
#endif
stack_pointer = _PyFrame_GetStackPointer(frame);
LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND);