mirror of
https://github.com/python/cpython.git
synced 2025-08-22 09:45:06 +00:00
GH-116468: Use constants instead of oparg
in stack effects when oparg
is known to be a constant. (GH-116469)
This commit is contained in:
parent
8d7fde655f
commit
4e5df2013f
5 changed files with 98 additions and 108 deletions
|
@ -129,6 +129,8 @@ dummy_func(
|
|||
PyObject *top;
|
||||
PyObject *type;
|
||||
PyObject *typevars;
|
||||
PyObject *val0;
|
||||
PyObject *val1;
|
||||
int values_or_none;
|
||||
|
||||
switch (opcode) {
|
||||
|
@ -1223,13 +1225,13 @@ dummy_func(
|
|||
|
||||
macro(UNPACK_SEQUENCE) = _SPECIALIZE_UNPACK_SEQUENCE + _UNPACK_SEQUENCE;
|
||||
|
||||
inst(UNPACK_SEQUENCE_TWO_TUPLE, (unused/1, seq -- values[oparg])) {
|
||||
inst(UNPACK_SEQUENCE_TWO_TUPLE, (unused/1, seq -- val1, val0)) {
|
||||
assert(oparg == 2);
|
||||
DEOPT_IF(!PyTuple_CheckExact(seq));
|
||||
DEOPT_IF(PyTuple_GET_SIZE(seq) != 2);
|
||||
assert(oparg == 2);
|
||||
STAT_INC(UNPACK_SEQUENCE, hit);
|
||||
values[0] = Py_NewRef(PyTuple_GET_ITEM(seq, 1));
|
||||
values[1] = Py_NewRef(PyTuple_GET_ITEM(seq, 0));
|
||||
val0 = Py_NewRef(PyTuple_GET_ITEM(seq, 0));
|
||||
val1 = Py_NewRef(PyTuple_GET_ITEM(seq, 1));
|
||||
DECREF_INPUTS();
|
||||
}
|
||||
|
||||
|
@ -3236,39 +3238,33 @@ dummy_func(
|
|||
DISPATCH_INLINED(new_frame);
|
||||
}
|
||||
|
||||
inst(CALL_TYPE_1, (unused/1, unused/2, callable, null, args[oparg] -- res)) {
|
||||
inst(CALL_TYPE_1, (unused/1, unused/2, callable, null, arg -- res)) {
|
||||
assert(oparg == 1);
|
||||
DEOPT_IF(null != NULL);
|
||||
PyObject *obj = args[0];
|
||||
DEOPT_IF(callable != (PyObject *)&PyType_Type);
|
||||
STAT_INC(CALL, hit);
|
||||
res = Py_NewRef(Py_TYPE(obj));
|
||||
Py_DECREF(obj);
|
||||
Py_DECREF(&PyType_Type); // I.e., callable
|
||||
res = Py_NewRef(Py_TYPE(arg));
|
||||
Py_DECREF(arg);
|
||||
}
|
||||
|
||||
inst(CALL_STR_1, (unused/1, unused/2, callable, null, args[oparg] -- res)) {
|
||||
inst(CALL_STR_1, (unused/1, unused/2, callable, null, arg -- res)) {
|
||||
assert(oparg == 1);
|
||||
DEOPT_IF(null != NULL);
|
||||
DEOPT_IF(callable != (PyObject *)&PyUnicode_Type);
|
||||
STAT_INC(CALL, hit);
|
||||
PyObject *arg = args[0];
|
||||
res = PyObject_Str(arg);
|
||||
Py_DECREF(arg);
|
||||
Py_DECREF(&PyUnicode_Type); // I.e., callable
|
||||
ERROR_IF(res == NULL, error);
|
||||
CHECK_EVAL_BREAKER();
|
||||
}
|
||||
|
||||
inst(CALL_TUPLE_1, (unused/1, unused/2, callable, null, args[oparg] -- res)) {
|
||||
inst(CALL_TUPLE_1, (unused/1, unused/2, callable, null, arg -- res)) {
|
||||
assert(oparg == 1);
|
||||
DEOPT_IF(null != NULL);
|
||||
DEOPT_IF(callable != (PyObject *)&PyTuple_Type);
|
||||
STAT_INC(CALL, hit);
|
||||
PyObject *arg = args[0];
|
||||
res = PySequence_Tuple(arg);
|
||||
Py_DECREF(arg);
|
||||
Py_DECREF(&PyTuple_Type); // I.e., tuple
|
||||
ERROR_IF(res == NULL, error);
|
||||
CHECK_EVAL_BREAKER();
|
||||
}
|
||||
|
@ -3490,14 +3486,14 @@ dummy_func(
|
|||
}
|
||||
|
||||
// This is secretly a super-instruction
|
||||
tier1 inst(CALL_LIST_APPEND, (unused/1, unused/2, callable, self, args[oparg] -- unused)) {
|
||||
tier1 inst(CALL_LIST_APPEND, (unused/1, unused/2, callable, self, arg -- unused)) {
|
||||
assert(oparg == 1);
|
||||
PyInterpreterState *interp = tstate->interp;
|
||||
DEOPT_IF(callable != interp->callable_cache.list_append);
|
||||
assert(self != NULL);
|
||||
DEOPT_IF(!PyList_Check(self));
|
||||
STAT_INC(CALL, hit);
|
||||
if (_PyList_AppendTakeRef((PyListObject *)self, args[0]) < 0) {
|
||||
if (_PyList_AppendTakeRef((PyListObject *)self, arg) < 0) {
|
||||
goto pop_1_error; // Since arg is DECREF'ed already
|
||||
}
|
||||
Py_DECREF(self);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue