| #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 |
|
|
| #include "pycore_pystate.h" |
|
|
| 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); |
|
|
| extern PyObject * _PyObject_CallMethodFormat( |
| PyThreadState *tstate, PyObject *callable, const char *format, ...); |
|
|
|
|
| |
| static inline vectorcallfunc |
| _PyVectorcall_FunctionInline(PyObject *callable) |
| { |
| assert(callable != NULL); |
|
|
| PyTypeObject *tp = Py_TYPE(callable); |
| if (!PyType_HasFeature(tp, Py_TPFLAGS_HAVE_VECTORCALL)) { |
| return NULL; |
| } |
| assert(PyCallable_Check(callable)); |
|
|
| Py_ssize_t offset = tp->tp_vectorcall_offset; |
| assert(offset > 0); |
|
|
| vectorcallfunc ptr; |
| memcpy(&ptr, (char *) callable + offset, sizeof(ptr)); |
| return ptr; |
| } |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| static inline PyObject * |
| _PyObject_VectorcallTstate(PyThreadState *tstate, PyObject *callable, |
| PyObject *const *args, size_t nargsf, |
| PyObject *kwnames) |
| { |
| vectorcallfunc func; |
| PyObject *res; |
|
|
| assert(kwnames == NULL || PyTuple_Check(kwnames)); |
| assert(args != NULL || PyVectorcall_NARGS(nargsf) == 0); |
|
|
| func = _PyVectorcall_FunctionInline(callable); |
| if (func == NULL) { |
| Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); |
| return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwnames); |
| } |
| res = func(callable, args, nargsf, kwnames); |
| return _Py_CheckFunctionResult(tstate, callable, res, NULL); |
| } |
|
|
|
|
| static inline PyObject * |
| _PyObject_CallNoArgsTstate(PyThreadState *tstate, PyObject *func) { |
| return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); |
| } |
|
|
|
|
| |
| static inline PyObject * |
| _PyObject_CallNoArgs(PyObject *func) { |
| PyThreadState *tstate = _PyThreadState_GET(); |
| return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); |
| } |
|
|
|
|
| static inline PyObject * |
| _PyObject_FastCallTstate(PyThreadState *tstate, PyObject *func, PyObject *const *args, Py_ssize_t nargs) |
| { |
| return _PyObject_VectorcallTstate(tstate, func, args, (size_t)nargs, NULL); |
| } |
|
|
|
|
| #ifdef __cplusplus |
| } |
| #endif |
| #endif |
|
|