mirror of https://github.com/python/cpython
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
|
@ -11,6 +11,7 @@ extern "C" {
|
||||||
#include "pycore_object_deferred.h"
|
#include "pycore_object_deferred.h"
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This file introduces a new API for handling references on the stack, called
|
This file introduces a new API for handling references on the stack, called
|
||||||
|
@ -237,6 +238,38 @@ _PyObjectStack_FromStackRefStack(PyObject **dst, const _PyStackRef *src, size_t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StackRef type checks
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
PyStackRef_GenCheck(_PyStackRef stackref)
|
||||||
|
{
|
||||||
|
return PyGen_Check(PyStackRef_AsPyObjectBorrow(stackref));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
PyStackRef_BoolCheck(_PyStackRef stackref)
|
||||||
|
{
|
||||||
|
return PyBool_Check(PyStackRef_AsPyObjectBorrow(stackref));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
PyStackRef_LongCheck(_PyStackRef stackref)
|
||||||
|
{
|
||||||
|
return PyLong_Check(PyStackRef_AsPyObjectBorrow(stackref));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
PyStackRef_ExceptionInstanceCheck(_PyStackRef stackref)
|
||||||
|
{
|
||||||
|
return PyExceptionInstance_Check(PyStackRef_AsPyObjectBorrow(stackref));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
PyStackRef_FunctionCheck(_PyStackRef stackref)
|
||||||
|
{
|
||||||
|
return PyFunction_Check(PyStackRef_AsPyObjectBorrow(stackref));
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -286,7 +286,7 @@ dummy_func(
|
||||||
tier1 inst(INSTRUMENTED_END_FOR, (receiver, value -- receiver)) {
|
tier1 inst(INSTRUMENTED_END_FOR, (receiver, value -- receiver)) {
|
||||||
/* Need to create a fake StopIteration error here,
|
/* Need to create a fake StopIteration error here,
|
||||||
* to conform to PEP 380 */
|
* 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))) {
|
if (monitor_stop_iteration(tstate, frame, this_instr, PyStackRef_AsPyObjectBorrow(value))) {
|
||||||
ERROR_NO_POP();
|
ERROR_NO_POP();
|
||||||
}
|
}
|
||||||
|
@ -317,7 +317,7 @@ dummy_func(
|
||||||
}
|
}
|
||||||
|
|
||||||
pure inst(UNARY_NOT, (value -- res)) {
|
pure inst(UNARY_NOT, (value -- res)) {
|
||||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(value)));
|
assert(PyStackRef_BoolCheck(value));
|
||||||
res = PyStackRef_Is(value, PyStackRef_False)
|
res = PyStackRef_Is(value, PyStackRef_False)
|
||||||
? PyStackRef_True : PyStackRef_False;
|
? PyStackRef_True : PyStackRef_False;
|
||||||
}
|
}
|
||||||
|
@ -353,7 +353,7 @@ dummy_func(
|
||||||
macro(TO_BOOL) = _SPECIALIZE_TO_BOOL + unused/2 + _TO_BOOL;
|
macro(TO_BOOL) = _SPECIALIZE_TO_BOOL + unused/2 + _TO_BOOL;
|
||||||
|
|
||||||
inst(TO_BOOL_BOOL, (unused/1, unused/2, value -- value)) {
|
inst(TO_BOOL_BOOL, (unused/1, unused/2, value -- value)) {
|
||||||
EXIT_IF(!PyBool_Check(PyStackRef_AsPyObjectBorrow(value)));
|
EXIT_IF(!PyStackRef_BoolCheck(value));
|
||||||
STAT_INC(TO_BOOL, hit);
|
STAT_INC(TO_BOOL, hit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2688,7 +2688,7 @@ dummy_func(
|
||||||
}
|
}
|
||||||
|
|
||||||
replaced op(_POP_JUMP_IF_FALSE, (cond -- )) {
|
replaced op(_POP_JUMP_IF_FALSE, (cond -- )) {
|
||||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
assert(PyStackRef_BoolCheck(cond));
|
||||||
int flag = PyStackRef_Is(cond, PyStackRef_False);
|
int flag = PyStackRef_Is(cond, PyStackRef_False);
|
||||||
#if ENABLE_SPECIALIZATION
|
#if ENABLE_SPECIALIZATION
|
||||||
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
||||||
|
@ -2697,7 +2697,7 @@ dummy_func(
|
||||||
}
|
}
|
||||||
|
|
||||||
replaced op(_POP_JUMP_IF_TRUE, (cond -- )) {
|
replaced op(_POP_JUMP_IF_TRUE, (cond -- )) {
|
||||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
assert(PyStackRef_BoolCheck(cond));
|
||||||
int flag = PyStackRef_Is(cond, PyStackRef_True);
|
int flag = PyStackRef_Is(cond, PyStackRef_True);
|
||||||
#if ENABLE_SPECIALIZATION
|
#if ENABLE_SPECIALIZATION
|
||||||
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
||||||
|
@ -3121,7 +3121,7 @@ dummy_func(
|
||||||
else {
|
else {
|
||||||
Py_DECREF(tb);
|
Py_DECREF(tb);
|
||||||
}
|
}
|
||||||
assert(PyLong_Check(PyStackRef_AsPyObjectBorrow(lasti)));
|
assert(PyStackRef_LongCheck(lasti));
|
||||||
(void)lasti; // Shut up compiler warning if asserts are off
|
(void)lasti; // Shut up compiler warning if asserts are off
|
||||||
PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb};
|
PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb};
|
||||||
int has_self = !PyStackRef_IsNull(exit_self);
|
int has_self = !PyStackRef_IsNull(exit_self);
|
||||||
|
@ -3163,7 +3163,7 @@ dummy_func(
|
||||||
else {
|
else {
|
||||||
prev_exc = PyStackRef_None;
|
prev_exc = PyStackRef_None;
|
||||||
}
|
}
|
||||||
assert(PyExceptionInstance_Check(PyStackRef_AsPyObjectBorrow(new_exc)));
|
assert(PyStackRef_ExceptionInstanceCheck(new_exc));
|
||||||
exc_info->exc_value = PyStackRef_AsPyObjectNew(new_exc);
|
exc_info->exc_value = PyStackRef_AsPyObjectNew(new_exc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3459,7 +3459,7 @@ dummy_func(
|
||||||
assert(Py_TYPE(callable_o) == &PyMethod_Type);
|
assert(Py_TYPE(callable_o) == &PyMethod_Type);
|
||||||
self = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_self);
|
self = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_self);
|
||||||
method = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
|
method = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
|
||||||
assert(PyFunction_Check(PyStackRef_AsPyObjectBorrow(method)));
|
assert(PyStackRef_FunctionCheck(method));
|
||||||
PyStackRef_CLOSE(callable);
|
PyStackRef_CLOSE(callable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4467,7 +4467,7 @@ dummy_func(
|
||||||
|
|
||||||
inst(INSTRUMENTED_POP_JUMP_IF_TRUE, (unused/1 -- )) {
|
inst(INSTRUMENTED_POP_JUMP_IF_TRUE, (unused/1 -- )) {
|
||||||
_PyStackRef cond = POP();
|
_PyStackRef cond = POP();
|
||||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
assert(PyStackRef_BoolCheck(cond));
|
||||||
int flag = PyStackRef_Is(cond, PyStackRef_True);
|
int flag = PyStackRef_Is(cond, PyStackRef_True);
|
||||||
int offset = flag * oparg;
|
int offset = flag * oparg;
|
||||||
#if ENABLE_SPECIALIZATION
|
#if ENABLE_SPECIALIZATION
|
||||||
|
@ -4478,7 +4478,7 @@ dummy_func(
|
||||||
|
|
||||||
inst(INSTRUMENTED_POP_JUMP_IF_FALSE, (unused/1 -- )) {
|
inst(INSTRUMENTED_POP_JUMP_IF_FALSE, (unused/1 -- )) {
|
||||||
_PyStackRef cond = POP();
|
_PyStackRef cond = POP();
|
||||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
assert(PyStackRef_BoolCheck(cond));
|
||||||
int flag = PyStackRef_Is(cond, PyStackRef_False);
|
int flag = PyStackRef_Is(cond, PyStackRef_False);
|
||||||
int offset = flag * oparg;
|
int offset = flag * oparg;
|
||||||
#if ENABLE_SPECIALIZATION
|
#if ENABLE_SPECIALIZATION
|
||||||
|
|
|
@ -324,7 +324,7 @@
|
||||||
_PyStackRef value;
|
_PyStackRef value;
|
||||||
_PyStackRef res;
|
_PyStackRef res;
|
||||||
value = stack_pointer[-1];
|
value = stack_pointer[-1];
|
||||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(value)));
|
assert(PyStackRef_BoolCheck(value));
|
||||||
res = PyStackRef_Is(value, PyStackRef_False)
|
res = PyStackRef_Is(value, PyStackRef_False)
|
||||||
? PyStackRef_True : PyStackRef_False;
|
? PyStackRef_True : PyStackRef_False;
|
||||||
stack_pointer[-1] = res;
|
stack_pointer[-1] = res;
|
||||||
|
@ -346,7 +346,7 @@
|
||||||
case _TO_BOOL_BOOL: {
|
case _TO_BOOL_BOOL: {
|
||||||
_PyStackRef value;
|
_PyStackRef value;
|
||||||
value = stack_pointer[-1];
|
value = stack_pointer[-1];
|
||||||
if (!PyBool_Check(PyStackRef_AsPyObjectBorrow(value))) {
|
if (!PyStackRef_BoolCheck(value)) {
|
||||||
UOP_STAT_INC(uopcode, miss);
|
UOP_STAT_INC(uopcode, miss);
|
||||||
JUMP_TO_JUMP_TARGET();
|
JUMP_TO_JUMP_TARGET();
|
||||||
}
|
}
|
||||||
|
@ -3344,7 +3344,7 @@
|
||||||
else {
|
else {
|
||||||
Py_DECREF(tb);
|
Py_DECREF(tb);
|
||||||
}
|
}
|
||||||
assert(PyLong_Check(PyStackRef_AsPyObjectBorrow(lasti)));
|
assert(PyStackRef_LongCheck(lasti));
|
||||||
(void)lasti; // Shut up compiler warning if asserts are off
|
(void)lasti; // Shut up compiler warning if asserts are off
|
||||||
PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb};
|
PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb};
|
||||||
int has_self = !PyStackRef_IsNull(exit_self);
|
int has_self = !PyStackRef_IsNull(exit_self);
|
||||||
|
@ -3368,7 +3368,7 @@
|
||||||
else {
|
else {
|
||||||
prev_exc = PyStackRef_None;
|
prev_exc = PyStackRef_None;
|
||||||
}
|
}
|
||||||
assert(PyExceptionInstance_Check(PyStackRef_AsPyObjectBorrow(new_exc)));
|
assert(PyStackRef_ExceptionInstanceCheck(new_exc));
|
||||||
exc_info->exc_value = PyStackRef_AsPyObjectNew(new_exc);
|
exc_info->exc_value = PyStackRef_AsPyObjectNew(new_exc);
|
||||||
stack_pointer[-1] = prev_exc;
|
stack_pointer[-1] = prev_exc;
|
||||||
stack_pointer[0] = new_exc;
|
stack_pointer[0] = new_exc;
|
||||||
|
@ -3614,7 +3614,7 @@
|
||||||
assert(Py_TYPE(callable_o) == &PyMethod_Type);
|
assert(Py_TYPE(callable_o) == &PyMethod_Type);
|
||||||
self = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_self);
|
self = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_self);
|
||||||
method = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
|
method = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
|
||||||
assert(PyFunction_Check(PyStackRef_AsPyObjectBorrow(method)));
|
assert(PyStackRef_FunctionCheck(method));
|
||||||
PyStackRef_CLOSE(callable);
|
PyStackRef_CLOSE(callable);
|
||||||
stack_pointer[-2 - oparg] = method;
|
stack_pointer[-2 - oparg] = method;
|
||||||
stack_pointer[-1 - oparg] = self;
|
stack_pointer[-1 - oparg] = self;
|
||||||
|
|
|
@ -1078,7 +1078,7 @@
|
||||||
assert(Py_TYPE(callable_o) == &PyMethod_Type);
|
assert(Py_TYPE(callable_o) == &PyMethod_Type);
|
||||||
self = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_self);
|
self = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_self);
|
||||||
method = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
|
method = PyStackRef_FromPyObjectNew(((PyMethodObject *)callable_o)->im_func);
|
||||||
assert(PyFunction_Check(PyStackRef_AsPyObjectBorrow(method)));
|
assert(PyStackRef_FunctionCheck(method));
|
||||||
PyStackRef_CLOSE(callable);
|
PyStackRef_CLOSE(callable);
|
||||||
}
|
}
|
||||||
// flush
|
// flush
|
||||||
|
@ -3544,7 +3544,7 @@
|
||||||
receiver = stack_pointer[-2];
|
receiver = stack_pointer[-2];
|
||||||
/* Need to create a fake StopIteration error here,
|
/* Need to create a fake StopIteration error here,
|
||||||
* to conform to PEP 380 */
|
* 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))) {
|
if (monitor_stop_iteration(tstate, frame, this_instr, PyStackRef_AsPyObjectBorrow(value))) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
@ -3667,7 +3667,7 @@
|
||||||
INSTRUCTION_STATS(INSTRUMENTED_POP_JUMP_IF_FALSE);
|
INSTRUCTION_STATS(INSTRUMENTED_POP_JUMP_IF_FALSE);
|
||||||
/* Skip 1 cache entry */
|
/* Skip 1 cache entry */
|
||||||
_PyStackRef cond = POP();
|
_PyStackRef cond = POP();
|
||||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
assert(PyStackRef_BoolCheck(cond));
|
||||||
int flag = PyStackRef_Is(cond, PyStackRef_False);
|
int flag = PyStackRef_Is(cond, PyStackRef_False);
|
||||||
int offset = flag * oparg;
|
int offset = flag * oparg;
|
||||||
#if ENABLE_SPECIALIZATION
|
#if ENABLE_SPECIALIZATION
|
||||||
|
@ -3730,7 +3730,7 @@
|
||||||
INSTRUCTION_STATS(INSTRUMENTED_POP_JUMP_IF_TRUE);
|
INSTRUCTION_STATS(INSTRUMENTED_POP_JUMP_IF_TRUE);
|
||||||
/* Skip 1 cache entry */
|
/* Skip 1 cache entry */
|
||||||
_PyStackRef cond = POP();
|
_PyStackRef cond = POP();
|
||||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
assert(PyStackRef_BoolCheck(cond));
|
||||||
int flag = PyStackRef_Is(cond, PyStackRef_True);
|
int flag = PyStackRef_Is(cond, PyStackRef_True);
|
||||||
int offset = flag * oparg;
|
int offset = flag * oparg;
|
||||||
#if ENABLE_SPECIALIZATION
|
#if ENABLE_SPECIALIZATION
|
||||||
|
@ -5329,7 +5329,7 @@
|
||||||
_PyStackRef cond;
|
_PyStackRef cond;
|
||||||
/* Skip 1 cache entry */
|
/* Skip 1 cache entry */
|
||||||
cond = stack_pointer[-1];
|
cond = stack_pointer[-1];
|
||||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
assert(PyStackRef_BoolCheck(cond));
|
||||||
int flag = PyStackRef_Is(cond, PyStackRef_False);
|
int flag = PyStackRef_Is(cond, PyStackRef_False);
|
||||||
#if ENABLE_SPECIALIZATION
|
#if ENABLE_SPECIALIZATION
|
||||||
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
||||||
|
@ -5363,7 +5363,7 @@
|
||||||
// _POP_JUMP_IF_TRUE
|
// _POP_JUMP_IF_TRUE
|
||||||
cond = b;
|
cond = b;
|
||||||
{
|
{
|
||||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
assert(PyStackRef_BoolCheck(cond));
|
||||||
int flag = PyStackRef_Is(cond, PyStackRef_True);
|
int flag = PyStackRef_Is(cond, PyStackRef_True);
|
||||||
#if ENABLE_SPECIALIZATION
|
#if ENABLE_SPECIALIZATION
|
||||||
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
||||||
|
@ -5398,7 +5398,7 @@
|
||||||
// _POP_JUMP_IF_FALSE
|
// _POP_JUMP_IF_FALSE
|
||||||
cond = b;
|
cond = b;
|
||||||
{
|
{
|
||||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
assert(PyStackRef_BoolCheck(cond));
|
||||||
int flag = PyStackRef_Is(cond, PyStackRef_False);
|
int flag = PyStackRef_Is(cond, PyStackRef_False);
|
||||||
#if ENABLE_SPECIALIZATION
|
#if ENABLE_SPECIALIZATION
|
||||||
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
||||||
|
@ -5418,7 +5418,7 @@
|
||||||
_PyStackRef cond;
|
_PyStackRef cond;
|
||||||
/* Skip 1 cache entry */
|
/* Skip 1 cache entry */
|
||||||
cond = stack_pointer[-1];
|
cond = stack_pointer[-1];
|
||||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(cond)));
|
assert(PyStackRef_BoolCheck(cond));
|
||||||
int flag = PyStackRef_Is(cond, PyStackRef_True);
|
int flag = PyStackRef_Is(cond, PyStackRef_True);
|
||||||
#if ENABLE_SPECIALIZATION
|
#if ENABLE_SPECIALIZATION
|
||||||
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
this_instr[1].cache = (this_instr[1].cache << 1) | flag;
|
||||||
|
@ -5455,7 +5455,7 @@
|
||||||
else {
|
else {
|
||||||
prev_exc = PyStackRef_None;
|
prev_exc = PyStackRef_None;
|
||||||
}
|
}
|
||||||
assert(PyExceptionInstance_Check(PyStackRef_AsPyObjectBorrow(new_exc)));
|
assert(PyStackRef_ExceptionInstanceCheck(new_exc));
|
||||||
exc_info->exc_value = PyStackRef_AsPyObjectNew(new_exc);
|
exc_info->exc_value = PyStackRef_AsPyObjectNew(new_exc);
|
||||||
stack_pointer[-1] = prev_exc;
|
stack_pointer[-1] = prev_exc;
|
||||||
stack_pointer[0] = new_exc;
|
stack_pointer[0] = new_exc;
|
||||||
|
@ -6418,7 +6418,7 @@
|
||||||
/* Skip 1 cache entry */
|
/* Skip 1 cache entry */
|
||||||
/* Skip 2 cache entries */
|
/* Skip 2 cache entries */
|
||||||
value = stack_pointer[-1];
|
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);
|
STAT_INC(TO_BOOL, hit);
|
||||||
DISPATCH();
|
DISPATCH();
|
||||||
}
|
}
|
||||||
|
@ -6548,7 +6548,7 @@
|
||||||
_PyStackRef value;
|
_PyStackRef value;
|
||||||
_PyStackRef res;
|
_PyStackRef res;
|
||||||
value = stack_pointer[-1];
|
value = stack_pointer[-1];
|
||||||
assert(PyBool_Check(PyStackRef_AsPyObjectBorrow(value)));
|
assert(PyStackRef_BoolCheck(value));
|
||||||
res = PyStackRef_Is(value, PyStackRef_False)
|
res = PyStackRef_Is(value, PyStackRef_False)
|
||||||
? PyStackRef_True : PyStackRef_False;
|
? PyStackRef_True : PyStackRef_False;
|
||||||
stack_pointer[-1] = res;
|
stack_pointer[-1] = res;
|
||||||
|
@ -6715,7 +6715,7 @@
|
||||||
else {
|
else {
|
||||||
Py_DECREF(tb);
|
Py_DECREF(tb);
|
||||||
}
|
}
|
||||||
assert(PyLong_Check(PyStackRef_AsPyObjectBorrow(lasti)));
|
assert(PyStackRef_LongCheck(lasti));
|
||||||
(void)lasti; // Shut up compiler warning if asserts are off
|
(void)lasti; // Shut up compiler warning if asserts are off
|
||||||
PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb};
|
PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb};
|
||||||
int has_self = !PyStackRef_IsNull(exit_self);
|
int has_self = !PyStackRef_IsNull(exit_self);
|
||||||
|
|
Loading…
Reference in New Issue