blob: acd1f26dcbb576fcdb6c1e874bc12fb17d8c3f56 [file] [log] [blame]
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001#include "Python.h"
Victor Stinnerbcda8f12018-11-21 22:27:47 +01002#include "pycore_object.h"
Victor Stinner621cebe2018-11-12 16:53:38 +01003#include "pycore_pystate.h"
Victor Stinnerec13b932018-11-25 23:56:17 +01004#include "pycore_tupleobject.h"
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01005#include "frameobject.h"
6
7
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02008static PyObject *
9cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs);
10
11
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010012static PyObject *
13null_error(void)
14{
15 if (!PyErr_Occurred())
16 PyErr_SetString(PyExc_SystemError,
17 "null argument to internal routine");
18 return NULL;
19}
20
21
22PyObject*
23_Py_CheckFunctionResult(PyObject *callable, PyObject *result, const char *where)
24{
25 int err_occurred = (PyErr_Occurred() != NULL);
26
27 assert((callable != NULL) ^ (where != NULL));
28
29 if (result == NULL) {
30 if (!err_occurred) {
31 if (callable)
32 PyErr_Format(PyExc_SystemError,
33 "%R returned NULL without setting an error",
34 callable);
35 else
36 PyErr_Format(PyExc_SystemError,
37 "%s returned NULL without setting an error",
38 where);
39#ifdef Py_DEBUG
40 /* Ensure that the bug is caught in debug mode */
41 Py_FatalError("a function returned NULL without setting an error");
42#endif
43 return NULL;
44 }
45 }
46 else {
47 if (err_occurred) {
48 Py_DECREF(result);
49
50 if (callable) {
51 _PyErr_FormatFromCause(PyExc_SystemError,
52 "%R returned a result with an error set",
53 callable);
54 }
55 else {
56 _PyErr_FormatFromCause(PyExc_SystemError,
57 "%s returned a result with an error set",
58 where);
59 }
60#ifdef Py_DEBUG
61 /* Ensure that the bug is caught in debug mode */
62 Py_FatalError("a function returned a result with an error set");
63#endif
64 return NULL;
65 }
66 }
67 return result;
68}
69
70
71/* --- Core PyObject call functions ------------------------------- */
72
73PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020074_PyObject_FastCallDict(PyObject *callable, PyObject *const *args,
75 size_t nargsf, PyObject *kwargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010076{
77 /* _PyObject_FastCallDict() must not be called with an exception set,
78 because it can clear it (directly or indirectly) and so the
79 caller loses its exception */
80 assert(!PyErr_Occurred());
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010081 assert(callable != NULL);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020082
83 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010084 assert(nargs >= 0);
85 assert(nargs == 0 || args != NULL);
86 assert(kwargs == NULL || PyDict_Check(kwargs));
87
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020088 vectorcallfunc func = _PyVectorcall_Function(callable);
89 if (func == NULL) {
90 /* Use tp_call instead */
91 return _PyObject_MakeTpCall(callable, args, nargs, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010092 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020093
94 PyObject *res;
95 if (kwargs == NULL) {
96 res = func(callable, args, nargsf, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +010097 }
98 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +020099 PyObject *kwnames;
100 PyObject *const *newargs;
101 if (_PyStack_UnpackDict(args, nargs, kwargs, &newargs, &kwnames) < 0) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100102 return NULL;
103 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200104 res = func(callable, newargs, nargs, kwnames);
105 if (kwnames != NULL) {
106 Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames) + nargs;
107 for (i = 0; i < n; i++) {
108 Py_DECREF(newargs[i]);
109 }
110 PyMem_Free((PyObject **)newargs);
111 Py_DECREF(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100112 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100113 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200114 return _Py_CheckFunctionResult(callable, res, NULL);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100115}
116
117
118PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200119_PyObject_MakeTpCall(PyObject *callable, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100120{
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200121 /* Slow path: build a temporary tuple for positional arguments and a
122 * temporary dictionary for keyword arguments (if any) */
123 ternaryfunc call = Py_TYPE(callable)->tp_call;
124 if (call == NULL) {
125 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
126 Py_TYPE(callable)->tp_name);
127 return NULL;
128 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100129
130 assert(nargs >= 0);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200131 assert(nargs == 0 || args != NULL);
132 assert(keywords == NULL || PyTuple_Check(keywords) || PyDict_Check(keywords));
133 PyObject *argstuple = _PyTuple_FromArray(args, nargs);
134 if (argstuple == NULL) {
135 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100136 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200137
138 PyObject *kwdict;
139 if (keywords == NULL || PyDict_Check(keywords)) {
140 kwdict = keywords;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100141 }
142 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200143 if (PyTuple_GET_SIZE(keywords)) {
144 assert(args != NULL);
145 kwdict = _PyStack_AsDict(args + nargs, keywords);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100146 if (kwdict == NULL) {
147 Py_DECREF(argstuple);
148 return NULL;
149 }
150 }
151 else {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200152 keywords = kwdict = NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100153 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100154 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200155
156 PyObject *result = NULL;
157 if (Py_EnterRecursiveCall(" while calling a Python object") == 0)
158 {
159 result = call(callable, argstuple, kwdict);
160 Py_LeaveRecursiveCall();
161 }
162
163 Py_DECREF(argstuple);
164 if (kwdict != keywords) {
165 Py_DECREF(kwdict);
166 }
167
168 result = _Py_CheckFunctionResult(callable, result, NULL);
169 return result;
170}
171
172
173PyObject *
174PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs)
175{
176 vectorcallfunc func = _PyVectorcall_Function(callable);
177 if (func == NULL) {
178 PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall",
179 Py_TYPE(callable)->tp_name);
180 return NULL;
181 }
182 PyObject *const *args;
183 Py_ssize_t nargs = PyTuple_GET_SIZE(tuple);
184 PyObject *kwnames;
185 if (_PyStack_UnpackDict(_PyTuple_ITEMS(tuple), nargs,
186 kwargs, &args, &kwnames) < 0) {
187 return NULL;
188 }
189 PyObject *result = func(callable, args, nargs, kwnames);
190 if (kwnames != NULL) {
191 Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames) + nargs;
192 for (i = 0; i < n; i++) {
193 Py_DECREF(args[i]);
194 }
195 PyMem_Free((PyObject **)args);
196 Py_DECREF(kwnames);
197 }
198
199 return result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100200}
201
202
203PyObject *
204PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
205{
206 ternaryfunc call;
207 PyObject *result;
208
209 /* PyObject_Call() must not be called with an exception set,
210 because it can clear it (directly or indirectly) and so the
211 caller loses its exception */
212 assert(!PyErr_Occurred());
213 assert(PyTuple_Check(args));
214 assert(kwargs == NULL || PyDict_Check(kwargs));
215
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200216 if (_PyVectorcall_Function(callable) != NULL) {
217 return PyVectorcall_Call(callable, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100218 }
219 else if (PyCFunction_Check(callable)) {
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200220 /* This must be a METH_VARARGS function, otherwise we would be
221 * in the previous case */
222 return cfunction_call_varargs(callable, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100223 }
224 else {
225 call = callable->ob_type->tp_call;
226 if (call == NULL) {
227 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
228 callable->ob_type->tp_name);
229 return NULL;
230 }
231
232 if (Py_EnterRecursiveCall(" while calling a Python object"))
233 return NULL;
234
235 result = (*call)(callable, args, kwargs);
236
237 Py_LeaveRecursiveCall();
238
239 return _Py_CheckFunctionResult(callable, result, NULL);
240 }
241}
242
243
244/* --- PyFunction call functions ---------------------------------- */
245
246static PyObject* _Py_HOT_FUNCTION
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200247function_code_fastcall(PyCodeObject *co, PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100248 PyObject *globals)
249{
250 PyFrameObject *f;
Victor Stinner50b48572018-11-01 01:51:40 +0100251 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100252 PyObject **fastlocals;
253 Py_ssize_t i;
254 PyObject *result;
255
256 assert(globals != NULL);
257 /* XXX Perhaps we should create a specialized
258 _PyFrame_New_NoTrack() that doesn't take locals, but does
259 take builtins without sanity checking them.
260 */
261 assert(tstate != NULL);
262 f = _PyFrame_New_NoTrack(tstate, co, globals, NULL);
263 if (f == NULL) {
264 return NULL;
265 }
266
267 fastlocals = f->f_localsplus;
268
269 for (i = 0; i < nargs; i++) {
270 Py_INCREF(*args);
271 fastlocals[i] = *args++;
272 }
273 result = PyEval_EvalFrameEx(f,0);
274
275 if (Py_REFCNT(f) > 1) {
276 Py_DECREF(f);
277 _PyObject_GC_TRACK(f);
278 }
279 else {
280 ++tstate->recursion_depth;
281 Py_DECREF(f);
282 --tstate->recursion_depth;
283 }
284 return result;
285}
286
287
288PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200289_PyFunction_FastCallDict(PyObject *func, PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100290 PyObject *kwargs)
291{
292 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
293 PyObject *globals = PyFunction_GET_GLOBALS(func);
294 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
295 PyObject *kwdefs, *closure, *name, *qualname;
296 PyObject *kwtuple, **k;
297 PyObject **d;
298 Py_ssize_t nd, nk;
299 PyObject *result;
300
301 assert(func != NULL);
302 assert(nargs >= 0);
303 assert(nargs == 0 || args != NULL);
304 assert(kwargs == NULL || PyDict_Check(kwargs));
305
306 if (co->co_kwonlyargcount == 0 &&
307 (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) &&
Victor Stinner086c3ae2017-10-25 05:26:17 -0700308 (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100309 {
310 /* Fast paths */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100311 if (argdefs == NULL && co->co_argcount + co->co_posonlyargcount == nargs) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100312 return function_code_fastcall(co, args, nargs, globals);
313 }
314 else if (nargs == 0 && argdefs != NULL
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100315 && co->co_argcount + co->co_posonlyargcount == PyTuple_GET_SIZE(argdefs)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100316 /* function called with no arguments, but all parameters have
317 a default value: use default values as arguments .*/
Victor Stinnerd17a6932018-11-09 16:56:48 +0100318 args = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200319 return function_code_fastcall(co, args, PyTuple_GET_SIZE(argdefs),
320 globals);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100321 }
322 }
323
324 nk = (kwargs != NULL) ? PyDict_GET_SIZE(kwargs) : 0;
325 if (nk != 0) {
326 Py_ssize_t pos, i;
327
Victor Stinner561ca802017-02-23 18:26:43 +0100328 /* bpo-29318, bpo-27840: Caller and callee functions must not share
329 the dictionary: kwargs must be copied. */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100330 kwtuple = PyTuple_New(2 * nk);
331 if (kwtuple == NULL) {
332 return NULL;
333 }
334
Victor Stinnerd17a6932018-11-09 16:56:48 +0100335 k = _PyTuple_ITEMS(kwtuple);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100336 pos = i = 0;
337 while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) {
338 /* We must hold strong references because keyword arguments can be
339 indirectly modified while the function is called:
340 see issue #2016 and test_extcall */
341 Py_INCREF(k[i]);
342 Py_INCREF(k[i+1]);
343 i += 2;
344 }
Eric Lippert5a95ba22018-10-22 08:52:46 -0700345 assert(i / 2 == nk);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100346 }
347 else {
348 kwtuple = NULL;
349 k = NULL;
350 }
351
352 kwdefs = PyFunction_GET_KW_DEFAULTS(func);
353 closure = PyFunction_GET_CLOSURE(func);
354 name = ((PyFunctionObject *)func) -> func_name;
355 qualname = ((PyFunctionObject *)func) -> func_qualname;
356
357 if (argdefs != NULL) {
Victor Stinnerd17a6932018-11-09 16:56:48 +0100358 d = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200359 nd = PyTuple_GET_SIZE(argdefs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100360 }
361 else {
362 d = NULL;
363 nd = 0;
364 }
365
366 result = _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL,
367 args, nargs,
Zackery Spytzc6ea8972017-07-31 08:24:37 -0600368 k, k != NULL ? k + 1 : NULL, nk, 2,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100369 d, nd, kwdefs,
370 closure, name, qualname);
371 Py_XDECREF(kwtuple);
372 return result;
373}
374
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200375
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100376PyObject *
Jeroen Demeyer37788bc2019-05-30 15:11:22 +0200377_PyFunction_Vectorcall(PyObject *func, PyObject* const* stack,
378 size_t nargsf, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100379{
380 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
381 PyObject *globals = PyFunction_GET_GLOBALS(func);
382 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
383 PyObject *kwdefs, *closure, *name, *qualname;
384 PyObject **d;
385 Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
386 Py_ssize_t nd;
387
388 assert(PyFunction_Check(func));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200389 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100390 assert(nargs >= 0);
391 assert(kwnames == NULL || PyTuple_CheckExact(kwnames));
392 assert((nargs == 0 && nkwargs == 0) || stack != NULL);
393 /* kwnames must only contains str strings, no subclass, and all keys must
394 be unique */
395
396 if (co->co_kwonlyargcount == 0 && nkwargs == 0 &&
Victor Stinner086c3ae2017-10-25 05:26:17 -0700397 (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE))
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100398 {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100399 if (argdefs == NULL && co->co_argcount + co->co_posonlyargcount== nargs) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100400 return function_code_fastcall(co, stack, nargs, globals);
401 }
402 else if (nargs == 0 && argdefs != NULL
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100403 && co->co_argcount + co->co_posonlyargcount == PyTuple_GET_SIZE(argdefs)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100404 /* function called with no arguments, but all parameters have
405 a default value: use default values as arguments .*/
Victor Stinnerd17a6932018-11-09 16:56:48 +0100406 stack = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200407 return function_code_fastcall(co, stack, PyTuple_GET_SIZE(argdefs),
408 globals);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100409 }
410 }
411
412 kwdefs = PyFunction_GET_KW_DEFAULTS(func);
413 closure = PyFunction_GET_CLOSURE(func);
414 name = ((PyFunctionObject *)func) -> func_name;
415 qualname = ((PyFunctionObject *)func) -> func_qualname;
416
417 if (argdefs != NULL) {
Victor Stinnerd17a6932018-11-09 16:56:48 +0100418 d = _PyTuple_ITEMS(argdefs);
Serhiy Storchakafff9a312017-03-21 08:53:25 +0200419 nd = PyTuple_GET_SIZE(argdefs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100420 }
421 else {
422 d = NULL;
423 nd = 0;
424 }
425 return _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL,
426 stack, nargs,
Victor Stinnerd17a6932018-11-09 16:56:48 +0100427 nkwargs ? _PyTuple_ITEMS(kwnames) : NULL,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100428 stack + nargs,
429 nkwargs, 1,
430 d, (int)nd, kwdefs,
431 closure, name, qualname);
432}
433
434
435/* --- PyCFunction call functions --------------------------------- */
436
437PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200438_PyMethodDef_RawFastCallDict(PyMethodDef *method, PyObject *self,
439 PyObject *const *args, Py_ssize_t nargs,
440 PyObject *kwargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100441{
442 /* _PyMethodDef_RawFastCallDict() must not be called with an exception set,
443 because it can clear it (directly or indirectly) and so the
444 caller loses its exception */
445 assert(!PyErr_Occurred());
446
447 assert(method != NULL);
448 assert(nargs >= 0);
449 assert(nargs == 0 || args != NULL);
450 assert(kwargs == NULL || PyDict_Check(kwargs));
451
452 PyCFunction meth = method->ml_meth;
453 int flags = method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST);
454 PyObject *result = NULL;
455
456 if (Py_EnterRecursiveCall(" while calling a Python object")) {
457 return NULL;
458 }
459
460 switch (flags)
461 {
462 case METH_NOARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300463 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
464 goto no_keyword_error;
465 }
466
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100467 if (nargs != 0) {
468 PyErr_Format(PyExc_TypeError,
469 "%.200s() takes no arguments (%zd given)",
470 method->ml_name, nargs);
471 goto exit;
472 }
473
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100474 result = (*meth) (self, NULL);
475 break;
476
477 case METH_O:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300478 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
479 goto no_keyword_error;
480 }
481
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100482 if (nargs != 1) {
483 PyErr_Format(PyExc_TypeError,
484 "%.200s() takes exactly one argument (%zd given)",
485 method->ml_name, nargs);
486 goto exit;
487 }
488
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100489 result = (*meth) (self, args[0]);
490 break;
491
492 case METH_VARARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300493 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100494 goto no_keyword_error;
495 }
Stefan Krahf432a322017-08-21 13:09:59 +0200496 /* fall through */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100497
498 case METH_VARARGS | METH_KEYWORDS:
499 {
500 /* Slow-path: create a temporary tuple for positional arguments */
Sergey Fedoseevf1b9abe2019-02-26 02:37:26 +0500501 PyObject *argstuple = _PyTuple_FromArray(args, nargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100502 if (argstuple == NULL) {
503 goto exit;
504 }
505
506 if (flags & METH_KEYWORDS) {
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200507 result = (*(PyCFunctionWithKeywords)(void(*)(void))meth) (self, argstuple, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100508 }
509 else {
510 result = (*meth) (self, argstuple);
511 }
512 Py_DECREF(argstuple);
513 break;
514 }
515
516 case METH_FASTCALL:
517 {
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300518 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
519 goto no_keyword_error;
520 }
521
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200522 result = (*(_PyCFunctionFast)(void(*)(void))meth) (self, args, nargs);
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300523 break;
524 }
525
526 case METH_FASTCALL | METH_KEYWORDS:
527 {
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200528 PyObject *const *stack;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100529 PyObject *kwnames;
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200530 _PyCFunctionFastWithKeywords fastmeth = (_PyCFunctionFastWithKeywords)(void(*)(void))meth;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100531
532 if (_PyStack_UnpackDict(args, nargs, kwargs, &stack, &kwnames) < 0) {
533 goto exit;
534 }
535
536 result = (*fastmeth) (self, stack, nargs, kwnames);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200537 if (kwnames != NULL) {
538 Py_ssize_t i, n = nargs + PyTuple_GET_SIZE(kwnames);
539 for (i = 0; i < n; i++) {
540 Py_DECREF(stack[i]);
541 }
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200542 PyMem_Free((PyObject **)stack);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +0200543 Py_DECREF(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100544 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100545 break;
546 }
547
548 default:
549 PyErr_SetString(PyExc_SystemError,
550 "Bad call flags in _PyMethodDef_RawFastCallDict. "
551 "METH_OLDARGS is no longer supported!");
552 goto exit;
553 }
554
555 goto exit;
556
557no_keyword_error:
558 PyErr_Format(PyExc_TypeError,
559 "%.200s() takes no keyword arguments",
Sylvaind67a1032017-03-27 23:36:08 +0200560 method->ml_name);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100561
562exit:
563 Py_LeaveRecursiveCall();
564 return result;
565}
566
567
568PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200569_PyCFunction_FastCallDict(PyObject *func,
570 PyObject *const *args, Py_ssize_t nargs,
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100571 PyObject *kwargs)
572{
573 PyObject *result;
574
575 assert(func != NULL);
576 assert(PyCFunction_Check(func));
577
578 result = _PyMethodDef_RawFastCallDict(((PyCFunctionObject*)func)->m_ml,
579 PyCFunction_GET_SELF(func),
580 args, nargs, kwargs);
581 result = _Py_CheckFunctionResult(func, result, NULL);
582 return result;
583}
584
585
586PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200587_PyMethodDef_RawFastCallKeywords(PyMethodDef *method, PyObject *self,
588 PyObject *const *args, Py_ssize_t nargs,
589 PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100590{
591 /* _PyMethodDef_RawFastCallKeywords() must not be called with an exception set,
592 because it can clear it (directly or indirectly) and so the
593 caller loses its exception */
594 assert(!PyErr_Occurred());
595
596 assert(method != NULL);
597 assert(nargs >= 0);
598 assert(kwnames == NULL || PyTuple_CheckExact(kwnames));
599 /* kwnames must only contains str strings, no subclass, and all keys must
600 be unique */
601
602 PyCFunction meth = method->ml_meth;
603 int flags = method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST);
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300604 Py_ssize_t nkwargs = kwnames == NULL ? 0 : PyTuple_GET_SIZE(kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100605 PyObject *result = NULL;
606
607 if (Py_EnterRecursiveCall(" while calling a Python object")) {
608 return NULL;
609 }
610
611 switch (flags)
612 {
613 case METH_NOARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300614 if (nkwargs) {
615 goto no_keyword_error;
616 }
617
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100618 if (nargs != 0) {
619 PyErr_Format(PyExc_TypeError,
620 "%.200s() takes no arguments (%zd given)",
621 method->ml_name, nargs);
622 goto exit;
623 }
624
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100625 result = (*meth) (self, NULL);
626 break;
627
628 case METH_O:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300629 if (nkwargs) {
630 goto no_keyword_error;
631 }
632
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100633 if (nargs != 1) {
634 PyErr_Format(PyExc_TypeError,
635 "%.200s() takes exactly one argument (%zd given)",
636 method->ml_name, nargs);
637 goto exit;
638 }
639
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100640 result = (*meth) (self, args[0]);
641 break;
642
643 case METH_FASTCALL:
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300644 if (nkwargs) {
645 goto no_keyword_error;
646 }
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200647 result = ((_PyCFunctionFast)(void(*)(void))meth) (self, args, nargs);
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +0300648 break;
649
650 case METH_FASTCALL | METH_KEYWORDS:
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100651 /* Fast-path: avoid temporary dict to pass keyword arguments */
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200652 result = ((_PyCFunctionFastWithKeywords)(void(*)(void))meth) (self, args, nargs, kwnames);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100653 break;
654
655 case METH_VARARGS:
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300656 if (nkwargs) {
657 goto no_keyword_error;
658 }
Stefan Krahf432a322017-08-21 13:09:59 +0200659 /* fall through */
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300660
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100661 case METH_VARARGS | METH_KEYWORDS:
662 {
663 /* Slow-path: create a temporary tuple for positional arguments
664 and a temporary dict for keyword arguments */
665 PyObject *argtuple;
666
Sergey Fedoseevf1b9abe2019-02-26 02:37:26 +0500667 argtuple = _PyTuple_FromArray(args, nargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100668 if (argtuple == NULL) {
669 goto exit;
670 }
671
672 if (flags & METH_KEYWORDS) {
673 PyObject *kwdict;
674
675 if (nkwargs > 0) {
676 kwdict = _PyStack_AsDict(args + nargs, kwnames);
677 if (kwdict == NULL) {
678 Py_DECREF(argtuple);
679 goto exit;
680 }
681 }
682 else {
683 kwdict = NULL;
684 }
685
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200686 result = (*(PyCFunctionWithKeywords)(void(*)(void))meth) (self, argtuple, kwdict);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100687 Py_XDECREF(kwdict);
688 }
689 else {
690 result = (*meth) (self, argtuple);
691 }
692 Py_DECREF(argtuple);
693 break;
694 }
695
696 default:
697 PyErr_SetString(PyExc_SystemError,
Jeroen Demeyera8b46942019-05-17 12:21:35 +0200698 "Bad call flags in _PyMethodDef_RawFastCallKeywords. "
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100699 "METH_OLDARGS is no longer supported!");
700 goto exit;
701 }
702
703 goto exit;
704
705no_keyword_error:
706 PyErr_Format(PyExc_TypeError,
707 "%.200s() takes no keyword arguments",
708 method->ml_name);
709
710exit:
711 Py_LeaveRecursiveCall();
712 return result;
713}
714
715
716PyObject *
Jeroen Demeyer37788bc2019-05-30 15:11:22 +0200717_PyCFunction_Vectorcall(PyObject *func,
718 PyObject *const *args, size_t nargsf,
719 PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100720{
721 PyObject *result;
722
723 assert(func != NULL);
724 assert(PyCFunction_Check(func));
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200725 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100726
727 result = _PyMethodDef_RawFastCallKeywords(((PyCFunctionObject*)func)->m_ml,
728 PyCFunction_GET_SELF(func),
729 args, nargs, kwnames);
730 result = _Py_CheckFunctionResult(func, result, NULL);
731 return result;
732}
733
734
735static PyObject *
736cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs)
737{
738 assert(!PyErr_Occurred());
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300739 assert(kwargs == NULL || PyDict_Check(kwargs));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100740
741 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
742 PyObject *self = PyCFunction_GET_SELF(func);
743 PyObject *result;
744
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200745 assert(PyCFunction_GET_FLAGS(func) & METH_VARARGS);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100746 if (PyCFunction_GET_FLAGS(func) & METH_KEYWORDS) {
747 if (Py_EnterRecursiveCall(" while calling a Python object")) {
748 return NULL;
749 }
750
Serhiy Storchaka62be7422018-11-27 13:27:31 +0200751 result = (*(PyCFunctionWithKeywords)(void(*)(void))meth)(self, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100752
753 Py_LeaveRecursiveCall();
754 }
755 else {
Serhiy Storchaka5eb788b2017-06-06 18:45:22 +0300756 if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100757 PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
758 ((PyCFunctionObject*)func)->m_ml->ml_name);
759 return NULL;
760 }
761
762 if (Py_EnterRecursiveCall(" while calling a Python object")) {
763 return NULL;
764 }
765
766 result = (*meth)(self, args);
767
768 Py_LeaveRecursiveCall();
769 }
770
771 return _Py_CheckFunctionResult(func, result, NULL);
772}
773
774
775PyObject *
776PyCFunction_Call(PyObject *func, PyObject *args, PyObject *kwargs)
777{
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200778 /* For METH_VARARGS, we cannot use vectorcall as the vectorcall pointer
779 * is NULL. This is intentional, since vectorcall would be slower. */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100780 if (PyCFunction_GET_FLAGS(func) & METH_VARARGS) {
781 return cfunction_call_varargs(func, args, kwargs);
782 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200783 return PyVectorcall_Call(func, args, kwargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100784}
785
786
787/* --- More complex call functions -------------------------------- */
788
789/* External interface to call any callable object.
790 The args must be a tuple or NULL. The kwargs must be a dict or NULL. */
791PyObject *
792PyEval_CallObjectWithKeywords(PyObject *callable,
793 PyObject *args, PyObject *kwargs)
794{
795#ifdef Py_DEBUG
796 /* PyEval_CallObjectWithKeywords() must not be called with an exception
797 set. It raises a new exception if parameters are invalid or if
798 PyTuple_New() fails, and so the original exception is lost. */
799 assert(!PyErr_Occurred());
800#endif
801
INADA Naoki3824cd82017-03-01 20:41:03 +0900802 if (args != NULL && !PyTuple_Check(args)) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100803 PyErr_SetString(PyExc_TypeError,
804 "argument list must be a tuple");
805 return NULL;
806 }
807
808 if (kwargs != NULL && !PyDict_Check(kwargs)) {
809 PyErr_SetString(PyExc_TypeError,
810 "keyword list must be a dictionary");
811 return NULL;
812 }
813
INADA Naoki3824cd82017-03-01 20:41:03 +0900814 if (args == NULL) {
815 return _PyObject_FastCallDict(callable, NULL, 0, kwargs);
816 }
817 else {
818 return PyObject_Call(callable, args, kwargs);
819 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100820}
821
822
823PyObject *
824PyObject_CallObject(PyObject *callable, PyObject *args)
825{
826 return PyEval_CallObjectWithKeywords(callable, args, NULL);
827}
828
829
830/* Positional arguments are obj followed by args:
831 call callable(obj, *args, **kwargs) */
832PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200833_PyObject_FastCall_Prepend(PyObject *callable, PyObject *obj,
834 PyObject *const *args, Py_ssize_t nargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100835{
836 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
837 PyObject **args2;
838 PyObject *result;
839
840 nargs++;
841 if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
842 args2 = small_stack;
843 }
844 else {
845 args2 = PyMem_Malloc(nargs * sizeof(PyObject *));
846 if (args2 == NULL) {
847 PyErr_NoMemory();
848 return NULL;
849 }
850 }
851
852 /* use borrowed references */
853 args2[0] = obj;
Benjamin Petersona3070d52017-09-04 22:23:42 -0700854 if (nargs > 1) {
855 memcpy(&args2[1], args, (nargs - 1) * sizeof(PyObject *));
856 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100857
858 result = _PyObject_FastCall(callable, args2, nargs);
859 if (args2 != small_stack) {
860 PyMem_Free(args2);
861 }
862 return result;
863}
864
865
866/* Call callable(obj, *args, **kwargs). */
867PyObject *
868_PyObject_Call_Prepend(PyObject *callable,
869 PyObject *obj, PyObject *args, PyObject *kwargs)
870{
871 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
872 PyObject **stack;
873 Py_ssize_t argcount;
874 PyObject *result;
875
876 assert(PyTuple_Check(args));
877
878 argcount = PyTuple_GET_SIZE(args);
879 if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
880 stack = small_stack;
881 }
882 else {
883 stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *));
884 if (stack == NULL) {
885 PyErr_NoMemory();
886 return NULL;
887 }
888 }
889
890 /* use borrowed references */
891 stack[0] = obj;
892 memcpy(&stack[1],
Victor Stinnerd17a6932018-11-09 16:56:48 +0100893 _PyTuple_ITEMS(args),
894 argcount * sizeof(PyObject *));
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100895
896 result = _PyObject_FastCallDict(callable,
897 stack, argcount + 1,
898 kwargs);
899 if (stack != small_stack) {
900 PyMem_Free(stack);
901 }
902 return result;
903}
904
905
906/* --- Call with a format string ---------------------------------- */
907
908static PyObject *
909_PyObject_CallFunctionVa(PyObject *callable, const char *format,
910 va_list va, int is_size_t)
911{
912 PyObject* small_stack[_PY_FASTCALL_SMALL_STACK];
913 const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack);
914 PyObject **stack;
915 Py_ssize_t nargs, i;
916 PyObject *result;
917
918 if (callable == NULL) {
919 return null_error();
920 }
921
922 if (!format || !*format) {
923 return _PyObject_CallNoArg(callable);
924 }
925
926 if (is_size_t) {
927 stack = _Py_VaBuildStack_SizeT(small_stack, small_stack_len,
928 format, va, &nargs);
929 }
930 else {
931 stack = _Py_VaBuildStack(small_stack, small_stack_len,
932 format, va, &nargs);
933 }
934 if (stack == NULL) {
935 return NULL;
936 }
937
938 if (nargs == 1 && PyTuple_Check(stack[0])) {
939 /* Special cases for backward compatibility:
940 - PyObject_CallFunction(func, "O", tuple) calls func(*tuple)
941 - PyObject_CallFunction(func, "(OOO)", arg1, arg2, arg3) calls
942 func(*(arg1, arg2, arg3)): func(arg1, arg2, arg3) */
943 PyObject *args = stack[0];
944 result = _PyObject_FastCall(callable,
Victor Stinnerd17a6932018-11-09 16:56:48 +0100945 _PyTuple_ITEMS(args),
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100946 PyTuple_GET_SIZE(args));
947 }
948 else {
949 result = _PyObject_FastCall(callable, stack, nargs);
950 }
951
952 for (i = 0; i < nargs; ++i) {
953 Py_DECREF(stack[i]);
954 }
955 if (stack != small_stack) {
956 PyMem_Free(stack);
957 }
958 return result;
959}
960
961
962PyObject *
963PyObject_CallFunction(PyObject *callable, const char *format, ...)
964{
965 va_list va;
966 PyObject *result;
967
968 va_start(va, format);
969 result = _PyObject_CallFunctionVa(callable, format, va, 0);
970 va_end(va);
971
972 return result;
973}
974
975
INADA Naokiaa289a52017-03-14 18:00:59 +0900976/* PyEval_CallFunction is exact copy of PyObject_CallFunction.
977 * This function is kept for backward compatibility.
978 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100979PyObject *
980PyEval_CallFunction(PyObject *callable, const char *format, ...)
981{
INADA Naokiaa289a52017-03-14 18:00:59 +0900982 va_list va;
983 PyObject *result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100984
INADA Naokiaa289a52017-03-14 18:00:59 +0900985 va_start(va, format);
986 result = _PyObject_CallFunctionVa(callable, format, va, 0);
987 va_end(va);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100988
INADA Naokiaa289a52017-03-14 18:00:59 +0900989 return result;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +0100990}
991
992
993PyObject *
994_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
995{
996 va_list va;
997 PyObject *result;
998
999 va_start(va, format);
1000 result = _PyObject_CallFunctionVa(callable, format, va, 1);
1001 va_end(va);
1002
1003 return result;
1004}
1005
1006
1007static PyObject*
1008callmethod(PyObject* callable, const char *format, va_list va, int is_size_t)
1009{
1010 assert(callable != NULL);
1011
1012 if (!PyCallable_Check(callable)) {
1013 PyErr_Format(PyExc_TypeError,
1014 "attribute of type '%.200s' is not callable",
1015 Py_TYPE(callable)->tp_name);
1016 return NULL;
1017 }
1018
1019 return _PyObject_CallFunctionVa(callable, format, va, is_size_t);
1020}
1021
1022
1023PyObject *
1024PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
1025{
1026 va_list va;
1027 PyObject *callable, *retval;
1028
1029 if (obj == NULL || name == NULL) {
1030 return null_error();
1031 }
1032
1033 callable = PyObject_GetAttrString(obj, name);
1034 if (callable == NULL)
1035 return NULL;
1036
1037 va_start(va, format);
1038 retval = callmethod(callable, format, va, 0);
1039 va_end(va);
1040
1041 Py_DECREF(callable);
1042 return retval;
1043}
1044
1045
INADA Naokiaa289a52017-03-14 18:00:59 +09001046/* PyEval_CallMethod is exact copy of PyObject_CallMethod.
1047 * This function is kept for backward compatibility.
1048 */
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001049PyObject *
1050PyEval_CallMethod(PyObject *obj, const char *name, const char *format, ...)
1051{
INADA Naokiaa289a52017-03-14 18:00:59 +09001052 va_list va;
1053 PyObject *callable, *retval;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001054
INADA Naokiaa289a52017-03-14 18:00:59 +09001055 if (obj == NULL || name == NULL) {
1056 return null_error();
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001057 }
1058
INADA Naokiaa289a52017-03-14 18:00:59 +09001059 callable = PyObject_GetAttrString(obj, name);
1060 if (callable == NULL)
1061 return NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001062
INADA Naokiaa289a52017-03-14 18:00:59 +09001063 va_start(va, format);
1064 retval = callmethod(callable, format, va, 0);
1065 va_end(va);
1066
1067 Py_DECREF(callable);
1068 return retval;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001069}
1070
1071
1072PyObject *
1073_PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name,
1074 const char *format, ...)
1075{
1076 va_list va;
1077 PyObject *callable, *retval;
1078
1079 if (obj == NULL || name == NULL) {
1080 return null_error();
1081 }
1082
1083 callable = _PyObject_GetAttrId(obj, name);
1084 if (callable == NULL)
1085 return NULL;
1086
1087 va_start(va, format);
1088 retval = callmethod(callable, format, va, 0);
1089 va_end(va);
1090
1091 Py_DECREF(callable);
1092 return retval;
1093}
1094
1095
1096PyObject *
1097_PyObject_CallMethod_SizeT(PyObject *obj, const char *name,
1098 const char *format, ...)
1099{
1100 va_list va;
1101 PyObject *callable, *retval;
1102
1103 if (obj == NULL || name == NULL) {
1104 return null_error();
1105 }
1106
1107 callable = PyObject_GetAttrString(obj, name);
1108 if (callable == NULL)
1109 return NULL;
1110
1111 va_start(va, format);
1112 retval = callmethod(callable, format, va, 1);
1113 va_end(va);
1114
1115 Py_DECREF(callable);
1116 return retval;
1117}
1118
1119
1120PyObject *
1121_PyObject_CallMethodId_SizeT(PyObject *obj, _Py_Identifier *name,
1122 const char *format, ...)
1123{
1124 va_list va;
1125 PyObject *callable, *retval;
1126
1127 if (obj == NULL || name == NULL) {
1128 return null_error();
1129 }
1130
1131 callable = _PyObject_GetAttrId(obj, name);
1132 if (callable == NULL) {
1133 return NULL;
1134 }
1135
1136 va_start(va, format);
1137 retval = callmethod(callable, format, va, 1);
1138 va_end(va);
1139
1140 Py_DECREF(callable);
1141 return retval;
1142}
1143
1144
1145/* --- Call with "..." arguments ---------------------------------- */
1146
1147static PyObject *
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001148object_vacall(PyObject *base, PyObject *callable, va_list vargs)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001149{
1150 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
1151 PyObject **stack;
1152 Py_ssize_t nargs;
1153 PyObject *result;
1154 Py_ssize_t i;
1155 va_list countva;
1156
1157 if (callable == NULL) {
1158 return null_error();
1159 }
1160
1161 /* Count the number of arguments */
1162 va_copy(countva, vargs);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001163 nargs = base ? 1 : 0;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001164 while (1) {
1165 PyObject *arg = va_arg(countva, PyObject *);
1166 if (arg == NULL) {
1167 break;
1168 }
1169 nargs++;
1170 }
1171 va_end(countva);
1172
1173 /* Copy arguments */
1174 if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
1175 stack = small_stack;
1176 }
1177 else {
1178 stack = PyMem_Malloc(nargs * sizeof(stack[0]));
1179 if (stack == NULL) {
1180 PyErr_NoMemory();
1181 return NULL;
1182 }
1183 }
1184
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001185 i = 0;
1186 if (base) {
1187 stack[i++] = base;
1188 }
1189
1190 for (; i < nargs; ++i) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001191 stack[i] = va_arg(vargs, PyObject *);
1192 }
1193
1194 /* Call the function */
1195 result = _PyObject_FastCall(callable, stack, nargs);
1196
1197 if (stack != small_stack) {
1198 PyMem_Free(stack);
1199 }
1200 return result;
1201}
1202
1203
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001204/* Private API for the LOAD_METHOD opcode. */
1205extern int _PyObject_GetMethod(PyObject *, PyObject *, PyObject **);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001206
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001207PyObject *
1208PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)
1209{
1210 if (obj == NULL || name == NULL) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001211 return null_error();
1212 }
1213
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001214 PyObject *callable = NULL;
1215 int is_method = _PyObject_GetMethod(obj, name, &callable);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001216 if (callable == NULL) {
1217 return NULL;
1218 }
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001219 obj = is_method ? obj : NULL;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001220
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001221 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001222 va_start(vargs, name);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001223 PyObject *result = object_vacall(obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001224 va_end(vargs);
1225
1226 Py_DECREF(callable);
1227 return result;
1228}
1229
1230
1231PyObject *
1232_PyObject_CallMethodIdObjArgs(PyObject *obj,
1233 struct _Py_Identifier *name, ...)
1234{
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001235 if (obj == NULL || name == NULL) {
1236 return null_error();
1237 }
1238
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001239 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
1240 if (!oname) {
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001241 return NULL;
1242 }
1243
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001244 PyObject *callable = NULL;
1245 int is_method = _PyObject_GetMethod(obj, oname, &callable);
1246 if (callable == NULL) {
1247 return NULL;
1248 }
1249 obj = is_method ? obj : NULL;
1250
1251 va_list vargs;
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001252 va_start(vargs, name);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001253 PyObject *result = object_vacall(obj, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001254 va_end(vargs);
1255
1256 Py_DECREF(callable);
1257 return result;
1258}
1259
1260
1261PyObject *
1262PyObject_CallFunctionObjArgs(PyObject *callable, ...)
1263{
1264 va_list vargs;
1265 PyObject *result;
1266
1267 va_start(vargs, callable);
Michael J. Sullivan47dd2f92019-05-26 00:23:34 -07001268 result = object_vacall(NULL, callable, vargs);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001269 va_end(vargs);
1270
1271 return result;
1272}
1273
1274
1275/* --- PyStack functions ------------------------------------------ */
1276
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001277PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001278_PyStack_AsDict(PyObject *const *values, PyObject *kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001279{
1280 Py_ssize_t nkwargs;
1281 PyObject *kwdict;
1282 Py_ssize_t i;
1283
1284 assert(kwnames != NULL);
1285 nkwargs = PyTuple_GET_SIZE(kwnames);
1286 kwdict = _PyDict_NewPresized(nkwargs);
1287 if (kwdict == NULL) {
1288 return NULL;
1289 }
1290
1291 for (i = 0; i < nkwargs; i++) {
1292 PyObject *key = PyTuple_GET_ITEM(kwnames, i);
1293 PyObject *value = *values++;
1294 /* If key already exists, replace it with the new value */
1295 if (PyDict_SetItem(kwdict, key, value)) {
1296 Py_DECREF(kwdict);
1297 return NULL;
1298 }
1299 }
1300 return kwdict;
1301}
1302
1303
1304int
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001305_PyStack_UnpackDict(PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs,
1306 PyObject *const **p_stack, PyObject **p_kwnames)
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001307{
1308 PyObject **stack, **kwstack;
1309 Py_ssize_t nkwargs;
1310 Py_ssize_t pos, i;
1311 PyObject *key, *value;
1312 PyObject *kwnames;
1313
1314 assert(nargs >= 0);
1315 assert(kwargs == NULL || PyDict_CheckExact(kwargs));
1316
1317 if (kwargs == NULL || (nkwargs = PyDict_GET_SIZE(kwargs)) == 0) {
1318 *p_stack = args;
1319 *p_kwnames = NULL;
1320 return 0;
1321 }
1322
1323 if ((size_t)nargs > PY_SSIZE_T_MAX / sizeof(stack[0]) - (size_t)nkwargs) {
1324 PyErr_NoMemory();
1325 return -1;
1326 }
1327
1328 stack = PyMem_Malloc((nargs + nkwargs) * sizeof(stack[0]));
1329 if (stack == NULL) {
1330 PyErr_NoMemory();
1331 return -1;
1332 }
1333
1334 kwnames = PyTuple_New(nkwargs);
1335 if (kwnames == NULL) {
1336 PyMem_Free(stack);
1337 return -1;
1338 }
1339
Jeroen Demeyer77aa3962019-05-22 13:09:35 +02001340 /* Copy positional arguments */
1341 for (i = 0; i < nargs; i++) {
1342 Py_INCREF(args[i]);
1343 stack[i] = args[i];
1344 }
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001345
1346 kwstack = stack + nargs;
1347 pos = i = 0;
1348 /* This loop doesn't support lookup function mutating the dictionary
1349 to change its size. It's a deliberate choice for speed, this function is
1350 called in the performance critical hot code. */
1351 while (PyDict_Next(kwargs, &pos, &key, &value)) {
1352 Py_INCREF(key);
Jeroen Demeyer77aa3962019-05-22 13:09:35 +02001353 Py_INCREF(value);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001354 PyTuple_SET_ITEM(kwnames, i, key);
Victor Stinnerc22bfaa2017-02-12 19:27:05 +01001355 kwstack[i] = value;
1356 i++;
1357 }
1358
1359 *p_stack = stack;
1360 *p_kwnames = kwnames;
1361 return 0;
1362}