Coverage Report

Created: 2026-03-07 06:56

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
33.6M
{
28
33.6M
    assert((callable != NULL) ^ (where != NULL));
29
30
33.6M
    if (result == NULL) {
31
2.16M
        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
2.16M
    }
48
31.4M
    else {
49
31.4M
        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
31.4M
    }
70
33.6M
    return result;
71
33.6M
}
72
73
74
int
75
_Py_CheckSlotResult(PyObject *obj, const char *slot_name, int success)
76
102M
{
77
102M
    PyThreadState *tstate = _PyThreadState_GET();
78
102M
    if (!success) {
79
4.27M
        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
4.27M
    }
86
98.4M
    else {
87
98.4M
        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
98.4M
    }
94
102M
    return 1;
95
102M
}
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
7
{
104
7
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func);
105
7
    PyThreadState *tstate = _PyThreadState_GET();
106
7
    return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL);
107
7
}
108
109
110
PyObject *
111
_PyObject_VectorcallDictTstate(PyThreadState *tstate, PyObject *callable,
112
                               PyObject *const *args, size_t nargsf,
113
                               PyObject *kwargs)
114
319k
{
115
319k
    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
319k
    assert(!_PyErr_Occurred(tstate));
121
122
319k
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
123
319k
    assert(nargs >= 0);
124
319k
    assert(nargs == 0 || args != NULL);
125
319k
    assert(kwargs == NULL || PyDict_Check(kwargs));
126
127
319k
    vectorcallfunc func = PyVectorcall_Function(callable);
128
319k
    if (func == NULL) {
129
        /* Use tp_call instead */
130
2.47k
        return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwargs);
131
2.47k
    }
132
133
317k
    PyObject *res;
134
317k
    if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
135
315k
        res = func(callable, args, nargsf, NULL);
136
315k
    }
137
1.33k
    else {
138
1.33k
        PyObject *kwnames;
139
1.33k
        PyObject *const *newargs;
140
1.33k
        newargs = _PyStack_UnpackDict(tstate,
141
1.33k
                                      args, nargs,
142
1.33k
                                      kwargs, &kwnames);
143
1.33k
        if (newargs == NULL) {
144
0
            return NULL;
145
0
        }
146
1.33k
        res = func(callable, newargs,
147
1.33k
                   nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
148
1.33k
        _PyStack_UnpackDict_Free(newargs, nargs, kwnames);
149
1.33k
    }
150
317k
    return _Py_CheckFunctionResult(tstate, callable, res, NULL);
151
317k
}
152
153
154
PyObject *
155
PyObject_VectorcallDict(PyObject *callable, PyObject *const *args,
156
                       size_t nargsf, PyObject *kwargs)
157
10.7k
{
158
10.7k
    PyThreadState *tstate = _PyThreadState_GET();
159
10.7k
    return _PyObject_VectorcallDictTstate(tstate, callable, args, nargsf, kwargs);
160
10.7k
}
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
698k
{
204
698k
    assert(nargs >= 0);
205
698k
    assert(nargs == 0 || args != NULL);
206
698k
    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
698k
    ternaryfunc call = Py_TYPE(callable)->tp_call;
211
698k
    if (call == NULL) {
212
0
        object_is_not_callable(tstate, callable);
213
0
        return NULL;
214
0
    }
215
216
698k
    PyObject *argstuple = PyTuple_FromArray(args, nargs);
217
698k
    if (argstuple == NULL) {
218
0
        return NULL;
219
0
    }
220
221
698k
    PyObject *kwdict;
222
698k
    if (keywords == NULL || PyDict_Check(keywords)) {
223
696k
        kwdict = keywords;
224
696k
    }
225
2.14k
    else {
226
2.14k
        if (PyTuple_GET_SIZE(keywords)) {
227
2.14k
            assert(args != NULL);
228
2.14k
            kwdict = _PyStack_AsDict(args + nargs, keywords);
229
2.14k
            if (kwdict == NULL) {
230
0
                Py_DECREF(argstuple);
231
0
                return NULL;
232
0
            }
233
2.14k
        }
234
0
        else {
235
0
            keywords = kwdict = NULL;
236
0
        }
237
2.14k
    }
238
239
698k
    PyObject *result = NULL;
240
698k
    if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object") == 0)
241
698k
    {
242
698k
        result = _PyCFunctionWithKeywords_TrampolineCall(
243
698k
            (PyCFunctionWithKeywords)call, callable, argstuple, kwdict);
244
698k
        _Py_LeaveRecursiveCallTstate(tstate);
245
698k
    }
246
247
698k
    Py_DECREF(argstuple);
248
698k
    if (kwdict != keywords) {
249
2.14k
        Py_DECREF(kwdict);
250
2.14k
    }
251
252
698k
    return _Py_CheckFunctionResult(tstate, callable, result, NULL);
253
698k
}
254
255
256
vectorcallfunc
257
PyVectorcall_Function(PyObject *callable)
258
362k
{
259
362k
    return _PyVectorcall_FunctionInline(callable);
260
362k
}
261
262
263
static PyObject *
264
_PyVectorcall_Call(PyThreadState *tstate, vectorcallfunc func,
265
                   PyObject *callable, PyObject *tuple, PyObject *kwargs)
266
25.1k
{
267
25.1k
    assert(func != NULL);
268
269
25.1k
    Py_ssize_t nargs = PyTuple_GET_SIZE(tuple);
270
271
    /* Fast path for no keywords */
272
25.1k
    if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
273
25.1k
        return func(callable, _PyTuple_ITEMS(tuple), nargs, NULL);
274
25.1k
    }
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
1.61M
{
326
1.61M
    PyThreadState *tstate = _PyThreadState_GET();
327
1.61M
    return _PyObject_VectorcallTstate(tstate, callable,
328
1.61M
                                      args, nargsf, kwnames);
329
1.61M
}
330
331
332
PyObject *
333
_PyObject_Call(PyThreadState *tstate, PyObject *callable,
334
               PyObject *args, PyObject *kwargs)
335
42.9k
{
336
42.9k
    ternaryfunc call;
337
42.9k
    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
42.9k
    assert(!_PyErr_Occurred(tstate));
343
42.9k
    assert(PyTuple_Check(args));
344
42.9k
    assert(kwargs == NULL || PyDict_Check(kwargs));
345
42.9k
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, callable);
346
42.9k
    vectorcallfunc vector_func = PyVectorcall_Function(callable);
347
42.9k
    if (vector_func != NULL) {
348
25.1k
        return _PyVectorcall_Call(tstate, vector_func, callable, args, kwargs);
349
25.1k
    }
350
17.8k
    else {
351
17.8k
        call = Py_TYPE(callable)->tp_call;
352
17.8k
        if (call == NULL) {
353
0
            object_is_not_callable(tstate, callable);
354
0
            return NULL;
355
0
        }
356
357
17.8k
        if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object")) {
358
0
            return NULL;
359
0
        }
360
361
17.8k
        result = (*call)(callable, args, kwargs);
362
363
17.8k
        _Py_LeaveRecursiveCallTstate(tstate);
364
365
17.8k
        return _Py_CheckFunctionResult(tstate, callable, result, NULL);
366
17.8k
    }
367
42.9k
}
368
369
PyObject *
370
PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
371
42.9k
{
372
42.9k
    PyThreadState *tstate = _PyThreadState_GET();
373
42.9k
    return _PyObject_Call(tstate, callable, args, kwargs);
374
42.9k
}
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
4.13M
{
388
4.13M
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func);
389
4.13M
    assert(arg != NULL);
390
4.13M
    PyObject *_args[2];
391
4.13M
    PyObject **args = _args + 1;  // For PY_VECTORCALL_ARGUMENTS_OFFSET
392
4.13M
    args[0] = arg;
393
4.13M
    PyThreadState *tstate = _PyThreadState_GET();
394
4.13M
    size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET;
395
4.13M
    return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL);
396
4.13M
}
397
398
399
/* --- PyFunction call functions ---------------------------------- */
400
401
PyObject *
402
_PyFunction_Vectorcall(PyObject *func, PyObject* const* stack,
403
                       size_t nargsf, PyObject *kwnames)
404
19.9M
{
405
19.9M
    assert(PyFunction_Check(func));
406
19.9M
    PyFunctionObject *f = (PyFunctionObject *)func;
407
19.9M
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
408
19.9M
    assert(nargs >= 0);
409
19.9M
    PyThreadState *tstate = _PyThreadState_GET();
410
19.9M
    assert(nargs == 0 || stack != NULL);
411
19.9M
    EVAL_CALL_STAT_INC(EVAL_CALL_FUNCTION_VECTORCALL);
412
19.9M
    if (((PyCodeObject *)f->func_code)->co_flags & CO_OPTIMIZED) {
413
19.9M
        return _PyEval_Vector(tstate, f, NULL, stack, nargs, kwnames);
414
19.9M
    }
415
0
    else {
416
0
        return _PyEval_Vector(tstate, f, f->func_globals, stack, nargs, kwnames);
417
0
    }
418
19.9M
}
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
308k
{
481
308k
    assert(PyTuple_Check(args));
482
483
308k
    PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
484
308k
    PyObject **stack;
485
486
308k
    Py_ssize_t argcount = PyTuple_GET_SIZE(args);
487
308k
    if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
488
136k
        stack = small_stack;
489
136k
    }
490
172k
    else {
491
172k
        stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *));
492
172k
        if (stack == NULL) {
493
0
            PyErr_NoMemory();
494
0
            return NULL;
495
0
        }
496
172k
    }
497
498
    /* use borrowed references */
499
308k
    stack[0] = obj;
500
308k
    memcpy(&stack[1],
501
308k
           _PyTuple_ITEMS(args),
502
0
           argcount * sizeof(PyObject *));
503
504
0
    PyObject *result = _PyObject_VectorcallDictTstate(tstate, callable,
505
308k
                                                      stack, argcount + 1,
506
308k
                                                      kwargs);
507
308k
    if (stack != small_stack) {
508
172k
        PyMem_Free(stack);
509
172k
    }
510
308k
    return result;
511
308k
}
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
316k
{
520
316k
    PyObject* small_stack[_PY_FASTCALL_SMALL_STACK];
521
316k
    const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack);
522
316k
    PyObject **stack;
523
316k
    Py_ssize_t nargs, i;
524
316k
    PyObject *result;
525
526
316k
    if (callable == NULL) {
527
0
        return null_error(tstate);
528
0
    }
529
530
316k
    if (!format || !*format) {
531
2.24k
        return _PyObject_CallNoArgsTstate(tstate, callable);
532
2.24k
    }
533
534
314k
    stack = _Py_VaBuildStack(small_stack, small_stack_len,
535
314k
                             format, va, &nargs);
536
314k
    if (stack == NULL) {
537
0
        return NULL;
538
0
    }
539
314k
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, callable);
540
314k
    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
22
        PyObject *args = stack[0];
546
22
        result = _PyObject_VectorcallTstate(tstate, callable,
547
22
                                            _PyTuple_ITEMS(args),
548
22
                                            PyTuple_GET_SIZE(args),
549
22
                                            NULL);
550
22
    }
551
314k
    else {
552
314k
        result = _PyObject_VectorcallTstate(tstate, callable,
553
314k
                                            stack, nargs, NULL);
554
314k
    }
555
556
1.51M
    for (i = 0; i < nargs; ++i) {
557
1.20M
        Py_DECREF(stack[i]);
558
1.20M
    }
559
314k
    if (stack != small_stack) {
560
132
        PyMem_Free(stack);
561
132
    }
562
314k
    return result;
563
314k
}
564
565
566
PyObject *
567
PyObject_CallFunction(PyObject *callable, const char *format, ...)
568
273k
{
569
273k
    va_list va;
570
273k
    PyObject *result;
571
273k
    PyThreadState *tstate = _PyThreadState_GET();
572
573
273k
    va_start(va, format);
574
273k
    result = _PyObject_CallFunctionVa(tstate, callable, format, va);
575
273k
    va_end(va);
576
577
273k
    return result;
578
273k
}
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
43.0k
{
618
43.0k
    assert(callable != NULL);
619
43.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
43.0k
    return _PyObject_CallFunctionVa(tstate, callable, format, va);
627
43.0k
}
628
629
PyObject *
630
PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
631
42.9k
{
632
42.9k
    PyThreadState *tstate = _PyThreadState_GET();
633
634
42.9k
    if (obj == NULL || name == NULL) {
635
0
        return null_error(tstate);
636
0
    }
637
638
42.9k
    PyObject *callable = PyObject_GetAttrString(obj, name);
639
42.9k
    if (callable == NULL) {
640
0
        return NULL;
641
0
    }
642
643
42.9k
    va_list va;
644
42.9k
    va_start(va, format);
645
42.9k
    PyObject *retval = callmethod(tstate, callable, format, va);
646
42.9k
    va_end(va);
647
648
42.9k
    Py_DECREF(callable);
649
42.9k
    return retval;
650
42.9k
}
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
160
{
682
160
    PyThreadState *tstate = _PyThreadState_GET();
683
160
    if (obj == NULL || name == NULL) {
684
0
        return null_error(tstate);
685
0
    }
686
687
160
    PyObject *callable = PyObject_GetAttr(obj, name);
688
160
    if (callable == NULL) {
689
0
        return NULL;
690
0
    }
691
692
160
    va_list va;
693
160
    va_start(va, format);
694
160
    PyObject *retval = callmethod(tstate, callable, format, va);
695
160
    va_end(va);
696
697
160
    Py_DECREF(callable);
698
160
    return retval;
699
160
}
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
181k
{
773
181k
    PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
774
181k
    PyObject **stack;
775
181k
    Py_ssize_t nargs;
776
181k
    PyObject *result;
777
181k
    Py_ssize_t i;
778
181k
    va_list countva;
779
780
181k
    if (callable == NULL) {
781
0
        return null_error(tstate);
782
0
    }
783
784
    /* Count the number of arguments */
785
181k
    va_copy(countva, vargs);
786
181k
    nargs = base ? 1 : 0;
787
1.23M
    while (1) {
788
1.23M
        PyObject *arg = va_arg(countva, PyObject *);
789
1.23M
        if (arg == NULL) {
790
181k
            break;
791
181k
        }
792
1.05M
        nargs++;
793
1.05M
    }
794
181k
    va_end(countva);
795
796
    /* Copy arguments */
797
181k
    if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
798
9.00k
        stack = small_stack;
799
9.00k
    }
800
172k
    else {
801
172k
        stack = PyMem_Malloc(nargs * sizeof(stack[0]));
802
172k
        if (stack == NULL) {
803
0
            PyErr_NoMemory();
804
0
            return NULL;
805
0
        }
806
172k
    }
807
808
181k
    i = 0;
809
181k
    if (base) {
810
0
        stack[i++] = base;
811
0
    }
812
813
1.23M
    for (; i < nargs; ++i) {
814
1.05M
        stack[i] = va_arg(vargs, PyObject *);
815
1.05M
    }
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
181k
    result = _PyObject_VectorcallTstate(tstate, callable, stack, nargs, NULL);
824
825
181k
    if (stack != small_stack) {
826
172k
        PyMem_Free(stack);
827
172k
    }
828
181k
    return result;
829
181k
}
830
831
832
PyObject *
833
PyObject_VectorcallMethod(PyObject *name, PyObject *const *args,
834
                           size_t nargsf, PyObject *kwnames)
835
544k
{
836
544k
    assert(name != NULL);
837
544k
    assert(args != NULL);
838
544k
    assert(PyVectorcall_NARGS(nargsf) >= 1);
839
840
544k
    PyThreadState *tstate = _PyThreadState_GET();
841
544k
    _PyCStackRef method;
842
544k
    _PyThreadState_PushCStackRef(tstate, &method);
843
    /* Use args[0] as "self" argument */
844
544k
    int unbound = _PyObject_GetMethodStackRef(tstate, args[0], name, &method.ref);
845
544k
    if (PyStackRef_IsNull(method.ref)) {
846
0
        _PyThreadState_PopCStackRef(tstate, &method);
847
0
        return NULL;
848
0
    }
849
544k
    PyObject *callable = PyStackRef_AsPyObjectBorrow(method.ref);
850
851
544k
    if (unbound) {
852
        /* We must remove PY_VECTORCALL_ARGUMENTS_OFFSET since
853
         * that would be interpreted as allowing to change args[-1] */
854
543k
        nargsf &= ~PY_VECTORCALL_ARGUMENTS_OFFSET;
855
543k
    }
856
1.35k
    else {
857
        /* Skip "self". We can keep PY_VECTORCALL_ARGUMENTS_OFFSET since
858
         * args[-1] in the onward call is args[0] here. */
859
1.35k
        args++;
860
1.35k
        nargsf--;
861
1.35k
    }
862
544k
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_METHOD, callable);
863
544k
    PyObject *result = _PyObject_VectorcallTstate(tstate, callable,
864
544k
                                                  args, nargsf, kwnames);
865
544k
    _PyThreadState_PopCStackRef(tstate, &method);
866
544k
    return result;
867
544k
}
868
869
870
PyObject *
871
PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)
872
1.30k
{
873
1.30k
    PyThreadState *tstate = _PyThreadState_GET();
874
1.30k
    if (obj == NULL || name == NULL) {
875
0
        return null_error(tstate);
876
0
    }
877
878
1.30k
    _PyCStackRef method;
879
1.30k
    _PyThreadState_PushCStackRef(tstate, &method);
880
1.30k
    int is_method = _PyObject_GetMethodStackRef(tstate, obj, name, &method.ref);
881
1.30k
    if (PyStackRef_IsNull(method.ref)) {
882
0
        _PyThreadState_PopCStackRef(tstate, &method);
883
0
        return NULL;
884
0
    }
885
1.30k
    PyObject *callable = PyStackRef_AsPyObjectBorrow(method.ref);
886
1.30k
    obj = is_method ? obj : NULL;
887
888
1.30k
    va_list vargs;
889
1.30k
    va_start(vargs, name);
890
1.30k
    PyObject *result = object_vacall(tstate, obj, callable, vargs);
891
1.30k
    va_end(vargs);
892
893
1.30k
    _PyThreadState_PopCStackRef(tstate, &method);
894
1.30k
    return result;
895
1.30k
}
896
897
898
PyObject *
899
PyObject_CallFunctionObjArgs(PyObject *callable, ...)
900
180k
{
901
180k
    PyThreadState *tstate = _PyThreadState_GET();
902
180k
    va_list vargs;
903
180k
    PyObject *result;
904
905
180k
    va_start(vargs, callable);
906
180k
    result = object_vacall(tstate, NULL, callable, vargs);
907
180k
    va_end(vargs);
908
909
180k
    return result;
910
180k
}
911
912
913
/* --- PyStack functions ------------------------------------------ */
914
915
PyObject *
916
_PyStack_AsDict(PyObject *const *values, PyObject *kwnames)
917
2.40k
{
918
2.40k
    Py_ssize_t nkwargs;
919
920
2.40k
    assert(kwnames != NULL);
921
2.40k
    nkwargs = PyTuple_GET_SIZE(kwnames);
922
2.40k
    return _PyDict_FromItems(&PyTuple_GET_ITEM(kwnames, 0), 1,
923
2.40k
                             values, 1, nkwargs);
924
2.40k
}
925
926
927
/* Convert (args, nargs, kwargs: dict) into a (stack, nargs, kwnames: tuple).
928
929
   Allocate a new argument vector and keyword names tuple. Return the argument
930
   vector; return NULL with exception set on error. Return the keyword names
931
   tuple in *p_kwnames.
932
933
   This also checks that all keyword names are strings. If not, a TypeError is
934
   raised.
935
936
   The newly allocated argument vector supports PY_VECTORCALL_ARGUMENTS_OFFSET.
937
938
   The positional arguments are borrowed references from the input array
939
   (which must be kept alive by the caller). The keyword argument values
940
   are new references.
941
942
   When done, you must call _PyStack_UnpackDict_Free(stack, nargs, kwnames) */
943
PyObject *const *
944
_PyStack_UnpackDict(PyThreadState *tstate,
945
                    PyObject *const *args, Py_ssize_t nargs,
946
                    PyObject *kwargs, PyObject **p_kwnames)
947
1.33k
{
948
1.33k
    assert(nargs >= 0);
949
1.33k
    assert(kwargs != NULL);
950
1.33k
    assert(PyDict_Check(kwargs));
951
952
1.33k
    Py_ssize_t nkwargs = PyDict_GET_SIZE(kwargs);
953
    /* Check for overflow in the PyMem_Malloc() call below. The subtraction
954
     * in this check cannot overflow: both maxnargs and nkwargs are
955
     * non-negative signed integers, so their difference fits in the type. */
956
1.33k
    Py_ssize_t maxnargs = PY_SSIZE_T_MAX / sizeof(args[0]) - 1;
957
1.33k
    if (nargs > maxnargs - nkwargs) {
958
0
        _PyErr_NoMemory(tstate);
959
0
        return NULL;
960
0
    }
961
962
    /* Add 1 to support PY_VECTORCALL_ARGUMENTS_OFFSET */
963
1.33k
    PyObject **stack = PyMem_Malloc((1 + nargs + nkwargs) * sizeof(args[0]));
964
1.33k
    if (stack == NULL) {
965
0
        _PyErr_NoMemory(tstate);
966
0
        return NULL;
967
0
    }
968
969
1.33k
    PyObject *kwnames = PyTuple_New(nkwargs);
970
1.33k
    if (kwnames == NULL) {
971
0
        PyMem_Free(stack);
972
0
        return NULL;
973
0
    }
974
975
1.33k
    stack++;  /* For PY_VECTORCALL_ARGUMENTS_OFFSET */
976
977
    /* Copy positional arguments (borrowed references) */
978
4.77k
    for (Py_ssize_t i = 0; i < nargs; i++) {
979
3.43k
        stack[i] = args[i];
980
3.43k
    }
981
982
1.33k
    PyObject **kwstack = stack + nargs;
983
    /* This loop doesn't support lookup function mutating the dictionary
984
       to change its size. It's a deliberate choice for speed, this function is
985
       called in the performance critical hot code. */
986
1.33k
    Py_ssize_t pos = 0, i = 0;
987
1.33k
    PyObject *key, *value;
988
1.33k
    unsigned long keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS;
989
4.97k
    while (PyDict_Next(kwargs, &pos, &key, &value)) {
990
3.64k
        keys_are_strings &= Py_TYPE(key)->tp_flags;
991
3.64k
        PyTuple_SET_ITEM(kwnames, i, Py_NewRef(key));
992
3.64k
        kwstack[i] = Py_NewRef(value);
993
3.64k
        i++;
994
3.64k
    }
995
996
    /* keys_are_strings has the value Py_TPFLAGS_UNICODE_SUBCLASS if that
997
     * flag is set for all keys. Otherwise, keys_are_strings equals 0.
998
     * We do this check once at the end instead of inside the loop above
999
     * because it simplifies the deallocation in the failing case.
1000
     * It happens to also make the loop above slightly more efficient. */
1001
1.33k
    if (!keys_are_strings) {
1002
0
        _PyErr_SetString(tstate, PyExc_TypeError,
1003
0
                         "keywords must be strings");
1004
0
        _PyStack_UnpackDict_Free(stack, nargs, kwnames);
1005
0
        return NULL;
1006
0
    }
1007
1008
1.33k
    *p_kwnames = kwnames;
1009
1.33k
    return stack;
1010
1.33k
}
1011
1012
void
1013
_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs,
1014
                         PyObject *kwnames)
1015
1.33k
{
1016
    /* Only decref kwargs values, positional args are borrowed */
1017
1.33k
    Py_ssize_t nkwargs = PyTuple_GET_SIZE(kwnames);
1018
4.97k
    for (Py_ssize_t i = 0; i < nkwargs; i++) {
1019
3.64k
        Py_DECREF(stack[nargs + i]);
1020
3.64k
    }
1021
1.33k
    _PyStack_UnpackDict_FreeNoDecRef(stack, kwnames);
1022
1.33k
}
1023
1024
void
1025
_PyStack_UnpackDict_FreeNoDecRef(PyObject *const *stack, PyObject *kwnames)
1026
1.33k
{
1027
1.33k
    PyMem_Free((PyObject **)stack - 1);
1028
1.33k
    Py_DECREF(kwnames);
1029
1.33k
}
1030
1031
// Export for the stable ABI
1032
#undef PyVectorcall_NARGS
1033
Py_ssize_t
1034
PyVectorcall_NARGS(size_t n)
1035
0
{
1036
0
    return _PyVectorcall_NARGS(n);
1037
0
}