blob: 578e1b3ab619332eec200ec8149cfe9bdd2d654d [file] [log] [blame]
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001#include "Python.h"
Victor Stinnerbcda8f12018-11-21 22:27:47 +01002#include "pycore_object.h"
Victor Stinner621cebe2018-11-12 16:53:38 +01003#include "pycore_pystate.h"
Victor Stinnerec13b932018-11-25 23:56:17 +01004#include "pycore_tupleobject.h"
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01005#include "frameobject.h"
6
7
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02008static PyObject *
9cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs);
10
11
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010012static PyObject *
13null_error(void)
14{
15 if (!PyErr_Occurred())
16 PyErr_SetString(PyExc_SystemError,
17 "null argument to internal routine");
18 return NULL;
19}
20
21
22PyObject*
23_Py_CheckFunctionResult(PyObject *callable, PyObject *result, const char *where)
24{
25 int err_occurred = (PyErr_Occurred() != NULL);
26
27 assert((callable != NULL) ^ (where != NULL));
28
29 if (result == NULL) {
30 if (!err_occurred) {
31 if (callable)
32 PyErr_Format(PyExc_SystemError,
33 "%R returned NULL without setting an error",
34 callable);
35 else
36 PyErr_Format(PyExc_SystemError,
37 "%s returned NULL without setting an error",
38 where);
39#ifdef Py_DEBUG
40 /* Ensure that the bug is caught in debug mode */
41 Py_FatalError("a function returned NULL without setting an error");
42#endif
43 return NULL;
44 }
45 }
46 else {
47 if (err_occurred) {
48 Py_DECREF(result);
49
50 if (callable) {
51 _PyErr_FormatFromCause(PyExc_SystemError,
52 "%R returned a result with an error set",
53 callable);
54 }
55 else {
56 _PyErr_FormatFromCause(PyExc_SystemError,
57 "%s returned a result with an error set",
58 where);
59 }
60#ifdef Py_DEBUG
61 /* Ensure that the bug is caught in debug mode */
62 Py_FatalError("a function returned a result with an error set");
63#endif
64 return NULL;
65 }
66 }
67 return result;
68}
69
70
71/* --- Core PyObject call functions ------------------------------- */
72
73PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020074_PyObject_FastCallDict(PyObject *callable, PyObject *const *args,
75 size_t nargsf, PyObject *kwargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010076{
77 /* _PyObject_FastCallDict() must not be called with an exception set,
78 because it can clear it (directly or indirectly) and so the
79 caller loses its exception */
80 assert(!PyErr_Occurred());
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010081 assert(callable != NULL);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020082
83 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010084 assert(nargs >= 0);
85 assert(nargs == 0 || args != NULL);
86 assert(kwargs == NULL || PyDict_Check(kwargs));
87
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020088 vectorcallfunc func = _PyVectorcall_Function(callable);
89 if (func == NULL) {
90 /* Use tp_call instead */
91 return _PyObject_MakeTpCall(callable, args, nargs, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010092 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020093
94 PyObject *res;
95 if (kwargs == NULL) {
96 res = func(callable, args, nargsf, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010097 }
98 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020099 PyObject *kwnames;
100 PyObject *const *newargs;
101 if (_PyStack_UnpackDict(args, nargs, kwargs, &newargs, &kwnames) < 0) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100102 return NULL;
103 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200104 res = func(callable, newargs, nargs, kwnames);
105 if (kwnames != NULL) {
106 Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames) + nargs;
107 for (i = 0; i < n; i++) {
108 Py_DECREF(newargs[i]);
109 }
110 PyMem_Free((PyObject **)newargs);
111 Py_DECREF(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100112 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100113 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200114 return _Py_CheckFunctionResult(callable, res, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100115}
116
117
118PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200119_PyObject_MakeTpCall(PyObject *callable, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100120{
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200121 /* Slow path: build a temporary tuple for positional arguments and a
122 * temporary dictionary for keyword arguments (if any) */
123 ternaryfunc call = Py_TYPE(callable)->tp_call;
124 if (call == NULL) {
125 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
126 Py_TYPE(callable)->tp_name);
127 return NULL;
128 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100129
130 assert(nargs >= 0);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200131 assert(nargs == 0 || args != NULL);
132 assert(keywords == NULL || PyTuple_Check(keywords) || PyDict_Check(keywords));
133 PyObject *argstuple = _PyTuple_FromArray(args, nargs);
134 if (argstuple == NULL) {
135 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100136 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200137
138 PyObject *kwdict;
139 if (keywords == NULL || PyDict_Check(keywords)) {
140 kwdict = keywords;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100141 }
142 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200143 if (PyTuple_GET_SIZE(keywords)) {
144 assert(args != NULL);
145 kwdict = _PyStack_AsDict(args + nargs, keywords);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100146 if (kwdict == NULL) {
147 Py_DECREF(argstuple);
148 return NULL;
149 }
150 }
151 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200152 keywords = kwdict = NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100153 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100154 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200155
156 PyObject *result = NULL;
157 if (Py_EnterRecursiveCall(" while calling a Python object") == 0)
158 {
159 result = call(callable, argstuple, kwdict);
160 Py_LeaveRecursiveCall();
161 }
162
163 Py_DECREF(argstuple);
164 if (kwdict != keywords) {
165 Py_DECREF(kwdict);
166 }
167
168 result = _Py_CheckFunctionResult(callable, result, NULL);
169 return result;
170}
171
172
173PyObject *
174PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs)
175{
Petr Viktorinfb9423f2019-06-02 23:52:20 +0200176 /* get vectorcallfunc as in _PyVectorcall_Function, but without
177 * the _Py_TPFLAGS_HAVE_VECTORCALL check */
178 Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset;
179 if ((offset <= 0) || (!Py_TYPE(callable)->tp_call)) {
180 PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall",
181 Py_TYPE(callable)->tp_name);
182 return NULL;
183 }
184 vectorcallfunc func = *(vectorcallfunc *)(((char *)callable) + offset);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200185 if (func == NULL) {
186 PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall",
187 Py_TYPE(callable)->tp_name);
188 return NULL;
189 }
Petr Viktorinfb9423f2019-06-02 23:52:20 +0200190
191 /* Convert arguments & call */
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200192 PyObject *const *args;
193 Py_ssize_t nargs = PyTuple_GET_SIZE(tuple);
194 PyObject *kwnames;
195 if (_PyStack_UnpackDict(_PyTuple_ITEMS(tuple), nargs,
196 kwargs, &args, &kwnames) < 0) {
197 return NULL;
198 }
199 PyObject *result = func(callable, args, nargs, kwnames);
200 if (kwnames != NULL) {
201 Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames) + nargs;
202 for (i = 0; i < n; i++) {
203 Py_DECREF(args[i]);
204 }
205 PyMem_Free((PyObject **)args);
206 Py_DECREF(kwnames);
207 }
208
209 return result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100210}
211
212
213PyObject *
214PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
215{
216 ternaryfunc call;
217 PyObject *result;
218
219 /* PyObject_Call() must not be called with an exception set,
220 because it can clear it (directly or indirectly) and so the
221 caller loses its exception */
222 assert(!PyErr_Occurred());
223 assert(PyTuple_Check(args));
224 assert(kwargs == NULL || PyDict_Check(kwargs));
225
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200226 if (_PyVectorcall_Function(callable) != NULL) {
227 return PyVectorcall_Call(callable, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100228 }
229 else if (PyCFunction_Check(callable)) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200230 /* This must be a METH_VARARGS function, otherwise we would be
231 * in the previous case */
232 return cfunction_call_varargs(callable, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100233 }
234 else {
235 call = callable->ob_type->tp_call;
236 if (call == NULL) {
237 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
238 callable->ob_type->tp_name);
239 return NULL;
240 }
241
242 if (Py_EnterRecursiveCall(" while calling a Python object"))
243 return NULL;
244
245 result = (*call)(callable, args, kwargs);
246
247 Py_LeaveRecursiveCall();
248
249 return _Py_CheckFunctionResult(callable, result, NULL);
250 }
251}
252
253
254/* --- PyFunction call functions ---------------------------------- */
255
256static PyObject* _Py_HOT_FUNCTION
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200257function_code_fastcall(PyCodeObject *co, PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100258 PyObject *globals)
259{
260 PyFrameObject *f;
Victor Stinner50b48572018-11-01 01:51:40 +0100261 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100262 PyObject **fastlocals;
263 Py_ssize_t i;
264 PyObject *result;
265
266 assert(globals != NULL);
267 /* XXX Perhaps we should create a specialized
268 _PyFrame_New_NoTrack() that doesn't take locals, but does
269 take builtins without sanity checking them.
270 */
271 assert(tstate != NULL);
272 f = _PyFrame_New_NoTrack(tstate, co, globals, NULL);
273 if (f == NULL) {
274 return NULL;
275 }
276
277 fastlocals = f->f_localsplus;
278
279 for (i = 0; i < nargs; i++) {
280 Py_INCREF(*args);
281 fastlocals[i] = *args++;
282 }
283 result = PyEval_EvalFrameEx(f,0);
284
285 if (Py_REFCNT(f) > 1) {
286 Py_DECREF(f);
287 _PyObject_GC_TRACK(f);
288 }
289 else {
290 ++tstate->recursion_depth;
291 Py_DECREF(f);
292 --tstate->recursion_depth;
293 }
294 return result;
295}
296
297
298PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200299_PyFunction_FastCallDict(PyObject *func, PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100300 PyObject *kwargs)
301{
302 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
303 PyObject *globals = PyFunction_GET_GLOBALS(func);
304 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
305 PyObject *kwdefs, *closure, *name, *qualname;
306 PyObject *kwtuple, **k;
307 PyObject **d;
308 Py_ssize_t nd, nk;
309 PyObject *result;
310
311 assert(func != NULL);
312 assert(nargs >= 0);
313 assert(nargs == 0 || args != NULL);
314 assert(kwargs == NULL || PyDict_Check(kwargs));
315
316 if (co->co_kwonlyargcount == 0 &&
317 (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) &&
Victor Stinner086c3ae2017-10-25 05:26:17 -0700318 (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100319 {
320 /* Fast paths */
Pablo Galindocd74e662019-06-01 18:08:04 +0100321 if (argdefs == NULL && co->co_argcount == nargs) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100322 return function_code_fastcall(co, args, nargs, globals);
323 }
324 else if (nargs == 0 && argdefs != NULL
Pablo Galindocd74e662019-06-01 18:08:04 +0100325 && co->co_argcount == PyTuple_GET_SIZE(argdefs)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100326 /* function called with no arguments, but all parameters have
327 a default value: use default values as arguments .*/
Victor Stinnerd17a6932018-11-09 16:56:48 +0100328 args = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200329 return function_code_fastcall(co, args, PyTuple_GET_SIZE(argdefs),
330 globals);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100331 }
332 }
333
334 nk = (kwargs != NULL) ? PyDict_GET_SIZE(kwargs) : 0;
335 if (nk != 0) {
336 Py_ssize_t pos, i;
337
Victor Stinner561ca802017-02-23 18:26:43 +0100338 /* bpo-29318, bpo-27840: Caller and callee functions must not share
339 the dictionary: kwargs must be copied. */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100340 kwtuple = PyTuple_New(2 * nk);
341 if (kwtuple == NULL) {
342 return NULL;
343 }
344
Victor Stinnerd17a6932018-11-09 16:56:48 +0100345 k = _PyTuple_ITEMS(kwtuple);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100346 pos = i = 0;
347 while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) {
348 /* We must hold strong references because keyword arguments can be
349 indirectly modified while the function is called:
350 see issue #2016 and test_extcall */
351 Py_INCREF(k[i]);
352 Py_INCREF(k[i+1]);
353 i += 2;
354 }
Eric Lippert5a95ba22018-10-22 08:52:46 -0700355 assert(i / 2 == nk);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100356 }
357 else {
358 kwtuple = NULL;
359 k = NULL;
360 }
361
362 kwdefs = PyFunction_GET_KW_DEFAULTS(func);
363 closure = PyFunction_GET_CLOSURE(func);
364 name = ((PyFunctionObject *)func) -> func_name;
365 qualname = ((PyFunctionObject *)func) -> func_qualname;
366
367 if (argdefs != NULL) {
Victor Stinnerd17a6932018-11-09 16:56:48 +0100368 d = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200369 nd = PyTuple_GET_SIZE(argdefs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100370 }
371 else {
372 d = NULL;
373 nd = 0;
374 }
375
376 result = _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL,
377 args, nargs,
Zackery Spytzc6ea8972017-07-31 08:24:37 -0600378 k, k != NULL ? k + 1 : NULL, nk, 2,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100379 d, nd, kwdefs,
380 closure, name, qualname);
381 Py_XDECREF(kwtuple);
382 return result;
383}
384
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200385
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100386PyObject *
Jeroen Demeyer37788bc2019-05-30 15:11:22 +0200387_PyFunction_Vectorcall(PyObject *func, PyObject* const* stack,
388 size_t nargsf, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100389{
390 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
391 PyObject *globals = PyFunction_GET_GLOBALS(func);
392 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
393 PyObject *kwdefs, *closure, *name, *qualname;
394 PyObject **d;
395 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
396 Py_ssize_t nd;
397
398 assert(PyFunction_Check(func));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200399 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100400 assert(nargs >= 0);
401 assert(kwnames == NULL || PyTuple_CheckExact(kwnames));
402 assert((nargs == 0 && nkwargs == 0) || stack != NULL);
403 /* kwnames must only contains str strings, no subclass, and all keys must
404 be unique */
405
406 if (co->co_kwonlyargcount == 0 && nkwargs == 0 &&
Victor Stinner086c3ae2017-10-25 05:26:17 -0700407 (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100408 {
Pablo Galindocd74e662019-06-01 18:08:04 +0100409 if (argdefs == NULL && co->co_argcount == nargs) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100410 return function_code_fastcall(co, stack, nargs, globals);
411 }
412 else if (nargs == 0 && argdefs != NULL
Pablo Galindocd74e662019-06-01 18:08:04 +0100413 && co->co_argcount == PyTuple_GET_SIZE(argdefs)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100414 /* function called with no arguments, but all parameters have
415 a default value: use default values as arguments .*/
Victor Stinnerd17a6932018-11-09 16:56:48 +0100416 stack = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200417 return function_code_fastcall(co, stack, PyTuple_GET_SIZE(argdefs),
418 globals);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100419 }
420 }
421
422 kwdefs = PyFunction_GET_KW_DEFAULTS(func);
423 closure = PyFunction_GET_CLOSURE(func);
424 name = ((PyFunctionObject *)func) -> func_name;
425 qualname = ((PyFunctionObject *)func) -> func_qualname;
426
427 if (argdefs != NULL) {
Victor Stinnerd17a6932018-11-09 16:56:48 +0100428 d = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200429 nd = PyTuple_GET_SIZE(argdefs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100430 }
431 else {
432 d = NULL;
433 nd = 0;
434 }
435 return _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL,
436 stack, nargs,
Victor Stinnerd17a6932018-11-09 16:56:48 +0100437 nkwargs ? _PyTuple_ITEMS(kwnames) : NULL,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100438 stack + nargs,
439 nkwargs, 1,
440 d, (int)nd, kwdefs,
441 closure, name, qualname);
442}
443
444
445/* --- PyCFunction call functions --------------------------------- */
446
447PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200448_PyMethodDef_RawFastCallDict(PyMethodDef *method, PyObject *self,
449 PyObject *const *args, Py_ssize_t nargs,
450 PyObject *kwargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100451{
452 /* _PyMethodDef_RawFastCallDict() must not be called with an exception set,
453 because it can clear it (directly or indirectly) and so the
454 caller loses its exception */
455 assert(!PyErr_Occurred());
456
457 assert(method != NULL);
458 assert(nargs >= 0);
459 assert(nargs == 0 || args != NULL);
460 assert(kwargs == NULL || PyDict_Check(kwargs));
461
462 PyCFunction meth = method->ml_meth;
463 int flags = method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST);
464 PyObject *result = NULL;
465
466 if (Py_EnterRecursiveCall(" while calling a Python object")) {
467 return NULL;
468 }
469
470 switch (flags)
471 {
472 case METH_NOARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300473 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
474 goto no_keyword_error;
475 }
476
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100477 if (nargs != 0) {
478 PyErr_Format(PyExc_TypeError,
479 "%.200s() takes no arguments (%zd given)",
480 method->ml_name, nargs);
481 goto exit;
482 }
483
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100484 result = (*meth) (self, NULL);
485 break;
486
487 case METH_O:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300488 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
489 goto no_keyword_error;
490 }
491
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100492 if (nargs != 1) {
493 PyErr_Format(PyExc_TypeError,
494 "%.200s() takes exactly one argument (%zd given)",
495 method->ml_name, nargs);
496 goto exit;
497 }
498
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100499 result = (*meth) (self, args[0]);
500 break;
501
502 case METH_VARARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300503 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100504 goto no_keyword_error;
505 }
Stefan Krahf432a322017-08-21 13:09:59 +0200506 /* fall through */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100507
508 case METH_VARARGS | METH_KEYWORDS:
509 {
510 /* Slow-path: create a temporary tuple for positional arguments */
Sergey Fedoseevf1b9abe2019-02-26 02:37:26 +0500511 PyObject *argstuple = _PyTuple_FromArray(args, nargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100512 if (argstuple == NULL) {
513 goto exit;
514 }
515
516 if (flags & METH_KEYWORDS) {
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200517 result = (*(PyCFunctionWithKeywords)(void(*)(void))meth) (self, argstuple, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100518 }
519 else {
520 result = (*meth) (self, argstuple);
521 }
522 Py_DECREF(argstuple);
523 break;
524 }
525
526 case METH_FASTCALL:
527 {
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300528 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
529 goto no_keyword_error;
530 }
531
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200532 result = (*(_PyCFunctionFast)(void(*)(void))meth) (self, args, nargs);
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300533 break;
534 }
535
536 case METH_FASTCALL | METH_KEYWORDS:
537 {
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200538 PyObject *const *stack;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100539 PyObject *kwnames;
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200540 _PyCFunctionFastWithKeywords fastmeth = (_PyCFunctionFastWithKeywords)(void(*)(void))meth;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100541
542 if (_PyStack_UnpackDict(args, nargs, kwargs, &stack, &kwnames) < 0) {
543 goto exit;
544 }
545
546 result = (*fastmeth) (self, stack, nargs, kwnames);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200547 if (kwnames != NULL) {
548 Py_ssize_t i, n = nargs + PyTuple_GET_SIZE(kwnames);
549 for (i = 0; i < n; i++) {
550 Py_DECREF(stack[i]);
551 }
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200552 PyMem_Free((PyObject **)stack);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200553 Py_DECREF(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100554 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100555 break;
556 }
557
558 default:
559 PyErr_SetString(PyExc_SystemError,
560 "Bad call flags in _PyMethodDef_RawFastCallDict. "
561 "METH_OLDARGS is no longer supported!");
562 goto exit;
563 }
564
565 goto exit;
566
567no_keyword_error:
568 PyErr_Format(PyExc_TypeError,
569 "%.200s() takes no keyword arguments",
Sylvaind67a1032017-03-27 23:36:08 +0200570 method->ml_name);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100571
572exit:
573 Py_LeaveRecursiveCall();
574 return result;
575}
576
577
578PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200579_PyCFunction_FastCallDict(PyObject *func,
580 PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100581 PyObject *kwargs)
582{
583 PyObject *result;
584
585 assert(func != NULL);
586 assert(PyCFunction_Check(func));
587
588 result = _PyMethodDef_RawFastCallDict(((PyCFunctionObject*)func)->m_ml,
589 PyCFunction_GET_SELF(func),
590 args, nargs, kwargs);
591 result = _Py_CheckFunctionResult(func, result, NULL);
592 return result;
593}
594
595
596PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200597_PyMethodDef_RawFastCallKeywords(PyMethodDef *method, PyObject *self,
598 PyObject *const *args, Py_ssize_t nargs,
599 PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100600{
601 /* _PyMethodDef_RawFastCallKeywords() must not be called with an exception set,
602 because it can clear it (directly or indirectly) and so the
603 caller loses its exception */
604 assert(!PyErr_Occurred());
605
606 assert(method != NULL);
607 assert(nargs >= 0);
608 assert(kwnames == NULL || PyTuple_CheckExact(kwnames));
609 /* kwnames must only contains str strings, no subclass, and all keys must
610 be unique */
611
612 PyCFunction meth = method->ml_meth;
613 int flags = method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST);
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300614 Py_ssize_t nkwargs = kwnames == NULL ? 0 : PyTuple_GET_SIZE(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100615 PyObject *result = NULL;
616
617 if (Py_EnterRecursiveCall(" while calling a Python object")) {
618 return NULL;
619 }
620
621 switch (flags)
622 {
623 case METH_NOARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300624 if (nkwargs) {
625 goto no_keyword_error;
626 }
627
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100628 if (nargs != 0) {
629 PyErr_Format(PyExc_TypeError,
630 "%.200s() takes no arguments (%zd given)",
631 method->ml_name, nargs);
632 goto exit;
633 }
634
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100635 result = (*meth) (self, NULL);
636 break;
637
638 case METH_O:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300639 if (nkwargs) {
640 goto no_keyword_error;
641 }
642
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100643 if (nargs != 1) {
644 PyErr_Format(PyExc_TypeError,
645 "%.200s() takes exactly one argument (%zd given)",
646 method->ml_name, nargs);
647 goto exit;
648 }
649
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100650 result = (*meth) (self, args[0]);
651 break;
652
653 case METH_FASTCALL:
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300654 if (nkwargs) {
655 goto no_keyword_error;
656 }
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200657 result = ((_PyCFunctionFast)(void(*)(void))meth) (self, args, nargs);
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300658 break;
659
660 case METH_FASTCALL | METH_KEYWORDS:
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100661 /* Fast-path: avoid temporary dict to pass keyword arguments */
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200662 result = ((_PyCFunctionFastWithKeywords)(void(*)(void))meth) (self, args, nargs, kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100663 break;
664
665 case METH_VARARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300666 if (nkwargs) {
667 goto no_keyword_error;
668 }
Stefan Krahf432a322017-08-21 13:09:59 +0200669 /* fall through */
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300670
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100671 case METH_VARARGS | METH_KEYWORDS:
672 {
673 /* Slow-path: create a temporary tuple for positional arguments
674 and a temporary dict for keyword arguments */
675 PyObject *argtuple;
676
Sergey Fedoseevf1b9abe2019-02-26 02:37:26 +0500677 argtuple = _PyTuple_FromArray(args, nargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100678 if (argtuple == NULL) {
679 goto exit;
680 }
681
682 if (flags & METH_KEYWORDS) {
683 PyObject *kwdict;
684
685 if (nkwargs > 0) {
686 kwdict = _PyStack_AsDict(args + nargs, kwnames);
687 if (kwdict == NULL) {
688 Py_DECREF(argtuple);
689 goto exit;
690 }
691 }
692 else {
693 kwdict = NULL;
694 }
695
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200696 result = (*(PyCFunctionWithKeywords)(void(*)(void))meth) (self, argtuple, kwdict);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100697 Py_XDECREF(kwdict);
698 }
699 else {
700 result = (*meth) (self, argtuple);
701 }
702 Py_DECREF(argtuple);
703 break;
704 }
705
706 default:
707 PyErr_SetString(PyExc_SystemError,
Jeroen Demeyera8b46942019-05-17 12:21:35 +0200708 "Bad call flags in _PyMethodDef_RawFastCallKeywords. "
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100709 "METH_OLDARGS is no longer supported!");
710 goto exit;
711 }
712
713 goto exit;
714
715no_keyword_error:
716 PyErr_Format(PyExc_TypeError,
717 "%.200s() takes no keyword arguments",
718 method->ml_name);
719
720exit:
721 Py_LeaveRecursiveCall();
722 return result;
723}
724
725
726PyObject *
Jeroen Demeyer37788bc2019-05-30 15:11:22 +0200727_PyCFunction_Vectorcall(PyObject *func,
728 PyObject *const *args, size_t nargsf,
729 PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100730{
731 PyObject *result;
732
733 assert(func != NULL);
734 assert(PyCFunction_Check(func));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200735 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100736
737 result = _PyMethodDef_RawFastCallKeywords(((PyCFunctionObject*)func)->m_ml,
738 PyCFunction_GET_SELF(func),
739 args, nargs, kwnames);
740 result = _Py_CheckFunctionResult(func, result, NULL);
741 return result;
742}
743
744
745static PyObject *
746cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs)
747{
748 assert(!PyErr_Occurred());
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300749 assert(kwargs == NULL || PyDict_Check(kwargs));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100750
751 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
752 PyObject *self = PyCFunction_GET_SELF(func);
753 PyObject *result;
754
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200755 assert(PyCFunction_GET_FLAGS(func) & METH_VARARGS);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100756 if (PyCFunction_GET_FLAGS(func) & METH_KEYWORDS) {
757 if (Py_EnterRecursiveCall(" while calling a Python object")) {
758 return NULL;
759 }
760
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200761 result = (*(PyCFunctionWithKeywords)(void(*)(void))meth)(self, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100762
763 Py_LeaveRecursiveCall();
764 }
765 else {
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300766 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100767 PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
768 ((PyCFunctionObject*)func)->m_ml->ml_name);
769 return NULL;
770 }
771
772 if (Py_EnterRecursiveCall(" while calling a Python object")) {
773 return NULL;
774 }
775
776 result = (*meth)(self, args);
777
778 Py_LeaveRecursiveCall();
779 }
780
781 return _Py_CheckFunctionResult(func, result, NULL);
782}
783
784
785PyObject *
786PyCFunction_Call(PyObject *func, PyObject *args, PyObject *kwargs)
787{
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200788 /* For METH_VARARGS, we cannot use vectorcall as the vectorcall pointer
789 * is NULL. This is intentional, since vectorcall would be slower. */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100790 if (PyCFunction_GET_FLAGS(func) & METH_VARARGS) {
791 return cfunction_call_varargs(func, args, kwargs);
792 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200793 return PyVectorcall_Call(func, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100794}
795
796
797/* --- More complex call functions -------------------------------- */
798
799/* External interface to call any callable object.
800 The args must be a tuple or NULL. The kwargs must be a dict or NULL. */
801PyObject *
802PyEval_CallObjectWithKeywords(PyObject *callable,
803 PyObject *args, PyObject *kwargs)
804{
805#ifdef Py_DEBUG
806 /* PyEval_CallObjectWithKeywords() must not be called with an exception
807 set. It raises a new exception if parameters are invalid or if
808 PyTuple_New() fails, and so the original exception is lost. */
809 assert(!PyErr_Occurred());
810#endif
811
INADA Naoki3824cd82017-03-01 20:41:03 +0900812 if (args != NULL && !PyTuple_Check(args)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100813 PyErr_SetString(PyExc_TypeError,
814 "argument list must be a tuple");
815 return NULL;
816 }
817
818 if (kwargs != NULL && !PyDict_Check(kwargs)) {
819 PyErr_SetString(PyExc_TypeError,
820 "keyword list must be a dictionary");
821 return NULL;
822 }
823
INADA Naoki3824cd82017-03-01 20:41:03 +0900824 if (args == NULL) {
825 return _PyObject_FastCallDict(callable, NULL, 0, kwargs);
826 }
827 else {
828 return PyObject_Call(callable, args, kwargs);
829 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100830}
831
832
833PyObject *
834PyObject_CallObject(PyObject *callable, PyObject *args)
835{
836 return PyEval_CallObjectWithKeywords(callable, args, NULL);
837}
838
839
840/* Positional arguments are obj followed by args:
841 call callable(obj, *args, **kwargs) */
842PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200843_PyObject_FastCall_Prepend(PyObject *callable, PyObject *obj,
844 PyObject *const *args, Py_ssize_t nargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100845{
846 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
847 PyObject **args2;
848 PyObject *result;
849
850 nargs++;
851 if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
852 args2 = small_stack;
853 }
854 else {
855 args2 = PyMem_Malloc(nargs * sizeof(PyObject *));
856 if (args2 == NULL) {
857 PyErr_NoMemory();
858 return NULL;
859 }
860 }
861
862 /* use borrowed references */
863 args2[0] = obj;
Benjamin Petersona3070d52017-09-04 22:23:42 -0700864 if (nargs > 1) {
865 memcpy(&args2[1], args, (nargs - 1) * sizeof(PyObject *));
866 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100867
868 result = _PyObject_FastCall(callable, args2, nargs);
869 if (args2 != small_stack) {
870 PyMem_Free(args2);
871 }
872 return result;
873}
874
875
876/* Call callable(obj, *args, **kwargs). */
877PyObject *
878_PyObject_Call_Prepend(PyObject *callable,
879 PyObject *obj, PyObject *args, PyObject *kwargs)
880{
881 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
882 PyObject **stack;
883 Py_ssize_t argcount;
884 PyObject *result;
885
886 assert(PyTuple_Check(args));
887
888 argcount = PyTuple_GET_SIZE(args);
889 if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
890 stack = small_stack;
891 }
892 else {
893 stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *));
894 if (stack == NULL) {
895 PyErr_NoMemory();
896 return NULL;
897 }
898 }
899
900 /* use borrowed references */
901 stack[0] = obj;
902 memcpy(&stack[1],
Victor Stinnerd17a6932018-11-09 16:56:48 +0100903 _PyTuple_ITEMS(args),
904 argcount * sizeof(PyObject *));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100905
906 result = _PyObject_FastCallDict(callable,
907 stack, argcount + 1,
908 kwargs);
909 if (stack != small_stack) {
910 PyMem_Free(stack);
911 }
912 return result;
913}
914
915
916/* --- Call with a format string ---------------------------------- */
917
918static PyObject *
919_PyObject_CallFunctionVa(PyObject *callable, const char *format,
920 va_list va, int is_size_t)
921{
922 PyObject* small_stack[_PY_FASTCALL_SMALL_STACK];
923 const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack);
924 PyObject **stack;
925 Py_ssize_t nargs, i;
926 PyObject *result;
927
928 if (callable == NULL) {
929 return null_error();
930 }
931
932 if (!format || !*format) {
933 return _PyObject_CallNoArg(callable);
934 }
935
936 if (is_size_t) {
937 stack = _Py_VaBuildStack_SizeT(small_stack, small_stack_len,
938 format, va, &nargs);
939 }
940 else {
941 stack = _Py_VaBuildStack(small_stack, small_stack_len,
942 format, va, &nargs);
943 }
944 if (stack == NULL) {
945 return NULL;
946 }
947
948 if (nargs == 1 && PyTuple_Check(stack[0])) {
949 /* Special cases for backward compatibility:
950 - PyObject_CallFunction(func, "O", tuple) calls func(*tuple)
951 - PyObject_CallFunction(func, "(OOO)", arg1, arg2, arg3) calls
952 func(*(arg1, arg2, arg3)): func(arg1, arg2, arg3) */
953 PyObject *args = stack[0];
954 result = _PyObject_FastCall(callable,
Victor Stinnerd17a6932018-11-09 16:56:48 +0100955 _PyTuple_ITEMS(args),
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100956 PyTuple_GET_SIZE(args));
957 }
958 else {
959 result = _PyObject_FastCall(callable, stack, nargs);
960 }
961
962 for (i = 0; i < nargs; ++i) {
963 Py_DECREF(stack[i]);
964 }
965 if (stack != small_stack) {
966 PyMem_Free(stack);
967 }
968 return result;
969}
970
971
972PyObject *
973PyObject_CallFunction(PyObject *callable, const char *format, ...)
974{
975 va_list va;
976 PyObject *result;
977
978 va_start(va, format);
979 result = _PyObject_CallFunctionVa(callable, format, va, 0);
980 va_end(va);
981
982 return result;
983}
984
985
INADA Naokiaa289a52017-03-14 18:00:59 +0900986/* PyEval_CallFunction is exact copy of PyObject_CallFunction.
987 * This function is kept for backward compatibility.
988 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100989PyObject *
990PyEval_CallFunction(PyObject *callable, const char *format, ...)
991{
INADA Naokiaa289a52017-03-14 18:00:59 +0900992 va_list va;
993 PyObject *result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100994
INADA Naokiaa289a52017-03-14 18:00:59 +0900995 va_start(va, format);
996 result = _PyObject_CallFunctionVa(callable, format, va, 0);
997 va_end(va);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100998
INADA Naokiaa289a52017-03-14 18:00:59 +0900999 return result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001000}
1001
1002
1003PyObject *
1004_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
1005{
1006 va_list va;
1007 PyObject *result;
1008
1009 va_start(va, format);
1010 result = _PyObject_CallFunctionVa(callable, format, va, 1);
1011 va_end(va);
1012
1013 return result;
1014}
1015
1016
1017static PyObject*
1018callmethod(PyObject* callable, const char *format, va_list va, int is_size_t)
1019{
1020 assert(callable != NULL);
1021
1022 if (!PyCallable_Check(callable)) {
1023 PyErr_Format(PyExc_TypeError,
1024 "attribute of type '%.200s' is not callable",
1025 Py_TYPE(callable)->tp_name);
1026 return NULL;
1027 }
1028
1029 return _PyObject_CallFunctionVa(callable, format, va, is_size_t);
1030}
1031
1032
1033PyObject *
1034PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
1035{
1036 va_list va;
1037 PyObject *callable, *retval;
1038
1039 if (obj == NULL || name == NULL) {
1040 return null_error();
1041 }
1042
1043 callable = PyObject_GetAttrString(obj, name);
1044 if (callable == NULL)
1045 return NULL;
1046
1047 va_start(va, format);
1048 retval = callmethod(callable, format, va, 0);
1049 va_end(va);
1050
1051 Py_DECREF(callable);
1052 return retval;
1053}
1054
1055
INADA Naokiaa289a52017-03-14 18:00:59 +09001056/* PyEval_CallMethod is exact copy of PyObject_CallMethod.
1057 * This function is kept for backward compatibility.
1058 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001059PyObject *
1060PyEval_CallMethod(PyObject *obj, const char *name, const char *format, ...)
1061{
INADA Naokiaa289a52017-03-14 18:00:59 +09001062 va_list va;
1063 PyObject *callable, *retval;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001064
INADA Naokiaa289a52017-03-14 18:00:59 +09001065 if (obj == NULL || name == NULL) {
1066 return null_error();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001067 }
1068
INADA Naokiaa289a52017-03-14 18:00:59 +09001069 callable = PyObject_GetAttrString(obj, name);
1070 if (callable == NULL)
1071 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001072
INADA Naokiaa289a52017-03-14 18:00:59 +09001073 va_start(va, format);
1074 retval = callmethod(callable, format, va, 0);
1075 va_end(va);
1076
1077 Py_DECREF(callable);
1078 return retval;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001079}
1080
1081
1082PyObject *
1083_PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name,
1084 const char *format, ...)
1085{
1086 va_list va;
1087 PyObject *callable, *retval;
1088
1089 if (obj == NULL || name == NULL) {
1090 return null_error();
1091 }
1092
1093 callable = _PyObject_GetAttrId(obj, name);
1094 if (callable == NULL)
1095 return NULL;
1096
1097 va_start(va, format);
1098 retval = callmethod(callable, format, va, 0);
1099 va_end(va);
1100
1101 Py_DECREF(callable);
1102 return retval;
1103}
1104
1105
1106PyObject *
1107_PyObject_CallMethod_SizeT(PyObject *obj, const char *name,
1108 const char *format, ...)
1109{
1110 va_list va;
1111 PyObject *callable, *retval;
1112
1113 if (obj == NULL || name == NULL) {
1114 return null_error();
1115 }
1116
1117 callable = PyObject_GetAttrString(obj, name);
1118 if (callable == NULL)
1119 return NULL;
1120
1121 va_start(va, format);
1122 retval = callmethod(callable, format, va, 1);
1123 va_end(va);
1124
1125 Py_DECREF(callable);
1126 return retval;
1127}
1128
1129
1130PyObject *
1131_PyObject_CallMethodId_SizeT(PyObject *obj, _Py_Identifier *name,
1132 const char *format, ...)
1133{
1134 va_list va;
1135 PyObject *callable, *retval;
1136
1137 if (obj == NULL || name == NULL) {
1138 return null_error();
1139 }
1140
1141 callable = _PyObject_GetAttrId(obj, name);
1142 if (callable == NULL) {
1143 return NULL;
1144 }
1145
1146 va_start(va, format);
1147 retval = callmethod(callable, format, va, 1);
1148 va_end(va);
1149
1150 Py_DECREF(callable);
1151 return retval;
1152}
1153
1154
1155/* --- Call with "..." arguments ---------------------------------- */
1156
1157static PyObject *
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001158object_vacall(PyObject *base, PyObject *callable, va_list vargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001159{
1160 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
1161 PyObject **stack;
1162 Py_ssize_t nargs;
1163 PyObject *result;
1164 Py_ssize_t i;
1165 va_list countva;
1166
1167 if (callable == NULL) {
1168 return null_error();
1169 }
1170
1171 /* Count the number of arguments */
1172 va_copy(countva, vargs);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001173 nargs = base ? 1 : 0;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001174 while (1) {
1175 PyObject *arg = va_arg(countva, PyObject *);
1176 if (arg == NULL) {
1177 break;
1178 }
1179 nargs++;
1180 }
1181 va_end(countva);
1182
1183 /* Copy arguments */
1184 if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
1185 stack = small_stack;
1186 }
1187 else {
1188 stack = PyMem_Malloc(nargs * sizeof(stack[0]));
1189 if (stack == NULL) {
1190 PyErr_NoMemory();
1191 return NULL;
1192 }
1193 }
1194
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001195 i = 0;
1196 if (base) {
1197 stack[i++] = base;
1198 }
1199
1200 for (; i < nargs; ++i) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001201 stack[i] = va_arg(vargs, PyObject *);
1202 }
1203
1204 /* Call the function */
1205 result = _PyObject_FastCall(callable, stack, nargs);
1206
1207 if (stack != small_stack) {
1208 PyMem_Free(stack);
1209 }
1210 return result;
1211}
1212
1213
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001214/* Private API for the LOAD_METHOD opcode. */
1215extern int _PyObject_GetMethod(PyObject *, PyObject *, PyObject **);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001216
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001217PyObject *
1218PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)
1219{
1220 if (obj == NULL || name == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001221 return null_error();
1222 }
1223
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001224 PyObject *callable = NULL;
1225 int is_method = _PyObject_GetMethod(obj, name, &callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001226 if (callable == NULL) {
1227 return NULL;
1228 }
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001229 obj = is_method ? obj : NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001230
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001231 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001232 va_start(vargs, name);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001233 PyObject *result = object_vacall(obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001234 va_end(vargs);
1235
1236 Py_DECREF(callable);
1237 return result;
1238}
1239
1240
1241PyObject *
1242_PyObject_CallMethodIdObjArgs(PyObject *obj,
1243 struct _Py_Identifier *name, ...)
1244{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001245 if (obj == NULL || name == NULL) {
1246 return null_error();
1247 }
1248
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001249 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
1250 if (!oname) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001251 return NULL;
1252 }
1253
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001254 PyObject *callable = NULL;
1255 int is_method = _PyObject_GetMethod(obj, oname, &callable);
1256 if (callable == NULL) {
1257 return NULL;
1258 }
1259 obj = is_method ? obj : NULL;
1260
1261 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001262 va_start(vargs, name);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001263 PyObject *result = object_vacall(obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001264 va_end(vargs);
1265
1266 Py_DECREF(callable);
1267 return result;
1268}
1269
1270
1271PyObject *
1272PyObject_CallFunctionObjArgs(PyObject *callable, ...)
1273{
1274 va_list vargs;
1275 PyObject *result;
1276
1277 va_start(vargs, callable);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001278 result = object_vacall(NULL, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001279 va_end(vargs);
1280
1281 return result;
1282}
1283
1284
1285/* --- PyStack functions ------------------------------------------ */
1286
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001287PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001288_PyStack_AsDict(PyObject *const *values, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001289{
1290 Py_ssize_t nkwargs;
1291 PyObject *kwdict;
1292 Py_ssize_t i;
1293
1294 assert(kwnames != NULL);
1295 nkwargs = PyTuple_GET_SIZE(kwnames);
1296 kwdict = _PyDict_NewPresized(nkwargs);
1297 if (kwdict == NULL) {
1298 return NULL;
1299 }
1300
1301 for (i = 0; i < nkwargs; i++) {
1302 PyObject *key = PyTuple_GET_ITEM(kwnames, i);
1303 PyObject *value = *values++;
1304 /* If key already exists, replace it with the new value */
1305 if (PyDict_SetItem(kwdict, key, value)) {
1306 Py_DECREF(kwdict);
1307 return NULL;
1308 }
1309 }
1310 return kwdict;
1311}
1312
1313
1314int
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001315_PyStack_UnpackDict(PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs,
1316 PyObject *const **p_stack, PyObject **p_kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001317{
1318 PyObject **stack, **kwstack;
1319 Py_ssize_t nkwargs;
1320 Py_ssize_t pos, i;
1321 PyObject *key, *value;
1322 PyObject *kwnames;
1323
1324 assert(nargs >= 0);
1325 assert(kwargs == NULL || PyDict_CheckExact(kwargs));
1326
1327 if (kwargs == NULL || (nkwargs = PyDict_GET_SIZE(kwargs)) == 0) {
1328 *p_stack = args;
1329 *p_kwnames = NULL;
1330 return 0;
1331 }
1332
1333 if ((size_t)nargs > PY_SSIZE_T_MAX / sizeof(stack[0]) - (size_t)nkwargs) {
1334 PyErr_NoMemory();
1335 return -1;
1336 }
1337
1338 stack = PyMem_Malloc((nargs + nkwargs) * sizeof(stack[0]));
1339 if (stack == NULL) {
1340 PyErr_NoMemory();
1341 return -1;
1342 }
1343
1344 kwnames = PyTuple_New(nkwargs);
1345 if (kwnames == NULL) {
1346 PyMem_Free(stack);
1347 return -1;
1348 }
1349
Jeroen Demeyer77aa3962019-05-22 13:09:35 +02001350 /* Copy positional arguments */
1351 for (i = 0; i < nargs; i++) {
1352 Py_INCREF(args[i]);
1353 stack[i] = args[i];
1354 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001355
1356 kwstack = stack + nargs;
1357 pos = i = 0;
1358 /* This loop doesn't support lookup function mutating the dictionary
1359 to change its size. It's a deliberate choice for speed, this function is
1360 called in the performance critical hot code. */
1361 while (PyDict_Next(kwargs, &pos, &key, &value)) {
1362 Py_INCREF(key);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +02001363 Py_INCREF(value);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001364 PyTuple_SET_ITEM(kwnames, i, key);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001365 kwstack[i] = value;
1366 i++;
1367 }
1368
1369 *p_stack = stack;
1370 *p_kwnames = kwnames;
1371 return 0;
1372}