blob: b608492dd6bef5bc9fa4d77859f10223134395c3 [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
Victor Stinner0f7b0b32017-03-14 21:37:20 +01008int
9_PyObject_HasFastCall(PyObject *callable)
10{
11 if (PyFunction_Check(callable)) {
12 return 1;
13 }
14 else if (PyCFunction_Check(callable)) {
15 return !(PyCFunction_GET_FLAGS(callable) & METH_VARARGS);
16 }
17 else {
18 assert (PyCallable_Check(callable));
19 return 0;
20 }
21}
22
23
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010024static PyObject *
25null_error(void)
26{
27 if (!PyErr_Occurred())
28 PyErr_SetString(PyExc_SystemError,
29 "null argument to internal routine");
30 return NULL;
31}
32
33
34PyObject*
35_Py_CheckFunctionResult(PyObject *callable, PyObject *result, const char *where)
36{
37 int err_occurred = (PyErr_Occurred() != NULL);
38
39 assert((callable != NULL) ^ (where != NULL));
40
41 if (result == NULL) {
42 if (!err_occurred) {
43 if (callable)
44 PyErr_Format(PyExc_SystemError,
45 "%R returned NULL without setting an error",
46 callable);
47 else
48 PyErr_Format(PyExc_SystemError,
49 "%s returned NULL without setting an error",
50 where);
51#ifdef Py_DEBUG
52 /* Ensure that the bug is caught in debug mode */
53 Py_FatalError("a function returned NULL without setting an error");
54#endif
55 return NULL;
56 }
57 }
58 else {
59 if (err_occurred) {
60 Py_DECREF(result);
61
62 if (callable) {
63 _PyErr_FormatFromCause(PyExc_SystemError,
64 "%R returned a result with an error set",
65 callable);
66 }
67 else {
68 _PyErr_FormatFromCause(PyExc_SystemError,
69 "%s returned a result with an error set",
70 where);
71 }
72#ifdef Py_DEBUG
73 /* Ensure that the bug is caught in debug mode */
74 Py_FatalError("a function returned a result with an error set");
75#endif
76 return NULL;
77 }
78 }
79 return result;
80}
81
82
83/* --- Core PyObject call functions ------------------------------- */
84
85PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +020086_PyObject_FastCallDict(PyObject *callable, PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010087 PyObject *kwargs)
88{
89 /* _PyObject_FastCallDict() must not be called with an exception set,
90 because it can clear it (directly or indirectly) and so the
91 caller loses its exception */
92 assert(!PyErr_Occurred());
93
94 assert(callable != NULL);
95 assert(nargs >= 0);
96 assert(nargs == 0 || args != NULL);
97 assert(kwargs == NULL || PyDict_Check(kwargs));
98
99 if (PyFunction_Check(callable)) {
100 return _PyFunction_FastCallDict(callable, args, nargs, kwargs);
101 }
102 else if (PyCFunction_Check(callable)) {
103 return _PyCFunction_FastCallDict(callable, args, nargs, kwargs);
104 }
105 else {
106 PyObject *argstuple, *result;
107 ternaryfunc call;
108
109 /* Slow-path: build a temporary tuple */
110 call = callable->ob_type->tp_call;
111 if (call == NULL) {
112 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
113 callable->ob_type->tp_name);
114 return NULL;
115 }
116
Sergey Fedoseevf1b9abe2019-02-26 02:37:26 +0500117 argstuple = _PyTuple_FromArray(args, nargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100118 if (argstuple == NULL) {
119 return NULL;
120 }
121
122 if (Py_EnterRecursiveCall(" while calling a Python object")) {
123 Py_DECREF(argstuple);
124 return NULL;
125 }
126
127 result = (*call)(callable, argstuple, kwargs);
128
129 Py_LeaveRecursiveCall();
130 Py_DECREF(argstuple);
131
132 result = _Py_CheckFunctionResult(callable, result, NULL);
133 return result;
134 }
135}
136
137
138PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200139_PyObject_FastCallKeywords(PyObject *callable, PyObject *const *stack, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100140 PyObject *kwnames)
141{
142 /* _PyObject_FastCallKeywords() must not be called with an exception set,
143 because it can clear it (directly or indirectly) and so the
144 caller loses its exception */
145 assert(!PyErr_Occurred());
146
147 assert(nargs >= 0);
148 assert(kwnames == NULL || PyTuple_CheckExact(kwnames));
149
150 /* kwnames must only contains str strings, no subclass, and all keys must
151 be unique: these checks are implemented in Python/ceval.c and
152 _PyArg_ParseStackAndKeywords(). */
153
154 if (PyFunction_Check(callable)) {
155 return _PyFunction_FastCallKeywords(callable, stack, nargs, kwnames);
156 }
157 if (PyCFunction_Check(callable)) {
158 return _PyCFunction_FastCallKeywords(callable, stack, nargs, kwnames);
159 }
160 else {
161 /* Slow-path: build a temporary tuple for positional arguments and a
162 temporary dictionary for keyword arguments (if any) */
163
164 ternaryfunc call;
165 PyObject *argstuple;
166 PyObject *kwdict, *result;
167 Py_ssize_t nkwargs;
168
169 nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
170 assert((nargs == 0 && nkwargs == 0) || stack != NULL);
171
172 call = callable->ob_type->tp_call;
173 if (call == NULL) {
174 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
175 callable->ob_type->tp_name);
176 return NULL;
177 }
178
Sergey Fedoseevf1b9abe2019-02-26 02:37:26 +0500179 argstuple = _PyTuple_FromArray(stack, nargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100180 if (argstuple == NULL) {
181 return NULL;
182 }
183
184 if (nkwargs > 0) {
185 kwdict = _PyStack_AsDict(stack + nargs, kwnames);
186 if (kwdict == NULL) {
187 Py_DECREF(argstuple);
188 return NULL;
189 }
190 }
191 else {
192 kwdict = NULL;
193 }
194
195 if (Py_EnterRecursiveCall(" while calling a Python object")) {
196 Py_DECREF(argstuple);
197 Py_XDECREF(kwdict);
198 return NULL;
199 }
200
201 result = (*call)(callable, argstuple, kwdict);
202
203 Py_LeaveRecursiveCall();
204
205 Py_DECREF(argstuple);
206 Py_XDECREF(kwdict);
207
208 result = _Py_CheckFunctionResult(callable, result, NULL);
209 return result;
210 }
211}
212
213
214PyObject *
215PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
216{
217 ternaryfunc call;
218 PyObject *result;
219
220 /* PyObject_Call() must not be called with an exception set,
221 because it can clear it (directly or indirectly) and so the
222 caller loses its exception */
223 assert(!PyErr_Occurred());
224 assert(PyTuple_Check(args));
225 assert(kwargs == NULL || PyDict_Check(kwargs));
226
227 if (PyFunction_Check(callable)) {
228 return _PyFunction_FastCallDict(callable,
Victor Stinnerd17a6932018-11-09 16:56:48 +0100229 _PyTuple_ITEMS(args),
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100230 PyTuple_GET_SIZE(args),
231 kwargs);
232 }
233 else if (PyCFunction_Check(callable)) {
234 return PyCFunction_Call(callable, args, kwargs);
235 }
236 else {
237 call = callable->ob_type->tp_call;
238 if (call == NULL) {
239 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
240 callable->ob_type->tp_name);
241 return NULL;
242 }
243
244 if (Py_EnterRecursiveCall(" while calling a Python object"))
245 return NULL;
246
247 result = (*call)(callable, args, kwargs);
248
249 Py_LeaveRecursiveCall();
250
251 return _Py_CheckFunctionResult(callable, result, NULL);
252 }
253}
254
255
256/* --- PyFunction call functions ---------------------------------- */
257
258static PyObject* _Py_HOT_FUNCTION
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200259function_code_fastcall(PyCodeObject *co, PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100260 PyObject *globals)
261{
262 PyFrameObject *f;
Victor Stinner50b48572018-11-01 01:51:40 +0100263 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100264 PyObject **fastlocals;
265 Py_ssize_t i;
266 PyObject *result;
267
268 assert(globals != NULL);
269 /* XXX Perhaps we should create a specialized
270 _PyFrame_New_NoTrack() that doesn't take locals, but does
271 take builtins without sanity checking them.
272 */
273 assert(tstate != NULL);
274 f = _PyFrame_New_NoTrack(tstate, co, globals, NULL);
275 if (f == NULL) {
276 return NULL;
277 }
278
279 fastlocals = f->f_localsplus;
280
281 for (i = 0; i < nargs; i++) {
282 Py_INCREF(*args);
283 fastlocals[i] = *args++;
284 }
285 result = PyEval_EvalFrameEx(f,0);
286
287 if (Py_REFCNT(f) > 1) {
288 Py_DECREF(f);
289 _PyObject_GC_TRACK(f);
290 }
291 else {
292 ++tstate->recursion_depth;
293 Py_DECREF(f);
294 --tstate->recursion_depth;
295 }
296 return result;
297}
298
299
300PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200301_PyFunction_FastCallDict(PyObject *func, PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100302 PyObject *kwargs)
303{
304 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
305 PyObject *globals = PyFunction_GET_GLOBALS(func);
306 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
307 PyObject *kwdefs, *closure, *name, *qualname;
308 PyObject *kwtuple, **k;
309 PyObject **d;
310 Py_ssize_t nd, nk;
311 PyObject *result;
312
313 assert(func != NULL);
314 assert(nargs >= 0);
315 assert(nargs == 0 || args != NULL);
316 assert(kwargs == NULL || PyDict_Check(kwargs));
317
318 if (co->co_kwonlyargcount == 0 &&
319 (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) &&
Victor Stinner086c3ae2017-10-25 05:26:17 -0700320 (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100321 {
322 /* Fast paths */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100323 if (argdefs == NULL && co->co_argcount + co->co_posonlyargcount == nargs) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100324 return function_code_fastcall(co, args, nargs, globals);
325 }
326 else if (nargs == 0 && argdefs != NULL
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100327 && co->co_argcount + co->co_posonlyargcount == PyTuple_GET_SIZE(argdefs)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100328 /* function called with no arguments, but all parameters have
329 a default value: use default values as arguments .*/
Victor Stinnerd17a6932018-11-09 16:56:48 +0100330 args = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200331 return function_code_fastcall(co, args, PyTuple_GET_SIZE(argdefs),
332 globals);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100333 }
334 }
335
336 nk = (kwargs != NULL) ? PyDict_GET_SIZE(kwargs) : 0;
337 if (nk != 0) {
338 Py_ssize_t pos, i;
339
Victor Stinner561ca802017-02-23 18:26:43 +0100340 /* bpo-29318, bpo-27840: Caller and callee functions must not share
341 the dictionary: kwargs must be copied. */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100342 kwtuple = PyTuple_New(2 * nk);
343 if (kwtuple == NULL) {
344 return NULL;
345 }
346
Victor Stinnerd17a6932018-11-09 16:56:48 +0100347 k = _PyTuple_ITEMS(kwtuple);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100348 pos = i = 0;
349 while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) {
350 /* We must hold strong references because keyword arguments can be
351 indirectly modified while the function is called:
352 see issue #2016 and test_extcall */
353 Py_INCREF(k[i]);
354 Py_INCREF(k[i+1]);
355 i += 2;
356 }
Eric Lippert5a95ba22018-10-22 08:52:46 -0700357 assert(i / 2 == nk);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100358 }
359 else {
360 kwtuple = NULL;
361 k = NULL;
362 }
363
364 kwdefs = PyFunction_GET_KW_DEFAULTS(func);
365 closure = PyFunction_GET_CLOSURE(func);
366 name = ((PyFunctionObject *)func) -> func_name;
367 qualname = ((PyFunctionObject *)func) -> func_qualname;
368
369 if (argdefs != NULL) {
Victor Stinnerd17a6932018-11-09 16:56:48 +0100370 d = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200371 nd = PyTuple_GET_SIZE(argdefs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100372 }
373 else {
374 d = NULL;
375 nd = 0;
376 }
377
378 result = _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL,
379 args, nargs,
Zackery Spytzc6ea8972017-07-31 08:24:37 -0600380 k, k != NULL ? k + 1 : NULL, nk, 2,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100381 d, nd, kwdefs,
382 closure, name, qualname);
383 Py_XDECREF(kwtuple);
384 return result;
385}
386
387PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200388_PyFunction_FastCallKeywords(PyObject *func, PyObject *const *stack,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100389 Py_ssize_t nargs, PyObject *kwnames)
390{
391 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
392 PyObject *globals = PyFunction_GET_GLOBALS(func);
393 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
394 PyObject *kwdefs, *closure, *name, *qualname;
395 PyObject **d;
396 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
397 Py_ssize_t nd;
398
399 assert(PyFunction_Check(func));
400 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 Galindo8c77b8c2019-04-29 13:36:57 +0100409 if (argdefs == NULL && co->co_argcount + co->co_posonlyargcount== 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 Galindo8c77b8c2019-04-29 13:36:57 +0100413 && co->co_argcount + co->co_posonlyargcount == 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 *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200727_PyCFunction_FastCallKeywords(PyObject *func,
728 PyObject *const *args, Py_ssize_t nargs,
729 PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100730{
731 PyObject *result;
732
733 assert(func != NULL);
734 assert(PyCFunction_Check(func));
735
736 result = _PyMethodDef_RawFastCallKeywords(((PyCFunctionObject*)func)->m_ml,
737 PyCFunction_GET_SELF(func),
738 args, nargs, kwnames);
739 result = _Py_CheckFunctionResult(func, result, NULL);
740 return result;
741}
742
743
744static PyObject *
745cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs)
746{
747 assert(!PyErr_Occurred());
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300748 assert(kwargs == NULL || PyDict_Check(kwargs));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100749
750 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
751 PyObject *self = PyCFunction_GET_SELF(func);
752 PyObject *result;
753
754 if (PyCFunction_GET_FLAGS(func) & METH_KEYWORDS) {
755 if (Py_EnterRecursiveCall(" while calling a Python object")) {
756 return NULL;
757 }
758
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200759 result = (*(PyCFunctionWithKeywords)(void(*)(void))meth)(self, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100760
761 Py_LeaveRecursiveCall();
762 }
763 else {
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300764 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100765 PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
766 ((PyCFunctionObject*)func)->m_ml->ml_name);
767 return NULL;
768 }
769
770 if (Py_EnterRecursiveCall(" while calling a Python object")) {
771 return NULL;
772 }
773
774 result = (*meth)(self, args);
775
776 Py_LeaveRecursiveCall();
777 }
778
779 return _Py_CheckFunctionResult(func, result, NULL);
780}
781
782
783PyObject *
784PyCFunction_Call(PyObject *func, PyObject *args, PyObject *kwargs)
785{
786 /* first try METH_VARARGS to pass directly args tuple unchanged.
787 _PyMethodDef_RawFastCallDict() creates a new temporary tuple
788 for METH_VARARGS. */
789 if (PyCFunction_GET_FLAGS(func) & METH_VARARGS) {
790 return cfunction_call_varargs(func, args, kwargs);
791 }
792 else {
793 return _PyCFunction_FastCallDict(func,
Victor Stinnerd17a6932018-11-09 16:56:48 +0100794 _PyTuple_ITEMS(args),
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100795 PyTuple_GET_SIZE(args),
796 kwargs);
797 }
798}
799
800
801/* --- More complex call functions -------------------------------- */
802
803/* External interface to call any callable object.
804 The args must be a tuple or NULL. The kwargs must be a dict or NULL. */
805PyObject *
806PyEval_CallObjectWithKeywords(PyObject *callable,
807 PyObject *args, PyObject *kwargs)
808{
809#ifdef Py_DEBUG
810 /* PyEval_CallObjectWithKeywords() must not be called with an exception
811 set. It raises a new exception if parameters are invalid or if
812 PyTuple_New() fails, and so the original exception is lost. */
813 assert(!PyErr_Occurred());
814#endif
815
INADA Naoki3824cd82017-03-01 20:41:03 +0900816 if (args != NULL && !PyTuple_Check(args)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100817 PyErr_SetString(PyExc_TypeError,
818 "argument list must be a tuple");
819 return NULL;
820 }
821
822 if (kwargs != NULL && !PyDict_Check(kwargs)) {
823 PyErr_SetString(PyExc_TypeError,
824 "keyword list must be a dictionary");
825 return NULL;
826 }
827
INADA Naoki3824cd82017-03-01 20:41:03 +0900828 if (args == NULL) {
829 return _PyObject_FastCallDict(callable, NULL, 0, kwargs);
830 }
831 else {
832 return PyObject_Call(callable, args, kwargs);
833 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100834}
835
836
837PyObject *
838PyObject_CallObject(PyObject *callable, PyObject *args)
839{
840 return PyEval_CallObjectWithKeywords(callable, args, NULL);
841}
842
843
844/* Positional arguments are obj followed by args:
845 call callable(obj, *args, **kwargs) */
846PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200847_PyObject_FastCall_Prepend(PyObject *callable, PyObject *obj,
848 PyObject *const *args, Py_ssize_t nargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100849{
850 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
851 PyObject **args2;
852 PyObject *result;
853
854 nargs++;
855 if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
856 args2 = small_stack;
857 }
858 else {
859 args2 = PyMem_Malloc(nargs * sizeof(PyObject *));
860 if (args2 == NULL) {
861 PyErr_NoMemory();
862 return NULL;
863 }
864 }
865
866 /* use borrowed references */
867 args2[0] = obj;
Benjamin Petersona3070d52017-09-04 22:23:42 -0700868 if (nargs > 1) {
869 memcpy(&args2[1], args, (nargs - 1) * sizeof(PyObject *));
870 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100871
872 result = _PyObject_FastCall(callable, args2, nargs);
873 if (args2 != small_stack) {
874 PyMem_Free(args2);
875 }
876 return result;
877}
878
879
880/* Call callable(obj, *args, **kwargs). */
881PyObject *
882_PyObject_Call_Prepend(PyObject *callable,
883 PyObject *obj, PyObject *args, PyObject *kwargs)
884{
885 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
886 PyObject **stack;
887 Py_ssize_t argcount;
888 PyObject *result;
889
890 assert(PyTuple_Check(args));
891
892 argcount = PyTuple_GET_SIZE(args);
893 if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
894 stack = small_stack;
895 }
896 else {
897 stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *));
898 if (stack == NULL) {
899 PyErr_NoMemory();
900 return NULL;
901 }
902 }
903
904 /* use borrowed references */
905 stack[0] = obj;
906 memcpy(&stack[1],
Victor Stinnerd17a6932018-11-09 16:56:48 +0100907 _PyTuple_ITEMS(args),
908 argcount * sizeof(PyObject *));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100909
910 result = _PyObject_FastCallDict(callable,
911 stack, argcount + 1,
912 kwargs);
913 if (stack != small_stack) {
914 PyMem_Free(stack);
915 }
916 return result;
917}
918
919
920/* --- Call with a format string ---------------------------------- */
921
922static PyObject *
923_PyObject_CallFunctionVa(PyObject *callable, const char *format,
924 va_list va, int is_size_t)
925{
926 PyObject* small_stack[_PY_FASTCALL_SMALL_STACK];
927 const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack);
928 PyObject **stack;
929 Py_ssize_t nargs, i;
930 PyObject *result;
931
932 if (callable == NULL) {
933 return null_error();
934 }
935
936 if (!format || !*format) {
937 return _PyObject_CallNoArg(callable);
938 }
939
940 if (is_size_t) {
941 stack = _Py_VaBuildStack_SizeT(small_stack, small_stack_len,
942 format, va, &nargs);
943 }
944 else {
945 stack = _Py_VaBuildStack(small_stack, small_stack_len,
946 format, va, &nargs);
947 }
948 if (stack == NULL) {
949 return NULL;
950 }
951
952 if (nargs == 1 && PyTuple_Check(stack[0])) {
953 /* Special cases for backward compatibility:
954 - PyObject_CallFunction(func, "O", tuple) calls func(*tuple)
955 - PyObject_CallFunction(func, "(OOO)", arg1, arg2, arg3) calls
956 func(*(arg1, arg2, arg3)): func(arg1, arg2, arg3) */
957 PyObject *args = stack[0];
958 result = _PyObject_FastCall(callable,
Victor Stinnerd17a6932018-11-09 16:56:48 +0100959 _PyTuple_ITEMS(args),
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100960 PyTuple_GET_SIZE(args));
961 }
962 else {
963 result = _PyObject_FastCall(callable, stack, nargs);
964 }
965
966 for (i = 0; i < nargs; ++i) {
967 Py_DECREF(stack[i]);
968 }
969 if (stack != small_stack) {
970 PyMem_Free(stack);
971 }
972 return result;
973}
974
975
976PyObject *
977PyObject_CallFunction(PyObject *callable, const char *format, ...)
978{
979 va_list va;
980 PyObject *result;
981
982 va_start(va, format);
983 result = _PyObject_CallFunctionVa(callable, format, va, 0);
984 va_end(va);
985
986 return result;
987}
988
989
INADA Naokiaa289a52017-03-14 18:00:59 +0900990/* PyEval_CallFunction is exact copy of PyObject_CallFunction.
991 * This function is kept for backward compatibility.
992 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100993PyObject *
994PyEval_CallFunction(PyObject *callable, const char *format, ...)
995{
INADA Naokiaa289a52017-03-14 18:00:59 +0900996 va_list va;
997 PyObject *result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100998
INADA Naokiaa289a52017-03-14 18:00:59 +0900999 va_start(va, format);
1000 result = _PyObject_CallFunctionVa(callable, format, va, 0);
1001 va_end(va);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001002
INADA Naokiaa289a52017-03-14 18:00:59 +09001003 return result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001004}
1005
1006
1007PyObject *
1008_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
1009{
1010 va_list va;
1011 PyObject *result;
1012
1013 va_start(va, format);
1014 result = _PyObject_CallFunctionVa(callable, format, va, 1);
1015 va_end(va);
1016
1017 return result;
1018}
1019
1020
1021static PyObject*
1022callmethod(PyObject* callable, const char *format, va_list va, int is_size_t)
1023{
1024 assert(callable != NULL);
1025
1026 if (!PyCallable_Check(callable)) {
1027 PyErr_Format(PyExc_TypeError,
1028 "attribute of type '%.200s' is not callable",
1029 Py_TYPE(callable)->tp_name);
1030 return NULL;
1031 }
1032
1033 return _PyObject_CallFunctionVa(callable, format, va, is_size_t);
1034}
1035
1036
1037PyObject *
1038PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
1039{
1040 va_list va;
1041 PyObject *callable, *retval;
1042
1043 if (obj == NULL || name == NULL) {
1044 return null_error();
1045 }
1046
1047 callable = PyObject_GetAttrString(obj, name);
1048 if (callable == NULL)
1049 return NULL;
1050
1051 va_start(va, format);
1052 retval = callmethod(callable, format, va, 0);
1053 va_end(va);
1054
1055 Py_DECREF(callable);
1056 return retval;
1057}
1058
1059
INADA Naokiaa289a52017-03-14 18:00:59 +09001060/* PyEval_CallMethod is exact copy of PyObject_CallMethod.
1061 * This function is kept for backward compatibility.
1062 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001063PyObject *
1064PyEval_CallMethod(PyObject *obj, const char *name, const char *format, ...)
1065{
INADA Naokiaa289a52017-03-14 18:00:59 +09001066 va_list va;
1067 PyObject *callable, *retval;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001068
INADA Naokiaa289a52017-03-14 18:00:59 +09001069 if (obj == NULL || name == NULL) {
1070 return null_error();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001071 }
1072
INADA Naokiaa289a52017-03-14 18:00:59 +09001073 callable = PyObject_GetAttrString(obj, name);
1074 if (callable == NULL)
1075 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001076
INADA Naokiaa289a52017-03-14 18:00:59 +09001077 va_start(va, format);
1078 retval = callmethod(callable, format, va, 0);
1079 va_end(va);
1080
1081 Py_DECREF(callable);
1082 return retval;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001083}
1084
1085
1086PyObject *
1087_PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name,
1088 const char *format, ...)
1089{
1090 va_list va;
1091 PyObject *callable, *retval;
1092
1093 if (obj == NULL || name == NULL) {
1094 return null_error();
1095 }
1096
1097 callable = _PyObject_GetAttrId(obj, name);
1098 if (callable == NULL)
1099 return NULL;
1100
1101 va_start(va, format);
1102 retval = callmethod(callable, format, va, 0);
1103 va_end(va);
1104
1105 Py_DECREF(callable);
1106 return retval;
1107}
1108
1109
1110PyObject *
1111_PyObject_CallMethod_SizeT(PyObject *obj, const char *name,
1112 const char *format, ...)
1113{
1114 va_list va;
1115 PyObject *callable, *retval;
1116
1117 if (obj == NULL || name == NULL) {
1118 return null_error();
1119 }
1120
1121 callable = PyObject_GetAttrString(obj, name);
1122 if (callable == NULL)
1123 return NULL;
1124
1125 va_start(va, format);
1126 retval = callmethod(callable, format, va, 1);
1127 va_end(va);
1128
1129 Py_DECREF(callable);
1130 return retval;
1131}
1132
1133
1134PyObject *
1135_PyObject_CallMethodId_SizeT(PyObject *obj, _Py_Identifier *name,
1136 const char *format, ...)
1137{
1138 va_list va;
1139 PyObject *callable, *retval;
1140
1141 if (obj == NULL || name == NULL) {
1142 return null_error();
1143 }
1144
1145 callable = _PyObject_GetAttrId(obj, name);
1146 if (callable == NULL) {
1147 return NULL;
1148 }
1149
1150 va_start(va, format);
1151 retval = callmethod(callable, format, va, 1);
1152 va_end(va);
1153
1154 Py_DECREF(callable);
1155 return retval;
1156}
1157
1158
1159/* --- Call with "..." arguments ---------------------------------- */
1160
1161static PyObject *
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001162object_vacall(PyObject *base, PyObject *callable, va_list vargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001163{
1164 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
1165 PyObject **stack;
1166 Py_ssize_t nargs;
1167 PyObject *result;
1168 Py_ssize_t i;
1169 va_list countva;
1170
1171 if (callable == NULL) {
1172 return null_error();
1173 }
1174
1175 /* Count the number of arguments */
1176 va_copy(countva, vargs);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001177 nargs = base ? 1 : 0;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001178 while (1) {
1179 PyObject *arg = va_arg(countva, PyObject *);
1180 if (arg == NULL) {
1181 break;
1182 }
1183 nargs++;
1184 }
1185 va_end(countva);
1186
1187 /* Copy arguments */
1188 if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
1189 stack = small_stack;
1190 }
1191 else {
1192 stack = PyMem_Malloc(nargs * sizeof(stack[0]));
1193 if (stack == NULL) {
1194 PyErr_NoMemory();
1195 return NULL;
1196 }
1197 }
1198
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001199 i = 0;
1200 if (base) {
1201 stack[i++] = base;
1202 }
1203
1204 for (; i < nargs; ++i) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001205 stack[i] = va_arg(vargs, PyObject *);
1206 }
1207
1208 /* Call the function */
1209 result = _PyObject_FastCall(callable, stack, nargs);
1210
1211 if (stack != small_stack) {
1212 PyMem_Free(stack);
1213 }
1214 return result;
1215}
1216
1217
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001218/* Private API for the LOAD_METHOD opcode. */
1219extern int _PyObject_GetMethod(PyObject *, PyObject *, PyObject **);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001220
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001221PyObject *
1222PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)
1223{
1224 if (obj == NULL || name == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001225 return null_error();
1226 }
1227
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001228 PyObject *callable = NULL;
1229 int is_method = _PyObject_GetMethod(obj, name, &callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001230 if (callable == NULL) {
1231 return NULL;
1232 }
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001233 obj = is_method ? obj : NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001234
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001235 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001236 va_start(vargs, name);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001237 PyObject *result = object_vacall(obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001238 va_end(vargs);
1239
1240 Py_DECREF(callable);
1241 return result;
1242}
1243
1244
1245PyObject *
1246_PyObject_CallMethodIdObjArgs(PyObject *obj,
1247 struct _Py_Identifier *name, ...)
1248{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001249 if (obj == NULL || name == NULL) {
1250 return null_error();
1251 }
1252
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001253 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
1254 if (!oname) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001255 return NULL;
1256 }
1257
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001258 PyObject *callable = NULL;
1259 int is_method = _PyObject_GetMethod(obj, oname, &callable);
1260 if (callable == NULL) {
1261 return NULL;
1262 }
1263 obj = is_method ? obj : NULL;
1264
1265 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001266 va_start(vargs, name);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001267 PyObject *result = object_vacall(obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001268 va_end(vargs);
1269
1270 Py_DECREF(callable);
1271 return result;
1272}
1273
1274
1275PyObject *
1276PyObject_CallFunctionObjArgs(PyObject *callable, ...)
1277{
1278 va_list vargs;
1279 PyObject *result;
1280
1281 va_start(vargs, callable);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001282 result = object_vacall(NULL, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001283 va_end(vargs);
1284
1285 return result;
1286}
1287
1288
1289/* --- PyStack functions ------------------------------------------ */
1290
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001291PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001292_PyStack_AsDict(PyObject *const *values, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001293{
1294 Py_ssize_t nkwargs;
1295 PyObject *kwdict;
1296 Py_ssize_t i;
1297
1298 assert(kwnames != NULL);
1299 nkwargs = PyTuple_GET_SIZE(kwnames);
1300 kwdict = _PyDict_NewPresized(nkwargs);
1301 if (kwdict == NULL) {
1302 return NULL;
1303 }
1304
1305 for (i = 0; i < nkwargs; i++) {
1306 PyObject *key = PyTuple_GET_ITEM(kwnames, i);
1307 PyObject *value = *values++;
1308 /* If key already exists, replace it with the new value */
1309 if (PyDict_SetItem(kwdict, key, value)) {
1310 Py_DECREF(kwdict);
1311 return NULL;
1312 }
1313 }
1314 return kwdict;
1315}
1316
1317
1318int
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001319_PyStack_UnpackDict(PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs,
1320 PyObject *const **p_stack, PyObject **p_kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001321{
1322 PyObject **stack, **kwstack;
1323 Py_ssize_t nkwargs;
1324 Py_ssize_t pos, i;
1325 PyObject *key, *value;
1326 PyObject *kwnames;
1327
1328 assert(nargs >= 0);
1329 assert(kwargs == NULL || PyDict_CheckExact(kwargs));
1330
1331 if (kwargs == NULL || (nkwargs = PyDict_GET_SIZE(kwargs)) == 0) {
1332 *p_stack = args;
1333 *p_kwnames = NULL;
1334 return 0;
1335 }
1336
1337 if ((size_t)nargs > PY_SSIZE_T_MAX / sizeof(stack[0]) - (size_t)nkwargs) {
1338 PyErr_NoMemory();
1339 return -1;
1340 }
1341
1342 stack = PyMem_Malloc((nargs + nkwargs) * sizeof(stack[0]));
1343 if (stack == NULL) {
1344 PyErr_NoMemory();
1345 return -1;
1346 }
1347
1348 kwnames = PyTuple_New(nkwargs);
1349 if (kwnames == NULL) {
1350 PyMem_Free(stack);
1351 return -1;
1352 }
1353
Jeroen Demeyer77aa3962019-05-22 13:09:35 +02001354 /* Copy positional arguments */
1355 for (i = 0; i < nargs; i++) {
1356 Py_INCREF(args[i]);
1357 stack[i] = args[i];
1358 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001359
1360 kwstack = stack + nargs;
1361 pos = i = 0;
1362 /* This loop doesn't support lookup function mutating the dictionary
1363 to change its size. It's a deliberate choice for speed, this function is
1364 called in the performance critical hot code. */
1365 while (PyDict_Next(kwargs, &pos, &key, &value)) {
1366 Py_INCREF(key);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +02001367 Py_INCREF(value);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001368 PyTuple_SET_ITEM(kwnames, i, key);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001369 kwstack[i] = value;
1370 i++;
1371 }
1372
1373 *p_stack = stack;
1374 *p_kwnames = kwnames;
1375 return 0;
1376}