Coverage Report

Created: 2026-06-01 06:14

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython3/Objects/call.c
Line
Count
Source
1
#include "Python.h"
2
#include "pycore_call.h"          // _PyObject_CallNoArgsTstate()
3
#include "pycore_ceval.h"         // _Py_EnterRecursiveCallTstate()
4
#include "pycore_dict.h"          // _PyDict_FromItems()
5
#include "pycore_function.h"      // _PyFunction_Vectorcall() definition
6
#include "pycore_modsupport.h"    // _Py_VaBuildStack()
7
#include "pycore_object.h"        // _PyCFunctionWithKeywords_TrampolineCall()
8
#include "pycore_pyerrors.h"      // _PyErr_Occurred()
9
#include "pycore_pystate.h"       // _PyThreadState_GET()
10
#include "pycore_tuple.h"         // _PyTuple_ITEMS()
11
12
13
static PyObject *
14
null_error(PyThreadState *tstate)
15
0
{
16
0
    if (!_PyErr_Occurred(tstate)) {
17
0
        _PyErr_SetString(tstate, PyExc_SystemError,
18
0
                         "null argument to internal routine");
19
0
    }
20
0
    return NULL;
21
0
}
22
23
24
PyObject*
25
_Py_CheckFunctionResult(PyThreadState *tstate, PyObject *callable,
26
                        PyObject *result, const char *where)
27
2.03M
{
28
2.03M
    assert((callable != NULL) ^ (where != NULL));
29
30
2.03M
    if (result == NULL) {
31
39.6k
        if (!_PyErr_Occurred(tstate)) {
32
0
            if (callable)
33
0
                _PyErr_Format(tstate, PyExc_SystemError,
34
0
                              "%R returned NULL without setting an exception",
35
0
                              callable);
36
0
            else
37
0
                _PyErr_Format(tstate, PyExc_SystemError,
38
0
                              "%s returned NULL without setting an exception",
39
0
                              where);
40
#ifdef Py_DEBUG
41
            /* Ensure that the bug is caught in debug mode.
42
               Py_FatalError() logs the SystemError exception raised above. */
43
            Py_FatalError("a function returned NULL without setting an exception");
44
#endif
45
0
            return NULL;
46
0
        }
47
39.6k
    }
48
1.99M
    else {
49
1.99M
        if (_PyErr_Occurred(tstate)) {
50
0
            Py_DECREF(result);
51
52
0
            if (callable) {
53
0
                _PyErr_FormatFromCauseTstate(
54
0
                    tstate, PyExc_SystemError,
55
0
                    "%R returned a result with an exception set", callable);
56
0
            }
57
0
            else {
58
0
                _PyErr_FormatFromCauseTstate(
59
0
                    tstate, PyExc_SystemError,
60
0
                    "%s returned a result with an exception set", where);
61
0
            }
62
#ifdef Py_DEBUG
63
            /* Ensure that the bug is caught in debug mode.
64
               Py_FatalError() logs the SystemError exception raised above. */
65
            Py_FatalError("a function returned a result with an exception set");
66
#endif
67
0
            return NULL;
68
0
        }
69
1.99M
    }
70
2.03M
    return result;
71
2.03M
}
72
73
74
int
75
_Py_CheckSlotResult(PyObject *obj, const char *slot_name, int success)
76
6.83M
{
77
6.83M
    PyThreadState *tstate = _PyThreadState_GET();
78
6.83M
    if (!success) {
79
8.39k
        if (!_PyErr_Occurred(tstate)) {
80
0
            _Py_FatalErrorFormat(__func__,
81
0
                                 "Slot %s of type %s failed "
82
0
                                 "without setting an exception",
83
0
                                 slot_name, Py_TYPE(obj)->tp_name);
84
0
        }
85
8.39k
    }
86
6.82M
    else {
87
6.82M
        if (_PyErr_Occurred(tstate)) {
88
0
            _Py_FatalErrorFormat(__func__,
89
0
                                 "Slot %s of type %s succeeded "
90
0
                                 "with an exception set",
91
0
                                 slot_name, Py_TYPE(obj)->tp_name);
92
0
        }
93
6.82M
    }
94
6.83M
    return 1;
95
6.83M
}
96
97
98
/* --- Core PyObject call functions ------------------------------- */
99
100
/* Call a callable Python object without any arguments */
101
PyObject *
102
PyObject_CallNoArgs(PyObject *func)
103
6
{
104
6
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func);
105
6
    PyThreadState *tstate = _PyThreadState_GET();
106
6
    return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL);
107
6
}
108
109
110
PyObject *
111
_PyObject_VectorcallDictTstate(PyThreadState *tstate, PyObject *callable,
112
                               PyObject *const *args, size_t nargsf,
113
                               PyObject *kwargs)
114
49.5k
{
115
49.5k
    assert(callable != NULL);
116
117
    /* PyObject_VectorcallDict() must not be called with an exception set,
118
       because it can clear it (directly or indirectly) and so the
119
       caller loses its exception */
120
49.5k
    assert(!_PyErr_Occurred(tstate));
121
122
49.5k
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
123
49.5k
    assert(nargs >= 0);
124
49.5k
    assert(nargs == 0 || args != NULL);
125
49.5k
    assert(kwargs == NULL || PyDict_Check(kwargs));
126
127
49.5k
    vectorcallfunc func = PyVectorcall_Function(callable);
128
49.5k
    if (func == NULL) {
129
        /* Use tp_call instead */
130
2.47k
        return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwargs);
131
2.47k
    }
132
133
47.1k
    PyObject *res;
134
47.1k
    if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
135
45.9k
        res = func(callable, args, nargsf, NULL);
136
45.9k
    }
137
1.20k
    else {
138
1.20k
        PyObject *kwnames;
139
1.20k
        PyObject *const *newargs;
140
1.20k
        newargs = _PyStack_UnpackDict(tstate,
141
1.20k
                                      args, nargs,
142
1.20k
                                      kwargs, &kwnames);
143
1.20k
        if (newargs == NULL) {
144
0
            return NULL;
145
0
        }
146
1.20k
        res = func(callable, newargs,
147
1.20k
                   nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
148
1.20k
        _PyStack_UnpackDict_Free(newargs, nargs, kwnames);
149
1.20k
    }
150
47.1k
    return _Py_CheckFunctionResult(tstate, callable, res, NULL);
151
47.1k
}
152
153
154
PyObject *
155
PyObject_VectorcallDict(PyObject *callable, PyObject *const *args,
156
                       size_t nargsf, PyObject *kwargs)
157
10.2k
{
158
10.2k
    PyThreadState *tstate = _PyThreadState_GET();
159
10.2k
    return _PyObject_VectorcallDictTstate(tstate, callable, args, nargsf, kwargs);
160
10.2k
}
161
162
static void
163
object_is_not_callable(PyThreadState *tstate, PyObject *callable)
164
0
{
165
0
    if (Py_IS_TYPE(callable, &PyModule_Type)) {
166
        // >>> import pprint
167
        // >>> pprint(thing)
168
        // Traceback (most recent call last):
169
        //   File "<stdin>", line 1, in <module>
170
        // TypeError: 'module' object is not callable. Did you mean: 'pprint.pprint(...)'?
171
0
        PyObject *name = PyModule_GetNameObject(callable);
172
0
        if (name == NULL) {
173
0
            _PyErr_Clear(tstate);
174
0
            goto basic_type_error;
175
0
        }
176
0
        PyObject *attr;
177
0
        int res = PyObject_GetOptionalAttr(callable, name, &attr);
178
0
        if (res < 0) {
179
0
            _PyErr_Clear(tstate);
180
0
        }
181
0
        else if (res > 0 && PyCallable_Check(attr)) {
182
0
            _PyErr_Format(tstate, PyExc_TypeError,
183
0
                          "'%.200s' object is not callable. "
184
0
                          "Did you mean: '%U.%U(...)'?",
185
0
                          Py_TYPE(callable)->tp_name, name, name);
186
0
            Py_DECREF(attr);
187
0
            Py_DECREF(name);
188
0
            return;
189
0
        }
190
0
        Py_XDECREF(attr);
191
0
        Py_DECREF(name);
192
0
    }
193
0
basic_type_error:
194
0
    _PyErr_Format(tstate, PyExc_TypeError, "'%.200s' object is not callable",
195
0
                  Py_TYPE(callable)->tp_name);
196
0
}
197
198
199
PyObject *
200
_PyObject_MakeTpCall(PyThreadState *tstate, PyObject *callable,
201
                     PyObject *const *args, Py_ssize_t nargs,
202
                     PyObject *keywords)
203
240k
{
204
240k
    assert(nargs >= 0);
205
240k
    assert(nargs == 0 || args != NULL);
206
240k
    assert(keywords == NULL || PyTuple_Check(keywords) || PyDict_Check(keywords));
207
208
    /* Slow path: build a temporary tuple for positional arguments and a
209
     * temporary dictionary for keyword arguments (if any) */
210
240k
    ternaryfunc call = Py_TYPE(callable)->tp_call;
211
240k
    if (call == NULL) {
212
0
        object_is_not_callable(tstate, callable);
213
0
        return NULL;
214
0
    }
215
216
240k
    PyObject *argstuple = PyTuple_FromArray(args, nargs);
217
240k
    if (argstuple == NULL) {
218
0
        return NULL;
219
0
    }
220
221
240k
    PyObject *kwdict;
222
240k
    if (keywords == NULL || PyDict_Check(keywords)) {
223
238k
        kwdict = keywords;
224
238k
    }
225
2.03k
    else {
226
2.03k
        if (PyTuple_GET_SIZE(keywords)) {
227
2.03k
            assert(args != NULL);
228
2.03k
            kwdict = _PyStack_AsDict(args + nargs, keywords);
229
2.03k
            if (kwdict == NULL) {
230
0
                Py_DECREF(argstuple);
231
0
                return NULL;
232
0
            }
233
2.03k
        }
234
0
        else {
235
0
            keywords = kwdict = NULL;
236
0
        }
237
2.03k
    }
238
239
240k
    PyObject *result = NULL;
240
240k
    if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object") == 0)
241
240k
    {
242
240k
        result = _PyCFunctionWithKeywords_TrampolineCall(
243
240k
            (PyCFunctionWithKeywords)call, callable, argstuple, kwdict);
244
240k
        _Py_LeaveRecursiveCallTstate(tstate);
245
240k
    }
246
247
240k
    Py_DECREF(argstuple);
248
240k
    if (kwdict != keywords) {
249
2.03k
        Py_DECREF(kwdict);
250
2.03k
    }
251
252
240k
    return _Py_CheckFunctionResult(tstate, callable, result, NULL);
253
240k
}
254
255
256
vectorcallfunc
257
PyVectorcall_Function(PyObject *callable)
258
75.3k
{
259
75.3k
    return _PyVectorcall_FunctionInline(callable);
260
75.3k
}
261
262
263
static PyObject *
264
_PyVectorcall_Call(PyThreadState *tstate, vectorcallfunc func,
265
                   PyObject *callable, PyObject *tuple, PyObject *kwargs)
266
11.2k
{
267
11.2k
    assert(func != NULL);
268
269
11.2k
    Py_ssize_t nargs = PyTuple_GET_SIZE(tuple);
270
271
    /* Fast path for no keywords */
272
11.2k
    if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
273
11.2k
        return func(callable, _PyTuple_ITEMS(tuple), nargs, NULL);
274
11.2k
    }
275
276
    /* Convert arguments & call */
277
0
    PyObject *const *args;
278
0
    PyObject *kwnames;
279
0
    args = _PyStack_UnpackDict(tstate,
280
0
                               _PyTuple_ITEMS(tuple), nargs,
281
0
                               kwargs, &kwnames);
282
0
    if (args == NULL) {
283
0
        return NULL;
284
0
    }
285
0
    PyObject *result = func(callable, args,
286
0
                            nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
287
0
    _PyStack_UnpackDict_Free(args, nargs, kwnames);
288
289
0
    return _Py_CheckFunctionResult(tstate, callable, result, NULL);
290
0
}
291
292
293
PyObject *
294
PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs)
295
0
{
296
0
    PyThreadState *tstate = _PyThreadState_GET();
297
298
    /* get vectorcallfunc as in _PyVectorcall_Function, but without
299
     * the Py_TPFLAGS_HAVE_VECTORCALL check */
300
0
    Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset;
301
0
    if (offset <= 0) {
302
0
        _PyErr_Format(tstate, PyExc_TypeError,
303
0
                      "'%.200s' object does not support vectorcall",
304
0
                      Py_TYPE(callable)->tp_name);
305
0
        return NULL;
306
0
    }
307
0
    assert(PyCallable_Check(callable));
308
309
0
    vectorcallfunc func;
310
0
    memcpy(&func, (char *) callable + offset, sizeof(func));
311
0
    if (func == NULL) {
312
0
        _PyErr_Format(tstate, PyExc_TypeError,
313
0
                      "'%.200s' object does not support vectorcall",
314
0
                      Py_TYPE(callable)->tp_name);
315
0
        return NULL;
316
0
    }
317
318
0
    return _PyVectorcall_Call(tstate, func, callable, tuple, kwargs);
319
0
}
320
321
322
PyObject *
323
PyObject_Vectorcall(PyObject *callable, PyObject *const *args,
324
                     size_t nargsf, PyObject *kwnames)
325
303k
{
326
303k
    PyThreadState *tstate = _PyThreadState_GET();
327
303k
    return _PyObject_VectorcallTstate(tstate, callable,
328
303k
                                      args, nargsf, kwnames);
329
303k
}
330
331
332
PyObject *
333
_PyObject_Call(PyThreadState *tstate, PyObject *callable,
334
               PyObject *args, PyObject *kwargs)
335
25.5k
{
336
25.5k
    ternaryfunc call;
337
25.5k
    PyObject *result;
338
339
    /* PyObject_Call() must not be called with an exception set,
340
       because it can clear it (directly or indirectly) and so the
341
       caller loses its exception */
342
25.5k
    assert(!_PyErr_Occurred(tstate));
343
25.5k
    assert(PyTuple_Check(args));
344
25.5k
    assert(kwargs == NULL || PyDict_Check(kwargs));
345
25.5k
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, callable);
346
25.5k
    vectorcallfunc vector_func = PyVectorcall_Function(callable);
347
25.5k
    if (vector_func != NULL) {
348
11.2k
        return _PyVectorcall_Call(tstate, vector_func, callable, args, kwargs);
349
11.2k
    }
350
14.3k
    else {
351
14.3k
        call = Py_TYPE(callable)->tp_call;
352
14.3k
        if (call == NULL) {
353
0
            object_is_not_callable(tstate, callable);
354
0
            return NULL;
355
0
        }
356
357
14.3k
        if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object")) {
358
0
            return NULL;
359
0
        }
360
361
14.3k
        result = (*call)(callable, args, kwargs);
362
363
14.3k
        _Py_LeaveRecursiveCallTstate(tstate);
364
365
14.3k
        return _Py_CheckFunctionResult(tstate, callable, result, NULL);
366
14.3k
    }
367
25.5k
}
368
369
PyObject *
370
PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
371
25.5k
{
372
25.5k
    PyThreadState *tstate = _PyThreadState_GET();
373
25.5k
    return _PyObject_Call(tstate, callable, args, kwargs);
374
25.5k
}
375
376
377
/* Function removed in the Python 3.13 API but kept in the stable ABI. */
378
PyAPI_FUNC(PyObject *)
379
PyCFunction_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
380
0
{
381
0
    return PyObject_Call(callable, args, kwargs);
382
0
}
383
384
385
PyObject *
386
PyObject_CallOneArg(PyObject *func, PyObject *arg)
387
572k
{
388
572k
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func);
389
572k
    assert(arg != NULL);
390
572k
    PyObject *_args[2];
391
572k
    PyObject **args = _args + 1;  // For PY_VECTORCALL_ARGUMENTS_OFFSET
392
572k
    args[0] = arg;
393
572k
    PyThreadState *tstate = _PyThreadState_GET();
394
572k
    size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET;
395
572k
    return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL);
396
572k
}
397
398
399
/* --- PyFunction call functions ---------------------------------- */
400
401
PyObject *
402
_PyFunction_Vectorcall(PyObject *func, PyObject* const* stack,
403
                       size_t nargsf, PyObject *kwnames)
404
110k
{
405
110k
    assert(PyFunction_Check(func));
406
110k
    PyFunctionObject *f = (PyFunctionObject *)func;
407
110k
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
408
110k
    assert(nargs >= 0);
409
110k
    PyThreadState *tstate = _PyThreadState_GET();
410
110k
    assert(nargs == 0 || stack != NULL);
411
110k
    EVAL_CALL_STAT_INC(EVAL_CALL_FUNCTION_VECTORCALL);
412
110k
    if (((PyCodeObject *)f->func_code)->co_flags & CO_OPTIMIZED) {
413
110k
        return _PyEval_Vector(tstate, f, NULL, stack, nargs, kwnames);
414
110k
    }
415
0
    else {
416
0
        return _PyEval_Vector(tstate, f, f->func_globals, stack, nargs, kwnames);
417
0
    }
418
110k
}
419
420
/* --- More complex call functions -------------------------------- */
421
422
/* External interface to call any callable object.
423
   The args must be a tuple or NULL.  The kwargs must be a dict or NULL.
424
   Function removed in Python 3.13 API but kept in the stable ABI. */
425
PyAPI_FUNC(PyObject*)
426
PyEval_CallObjectWithKeywords(PyObject *callable,
427
                              PyObject *args, PyObject *kwargs)
428
0
{
429
0
    PyThreadState *tstate = _PyThreadState_GET();
430
#ifdef Py_DEBUG
431
    /* PyEval_CallObjectWithKeywords() must not be called with an exception
432
       set. It raises a new exception if parameters are invalid or if
433
       PyTuple_New() fails, and so the original exception is lost. */
434
    assert(!_PyErr_Occurred(tstate));
435
#endif
436
437
0
    if (args != NULL && !PyTuple_Check(args)) {
438
0
        _PyErr_SetString(tstate, PyExc_TypeError,
439
0
                         "argument list must be a tuple");
440
0
        return NULL;
441
0
    }
442
443
0
    if (kwargs != NULL && !PyDict_Check(kwargs)) {
444
0
        _PyErr_SetString(tstate, PyExc_TypeError,
445
0
                         "keyword list must be a dictionary");
446
0
        return NULL;
447
0
    }
448
449
0
    if (args == NULL) {
450
0
        return _PyObject_VectorcallDictTstate(tstate, callable,
451
0
                                              NULL, 0, kwargs);
452
0
    }
453
0
    else {
454
0
        return _PyObject_Call(tstate, callable, args, kwargs);
455
0
    }
456
0
}
457
458
459
PyObject *
460
PyObject_CallObject(PyObject *callable, PyObject *args)
461
17.2k
{
462
17.2k
    PyThreadState *tstate = _PyThreadState_GET();
463
17.2k
    assert(!_PyErr_Occurred(tstate));
464
17.2k
    if (args == NULL) {
465
17.2k
        return _PyObject_CallNoArgsTstate(tstate, callable);
466
17.2k
    }
467
0
    if (!PyTuple_Check(args)) {
468
0
        _PyErr_SetString(tstate, PyExc_TypeError,
469
0
                         "argument list must be a tuple");
470
0
        return NULL;
471
0
    }
472
0
    return _PyObject_Call(tstate, callable, args, NULL);
473
0
}
474
475
476
/* Call callable(obj, *args, **kwargs). */
477
PyObject *
478
_PyObject_Call_Prepend(PyThreadState *tstate, PyObject *callable,
479
                       PyObject *obj, PyObject *args, PyObject *kwargs)
480
39.3k
{
481
39.3k
    assert(PyTuple_Check(args));
482
483
39.3k
    PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
484
39.3k
    PyObject **stack;
485
486
39.3k
    Py_ssize_t argcount = PyTuple_GET_SIZE(args);
487
39.3k
    if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
488
13.2k
        stack = small_stack;
489
13.2k
    }
490
26.1k
    else {
491
26.1k
        stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *));
492
26.1k
        if (stack == NULL) {
493
0
            PyErr_NoMemory();
494
0
            return NULL;
495
0
        }
496
26.1k
    }
497
498
    /* use borrowed references */
499
39.3k
    stack[0] = obj;
500
39.3k
    memcpy(&stack[1],
501
39.3k
           _PyTuple_ITEMS(args),
502
0
           argcount * sizeof(PyObject *));
503
504
0
    PyObject *result = _PyObject_VectorcallDictTstate(tstate, callable,
505
39.3k
                                                      stack, argcount + 1,
506
39.3k
                                                      kwargs);
507
39.3k
    if (stack != small_stack) {
508
26.1k
        PyMem_Free(stack);
509
26.1k
    }
510
39.3k
    return result;
511
39.3k
}
512
513
514
/* --- Call with a format string ---------------------------------- */
515
516
static PyObject *
517
_PyObject_CallFunctionVa(PyThreadState *tstate, PyObject *callable,
518
                         const char *format, va_list va)
519
153k
{
520
153k
    PyObject* small_stack[_PY_FASTCALL_SMALL_STACK];
521
153k
    const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack);
522
153k
    PyObject **stack;
523
153k
    Py_ssize_t nargs, i;
524
153k
    PyObject *result;
525
526
153k
    if (callable == NULL) {
527
0
        return null_error(tstate);
528
0
    }
529
530
153k
    if (!format || !*format) {
531
1.24k
        return _PyObject_CallNoArgsTstate(tstate, callable);
532
1.24k
    }
533
534
152k
    stack = _Py_VaBuildStack(small_stack, small_stack_len,
535
152k
                             format, va, &nargs);
536
152k
    if (stack == NULL) {
537
0
        return NULL;
538
0
    }
539
152k
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, callable);
540
152k
    if (nargs == 1 && PyTuple_Check(stack[0])) {
541
        /* Special cases for backward compatibility:
542
           - PyObject_CallFunction(func, "O", tuple) calls func(*tuple)
543
           - PyObject_CallFunction(func, "(OOO)", arg1, arg2, arg3) calls
544
             func(*(arg1, arg2, arg3)): func(arg1, arg2, arg3) */
545
20
        PyObject *args = stack[0];
546
20
        result = _PyObject_VectorcallTstate(tstate, callable,
547
20
                                            _PyTuple_ITEMS(args),
548
20
                                            PyTuple_GET_SIZE(args),
549
20
                                            NULL);
550
20
    }
551
152k
    else {
552
152k
        result = _PyObject_VectorcallTstate(tstate, callable,
553
152k
                                            stack, nargs, NULL);
554
152k
    }
555
556
553k
    for (i = 0; i < nargs; ++i) {
557
400k
        Py_DECREF(stack[i]);
558
400k
    }
559
152k
    if (stack != small_stack) {
560
120
        PyMem_Free(stack);
561
120
    }
562
152k
    return result;
563
152k
}
564
565
566
PyObject *
567
PyObject_CallFunction(PyObject *callable, const char *format, ...)
568
112k
{
569
112k
    va_list va;
570
112k
    PyObject *result;
571
112k
    PyThreadState *tstate = _PyThreadState_GET();
572
573
112k
    va_start(va, format);
574
112k
    result = _PyObject_CallFunctionVa(tstate, callable, format, va);
575
112k
    va_end(va);
576
577
112k
    return result;
578
112k
}
579
580
581
/* PyEval_CallFunction is exact copy of PyObject_CallFunction.
582
   Function removed in Python 3.13 API but kept in the stable ABI. */
583
PyAPI_FUNC(PyObject*)
584
PyEval_CallFunction(PyObject *callable, const char *format, ...)
585
0
{
586
0
    va_list va;
587
0
    PyObject *result;
588
0
    PyThreadState *tstate = _PyThreadState_GET();
589
590
0
    va_start(va, format);
591
0
    result = _PyObject_CallFunctionVa(tstate, callable, format, va);
592
0
    va_end(va);
593
594
0
    return result;
595
0
}
596
597
598
/* _PyObject_CallFunction_SizeT is exact copy of PyObject_CallFunction.
599
 * This function must be kept because it is part of the stable ABI.
600
 */
601
PyAPI_FUNC(PyObject *)  /* abi_only */
602
_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
603
0
{
604
0
    PyThreadState *tstate = _PyThreadState_GET();
605
606
0
    va_list va;
607
0
    va_start(va, format);
608
0
    PyObject *result = _PyObject_CallFunctionVa(tstate, callable, format, va);
609
0
    va_end(va);
610
611
0
    return result;
612
0
}
613
614
615
static PyObject*
616
callmethod(PyThreadState *tstate, PyObject* callable, const char *format, va_list va)
617
41.0k
{
618
41.0k
    assert(callable != NULL);
619
41.0k
    if (!PyCallable_Check(callable)) {
620
0
        _PyErr_Format(tstate, PyExc_TypeError,
621
0
                      "attribute of type '%.200s' is not callable",
622
0
                      Py_TYPE(callable)->tp_name);
623
0
        return NULL;
624
0
    }
625
626
41.0k
    return _PyObject_CallFunctionVa(tstate, callable, format, va);
627
41.0k
}
628
629
PyObject *
630
PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
631
40.8k
{
632
40.8k
    PyThreadState *tstate = _PyThreadState_GET();
633
634
40.8k
    if (obj == NULL || name == NULL) {
635
0
        return null_error(tstate);
636
0
    }
637
638
40.8k
    PyObject *callable = PyObject_GetAttrString(obj, name);
639
40.8k
    if (callable == NULL) {
640
0
        return NULL;
641
0
    }
642
643
40.8k
    va_list va;
644
40.8k
    va_start(va, format);
645
40.8k
    PyObject *retval = callmethod(tstate, callable, format, va);
646
40.8k
    va_end(va);
647
648
40.8k
    Py_DECREF(callable);
649
40.8k
    return retval;
650
40.8k
}
651
652
653
/* PyEval_CallMethod is exact copy of PyObject_CallMethod.
654
   Function removed in Python 3.13 API but kept in the stable ABI. */
655
PyAPI_FUNC(PyObject*)
656
PyEval_CallMethod(PyObject *obj, const char *name, const char *format, ...)
657
0
{
658
0
    PyThreadState *tstate = _PyThreadState_GET();
659
0
    if (obj == NULL || name == NULL) {
660
0
        return null_error(tstate);
661
0
    }
662
663
0
    PyObject *callable = PyObject_GetAttrString(obj, name);
664
0
    if (callable == NULL) {
665
0
        return NULL;
666
0
    }
667
668
0
    va_list va;
669
0
    va_start(va, format);
670
0
    PyObject *retval = callmethod(tstate, callable, format, va);
671
0
    va_end(va);
672
673
0
    Py_DECREF(callable);
674
0
    return retval;
675
0
}
676
677
678
PyObject *
679
_PyObject_CallMethod(PyObject *obj, PyObject *name,
680
                     const char *format, ...)
681
145
{
682
145
    PyThreadState *tstate = _PyThreadState_GET();
683
145
    if (obj == NULL || name == NULL) {
684
0
        return null_error(tstate);
685
0
    }
686
687
145
    PyObject *callable = PyObject_GetAttr(obj, name);
688
145
    if (callable == NULL) {
689
0
        return NULL;
690
0
    }
691
692
145
    va_list va;
693
145
    va_start(va, format);
694
145
    PyObject *retval = callmethod(tstate, callable, format, va);
695
145
    va_end(va);
696
697
145
    Py_DECREF(callable);
698
145
    return retval;
699
145
}
700
701
702
PyObject *
703
_PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name,
704
                       const char *format, ...)
705
0
{
706
0
    PyThreadState *tstate = _PyThreadState_GET();
707
0
    if (obj == NULL || name == NULL) {
708
0
        return null_error(tstate);
709
0
    }
710
711
0
_Py_COMP_DIAG_PUSH
712
0
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
713
0
    PyObject *callable = _PyObject_GetAttrId(obj, name);
714
0
_Py_COMP_DIAG_POP
715
0
    if (callable == NULL) {
716
0
        return NULL;
717
0
    }
718
719
0
    va_list va;
720
0
    va_start(va, format);
721
0
    PyObject *retval = callmethod(tstate, callable, format, va);
722
0
    va_end(va);
723
724
0
    Py_DECREF(callable);
725
0
    return retval;
726
0
}
727
728
729
PyObject * _PyObject_CallMethodFormat(PyThreadState *tstate, PyObject *callable,
730
                                      const char *format, ...)
731
0
{
732
0
    assert(callable != NULL);
733
0
    va_list va;
734
0
    va_start(va, format);
735
0
    PyObject *retval = callmethod(tstate, callable, format, va);
736
0
    va_end(va);
737
0
    return retval;
738
0
}
739
740
741
// _PyObject_CallMethod_SizeT is exact copy of PyObject_CallMethod.
742
// This function must be kept because it is part of the stable ABI.
743
PyAPI_FUNC(PyObject *)  /* abi_only */
744
_PyObject_CallMethod_SizeT(PyObject *obj, const char *name,
745
                           const char *format, ...)
746
0
{
747
0
    PyThreadState *tstate = _PyThreadState_GET();
748
0
    if (obj == NULL || name == NULL) {
749
0
        return null_error(tstate);
750
0
    }
751
752
0
    PyObject *callable = PyObject_GetAttrString(obj, name);
753
0
    if (callable == NULL) {
754
0
        return NULL;
755
0
    }
756
757
0
    va_list va;
758
0
    va_start(va, format);
759
0
    PyObject *retval = callmethod(tstate, callable, format, va);
760
0
    va_end(va);
761
762
0
    Py_DECREF(callable);
763
0
    return retval;
764
0
}
765
766
767
/* --- Call with "..." arguments ---------------------------------- */
768
769
static PyObject *
770
object_vacall(PyThreadState *tstate, PyObject *base,
771
              PyObject *callable, va_list vargs)
772
30.6k
{
773
30.6k
    PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
774
30.6k
    PyObject **stack;
775
30.6k
    Py_ssize_t nargs;
776
30.6k
    PyObject *result;
777
30.6k
    Py_ssize_t i;
778
30.6k
    va_list countva;
779
780
30.6k
    if (callable == NULL) {
781
0
        return null_error(tstate);
782
0
    }
783
784
    /* Count the number of arguments */
785
30.6k
    va_copy(countva, vargs);
786
30.6k
    nargs = base ? 1 : 0;
787
222k
    while (1) {
788
222k
        PyObject *arg = va_arg(countva, PyObject *);
789
222k
        if (arg == NULL) {
790
30.6k
            break;
791
30.6k
        }
792
191k
        nargs++;
793
191k
    }
794
30.6k
    va_end(countva);
795
796
    /* Copy arguments */
797
30.6k
    if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
798
4.62k
        stack = small_stack;
799
4.62k
    }
800
26.0k
    else {
801
26.0k
        stack = PyMem_Malloc(nargs * sizeof(stack[0]));
802
26.0k
        if (stack == NULL) {
803
0
            PyErr_NoMemory();
804
0
            return NULL;
805
0
        }
806
26.0k
    }
807
808
30.6k
    i = 0;
809
30.6k
    if (base) {
810
0
        stack[i++] = base;
811
0
    }
812
813
222k
    for (; i < nargs; ++i) {
814
191k
        stack[i] = va_arg(vargs, PyObject *);
815
191k
    }
816
817
#ifdef Py_STATS
818
    if (PyFunction_Check(callable)) {
819
        EVAL_CALL_STAT_INC(EVAL_CALL_API);
820
    }
821
#endif
822
    /* Call the function */
823
30.6k
    result = _PyObject_VectorcallTstate(tstate, callable, stack, nargs, NULL);
824
825
30.6k
    if (stack != small_stack) {
826
26.0k
        PyMem_Free(stack);
827
26.0k
    }
828
30.6k
    return result;
829
30.6k
}
830
831
PyObject *
832
_PyObject_VectorcallPrepend(PyThreadState *tstate, PyObject *callable,
833
                            PyObject *arg, PyObject *const *args,
834
                            size_t nargsf, PyObject *kwnames)
835
6.49k
{
836
6.49k
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
837
6.49k
    assert(nargs == 0 || args[nargs-1]);
838
839
6.49k
    PyObject *result;
840
6.49k
    if (nargsf & PY_VECTORCALL_ARGUMENTS_OFFSET) {
841
        /* PY_VECTORCALL_ARGUMENTS_OFFSET is set, so we are allowed to mutate the vector */
842
1.47k
        PyObject **newargs = (PyObject**)args - 1;
843
1.47k
        nargs += 1;
844
1.47k
        PyObject *tmp = newargs[0];
845
1.47k
        newargs[0] = arg;
846
1.47k
        assert(newargs[nargs-1]);
847
1.47k
        result = _PyObject_VectorcallTstate(tstate, callable, newargs,
848
1.47k
                                            nargs, kwnames);
849
1.47k
        newargs[0] = tmp;
850
1.47k
    }
851
5.02k
    else {
852
5.02k
        Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
853
5.02k
        Py_ssize_t totalargs = nargs + nkwargs;
854
5.02k
        if (totalargs == 0) {
855
0
            return _PyObject_VectorcallTstate(tstate, callable, &arg, 1, NULL);
856
0
        }
857
858
5.02k
        PyObject *newargs_stack[_PY_FASTCALL_SMALL_STACK];
859
5.02k
        PyObject **newargs;
860
5.02k
        if (totalargs <= (Py_ssize_t)Py_ARRAY_LENGTH(newargs_stack) - 1) {
861
5.02k
            newargs = newargs_stack;
862
5.02k
        }
863
0
        else {
864
0
            newargs = PyMem_Malloc((totalargs+1) * sizeof(PyObject *));
865
0
            if (newargs == NULL) {
866
0
                _PyErr_NoMemory(tstate);
867
0
                return NULL;
868
0
            }
869
0
        }
870
        /* use borrowed references */
871
5.02k
        newargs[0] = arg;
872
        /* bpo-37138: since totalargs > 0, it's impossible that args is NULL.
873
         * We need this, since calling memcpy() with a NULL pointer is
874
         * undefined behaviour. */
875
5.02k
        assert(args != NULL);
876
5.02k
        memcpy(newargs + 1, args, totalargs * sizeof(PyObject *));
877
5.02k
        result = _PyObject_VectorcallTstate(tstate, callable,
878
5.02k
                                            newargs, nargs+1, kwnames);
879
5.02k
        if (newargs != newargs_stack) {
880
0
            PyMem_Free(newargs);
881
0
        }
882
5.02k
    }
883
6.49k
    return result;
884
6.49k
}
885
886
PyObject *
887
PyObject_VectorcallMethod(PyObject *name, PyObject *const *args,
888
                           size_t nargsf, PyObject *kwnames)
889
102k
{
890
102k
    assert(name != NULL);
891
102k
    assert(args != NULL);
892
102k
    assert(PyVectorcall_NARGS(nargsf) >= 1);
893
894
102k
    PyThreadState *tstate = _PyThreadState_GET();
895
102k
    _PyCStackRef self, method;
896
102k
    _PyThreadState_PushCStackRef(tstate, &self);
897
102k
    _PyThreadState_PushCStackRef(tstate, &method);
898
    /* Use args[0] as "self" argument */
899
102k
    self.ref = PyStackRef_FromPyObjectBorrow(args[0]);
900
102k
    int unbound = _PyObject_GetMethodStackRef(tstate, &self.ref, name, &method.ref);
901
102k
    if (unbound < 0) {
902
0
        _PyThreadState_PopCStackRef(tstate, &method);
903
0
        _PyThreadState_PopCStackRef(tstate, &self);
904
0
        return NULL;
905
0
    }
906
907
102k
    PyObject *callable = PyStackRef_AsPyObjectBorrow(method.ref);
908
102k
    PyObject *self_obj = PyStackRef_AsPyObjectBorrow(self.ref);
909
102k
    PyObject *result;
910
911
102k
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_METHOD, callable);
912
102k
    if (self_obj == NULL) {
913
        /* Skip "self". We can keep PY_VECTORCALL_ARGUMENTS_OFFSET since
914
         * args[-1] in the onward call is args[0] here. */
915
1.15k
        result = _PyObject_VectorcallTstate(tstate, callable,
916
1.15k
                                            args + 1, nargsf - 1, kwnames);
917
1.15k
    }
918
101k
    else if (self_obj == args[0]) {
919
        /* We must remove PY_VECTORCALL_ARGUMENTS_OFFSET since
920
         * that would be interpreted as allowing to change args[-1] */
921
101k
        result = _PyObject_VectorcallTstate(tstate, callable, args,
922
101k
                                            nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET,
923
101k
                                            kwnames);
924
101k
    }
925
0
    else {
926
        /* classmethod: self_obj is the type, not args[0]. Replace
927
         * args[0] with self_obj and call the underlying callable. */
928
0
        result = _PyObject_VectorcallPrepend(tstate, callable, self_obj,
929
0
                                             args + 1, nargsf - 1, kwnames);
930
0
    }
931
102k
    _PyThreadState_PopCStackRef(tstate, &method);
932
102k
    _PyThreadState_PopCStackRef(tstate, &self);
933
102k
    return result;
934
102k
}
935
936
937
PyObject *
938
PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)
939
1.23k
{
940
1.23k
    PyThreadState *tstate = _PyThreadState_GET();
941
1.23k
    if (obj == NULL || name == NULL) {
942
0
        return null_error(tstate);
943
0
    }
944
945
1.23k
    _PyCStackRef self, method;
946
1.23k
    _PyThreadState_PushCStackRef(tstate, &self);
947
1.23k
    _PyThreadState_PushCStackRef(tstate, &method);
948
1.23k
    self.ref = PyStackRef_FromPyObjectBorrow(obj);
949
1.23k
    int res = _PyObject_GetMethodStackRef(tstate, &self.ref, name, &method.ref);
950
1.23k
    if (res < 0) {
951
0
        _PyThreadState_PopCStackRef(tstate, &method);
952
0
        _PyThreadState_PopCStackRef(tstate, &self);
953
0
        return NULL;
954
0
    }
955
1.23k
    PyObject *callable = PyStackRef_AsPyObjectBorrow(method.ref);
956
1.23k
    PyObject *self_obj = PyStackRef_AsPyObjectBorrow(self.ref);
957
958
1.23k
    va_list vargs;
959
1.23k
    va_start(vargs, name);
960
1.23k
    PyObject *result = object_vacall(tstate, self_obj, callable, vargs);
961
1.23k
    va_end(vargs);
962
963
1.23k
    _PyThreadState_PopCStackRef(tstate, &method);
964
1.23k
    _PyThreadState_PopCStackRef(tstate, &self);
965
1.23k
    return result;
966
1.23k
}
967
968
969
PyObject *
970
PyObject_CallFunctionObjArgs(PyObject *callable, ...)
971
29.4k
{
972
29.4k
    PyThreadState *tstate = _PyThreadState_GET();
973
29.4k
    va_list vargs;
974
29.4k
    PyObject *result;
975
976
29.4k
    va_start(vargs, callable);
977
29.4k
    result = object_vacall(tstate, NULL, callable, vargs);
978
29.4k
    va_end(vargs);
979
980
29.4k
    return result;
981
29.4k
}
982
983
984
/* --- PyStack functions ------------------------------------------ */
985
986
PyObject *
987
_PyStack_AsDict(PyObject *const *values, PyObject *kwnames)
988
2.26k
{
989
2.26k
    Py_ssize_t nkwargs;
990
991
2.26k
    assert(kwnames != NULL);
992
2.26k
    nkwargs = PyTuple_GET_SIZE(kwnames);
993
2.26k
    return _PyDict_FromItems(&PyTuple_GET_ITEM(kwnames, 0), 1,
994
2.26k
                             values, 1, nkwargs);
995
2.26k
}
996
997
998
/* Convert (args, nargs, kwargs: dict) into a (stack, nargs, kwnames: tuple).
999
1000
   Allocate a new argument vector and keyword names tuple. Return the argument
1001
   vector; return NULL with exception set on error. Return the keyword names
1002
   tuple in *p_kwnames.
1003
1004
   This also checks that all keyword names are strings. If not, a TypeError is
1005
   raised.
1006
1007
   The newly allocated argument vector supports PY_VECTORCALL_ARGUMENTS_OFFSET.
1008
1009
   The positional arguments are borrowed references from the input array
1010
   (which must be kept alive by the caller). The keyword argument values
1011
   are new references.
1012
1013
   When done, you must call _PyStack_UnpackDict_Free(stack, nargs, kwnames) */
1014
PyObject *const *
1015
_PyStack_UnpackDict(PyThreadState *tstate,
1016
                    PyObject *const *args, Py_ssize_t nargs,
1017
                    PyObject *kwargs, PyObject **p_kwnames)
1018
1.20k
{
1019
1.20k
    assert(nargs >= 0);
1020
1.20k
    assert(kwargs != NULL);
1021
1.20k
    assert(PyDict_Check(kwargs));
1022
1023
1.20k
    Py_ssize_t nkwargs = PyDict_GET_SIZE(kwargs);
1024
    /* Check for overflow in the PyMem_Malloc() call below. The subtraction
1025
     * in this check cannot overflow: both maxnargs and nkwargs are
1026
     * non-negative signed integers, so their difference fits in the type. */
1027
1.20k
    Py_ssize_t maxnargs = PY_SSIZE_T_MAX / sizeof(args[0]) - 1;
1028
1.20k
    if (nargs > maxnargs - nkwargs) {
1029
0
        _PyErr_NoMemory(tstate);
1030
0
        return NULL;
1031
0
    }
1032
1033
    /* Add 1 to support PY_VECTORCALL_ARGUMENTS_OFFSET */
1034
1.20k
    PyObject **stack = PyMem_Malloc((1 + nargs + nkwargs) * sizeof(args[0]));
1035
1.20k
    if (stack == NULL) {
1036
0
        _PyErr_NoMemory(tstate);
1037
0
        return NULL;
1038
0
    }
1039
1040
1.20k
    PyObject *kwnames = PyTuple_New(nkwargs);
1041
1.20k
    if (kwnames == NULL) {
1042
0
        PyMem_Free(stack);
1043
0
        return NULL;
1044
0
    }
1045
1046
1.20k
    stack++;  /* For PY_VECTORCALL_ARGUMENTS_OFFSET */
1047
1048
    /* Copy positional arguments (borrowed references) */
1049
4.29k
    for (Py_ssize_t i = 0; i < nargs; i++) {
1050
3.08k
        stack[i] = args[i];
1051
3.08k
    }
1052
1053
1.20k
    PyObject **kwstack = stack + nargs;
1054
    /* This loop doesn't support lookup function mutating the dictionary
1055
       to change its size. It's a deliberate choice for speed, this function is
1056
       called in the performance critical hot code. */
1057
1.20k
    Py_ssize_t pos = 0, i = 0;
1058
1.20k
    PyObject *key, *value;
1059
1.20k
    unsigned long keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS;
1060
4.68k
    while (PyDict_Next(kwargs, &pos, &key, &value)) {
1061
3.47k
        keys_are_strings &= Py_TYPE(key)->tp_flags;
1062
3.47k
        PyTuple_SET_ITEM(kwnames, i, Py_NewRef(key));
1063
3.47k
        kwstack[i] = Py_NewRef(value);
1064
3.47k
        i++;
1065
3.47k
    }
1066
1067
    /* keys_are_strings has the value Py_TPFLAGS_UNICODE_SUBCLASS if that
1068
     * flag is set for all keys. Otherwise, keys_are_strings equals 0.
1069
     * We do this check once at the end instead of inside the loop above
1070
     * because it simplifies the deallocation in the failing case.
1071
     * It happens to also make the loop above slightly more efficient. */
1072
1.20k
    if (!keys_are_strings) {
1073
0
        _PyErr_SetString(tstate, PyExc_TypeError,
1074
0
                         "keywords must be strings");
1075
0
        _PyStack_UnpackDict_Free(stack, nargs, kwnames);
1076
0
        return NULL;
1077
0
    }
1078
1079
1.20k
    *p_kwnames = kwnames;
1080
1.20k
    return stack;
1081
1.20k
}
1082
1083
void
1084
_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs,
1085
                         PyObject *kwnames)
1086
1.20k
{
1087
    /* Only decref kwargs values, positional args are borrowed */
1088
1.20k
    Py_ssize_t nkwargs = PyTuple_GET_SIZE(kwnames);
1089
4.68k
    for (Py_ssize_t i = 0; i < nkwargs; i++) {
1090
3.47k
        Py_DECREF(stack[nargs + i]);
1091
3.47k
    }
1092
1.20k
    _PyStack_UnpackDict_FreeNoDecRef(stack, kwnames);
1093
1.20k
}
1094
1095
void
1096
_PyStack_UnpackDict_FreeNoDecRef(PyObject *const *stack, PyObject *kwnames)
1097
1.20k
{
1098
1.20k
    PyMem_Free((PyObject **)stack - 1);
1099
1.20k
    Py_DECREF(kwnames);
1100
1.20k
}
1101
1102
// Export for the stable ABI
1103
#undef PyVectorcall_NARGS
1104
Py_ssize_t
1105
PyVectorcall_NARGS(size_t n)
1106
0
{
1107
0
    return _PyVectorcall_NARGS(n);
1108
0
}