blob: 183a5c2e5a24ff6947019aa2c4dff3f1e551e42c [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 Stinner0f7b0b32017-03-14 21:37:20 +010012int
13_PyObject_HasFastCall(PyObject *callable)
14{
15 if (PyFunction_Check(callable)) {
16 return 1;
17 }
18 else if (PyCFunction_Check(callable)) {
19 return !(PyCFunction_GET_FLAGS(callable) & METH_VARARGS);
20 }
21 else {
22 assert (PyCallable_Check(callable));
23 return 0;
24 }
25}
26
27
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010028static PyObject *
29null_error(void)
30{
31 if (!PyErr_Occurred())
32 PyErr_SetString(PyExc_SystemError,
33 "null argument to internal routine");
34 return NULL;
35}
36
37
38PyObject*
39_Py_CheckFunctionResult(PyObject *callable, PyObject *result, const char *where)
40{
41 int err_occurred = (PyErr_Occurred() != NULL);
42
43 assert((callable != NULL) ^ (where != NULL));
44
45 if (result == NULL) {
46 if (!err_occurred) {
47 if (callable)
48 PyErr_Format(PyExc_SystemError,
49 "%R returned NULL without setting an error",
50 callable);
51 else
52 PyErr_Format(PyExc_SystemError,
53 "%s returned NULL without setting an error",
54 where);
55#ifdef Py_DEBUG
56 /* Ensure that the bug is caught in debug mode */
57 Py_FatalError("a function returned NULL without setting an error");
58#endif
59 return NULL;
60 }
61 }
62 else {
63 if (err_occurred) {
64 Py_DECREF(result);
65
66 if (callable) {
67 _PyErr_FormatFromCause(PyExc_SystemError,
68 "%R returned a result with an error set",
69 callable);
70 }
71 else {
72 _PyErr_FormatFromCause(PyExc_SystemError,
73 "%s returned a result with an error set",
74 where);
75 }
76#ifdef Py_DEBUG
77 /* Ensure that the bug is caught in debug mode */
78 Py_FatalError("a function returned a result with an error set");
79#endif
80 return NULL;
81 }
82 }
83 return result;
84}
85
86
87/* --- Core PyObject call functions ------------------------------- */
88
89PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020090_PyObject_FastCallDict(PyObject *callable, PyObject *const *args,
91 size_t nargsf, PyObject *kwargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010092{
93 /* _PyObject_FastCallDict() must not be called with an exception set,
94 because it can clear it (directly or indirectly) and so the
95 caller loses its exception */
96 assert(!PyErr_Occurred());
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010097 assert(callable != NULL);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020098
99 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100100 assert(nargs >= 0);
101 assert(nargs == 0 || args != NULL);
102 assert(kwargs == NULL || PyDict_Check(kwargs));
103
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200104 vectorcallfunc func = _PyVectorcall_Function(callable);
105 if (func == NULL) {
106 /* Use tp_call instead */
107 return _PyObject_MakeTpCall(callable, args, nargs, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100108 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200109
110 PyObject *res;
111 if (kwargs == NULL) {
112 res = func(callable, args, nargsf, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100113 }
114 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200115 PyObject *kwnames;
116 PyObject *const *newargs;
117 if (_PyStack_UnpackDict(args, nargs, kwargs, &newargs, &kwnames) < 0) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100118 return NULL;
119 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200120 res = func(callable, newargs, nargs, kwnames);
121 if (kwnames != NULL) {
122 Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames) + nargs;
123 for (i = 0; i < n; i++) {
124 Py_DECREF(newargs[i]);
125 }
126 PyMem_Free((PyObject **)newargs);
127 Py_DECREF(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100128 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100129 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200130 return _Py_CheckFunctionResult(callable, res, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100131}
132
133
134PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200135_PyObject_MakeTpCall(PyObject *callable, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100136{
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200137 /* Slow path: build a temporary tuple for positional arguments and a
138 * temporary dictionary for keyword arguments (if any) */
139 ternaryfunc call = Py_TYPE(callable)->tp_call;
140 if (call == NULL) {
141 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
142 Py_TYPE(callable)->tp_name);
143 return NULL;
144 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100145
146 assert(nargs >= 0);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200147 assert(nargs == 0 || args != NULL);
148 assert(keywords == NULL || PyTuple_Check(keywords) || PyDict_Check(keywords));
149 PyObject *argstuple = _PyTuple_FromArray(args, nargs);
150 if (argstuple == NULL) {
151 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100152 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200153
154 PyObject *kwdict;
155 if (keywords == NULL || PyDict_Check(keywords)) {
156 kwdict = keywords;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100157 }
158 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200159 if (PyTuple_GET_SIZE(keywords)) {
160 assert(args != NULL);
161 kwdict = _PyStack_AsDict(args + nargs, keywords);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100162 if (kwdict == NULL) {
163 Py_DECREF(argstuple);
164 return NULL;
165 }
166 }
167 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200168 keywords = kwdict = NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100169 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100170 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200171
172 PyObject *result = NULL;
173 if (Py_EnterRecursiveCall(" while calling a Python object") == 0)
174 {
175 result = call(callable, argstuple, kwdict);
176 Py_LeaveRecursiveCall();
177 }
178
179 Py_DECREF(argstuple);
180 if (kwdict != keywords) {
181 Py_DECREF(kwdict);
182 }
183
184 result = _Py_CheckFunctionResult(callable, result, NULL);
185 return result;
186}
187
188
189PyObject *
190PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs)
191{
192 vectorcallfunc func = _PyVectorcall_Function(callable);
193 if (func == NULL) {
194 PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall",
195 Py_TYPE(callable)->tp_name);
196 return NULL;
197 }
198 PyObject *const *args;
199 Py_ssize_t nargs = PyTuple_GET_SIZE(tuple);
200 PyObject *kwnames;
201 if (_PyStack_UnpackDict(_PyTuple_ITEMS(tuple), nargs,
202 kwargs, &args, &kwnames) < 0) {
203 return NULL;
204 }
205 PyObject *result = func(callable, args, nargs, kwnames);
206 if (kwnames != NULL) {
207 Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames) + nargs;
208 for (i = 0; i < n; i++) {
209 Py_DECREF(args[i]);
210 }
211 PyMem_Free((PyObject **)args);
212 Py_DECREF(kwnames);
213 }
214
215 return result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100216}
217
218
219PyObject *
220PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
221{
222 ternaryfunc call;
223 PyObject *result;
224
225 /* PyObject_Call() must not be called with an exception set,
226 because it can clear it (directly or indirectly) and so the
227 caller loses its exception */
228 assert(!PyErr_Occurred());
229 assert(PyTuple_Check(args));
230 assert(kwargs == NULL || PyDict_Check(kwargs));
231
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200232 if (_PyVectorcall_Function(callable) != NULL) {
233 return PyVectorcall_Call(callable, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100234 }
235 else if (PyCFunction_Check(callable)) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200236 /* This must be a METH_VARARGS function, otherwise we would be
237 * in the previous case */
238 return cfunction_call_varargs(callable, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100239 }
240 else {
241 call = callable->ob_type->tp_call;
242 if (call == NULL) {
243 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
244 callable->ob_type->tp_name);
245 return NULL;
246 }
247
248 if (Py_EnterRecursiveCall(" while calling a Python object"))
249 return NULL;
250
251 result = (*call)(callable, args, kwargs);
252
253 Py_LeaveRecursiveCall();
254
255 return _Py_CheckFunctionResult(callable, result, NULL);
256 }
257}
258
259
260/* --- PyFunction call functions ---------------------------------- */
261
262static PyObject* _Py_HOT_FUNCTION
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200263function_code_fastcall(PyCodeObject *co, PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100264 PyObject *globals)
265{
266 PyFrameObject *f;
Victor Stinner50b48572018-11-01 01:51:40 +0100267 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100268 PyObject **fastlocals;
269 Py_ssize_t i;
270 PyObject *result;
271
272 assert(globals != NULL);
273 /* XXX Perhaps we should create a specialized
274 _PyFrame_New_NoTrack() that doesn't take locals, but does
275 take builtins without sanity checking them.
276 */
277 assert(tstate != NULL);
278 f = _PyFrame_New_NoTrack(tstate, co, globals, NULL);
279 if (f == NULL) {
280 return NULL;
281 }
282
283 fastlocals = f->f_localsplus;
284
285 for (i = 0; i < nargs; i++) {
286 Py_INCREF(*args);
287 fastlocals[i] = *args++;
288 }
289 result = PyEval_EvalFrameEx(f,0);
290
291 if (Py_REFCNT(f) > 1) {
292 Py_DECREF(f);
293 _PyObject_GC_TRACK(f);
294 }
295 else {
296 ++tstate->recursion_depth;
297 Py_DECREF(f);
298 --tstate->recursion_depth;
299 }
300 return result;
301}
302
303
304PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200305_PyFunction_FastCallDict(PyObject *func, PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100306 PyObject *kwargs)
307{
308 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
309 PyObject *globals = PyFunction_GET_GLOBALS(func);
310 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
311 PyObject *kwdefs, *closure, *name, *qualname;
312 PyObject *kwtuple, **k;
313 PyObject **d;
314 Py_ssize_t nd, nk;
315 PyObject *result;
316
317 assert(func != NULL);
318 assert(nargs >= 0);
319 assert(nargs == 0 || args != NULL);
320 assert(kwargs == NULL || PyDict_Check(kwargs));
321
322 if (co->co_kwonlyargcount == 0 &&
323 (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) &&
Victor Stinner086c3ae2017-10-25 05:26:17 -0700324 (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100325 {
326 /* Fast paths */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100327 if (argdefs == NULL && co->co_argcount + co->co_posonlyargcount == nargs) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100328 return function_code_fastcall(co, args, nargs, globals);
329 }
330 else if (nargs == 0 && argdefs != NULL
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100331 && co->co_argcount + co->co_posonlyargcount == PyTuple_GET_SIZE(argdefs)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100332 /* function called with no arguments, but all parameters have
333 a default value: use default values as arguments .*/
Victor Stinnerd17a6932018-11-09 16:56:48 +0100334 args = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200335 return function_code_fastcall(co, args, PyTuple_GET_SIZE(argdefs),
336 globals);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100337 }
338 }
339
340 nk = (kwargs != NULL) ? PyDict_GET_SIZE(kwargs) : 0;
341 if (nk != 0) {
342 Py_ssize_t pos, i;
343
Victor Stinner561ca802017-02-23 18:26:43 +0100344 /* bpo-29318, bpo-27840: Caller and callee functions must not share
345 the dictionary: kwargs must be copied. */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100346 kwtuple = PyTuple_New(2 * nk);
347 if (kwtuple == NULL) {
348 return NULL;
349 }
350
Victor Stinnerd17a6932018-11-09 16:56:48 +0100351 k = _PyTuple_ITEMS(kwtuple);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100352 pos = i = 0;
353 while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) {
354 /* We must hold strong references because keyword arguments can be
355 indirectly modified while the function is called:
356 see issue #2016 and test_extcall */
357 Py_INCREF(k[i]);
358 Py_INCREF(k[i+1]);
359 i += 2;
360 }
Eric Lippert5a95ba22018-10-22 08:52:46 -0700361 assert(i / 2 == nk);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100362 }
363 else {
364 kwtuple = NULL;
365 k = NULL;
366 }
367
368 kwdefs = PyFunction_GET_KW_DEFAULTS(func);
369 closure = PyFunction_GET_CLOSURE(func);
370 name = ((PyFunctionObject *)func) -> func_name;
371 qualname = ((PyFunctionObject *)func) -> func_qualname;
372
373 if (argdefs != NULL) {
Victor Stinnerd17a6932018-11-09 16:56:48 +0100374 d = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200375 nd = PyTuple_GET_SIZE(argdefs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100376 }
377 else {
378 d = NULL;
379 nd = 0;
380 }
381
382 result = _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL,
383 args, nargs,
Zackery Spytzc6ea8972017-07-31 08:24:37 -0600384 k, k != NULL ? k + 1 : NULL, nk, 2,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100385 d, nd, kwdefs,
386 closure, name, qualname);
387 Py_XDECREF(kwtuple);
388 return result;
389}
390
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200391
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100392PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200393_PyFunction_FastCallKeywords(PyObject *func, PyObject* const* stack,
394 size_t nargsf, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100395{
396 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
397 PyObject *globals = PyFunction_GET_GLOBALS(func);
398 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
399 PyObject *kwdefs, *closure, *name, *qualname;
400 PyObject **d;
401 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
402 Py_ssize_t nd;
403
404 assert(PyFunction_Check(func));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200405 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100406 assert(nargs >= 0);
407 assert(kwnames == NULL || PyTuple_CheckExact(kwnames));
408 assert((nargs == 0 && nkwargs == 0) || stack != NULL);
409 /* kwnames must only contains str strings, no subclass, and all keys must
410 be unique */
411
412 if (co->co_kwonlyargcount == 0 && nkwargs == 0 &&
Victor Stinner086c3ae2017-10-25 05:26:17 -0700413 (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100414 {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100415 if (argdefs == NULL && co->co_argcount + co->co_posonlyargcount== nargs) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100416 return function_code_fastcall(co, stack, nargs, globals);
417 }
418 else if (nargs == 0 && argdefs != NULL
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100419 && co->co_argcount + co->co_posonlyargcount == PyTuple_GET_SIZE(argdefs)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100420 /* function called with no arguments, but all parameters have
421 a default value: use default values as arguments .*/
Victor Stinnerd17a6932018-11-09 16:56:48 +0100422 stack = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200423 return function_code_fastcall(co, stack, PyTuple_GET_SIZE(argdefs),
424 globals);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100425 }
426 }
427
428 kwdefs = PyFunction_GET_KW_DEFAULTS(func);
429 closure = PyFunction_GET_CLOSURE(func);
430 name = ((PyFunctionObject *)func) -> func_name;
431 qualname = ((PyFunctionObject *)func) -> func_qualname;
432
433 if (argdefs != NULL) {
Victor Stinnerd17a6932018-11-09 16:56:48 +0100434 d = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200435 nd = PyTuple_GET_SIZE(argdefs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100436 }
437 else {
438 d = NULL;
439 nd = 0;
440 }
441 return _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL,
442 stack, nargs,
Victor Stinnerd17a6932018-11-09 16:56:48 +0100443 nkwargs ? _PyTuple_ITEMS(kwnames) : NULL,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100444 stack + nargs,
445 nkwargs, 1,
446 d, (int)nd, kwdefs,
447 closure, name, qualname);
448}
449
450
451/* --- PyCFunction call functions --------------------------------- */
452
453PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200454_PyMethodDef_RawFastCallDict(PyMethodDef *method, PyObject *self,
455 PyObject *const *args, Py_ssize_t nargs,
456 PyObject *kwargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100457{
458 /* _PyMethodDef_RawFastCallDict() must not be called with an exception set,
459 because it can clear it (directly or indirectly) and so the
460 caller loses its exception */
461 assert(!PyErr_Occurred());
462
463 assert(method != NULL);
464 assert(nargs >= 0);
465 assert(nargs == 0 || args != NULL);
466 assert(kwargs == NULL || PyDict_Check(kwargs));
467
468 PyCFunction meth = method->ml_meth;
469 int flags = method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST);
470 PyObject *result = NULL;
471
472 if (Py_EnterRecursiveCall(" while calling a Python object")) {
473 return NULL;
474 }
475
476 switch (flags)
477 {
478 case METH_NOARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300479 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
480 goto no_keyword_error;
481 }
482
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100483 if (nargs != 0) {
484 PyErr_Format(PyExc_TypeError,
485 "%.200s() takes no arguments (%zd given)",
486 method->ml_name, nargs);
487 goto exit;
488 }
489
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100490 result = (*meth) (self, NULL);
491 break;
492
493 case METH_O:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300494 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
495 goto no_keyword_error;
496 }
497
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100498 if (nargs != 1) {
499 PyErr_Format(PyExc_TypeError,
500 "%.200s() takes exactly one argument (%zd given)",
501 method->ml_name, nargs);
502 goto exit;
503 }
504
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100505 result = (*meth) (self, args[0]);
506 break;
507
508 case METH_VARARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300509 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100510 goto no_keyword_error;
511 }
Stefan Krahf432a322017-08-21 13:09:59 +0200512 /* fall through */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100513
514 case METH_VARARGS | METH_KEYWORDS:
515 {
516 /* Slow-path: create a temporary tuple for positional arguments */
Sergey Fedoseevf1b9abe2019-02-26 02:37:26 +0500517 PyObject *argstuple = _PyTuple_FromArray(args, nargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100518 if (argstuple == NULL) {
519 goto exit;
520 }
521
522 if (flags & METH_KEYWORDS) {
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200523 result = (*(PyCFunctionWithKeywords)(void(*)(void))meth) (self, argstuple, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100524 }
525 else {
526 result = (*meth) (self, argstuple);
527 }
528 Py_DECREF(argstuple);
529 break;
530 }
531
532 case METH_FASTCALL:
533 {
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300534 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
535 goto no_keyword_error;
536 }
537
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200538 result = (*(_PyCFunctionFast)(void(*)(void))meth) (self, args, nargs);
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300539 break;
540 }
541
542 case METH_FASTCALL | METH_KEYWORDS:
543 {
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200544 PyObject *const *stack;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100545 PyObject *kwnames;
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200546 _PyCFunctionFastWithKeywords fastmeth = (_PyCFunctionFastWithKeywords)(void(*)(void))meth;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100547
548 if (_PyStack_UnpackDict(args, nargs, kwargs, &stack, &kwnames) < 0) {
549 goto exit;
550 }
551
552 result = (*fastmeth) (self, stack, nargs, kwnames);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200553 if (kwnames != NULL) {
554 Py_ssize_t i, n = nargs + PyTuple_GET_SIZE(kwnames);
555 for (i = 0; i < n; i++) {
556 Py_DECREF(stack[i]);
557 }
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200558 PyMem_Free((PyObject **)stack);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200559 Py_DECREF(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100560 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100561 break;
562 }
563
564 default:
565 PyErr_SetString(PyExc_SystemError,
566 "Bad call flags in _PyMethodDef_RawFastCallDict. "
567 "METH_OLDARGS is no longer supported!");
568 goto exit;
569 }
570
571 goto exit;
572
573no_keyword_error:
574 PyErr_Format(PyExc_TypeError,
575 "%.200s() takes no keyword arguments",
Sylvaind67a1032017-03-27 23:36:08 +0200576 method->ml_name);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100577
578exit:
579 Py_LeaveRecursiveCall();
580 return result;
581}
582
583
584PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200585_PyCFunction_FastCallDict(PyObject *func,
586 PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100587 PyObject *kwargs)
588{
589 PyObject *result;
590
591 assert(func != NULL);
592 assert(PyCFunction_Check(func));
593
594 result = _PyMethodDef_RawFastCallDict(((PyCFunctionObject*)func)->m_ml,
595 PyCFunction_GET_SELF(func),
596 args, nargs, kwargs);
597 result = _Py_CheckFunctionResult(func, result, NULL);
598 return result;
599}
600
601
602PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200603_PyMethodDef_RawFastCallKeywords(PyMethodDef *method, PyObject *self,
604 PyObject *const *args, Py_ssize_t nargs,
605 PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100606{
607 /* _PyMethodDef_RawFastCallKeywords() must not be called with an exception set,
608 because it can clear it (directly or indirectly) and so the
609 caller loses its exception */
610 assert(!PyErr_Occurred());
611
612 assert(method != NULL);
613 assert(nargs >= 0);
614 assert(kwnames == NULL || PyTuple_CheckExact(kwnames));
615 /* kwnames must only contains str strings, no subclass, and all keys must
616 be unique */
617
618 PyCFunction meth = method->ml_meth;
619 int flags = method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST);
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300620 Py_ssize_t nkwargs = kwnames == NULL ? 0 : PyTuple_GET_SIZE(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100621 PyObject *result = NULL;
622
623 if (Py_EnterRecursiveCall(" while calling a Python object")) {
624 return NULL;
625 }
626
627 switch (flags)
628 {
629 case METH_NOARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300630 if (nkwargs) {
631 goto no_keyword_error;
632 }
633
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100634 if (nargs != 0) {
635 PyErr_Format(PyExc_TypeError,
636 "%.200s() takes no arguments (%zd given)",
637 method->ml_name, nargs);
638 goto exit;
639 }
640
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100641 result = (*meth) (self, NULL);
642 break;
643
644 case METH_O:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300645 if (nkwargs) {
646 goto no_keyword_error;
647 }
648
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100649 if (nargs != 1) {
650 PyErr_Format(PyExc_TypeError,
651 "%.200s() takes exactly one argument (%zd given)",
652 method->ml_name, nargs);
653 goto exit;
654 }
655
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100656 result = (*meth) (self, args[0]);
657 break;
658
659 case METH_FASTCALL:
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300660 if (nkwargs) {
661 goto no_keyword_error;
662 }
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200663 result = ((_PyCFunctionFast)(void(*)(void))meth) (self, args, nargs);
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300664 break;
665
666 case METH_FASTCALL | METH_KEYWORDS:
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100667 /* Fast-path: avoid temporary dict to pass keyword arguments */
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200668 result = ((_PyCFunctionFastWithKeywords)(void(*)(void))meth) (self, args, nargs, kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100669 break;
670
671 case METH_VARARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300672 if (nkwargs) {
673 goto no_keyword_error;
674 }
Stefan Krahf432a322017-08-21 13:09:59 +0200675 /* fall through */
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300676
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100677 case METH_VARARGS | METH_KEYWORDS:
678 {
679 /* Slow-path: create a temporary tuple for positional arguments
680 and a temporary dict for keyword arguments */
681 PyObject *argtuple;
682
Sergey Fedoseevf1b9abe2019-02-26 02:37:26 +0500683 argtuple = _PyTuple_FromArray(args, nargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100684 if (argtuple == NULL) {
685 goto exit;
686 }
687
688 if (flags & METH_KEYWORDS) {
689 PyObject *kwdict;
690
691 if (nkwargs > 0) {
692 kwdict = _PyStack_AsDict(args + nargs, kwnames);
693 if (kwdict == NULL) {
694 Py_DECREF(argtuple);
695 goto exit;
696 }
697 }
698 else {
699 kwdict = NULL;
700 }
701
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200702 result = (*(PyCFunctionWithKeywords)(void(*)(void))meth) (self, argtuple, kwdict);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100703 Py_XDECREF(kwdict);
704 }
705 else {
706 result = (*meth) (self, argtuple);
707 }
708 Py_DECREF(argtuple);
709 break;
710 }
711
712 default:
713 PyErr_SetString(PyExc_SystemError,
Jeroen Demeyera8b46942019-05-17 12:21:35 +0200714 "Bad call flags in _PyMethodDef_RawFastCallKeywords. "
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100715 "METH_OLDARGS is no longer supported!");
716 goto exit;
717 }
718
719 goto exit;
720
721no_keyword_error:
722 PyErr_Format(PyExc_TypeError,
723 "%.200s() takes no keyword arguments",
724 method->ml_name);
725
726exit:
727 Py_LeaveRecursiveCall();
728 return result;
729}
730
731
732PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200733_PyCFunction_FastCallKeywords(PyObject *func,
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200734 PyObject *const *args, size_t nargsf,
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200735 PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100736{
737 PyObject *result;
738
739 assert(func != NULL);
740 assert(PyCFunction_Check(func));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200741 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100742
743 result = _PyMethodDef_RawFastCallKeywords(((PyCFunctionObject*)func)->m_ml,
744 PyCFunction_GET_SELF(func),
745 args, nargs, kwnames);
746 result = _Py_CheckFunctionResult(func, result, NULL);
747 return result;
748}
749
750
751static PyObject *
752cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs)
753{
754 assert(!PyErr_Occurred());
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300755 assert(kwargs == NULL || PyDict_Check(kwargs));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100756
757 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
758 PyObject *self = PyCFunction_GET_SELF(func);
759 PyObject *result;
760
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200761 assert(PyCFunction_GET_FLAGS(func) & METH_VARARGS);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100762 if (PyCFunction_GET_FLAGS(func) & METH_KEYWORDS) {
763 if (Py_EnterRecursiveCall(" while calling a Python object")) {
764 return NULL;
765 }
766
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200767 result = (*(PyCFunctionWithKeywords)(void(*)(void))meth)(self, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100768
769 Py_LeaveRecursiveCall();
770 }
771 else {
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300772 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100773 PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
774 ((PyCFunctionObject*)func)->m_ml->ml_name);
775 return NULL;
776 }
777
778 if (Py_EnterRecursiveCall(" while calling a Python object")) {
779 return NULL;
780 }
781
782 result = (*meth)(self, args);
783
784 Py_LeaveRecursiveCall();
785 }
786
787 return _Py_CheckFunctionResult(func, result, NULL);
788}
789
790
791PyObject *
792PyCFunction_Call(PyObject *func, PyObject *args, PyObject *kwargs)
793{
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200794 /* For METH_VARARGS, we cannot use vectorcall as the vectorcall pointer
795 * is NULL. This is intentional, since vectorcall would be slower. */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100796 if (PyCFunction_GET_FLAGS(func) & METH_VARARGS) {
797 return cfunction_call_varargs(func, args, kwargs);
798 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200799 return PyVectorcall_Call(func, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100800}
801
802
803/* --- More complex call functions -------------------------------- */
804
805/* External interface to call any callable object.
806 The args must be a tuple or NULL. The kwargs must be a dict or NULL. */
807PyObject *
808PyEval_CallObjectWithKeywords(PyObject *callable,
809 PyObject *args, PyObject *kwargs)
810{
811#ifdef Py_DEBUG
812 /* PyEval_CallObjectWithKeywords() must not be called with an exception
813 set. It raises a new exception if parameters are invalid or if
814 PyTuple_New() fails, and so the original exception is lost. */
815 assert(!PyErr_Occurred());
816#endif
817
INADA Naoki3824cd82017-03-01 20:41:03 +0900818 if (args != NULL && !PyTuple_Check(args)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100819 PyErr_SetString(PyExc_TypeError,
820 "argument list must be a tuple");
821 return NULL;
822 }
823
824 if (kwargs != NULL && !PyDict_Check(kwargs)) {
825 PyErr_SetString(PyExc_TypeError,
826 "keyword list must be a dictionary");
827 return NULL;
828 }
829
INADA Naoki3824cd82017-03-01 20:41:03 +0900830 if (args == NULL) {
831 return _PyObject_FastCallDict(callable, NULL, 0, kwargs);
832 }
833 else {
834 return PyObject_Call(callable, args, kwargs);
835 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100836}
837
838
839PyObject *
840PyObject_CallObject(PyObject *callable, PyObject *args)
841{
842 return PyEval_CallObjectWithKeywords(callable, args, NULL);
843}
844
845
846/* Positional arguments are obj followed by args:
847 call callable(obj, *args, **kwargs) */
848PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200849_PyObject_FastCall_Prepend(PyObject *callable, PyObject *obj,
850 PyObject *const *args, Py_ssize_t nargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100851{
852 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
853 PyObject **args2;
854 PyObject *result;
855
856 nargs++;
857 if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
858 args2 = small_stack;
859 }
860 else {
861 args2 = PyMem_Malloc(nargs * sizeof(PyObject *));
862 if (args2 == NULL) {
863 PyErr_NoMemory();
864 return NULL;
865 }
866 }
867
868 /* use borrowed references */
869 args2[0] = obj;
Benjamin Petersona3070d52017-09-04 22:23:42 -0700870 if (nargs > 1) {
871 memcpy(&args2[1], args, (nargs - 1) * sizeof(PyObject *));
872 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100873
874 result = _PyObject_FastCall(callable, args2, nargs);
875 if (args2 != small_stack) {
876 PyMem_Free(args2);
877 }
878 return result;
879}
880
881
882/* Call callable(obj, *args, **kwargs). */
883PyObject *
884_PyObject_Call_Prepend(PyObject *callable,
885 PyObject *obj, PyObject *args, PyObject *kwargs)
886{
887 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
888 PyObject **stack;
889 Py_ssize_t argcount;
890 PyObject *result;
891
892 assert(PyTuple_Check(args));
893
894 argcount = PyTuple_GET_SIZE(args);
895 if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
896 stack = small_stack;
897 }
898 else {
899 stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *));
900 if (stack == NULL) {
901 PyErr_NoMemory();
902 return NULL;
903 }
904 }
905
906 /* use borrowed references */
907 stack[0] = obj;
908 memcpy(&stack[1],
Victor Stinnerd17a6932018-11-09 16:56:48 +0100909 _PyTuple_ITEMS(args),
910 argcount * sizeof(PyObject *));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100911
912 result = _PyObject_FastCallDict(callable,
913 stack, argcount + 1,
914 kwargs);
915 if (stack != small_stack) {
916 PyMem_Free(stack);
917 }
918 return result;
919}
920
921
922/* --- Call with a format string ---------------------------------- */
923
924static PyObject *
925_PyObject_CallFunctionVa(PyObject *callable, const char *format,
926 va_list va, int is_size_t)
927{
928 PyObject* small_stack[_PY_FASTCALL_SMALL_STACK];
929 const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack);
930 PyObject **stack;
931 Py_ssize_t nargs, i;
932 PyObject *result;
933
934 if (callable == NULL) {
935 return null_error();
936 }
937
938 if (!format || !*format) {
939 return _PyObject_CallNoArg(callable);
940 }
941
942 if (is_size_t) {
943 stack = _Py_VaBuildStack_SizeT(small_stack, small_stack_len,
944 format, va, &nargs);
945 }
946 else {
947 stack = _Py_VaBuildStack(small_stack, small_stack_len,
948 format, va, &nargs);
949 }
950 if (stack == NULL) {
951 return NULL;
952 }
953
954 if (nargs == 1 && PyTuple_Check(stack[0])) {
955 /* Special cases for backward compatibility:
956 - PyObject_CallFunction(func, "O", tuple) calls func(*tuple)
957 - PyObject_CallFunction(func, "(OOO)", arg1, arg2, arg3) calls
958 func(*(arg1, arg2, arg3)): func(arg1, arg2, arg3) */
959 PyObject *args = stack[0];
960 result = _PyObject_FastCall(callable,
Victor Stinnerd17a6932018-11-09 16:56:48 +0100961 _PyTuple_ITEMS(args),
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100962 PyTuple_GET_SIZE(args));
963 }
964 else {
965 result = _PyObject_FastCall(callable, stack, nargs);
966 }
967
968 for (i = 0; i < nargs; ++i) {
969 Py_DECREF(stack[i]);
970 }
971 if (stack != small_stack) {
972 PyMem_Free(stack);
973 }
974 return result;
975}
976
977
978PyObject *
979PyObject_CallFunction(PyObject *callable, const char *format, ...)
980{
981 va_list va;
982 PyObject *result;
983
984 va_start(va, format);
985 result = _PyObject_CallFunctionVa(callable, format, va, 0);
986 va_end(va);
987
988 return result;
989}
990
991
INADA Naokiaa289a52017-03-14 18:00:59 +0900992/* PyEval_CallFunction is exact copy of PyObject_CallFunction.
993 * This function is kept for backward compatibility.
994 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100995PyObject *
996PyEval_CallFunction(PyObject *callable, const char *format, ...)
997{
INADA Naokiaa289a52017-03-14 18:00:59 +0900998 va_list va;
999 PyObject *result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001000
INADA Naokiaa289a52017-03-14 18:00:59 +09001001 va_start(va, format);
1002 result = _PyObject_CallFunctionVa(callable, format, va, 0);
1003 va_end(va);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001004
INADA Naokiaa289a52017-03-14 18:00:59 +09001005 return result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001006}
1007
1008
1009PyObject *
1010_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
1011{
1012 va_list va;
1013 PyObject *result;
1014
1015 va_start(va, format);
1016 result = _PyObject_CallFunctionVa(callable, format, va, 1);
1017 va_end(va);
1018
1019 return result;
1020}
1021
1022
1023static PyObject*
1024callmethod(PyObject* callable, const char *format, va_list va, int is_size_t)
1025{
1026 assert(callable != NULL);
1027
1028 if (!PyCallable_Check(callable)) {
1029 PyErr_Format(PyExc_TypeError,
1030 "attribute of type '%.200s' is not callable",
1031 Py_TYPE(callable)->tp_name);
1032 return NULL;
1033 }
1034
1035 return _PyObject_CallFunctionVa(callable, format, va, is_size_t);
1036}
1037
1038
1039PyObject *
1040PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
1041{
1042 va_list va;
1043 PyObject *callable, *retval;
1044
1045 if (obj == NULL || name == NULL) {
1046 return null_error();
1047 }
1048
1049 callable = PyObject_GetAttrString(obj, name);
1050 if (callable == NULL)
1051 return NULL;
1052
1053 va_start(va, format);
1054 retval = callmethod(callable, format, va, 0);
1055 va_end(va);
1056
1057 Py_DECREF(callable);
1058 return retval;
1059}
1060
1061
INADA Naokiaa289a52017-03-14 18:00:59 +09001062/* PyEval_CallMethod is exact copy of PyObject_CallMethod.
1063 * This function is kept for backward compatibility.
1064 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001065PyObject *
1066PyEval_CallMethod(PyObject *obj, const char *name, const char *format, ...)
1067{
INADA Naokiaa289a52017-03-14 18:00:59 +09001068 va_list va;
1069 PyObject *callable, *retval;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001070
INADA Naokiaa289a52017-03-14 18:00:59 +09001071 if (obj == NULL || name == NULL) {
1072 return null_error();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001073 }
1074
INADA Naokiaa289a52017-03-14 18:00:59 +09001075 callable = PyObject_GetAttrString(obj, name);
1076 if (callable == NULL)
1077 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001078
INADA Naokiaa289a52017-03-14 18:00:59 +09001079 va_start(va, format);
1080 retval = callmethod(callable, format, va, 0);
1081 va_end(va);
1082
1083 Py_DECREF(callable);
1084 return retval;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001085}
1086
1087
1088PyObject *
1089_PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name,
1090 const char *format, ...)
1091{
1092 va_list va;
1093 PyObject *callable, *retval;
1094
1095 if (obj == NULL || name == NULL) {
1096 return null_error();
1097 }
1098
1099 callable = _PyObject_GetAttrId(obj, name);
1100 if (callable == NULL)
1101 return NULL;
1102
1103 va_start(va, format);
1104 retval = callmethod(callable, format, va, 0);
1105 va_end(va);
1106
1107 Py_DECREF(callable);
1108 return retval;
1109}
1110
1111
1112PyObject *
1113_PyObject_CallMethod_SizeT(PyObject *obj, const char *name,
1114 const char *format, ...)
1115{
1116 va_list va;
1117 PyObject *callable, *retval;
1118
1119 if (obj == NULL || name == NULL) {
1120 return null_error();
1121 }
1122
1123 callable = PyObject_GetAttrString(obj, name);
1124 if (callable == NULL)
1125 return NULL;
1126
1127 va_start(va, format);
1128 retval = callmethod(callable, format, va, 1);
1129 va_end(va);
1130
1131 Py_DECREF(callable);
1132 return retval;
1133}
1134
1135
1136PyObject *
1137_PyObject_CallMethodId_SizeT(PyObject *obj, _Py_Identifier *name,
1138 const char *format, ...)
1139{
1140 va_list va;
1141 PyObject *callable, *retval;
1142
1143 if (obj == NULL || name == NULL) {
1144 return null_error();
1145 }
1146
1147 callable = _PyObject_GetAttrId(obj, name);
1148 if (callable == NULL) {
1149 return NULL;
1150 }
1151
1152 va_start(va, format);
1153 retval = callmethod(callable, format, va, 1);
1154 va_end(va);
1155
1156 Py_DECREF(callable);
1157 return retval;
1158}
1159
1160
1161/* --- Call with "..." arguments ---------------------------------- */
1162
1163static PyObject *
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001164object_vacall(PyObject *base, PyObject *callable, va_list vargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001165{
1166 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
1167 PyObject **stack;
1168 Py_ssize_t nargs;
1169 PyObject *result;
1170 Py_ssize_t i;
1171 va_list countva;
1172
1173 if (callable == NULL) {
1174 return null_error();
1175 }
1176
1177 /* Count the number of arguments */
1178 va_copy(countva, vargs);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001179 nargs = base ? 1 : 0;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001180 while (1) {
1181 PyObject *arg = va_arg(countva, PyObject *);
1182 if (arg == NULL) {
1183 break;
1184 }
1185 nargs++;
1186 }
1187 va_end(countva);
1188
1189 /* Copy arguments */
1190 if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
1191 stack = small_stack;
1192 }
1193 else {
1194 stack = PyMem_Malloc(nargs * sizeof(stack[0]));
1195 if (stack == NULL) {
1196 PyErr_NoMemory();
1197 return NULL;
1198 }
1199 }
1200
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001201 i = 0;
1202 if (base) {
1203 stack[i++] = base;
1204 }
1205
1206 for (; i < nargs; ++i) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001207 stack[i] = va_arg(vargs, PyObject *);
1208 }
1209
1210 /* Call the function */
1211 result = _PyObject_FastCall(callable, stack, nargs);
1212
1213 if (stack != small_stack) {
1214 PyMem_Free(stack);
1215 }
1216 return result;
1217}
1218
1219
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001220/* Private API for the LOAD_METHOD opcode. */
1221extern int _PyObject_GetMethod(PyObject *, PyObject *, PyObject **);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001222
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001223PyObject *
1224PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)
1225{
1226 if (obj == NULL || name == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001227 return null_error();
1228 }
1229
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001230 PyObject *callable = NULL;
1231 int is_method = _PyObject_GetMethod(obj, name, &callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001232 if (callable == NULL) {
1233 return NULL;
1234 }
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001235 obj = is_method ? obj : NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001236
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001237 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001238 va_start(vargs, name);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001239 PyObject *result = object_vacall(obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001240 va_end(vargs);
1241
1242 Py_DECREF(callable);
1243 return result;
1244}
1245
1246
1247PyObject *
1248_PyObject_CallMethodIdObjArgs(PyObject *obj,
1249 struct _Py_Identifier *name, ...)
1250{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001251 if (obj == NULL || name == NULL) {
1252 return null_error();
1253 }
1254
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001255 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
1256 if (!oname) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001257 return NULL;
1258 }
1259
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001260 PyObject *callable = NULL;
1261 int is_method = _PyObject_GetMethod(obj, oname, &callable);
1262 if (callable == NULL) {
1263 return NULL;
1264 }
1265 obj = is_method ? obj : NULL;
1266
1267 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001268 va_start(vargs, name);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001269 PyObject *result = object_vacall(obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001270 va_end(vargs);
1271
1272 Py_DECREF(callable);
1273 return result;
1274}
1275
1276
1277PyObject *
1278PyObject_CallFunctionObjArgs(PyObject *callable, ...)
1279{
1280 va_list vargs;
1281 PyObject *result;
1282
1283 va_start(vargs, callable);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001284 result = object_vacall(NULL, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001285 va_end(vargs);
1286
1287 return result;
1288}
1289
1290
1291/* --- PyStack functions ------------------------------------------ */
1292
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001293PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001294_PyStack_AsDict(PyObject *const *values, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001295{
1296 Py_ssize_t nkwargs;
1297 PyObject *kwdict;
1298 Py_ssize_t i;
1299
1300 assert(kwnames != NULL);
1301 nkwargs = PyTuple_GET_SIZE(kwnames);
1302 kwdict = _PyDict_NewPresized(nkwargs);
1303 if (kwdict == NULL) {
1304 return NULL;
1305 }
1306
1307 for (i = 0; i < nkwargs; i++) {
1308 PyObject *key = PyTuple_GET_ITEM(kwnames, i);
1309 PyObject *value = *values++;
1310 /* If key already exists, replace it with the new value */
1311 if (PyDict_SetItem(kwdict, key, value)) {
1312 Py_DECREF(kwdict);
1313 return NULL;
1314 }
1315 }
1316 return kwdict;
1317}
1318
1319
1320int
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001321_PyStack_UnpackDict(PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs,
1322 PyObject *const **p_stack, PyObject **p_kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001323{
1324 PyObject **stack, **kwstack;
1325 Py_ssize_t nkwargs;
1326 Py_ssize_t pos, i;
1327 PyObject *key, *value;
1328 PyObject *kwnames;
1329
1330 assert(nargs >= 0);
1331 assert(kwargs == NULL || PyDict_CheckExact(kwargs));
1332
1333 if (kwargs == NULL || (nkwargs = PyDict_GET_SIZE(kwargs)) == 0) {
1334 *p_stack = args;
1335 *p_kwnames = NULL;
1336 return 0;
1337 }
1338
1339 if ((size_t)nargs > PY_SSIZE_T_MAX / sizeof(stack[0]) - (size_t)nkwargs) {
1340 PyErr_NoMemory();
1341 return -1;
1342 }
1343
1344 stack = PyMem_Malloc((nargs + nkwargs) * sizeof(stack[0]));
1345 if (stack == NULL) {
1346 PyErr_NoMemory();
1347 return -1;
1348 }
1349
1350 kwnames = PyTuple_New(nkwargs);
1351 if (kwnames == NULL) {
1352 PyMem_Free(stack);
1353 return -1;
1354 }
1355
Jeroen Demeyer77aa3962019-05-22 13:09:35 +02001356 /* Copy positional arguments */
1357 for (i = 0; i < nargs; i++) {
1358 Py_INCREF(args[i]);
1359 stack[i] = args[i];
1360 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001361
1362 kwstack = stack + nargs;
1363 pos = i = 0;
1364 /* This loop doesn't support lookup function mutating the dictionary
1365 to change its size. It's a deliberate choice for speed, this function is
1366 called in the performance critical hot code. */
1367 while (PyDict_Next(kwargs, &pos, &key, &value)) {
1368 Py_INCREF(key);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +02001369 Py_INCREF(value);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001370 PyTuple_SET_ITEM(kwnames, i, key);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001371 kwstack[i] = value;
1372 i++;
1373 }
1374
1375 *p_stack = stack;
1376 *p_kwnames = kwnames;
1377 return 0;
1378}