blob: f9a3207e96228952cec6e7738590326d9f32206a [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
Victor Stinner2ff58a22019-06-17 14:27:23 +020073/* Call a callable Python object without any arguments */
74PyObject *
75PyObject_CallNoArgs(PyObject *func)
76{
77 return _PyObject_CallNoArg(func);
78}
79
80
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010081PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020082_PyObject_FastCallDict(PyObject *callable, PyObject *const *args,
83 size_t nargsf, PyObject *kwargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010084{
85 /* _PyObject_FastCallDict() must not be called with an exception set,
86 because it can clear it (directly or indirectly) and so the
87 caller loses its exception */
88 assert(!PyErr_Occurred());
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010089 assert(callable != NULL);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020090
91 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010092 assert(nargs >= 0);
93 assert(nargs == 0 || args != NULL);
94 assert(kwargs == NULL || PyDict_Check(kwargs));
95
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020096 vectorcallfunc func = _PyVectorcall_Function(callable);
97 if (func == NULL) {
98 /* Use tp_call instead */
99 return _PyObject_MakeTpCall(callable, args, nargs, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100100 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200101
102 PyObject *res;
103 if (kwargs == NULL) {
104 res = func(callable, args, nargsf, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100105 }
106 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200107 PyObject *kwnames;
108 PyObject *const *newargs;
109 if (_PyStack_UnpackDict(args, nargs, kwargs, &newargs, &kwnames) < 0) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100110 return NULL;
111 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200112 res = func(callable, newargs, nargs, kwnames);
113 if (kwnames != NULL) {
114 Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames) + nargs;
115 for (i = 0; i < n; i++) {
116 Py_DECREF(newargs[i]);
117 }
118 PyMem_Free((PyObject **)newargs);
119 Py_DECREF(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100120 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100121 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200122 return _Py_CheckFunctionResult(callable, res, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100123}
124
125
126PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200127_PyObject_MakeTpCall(PyObject *callable, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100128{
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200129 /* Slow path: build a temporary tuple for positional arguments and a
130 * temporary dictionary for keyword arguments (if any) */
131 ternaryfunc call = Py_TYPE(callable)->tp_call;
132 if (call == NULL) {
133 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
134 Py_TYPE(callable)->tp_name);
135 return NULL;
136 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100137
138 assert(nargs >= 0);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200139 assert(nargs == 0 || args != NULL);
140 assert(keywords == NULL || PyTuple_Check(keywords) || PyDict_Check(keywords));
141 PyObject *argstuple = _PyTuple_FromArray(args, nargs);
142 if (argstuple == NULL) {
143 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100144 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200145
146 PyObject *kwdict;
147 if (keywords == NULL || PyDict_Check(keywords)) {
148 kwdict = keywords;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100149 }
150 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200151 if (PyTuple_GET_SIZE(keywords)) {
152 assert(args != NULL);
153 kwdict = _PyStack_AsDict(args + nargs, keywords);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100154 if (kwdict == NULL) {
155 Py_DECREF(argstuple);
156 return NULL;
157 }
158 }
159 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200160 keywords = kwdict = NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100161 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100162 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200163
164 PyObject *result = NULL;
165 if (Py_EnterRecursiveCall(" while calling a Python object") == 0)
166 {
167 result = call(callable, argstuple, kwdict);
168 Py_LeaveRecursiveCall();
169 }
170
171 Py_DECREF(argstuple);
172 if (kwdict != keywords) {
173 Py_DECREF(kwdict);
174 }
175
176 result = _Py_CheckFunctionResult(callable, result, NULL);
177 return result;
178}
179
180
181PyObject *
182PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs)
183{
Petr Viktorinfb9423f2019-06-02 23:52:20 +0200184 /* get vectorcallfunc as in _PyVectorcall_Function, but without
185 * the _Py_TPFLAGS_HAVE_VECTORCALL check */
186 Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset;
187 if ((offset <= 0) || (!Py_TYPE(callable)->tp_call)) {
188 PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall",
189 Py_TYPE(callable)->tp_name);
190 return NULL;
191 }
192 vectorcallfunc func = *(vectorcallfunc *)(((char *)callable) + offset);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200193 if (func == NULL) {
194 PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall",
195 Py_TYPE(callable)->tp_name);
196 return NULL;
197 }
Petr Viktorinfb9423f2019-06-02 23:52:20 +0200198
199 /* Convert arguments & call */
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200200 PyObject *const *args;
201 Py_ssize_t nargs = PyTuple_GET_SIZE(tuple);
202 PyObject *kwnames;
203 if (_PyStack_UnpackDict(_PyTuple_ITEMS(tuple), nargs,
204 kwargs, &args, &kwnames) < 0) {
205 return NULL;
206 }
207 PyObject *result = func(callable, args, nargs, kwnames);
208 if (kwnames != NULL) {
209 Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames) + nargs;
210 for (i = 0; i < n; i++) {
211 Py_DECREF(args[i]);
212 }
213 PyMem_Free((PyObject **)args);
214 Py_DECREF(kwnames);
215 }
216
217 return result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100218}
219
220
221PyObject *
222PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
223{
224 ternaryfunc call;
225 PyObject *result;
226
227 /* PyObject_Call() must not be called with an exception set,
228 because it can clear it (directly or indirectly) and so the
229 caller loses its exception */
230 assert(!PyErr_Occurred());
231 assert(PyTuple_Check(args));
232 assert(kwargs == NULL || PyDict_Check(kwargs));
233
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200234 if (_PyVectorcall_Function(callable) != NULL) {
235 return PyVectorcall_Call(callable, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100236 }
237 else if (PyCFunction_Check(callable)) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200238 /* This must be a METH_VARARGS function, otherwise we would be
239 * in the previous case */
240 return cfunction_call_varargs(callable, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100241 }
242 else {
243 call = callable->ob_type->tp_call;
244 if (call == NULL) {
245 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
246 callable->ob_type->tp_name);
247 return NULL;
248 }
249
250 if (Py_EnterRecursiveCall(" while calling a Python object"))
251 return NULL;
252
253 result = (*call)(callable, args, kwargs);
254
255 Py_LeaveRecursiveCall();
256
257 return _Py_CheckFunctionResult(callable, result, NULL);
258 }
259}
260
261
262/* --- PyFunction call functions ---------------------------------- */
263
264static PyObject* _Py_HOT_FUNCTION
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200265function_code_fastcall(PyCodeObject *co, PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100266 PyObject *globals)
267{
268 PyFrameObject *f;
Victor Stinner50b48572018-11-01 01:51:40 +0100269 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100270 PyObject **fastlocals;
271 Py_ssize_t i;
272 PyObject *result;
273
274 assert(globals != NULL);
275 /* XXX Perhaps we should create a specialized
276 _PyFrame_New_NoTrack() that doesn't take locals, but does
277 take builtins without sanity checking them.
278 */
279 assert(tstate != NULL);
280 f = _PyFrame_New_NoTrack(tstate, co, globals, NULL);
281 if (f == NULL) {
282 return NULL;
283 }
284
285 fastlocals = f->f_localsplus;
286
287 for (i = 0; i < nargs; i++) {
288 Py_INCREF(*args);
289 fastlocals[i] = *args++;
290 }
291 result = PyEval_EvalFrameEx(f,0);
292
293 if (Py_REFCNT(f) > 1) {
294 Py_DECREF(f);
295 _PyObject_GC_TRACK(f);
296 }
297 else {
298 ++tstate->recursion_depth;
299 Py_DECREF(f);
300 --tstate->recursion_depth;
301 }
302 return result;
303}
304
305
306PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200307_PyFunction_FastCallDict(PyObject *func, PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100308 PyObject *kwargs)
309{
310 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
311 PyObject *globals = PyFunction_GET_GLOBALS(func);
312 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
313 PyObject *kwdefs, *closure, *name, *qualname;
314 PyObject *kwtuple, **k;
315 PyObject **d;
316 Py_ssize_t nd, nk;
317 PyObject *result;
318
319 assert(func != NULL);
320 assert(nargs >= 0);
321 assert(nargs == 0 || args != NULL);
322 assert(kwargs == NULL || PyDict_Check(kwargs));
323
324 if (co->co_kwonlyargcount == 0 &&
325 (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) &&
Victor Stinner086c3ae2017-10-25 05:26:17 -0700326 (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100327 {
328 /* Fast paths */
Pablo Galindocd74e662019-06-01 18:08:04 +0100329 if (argdefs == NULL && co->co_argcount == nargs) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100330 return function_code_fastcall(co, args, nargs, globals);
331 }
332 else if (nargs == 0 && argdefs != NULL
Pablo Galindocd74e662019-06-01 18:08:04 +0100333 && co->co_argcount == PyTuple_GET_SIZE(argdefs)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100334 /* function called with no arguments, but all parameters have
335 a default value: use default values as arguments .*/
Victor Stinnerd17a6932018-11-09 16:56:48 +0100336 args = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200337 return function_code_fastcall(co, args, PyTuple_GET_SIZE(argdefs),
338 globals);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100339 }
340 }
341
342 nk = (kwargs != NULL) ? PyDict_GET_SIZE(kwargs) : 0;
343 if (nk != 0) {
344 Py_ssize_t pos, i;
345
Victor Stinner561ca802017-02-23 18:26:43 +0100346 /* bpo-29318, bpo-27840: Caller and callee functions must not share
347 the dictionary: kwargs must be copied. */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100348 kwtuple = PyTuple_New(2 * nk);
349 if (kwtuple == NULL) {
350 return NULL;
351 }
352
Victor Stinnerd17a6932018-11-09 16:56:48 +0100353 k = _PyTuple_ITEMS(kwtuple);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100354 pos = i = 0;
355 while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) {
356 /* We must hold strong references because keyword arguments can be
357 indirectly modified while the function is called:
358 see issue #2016 and test_extcall */
359 Py_INCREF(k[i]);
360 Py_INCREF(k[i+1]);
361 i += 2;
362 }
Eric Lippert5a95ba22018-10-22 08:52:46 -0700363 assert(i / 2 == nk);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100364 }
365 else {
366 kwtuple = NULL;
367 k = NULL;
368 }
369
370 kwdefs = PyFunction_GET_KW_DEFAULTS(func);
371 closure = PyFunction_GET_CLOSURE(func);
372 name = ((PyFunctionObject *)func) -> func_name;
373 qualname = ((PyFunctionObject *)func) -> func_qualname;
374
375 if (argdefs != NULL) {
Victor Stinnerd17a6932018-11-09 16:56:48 +0100376 d = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200377 nd = PyTuple_GET_SIZE(argdefs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100378 }
379 else {
380 d = NULL;
381 nd = 0;
382 }
383
384 result = _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL,
385 args, nargs,
Zackery Spytzc6ea8972017-07-31 08:24:37 -0600386 k, k != NULL ? k + 1 : NULL, nk, 2,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100387 d, nd, kwdefs,
388 closure, name, qualname);
389 Py_XDECREF(kwtuple);
390 return result;
391}
392
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200393
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100394PyObject *
Jeroen Demeyer37788bc2019-05-30 15:11:22 +0200395_PyFunction_Vectorcall(PyObject *func, PyObject* const* stack,
396 size_t nargsf, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100397{
398 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
399 PyObject *globals = PyFunction_GET_GLOBALS(func);
400 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
401 PyObject *kwdefs, *closure, *name, *qualname;
402 PyObject **d;
403 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
404 Py_ssize_t nd;
405
406 assert(PyFunction_Check(func));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200407 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100408 assert(nargs >= 0);
409 assert(kwnames == NULL || PyTuple_CheckExact(kwnames));
410 assert((nargs == 0 && nkwargs == 0) || stack != NULL);
411 /* kwnames must only contains str strings, no subclass, and all keys must
412 be unique */
413
414 if (co->co_kwonlyargcount == 0 && nkwargs == 0 &&
Victor Stinner086c3ae2017-10-25 05:26:17 -0700415 (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100416 {
Pablo Galindocd74e662019-06-01 18:08:04 +0100417 if (argdefs == NULL && co->co_argcount == nargs) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100418 return function_code_fastcall(co, stack, nargs, globals);
419 }
420 else if (nargs == 0 && argdefs != NULL
Pablo Galindocd74e662019-06-01 18:08:04 +0100421 && co->co_argcount == PyTuple_GET_SIZE(argdefs)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100422 /* function called with no arguments, but all parameters have
423 a default value: use default values as arguments .*/
Victor Stinnerd17a6932018-11-09 16:56:48 +0100424 stack = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200425 return function_code_fastcall(co, stack, PyTuple_GET_SIZE(argdefs),
426 globals);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100427 }
428 }
429
430 kwdefs = PyFunction_GET_KW_DEFAULTS(func);
431 closure = PyFunction_GET_CLOSURE(func);
432 name = ((PyFunctionObject *)func) -> func_name;
433 qualname = ((PyFunctionObject *)func) -> func_qualname;
434
435 if (argdefs != NULL) {
Victor Stinnerd17a6932018-11-09 16:56:48 +0100436 d = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200437 nd = PyTuple_GET_SIZE(argdefs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100438 }
439 else {
440 d = NULL;
441 nd = 0;
442 }
443 return _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL,
444 stack, nargs,
Victor Stinnerd17a6932018-11-09 16:56:48 +0100445 nkwargs ? _PyTuple_ITEMS(kwnames) : NULL,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100446 stack + nargs,
447 nkwargs, 1,
448 d, (int)nd, kwdefs,
449 closure, name, qualname);
450}
451
452
453/* --- PyCFunction call functions --------------------------------- */
454
455PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200456_PyMethodDef_RawFastCallDict(PyMethodDef *method, PyObject *self,
457 PyObject *const *args, Py_ssize_t nargs,
458 PyObject *kwargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100459{
460 /* _PyMethodDef_RawFastCallDict() must not be called with an exception set,
461 because it can clear it (directly or indirectly) and so the
462 caller loses its exception */
463 assert(!PyErr_Occurred());
464
465 assert(method != NULL);
466 assert(nargs >= 0);
467 assert(nargs == 0 || args != NULL);
468 assert(kwargs == NULL || PyDict_Check(kwargs));
469
470 PyCFunction meth = method->ml_meth;
471 int flags = method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST);
472 PyObject *result = NULL;
473
474 if (Py_EnterRecursiveCall(" while calling a Python object")) {
475 return NULL;
476 }
477
478 switch (flags)
479 {
480 case METH_NOARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300481 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
482 goto no_keyword_error;
483 }
484
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100485 if (nargs != 0) {
486 PyErr_Format(PyExc_TypeError,
487 "%.200s() takes no arguments (%zd given)",
488 method->ml_name, nargs);
489 goto exit;
490 }
491
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100492 result = (*meth) (self, NULL);
493 break;
494
495 case METH_O:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300496 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
497 goto no_keyword_error;
498 }
499
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100500 if (nargs != 1) {
501 PyErr_Format(PyExc_TypeError,
502 "%.200s() takes exactly one argument (%zd given)",
503 method->ml_name, nargs);
504 goto exit;
505 }
506
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100507 result = (*meth) (self, args[0]);
508 break;
509
510 case METH_VARARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300511 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100512 goto no_keyword_error;
513 }
Stefan Krahf432a322017-08-21 13:09:59 +0200514 /* fall through */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100515
516 case METH_VARARGS | METH_KEYWORDS:
517 {
518 /* Slow-path: create a temporary tuple for positional arguments */
Sergey Fedoseevf1b9abe2019-02-26 02:37:26 +0500519 PyObject *argstuple = _PyTuple_FromArray(args, nargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100520 if (argstuple == NULL) {
521 goto exit;
522 }
523
524 if (flags & METH_KEYWORDS) {
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200525 result = (*(PyCFunctionWithKeywords)(void(*)(void))meth) (self, argstuple, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100526 }
527 else {
528 result = (*meth) (self, argstuple);
529 }
530 Py_DECREF(argstuple);
531 break;
532 }
533
534 case METH_FASTCALL:
535 {
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300536 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
537 goto no_keyword_error;
538 }
539
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200540 result = (*(_PyCFunctionFast)(void(*)(void))meth) (self, args, nargs);
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300541 break;
542 }
543
544 case METH_FASTCALL | METH_KEYWORDS:
545 {
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200546 PyObject *const *stack;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100547 PyObject *kwnames;
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200548 _PyCFunctionFastWithKeywords fastmeth = (_PyCFunctionFastWithKeywords)(void(*)(void))meth;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100549
550 if (_PyStack_UnpackDict(args, nargs, kwargs, &stack, &kwnames) < 0) {
551 goto exit;
552 }
553
554 result = (*fastmeth) (self, stack, nargs, kwnames);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200555 if (kwnames != NULL) {
556 Py_ssize_t i, n = nargs + PyTuple_GET_SIZE(kwnames);
557 for (i = 0; i < n; i++) {
558 Py_DECREF(stack[i]);
559 }
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200560 PyMem_Free((PyObject **)stack);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200561 Py_DECREF(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100562 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100563 break;
564 }
565
566 default:
567 PyErr_SetString(PyExc_SystemError,
568 "Bad call flags in _PyMethodDef_RawFastCallDict. "
569 "METH_OLDARGS is no longer supported!");
570 goto exit;
571 }
572
573 goto exit;
574
575no_keyword_error:
576 PyErr_Format(PyExc_TypeError,
577 "%.200s() takes no keyword arguments",
Sylvaind67a1032017-03-27 23:36:08 +0200578 method->ml_name);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100579
580exit:
581 Py_LeaveRecursiveCall();
582 return result;
583}
584
585
586PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200587_PyCFunction_FastCallDict(PyObject *func,
588 PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100589 PyObject *kwargs)
590{
591 PyObject *result;
592
593 assert(func != NULL);
594 assert(PyCFunction_Check(func));
595
596 result = _PyMethodDef_RawFastCallDict(((PyCFunctionObject*)func)->m_ml,
597 PyCFunction_GET_SELF(func),
598 args, nargs, kwargs);
599 result = _Py_CheckFunctionResult(func, result, NULL);
600 return result;
601}
602
603
604PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200605_PyMethodDef_RawFastCallKeywords(PyMethodDef *method, PyObject *self,
606 PyObject *const *args, Py_ssize_t nargs,
607 PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100608{
609 /* _PyMethodDef_RawFastCallKeywords() must not be called with an exception set,
610 because it can clear it (directly or indirectly) and so the
611 caller loses its exception */
612 assert(!PyErr_Occurred());
613
614 assert(method != NULL);
615 assert(nargs >= 0);
616 assert(kwnames == NULL || PyTuple_CheckExact(kwnames));
617 /* kwnames must only contains str strings, no subclass, and all keys must
618 be unique */
619
620 PyCFunction meth = method->ml_meth;
621 int flags = method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST);
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300622 Py_ssize_t nkwargs = kwnames == NULL ? 0 : PyTuple_GET_SIZE(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100623 PyObject *result = NULL;
624
625 if (Py_EnterRecursiveCall(" while calling a Python object")) {
626 return NULL;
627 }
628
629 switch (flags)
630 {
631 case METH_NOARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300632 if (nkwargs) {
633 goto no_keyword_error;
634 }
635
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100636 if (nargs != 0) {
637 PyErr_Format(PyExc_TypeError,
638 "%.200s() takes no arguments (%zd given)",
639 method->ml_name, nargs);
640 goto exit;
641 }
642
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100643 result = (*meth) (self, NULL);
644 break;
645
646 case METH_O:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300647 if (nkwargs) {
648 goto no_keyword_error;
649 }
650
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100651 if (nargs != 1) {
652 PyErr_Format(PyExc_TypeError,
653 "%.200s() takes exactly one argument (%zd given)",
654 method->ml_name, nargs);
655 goto exit;
656 }
657
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100658 result = (*meth) (self, args[0]);
659 break;
660
661 case METH_FASTCALL:
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300662 if (nkwargs) {
663 goto no_keyword_error;
664 }
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200665 result = ((_PyCFunctionFast)(void(*)(void))meth) (self, args, nargs);
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300666 break;
667
668 case METH_FASTCALL | METH_KEYWORDS:
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100669 /* Fast-path: avoid temporary dict to pass keyword arguments */
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200670 result = ((_PyCFunctionFastWithKeywords)(void(*)(void))meth) (self, args, nargs, kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100671 break;
672
673 case METH_VARARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300674 if (nkwargs) {
675 goto no_keyword_error;
676 }
Stefan Krahf432a322017-08-21 13:09:59 +0200677 /* fall through */
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300678
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100679 case METH_VARARGS | METH_KEYWORDS:
680 {
681 /* Slow-path: create a temporary tuple for positional arguments
682 and a temporary dict for keyword arguments */
683 PyObject *argtuple;
684
Sergey Fedoseevf1b9abe2019-02-26 02:37:26 +0500685 argtuple = _PyTuple_FromArray(args, nargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100686 if (argtuple == NULL) {
687 goto exit;
688 }
689
690 if (flags & METH_KEYWORDS) {
691 PyObject *kwdict;
692
693 if (nkwargs > 0) {
694 kwdict = _PyStack_AsDict(args + nargs, kwnames);
695 if (kwdict == NULL) {
696 Py_DECREF(argtuple);
697 goto exit;
698 }
699 }
700 else {
701 kwdict = NULL;
702 }
703
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200704 result = (*(PyCFunctionWithKeywords)(void(*)(void))meth) (self, argtuple, kwdict);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100705 Py_XDECREF(kwdict);
706 }
707 else {
708 result = (*meth) (self, argtuple);
709 }
710 Py_DECREF(argtuple);
711 break;
712 }
713
714 default:
715 PyErr_SetString(PyExc_SystemError,
Jeroen Demeyera8b46942019-05-17 12:21:35 +0200716 "Bad call flags in _PyMethodDef_RawFastCallKeywords. "
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100717 "METH_OLDARGS is no longer supported!");
718 goto exit;
719 }
720
721 goto exit;
722
723no_keyword_error:
724 PyErr_Format(PyExc_TypeError,
725 "%.200s() takes no keyword arguments",
726 method->ml_name);
727
728exit:
729 Py_LeaveRecursiveCall();
730 return result;
731}
732
733
734PyObject *
Jeroen Demeyer37788bc2019-05-30 15:11:22 +0200735_PyCFunction_Vectorcall(PyObject *func,
736 PyObject *const *args, size_t nargsf,
737 PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100738{
739 PyObject *result;
740
741 assert(func != NULL);
742 assert(PyCFunction_Check(func));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200743 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100744
745 result = _PyMethodDef_RawFastCallKeywords(((PyCFunctionObject*)func)->m_ml,
746 PyCFunction_GET_SELF(func),
747 args, nargs, kwnames);
748 result = _Py_CheckFunctionResult(func, result, NULL);
749 return result;
750}
751
752
753static PyObject *
754cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs)
755{
756 assert(!PyErr_Occurred());
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300757 assert(kwargs == NULL || PyDict_Check(kwargs));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100758
759 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
760 PyObject *self = PyCFunction_GET_SELF(func);
761 PyObject *result;
762
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200763 assert(PyCFunction_GET_FLAGS(func) & METH_VARARGS);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100764 if (PyCFunction_GET_FLAGS(func) & METH_KEYWORDS) {
765 if (Py_EnterRecursiveCall(" while calling a Python object")) {
766 return NULL;
767 }
768
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200769 result = (*(PyCFunctionWithKeywords)(void(*)(void))meth)(self, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100770
771 Py_LeaveRecursiveCall();
772 }
773 else {
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300774 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100775 PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
776 ((PyCFunctionObject*)func)->m_ml->ml_name);
777 return NULL;
778 }
779
780 if (Py_EnterRecursiveCall(" while calling a Python object")) {
781 return NULL;
782 }
783
784 result = (*meth)(self, args);
785
786 Py_LeaveRecursiveCall();
787 }
788
789 return _Py_CheckFunctionResult(func, result, NULL);
790}
791
792
793PyObject *
794PyCFunction_Call(PyObject *func, PyObject *args, PyObject *kwargs)
795{
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200796 /* For METH_VARARGS, we cannot use vectorcall as the vectorcall pointer
797 * is NULL. This is intentional, since vectorcall would be slower. */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100798 if (PyCFunction_GET_FLAGS(func) & METH_VARARGS) {
799 return cfunction_call_varargs(func, args, kwargs);
800 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200801 return PyVectorcall_Call(func, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100802}
803
804
805/* --- More complex call functions -------------------------------- */
806
807/* External interface to call any callable object.
808 The args must be a tuple or NULL. The kwargs must be a dict or NULL. */
809PyObject *
810PyEval_CallObjectWithKeywords(PyObject *callable,
811 PyObject *args, PyObject *kwargs)
812{
813#ifdef Py_DEBUG
814 /* PyEval_CallObjectWithKeywords() must not be called with an exception
815 set. It raises a new exception if parameters are invalid or if
816 PyTuple_New() fails, and so the original exception is lost. */
817 assert(!PyErr_Occurred());
818#endif
819
INADA Naoki3824cd82017-03-01 20:41:03 +0900820 if (args != NULL && !PyTuple_Check(args)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100821 PyErr_SetString(PyExc_TypeError,
822 "argument list must be a tuple");
823 return NULL;
824 }
825
826 if (kwargs != NULL && !PyDict_Check(kwargs)) {
827 PyErr_SetString(PyExc_TypeError,
828 "keyword list must be a dictionary");
829 return NULL;
830 }
831
INADA Naoki3824cd82017-03-01 20:41:03 +0900832 if (args == NULL) {
833 return _PyObject_FastCallDict(callable, NULL, 0, kwargs);
834 }
835 else {
836 return PyObject_Call(callable, args, kwargs);
837 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100838}
839
840
841PyObject *
842PyObject_CallObject(PyObject *callable, PyObject *args)
843{
844 return PyEval_CallObjectWithKeywords(callable, args, NULL);
845}
846
847
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100848/* Call callable(obj, *args, **kwargs). */
849PyObject *
850_PyObject_Call_Prepend(PyObject *callable,
851 PyObject *obj, PyObject *args, PyObject *kwargs)
852{
853 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
854 PyObject **stack;
855 Py_ssize_t argcount;
856 PyObject *result;
857
858 assert(PyTuple_Check(args));
859
860 argcount = PyTuple_GET_SIZE(args);
861 if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
862 stack = small_stack;
863 }
864 else {
865 stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *));
866 if (stack == NULL) {
867 PyErr_NoMemory();
868 return NULL;
869 }
870 }
871
872 /* use borrowed references */
873 stack[0] = obj;
874 memcpy(&stack[1],
Victor Stinnerd17a6932018-11-09 16:56:48 +0100875 _PyTuple_ITEMS(args),
876 argcount * sizeof(PyObject *));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100877
878 result = _PyObject_FastCallDict(callable,
879 stack, argcount + 1,
880 kwargs);
881 if (stack != small_stack) {
882 PyMem_Free(stack);
883 }
884 return result;
885}
886
887
888/* --- Call with a format string ---------------------------------- */
889
890static PyObject *
891_PyObject_CallFunctionVa(PyObject *callable, const char *format,
892 va_list va, int is_size_t)
893{
894 PyObject* small_stack[_PY_FASTCALL_SMALL_STACK];
895 const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack);
896 PyObject **stack;
897 Py_ssize_t nargs, i;
898 PyObject *result;
899
900 if (callable == NULL) {
901 return null_error();
902 }
903
904 if (!format || !*format) {
905 return _PyObject_CallNoArg(callable);
906 }
907
908 if (is_size_t) {
909 stack = _Py_VaBuildStack_SizeT(small_stack, small_stack_len,
910 format, va, &nargs);
911 }
912 else {
913 stack = _Py_VaBuildStack(small_stack, small_stack_len,
914 format, va, &nargs);
915 }
916 if (stack == NULL) {
917 return NULL;
918 }
919
920 if (nargs == 1 && PyTuple_Check(stack[0])) {
921 /* Special cases for backward compatibility:
922 - PyObject_CallFunction(func, "O", tuple) calls func(*tuple)
923 - PyObject_CallFunction(func, "(OOO)", arg1, arg2, arg3) calls
924 func(*(arg1, arg2, arg3)): func(arg1, arg2, arg3) */
925 PyObject *args = stack[0];
926 result = _PyObject_FastCall(callable,
Victor Stinnerd17a6932018-11-09 16:56:48 +0100927 _PyTuple_ITEMS(args),
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100928 PyTuple_GET_SIZE(args));
929 }
930 else {
931 result = _PyObject_FastCall(callable, stack, nargs);
932 }
933
934 for (i = 0; i < nargs; ++i) {
935 Py_DECREF(stack[i]);
936 }
937 if (stack != small_stack) {
938 PyMem_Free(stack);
939 }
940 return result;
941}
942
943
944PyObject *
945PyObject_CallFunction(PyObject *callable, const char *format, ...)
946{
947 va_list va;
948 PyObject *result;
949
950 va_start(va, format);
951 result = _PyObject_CallFunctionVa(callable, format, va, 0);
952 va_end(va);
953
954 return result;
955}
956
957
INADA Naokiaa289a52017-03-14 18:00:59 +0900958/* PyEval_CallFunction is exact copy of PyObject_CallFunction.
959 * This function is kept for backward compatibility.
960 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100961PyObject *
962PyEval_CallFunction(PyObject *callable, const char *format, ...)
963{
INADA Naokiaa289a52017-03-14 18:00:59 +0900964 va_list va;
965 PyObject *result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100966
INADA Naokiaa289a52017-03-14 18:00:59 +0900967 va_start(va, format);
968 result = _PyObject_CallFunctionVa(callable, format, va, 0);
969 va_end(va);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100970
INADA Naokiaa289a52017-03-14 18:00:59 +0900971 return result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100972}
973
974
975PyObject *
976_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
977{
978 va_list va;
979 PyObject *result;
980
981 va_start(va, format);
982 result = _PyObject_CallFunctionVa(callable, format, va, 1);
983 va_end(va);
984
985 return result;
986}
987
988
989static PyObject*
990callmethod(PyObject* callable, const char *format, va_list va, int is_size_t)
991{
992 assert(callable != NULL);
993
994 if (!PyCallable_Check(callable)) {
995 PyErr_Format(PyExc_TypeError,
996 "attribute of type '%.200s' is not callable",
997 Py_TYPE(callable)->tp_name);
998 return NULL;
999 }
1000
1001 return _PyObject_CallFunctionVa(callable, format, va, is_size_t);
1002}
1003
1004
1005PyObject *
1006PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
1007{
1008 va_list va;
1009 PyObject *callable, *retval;
1010
1011 if (obj == NULL || name == NULL) {
1012 return null_error();
1013 }
1014
1015 callable = PyObject_GetAttrString(obj, name);
1016 if (callable == NULL)
1017 return NULL;
1018
1019 va_start(va, format);
1020 retval = callmethod(callable, format, va, 0);
1021 va_end(va);
1022
1023 Py_DECREF(callable);
1024 return retval;
1025}
1026
1027
INADA Naokiaa289a52017-03-14 18:00:59 +09001028/* PyEval_CallMethod is exact copy of PyObject_CallMethod.
1029 * This function is kept for backward compatibility.
1030 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001031PyObject *
1032PyEval_CallMethod(PyObject *obj, const char *name, const char *format, ...)
1033{
INADA Naokiaa289a52017-03-14 18:00:59 +09001034 va_list va;
1035 PyObject *callable, *retval;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001036
INADA Naokiaa289a52017-03-14 18:00:59 +09001037 if (obj == NULL || name == NULL) {
1038 return null_error();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001039 }
1040
INADA Naokiaa289a52017-03-14 18:00:59 +09001041 callable = PyObject_GetAttrString(obj, name);
1042 if (callable == NULL)
1043 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001044
INADA Naokiaa289a52017-03-14 18:00:59 +09001045 va_start(va, format);
1046 retval = callmethod(callable, format, va, 0);
1047 va_end(va);
1048
1049 Py_DECREF(callable);
1050 return retval;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001051}
1052
1053
1054PyObject *
1055_PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name,
1056 const char *format, ...)
1057{
1058 va_list va;
1059 PyObject *callable, *retval;
1060
1061 if (obj == NULL || name == NULL) {
1062 return null_error();
1063 }
1064
1065 callable = _PyObject_GetAttrId(obj, name);
1066 if (callable == NULL)
1067 return NULL;
1068
1069 va_start(va, format);
1070 retval = callmethod(callable, format, va, 0);
1071 va_end(va);
1072
1073 Py_DECREF(callable);
1074 return retval;
1075}
1076
1077
1078PyObject *
1079_PyObject_CallMethod_SizeT(PyObject *obj, const char *name,
1080 const char *format, ...)
1081{
1082 va_list va;
1083 PyObject *callable, *retval;
1084
1085 if (obj == NULL || name == NULL) {
1086 return null_error();
1087 }
1088
1089 callable = PyObject_GetAttrString(obj, name);
1090 if (callable == NULL)
1091 return NULL;
1092
1093 va_start(va, format);
1094 retval = callmethod(callable, format, va, 1);
1095 va_end(va);
1096
1097 Py_DECREF(callable);
1098 return retval;
1099}
1100
1101
1102PyObject *
1103_PyObject_CallMethodId_SizeT(PyObject *obj, _Py_Identifier *name,
1104 const char *format, ...)
1105{
1106 va_list va;
1107 PyObject *callable, *retval;
1108
1109 if (obj == NULL || name == NULL) {
1110 return null_error();
1111 }
1112
1113 callable = _PyObject_GetAttrId(obj, name);
1114 if (callable == NULL) {
1115 return NULL;
1116 }
1117
1118 va_start(va, format);
1119 retval = callmethod(callable, format, va, 1);
1120 va_end(va);
1121
1122 Py_DECREF(callable);
1123 return retval;
1124}
1125
1126
1127/* --- Call with "..." arguments ---------------------------------- */
1128
1129static PyObject *
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001130object_vacall(PyObject *base, PyObject *callable, va_list vargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001131{
1132 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
1133 PyObject **stack;
1134 Py_ssize_t nargs;
1135 PyObject *result;
1136 Py_ssize_t i;
1137 va_list countva;
1138
1139 if (callable == NULL) {
1140 return null_error();
1141 }
1142
1143 /* Count the number of arguments */
1144 va_copy(countva, vargs);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001145 nargs = base ? 1 : 0;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001146 while (1) {
1147 PyObject *arg = va_arg(countva, PyObject *);
1148 if (arg == NULL) {
1149 break;
1150 }
1151 nargs++;
1152 }
1153 va_end(countva);
1154
1155 /* Copy arguments */
1156 if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
1157 stack = small_stack;
1158 }
1159 else {
1160 stack = PyMem_Malloc(nargs * sizeof(stack[0]));
1161 if (stack == NULL) {
1162 PyErr_NoMemory();
1163 return NULL;
1164 }
1165 }
1166
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001167 i = 0;
1168 if (base) {
1169 stack[i++] = base;
1170 }
1171
1172 for (; i < nargs; ++i) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001173 stack[i] = va_arg(vargs, PyObject *);
1174 }
1175
1176 /* Call the function */
1177 result = _PyObject_FastCall(callable, stack, nargs);
1178
1179 if (stack != small_stack) {
1180 PyMem_Free(stack);
1181 }
1182 return result;
1183}
1184
1185
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001186PyObject *
1187PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)
1188{
1189 if (obj == NULL || name == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001190 return null_error();
1191 }
1192
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001193 PyObject *callable = NULL;
1194 int is_method = _PyObject_GetMethod(obj, name, &callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001195 if (callable == NULL) {
1196 return NULL;
1197 }
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001198 obj = is_method ? obj : NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001199
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001200 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001201 va_start(vargs, name);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001202 PyObject *result = object_vacall(obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001203 va_end(vargs);
1204
1205 Py_DECREF(callable);
1206 return result;
1207}
1208
1209
1210PyObject *
1211_PyObject_CallMethodIdObjArgs(PyObject *obj,
1212 struct _Py_Identifier *name, ...)
1213{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001214 if (obj == NULL || name == NULL) {
1215 return null_error();
1216 }
1217
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001218 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
1219 if (!oname) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001220 return NULL;
1221 }
1222
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001223 PyObject *callable = NULL;
1224 int is_method = _PyObject_GetMethod(obj, oname, &callable);
1225 if (callable == NULL) {
1226 return NULL;
1227 }
1228 obj = is_method ? obj : NULL;
1229
1230 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001231 va_start(vargs, name);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001232 PyObject *result = object_vacall(obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001233 va_end(vargs);
1234
1235 Py_DECREF(callable);
1236 return result;
1237}
1238
1239
1240PyObject *
1241PyObject_CallFunctionObjArgs(PyObject *callable, ...)
1242{
1243 va_list vargs;
1244 PyObject *result;
1245
1246 va_start(vargs, callable);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001247 result = object_vacall(NULL, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001248 va_end(vargs);
1249
1250 return result;
1251}
1252
1253
1254/* --- PyStack functions ------------------------------------------ */
1255
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001256PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001257_PyStack_AsDict(PyObject *const *values, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001258{
1259 Py_ssize_t nkwargs;
1260 PyObject *kwdict;
1261 Py_ssize_t i;
1262
1263 assert(kwnames != NULL);
1264 nkwargs = PyTuple_GET_SIZE(kwnames);
1265 kwdict = _PyDict_NewPresized(nkwargs);
1266 if (kwdict == NULL) {
1267 return NULL;
1268 }
1269
1270 for (i = 0; i < nkwargs; i++) {
1271 PyObject *key = PyTuple_GET_ITEM(kwnames, i);
1272 PyObject *value = *values++;
1273 /* If key already exists, replace it with the new value */
1274 if (PyDict_SetItem(kwdict, key, value)) {
1275 Py_DECREF(kwdict);
1276 return NULL;
1277 }
1278 }
1279 return kwdict;
1280}
1281
1282
1283int
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001284_PyStack_UnpackDict(PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs,
1285 PyObject *const **p_stack, PyObject **p_kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001286{
1287 PyObject **stack, **kwstack;
1288 Py_ssize_t nkwargs;
1289 Py_ssize_t pos, i;
1290 PyObject *key, *value;
1291 PyObject *kwnames;
1292
1293 assert(nargs >= 0);
1294 assert(kwargs == NULL || PyDict_CheckExact(kwargs));
1295
1296 if (kwargs == NULL || (nkwargs = PyDict_GET_SIZE(kwargs)) == 0) {
1297 *p_stack = args;
1298 *p_kwnames = NULL;
1299 return 0;
1300 }
1301
1302 if ((size_t)nargs > PY_SSIZE_T_MAX / sizeof(stack[0]) - (size_t)nkwargs) {
1303 PyErr_NoMemory();
1304 return -1;
1305 }
1306
1307 stack = PyMem_Malloc((nargs + nkwargs) * sizeof(stack[0]));
1308 if (stack == NULL) {
1309 PyErr_NoMemory();
1310 return -1;
1311 }
1312
1313 kwnames = PyTuple_New(nkwargs);
1314 if (kwnames == NULL) {
1315 PyMem_Free(stack);
1316 return -1;
1317 }
1318
Jeroen Demeyer77aa3962019-05-22 13:09:35 +02001319 /* Copy positional arguments */
1320 for (i = 0; i < nargs; i++) {
1321 Py_INCREF(args[i]);
1322 stack[i] = args[i];
1323 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001324
1325 kwstack = stack + nargs;
1326 pos = i = 0;
1327 /* This loop doesn't support lookup function mutating the dictionary
1328 to change its size. It's a deliberate choice for speed, this function is
1329 called in the performance critical hot code. */
1330 while (PyDict_Next(kwargs, &pos, &key, &value)) {
1331 Py_INCREF(key);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +02001332 Py_INCREF(value);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001333 PyTuple_SET_ITEM(kwnames, i, key);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001334 kwstack[i] = value;
1335 i++;
1336 }
1337
1338 *p_stack = stack;
1339 *p_kwnames = kwnames;
1340 return 0;
1341}