summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2022-05-04 11:30:23 (GMT)
committerGitHub <noreply@github.com>2022-05-04 11:30:23 (GMT)
commitd716a0dfe2d1029111db393afaecdb04cc4093de (patch)
tree2644817d65b365bf1dd2872661948d1b564bff32 /Objects
parent14243369b5f80613628a565c224bba7fb3fcacd8 (diff)
downloadcpython-d716a0dfe2d1029111db393afaecdb04cc4093de.zip
cpython-d716a0dfe2d1029111db393afaecdb04cc4093de.tar.gz
cpython-d716a0dfe2d1029111db393afaecdb04cc4093de.tar.bz2
Use static inline function Py_EnterRecursiveCall() (#91988)
Currently, calling Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() may use a function call or a static inline function call, depending if the internal pycore_ceval.h header file is included or not. Use a different name for the static inline function to ensure that the static inline function is always used in Python internals for best performance. Similar approach than PyThreadState_GET() (function call) and _PyThreadState_GET() (static inline function). * Rename _Py_EnterRecursiveCall() to _Py_EnterRecursiveCallTstate() * Rename _Py_LeaveRecursiveCall() to _Py_LeaveRecursiveCallTstate() * pycore_ceval.h: Rename Py_EnterRecursiveCall() to _Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() and _Py_LeaveRecursiveCall()
Diffstat (limited to 'Objects')
-rw-r--r--Objects/abstract.c22
-rw-r--r--Objects/bytesobject.c2
-rw-r--r--Objects/call.c8
-rw-r--r--Objects/descrobject.c18
-rw-r--r--Objects/exceptions.c11
-rw-r--r--Objects/methodobject.c14
-rw-r--r--Objects/object.c16
7 files changed, 46 insertions, 45 deletions
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 9034737..93987c2 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -3,7 +3,7 @@
#include "Python.h"
#include "pycore_abstract.h" // _PyIndex_Check()
#include "pycore_call.h" // _PyObject_CallNoArgs()
-#include "pycore_ceval.h" // _Py_EnterRecursiveCall()
+#include "pycore_ceval.h" // _Py_EnterRecursiveCallTstate()
#include "pycore_object.h" // _Py_CheckSlotResult()
#include "pycore_pyerrors.h" // _PyErr_Occurred()
#include "pycore_pystate.h" // _PyThreadState_GET()
@@ -2546,7 +2546,7 @@ abstract_issubclass(PyObject *derived, PyObject *cls)
break;
}
assert(n >= 2);
- if (Py_EnterRecursiveCall(" in __issubclass__")) {
+ if (_Py_EnterRecursiveCall(" in __issubclass__")) {
Py_DECREF(bases);
return -1;
}
@@ -2556,7 +2556,7 @@ abstract_issubclass(PyObject *derived, PyObject *cls)
break;
}
}
- Py_LeaveRecursiveCall();
+ _Py_LeaveRecursiveCall();
Py_DECREF(bases);
return r;
}
@@ -2633,7 +2633,7 @@ object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls
if (PyTuple_Check(cls)) {
/* Not a general sequence -- that opens up the road to
recursion and stack overflow. */
- if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) {
+ if (_Py_EnterRecursiveCallTstate(tstate, " in __instancecheck__")) {
return -1;
}
Py_ssize_t n = PyTuple_GET_SIZE(cls);
@@ -2646,19 +2646,19 @@ object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls
break;
}
}
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
return r;
}
PyObject *checker = _PyObject_LookupSpecial(cls, &_Py_ID(__instancecheck__));
if (checker != NULL) {
- if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) {
+ if (_Py_EnterRecursiveCallTstate(tstate, " in __instancecheck__")) {
Py_DECREF(checker);
return -1;
}
PyObject *res = PyObject_CallOneArg(checker, inst);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
Py_DECREF(checker);
if (res == NULL) {
@@ -2725,7 +2725,7 @@ object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls)
if (PyTuple_Check(cls)) {
- if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) {
+ if (_Py_EnterRecursiveCallTstate(tstate, " in __subclasscheck__")) {
return -1;
}
Py_ssize_t n = PyTuple_GET_SIZE(cls);
@@ -2737,19 +2737,19 @@ object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls)
/* either found it, or got an error */
break;
}
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
return r;
}
checker = _PyObject_LookupSpecial(cls, &_Py_ID(__subclasscheck__));
if (checker != NULL) {
int ok = -1;
- if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) {
+ if (_Py_EnterRecursiveCallTstate(tstate, " in __subclasscheck__")) {
Py_DECREF(checker);
return ok;
}
PyObject *res = PyObject_CallOneArg(checker, derived);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
Py_DECREF(checker);
if (res != NULL) {
ok = PyObject_IsTrue(res);
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index b5066d0..b429f76 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -3489,7 +3489,7 @@ _PyBytesWriter_Alloc(_PyBytesWriter *writer, Py_ssize_t size)
Don't modify the _PyBytesWriter structure (use a shorter small buffer)
in debug mode to also be able to detect stack overflow when running
tests in debug mode. The _PyBytesWriter is large (more than 512 bytes),
- if Py_EnterRecursiveCall() is not used in deep C callback, we may hit a
+ if _Py_EnterRecursiveCall() is not used in deep C callback, we may hit a
stack overflow. */
writer->allocated = Py_MIN(writer->allocated, 10);
/* _PyBytesWriter_CheckConsistency() requires the last byte to be 0,
diff --git a/Objects/call.c b/Objects/call.c
index 4484762..678d162 100644
--- a/Objects/call.c
+++ b/Objects/call.c
@@ -209,11 +209,11 @@ _PyObject_MakeTpCall(PyThreadState *tstate, PyObject *callable,
}
PyObject *result = NULL;
- if (_Py_EnterRecursiveCall(tstate, " while calling a Python object") == 0)
+ if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object") == 0)
{
result = _PyCFunctionWithKeywords_TrampolineCall(
(PyCFunctionWithKeywords)call, callable, argstuple, kwdict);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
}
Py_DECREF(argstuple);
@@ -336,13 +336,13 @@ _PyObject_Call(PyThreadState *tstate, PyObject *callable,
return NULL;
}
- if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) {
+ if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object")) {
return NULL;
}
result = (*call)(callable, args, kwargs);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
return _Py_CheckFunctionResult(tstate, callable, result, NULL);
}
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index 9cc76cf..c3c541b 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -1,7 +1,7 @@
/* Descriptors -- a new, flexible way to describe attributes */
#include "Python.h"
-#include "pycore_ceval.h" // _Py_EnterRecursiveCall()
+#include "pycore_ceval.h" // _Py_EnterRecursiveCallTstate()
#include "pycore_object.h" // _PyObject_GC_UNTRACK()
#include "pycore_pystate.h" // _PyThreadState_GET()
#include "pycore_tuple.h" // _PyTuple_ITEMS()
@@ -302,7 +302,7 @@ typedef void (*funcptr)(void);
static inline funcptr
method_enter_call(PyThreadState *tstate, PyObject *func)
{
- if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) {
+ if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object")) {
return NULL;
}
return (funcptr)((PyMethodDescrObject *)func)->d_method->ml_meth;
@@ -330,7 +330,7 @@ method_vectorcall_VARARGS(
PyObject *result = _PyCFunction_TrampolineCall(
meth, args[0], argstuple);
Py_DECREF(argstuple);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
return result;
}
@@ -363,7 +363,7 @@ method_vectorcall_VARARGS_KEYWORDS(
}
result = _PyCFunctionWithKeywords_TrampolineCall(
meth, args[0], argstuple, kwdict);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
exit:
Py_DECREF(argstuple);
Py_XDECREF(kwdict);
@@ -386,7 +386,7 @@ method_vectorcall_FASTCALL_KEYWORDS_METHOD(
PyObject *result = meth(args[0],
((PyMethodDescrObject *)func)->d_common.d_type,
args+1, nargs-1, kwnames);
- Py_LeaveRecursiveCall();
+ _Py_LeaveRecursiveCall();
return result;
}
@@ -405,7 +405,7 @@ method_vectorcall_FASTCALL(
return NULL;
}
PyObject *result = meth(args[0], args+1, nargs-1);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
return result;
}
@@ -424,7 +424,7 @@ method_vectorcall_FASTCALL_KEYWORDS(
return NULL;
}
PyObject *result = meth(args[0], args+1, nargs-1, kwnames);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
return result;
}
@@ -451,7 +451,7 @@ method_vectorcall_NOARGS(
return NULL;
}
PyObject *result = _PyCFunction_TrampolineCall(meth, args[0], NULL);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
return result;
}
@@ -479,7 +479,7 @@ method_vectorcall_O(
return NULL;
}
PyObject *result = _PyCFunction_TrampolineCall(meth, args[0], args[1]);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
return result;
}
diff --git a/Objects/exceptions.c b/Objects/exceptions.c
index b26a0e9..cf8258b 100644
--- a/Objects/exceptions.c
+++ b/Objects/exceptions.c
@@ -7,6 +7,7 @@
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <stdbool.h>
+#include "pycore_ceval.h" // _Py_EnterRecursiveCall
#include "pycore_exceptions.h" // struct _Py_exc_state
#include "pycore_initconfig.h"
#include "pycore_object.h"
@@ -1097,7 +1098,7 @@ exceptiongroup_split_recursive(PyObject *exc,
for (Py_ssize_t i = 0; i < num_excs; i++) {
PyObject *e = PyTuple_GET_ITEM(eg->excs, i);
_exceptiongroup_split_result rec_result;
- if (Py_EnterRecursiveCall(" in exceptiongroup_split_recursive")) {
+ if (_Py_EnterRecursiveCall(" in exceptiongroup_split_recursive")) {
goto done;
}
if (exceptiongroup_split_recursive(
@@ -1105,10 +1106,10 @@ exceptiongroup_split_recursive(PyObject *exc,
construct_rest, &rec_result) < 0) {
assert(!rec_result.match);
assert(!rec_result.rest);
- Py_LeaveRecursiveCall();
+ _Py_LeaveRecursiveCall();
goto done;
}
- Py_LeaveRecursiveCall();
+ _Py_LeaveRecursiveCall();
if (rec_result.match) {
assert(PyList_CheckExact(match_list));
if (PyList_Append(match_list, rec_result.match) < 0) {
@@ -1234,11 +1235,11 @@ collect_exception_group_leaves(PyObject *exc, PyObject *leaves)
/* recursive calls */
for (Py_ssize_t i = 0; i < num_excs; i++) {
PyObject *e = PyTuple_GET_ITEM(eg->excs, i);
- if (Py_EnterRecursiveCall(" in collect_exception_group_leaves")) {
+ if (_Py_EnterRecursiveCall(" in collect_exception_group_leaves")) {
return -1;
}
int res = collect_exception_group_leaves(e, leaves);
- Py_LeaveRecursiveCall();
+ _Py_LeaveRecursiveCall();
if (res < 0) {
return -1;
}
diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index 8bcb1e0..953cf46 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -2,7 +2,7 @@
/* Method object implementation */
#include "Python.h"
-#include "pycore_ceval.h" // _Py_EnterRecursiveCall()
+#include "pycore_ceval.h" // _Py_EnterRecursiveCallTstate()
#include "pycore_object.h"
#include "pycore_pyerrors.h"
#include "pycore_pystate.h" // _PyThreadState_GET()
@@ -403,7 +403,7 @@ typedef void (*funcptr)(void);
static inline funcptr
cfunction_enter_call(PyThreadState *tstate, PyObject *func)
{
- if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) {
+ if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object")) {
return NULL;
}
return (funcptr)PyCFunction_GET_FUNCTION(func);
@@ -425,7 +425,7 @@ cfunction_vectorcall_FASTCALL(
return NULL;
}
PyObject *result = meth(PyCFunction_GET_SELF(func), args, nargs);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
return result;
}
@@ -441,7 +441,7 @@ cfunction_vectorcall_FASTCALL_KEYWORDS(
return NULL;
}
PyObject *result = meth(PyCFunction_GET_SELF(func), args, nargs, kwnames);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
return result;
}
@@ -457,7 +457,7 @@ cfunction_vectorcall_FASTCALL_KEYWORDS_METHOD(
return NULL;
}
PyObject *result = meth(PyCFunction_GET_SELF(func), cls, args, nargs, kwnames);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
return result;
}
@@ -485,7 +485,7 @@ cfunction_vectorcall_NOARGS(
}
PyObject *result = _PyCFunction_TrampolineCall(
meth, PyCFunction_GET_SELF(func), NULL);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
return result;
}
@@ -513,7 +513,7 @@ cfunction_vectorcall_O(
}
PyObject *result = _PyCFunction_TrampolineCall(
meth, PyCFunction_GET_SELF(func), args[0]);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
return result;
}
diff --git a/Objects/object.c b/Objects/object.c
index 1144719..6f2d9f8 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -3,7 +3,7 @@
#include "Python.h"
#include "pycore_call.h" // _PyObject_CallNoArgs()
-#include "pycore_ceval.h" // _Py_EnterRecursiveCall()
+#include "pycore_ceval.h" // _Py_EnterRecursiveCallTstate()
#include "pycore_context.h" // _PyContextTokenMissing_Type
#include "pycore_dict.h" // _PyObject_MakeDictFromInstanceAttributes()
#include "pycore_floatobject.h" // _PyFloat_DebugMallocStats()
@@ -427,12 +427,12 @@ PyObject_Repr(PyObject *v)
/* It is possible for a type to have a tp_repr representation that loops
infinitely. */
- if (_Py_EnterRecursiveCall(tstate,
- " while getting the repr of an object")) {
+ if (_Py_EnterRecursiveCallTstate(tstate,
+ " while getting the repr of an object")) {
return NULL;
}
res = (*Py_TYPE(v)->tp_repr)(v);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
if (res == NULL) {
return NULL;
@@ -487,11 +487,11 @@ PyObject_Str(PyObject *v)
/* It is possible for a type to have a tp_str representation that loops
infinitely. */
- if (_Py_EnterRecursiveCall(tstate, " while getting the str of an object")) {
+ if (_Py_EnterRecursiveCallTstate(tstate, " while getting the str of an object")) {
return NULL;
}
res = (*Py_TYPE(v)->tp_str)(v);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
if (res == NULL) {
return NULL;
@@ -724,11 +724,11 @@ PyObject_RichCompare(PyObject *v, PyObject *w, int op)
}
return NULL;
}
- if (_Py_EnterRecursiveCall(tstate, " in comparison")) {
+ if (_Py_EnterRecursiveCallTstate(tstate, " in comparison")) {
return NULL;
}
PyObject *res = do_richcompare(tstate, v, w, op);
- _Py_LeaveRecursiveCall(tstate);
+ _Py_LeaveRecursiveCallTstate(tstate);
return res;
}