diff options
author | Victor Stinner <vstinner@python.org> | 2022-05-04 11:30:23 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-04 11:30:23 (GMT) |
commit | d716a0dfe2d1029111db393afaecdb04cc4093de (patch) | |
tree | 2644817d65b365bf1dd2872661948d1b564bff32 /Objects | |
parent | 14243369b5f80613628a565c224bba7fb3fcacd8 (diff) | |
download | cpython-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.c | 22 | ||||
-rw-r--r-- | Objects/bytesobject.c | 2 | ||||
-rw-r--r-- | Objects/call.c | 8 | ||||
-rw-r--r-- | Objects/descrobject.c | 18 | ||||
-rw-r--r-- | Objects/exceptions.c | 11 | ||||
-rw-r--r-- | Objects/methodobject.c | 14 | ||||
-rw-r--r-- | Objects/object.c | 16 |
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; } |