mirror of
https://github.com/python/cpython.git
synced 2025-09-09 18:32:22 +00:00
GH-122034: Add StackRef variants of type checks to reduce the number of PyStackRef_AsPyObjectBorrow calls (GH-122037)
This commit is contained in:
parent
aef95eb107
commit
5e686ff57d
4 changed files with 60 additions and 27 deletions
24
Python/generated_cases.c.h
generated
24
Python/generated_cases.c.h
generated
|
@ -1078,7 +1078,7 @@
|
|||
assert(Py_TYPE(callable_o) == &PyMethod_Type);
|
||||
self = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_self);
|
||||
method = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
|
||||
assert(PyFunction_Check(PyStackRef_AsPyObjectBorrow(method)));
|
||||
assert(PyStackRef_FunctionCheck(method));
|
||||
PyStackRef_CLOSE(callable);
|
||||
}
|
||||
// flush
|
||||
|
@ -3544,7 +3544,7 @@
|
|||
receiver = stack_pointer[-2];
|
||||
/* Need to create a fake StopIteration error here,
|
||||
* to conform to PEP 380 */
|
||||
if (PyGen_Check(PyStackRef_AsPyObjectBorrow(receiver))) {
|
||||
if (PyStackRef_GenCheck(receiver)) {
|
||||
if (monitor_stop_iteration(tstate, frame, this_instr, PyStackRef_AsPyObjectBorrow(value))) {
|
||||
goto error;
|
||||
}
|
||||
|
@ -3667,7 +3667,7 @@
|
|||
INSTRUCTION_STATS(INSTRUMENTED_POP_JUMP_IF_FALSE);
|
||||
/* Skip 1 cache entry */
|
||||
_PyStackRef cond = POP();
|
||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
||||
assert(PyStackRef_BoolCheck(cond));
|
||||
int flag = PyStackRef_Is(cond, PyStackRef_False);
|
||||
int offset = flag * oparg;
|
||||
#if ENABLE_SPECIALIZATION
|
||||
|
@ -3730,7 +3730,7 @@
|
|||
INSTRUCTION_STATS(INSTRUMENTED_POP_JUMP_IF_TRUE);
|
||||
/* Skip 1 cache entry */
|
||||
_PyStackRef cond = POP();
|
||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
||||
assert(PyStackRef_BoolCheck(cond));
|
||||
int flag = PyStackRef_Is(cond, PyStackRef_True);
|
||||
int offset = flag * oparg;
|
||||
#if ENABLE_SPECIALIZATION
|
||||
|
@ -5329,7 +5329,7 @@
|
|||
_PyStackRef cond;
|
||||
/* Skip 1 cache entry */
|
||||
cond = stack_pointer[-1];
|
||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
||||
assert(PyStackRef_BoolCheck(cond));
|
||||
int flag = PyStackRef_Is(cond, PyStackRef_False);
|
||||
#if ENABLE_SPECIALIZATION
|
||||
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
||||
|
@ -5363,7 +5363,7 @@
|
|||
// _POP_JUMP_IF_TRUE
|
||||
cond = b;
|
||||
{
|
||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
||||
assert(PyStackRef_BoolCheck(cond));
|
||||
int flag = PyStackRef_Is(cond, PyStackRef_True);
|
||||
#if ENABLE_SPECIALIZATION
|
||||
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
||||
|
@ -5398,7 +5398,7 @@
|
|||
// _POP_JUMP_IF_FALSE
|
||||
cond = b;
|
||||
{
|
||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
||||
assert(PyStackRef_BoolCheck(cond));
|
||||
int flag = PyStackRef_Is(cond, PyStackRef_False);
|
||||
#if ENABLE_SPECIALIZATION
|
||||
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
||||
|
@ -5418,7 +5418,7 @@
|
|||
_PyStackRef cond;
|
||||
/* Skip 1 cache entry */
|
||||
cond = stack_pointer[-1];
|
||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
||||
assert(PyStackRef_BoolCheck(cond));
|
||||
int flag = PyStackRef_Is(cond, PyStackRef_True);
|
||||
#if ENABLE_SPECIALIZATION
|
||||
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
||||
|
@ -5455,7 +5455,7 @@
|
|||
else {
|
||||
prev_exc = PyStackRef_None;
|
||||
}
|
||||
assert(PyExceptionInstance_Check(PyStackRef_AsPyObjectBorrow(new_exc)));
|
||||
assert(PyStackRef_ExceptionInstanceCheck(new_exc));
|
||||
exc_info->exc_value = PyStackRef_AsPyObjectNew(new_exc);
|
||||
stack_pointer[-1] = prev_exc;
|
||||
stack_pointer[0] = new_exc;
|
||||
|
@ -6418,7 +6418,7 @@
|
|||
/* Skip 1 cache entry */
|
||||
/* Skip 2 cache entries */
|
||||
value = stack_pointer[-1];
|
||||
DEOPT_IF(!PyBool_Check(PyStackRef_AsPyObjectBorrow(value)), TO_BOOL);
|
||||
DEOPT_IF(!PyStackRef_BoolCheck(value), TO_BOOL);
|
||||
STAT_INC(TO_BOOL, hit);
|
||||
DISPATCH();
|
||||
}
|
||||
|
@ -6548,7 +6548,7 @@
|
|||
_PyStackRef value;
|
||||
_PyStackRef res;
|
||||
value = stack_pointer[-1];
|
||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(value)));
|
||||
assert(PyStackRef_BoolCheck(value));
|
||||
res = PyStackRef_Is(value, PyStackRef_False)
|
||||
? PyStackRef_True : PyStackRef_False;
|
||||
stack_pointer[-1] = res;
|
||||
|
@ -6715,7 +6715,7 @@
|
|||
else {
|
||||
Py_DECREF(tb);
|
||||
}
|
||||
assert(PyLong_Check(PyStackRef_AsPyObjectBorrow(lasti)));
|
||||
assert(PyStackRef_LongCheck(lasti));
|
||||
(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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue