summaryrefslogtreecommitdiffstats
path: root/Python/executor_cases.c.h
diff options
context:
space:
mode:
Diffstat (limited to 'Python/executor_cases.c.h')
-rw-r--r--Python/executor_cases.c.h935
1 files changed, 634 insertions, 301 deletions
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 1716d5d..7631ff7 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -14,9 +14,11 @@
case _CHECK_PERIODIC: {
_Py_CHECK_EMSCRIPTEN_SIGNALS_PERIODICALLY();
- QSBR_QUIESCENT_STATE(tstate); \
+ QSBR_QUIESCENT_STATE(tstate);
if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = _Py_HandlePending(tstate);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (err != 0) JUMP_TO_ERROR();
}
break;
@@ -28,7 +30,9 @@
_Py_CHECK_EMSCRIPTEN_SIGNALS_PERIODICALLY();
QSBR_QUIESCENT_STATE(tstate); \
if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = _Py_HandlePending(tstate);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (err != 0) JUMP_TO_ERROR();
}
}
@@ -62,10 +66,12 @@
oparg = CURRENT_OPARG();
_PyStackRef value_s = GETLOCAL(oparg);
if (PyStackRef_IsNull(value_s)) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError,
UNBOUNDLOCAL_ERROR_MSG,
PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, oparg)
);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (1) JUMP_TO_ERROR();
}
value = PyStackRef_DUP(value_s);
@@ -323,11 +329,13 @@
case _END_SEND: {
_PyStackRef value;
_PyStackRef receiver;
+ _PyStackRef val;
value = stack_pointer[-1];
receiver = stack_pointer[-2];
(void)receiver;
+ val = value;
PyStackRef_CLOSE(receiver);
- stack_pointer[-2] = value;
+ stack_pointer[-2] = val;
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
break;
@@ -337,7 +345,9 @@
_PyStackRef value;
_PyStackRef res;
value = stack_pointer[-1];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = PyNumber_Negative(PyStackRef_AsPyObjectBorrow(value));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(value);
if (res_o == NULL) JUMP_TO_ERROR();
res = PyStackRef_FromPyObjectSteal(res_o);
@@ -360,7 +370,9 @@
_PyStackRef value;
_PyStackRef res;
value = stack_pointer[-1];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = PyObject_IsTrue(PyStackRef_AsPyObjectBorrow(value));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(value);
if (err < 0) JUMP_TO_ERROR();
res = err ? PyStackRef_True : PyStackRef_False;
@@ -469,7 +481,9 @@
_PyStackRef value;
_PyStackRef res;
value = stack_pointer[-1];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = PyNumber_Invert(PyStackRef_AsPyObjectBorrow(value));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(value);
if (res_o == NULL) JUMP_TO_ERROR();
res = PyStackRef_FromPyObjectSteal(res_o);
@@ -568,7 +582,7 @@
STAT_INC(BINARY_OP, hit);
PyObject *res_o = _PyLong_Subtract((PyLongObject *)left_o, (PyLongObject *)right_o);
_Py_DECREF_SPECIALIZED(right_o, (destructor)PyObject_Free);
- _Py_DECREF_SPECIALIZED(left_o, (destructor)PyObject_Free);;
+ _Py_DECREF_SPECIALIZED(left_o, (destructor)PyObject_Free);
if (res_o == NULL) JUMP_TO_ERROR();
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-2] = res;
@@ -775,7 +789,9 @@
container = stack_pointer[-2];
PyObject *container_o = PyStackRef_AsPyObjectBorrow(container);
PyObject *sub_o = PyStackRef_AsPyObjectBorrow(sub);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = PyObject_GetItem(container_o, sub_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(container);
PyStackRef_CLOSE(sub);
if (res_o == NULL) JUMP_TO_ERROR();
@@ -794,8 +810,10 @@
stop = stack_pointer[-1];
start = stack_pointer[-2];
container = stack_pointer[-3];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
PyStackRef_AsPyObjectSteal(stop));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyObject *res_o;
// Can't use ERROR_IF() here, because we haven't
// DECREF'ed container yet, and we still own slice.
@@ -803,8 +821,14 @@
res_o = NULL;
}
else {
+ stack_pointer += -2;
+ assert(WITHIN_STACK_BOUNDS());
+ _PyFrame_SetStackPointer(frame, stack_pointer);
res_o = PyObject_GetItem(PyStackRef_AsPyObjectBorrow(container), slice);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
Py_DECREF(slice);
+ stack_pointer += 2;
+ assert(WITHIN_STACK_BOUNDS());
}
PyStackRef_CLOSE(container);
if (res_o == NULL) JUMP_TO_ERROR();
@@ -824,15 +848,23 @@
start = stack_pointer[-2];
container = stack_pointer[-3];
v = stack_pointer[-4];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
PyStackRef_AsPyObjectSteal(stop));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
int err;
if (slice == NULL) {
err = 1;
}
else {
+ stack_pointer += -2;
+ assert(WITHIN_STACK_BOUNDS());
+ _PyFrame_SetStackPointer(frame, stack_pointer);
err = PyObject_SetItem(PyStackRef_AsPyObjectBorrow(container), slice, PyStackRef_AsPyObjectBorrow(v));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
Py_DECREF(slice);
+ stack_pointer += 2;
+ assert(WITHIN_STACK_BOUNDS());
}
PyStackRef_CLOSE(v);
PyStackRef_CLOSE(container);
@@ -976,9 +1008,13 @@
}
STAT_INC(BINARY_SUBSCR, hit);
PyObject *res_o;
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int rc = PyDict_GetItemRef(dict, sub, &res_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (rc == 0) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_SetKeyError(sub);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
}
PyStackRef_CLOSE(dict_st);
PyStackRef_CLOSE(sub_st);
@@ -1031,13 +1067,11 @@
PyHeapTypeObject *ht = (PyHeapTypeObject *)tp;
PyObject *getitem = ht->_spec_cache.getitem;
new_frame = _PyFrame_PushUnchecked(tstate, PyStackRef_FromPyObjectNew(getitem), 2, frame);
- stack_pointer += -2;
- assert(WITHIN_STACK_BOUNDS());
new_frame->localsplus[0] = container;
new_frame->localsplus[1] = sub;
frame->return_offset = (uint16_t)(1 + INLINE_CACHE_ENTRIES_BINARY_SUBSCR);
- stack_pointer[0].bits = (uintptr_t)new_frame;
- stack_pointer += 1;
+ stack_pointer[-2].bits = (uintptr_t)new_frame;
+ stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1048,8 +1082,9 @@
oparg = CURRENT_OPARG();
v = stack_pointer[-1];
list = stack_pointer[-2 - (oparg-1)];
- if (_PyList_AppendTakeRef((PyListObject *)PyStackRef_AsPyObjectBorrow(list),
- PyStackRef_AsPyObjectSteal(v)) < 0) JUMP_TO_ERROR();
+ int err = _PyList_AppendTakeRef((PyListObject *)PyStackRef_AsPyObjectBorrow(list),
+ PyStackRef_AsPyObjectSteal(v));
+ if (err < 0) JUMP_TO_ERROR();
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
break;
@@ -1061,8 +1096,10 @@
oparg = CURRENT_OPARG();
v = stack_pointer[-1];
set = stack_pointer[-2 - (oparg-1)];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = PySet_Add(PyStackRef_AsPyObjectBorrow(set),
PyStackRef_AsPyObjectBorrow(v));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(v);
if (err) JUMP_TO_ERROR();
stack_pointer += -1;
@@ -1078,7 +1115,9 @@
container = stack_pointer[-2];
v = stack_pointer[-3];
/* container[sub] = v */
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = PyObject_SetItem(PyStackRef_AsPyObjectBorrow(container), PyStackRef_AsPyObjectBorrow(sub), PyStackRef_AsPyObjectBorrow(v));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(v);
PyStackRef_CLOSE(container);
PyStackRef_CLOSE(sub);
@@ -1141,9 +1180,11 @@
JUMP_TO_JUMP_TARGET();
}
STAT_INC(STORE_SUBSCR, hit);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = _PyDict_SetItem_Take2((PyDictObject *)dict,
PyStackRef_AsPyObjectSteal(sub),
PyStackRef_AsPyObjectSteal(value));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(dict_st);
if (err) JUMP_TO_ERROR();
stack_pointer += -3;
@@ -1157,8 +1198,10 @@
sub = stack_pointer[-1];
container = stack_pointer[-2];
/* del container[sub] */
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = PyObject_DelItem(PyStackRef_AsPyObjectBorrow(container),
PyStackRef_AsPyObjectBorrow(sub));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(container);
PyStackRef_CLOSE(sub);
if (err) JUMP_TO_ERROR();
@@ -1173,7 +1216,9 @@
oparg = CURRENT_OPARG();
value = stack_pointer[-1];
assert(oparg <= MAX_INTRINSIC_1);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = _PyIntrinsics_UnaryFunctions[oparg].func(tstate, PyStackRef_AsPyObjectBorrow(value));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(value);
if (res_o == NULL) JUMP_TO_ERROR();
res = PyStackRef_FromPyObjectSteal(res_o);
@@ -1191,7 +1236,9 @@
assert(oparg <= MAX_INTRINSIC_2);
PyObject *value1 = PyStackRef_AsPyObjectBorrow(value1_st);
PyObject *value2 = PyStackRef_AsPyObjectBorrow(value2_st);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = _PyIntrinsics_BinaryFunctions[oparg].func(tstate, value2, value1);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(value2_st);
PyStackRef_CLOSE(value1_st);
if (res_o == NULL) JUMP_TO_ERROR();
@@ -1209,6 +1256,7 @@
#if TIER_ONE
assert(frame != &entry_frame);
#endif
+ _PyStackRef temp = retval;
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
_PyFrame_SetStackPointer(frame, stack_pointer);
@@ -1218,9 +1266,9 @@
_PyInterpreterFrame *dying = frame;
frame = tstate->current_frame = dying->previous;
_PyEval_FrameClearAndPop(tstate, dying);
- LOAD_SP();
+ stack_pointer = _PyFrame_GetStackPointer(frame);
LOAD_IP(frame->return_offset);
- res = retval;
+ res = temp;
LLTRACE_RESUME_FRAME();
stack_pointer[0] = res;
stack_pointer += 1;
@@ -1240,22 +1288,30 @@
getter = type->tp_as_async->am_aiter;
}
if (getter == NULL) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_Format(tstate, PyExc_TypeError,
"'async for' requires an object with "
"__aiter__ method, got %.100s",
type->tp_name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(obj);
if (true) JUMP_TO_ERROR();
}
+ _PyFrame_SetStackPointer(frame, stack_pointer);
iter_o = (*getter)(obj_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(obj);
if (iter_o == NULL) JUMP_TO_ERROR();
if (Py_TYPE(iter_o)->tp_as_async == NULL ||
Py_TYPE(iter_o)->tp_as_async->am_anext == NULL) {
+ stack_pointer += -1;
+ assert(WITHIN_STACK_BOUNDS());
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_Format(tstate, PyExc_TypeError,
"'async for' received an object from __aiter__ "
"that does not implement __anext__: %.100s",
Py_TYPE(iter_o)->tp_name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
Py_DECREF(iter_o);
if (true) JUMP_TO_ERROR();
}
@@ -1268,7 +1324,9 @@
_PyStackRef aiter;
_PyStackRef awaitable;
aiter = stack_pointer[-1];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *awaitable_o = _PyEval_GetANext(PyStackRef_AsPyObjectBorrow(aiter));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (awaitable_o == NULL) {
JUMP_TO_ERROR();
}
@@ -1284,7 +1342,9 @@
_PyStackRef iter;
oparg = CURRENT_OPARG();
iterable = stack_pointer[-1];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *iter_o = _PyEval_GetAwaitable(PyStackRef_AsPyObjectBorrow(iterable), oparg);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(iterable);
if (iter_o == NULL) JUMP_TO_ERROR();
iter = PyStackRef_FromPyObjectSteal(iter_o);
@@ -1339,6 +1399,7 @@
assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1);
assert(oparg == 0 || oparg == 1);
gen->gi_frame_state = FRAME_SUSPENDED + oparg;
+ _PyStackRef temp = retval;
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
_PyFrame_SetStackPointer(frame, stack_pointer);
@@ -1352,15 +1413,15 @@
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);
+ 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);
#endif
+ stack_pointer = _PyFrame_GetStackPointer(frame);
LOAD_IP(1 + INLINE_CACHE_ENTRIES_SEND);
- LOAD_SP();
- value = retval;
+ value = temp;
LLTRACE_RESUME_FRAME();
stack_pointer[0] = value;
stack_pointer += 1;
@@ -1372,9 +1433,11 @@
_PyStackRef exc_value;
exc_value = stack_pointer[-1];
_PyErr_StackItem *exc_info = tstate->exc_info;
+ _PyFrame_SetStackPointer(frame, stack_pointer);
Py_XSETREF(exc_info->exc_value,
PyStackRef_Is(exc_value, PyStackRef_None)
? NULL : PyStackRef_AsPyObjectSteal(exc_value));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
break;
@@ -1384,16 +1447,16 @@
_PyStackRef value;
oparg = CURRENT_OPARG();
// Keep in sync with _common_constants in opcode.py
- switch(oparg) {
- case CONSTANT_ASSERTIONERROR:
- value = PyStackRef_FromPyObjectImmortal(PyExc_AssertionError);
- break;
- case CONSTANT_NOTIMPLEMENTEDERROR:
- value = PyStackRef_FromPyObjectImmortal(PyExc_NotImplementedError);
- break;
- default:
- Py_FatalError("bad LOAD_COMMON_CONSTANT oparg");
+ // If we ever have more than two constants, use a lookup table
+ PyObject *val;
+ if (oparg == CONSTANT_ASSERTIONERROR) {
+ val = PyExc_AssertionError;
+ }
+ else {
+ assert(oparg == CONSTANT_NOTIMPLEMENTEDERROR);
+ val = PyExc_NotImplementedError;
}
+ value = PyStackRef_FromPyObjectImmortal(val);
stack_pointer[0] = value;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
@@ -1403,10 +1466,15 @@
case _LOAD_BUILD_CLASS: {
_PyStackRef bc;
PyObject *bc_o;
- if (PyMapping_GetOptionalItem(BUILTINS(), &_Py_ID(__build_class__), &bc_o) < 0) JUMP_TO_ERROR();
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ int err = PyMapping_GetOptionalItem(BUILTINS(), &_Py_ID(__build_class__), &bc_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ if (err < 0) JUMP_TO_ERROR();
if (bc_o == NULL) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_SetString(tstate, PyExc_NameError,
"__build_class__ not found");
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (true) JUMP_TO_ERROR();
}
bc = PyStackRef_FromPyObjectSteal(bc_o);
@@ -1424,15 +1492,23 @@
PyObject *ns = LOCALS();
int err;
if (ns == NULL) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_Format(tstate, PyExc_SystemError,
"no locals found when storing %R", name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(v);
if (true) JUMP_TO_ERROR();
}
- if (PyDict_CheckExact(ns))
- err = PyDict_SetItem(ns, name, PyStackRef_AsPyObjectBorrow(v));
- else
- err = PyObject_SetItem(ns, name, PyStackRef_AsPyObjectBorrow(v));
+ if (PyDict_CheckExact(ns)) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ err = PyDict_SetItem(ns, name, PyStackRef_AsPyObjectBorrow(v));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ }
+ else {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ err = PyObject_SetItem(ns, name, PyStackRef_AsPyObjectBorrow(v));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ }
PyStackRef_CLOSE(v);
if (err) JUMP_TO_ERROR();
stack_pointer += -1;
@@ -1446,16 +1522,22 @@
PyObject *ns = LOCALS();
int err;
if (ns == NULL) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_Format(tstate, PyExc_SystemError,
"no locals when deleting %R", name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
JUMP_TO_ERROR();
}
+ _PyFrame_SetStackPointer(frame, stack_pointer);
err = PyObject_DelItem(ns, name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
// Can't use ERROR_IF here.
if (err != 0) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyEval_FormatExcCheckArg(tstate, PyExc_NameError,
NAME_ERROR_MSG,
name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
JUMP_TO_ERROR();
}
break;
@@ -1468,7 +1550,9 @@
seq = stack_pointer[-1];
output = &stack_pointer[-1];
_PyStackRef *top = output + oparg;
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int res = _PyEval_UnpackIterableStackRef(tstate, seq, oparg, -1, top);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(seq);
if (res == 0) JUMP_TO_ERROR();
stack_pointer += -1 + oparg;
@@ -1494,10 +1578,10 @@
}
STAT_INC(UNPACK_SEQUENCE, hit);
val0 = PyStackRef_FromPyObjectNew(PyTuple_GET_ITEM(seq_o, 0));
- stack_pointer[0] = val0;
val1 = PyStackRef_FromPyObjectNew(PyTuple_GET_ITEM(seq_o, 1));
- stack_pointer[-1] = val1;
PyStackRef_CLOSE(seq);
+ stack_pointer[-1] = val1;
+ stack_pointer[0] = val0;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
break;
@@ -1562,7 +1646,9 @@
seq = stack_pointer[-1];
right = &stack_pointer[(oparg & 0xFF)];
_PyStackRef *top = right + (oparg >> 8);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int res = _PyEval_UnpackIterableStackRef(tstate, seq, oparg & 0xFF, oparg >> 8, top);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(seq);
if (res == 0) JUMP_TO_ERROR();
stack_pointer += (oparg & 0xFF) + (oparg >> 8);
@@ -1577,8 +1663,10 @@
owner = stack_pointer[-1];
v = stack_pointer[-2];
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = PyObject_SetAttr(PyStackRef_AsPyObjectBorrow(owner),
name, PyStackRef_AsPyObjectBorrow(v));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(v);
PyStackRef_CLOSE(owner);
if (err) JUMP_TO_ERROR();
@@ -1592,7 +1680,9 @@
oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = PyObject_DelAttr(PyStackRef_AsPyObjectBorrow(owner), name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(owner);
if (err) JUMP_TO_ERROR();
stack_pointer += -1;
@@ -1605,7 +1695,9 @@
oparg = CURRENT_OPARG();
v = stack_pointer[-1];
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = PyDict_SetItem(GLOBALS(), name, PyStackRef_AsPyObjectBorrow(v));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(v);
if (err) JUMP_TO_ERROR();
stack_pointer += -1;
@@ -1616,14 +1708,18 @@
case _DELETE_GLOBAL: {
oparg = CURRENT_OPARG();
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = PyDict_Pop(GLOBALS(), name, NULL);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
// Can't use ERROR_IF here.
if (err < 0) {
JUMP_TO_ERROR();
}
if (err == 0) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyEval_FormatExcCheckArg(tstate, PyExc_NameError,
NAME_ERROR_MSG, name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
JUMP_TO_ERROR();
}
break;
@@ -1633,8 +1729,10 @@
_PyStackRef locals;
PyObject *l = LOCALS();
if (l == NULL) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_SetString(tstate, PyExc_SystemError,
"no locals found");
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (true) JUMP_TO_ERROR();
}
locals = PyStackRef_FromPyObjectNew(l);
@@ -1650,7 +1748,9 @@
_PyStackRef v;
oparg = CURRENT_OPARG();
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *v_o = _PyEval_LoadName(tstate, frame, name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (v_o == NULL) JUMP_TO_ERROR();
v = PyStackRef_FromPyObjectSteal(v_o);
stack_pointer[0] = v;
@@ -1665,7 +1765,9 @@
oparg = CURRENT_OPARG();
res = &stack_pointer[0];
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg>>1);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyEval_LoadGlobalStackRef(GLOBALS(), BUILTINS(), name, res);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (PyStackRef_IsNull(*res)) JUMP_TO_ERROR();
null = PyStackRef_NULL;
if (oparg & 1) stack_pointer[1] = null;
@@ -1754,10 +1856,12 @@
oparg = CURRENT_OPARG();
_PyStackRef v = GETLOCAL(oparg);
if (PyStackRef_IsNull(v)) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyEval_FormatExcCheckArg(tstate, PyExc_UnboundLocalError,
UNBOUNDLOCAL_ERROR_MSG,
PyTuple_GetItem(_PyFrame_GetCode(frame)->co_localsplusnames, oparg)
);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (1) JUMP_TO_ERROR();
}
SETLOCAL(oparg, PyStackRef_NULL);
@@ -1784,7 +1888,9 @@
// Fortunately we don't need its superpower.
PyObject *oldobj = PyCell_SwapTakeRef((PyCellObject *)cell, NULL);
if (oldobj == NULL) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyEval_FormatExcUnbound(tstate, _PyFrame_GetCode(frame), oparg);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
JUMP_TO_ERROR();
}
Py_DECREF(oldobj);
@@ -1802,7 +1908,9 @@
assert(class_dict);
assert(oparg >= 0 && oparg < _PyFrame_GetCode(frame)->co_nlocalsplus);
name = PyTuple_GET_ITEM(_PyFrame_GetCode(frame)->co_localsplusnames, oparg);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = PyMapping_GetOptionalItem(class_dict, name, &value_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (err < 0) {
JUMP_TO_ERROR();
}
@@ -1810,7 +1918,9 @@
PyCellObject *cell = (PyCellObject *)PyStackRef_AsPyObjectBorrow(GETLOCAL(oparg));
value_o = PyCell_GetRef(cell);
if (value_o == NULL) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyEval_FormatExcUnbound(tstate, _PyFrame_GetCode(frame), oparg);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
JUMP_TO_ERROR();
}
}
@@ -1826,7 +1936,9 @@
PyCellObject *cell = (PyCellObject *)PyStackRef_AsPyObjectBorrow(GETLOCAL(oparg));
PyObject *value_o = PyCell_GetRef(cell);
if (value_o == NULL) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyEval_FormatExcUnbound(tstate, _PyFrame_GetCode(frame), oparg);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (true) JUMP_TO_ERROR();
}
value = PyStackRef_FromPyObjectSteal(value_o);
@@ -1841,7 +1953,9 @@
oparg = CURRENT_OPARG();
v = stack_pointer[-1];
PyCellObject *cell = (PyCellObject *)PyStackRef_AsPyObjectBorrow(GETLOCAL(oparg));
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyCell_SetTakeRef(cell, PyStackRef_AsPyObjectSteal(v));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
break;
@@ -1924,16 +2038,22 @@
list_st = stack_pointer[-2 - (oparg-1)];
PyObject *list = PyStackRef_AsPyObjectBorrow(list_st);
PyObject *iterable = PyStackRef_AsPyObjectBorrow(iterable_st);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (none_val == NULL) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int matches = _PyErr_ExceptionMatches(tstate, PyExc_TypeError);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (matches &&
(Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
{
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_Clear(tstate);
_PyErr_Format(tstate, PyExc_TypeError,
"Value after * must be an iterable, not %.200s",
Py_TYPE(iterable)->tp_name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
}
PyStackRef_CLOSE(iterable_st);
if (true) JUMP_TO_ERROR();
@@ -1951,8 +2071,10 @@
oparg = CURRENT_OPARG();
iterable = stack_pointer[-1];
set = stack_pointer[-2 - (oparg-1)];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = _PySet_Update(PyStackRef_AsPyObjectBorrow(set),
PyStackRef_AsPyObjectBorrow(iterable));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(iterable);
if (err < 0) JUMP_TO_ERROR();
stack_pointer += -1;
@@ -1965,7 +2087,9 @@
_PyStackRef set;
oparg = CURRENT_OPARG();
values = &stack_pointer[-oparg];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *set_o = PySet_New(NULL);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (set_o == NULL) {
for (int _i = oparg; --_i >= 0;) {
PyStackRef_CLOSE(values[_i]);
@@ -1975,7 +2099,9 @@
int err = 0;
for (int i = 0; i < oparg; i++) {
if (err == 0) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
err = PySet_Add(set_o, PyStackRef_AsPyObjectBorrow(values[i]));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
}
PyStackRef_CLOSE(values[i]);
}
@@ -2002,10 +2128,12 @@
}
if (true) JUMP_TO_ERROR();
}
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *map_o = _PyDict_FromItems(
values_o, 2,
values_o+1, 2,
oparg);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
STACKREFS_TO_PYOBJECTS_CLEANUP(values_o);
for (int _i = oparg*2; --_i >= 0;) {
PyStackRef_CLOSE(values[_i]);
@@ -2019,20 +2147,28 @@
}
case _SETUP_ANNOTATIONS: {
- int err;
PyObject *ann_dict;
if (LOCALS() == NULL) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_Format(tstate, PyExc_SystemError,
"no locals found when setting up annotations");
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (true) JUMP_TO_ERROR();
}
/* check if __annotations__ in locals()... */
- if (PyMapping_GetOptionalItem(LOCALS(), &_Py_ID(__annotations__), &ann_dict) < 0) JUMP_TO_ERROR();
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ int err = PyMapping_GetOptionalItem(LOCALS(), &_Py_ID(__annotations__), &ann_dict);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ if (err < 0) JUMP_TO_ERROR();
if (ann_dict == NULL) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
ann_dict = PyDict_New();
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (ann_dict == NULL) JUMP_TO_ERROR();
+ _PyFrame_SetStackPointer(frame, stack_pointer);
err = PyObject_SetItem(LOCALS(), &_Py_ID(__annotations__),
ann_dict);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
Py_DECREF(ann_dict);
if (err) JUMP_TO_ERROR();
}
@@ -2050,13 +2186,19 @@
dict = stack_pointer[-2 - (oparg - 1)];
PyObject *dict_o = PyStackRef_AsPyObjectBorrow(dict);
PyObject *update_o = PyStackRef_AsPyObjectBorrow(update);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = PyDict_Update(dict_o, update_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (err < 0) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int matches = _PyErr_ExceptionMatches(tstate, PyExc_AttributeError);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (matches) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_Format(tstate, PyExc_TypeError,
"'%.200s' object is not a mapping",
Py_TYPE(update_o)->tp_name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
}
PyStackRef_CLOSE(update);
if (true) JUMP_TO_ERROR();
@@ -2078,9 +2220,13 @@
PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
PyObject *dict_o = PyStackRef_AsPyObjectBorrow(dict);
PyObject *update_o = PyStackRef_AsPyObjectBorrow(update);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = _PyDict_MergeEx(dict_o, update_o, 2);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (err < 0) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyEval_FormatKwargsError(tstate, callable_o, update_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(update);
if (true) JUMP_TO_ERROR();
}
@@ -2102,11 +2248,13 @@
assert(PyDict_CheckExact(dict));
/* dict[key] = value */
// Do not DECREF INPUTS because the function steals the references
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = _PyDict_SetItem_Take2(
(PyDictObject *)dict,
PyStackRef_AsPyObjectSteal(key),
PyStackRef_AsPyObjectSteal(value)
);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (err != 0) JUMP_TO_ERROR();
stack_pointer += -2;
assert(WITHIN_STACK_BOUNDS());
@@ -2138,7 +2286,9 @@
}
STAT_INC(LOAD_SUPER_ATTR, hit);
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 2);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *attr = _PySuper_Lookup((PyTypeObject *)class, self, name, NULL);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(global_super_st);
PyStackRef_CLOSE(class_st);
PyStackRef_CLOSE(self_st);
@@ -2176,8 +2326,10 @@
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 2);
PyTypeObject *cls = (PyTypeObject *)class;
int method_found = 0;
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *attr_o = _PySuper_Lookup(cls, self, name,
Py_TYPE(self)->tp_getattro == PyObject_GenericGetAttr ? &method_found : NULL);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(global_super_st);
PyStackRef_CLOSE(class_st);
if (attr_o == NULL) {
@@ -2209,7 +2361,9 @@
if (oparg & 1) {
/* Designed to work in tandem with CALL, pushes two values. */
attr_o = NULL;
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int is_meth = _PyObject_GetMethod(PyStackRef_AsPyObjectBorrow(owner), name, &attr_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (is_meth) {
/* We can bypass temporary bound method object.
meth is unbound method and obj is self.
@@ -2232,9 +2386,13 @@
}
else {
/* Classic, pushes one value. */
+ _PyFrame_SetStackPointer(frame, stack_pointer);
attr_o = PyObject_GetAttr(PyStackRef_AsPyObjectBorrow(owner), name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(owner);
if (attr_o == NULL) JUMP_TO_ERROR();
+ /* We need to define self_or_null on all paths */
+ self_or_null = PyStackRef_NULL;
}
attr = PyStackRef_FromPyObjectSteal(attr_o);
stack_pointer[-1] = attr;
@@ -2440,8 +2598,8 @@
STAT_INC(LOAD_ATTR, hit);
null = PyStackRef_NULL;
attr = PyStackRef_FromPyObjectNew(attr_o);
- stack_pointer[-1] = attr;
PyStackRef_CLOSE(owner);
+ stack_pointer[-1] = attr;
break;
}
@@ -2462,8 +2620,8 @@
STAT_INC(LOAD_ATTR, hit);
null = PyStackRef_NULL;
attr = PyStackRef_FromPyObjectNew(attr_o);
- stack_pointer[-1] = attr;
PyStackRef_CLOSE(owner);
+ stack_pointer[-1] = attr;
stack_pointer[0] = null;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
@@ -2499,9 +2657,9 @@
STAT_INC(LOAD_ATTR, hit);
assert(descr != NULL);
attr = PyStackRef_FromPyObjectNew(descr);
- stack_pointer[-1] = attr;
null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
+ stack_pointer[-1] = attr;
break;
}
@@ -2515,9 +2673,9 @@
STAT_INC(LOAD_ATTR, hit);
assert(descr != NULL);
attr = PyStackRef_FromPyObjectNew(descr);
- stack_pointer[-1] = attr;
null = PyStackRef_NULL;
PyStackRef_CLOSE(owner);
+ stack_pointer[-1] = attr;
stack_pointer[0] = null;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
@@ -2640,7 +2798,9 @@
}
old_value = ep->me_value;
PyDict_WatchEvent event = old_value == NULL ? PyDict_EVENT_ADDED : PyDict_EVENT_MODIFIED;
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyDict_NotifyEvent(tstate->interp, event, dict, name, PyStackRef_AsPyObjectBorrow(value));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
ep->me_value = PyStackRef_AsPyObjectSteal(value);
// old_value should be DECREFed after GC track checking is done, if not, it could raise a segmentation fault,
// when dict only holds the strong reference to value in ep->me_value.
@@ -2680,21 +2840,29 @@
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
assert((oparg >> 5) <= Py_GE);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = PyObject_RichCompare(left_o, right_o, oparg >> 5);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(left);
PyStackRef_CLOSE(right);
if (res_o == NULL) JUMP_TO_ERROR();
if (oparg & 16) {
+ stack_pointer += -2;
+ assert(WITHIN_STACK_BOUNDS());
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int res_bool = PyObject_IsTrue(res_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
Py_DECREF(res_o);
if (res_bool < 0) JUMP_TO_ERROR();
res = res_bool ? PyStackRef_True : PyStackRef_False;
}
else {
res = PyStackRef_FromPyObjectSteal(res_o);
+ stack_pointer += -2;
+ assert(WITHIN_STACK_BOUNDS());
}
- stack_pointer[-2] = res;
- stack_pointer += -1;
+ stack_pointer[0] = res;
+ stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -2814,7 +2982,9 @@
left = stack_pointer[-2];
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int res = PySequence_Contains(right_o, left_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(left);
PyStackRef_CLOSE(right);
if (res < 0) JUMP_TO_ERROR();
@@ -2840,7 +3010,9 @@
}
STAT_INC(CONTAINS_OP, hit);
// Note: both set and frozenset use the same seq_contains method!
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int res = _PySet_Contains((PySetObject *)right_o, left_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(left);
PyStackRef_CLOSE(right);
if (res < 0) JUMP_TO_ERROR();
@@ -2865,7 +3037,9 @@
JUMP_TO_JUMP_TARGET();
}
STAT_INC(CONTAINS_OP, hit);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int res = PyDict_Contains(right_o, left_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(left);
PyStackRef_CLOSE(right);
if (res < 0) JUMP_TO_ERROR();
@@ -2885,7 +3059,9 @@
exc_value_st = stack_pointer[-2];
PyObject *exc_value = PyStackRef_AsPyObjectBorrow(exc_value_st);
PyObject *match_type = PyStackRef_AsPyObjectBorrow(match_type_st);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = _PyEval_CheckExceptStarTypeValid(tstate, match_type);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (err < 0) {
PyStackRef_CLOSE(exc_value_st);
PyStackRef_CLOSE(match_type_st);
@@ -2893,15 +3069,23 @@
}
PyObject *match_o = NULL;
PyObject *rest_o = NULL;
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int res = _PyEval_ExceptionGroupMatch(exc_value, match_type,
&match_o, &rest_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(exc_value_st);
PyStackRef_CLOSE(match_type_st);
if (res < 0) JUMP_TO_ERROR();
assert((match_o == NULL) == (rest_o == NULL));
if (match_o == NULL) JUMP_TO_ERROR();
if (!Py_IsNone(match_o)) {
+ stack_pointer += -2;
+ assert(WITHIN_STACK_BOUNDS());
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyErr_SetHandledException(match_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ stack_pointer += 2;
+ assert(WITHIN_STACK_BOUNDS());
}
rest = PyStackRef_FromPyObjectSteal(rest_o);
match = PyStackRef_FromPyObjectSteal(match_o);
@@ -2919,12 +3103,16 @@
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
assert(PyExceptionInstance_Check(left_o));
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int err = _PyEval_CheckExceptTypeValid(tstate, right_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (err < 0) {
PyStackRef_CLOSE(right);
if (true) JUMP_TO_ERROR();
}
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int res = PyErr_GivenExceptionMatches(left_o, right_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(right);
b = res ? PyStackRef_True : PyStackRef_False;
stack_pointer[-1] = b;
@@ -2939,9 +3127,11 @@
fromlist = stack_pointer[-1];
level = stack_pointer[-2];
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = _PyEval_ImportName(tstate, frame, name,
PyStackRef_AsPyObjectBorrow(fromlist),
PyStackRef_AsPyObjectBorrow(level));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(level);
PyStackRef_CLOSE(fromlist);
if (res_o == NULL) JUMP_TO_ERROR();
@@ -2958,7 +3148,9 @@
oparg = CURRENT_OPARG();
from = stack_pointer[-1];
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = _PyEval_ImportFrom(tstate, PyStackRef_AsPyObjectBorrow(from), name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (res_o == NULL) JUMP_TO_ERROR();
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[0] = res;
@@ -2991,7 +3183,9 @@
_PyStackRef len;
obj = stack_pointer[-1];
// PUSH(len(TOS))
+ _PyFrame_SetStackPointer(frame, stack_pointer);
Py_ssize_t len_i = PyObject_Length(PyStackRef_AsPyObjectBorrow(obj));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (len_i < 0) JUMP_TO_ERROR();
PyObject *len_o = PyLong_FromSsize_t(len_i);
if (len_o == NULL) JUMP_TO_ERROR();
@@ -3014,10 +3208,12 @@
// Pop TOS and TOS1. Set TOS to a tuple of attributes on success, or
// None on failure.
assert(PyTuple_CheckExact(PyStackRef_AsPyObjectBorrow(names)));
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *attrs_o = _PyEval_MatchClass(tstate,
PyStackRef_AsPyObjectBorrow(subject),
PyStackRef_AsPyObjectBorrow(type), oparg,
PyStackRef_AsPyObjectBorrow(names));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(subject);
PyStackRef_CLOSE(type);
PyStackRef_CLOSE(names);
@@ -3067,8 +3263,10 @@
keys = stack_pointer[-1];
subject = stack_pointer[-2];
// On successful match, PUSH(values). Otherwise, PUSH(None).
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *values_or_none_o = _PyEval_MatchKeys(tstate,
PyStackRef_AsPyObjectBorrow(subject), PyStackRef_AsPyObjectBorrow(keys));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (values_or_none_o == NULL) JUMP_TO_ERROR();
values_or_none = PyStackRef_FromPyObjectSteal(values_or_none_o);
stack_pointer[0] = values_or_none;
@@ -3082,7 +3280,9 @@
_PyStackRef iter;
iterable = stack_pointer[-1];
/* before: [obj]; after [getiter(obj)] */
+ _PyFrame_SetStackPointer(frame, stack_pointer);
iter = PyStackRef_FromPyObjectSteal(PyObject_GetIter(PyStackRef_AsPyObjectBorrow(iterable)));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(iterable);
if (PyStackRef_IsNull(iter)) JUMP_TO_ERROR();
stack_pointer[-1] = iter;
@@ -3100,23 +3300,29 @@
if (!(_PyFrame_GetCode(frame)->co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE))) {
/* and it is used in a 'yield from' expression of a
regular generator. */
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_SetString(tstate, PyExc_TypeError,
"cannot 'yield from' a coroutine object "
"in a non-coroutine generator");
+ stack_pointer = _PyFrame_GetStackPointer(frame);
JUMP_TO_ERROR();
}
iter = iterable;
}
- else if (PyGen_CheckExact(iterable_o)) {
- iter = iterable;
- }
else {
- /* `iterable` is not a generator. */
- iter = PyStackRef_FromPyObjectSteal(PyObject_GetIter(iterable_o));
- if (PyStackRef_IsNull(iter)) {
- JUMP_TO_ERROR();
+ if (PyGen_CheckExact(iterable_o)) {
+ iter = iterable;
+ }
+ else {
+ /* `iterable` is not a generator. */
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ iter = PyStackRef_FromPyObjectSteal(PyObject_GetIter(iterable_o));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ if (PyStackRef_IsNull(iter)) {
+ JUMP_TO_ERROR();
+ }
+ PyStackRef_CLOSE(iterable);
}
- PyStackRef_CLOSE(iterable);
}
stack_pointer[-1] = iter;
break;
@@ -3130,15 +3336,21 @@
iter = stack_pointer[-1];
/* before: [iter]; after: [iter, iter()] *or* [] (and jump over END_FOR.) */
PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *next_o = (*Py_TYPE(iter_o)->tp_iternext)(iter_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (next_o == NULL) {
if (_PyErr_Occurred(tstate)) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int matches = _PyErr_ExceptionMatches(tstate, PyExc_StopIteration);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (!matches) {
JUMP_TO_ERROR();
}
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyEval_MonitorRaise(tstate, frame, frame->instr_ptr);
_PyErr_Clear(tstate);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
}
/* iterator ended normally */
/* The translator sets the deopt target just past the matching END_FOR */
@@ -3337,19 +3549,30 @@
PyObject *owner_o = PyStackRef_AsPyObjectSteal(owner);
PyObject *name = _Py_SpecialMethods[oparg].name;
PyObject *self_or_null_o;
+ stack_pointer += -1;
+ assert(WITHIN_STACK_BOUNDS());
+ _PyFrame_SetStackPointer(frame, stack_pointer);
attr = PyStackRef_FromPyObjectSteal(_PyObject_LookupSpecialMethod(owner_o, name, &self_or_null_o));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (PyStackRef_IsNull(attr)) {
if (!_PyErr_Occurred(tstate)) {
+ stack_pointer[0] = attr;
+ stack_pointer += 1;
+ assert(WITHIN_STACK_BOUNDS());
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_Format(tstate, PyExc_TypeError,
_Py_SpecialMethods[oparg].error,
Py_TYPE(owner_o)->tp_name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ stack_pointer += -1;
+ assert(WITHIN_STACK_BOUNDS());
}
}
if (PyStackRef_IsNull(attr)) JUMP_TO_ERROR();
self_or_null = PyStackRef_FromPyObjectSteal(self_or_null_o);
- stack_pointer[-1] = attr;
- stack_pointer[0] = self_or_null;
- stack_pointer += 1;
+ stack_pointer[0] = attr;
+ stack_pointer[1] = self_or_null;
+ stack_pointer += 2;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -3389,8 +3612,10 @@
(void)lasti; // Shut up compiler warning if asserts are off
PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb};
int has_self = !PyStackRef_IsNull(exit_self);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
res = PyStackRef_FromPyObjectSteal(PyObject_Vectorcall(exit_func_o, stack + 2 - has_self,
(3 + has_self) | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (PyStackRef_IsNull(res)) JUMP_TO_ERROR();
stack_pointer[0] = res;
stack_pointer += 1;
@@ -3399,9 +3624,10 @@
}
case _PUSH_EXC_INFO: {
- _PyStackRef new_exc;
+ _PyStackRef exc;
_PyStackRef prev_exc;
- new_exc = stack_pointer[-1];
+ _PyStackRef new_exc;
+ exc = stack_pointer[-1];
_PyErr_StackItem *exc_info = tstate->exc_info;
if (exc_info->exc_value != NULL) {
prev_exc = PyStackRef_FromPyObjectSteal(exc_info->exc_value);
@@ -3409,8 +3635,9 @@
else {
prev_exc = PyStackRef_None;
}
- assert(PyStackRef_ExceptionInstanceCheck(new_exc));
- exc_info->exc_value = PyStackRef_AsPyObjectNew(new_exc);
+ assert(PyStackRef_ExceptionInstanceCheck(exc));
+ exc_info->exc_value = PyStackRef_AsPyObjectNew(exc);
+ new_exc = exc;
stack_pointer[-1] = prev_exc;
stack_pointer[0] = new_exc;
stack_pointer += 1;
@@ -3456,8 +3683,8 @@
assert(descr != NULL);
assert(_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR));
attr = PyStackRef_FromPyObjectNew(descr);
- stack_pointer[-1] = attr;
self = owner;
+ stack_pointer[-1] = attr;
stack_pointer[0] = self;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
@@ -3477,8 +3704,8 @@
assert(descr != NULL);
assert(_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR));
attr = PyStackRef_FromPyObjectNew(descr);
- stack_pointer[-1] = attr;
self = owner;
+ stack_pointer[-1] = attr;
stack_pointer[0] = self;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
@@ -3542,8 +3769,8 @@
assert(descr != NULL);
assert(_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR));
attr = PyStackRef_FromPyObjectNew(descr);
- stack_pointer[-1] = attr;
self = owner;
+ stack_pointer[-1] = attr;
stack_pointer[0] = self;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
@@ -3553,25 +3780,23 @@
case _MAYBE_EXPAND_METHOD: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
- _PyStackRef func;
+ _PyStackRef *callable;
+ _PyStackRef *func;
_PyStackRef *maybe_self;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
+ func = &stack_pointer[-2 - oparg];
maybe_self = &stack_pointer[-1 - oparg];
- if (PyStackRef_TYPE(callable) == &PyMethod_Type && PyStackRef_IsNull(self_or_null[0])) {
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ if (PyStackRef_TYPE(callable[0]) == &PyMethod_Type && PyStackRef_IsNull(self_or_null[0])) {
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
PyObject *self = ((PyMethodObject *)callable_o)->im_self;
maybe_self[0] = PyStackRef_FromPyObjectNew(self);
PyObject *method = ((PyMethodObject *)callable_o)->im_func;
- func = PyStackRef_FromPyObjectNew(method);
- stack_pointer[-2 - oparg] = func;
- PyStackRef_CLOSE(callable);
- }
- else {
- func = callable;
+ _PyStackRef temp = callable[0];
+ func[0] = PyStackRef_FromPyObjectNew(method);
+ PyStackRef_CLOSE(temp);
}
break;
}
@@ -3583,13 +3808,13 @@
case _PY_FRAME_GENERAL: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyInterpreterFrame *new_frame;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ callable = &stack_pointer[-2 - oparg];
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
// oparg counts all of the args, but *not* self:
int total_args = oparg;
if (!PyStackRef_IsNull(self_or_null[0])) {
@@ -3599,17 +3824,19 @@
assert(Py_TYPE(callable_o) == &PyFunction_Type);
int code_flags = ((PyCodeObject*)PyFunction_GET_CODE(callable_o))->co_flags;
PyObject *locals = code_flags & CO_OPTIMIZED ? NULL : Py_NewRef(PyFunction_GET_GLOBALS(callable_o));
- new_frame = _PyEvalFramePushAndInit(
- tstate, callable, locals,
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ _PyInterpreterFrame *temp = _PyEvalFramePushAndInit(
+ tstate, callable[0], locals,
args, total_args, NULL, frame
);
- // The frame has stolen all the arguments from the stack,
- // so there is no need to clean them up.
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ // The frame has stolen all the arguments from the stack.
stack_pointer += -2 - oparg;
assert(WITHIN_STACK_BOUNDS());
- if (new_frame == NULL) {
+ if (temp == NULL) {
JUMP_TO_ERROR();
}
+ new_frame = temp;
stack_pointer[0].bits = (uintptr_t)new_frame;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
@@ -3617,11 +3844,11 @@
}
case _CHECK_FUNCTION_VERSION: {
- _PyStackRef callable;
+ _PyStackRef *callable;
oparg = CURRENT_OPARG();
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
uint32_t func_version = (uint32_t)CURRENT_OPERAND();
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
if (!PyFunction_Check(callable_o)) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
@@ -3636,12 +3863,12 @@
case _CHECK_METHOD_VERSION: {
_PyStackRef *null;
- _PyStackRef callable;
+ _PyStackRef *callable;
oparg = CURRENT_OPARG();
null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
uint32_t func_version = (uint32_t)CURRENT_OPERAND();
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
if (Py_TYPE(callable_o) != &PyMethod_Type) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
@@ -3664,29 +3891,30 @@
case _EXPAND_METHOD: {
_PyStackRef *null;
- _PyStackRef callable;
- _PyStackRef method;
+ _PyStackRef *callable;
+ _PyStackRef *method;
_PyStackRef *self;
oparg = CURRENT_OPARG();
null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
+ method = &stack_pointer[-2 - oparg];
self = &stack_pointer[-1 - oparg];
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
assert(PyStackRef_IsNull(null[0]));
assert(Py_TYPE(callable_o) == &PyMethod_Type);
self[0] = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_self);
- method = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
- stack_pointer[-2 - oparg] = method;
- assert(PyStackRef_FunctionCheck(method));
- PyStackRef_CLOSE(callable);
+ _PyStackRef temp = callable[0];
+ method[0] = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
+ assert(PyStackRef_FunctionCheck(method[0]));
+ PyStackRef_CLOSE(temp);
break;
}
case _CHECK_IS_NOT_PY_CALLABLE: {
- _PyStackRef callable;
+ _PyStackRef *callable;
oparg = CURRENT_OPARG();
- callable = stack_pointer[-2 - oparg];
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ callable = &stack_pointer[-2 - oparg];
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
if (PyFunction_Check(callable_o)) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
@@ -3701,16 +3929,16 @@
case _CALL_NON_PY_GENERAL: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyStackRef res;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
#if TIER_ONE
assert(opcode != INSTRUMENTED_CALL);
#endif
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
int total_args = oparg;
if (!PyStackRef_IsNull(self_or_null[0])) {
args--;
@@ -3719,20 +3947,22 @@
/* Callable is not a normal Python function */
STACKREFS_TO_PYOBJECTS(args, total_args, args_o);
if (CONVERSION_FAILED(args_o)) {
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
PyStackRef_CLOSE(self_or_null[0]);
for (int _i = oparg; --_i >= 0;) {
PyStackRef_CLOSE(args[_i]);
}
if (true) JUMP_TO_ERROR();
}
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = PyObject_Vectorcall(
callable_o, args_o,
total_args | PY_VECTORCALL_ARGUMENTS_OFFSET,
NULL);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
STACKREFS_TO_PYOBJECTS_CLEANUP(args_o);
assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
for (int i = 0; i < total_args; i++) {
PyStackRef_CLOSE(args[i]);
}
@@ -3746,15 +3976,15 @@
case _CHECK_CALL_BOUND_METHOD_EXACT_ARGS: {
_PyStackRef *null;
- _PyStackRef callable;
+ _PyStackRef *callable;
oparg = CURRENT_OPARG();
null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
if (!PyStackRef_IsNull(null[0])) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
- if (Py_TYPE(PyStackRef_AsPyObjectBorrow(callable)) != &PyMethod_Type) {
+ if (Py_TYPE(PyStackRef_AsPyObjectBorrow(callable[0])) != &PyMethod_Type) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
@@ -3762,18 +3992,21 @@
}
case _INIT_CALL_BOUND_METHOD_EXACT_ARGS: {
- _PyStackRef callable;
- _PyStackRef func;
+ _PyStackRef *null;
+ _PyStackRef *callable;
+ _PyStackRef *func;
_PyStackRef *self;
oparg = CURRENT_OPARG();
- callable = stack_pointer[-2 - oparg];
+ null = &stack_pointer[-1 - oparg];
+ callable = &stack_pointer[-2 - oparg];
+ func = &stack_pointer[-2 - oparg];
self = &stack_pointer[-1 - oparg];
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
STAT_INC(CALL, hit);
self[0] = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_self);
- func = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
- stack_pointer[-2 - oparg] = func;
- PyStackRef_CLOSE(callable);
+ _PyStackRef temp = callable[0];
+ func[0] = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
+ PyStackRef_CLOSE(temp);
break;
}
@@ -3787,11 +4020,11 @@
case _CHECK_FUNCTION_EXACT_ARGS: {
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
oparg = CURRENT_OPARG();
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ callable = &stack_pointer[-2 - oparg];
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
assert(PyFunction_Check(callable_o));
PyFunctionObject *func = (PyFunctionObject *)callable_o;
PyCodeObject *code = (PyCodeObject *)func->func_code;
@@ -3803,10 +4036,10 @@
}
case _CHECK_STACK_SPACE: {
- _PyStackRef callable;
+ _PyStackRef *callable;
oparg = CURRENT_OPARG();
- callable = stack_pointer[-2 - oparg];
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ callable = &stack_pointer[-2 - oparg];
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
PyFunctionObject *func = (PyFunctionObject *)callable_o;
PyCodeObject *code = (PyCodeObject *)func->func_code;
if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
@@ -3823,16 +4056,16 @@
case _INIT_CALL_PY_EXACT_ARGS_0: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyInterpreterFrame *new_frame;
oparg = 0;
assert(oparg == CURRENT_OPARG());
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
int has_self = !PyStackRef_IsNull(self_or_null[0]);
STAT_INC(CALL, hit);
- new_frame = _PyFrame_PushUnchecked(tstate, callable, oparg + has_self, frame);
+ new_frame = _PyFrame_PushUnchecked(tstate, callable[0], oparg + has_self, frame);
_PyStackRef *first_non_self_local = new_frame->localsplus + has_self;
new_frame->localsplus[0] = self_or_null[0];
for (int i = 0; i < oparg; i++) {
@@ -3847,16 +4080,16 @@
case _INIT_CALL_PY_EXACT_ARGS_1: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyInterpreterFrame *new_frame;
oparg = 1;
assert(oparg == CURRENT_OPARG());
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
int has_self = !PyStackRef_IsNull(self_or_null[0]);
STAT_INC(CALL, hit);
- new_frame = _PyFrame_PushUnchecked(tstate, callable, oparg + has_self, frame);
+ new_frame = _PyFrame_PushUnchecked(tstate, callable[0], oparg + has_self, frame);
_PyStackRef *first_non_self_local = new_frame->localsplus + has_self;
new_frame->localsplus[0] = self_or_null[0];
for (int i = 0; i < oparg; i++) {
@@ -3871,16 +4104,16 @@
case _INIT_CALL_PY_EXACT_ARGS_2: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyInterpreterFrame *new_frame;
oparg = 2;
assert(oparg == CURRENT_OPARG());
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
int has_self = !PyStackRef_IsNull(self_or_null[0]);
STAT_INC(CALL, hit);
- new_frame = _PyFrame_PushUnchecked(tstate, callable, oparg + has_self, frame);
+ new_frame = _PyFrame_PushUnchecked(tstate, callable[0], oparg + has_self, frame);
_PyStackRef *first_non_self_local = new_frame->localsplus + has_self;
new_frame->localsplus[0] = self_or_null[0];
for (int i = 0; i < oparg; i++) {
@@ -3895,16 +4128,16 @@
case _INIT_CALL_PY_EXACT_ARGS_3: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyInterpreterFrame *new_frame;
oparg = 3;
assert(oparg == CURRENT_OPARG());
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
int has_self = !PyStackRef_IsNull(self_or_null[0]);
STAT_INC(CALL, hit);
- new_frame = _PyFrame_PushUnchecked(tstate, callable, oparg + has_self, frame);
+ new_frame = _PyFrame_PushUnchecked(tstate, callable[0], oparg + has_self, frame);
_PyStackRef *first_non_self_local = new_frame->localsplus + has_self;
new_frame->localsplus[0] = self_or_null[0];
for (int i = 0; i < oparg; i++) {
@@ -3919,16 +4152,16 @@
case _INIT_CALL_PY_EXACT_ARGS_4: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyInterpreterFrame *new_frame;
oparg = 4;
assert(oparg == CURRENT_OPARG());
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
int has_self = !PyStackRef_IsNull(self_or_null[0]);
STAT_INC(CALL, hit);
- new_frame = _PyFrame_PushUnchecked(tstate, callable, oparg + has_self, frame);
+ new_frame = _PyFrame_PushUnchecked(tstate, callable[0], oparg + has_self, frame);
_PyStackRef *first_non_self_local = new_frame->localsplus + has_self;
new_frame->localsplus[0] = self_or_null[0];
for (int i = 0; i < oparg; i++) {
@@ -3943,15 +4176,15 @@
case _INIT_CALL_PY_EXACT_ARGS: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyInterpreterFrame *new_frame;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
int has_self = !PyStackRef_IsNull(self_or_null[0]);
STAT_INC(CALL, hit);
- new_frame = _PyFrame_PushUnchecked(tstate, callable, oparg + has_self, frame);
+ new_frame = _PyFrame_PushUnchecked(tstate, callable[0], oparg + has_self, frame);
_PyStackRef *first_non_self_local = new_frame->localsplus + has_self;
new_frame->localsplus[0] = self_or_null[0];
for (int i = 0; i < oparg; i++) {
@@ -3969,12 +4202,13 @@
// Write it out explicitly because it's subtly different.
// Eventually this should be the only occurrence of this code.
assert(tstate->interp->eval_frame == NULL);
+ _PyInterpreterFrame *temp = new_frame;
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
_PyFrame_SetStackPointer(frame, stack_pointer);
assert(new_frame->previous == frame || new_frame->previous->previous == frame);
CALL_STAT_INC(inlined_py_calls);
- frame = tstate->current_frame = new_frame;
+ frame = tstate->current_frame = temp;
tstate->py_recursion_remaining--;
LOAD_SP();
LOAD_IP(0);
@@ -4032,7 +4266,9 @@
JUMP_TO_JUMP_TARGET();
}
STAT_INC(CALL, hit);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
res = PyStackRef_FromPyObjectSteal(PyObject_Str(arg_o));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(arg);
if (PyStackRef_IsNull(res)) JUMP_TO_ERROR();
stack_pointer[-3] = res;
@@ -4062,7 +4298,9 @@
JUMP_TO_JUMP_TARGET();
}
STAT_INC(CALL, hit);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
res = PyStackRef_FromPyObjectSteal(PySequence_Tuple(arg_o));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(arg);
if (PyStackRef_IsNull(res)) JUMP_TO_ERROR();
stack_pointer[-3] = res;
@@ -4073,17 +4311,19 @@
case _CHECK_AND_ALLOCATE_OBJECT: {
_PyStackRef *args;
- _PyStackRef null;
- _PyStackRef callable;
- _PyStackRef self;
- _PyStackRef init;
+ _PyStackRef *null;
+ _PyStackRef *callable;
+ _PyStackRef *init;
+ _PyStackRef *self;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
- null = stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ null = &stack_pointer[-1 - oparg];
+ callable = &stack_pointer[-2 - oparg];
+ init = &stack_pointer[-2 - oparg];
+ self = &stack_pointer[-1 - oparg];
uint32_t type_version = (uint32_t)CURRENT_OPERAND();
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
- if (!PyStackRef_IsNull(null)) {
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
+ if (!PyStackRef_IsNull(null[0])) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
@@ -4105,35 +4345,39 @@
JUMP_TO_JUMP_TARGET();
}
STAT_INC(CALL, hit);
- self = PyStackRef_FromPyObjectSteal(_PyType_NewManagedObject(tp));
- if (PyStackRef_IsNull(self)) {
+ PyObject *self_o = _PyType_NewManagedObject(tp);
+ if (self_o == NULL) {
JUMP_TO_ERROR();
}
- PyStackRef_CLOSE(callable);
- init = PyStackRef_FromPyObjectNew(init_func);
- stack_pointer[-1 - oparg] = init;
- stack_pointer[-2 - oparg] = self;
+ self[0] = PyStackRef_FromPyObjectSteal(self_o);
+ _PyStackRef temp = callable[0];
+ init[0] = PyStackRef_FromPyObjectNew(init_func);
+ PyStackRef_CLOSE(temp);
break;
}
case _CREATE_INIT_FRAME: {
_PyStackRef *args;
- _PyStackRef init;
- _PyStackRef self;
+ _PyStackRef *self;
+ _PyStackRef *init;
_PyInterpreterFrame *init_frame;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
- init = stack_pointer[-1 - oparg];
- self = stack_pointer[-2 - oparg];
+ self = &stack_pointer[-1 - oparg];
+ init = &stack_pointer[-2 - oparg];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyInterpreterFrame *shim = _PyFrame_PushTrampolineUnchecked(
tstate, (PyCodeObject *)&_Py_InitCleanup, 1, frame);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
assert(_PyCode_CODE(_PyFrame_GetCode(shim))[0].op.code == EXIT_INIT_CHECK);
/* Push self onto stack of shim */
- shim->localsplus[0] = PyStackRef_DUP(self);
- args[-1] = self;
+ shim->localsplus[0] = PyStackRef_DUP(self[0]);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
init_frame = _PyEvalFramePushAndInit(
- tstate, init, NULL, args-1, oparg+1, NULL, shim);
- stack_pointer += -2 - oparg;
+ tstate, init[0], NULL, args-1, oparg+1, NULL, shim);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ stack_pointer[-2 - oparg].bits = (uintptr_t)init_frame;
+ stack_pointer += -1 - oparg;
assert(WITHIN_STACK_BOUNDS());
if (init_frame == NULL) {
_PyEval_FrameClearAndPop(tstate, shim);
@@ -4144,9 +4388,6 @@
* We don't check recursion depth here,
* as it will be checked after start_frame */
tstate->py_recursion_remaining--;
- stack_pointer[0].bits = (uintptr_t)init_frame;
- stack_pointer += 1;
- assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -4155,9 +4396,11 @@
should_be_none = stack_pointer[-1];
assert(STACK_LEVEL() == 2);
if (!PyStackRef_Is(should_be_none, PyStackRef_None)) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyErr_Format(PyExc_TypeError,
"__init__() should return None, not '%.200s'",
Py_TYPE(PyStackRef_AsPyObjectBorrow(should_be_none))->tp_name);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
JUMP_TO_ERROR();
}
stack_pointer += -1;
@@ -4168,13 +4411,13 @@
case _CALL_BUILTIN_CLASS: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyStackRef res;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ callable = &stack_pointer[-2 - oparg];
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
int total_args = oparg;
if (!PyStackRef_IsNull(self_or_null[0])) {
args--;
@@ -4192,20 +4435,22 @@
STAT_INC(CALL, hit);
STACKREFS_TO_PYOBJECTS(args, total_args, args_o);
if (CONVERSION_FAILED(args_o)) {
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
PyStackRef_CLOSE(self_or_null[0]);
for (int _i = oparg; --_i >= 0;) {
PyStackRef_CLOSE(args[_i]);
}
if (true) JUMP_TO_ERROR();
}
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = tp->tp_vectorcall((PyObject *)tp, args_o, total_args, NULL);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
STACKREFS_TO_PYOBJECTS_CLEANUP(args_o);
/* Free the arguments. */
for (int i = 0; i < total_args; i++) {
PyStackRef_CLOSE(args[i]);
}
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
if (res_o == NULL) JUMP_TO_ERROR();
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-2 - oparg] = res;
@@ -4217,14 +4462,14 @@
case _CALL_BUILTIN_O: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyStackRef res;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
/* Builtin METH_O functions */
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
int total_args = oparg;
if (!PyStackRef_IsNull(self_or_null[0])) {
args--;
@@ -4251,11 +4496,13 @@
PyCFunction cfunc = PyCFunction_GET_FUNCTION(callable_o);
_PyStackRef arg = args[0];
_Py_EnterRecursiveCallTstateUnchecked(tstate);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = _PyCFunction_TrampolineCall(cfunc, PyCFunction_GET_SELF(callable_o), PyStackRef_AsPyObjectBorrow(arg));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
_Py_LeaveRecursiveCallTstate(tstate);
assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
PyStackRef_CLOSE(arg);
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
if (res_o == NULL) JUMP_TO_ERROR();
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-2 - oparg] = res;
@@ -4267,14 +4514,14 @@
case _CALL_BUILTIN_FAST: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyStackRef res;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
/* Builtin METH_FASTCALL functions, without keywords */
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
int total_args = oparg;
if (!PyStackRef_IsNull(self_or_null[0])) {
args--;
@@ -4293,24 +4540,26 @@
/* res = func(self, args, nargs) */
STACKREFS_TO_PYOBJECTS(args, total_args, args_o);
if (CONVERSION_FAILED(args_o)) {
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
PyStackRef_CLOSE(self_or_null[0]);
for (int _i = oparg; --_i >= 0;) {
PyStackRef_CLOSE(args[_i]);
}
if (true) JUMP_TO_ERROR();
}
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = ((PyCFunctionFast)(void(*)(void))cfunc)(
PyCFunction_GET_SELF(callable_o),
args_o,
total_args);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
STACKREFS_TO_PYOBJECTS_CLEANUP(args_o);
assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
/* Free the arguments. */
for (int i = 0; i < total_args; i++) {
PyStackRef_CLOSE(args[i]);
}
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
if (res_o == NULL) JUMP_TO_ERROR();
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-2 - oparg] = res;
@@ -4322,14 +4571,14 @@
case _CALL_BUILTIN_FAST_WITH_KEYWORDS: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyStackRef res;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
/* Builtin METH_FASTCALL | METH_KEYWORDS functions */
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
int total_args = oparg;
if (!PyStackRef_IsNull(self_or_null[0])) {
args--;
@@ -4345,26 +4594,30 @@
}
STAT_INC(CALL, hit);
/* res = func(self, args, nargs, kwnames) */
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyCFunctionFastWithKeywords cfunc =
(PyCFunctionFastWithKeywords)(void(*)(void))
PyCFunction_GET_FUNCTION(callable_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
STACKREFS_TO_PYOBJECTS(args, total_args, args_o);
if (CONVERSION_FAILED(args_o)) {
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
PyStackRef_CLOSE(self_or_null[0]);
for (int _i = oparg; --_i >= 0;) {
PyStackRef_CLOSE(args[_i]);
}
if (true) JUMP_TO_ERROR();
}
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = cfunc(PyCFunction_GET_SELF(callable_o), args_o, total_args, NULL);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
STACKREFS_TO_PYOBJECTS_CLEANUP(args_o);
assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
/* Free the arguments. */
for (int i = 0; i < total_args; i++) {
PyStackRef_CLOSE(args[i]);
}
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
if (res_o == NULL) JUMP_TO_ERROR();
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-2 - oparg] = res;
@@ -4376,14 +4629,14 @@
case _CALL_LEN: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyStackRef res;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
/* len(o) */
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
int total_args = oparg;
if (!PyStackRef_IsNull(self_or_null[0])) {
args--;
@@ -4401,7 +4654,9 @@
STAT_INC(CALL, hit);
_PyStackRef arg_stackref = args[0];
PyObject *arg = PyStackRef_AsPyObjectBorrow(arg_stackref);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
Py_ssize_t len_i = PyObject_Length(arg);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (len_i < 0) {
JUMP_TO_ERROR();
}
@@ -4410,7 +4665,7 @@
if (res_o == NULL) {
GOTO_ERROR(error);
}
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
PyStackRef_CLOSE(arg_stackref);
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-2 - oparg] = res;
@@ -4422,14 +4677,14 @@
case _CALL_ISINSTANCE: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyStackRef res;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
/* isinstance(o, o2) */
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
int total_args = oparg;
if (!PyStackRef_IsNull(self_or_null[0])) {
args--;
@@ -4447,7 +4702,9 @@
STAT_INC(CALL, hit);
_PyStackRef cls_stackref = args[1];
_PyStackRef inst_stackref = args[0];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int retval = PyObject_IsInstance(PyStackRef_AsPyObjectBorrow(inst_stackref), PyStackRef_AsPyObjectBorrow(cls_stackref));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (retval < 0) {
JUMP_TO_ERROR();
}
@@ -4455,7 +4712,7 @@
assert((!PyStackRef_IsNull(res)) ^ (_PyErr_Occurred(tstate) != NULL));
PyStackRef_CLOSE(inst_stackref);
PyStackRef_CLOSE(cls_stackref);
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
stack_pointer[-2 - oparg] = res;
stack_pointer += -1 - oparg;
assert(WITHIN_STACK_BOUNDS());
@@ -4502,13 +4759,13 @@
case _CALL_METHOD_DESCRIPTOR_O: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyStackRef res;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ callable = &stack_pointer[-2 - oparg];
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
int total_args = oparg;
if (!PyStackRef_IsNull(self_or_null[0])) {
args--;
@@ -4543,14 +4800,16 @@
STAT_INC(CALL, hit);
PyCFunction cfunc = meth->ml_meth;
_Py_EnterRecursiveCallTstateUnchecked(tstate);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = _PyCFunction_TrampolineCall(cfunc,
PyStackRef_AsPyObjectBorrow(self_stackref),
PyStackRef_AsPyObjectBorrow(arg_stackref));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
_Py_LeaveRecursiveCallTstate(tstate);
assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
PyStackRef_CLOSE(self_stackref);
PyStackRef_CLOSE(arg_stackref);
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
if (res_o == NULL) JUMP_TO_ERROR();
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-2 - oparg] = res;
@@ -4562,13 +4821,13 @@
case _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyStackRef res;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ callable = &stack_pointer[-2 - oparg];
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
int total_args = oparg;
if (!PyStackRef_IsNull(self_or_null[0])) {
args--;
@@ -4592,25 +4851,27 @@
}
STAT_INC(CALL, hit);
int nargs = total_args - 1;
- PyCFunctionFastWithKeywords cfunc =
- (PyCFunctionFastWithKeywords)(void(*)(void))meth->ml_meth;
STACKREFS_TO_PYOBJECTS(args, total_args, args_o);
if (CONVERSION_FAILED(args_o)) {
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
PyStackRef_CLOSE(self_or_null[0]);
for (int _i = oparg; --_i >= 0;) {
PyStackRef_CLOSE(args[_i]);
}
if (true) JUMP_TO_ERROR();
}
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ PyCFunctionFastWithKeywords cfunc =
+ (PyCFunctionFastWithKeywords)(void(*)(void))meth->ml_meth;
PyObject *res_o = cfunc(self, (args_o + 1), nargs, NULL);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
STACKREFS_TO_PYOBJECTS_CLEANUP(args_o);
assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
/* Free the arguments. */
for (int i = 0; i < total_args; i++) {
PyStackRef_CLOSE(args[i]);
}
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
if (res_o == NULL) JUMP_TO_ERROR();
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-2 - oparg] = res;
@@ -4622,14 +4883,14 @@
case _CALL_METHOD_DESCRIPTOR_NOARGS: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyStackRef res;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-2 - oparg];
assert(oparg == 0 || oparg == 1);
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
int total_args = oparg;
if (!PyStackRef_IsNull(self_or_null[0])) {
args--;
@@ -4663,11 +4924,13 @@
STAT_INC(CALL, hit);
PyCFunction cfunc = meth->ml_meth;
_Py_EnterRecursiveCallTstateUnchecked(tstate);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = _PyCFunction_TrampolineCall(cfunc, self, NULL);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
_Py_LeaveRecursiveCallTstate(tstate);
assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
PyStackRef_CLOSE(self_stackref);
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
if (res_o == NULL) JUMP_TO_ERROR();
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-2 - oparg] = res;
@@ -4679,13 +4942,13 @@
case _CALL_METHOD_DESCRIPTOR_FAST: {
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyStackRef res;
oparg = CURRENT_OPARG();
args = &stack_pointer[-oparg];
self_or_null = &stack_pointer[-1 - oparg];
- callable = stack_pointer[-2 - oparg];
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ callable = &stack_pointer[-2 - oparg];
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
int total_args = oparg;
if (!PyStackRef_IsNull(self_or_null[0])) {
args--;
@@ -4708,26 +4971,28 @@
JUMP_TO_JUMP_TARGET();
}
STAT_INC(CALL, hit);
- PyCFunctionFast cfunc =
- (PyCFunctionFast)(void(*)(void))meth->ml_meth;
int nargs = total_args - 1;
STACKREFS_TO_PYOBJECTS(args, total_args, args_o);
if (CONVERSION_FAILED(args_o)) {
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
PyStackRef_CLOSE(self_or_null[0]);
for (int _i = oparg; --_i >= 0;) {
PyStackRef_CLOSE(args[_i]);
}
if (true) JUMP_TO_ERROR();
}
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ PyCFunctionFast cfunc =
+ (PyCFunctionFast)(void(*)(void))meth->ml_meth;
PyObject *res_o = cfunc(self, (args_o + 1), nargs);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
STACKREFS_TO_PYOBJECTS_CLEANUP(args_o);
assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
/* Clear the stack of the arguments. */
for (int i = 0; i < total_args; i++) {
PyStackRef_CLOSE(args[i]);
}
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
if (res_o == NULL) JUMP_TO_ERROR();
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-2 - oparg] = res;
@@ -4738,20 +5003,49 @@
/* _INSTRUMENTED_CALL_KW is not a viable micro-op for tier 2 because it is instrumented */
+ case _MAYBE_EXPAND_METHOD_KW: {
+ _PyStackRef kwnames_in;
+ _PyStackRef *args;
+ _PyStackRef *self_or_null;
+ _PyStackRef *callable;
+ _PyStackRef *func;
+ _PyStackRef *maybe_self;
+ _PyStackRef kwnames_out;
+ oparg = CURRENT_OPARG();
+ kwnames_in = stack_pointer[-1];
+ args = &stack_pointer[-1 - oparg];
+ self_or_null = &stack_pointer[-2 - oparg];
+ callable = &stack_pointer[-3 - oparg];
+ func = &stack_pointer[-3 - oparg];
+ maybe_self = &stack_pointer[-2 - oparg];
+ if (PyStackRef_TYPE(callable[0]) == &PyMethod_Type && PyStackRef_IsNull(self_or_null[0])) {
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
+ PyObject *self = ((PyMethodObject *)callable_o)->im_self;
+ maybe_self[0] = PyStackRef_FromPyObjectNew(self);
+ PyObject *method = ((PyMethodObject *)callable_o)->im_func;
+ _PyStackRef temp = callable[0];
+ func[0] = PyStackRef_FromPyObjectNew(method);
+ PyStackRef_CLOSE(temp);
+ }
+ kwnames_out = kwnames_in;
+ stack_pointer[-1] = kwnames_out;
+ break;
+ }
+
/* _DO_CALL_KW is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */
case _PY_FRAME_KW: {
_PyStackRef kwnames;
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyInterpreterFrame *new_frame;
oparg = CURRENT_OPARG();
kwnames = stack_pointer[-1];
args = &stack_pointer[-1 - oparg];
self_or_null = &stack_pointer[-2 - oparg];
- callable = stack_pointer[-3 - oparg];
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ callable = &stack_pointer[-3 - oparg];
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
// oparg counts all of the args, but *not* self:
int total_args = oparg;
if (!PyStackRef_IsNull(self_or_null[0])) {
@@ -4763,30 +5057,30 @@
assert(Py_TYPE(callable_o) == &PyFunction_Type);
int code_flags = ((PyCodeObject*)PyFunction_GET_CODE(callable_o))->co_flags;
PyObject *locals = code_flags & CO_OPTIMIZED ? NULL : Py_NewRef(PyFunction_GET_GLOBALS(callable_o));
+ _PyFrame_SetStackPointer(frame, stack_pointer);
new_frame = _PyEvalFramePushAndInit(
- tstate, callable, locals,
+ tstate, callable[0], locals,
args, positional_args, kwnames_o, frame
);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(kwnames);
// The frame has stolen all the arguments from the stack,
// so there is no need to clean them up.
- stack_pointer += -3 - oparg;
+ stack_pointer[-3 - oparg].bits = (uintptr_t)new_frame;
+ stack_pointer += -2 - oparg;
assert(WITHIN_STACK_BOUNDS());
if (new_frame == NULL) {
JUMP_TO_ERROR();
}
- stack_pointer[0].bits = (uintptr_t)new_frame;
- stack_pointer += 1;
- assert(WITHIN_STACK_BOUNDS());
break;
}
case _CHECK_FUNCTION_VERSION_KW: {
- _PyStackRef callable;
+ _PyStackRef *callable;
oparg = CURRENT_OPARG();
- callable = stack_pointer[-3 - oparg];
+ callable = &stack_pointer[-3 - oparg];
uint32_t func_version = (uint32_t)CURRENT_OPERAND();
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
if (!PyFunction_Check(callable_o)) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
@@ -4801,12 +5095,12 @@
case _CHECK_METHOD_VERSION_KW: {
_PyStackRef *null;
- _PyStackRef callable;
+ _PyStackRef *callable;
oparg = CURRENT_OPARG();
null = &stack_pointer[-2 - oparg];
- callable = stack_pointer[-3 - oparg];
+ callable = &stack_pointer[-3 - oparg];
uint32_t func_version = (uint32_t)CURRENT_OPERAND();
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
if (Py_TYPE(callable_o) != &PyMethod_Type) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
@@ -4828,33 +5122,31 @@
}
case _EXPAND_METHOD_KW: {
- _PyStackRef kwnames;
_PyStackRef *null;
- _PyStackRef callable;
- _PyStackRef method;
+ _PyStackRef *callable;
+ _PyStackRef *method;
_PyStackRef *self;
oparg = CURRENT_OPARG();
- kwnames = stack_pointer[-1];
null = &stack_pointer[-2 - oparg];
- callable = stack_pointer[-3 - oparg];
+ callable = &stack_pointer[-3 - oparg];
+ method = &stack_pointer[-3 - oparg];
self = &stack_pointer[-2 - oparg];
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ _PyStackRef callable_s = callable[0];
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable_s);
assert(PyStackRef_IsNull(null[0]));
assert(Py_TYPE(callable_o) == &PyMethod_Type);
self[0] = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_self);
- method = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
- stack_pointer[-3 - oparg] = method;
- assert(PyStackRef_FunctionCheck(method));
- PyStackRef_CLOSE(callable);
- stack_pointer[-1] = kwnames;
+ method[0] = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
+ assert(PyStackRef_FunctionCheck(method[0]));
+ PyStackRef_CLOSE(callable_s);
break;
}
case _CHECK_IS_NOT_PY_CALLABLE_KW: {
- _PyStackRef callable;
+ _PyStackRef *callable;
oparg = CURRENT_OPARG();
- callable = stack_pointer[-3 - oparg];
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ callable = &stack_pointer[-3 - oparg];
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
if (PyFunction_Check(callable_o)) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
@@ -4870,17 +5162,17 @@
_PyStackRef kwnames;
_PyStackRef *args;
_PyStackRef *self_or_null;
- _PyStackRef callable;
+ _PyStackRef *callable;
_PyStackRef res;
oparg = CURRENT_OPARG();
kwnames = stack_pointer[-1];
args = &stack_pointer[-1 - oparg];
self_or_null = &stack_pointer[-2 - oparg];
- callable = stack_pointer[-3 - oparg];
+ callable = &stack_pointer[-3 - oparg];
#if TIER_ONE
assert(opcode != INSTRUMENTED_CALL);
#endif
- PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
+ PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
int total_args = oparg;
if (!PyStackRef_IsNull(self_or_null[0])) {
args--;
@@ -4889,7 +5181,7 @@
/* Callable is not a normal Python function */
STACKREFS_TO_PYOBJECTS(args, total_args, args_o);
if (CONVERSION_FAILED(args_o)) {
- PyStackRef_CLOSE(callable);
+ PyStackRef_CLOSE(callable[0]);
PyStackRef_CLOSE(self_or_null[0]);
for (int _i = oparg; --_i >= 0;) {
PyStackRef_CLOSE(args[_i]);
@@ -4899,17 +5191,19 @@
}
PyObject *kwnames_o = PyStackRef_AsPyObjectBorrow(kwnames);
int positional_args = total_args - (int)PyTuple_GET_SIZE(kwnames_o);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = PyObject_Vectorcall(
callable_o, args_o,
positional_args | PY_VECTORCALL_ARGUMENTS_OFFSET,
kwnames_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(kwnames);
STACKREFS_TO_PYOBJECTS_CLEANUP(args_o);
assert((res_o != NULL) ^ (_PyErr_Occurred(tstate) != NULL));
- PyStackRef_CLOSE(callable);
for (int i = 0; i < total_args; i++) {
PyStackRef_CLOSE(args[i]);
}
+ PyStackRef_CLOSE(callable[0]);
if (res_o == NULL) JUMP_TO_ERROR();
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-3 - oparg] = res;
@@ -4920,19 +5214,55 @@
/* _INSTRUMENTED_CALL_FUNCTION_EX is not a viable micro-op for tier 2 because it is instrumented */
- /* __DO_CALL_FUNCTION_EX is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */
+ case _MAKE_CALLARGS_A_TUPLE: {
+ _PyStackRef kwargs_in = PyStackRef_NULL;
+ _PyStackRef callargs;
+ _PyStackRef func;
+ _PyStackRef tuple;
+ _PyStackRef kwargs_out = PyStackRef_NULL;
+ oparg = CURRENT_OPARG();
+ if (oparg & 1) { kwargs_in = stack_pointer[-(oparg & 1)]; }
+ callargs = stack_pointer[-1 - (oparg & 1)];
+ func = stack_pointer[-3 - (oparg & 1)];
+ PyObject *callargs_o = PyStackRef_AsPyObjectBorrow(callargs);
+ if (PyTuple_CheckExact(callargs_o)) {
+ tuple = callargs;
+ }
+ else {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ int err = _Py_Check_ArgsIterable(tstate, PyStackRef_AsPyObjectBorrow(func), callargs_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ if (err < 0) {
+ JUMP_TO_ERROR();
+ }
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ PyObject *tuple_o = PySequence_Tuple(callargs_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ if (tuple_o == NULL) {
+ JUMP_TO_ERROR();
+ }
+ PyStackRef_CLOSE(callargs);
+ tuple = PyStackRef_FromPyObjectSteal(tuple_o);
+ }
+ kwargs_out = kwargs_in;
+ stack_pointer[-1 - (oparg & 1)] = tuple;
+ if (oparg & 1) stack_pointer[-(oparg & 1)] = kwargs_out;
+ break;
+ }
+
+ /* _DO_CALL_FUNCTION_EX is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */
case _MAKE_FUNCTION: {
_PyStackRef codeobj_st;
_PyStackRef func;
codeobj_st = stack_pointer[-1];
PyObject *codeobj = PyStackRef_AsPyObjectBorrow(codeobj_st);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyFunctionObject *func_obj = (PyFunctionObject *)
PyFunction_New(codeobj, GLOBALS());
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(codeobj_st);
- if (func_obj == NULL) {
- JUMP_TO_ERROR();
- }
+ if (func_obj == NULL) JUMP_TO_ERROR();
_PyFunction_SetVersion(
func_obj, ((PyCodeObject *)codeobj)->co_version);
func = PyStackRef_FromPyObjectSteal((PyObject *)func_obj);
@@ -4941,43 +5271,22 @@
}
case _SET_FUNCTION_ATTRIBUTE: {
- _PyStackRef func_st;
+ _PyStackRef func_in;
_PyStackRef attr_st;
+ _PyStackRef func_out;
oparg = CURRENT_OPARG();
- func_st = stack_pointer[-1];
+ func_in = stack_pointer[-1];
attr_st = stack_pointer[-2];
- PyObject *func = PyStackRef_AsPyObjectBorrow(func_st);
- PyObject *attr = PyStackRef_AsPyObjectBorrow(attr_st);
+ PyObject *func = PyStackRef_AsPyObjectBorrow(func_in);
+ PyObject *attr = PyStackRef_AsPyObjectSteal(attr_st);
+ func_out = func_in;
assert(PyFunction_Check(func));
- PyFunctionObject *func_obj = (PyFunctionObject *)func;
- switch(oparg) {
- case MAKE_FUNCTION_CLOSURE:
- assert(func_obj->func_closure == NULL);
- func_obj->func_closure = attr;
- break;
- case MAKE_FUNCTION_ANNOTATIONS:
- assert(func_obj->func_annotations == NULL);
- func_obj->func_annotations = attr;
- break;
- case MAKE_FUNCTION_KWDEFAULTS:
- assert(PyDict_CheckExact(attr));
- assert(func_obj->func_kwdefaults == NULL);
- func_obj->func_kwdefaults = attr;
- break;
- case MAKE_FUNCTION_DEFAULTS:
- assert(PyTuple_CheckExact(attr));
- assert(func_obj->func_defaults == NULL);
- func_obj->func_defaults = attr;
- break;
- case MAKE_FUNCTION_ANNOTATE:
- assert(PyCallable_Check(attr));
- assert(func_obj->func_annotate == NULL);
- func_obj->func_annotate = attr;
- break;
- default:
- Py_UNREACHABLE();
- }
- stack_pointer[-2] = func_st;
+ size_t offset = _Py_FunctionAttributeOffsets[oparg];
+ assert(offset != 0);
+ PyObject **ptr = (PyObject **)(((char *)func) + offset);
+ assert(*ptr == NULL);
+ *ptr = attr;
+ stack_pointer[-2] = func_out;
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
break;
@@ -4987,10 +5296,10 @@
_PyStackRef res;
assert(PyStackRef_FunctionCheck(frame->f_funcobj));
PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
- if (gen == NULL) {
- JUMP_TO_ERROR();
- }
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ if (gen == NULL) JUMP_TO_ERROR();
assert(EMPTY());
_PyFrame_SetStackPointer(frame, stack_pointer);
_PyInterpreterFrame *gen_frame = &gen->gi_iframe;
@@ -5000,12 +5309,12 @@
gen->gi_frame_state = FRAME_CREATED;
gen_frame->owner = FRAME_OWNED_BY_GENERATOR;
_Py_LeaveRecursiveCallPy(tstate);
- res = PyStackRef_FromPyObjectSteal((PyObject *)gen);
_PyInterpreterFrame *prev = frame->previous;
_PyThreadState_PopFrame(tstate, frame);
frame = tstate->current_frame = prev;
LOAD_IP(frame->return_offset);
- LOAD_SP();
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ res = PyStackRef_FromPyObjectSteal((PyObject *)gen);
LLTRACE_RESUME_FRAME();
stack_pointer[0] = res;
stack_pointer += 1;
@@ -5045,7 +5354,9 @@
conversion_func conv_fn;
assert(oparg >= FVC_STR && oparg <= FVC_ASCII);
conv_fn = _PyEval_ConversionFuncs[oparg];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *result_o = conv_fn(PyStackRef_AsPyObjectBorrow(value));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(value);
if (result_o == NULL) JUMP_TO_ERROR();
result = PyStackRef_FromPyObjectSteal(result_o);
@@ -5061,7 +5372,9 @@
/* If value is a unicode object, then we know the result
* of format(value) is value itself. */
if (!PyUnicode_CheckExact(value_o)) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
res = PyStackRef_FromPyObjectSteal(PyObject_Format(value_o, NULL));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(value);
if (PyStackRef_IsNull(res)) JUMP_TO_ERROR();
}
@@ -5078,7 +5391,9 @@
_PyStackRef res;
fmt_spec = stack_pointer[-1];
value = stack_pointer[-2];
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = PyObject_Format(PyStackRef_AsPyObjectBorrow(value), PyStackRef_AsPyObjectBorrow(fmt_spec));
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(value);
PyStackRef_CLOSE(fmt_spec);
if (res_o == NULL) JUMP_TO_ERROR();
@@ -5112,7 +5427,9 @@
PyObject *lhs_o = PyStackRef_AsPyObjectBorrow(lhs);
PyObject *rhs_o = PyStackRef_AsPyObjectBorrow(rhs);
assert(_PyEval_BinaryOps[oparg]);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = _PyEval_BinaryOps[oparg](lhs_o, rhs_o);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(lhs);
PyStackRef_CLOSE(rhs);
if (res_o == NULL) JUMP_TO_ERROR();
@@ -5124,14 +5441,18 @@
}
case _SWAP: {
- _PyStackRef top;
- _PyStackRef bottom;
+ _PyStackRef top_in;
+ _PyStackRef bottom_in;
+ _PyStackRef top_out;
+ _PyStackRef bottom_out;
oparg = CURRENT_OPARG();
- top = stack_pointer[-1];
- bottom = stack_pointer[-2 - (oparg-2)];
+ top_in = stack_pointer[-1];
+ bottom_in = stack_pointer[-2 - (oparg-2)];
+ bottom_out = bottom_in;
+ top_out = top_in;
assert(oparg >= 2);
- stack_pointer[-2 - (oparg-2)] = top;
- stack_pointer[-1] = bottom;
+ stack_pointer[-2 - (oparg-2)] = top_out;
+ stack_pointer[-1] = bottom_out;
break;
}
@@ -5154,54 +5475,58 @@
case _GUARD_IS_TRUE_POP: {
_PyStackRef flag;
flag = stack_pointer[-1];
+ int is_true = PyStackRef_Is(flag, PyStackRef_True);
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
- if (!PyStackRef_Is(flag, PyStackRef_True)) {
+ if (!is_true) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
- assert(PyStackRef_Is(flag, PyStackRef_True));
break;
}
case _GUARD_IS_FALSE_POP: {
_PyStackRef flag;
flag = stack_pointer[-1];
+ int is_false = PyStackRef_Is(flag, PyStackRef_False);
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
- if (!PyStackRef_Is(flag, PyStackRef_False)) {
+ if (!is_false) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
- assert(PyStackRef_Is(flag, PyStackRef_False));
break;
}
case _GUARD_IS_NONE_POP: {
_PyStackRef val;
val = stack_pointer[-1];
- stack_pointer += -1;
- assert(WITHIN_STACK_BOUNDS());
- if (!PyStackRef_Is(val, PyStackRef_None)) {
+ int is_none = PyStackRef_Is(val, PyStackRef_None);
+ if (!is_none) {
PyStackRef_CLOSE(val);
+ stack_pointer += -1;
+ assert(WITHIN_STACK_BOUNDS());
if (1) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
}
+ stack_pointer += -1;
+ assert(WITHIN_STACK_BOUNDS());
break;
}
case _GUARD_IS_NOT_NONE_POP: {
_PyStackRef val;
val = stack_pointer[-1];
+ int is_none = PyStackRef_Is(val, PyStackRef_None);
+ PyStackRef_CLOSE(val);
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
- if (PyStackRef_Is(val, PyStackRef_None)) {
+ if (is_none) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
- PyStackRef_CLOSE(val);
break;
}
@@ -5249,12 +5574,14 @@
#if defined(Py_DEBUG) && !defined(_Py_JIT)
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
if (lltrace >= 2) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
printf("SIDE EXIT: [UOp ");
_PyUOpPrint(&next_uop[-1]);
printf(", exit %u, temp %d, target %d -> %s]\n",
exit - current_executor->exits, exit->temperature.value_and_backoff,
(int)(target - _PyCode_CODE(code)),
_PyOpcode_OpName[target->op.code]);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
}
#endif
if (exit->executor && !exit->executor->vm_data.valid) {
@@ -5275,7 +5602,9 @@
}
else {
int chain_depth = current_executor->vm_data.chain_depth + 1;
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int optimized = _PyOptimizer_Optimize(frame, target, stack_pointer, &executor, chain_depth);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (optimized <= 0) {
exit->temperature = restart_backoff_counter(temperature);
if (optimized < 0) {
@@ -5337,8 +5666,8 @@
_PyStackRef null;
PyObject *ptr = (PyObject *)CURRENT_OPERAND();
value = PyStackRef_FromPyObjectNew(ptr);
- stack_pointer[0] = value;
null = PyStackRef_NULL;
+ stack_pointer[0] = value;
stack_pointer[1] = null;
stack_pointer += 2;
assert(WITHIN_STACK_BOUNDS());
@@ -5387,12 +5716,14 @@
#if defined(Py_DEBUG) && !defined(_Py_JIT)
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
if (lltrace >= 2) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
printf("DYNAMIC EXIT: [UOp ");
_PyUOpPrint(&next_uop[-1]);
printf(", exit %u, temp %d, target %d -> %s]\n",
exit - current_executor->exits, exit->temperature.value_and_backoff,
(int)(target - _PyCode_CODE(_PyFrame_GetCode(frame))),
_PyOpcode_OpName[target->op.code]);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
}
#endif
_PyExecutorObject *executor;
@@ -5406,7 +5737,9 @@
exit->temperature = advance_backoff_counter(exit->temperature);
GOTO_TIER_ONE(target);
}
+ _PyFrame_SetStackPointer(frame, stack_pointer);
int optimized = _PyOptimizer_Optimize(frame, target, stack_pointer, &executor, 0);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (optimized <= 0) {
exit->temperature = restart_backoff_counter(exit->temperature);
if (optimized < 0) {