diff options
author | Victor Stinner <vstinner@python.org> | 2019-11-14 12:36:21 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-14 12:36:21 (GMT) |
commit | 4d231bcc77ac8ce7d11bda0804130dcdd678f710 (patch) | |
tree | 5cb1019d966e2e29977430b0824d11ccf8bd24e4 /Include | |
parent | b9e681261cd5ce6db0a79461c58d7cc52cfa4902 (diff) | |
download | cpython-4d231bcc77ac8ce7d11bda0804130dcdd678f710.zip cpython-4d231bcc77ac8ce7d11bda0804130dcdd678f710.tar.gz cpython-4d231bcc77ac8ce7d11bda0804130dcdd678f710.tar.bz2 |
bpo-38644: Add _PyObject_Call() (GH-17089)
* Add pycore_call.h internal header file.
* Add _PyObject_Call(): PyObject_Call() with tstate
* Add _PyObject_CallNoArgTstate(): _PyObject_CallNoArg() with tstate
* Add _PyObject_FastCallDictTstate(): _PyObject_FastCallDict()
with tstate
* _PyObject_Call_Prepend() now takes tstate
* Replace _PyObject_FastCall() calls
with _PyObject_VectorcallTstate() calls
Diffstat (limited to 'Include')
-rw-r--r-- | Include/cpython/abstract.h | 17 | ||||
-rw-r--r-- | Include/internal/pycore_call.h | 39 |
2 files changed, 46 insertions, 10 deletions
diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index fef538e..2c4eae7 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -137,7 +137,8 @@ PyAPI_FUNC(PyObject *) PyVectorcall_Call(PyObject *callable, PyObject *tuple, Py static inline PyObject * _PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs) { - return _PyObject_Vectorcall(func, args, (size_t)nargs, NULL); + PyThreadState *tstate = PyThreadState_GET(); + return _PyObject_VectorcallTstate(tstate, func, args, (size_t)nargs, NULL); } /* Call a callable without any arguments @@ -145,7 +146,8 @@ _PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs) PyObject_CallNoArgs(). */ static inline PyObject * _PyObject_CallNoArg(PyObject *func) { - return _PyObject_Vectorcall(func, NULL, 0, NULL); + PyThreadState *tstate = PyThreadState_GET(); + return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); } static inline PyObject * @@ -155,16 +157,11 @@ _PyObject_CallOneArg(PyObject *func, PyObject *arg) PyObject *_args[2]; PyObject **args = _args + 1; // For PY_VECTORCALL_ARGUMENTS_OFFSET args[0] = arg; - return _PyObject_Vectorcall(func, args, - 1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); + PyThreadState *tstate = PyThreadState_GET(); + size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET; + return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL); } -PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend( - PyObject *callable, - PyObject *obj, - PyObject *args, - PyObject *kwargs); - PyAPI_FUNC(PyObject *) _PyObject_VectorcallMethod( PyObject *name, PyObject *const *args, size_t nargsf, PyObject *kwnames); diff --git a/Include/internal/pycore_call.h b/Include/internal/pycore_call.h new file mode 100644 index 0000000..f7d856a --- /dev/null +++ b/Include/internal/pycore_call.h @@ -0,0 +1,39 @@ +#ifndef Py_INTERNAL_CALL_H +#define Py_INTERNAL_CALL_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend( + PyThreadState *tstate, + PyObject *callable, + PyObject *obj, + PyObject *args, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyObject_FastCallDictTstate( + PyThreadState *tstate, + PyObject *callable, + PyObject *const *args, + size_t nargsf, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyObject_Call( + PyThreadState *tstate, + PyObject *callable, + PyObject *args, + PyObject *kwargs); + +static inline PyObject * +_PyObject_CallNoArgTstate(PyThreadState *tstate, PyObject *func) { + return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_CALL_H */ |