blob: 7972693918bbbee1f61f25d94e1885678a8af6b8 [file] [log] [blame]
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001#include "Python.h"
Victor Stinner384621c2020-06-22 17:27:35 +02002#include "pycore_call.h" // _PyObject_CallNoArgTstate()
3#include "pycore_ceval.h" // _PyEval_EvalFrame()
4#include "pycore_object.h" // _PyObject_GC_TRACK()
5#include "pycore_pyerrors.h" // _PyErr_Occurred()
6#include "pycore_pystate.h" // _PyThreadState_GET()
7#include "pycore_tuple.h" // _PyTuple_ITEMS()
8#include "frameobject.h" // _PyFrame_New_NoTrack()
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01009
10
Jeroen Demeyerd4efd912019-07-02 11:49:40 +020011static PyObject *const *
Victor Stinner17269092019-11-05 01:22:12 +010012_PyStack_UnpackDict(PyThreadState *tstate,
13 PyObject *const *args, Py_ssize_t nargs,
14 PyObject *kwargs, PyObject **p_kwnames);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +020015
16static void
17_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs,
18 PyObject *kwnames);
19
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020020
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010021static PyObject *
Victor Stinner4d231bc2019-11-14 13:36:21 +010022null_error(PyThreadState *tstate)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010023{
Victor Stinner4d231bc2019-11-14 13:36:21 +010024 if (!_PyErr_Occurred(tstate)) {
25 _PyErr_SetString(tstate, PyExc_SystemError,
26 "null argument to internal routine");
27 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010028 return NULL;
29}
30
31
32PyObject*
Victor Stinner17269092019-11-05 01:22:12 +010033_Py_CheckFunctionResult(PyThreadState *tstate, PyObject *callable,
34 PyObject *result, const char *where)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010035{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010036 assert((callable != NULL) ^ (where != NULL));
37
38 if (result == NULL) {
Victor Stinnerd12d0e72019-11-07 12:42:07 +010039 if (!_PyErr_Occurred(tstate)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010040 if (callable)
Victor Stinner17269092019-11-05 01:22:12 +010041 _PyErr_Format(tstate, PyExc_SystemError,
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +010042 "%R returned NULL without setting an exception",
Victor Stinner17269092019-11-05 01:22:12 +010043 callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010044 else
Victor Stinner17269092019-11-05 01:22:12 +010045 _PyErr_Format(tstate, PyExc_SystemError,
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +010046 "%s returned NULL without setting an exception",
Victor Stinner17269092019-11-05 01:22:12 +010047 where);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010048#ifdef Py_DEBUG
Victor Stinner87d3b9d2020-03-25 19:27:36 +010049 /* Ensure that the bug is caught in debug mode.
50 Py_FatalError() logs the SystemError exception raised above. */
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +010051 Py_FatalError("a function returned NULL without setting an exception");
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010052#endif
53 return NULL;
54 }
55 }
56 else {
Victor Stinnerd12d0e72019-11-07 12:42:07 +010057 if (_PyErr_Occurred(tstate)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010058 Py_DECREF(result);
59
60 if (callable) {
Victor Stinner17269092019-11-05 01:22:12 +010061 _PyErr_FormatFromCauseTstate(
62 tstate, PyExc_SystemError,
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +010063 "%R returned a result with an exception set", callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010064 }
65 else {
Victor Stinner17269092019-11-05 01:22:12 +010066 _PyErr_FormatFromCauseTstate(
67 tstate, PyExc_SystemError,
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +010068 "%s returned a result with an exception set", where);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010069 }
70#ifdef Py_DEBUG
Victor Stinner87d3b9d2020-03-25 19:27:36 +010071 /* Ensure that the bug is caught in debug mode.
72 Py_FatalError() logs the SystemError exception raised above. */
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +010073 Py_FatalError("a function returned a result with an exception set");
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010074#endif
75 return NULL;
76 }
77 }
78 return result;
79}
80
81
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +010082int
83_Py_CheckSlotResult(PyObject *obj, const char *slot_name, int success)
84{
85 PyThreadState *tstate = _PyThreadState_GET();
86 if (!success) {
87 if (!_PyErr_Occurred(tstate)) {
88 _Py_FatalErrorFormat(__func__,
89 "Slot %s of type %s failed "
90 "without setting an exception",
91 slot_name, Py_TYPE(obj)->tp_name);
92 }
93 }
94 else {
95 if (_PyErr_Occurred(tstate)) {
96 _Py_FatalErrorFormat(__func__,
97 "Slot %s of type %s succeeded "
98 "with an exception set",
99 slot_name, Py_TYPE(obj)->tp_name);
100 }
101 }
102 return 1;
103}
104
105
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100106/* --- Core PyObject call functions ------------------------------- */
107
Victor Stinner2ff58a22019-06-17 14:27:23 +0200108/* Call a callable Python object without any arguments */
109PyObject *
110PyObject_CallNoArgs(PyObject *func)
111{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100112 PyThreadState *tstate = _PyThreadState_GET();
113 return _PyObject_CallNoArgTstate(tstate, func);
Victor Stinner2ff58a22019-06-17 14:27:23 +0200114}
115
116
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100117PyObject *
Victor Stinner4d231bc2019-11-14 13:36:21 +0100118_PyObject_FastCallDictTstate(PyThreadState *tstate, PyObject *callable,
119 PyObject *const *args, size_t nargsf,
120 PyObject *kwargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100121{
Victor Stinner17269092019-11-05 01:22:12 +0100122 assert(callable != NULL);
123
Petr Viktorinffd97532020-02-11 17:46:57 +0100124 /* PyObject_VectorcallDict() must not be called with an exception set,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100125 because it can clear it (directly or indirectly) and so the
126 caller loses its exception */
Victor Stinner17269092019-11-05 01:22:12 +0100127 assert(!_PyErr_Occurred(tstate));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200128
129 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100130 assert(nargs >= 0);
131 assert(nargs == 0 || args != NULL);
132 assert(kwargs == NULL || PyDict_Check(kwargs));
133
Petr Viktorinffd97532020-02-11 17:46:57 +0100134 vectorcallfunc func = PyVectorcall_Function(callable);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200135 if (func == NULL) {
136 /* Use tp_call instead */
Victor Stinner7e433732019-11-08 10:05:17 +0100137 return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100138 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200139
140 PyObject *res;
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200141 if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200142 res = func(callable, args, nargsf, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100143 }
144 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200145 PyObject *kwnames;
146 PyObject *const *newargs;
Victor Stinner17269092019-11-05 01:22:12 +0100147 newargs = _PyStack_UnpackDict(tstate,
148 args, nargs,
149 kwargs, &kwnames);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200150 if (newargs == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100151 return NULL;
152 }
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200153 res = func(callable, newargs,
154 nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
155 _PyStack_UnpackDict_Free(newargs, nargs, kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100156 }
Victor Stinner17269092019-11-05 01:22:12 +0100157 return _Py_CheckFunctionResult(tstate, callable, res, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100158}
159
160
161PyObject *
Petr Viktorinffd97532020-02-11 17:46:57 +0100162PyObject_VectorcallDict(PyObject *callable, PyObject *const *args,
Victor Stinner4d231bc2019-11-14 13:36:21 +0100163 size_t nargsf, PyObject *kwargs)
164{
165 PyThreadState *tstate = _PyThreadState_GET();
166 return _PyObject_FastCallDictTstate(tstate, callable, args, nargsf, kwargs);
167}
168
169
170PyObject *
Victor Stinner7e433732019-11-08 10:05:17 +0100171_PyObject_MakeTpCall(PyThreadState *tstate, PyObject *callable,
172 PyObject *const *args, Py_ssize_t nargs,
173 PyObject *keywords)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100174{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100175 assert(nargs >= 0);
176 assert(nargs == 0 || args != NULL);
177 assert(keywords == NULL || PyTuple_Check(keywords) || PyDict_Check(keywords));
178
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200179 /* Slow path: build a temporary tuple for positional arguments and a
180 * temporary dictionary for keyword arguments (if any) */
181 ternaryfunc call = Py_TYPE(callable)->tp_call;
182 if (call == NULL) {
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100183 _PyErr_Format(tstate, PyExc_TypeError,
184 "'%.200s' object is not callable",
185 Py_TYPE(callable)->tp_name);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200186 return NULL;
187 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100188
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200189 PyObject *argstuple = _PyTuple_FromArray(args, nargs);
190 if (argstuple == NULL) {
191 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100192 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200193
194 PyObject *kwdict;
195 if (keywords == NULL || PyDict_Check(keywords)) {
196 kwdict = keywords;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100197 }
198 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200199 if (PyTuple_GET_SIZE(keywords)) {
200 assert(args != NULL);
201 kwdict = _PyStack_AsDict(args + nargs, keywords);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100202 if (kwdict == NULL) {
203 Py_DECREF(argstuple);
204 return NULL;
205 }
206 }
207 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200208 keywords = kwdict = NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100209 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100210 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200211
212 PyObject *result = NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100213 if (_Py_EnterRecursiveCall(tstate, " while calling a Python object") == 0)
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200214 {
215 result = call(callable, argstuple, kwdict);
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100216 _Py_LeaveRecursiveCall(tstate);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200217 }
218
219 Py_DECREF(argstuple);
220 if (kwdict != keywords) {
221 Py_DECREF(kwdict);
222 }
223
Victor Stinner4d231bc2019-11-14 13:36:21 +0100224 return _Py_CheckFunctionResult(tstate, callable, result, NULL);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200225}
226
227
228PyObject *
229PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs)
230{
Victor Stinner17269092019-11-05 01:22:12 +0100231 PyThreadState *tstate = _PyThreadState_GET();
Petr Viktorin056c0822020-12-30 00:32:07 +0100232 vectorcallfunc func;
Victor Stinner17269092019-11-05 01:22:12 +0100233
Petr Viktorinffd97532020-02-11 17:46:57 +0100234 /* get vectorcallfunc as in PyVectorcall_Function, but without
235 * the Py_TPFLAGS_HAVE_VECTORCALL check */
Petr Viktorinfb9423f2019-06-02 23:52:20 +0200236 Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset;
Jeroen Demeyera8b27e62019-06-24 12:41:05 +0200237 if (offset <= 0) {
Victor Stinner17269092019-11-05 01:22:12 +0100238 _PyErr_Format(tstate, PyExc_TypeError,
239 "'%.200s' object does not support vectorcall",
240 Py_TYPE(callable)->tp_name);
Petr Viktorinfb9423f2019-06-02 23:52:20 +0200241 return NULL;
242 }
Petr Viktorin056c0822020-12-30 00:32:07 +0100243 memcpy(&func, (char *) callable + offset, sizeof(func));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200244 if (func == NULL) {
Victor Stinner17269092019-11-05 01:22:12 +0100245 _PyErr_Format(tstate, PyExc_TypeError,
246 "'%.200s' object does not support vectorcall",
247 Py_TYPE(callable)->tp_name);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200248 return NULL;
249 }
Petr Viktorinfb9423f2019-06-02 23:52:20 +0200250
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200251 Py_ssize_t nargs = PyTuple_GET_SIZE(tuple);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200252
253 /* Fast path for no keywords */
254 if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
255 return func(callable, _PyTuple_ITEMS(tuple), nargs, NULL);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200256 }
257
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200258 /* Convert arguments & call */
259 PyObject *const *args;
260 PyObject *kwnames;
Victor Stinner17269092019-11-05 01:22:12 +0100261 args = _PyStack_UnpackDict(tstate,
262 _PyTuple_ITEMS(tuple), nargs,
263 kwargs, &kwnames);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200264 if (args == NULL) {
265 return NULL;
266 }
267 PyObject *result = func(callable, args,
268 nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
269 _PyStack_UnpackDict_Free(args, nargs, kwnames);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100270
Victor Stinner17269092019-11-05 01:22:12 +0100271 return _Py_CheckFunctionResult(tstate, callable, result, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100272}
273
274
275PyObject *
Victor Stinner4d231bc2019-11-14 13:36:21 +0100276_PyObject_Call(PyThreadState *tstate, PyObject *callable,
277 PyObject *args, PyObject *kwargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100278{
279 ternaryfunc call;
280 PyObject *result;
281
282 /* PyObject_Call() must not be called with an exception set,
283 because it can clear it (directly or indirectly) and so the
284 caller loses its exception */
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100285 assert(!_PyErr_Occurred(tstate));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100286 assert(PyTuple_Check(args));
287 assert(kwargs == NULL || PyDict_Check(kwargs));
288
Petr Viktorinffd97532020-02-11 17:46:57 +0100289 if (PyVectorcall_Function(callable) != NULL) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200290 return PyVectorcall_Call(callable, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100291 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100292 else {
Victor Stinner58ac7002020-02-07 03:04:21 +0100293 call = Py_TYPE(callable)->tp_call;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100294 if (call == NULL) {
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100295 _PyErr_Format(tstate, PyExc_TypeError,
296 "'%.200s' object is not callable",
Victor Stinner58ac7002020-02-07 03:04:21 +0100297 Py_TYPE(callable)->tp_name);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100298 return NULL;
299 }
300
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100301 if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100302 return NULL;
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100303 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100304
305 result = (*call)(callable, args, kwargs);
306
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100307 _Py_LeaveRecursiveCall(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100308
Victor Stinner17269092019-11-05 01:22:12 +0100309 return _Py_CheckFunctionResult(tstate, callable, result, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100310 }
311}
312
Victor Stinner4d231bc2019-11-14 13:36:21 +0100313PyObject *
314PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
315{
316 PyThreadState *tstate = _PyThreadState_GET();
317 return _PyObject_Call(tstate, callable, args, kwargs);
318}
319
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100320
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +0200321PyObject *
322PyCFunction_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
323{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100324 PyThreadState *tstate = _PyThreadState_GET();
325 return _PyObject_Call(tstate, callable, args, kwargs);
Jeroen Demeyer7a6873c2019-09-11 13:01:01 +0200326}
327
328
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100329/* --- PyFunction call functions ---------------------------------- */
330
331static PyObject* _Py_HOT_FUNCTION
Victor Stinnerb5e170f2019-11-16 01:03:22 +0100332function_code_fastcall(PyThreadState *tstate, PyCodeObject *co,
333 PyObject *const *args, Py_ssize_t nargs,
Mark Shannond6c33fb2021-01-29 13:24:55 +0000334 PyFunctionObject *func)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100335{
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100336 assert(tstate != NULL);
Mark Shannond6c33fb2021-01-29 13:24:55 +0000337 assert(func != NULL);
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100338
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100339 /* XXX Perhaps we should create a specialized
340 _PyFrame_New_NoTrack() that doesn't take locals, but does
341 take builtins without sanity checking them.
342 */
Mark Shannond6c33fb2021-01-29 13:24:55 +0000343 PyFrameObject *f = _PyFrame_New_NoTrack(tstate, co, func->func_globals, func->func_builtins, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100344 if (f == NULL) {
345 return NULL;
346 }
347
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100348 PyObject **fastlocals = f->f_localsplus;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100349
Victor Stinnerbe434dc2019-11-05 00:51:22 +0100350 for (Py_ssize_t i = 0; i < nargs; i++) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100351 Py_INCREF(*args);
352 fastlocals[i] = *args++;
353 }
Victor Stinnerb9e68122019-11-14 12:20:46 +0100354 PyObject *result = _PyEval_EvalFrame(tstate, f, 0);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100355
356 if (Py_REFCNT(f) > 1) {
357 Py_DECREF(f);
358 _PyObject_GC_TRACK(f);
359 }
360 else {
361 ++tstate->recursion_depth;
362 Py_DECREF(f);
363 --tstate->recursion_depth;
364 }
365 return result;
366}
367
368
369PyObject *
Jeroen Demeyer37788bc2019-05-30 15:11:22 +0200370_PyFunction_Vectorcall(PyObject *func, PyObject* const* stack,
371 size_t nargsf, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100372{
Victor Stinnerb5e170f2019-11-16 01:03:22 +0100373 assert(PyFunction_Check(func));
374 assert(kwnames == NULL || PyTuple_CheckExact(kwnames));
375
376 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
377 assert(nargs >= 0);
378 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
379 assert((nargs == 0 && nkwargs == 0) || stack != NULL);
380 /* kwnames must only contain strings and all keys must be unique */
381
382 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100383 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100384 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100385
386 if (co->co_kwonlyargcount == 0 && nkwargs == 0 &&
Victor Stinner086c3ae2017-10-25 05:26:17 -0700387 (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100388 {
Pablo Galindocd74e662019-06-01 18:08:04 +0100389 if (argdefs == NULL && co->co_argcount == nargs) {
Mark Shannond6c33fb2021-01-29 13:24:55 +0000390 return function_code_fastcall(tstate, co, stack, nargs, (PyFunctionObject *)func);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100391 }
392 else if (nargs == 0 && argdefs != NULL
Pablo Galindocd74e662019-06-01 18:08:04 +0100393 && co->co_argcount == PyTuple_GET_SIZE(argdefs)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100394 /* function called with no arguments, but all parameters have
395 a default value: use default values as arguments .*/
Victor Stinnerd17a6932018-11-09 16:56:48 +0100396 stack = _PyTuple_ITEMS(argdefs);
Victor Stinnerb5e170f2019-11-16 01:03:22 +0100397 return function_code_fastcall(tstate, co,
398 stack, PyTuple_GET_SIZE(argdefs),
Mark Shannond6c33fb2021-01-29 13:24:55 +0000399 (PyFunctionObject *)func);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100400 }
401 }
402
Victor Stinnerb5e170f2019-11-16 01:03:22 +0100403 return _PyEval_EvalCode(tstate,
Mark Shannond6c33fb2021-01-29 13:24:55 +0000404 PyFunction_AS_FRAME_CONSTRUCTOR(func), (PyObject *)NULL,
Victor Stinnerb5e170f2019-11-16 01:03:22 +0100405 stack, nargs,
406 nkwargs ? _PyTuple_ITEMS(kwnames) : NULL,
407 stack + nargs,
Mark Shannond6c33fb2021-01-29 13:24:55 +0000408 nkwargs, 1);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100409}
410
411
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100412/* --- More complex call functions -------------------------------- */
413
414/* External interface to call any callable object.
415 The args must be a tuple or NULL. The kwargs must be a dict or NULL. */
416PyObject *
417PyEval_CallObjectWithKeywords(PyObject *callable,
418 PyObject *args, PyObject *kwargs)
419{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100420 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100421#ifdef Py_DEBUG
422 /* PyEval_CallObjectWithKeywords() must not be called with an exception
423 set. It raises a new exception if parameters are invalid or if
424 PyTuple_New() fails, and so the original exception is lost. */
Victor Stinner4d231bc2019-11-14 13:36:21 +0100425 assert(!_PyErr_Occurred(tstate));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100426#endif
427
INADA Naoki3824cd82017-03-01 20:41:03 +0900428 if (args != NULL && !PyTuple_Check(args)) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100429 _PyErr_SetString(tstate, PyExc_TypeError,
430 "argument list must be a tuple");
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100431 return NULL;
432 }
433
434 if (kwargs != NULL && !PyDict_Check(kwargs)) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100435 _PyErr_SetString(tstate, PyExc_TypeError,
436 "keyword list must be a dictionary");
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100437 return NULL;
438 }
439
INADA Naoki3824cd82017-03-01 20:41:03 +0900440 if (args == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100441 return _PyObject_FastCallDictTstate(tstate, callable, NULL, 0, kwargs);
INADA Naoki3824cd82017-03-01 20:41:03 +0900442 }
443 else {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100444 return _PyObject_Call(tstate, callable, args, kwargs);
INADA Naoki3824cd82017-03-01 20:41:03 +0900445 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100446}
447
448
449PyObject *
450PyObject_CallObject(PyObject *callable, PyObject *args)
451{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100452 PyThreadState *tstate = _PyThreadState_GET();
453 assert(!_PyErr_Occurred(tstate));
Jeroen Demeyer1dbd0842019-07-11 17:57:32 +0200454 if (args == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100455 return _PyObject_CallNoArgTstate(tstate, callable);
Jeroen Demeyer1dbd0842019-07-11 17:57:32 +0200456 }
457 if (!PyTuple_Check(args)) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100458 _PyErr_SetString(tstate, PyExc_TypeError,
459 "argument list must be a tuple");
Jeroen Demeyer1dbd0842019-07-11 17:57:32 +0200460 return NULL;
461 }
Victor Stinner4d231bc2019-11-14 13:36:21 +0100462 return _PyObject_Call(tstate, callable, args, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100463}
464
465
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100466/* Call callable(obj, *args, **kwargs). */
467PyObject *
Victor Stinner4d231bc2019-11-14 13:36:21 +0100468_PyObject_Call_Prepend(PyThreadState *tstate, PyObject *callable,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100469 PyObject *obj, PyObject *args, PyObject *kwargs)
470{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100471 assert(PyTuple_Check(args));
472
Victor Stinner4d231bc2019-11-14 13:36:21 +0100473 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
474 PyObject **stack;
475
476 Py_ssize_t argcount = PyTuple_GET_SIZE(args);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100477 if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
478 stack = small_stack;
479 }
480 else {
481 stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *));
482 if (stack == NULL) {
483 PyErr_NoMemory();
484 return NULL;
485 }
486 }
487
488 /* use borrowed references */
489 stack[0] = obj;
490 memcpy(&stack[1],
Victor Stinnerd17a6932018-11-09 16:56:48 +0100491 _PyTuple_ITEMS(args),
492 argcount * sizeof(PyObject *));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100493
Victor Stinner4d231bc2019-11-14 13:36:21 +0100494 PyObject *result = _PyObject_FastCallDictTstate(tstate, callable,
495 stack, argcount + 1,
496 kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100497 if (stack != small_stack) {
498 PyMem_Free(stack);
499 }
500 return result;
501}
502
503
504/* --- Call with a format string ---------------------------------- */
505
506static PyObject *
Victor Stinner4d231bc2019-11-14 13:36:21 +0100507_PyObject_CallFunctionVa(PyThreadState *tstate, PyObject *callable,
508 const char *format, va_list va, int is_size_t)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100509{
510 PyObject* small_stack[_PY_FASTCALL_SMALL_STACK];
511 const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack);
512 PyObject **stack;
513 Py_ssize_t nargs, i;
514 PyObject *result;
515
516 if (callable == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100517 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100518 }
519
520 if (!format || !*format) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100521 return _PyObject_CallNoArgTstate(tstate, callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100522 }
523
524 if (is_size_t) {
525 stack = _Py_VaBuildStack_SizeT(small_stack, small_stack_len,
526 format, va, &nargs);
527 }
528 else {
529 stack = _Py_VaBuildStack(small_stack, small_stack_len,
530 format, va, &nargs);
531 }
532 if (stack == NULL) {
533 return NULL;
534 }
535
536 if (nargs == 1 && PyTuple_Check(stack[0])) {
537 /* Special cases for backward compatibility:
538 - PyObject_CallFunction(func, "O", tuple) calls func(*tuple)
539 - PyObject_CallFunction(func, "(OOO)", arg1, arg2, arg3) calls
540 func(*(arg1, arg2, arg3)): func(arg1, arg2, arg3) */
541 PyObject *args = stack[0];
Victor Stinner4d231bc2019-11-14 13:36:21 +0100542 result = _PyObject_VectorcallTstate(tstate, callable,
543 _PyTuple_ITEMS(args),
544 PyTuple_GET_SIZE(args),
545 NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100546 }
547 else {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100548 result = _PyObject_VectorcallTstate(tstate, callable,
549 stack, nargs, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100550 }
551
552 for (i = 0; i < nargs; ++i) {
553 Py_DECREF(stack[i]);
554 }
555 if (stack != small_stack) {
556 PyMem_Free(stack);
557 }
558 return result;
559}
560
561
562PyObject *
563PyObject_CallFunction(PyObject *callable, const char *format, ...)
564{
565 va_list va;
566 PyObject *result;
Victor Stinner4d231bc2019-11-14 13:36:21 +0100567 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100568
569 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100570 result = _PyObject_CallFunctionVa(tstate, callable, format, va, 0);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100571 va_end(va);
572
573 return result;
574}
575
576
INADA Naokiaa289a52017-03-14 18:00:59 +0900577/* PyEval_CallFunction is exact copy of PyObject_CallFunction.
578 * This function is kept for backward compatibility.
579 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100580PyObject *
581PyEval_CallFunction(PyObject *callable, const char *format, ...)
582{
INADA Naokiaa289a52017-03-14 18:00:59 +0900583 va_list va;
584 PyObject *result;
Victor Stinner4d231bc2019-11-14 13:36:21 +0100585 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100586
INADA Naokiaa289a52017-03-14 18:00:59 +0900587 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100588 result = _PyObject_CallFunctionVa(tstate, callable, format, va, 0);
INADA Naokiaa289a52017-03-14 18:00:59 +0900589 va_end(va);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100590
INADA Naokiaa289a52017-03-14 18:00:59 +0900591 return result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100592}
593
594
595PyObject *
596_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
597{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100598 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100599
Victor Stinner4d231bc2019-11-14 13:36:21 +0100600 va_list va;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100601 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100602 PyObject *result = _PyObject_CallFunctionVa(tstate, callable, format, va, 1);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100603 va_end(va);
604
605 return result;
606}
607
608
609static PyObject*
Victor Stinner4d231bc2019-11-14 13:36:21 +0100610callmethod(PyThreadState *tstate, PyObject* callable, const char *format, va_list va, int is_size_t)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100611{
612 assert(callable != NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100613 if (!PyCallable_Check(callable)) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100614 _PyErr_Format(tstate, PyExc_TypeError,
615 "attribute of type '%.200s' is not callable",
616 Py_TYPE(callable)->tp_name);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100617 return NULL;
618 }
619
Victor Stinner4d231bc2019-11-14 13:36:21 +0100620 return _PyObject_CallFunctionVa(tstate, callable, format, va, is_size_t);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100621}
622
623
624PyObject *
625PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
626{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100627 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100628
629 if (obj == NULL || name == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100630 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100631 }
632
Victor Stinner4d231bc2019-11-14 13:36:21 +0100633 PyObject *callable = PyObject_GetAttrString(obj, name);
634 if (callable == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100635 return NULL;
Victor Stinner4d231bc2019-11-14 13:36:21 +0100636 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100637
Victor Stinner4d231bc2019-11-14 13:36:21 +0100638 va_list va;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100639 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100640 PyObject *retval = callmethod(tstate, callable, format, va, 0);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100641 va_end(va);
642
643 Py_DECREF(callable);
644 return retval;
645}
646
647
INADA Naokiaa289a52017-03-14 18:00:59 +0900648/* PyEval_CallMethod is exact copy of PyObject_CallMethod.
649 * This function is kept for backward compatibility.
650 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100651PyObject *
652PyEval_CallMethod(PyObject *obj, const char *name, const char *format, ...)
653{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100654 PyThreadState *tstate = _PyThreadState_GET();
INADA Naokiaa289a52017-03-14 18:00:59 +0900655 if (obj == NULL || name == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100656 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100657 }
658
Victor Stinner4d231bc2019-11-14 13:36:21 +0100659 PyObject *callable = PyObject_GetAttrString(obj, name);
660 if (callable == NULL) {
INADA Naokiaa289a52017-03-14 18:00:59 +0900661 return NULL;
Victor Stinner4d231bc2019-11-14 13:36:21 +0100662 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100663
Victor Stinner4d231bc2019-11-14 13:36:21 +0100664 va_list va;
INADA Naokiaa289a52017-03-14 18:00:59 +0900665 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100666 PyObject *retval = callmethod(tstate, callable, format, va, 0);
INADA Naokiaa289a52017-03-14 18:00:59 +0900667 va_end(va);
668
669 Py_DECREF(callable);
670 return retval;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100671}
672
673
674PyObject *
675_PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name,
676 const char *format, ...)
677{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100678 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100679 if (obj == NULL || name == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100680 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100681 }
682
Victor Stinner4d231bc2019-11-14 13:36:21 +0100683 PyObject *callable = _PyObject_GetAttrId(obj, name);
684 if (callable == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100685 return NULL;
Victor Stinner4d231bc2019-11-14 13:36:21 +0100686 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100687
Victor Stinner4d231bc2019-11-14 13:36:21 +0100688 va_list va;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100689 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100690 PyObject *retval = callmethod(tstate, callable, format, va, 0);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100691 va_end(va);
692
693 Py_DECREF(callable);
694 return retval;
695}
696
697
698PyObject *
699_PyObject_CallMethod_SizeT(PyObject *obj, const char *name,
700 const char *format, ...)
701{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100702 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100703 if (obj == NULL || name == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100704 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100705 }
706
Victor Stinner4d231bc2019-11-14 13:36:21 +0100707 PyObject *callable = PyObject_GetAttrString(obj, name);
708 if (callable == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100709 return NULL;
Victor Stinner4d231bc2019-11-14 13:36:21 +0100710 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100711
Victor Stinner4d231bc2019-11-14 13:36:21 +0100712 va_list va;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100713 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100714 PyObject *retval = callmethod(tstate, callable, format, va, 1);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100715 va_end(va);
716
717 Py_DECREF(callable);
718 return retval;
719}
720
721
722PyObject *
723_PyObject_CallMethodId_SizeT(PyObject *obj, _Py_Identifier *name,
724 const char *format, ...)
725{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100726 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100727 if (obj == NULL || name == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100728 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100729 }
730
Victor Stinner4d231bc2019-11-14 13:36:21 +0100731 PyObject *callable = _PyObject_GetAttrId(obj, name);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100732 if (callable == NULL) {
733 return NULL;
734 }
735
Victor Stinner4d231bc2019-11-14 13:36:21 +0100736 va_list va;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100737 va_start(va, format);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100738 PyObject *retval = callmethod(tstate, callable, format, va, 1);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100739 va_end(va);
740
741 Py_DECREF(callable);
742 return retval;
743}
744
745
746/* --- Call with "..." arguments ---------------------------------- */
747
748static PyObject *
Victor Stinner4d231bc2019-11-14 13:36:21 +0100749object_vacall(PyThreadState *tstate, PyObject *base,
750 PyObject *callable, va_list vargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100751{
752 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
753 PyObject **stack;
754 Py_ssize_t nargs;
755 PyObject *result;
756 Py_ssize_t i;
757 va_list countva;
758
759 if (callable == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100760 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100761 }
762
763 /* Count the number of arguments */
764 va_copy(countva, vargs);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700765 nargs = base ? 1 : 0;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100766 while (1) {
767 PyObject *arg = va_arg(countva, PyObject *);
768 if (arg == NULL) {
769 break;
770 }
771 nargs++;
772 }
773 va_end(countva);
774
775 /* Copy arguments */
776 if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
777 stack = small_stack;
778 }
779 else {
780 stack = PyMem_Malloc(nargs * sizeof(stack[0]));
781 if (stack == NULL) {
782 PyErr_NoMemory();
783 return NULL;
784 }
785 }
786
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700787 i = 0;
788 if (base) {
789 stack[i++] = base;
790 }
791
792 for (; i < nargs; ++i) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100793 stack[i] = va_arg(vargs, PyObject *);
794 }
795
796 /* Call the function */
Victor Stinner4d231bc2019-11-14 13:36:21 +0100797 result = _PyObject_VectorcallTstate(tstate, callable, stack, nargs, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100798
799 if (stack != small_stack) {
800 PyMem_Free(stack);
801 }
802 return result;
803}
804
805
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700806PyObject *
Petr Viktorinffd97532020-02-11 17:46:57 +0100807PyObject_VectorcallMethod(PyObject *name, PyObject *const *args,
Jeroen Demeyerb1263d52019-06-28 11:49:00 +0200808 size_t nargsf, PyObject *kwnames)
809{
810 assert(name != NULL);
811 assert(args != NULL);
812 assert(PyVectorcall_NARGS(nargsf) >= 1);
813
Victor Stinner7e433732019-11-08 10:05:17 +0100814 PyThreadState *tstate = _PyThreadState_GET();
Jeroen Demeyerb1263d52019-06-28 11:49:00 +0200815 PyObject *callable = NULL;
816 /* Use args[0] as "self" argument */
817 int unbound = _PyObject_GetMethod(args[0], name, &callable);
818 if (callable == NULL) {
819 return NULL;
820 }
821
822 if (unbound) {
823 /* We must remove PY_VECTORCALL_ARGUMENTS_OFFSET since
824 * that would be interpreted as allowing to change args[-1] */
825 nargsf &= ~PY_VECTORCALL_ARGUMENTS_OFFSET;
826 }
827 else {
828 /* Skip "self". We can keep PY_VECTORCALL_ARGUMENTS_OFFSET since
829 * args[-1] in the onward call is args[0] here. */
830 args++;
831 nargsf--;
832 }
Victor Stinner7e433732019-11-08 10:05:17 +0100833 PyObject *result = _PyObject_VectorcallTstate(tstate, callable,
834 args, nargsf, kwnames);
Jeroen Demeyerb1263d52019-06-28 11:49:00 +0200835 Py_DECREF(callable);
836 return result;
837}
838
839
840PyObject *
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700841PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)
842{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100843 PyThreadState *tstate = _PyThreadState_GET();
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700844 if (obj == NULL || name == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100845 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100846 }
847
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700848 PyObject *callable = NULL;
849 int is_method = _PyObject_GetMethod(obj, name, &callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100850 if (callable == NULL) {
851 return NULL;
852 }
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700853 obj = is_method ? obj : NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100854
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700855 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100856 va_start(vargs, name);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100857 PyObject *result = object_vacall(tstate, obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100858 va_end(vargs);
859
860 Py_DECREF(callable);
861 return result;
862}
863
864
865PyObject *
866_PyObject_CallMethodIdObjArgs(PyObject *obj,
867 struct _Py_Identifier *name, ...)
868{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100869 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100870 if (obj == NULL || name == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +0100871 return null_error(tstate);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100872 }
873
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700874 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
875 if (!oname) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100876 return NULL;
877 }
878
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -0700879 PyObject *callable = NULL;
880 int is_method = _PyObject_GetMethod(obj, oname, &callable);
881 if (callable == NULL) {
882 return NULL;
883 }
884 obj = is_method ? obj : NULL;
885
886 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100887 va_start(vargs, name);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100888 PyObject *result = object_vacall(tstate, obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100889 va_end(vargs);
890
891 Py_DECREF(callable);
892 return result;
893}
894
895
896PyObject *
897PyObject_CallFunctionObjArgs(PyObject *callable, ...)
898{
Victor Stinner4d231bc2019-11-14 13:36:21 +0100899 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100900 va_list vargs;
901 PyObject *result;
902
903 va_start(vargs, callable);
Victor Stinner4d231bc2019-11-14 13:36:21 +0100904 result = object_vacall(tstate, NULL, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100905 va_end(vargs);
906
907 return result;
908}
909
910
911/* --- PyStack functions ------------------------------------------ */
912
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100913PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200914_PyStack_AsDict(PyObject *const *values, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100915{
916 Py_ssize_t nkwargs;
917 PyObject *kwdict;
918 Py_ssize_t i;
919
920 assert(kwnames != NULL);
921 nkwargs = PyTuple_GET_SIZE(kwnames);
922 kwdict = _PyDict_NewPresized(nkwargs);
923 if (kwdict == NULL) {
924 return NULL;
925 }
926
927 for (i = 0; i < nkwargs; i++) {
928 PyObject *key = PyTuple_GET_ITEM(kwnames, i);
929 PyObject *value = *values++;
930 /* If key already exists, replace it with the new value */
931 if (PyDict_SetItem(kwdict, key, value)) {
932 Py_DECREF(kwdict);
933 return NULL;
934 }
935 }
936 return kwdict;
937}
938
939
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200940/* Convert (args, nargs, kwargs: dict) into a (stack, nargs, kwnames: tuple).
941
942 Allocate a new argument vector and keyword names tuple. Return the argument
943 vector; return NULL with exception set on error. Return the keyword names
944 tuple in *p_kwnames.
945
Jeroen Demeyer05677862019-08-16 12:41:27 +0200946 This also checks that all keyword names are strings. If not, a TypeError is
947 raised.
948
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200949 The newly allocated argument vector supports PY_VECTORCALL_ARGUMENTS_OFFSET.
950
Jeroen Demeyer05677862019-08-16 12:41:27 +0200951 When done, you must call _PyStack_UnpackDict_Free(stack, nargs, kwnames) */
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200952static PyObject *const *
Victor Stinner17269092019-11-05 01:22:12 +0100953_PyStack_UnpackDict(PyThreadState *tstate,
954 PyObject *const *args, Py_ssize_t nargs,
955 PyObject *kwargs, PyObject **p_kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100956{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100957 assert(nargs >= 0);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200958 assert(kwargs != NULL);
959 assert(PyDict_Check(kwargs));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100960
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200961 Py_ssize_t nkwargs = PyDict_GET_SIZE(kwargs);
962 /* Check for overflow in the PyMem_Malloc() call below. The subtraction
963 * in this check cannot overflow: both maxnargs and nkwargs are
964 * non-negative signed integers, so their difference fits in the type. */
965 Py_ssize_t maxnargs = PY_SSIZE_T_MAX / sizeof(args[0]) - 1;
966 if (nargs > maxnargs - nkwargs) {
Victor Stinner17269092019-11-05 01:22:12 +0100967 _PyErr_NoMemory(tstate);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200968 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100969 }
970
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200971 /* Add 1 to support PY_VECTORCALL_ARGUMENTS_OFFSET */
972 PyObject **stack = PyMem_Malloc((1 + nargs + nkwargs) * sizeof(args[0]));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100973 if (stack == NULL) {
Victor Stinner17269092019-11-05 01:22:12 +0100974 _PyErr_NoMemory(tstate);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200975 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100976 }
977
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200978 PyObject *kwnames = PyTuple_New(nkwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100979 if (kwnames == NULL) {
980 PyMem_Free(stack);
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200981 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100982 }
983
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200984 stack++; /* For PY_VECTORCALL_ARGUMENTS_OFFSET */
985
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200986 /* Copy positional arguments */
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200987 for (Py_ssize_t i = 0; i < nargs; i++) {
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200988 Py_INCREF(args[i]);
989 stack[i] = args[i];
990 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100991
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200992 PyObject **kwstack = stack + nargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100993 /* This loop doesn't support lookup function mutating the dictionary
994 to change its size. It's a deliberate choice for speed, this function is
995 called in the performance critical hot code. */
Jeroen Demeyerd4efd912019-07-02 11:49:40 +0200996 Py_ssize_t pos = 0, i = 0;
997 PyObject *key, *value;
Jeroen Demeyer05677862019-08-16 12:41:27 +0200998 unsigned long keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100999 while (PyDict_Next(kwargs, &pos, &key, &value)) {
Jeroen Demeyer05677862019-08-16 12:41:27 +02001000 keys_are_strings &= Py_TYPE(key)->tp_flags;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001001 Py_INCREF(key);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +02001002 Py_INCREF(value);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001003 PyTuple_SET_ITEM(kwnames, i, key);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001004 kwstack[i] = value;
1005 i++;
1006 }
1007
Jeroen Demeyer05677862019-08-16 12:41:27 +02001008 /* keys_are_strings has the value Py_TPFLAGS_UNICODE_SUBCLASS if that
1009 * flag is set for all keys. Otherwise, keys_are_strings equals 0.
1010 * We do this check once at the end instead of inside the loop above
1011 * because it simplifies the deallocation in the failing case.
1012 * It happens to also make the loop above slightly more efficient. */
1013 if (!keys_are_strings) {
Victor Stinner17269092019-11-05 01:22:12 +01001014 _PyErr_SetString(tstate, PyExc_TypeError,
1015 "keywords must be strings");
Jeroen Demeyer05677862019-08-16 12:41:27 +02001016 _PyStack_UnpackDict_Free(stack, nargs, kwnames);
1017 return NULL;
1018 }
1019
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001020 *p_kwnames = kwnames;
Jeroen Demeyerd4efd912019-07-02 11:49:40 +02001021 return stack;
1022}
1023
1024static void
1025_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs,
1026 PyObject *kwnames)
1027{
1028 Py_ssize_t n = PyTuple_GET_SIZE(kwnames) + nargs;
1029 for (Py_ssize_t i = 0; i < n; i++) {
1030 Py_DECREF(stack[i]);
1031 }
1032 PyMem_Free((PyObject **)stack - 1);
1033 Py_DECREF(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001034}