summaryrefslogtreecommitdiffstats
path: root/Python/bytecodes.c
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2024-03-11 09:30:15 (GMT)
committerGitHub <noreply@github.com>2024-03-11 09:30:15 (GMT)
commit4e5df2013fc29ed8bdb71572f1d12ff36e7028d5 (patch)
tree7e13e821f19e33133bcebf17225808a68a4efda0 /Python/bytecodes.c
parent8d7fde655fbb57e393831b9f30ebba80d6da366f (diff)
downloadcpython-4e5df2013fc29ed8bdb71572f1d12ff36e7028d5.zip
cpython-4e5df2013fc29ed8bdb71572f1d12ff36e7028d5.tar.gz
cpython-4e5df2013fc29ed8bdb71572f1d12ff36e7028d5.tar.bz2
GH-116468: Use constants instead of `oparg` in stack effects when `oparg` is known to be a constant. (GH-116469)
Diffstat (limited to 'Python/bytecodes.c')
-rw-r--r--Python/bytecodes.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index bf9d2a3..03e5f4e 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -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);