Coverage Report

Created: 2026-02-09 07:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython/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
599M
{
28
599M
    assert((callable != NULL) ^ (where != NULL));
29
30
599M
    if (result == NULL) {
31
15.0M
        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
15.0M
    }
48
584M
    else {
49
584M
        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
584M
    }
70
599M
    return result;
71
599M
}
72
73
74
int
75
_Py_CheckSlotResult(PyObject *obj, const char *slot_name, int success)
76
0
{
77
0
    PyThreadState *tstate = _PyThreadState_GET();
78
0
    if (!success) {
79
0
        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
0
    }
86
0
    else {
87
0
        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
0
    }
94
0
    return 1;
95
0
}
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
138
{
104
138
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func);
105
138
    PyThreadState *tstate = _PyThreadState_GET();
106
138
    return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL);
107
138
}
108
109
110
PyObject *
111
_PyObject_VectorcallDictTstate(PyThreadState *tstate, PyObject *callable,
112
                               PyObject *const *args, size_t nargsf,
113
                               PyObject *kwargs)
114
41.9M
{
115
41.9M
    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
41.9M
    assert(!_PyErr_Occurred(tstate));
121
122
41.9M
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
123
41.9M
    assert(nargs >= 0);
124
41.9M
    assert(nargs == 0 || args != NULL);
125
41.9M
    assert(kwargs == NULL || PyDict_Check(kwargs));
126
127
41.9M
    vectorcallfunc func = PyVectorcall_Function(callable);
128
41.9M
    if (func == NULL) {
129
        /* Use tp_call instead */
130
5.17k
        return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwargs);
131
5.17k
    }
132
133
41.9M
    PyObject *res;
134
41.9M
    if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
135
35.4M
        res = func(callable, args, nargsf, NULL);
136
35.4M
    }
137
6.53M
    else {
138
6.53M
        PyObject *kwnames;
139
6.53M
        PyObject *const *newargs;
140
6.53M
        newargs = _PyStack_UnpackDict(tstate,
141
6.53M
                                      args, nargs,
142
6.53M
                                      kwargs, &kwnames);
143
6.53M
        if (newargs == NULL) {
144
0
            return NULL;
145
0
        }
146
6.53M
        res = func(callable, newargs,
147
6.53M
                   nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
148
6.53M
        _PyStack_UnpackDict_Free(newargs, nargs, kwnames);
149
6.53M
    }
150
41.9M
    return _Py_CheckFunctionResult(tstate, callable, res, NULL);
151
41.9M
}
152
153
154
PyObject *
155
PyObject_VectorcallDict(PyObject *callable, PyObject *const *args,
156
                       size_t nargsf, PyObject *kwargs)
157
210k
{
158
210k
    PyThreadState *tstate = _PyThreadState_GET();
159
210k
    return _PyObject_VectorcallDictTstate(tstate, callable, args, nargsf, kwargs);
160
210k
}
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
96.6M
{
204
96.6M
    assert(nargs >= 0);
205
96.6M
    assert(nargs == 0 || args != NULL);
206
96.6M
    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
96.6M
    ternaryfunc call = Py_TYPE(callable)->tp_call;
211
96.6M
    if (call == NULL) {
212
0
        object_is_not_callable(tstate, callable);
213
0
        return NULL;
214
0
    }
215
216
96.6M
    PyObject *argstuple = PyTuple_FromArray(args, nargs);
217
96.6M
    if (argstuple == NULL) {
218
0
        return NULL;
219
0
    }
220
221
96.6M
    PyObject *kwdict;
222
96.6M
    if (keywords == NULL || PyDict_Check(keywords)) {
223
89.9M
        kwdict = keywords;
224
89.9M
    }
225
6.76M
    else {
226
6.76M
        if (PyTuple_GET_SIZE(keywords)) {
227
6.76M
            assert(args != NULL);
228
6.76M
            kwdict = _PyStack_AsDict(args + nargs, keywords);
229
6.76M
            if (kwdict == NULL) {
230
0
                Py_DECREF(argstuple);
231
0
                return NULL;
232
0
            }
233
6.76M
        }
234
0
        else {
235
0
            keywords = kwdict = NULL;
236
0
        }
237
6.76M
    }
238
239
96.6M
    PyObject *result = NULL;
240
96.6M
    if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object") == 0)
241
96.6M
    {
242
96.6M
        result = _PyCFunctionWithKeywords_TrampolineCall(
243
96.6M
            (PyCFunctionWithKeywords)call, callable, argstuple, kwdict);
244
96.6M
        _Py_LeaveRecursiveCallTstate(tstate);
245
96.6M
    }
246
247
96.6M
    Py_DECREF(argstuple);
248
96.6M
    if (kwdict != keywords) {
249
6.76M
        Py_DECREF(kwdict);
250
6.76M
    }
251
252
96.6M
    return _Py_CheckFunctionResult(tstate, callable, result, NULL);
253
96.6M
}
254
255
256
vectorcallfunc
257
PyVectorcall_Function(PyObject *callable)
258
74.4M
{
259
74.4M
    return _PyVectorcall_FunctionInline(callable);
260
74.4M
}
261
262
263
static PyObject *
264
_PyVectorcall_Call(PyThreadState *tstate, vectorcallfunc func,
265
                   PyObject *callable, PyObject *tuple, PyObject *kwargs)
266
24.2M
{
267
24.2M
    assert(func != NULL);
268
269
24.2M
    Py_ssize_t nargs = PyTuple_GET_SIZE(tuple);
270
271
    /* Fast path for no keywords */
272
24.2M
    if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
273
23.7M
        return func(callable, _PyTuple_ITEMS(tuple), nargs, NULL);
274
23.7M
    }
275
276
    /* Convert arguments & call */
277
549k
    PyObject *const *args;
278
549k
    PyObject *kwnames;
279
549k
    args = _PyStack_UnpackDict(tstate,
280
549k
                               _PyTuple_ITEMS(tuple), nargs,
281
549k
                               kwargs, &kwnames);
282
549k
    if (args == NULL) {
283
0
        return NULL;
284
0
    }
285
549k
    PyObject *result = func(callable, args,
286
549k
                            nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames);
287
549k
    _PyStack_UnpackDict_Free(args, nargs, kwnames);
288
289
549k
    return _Py_CheckFunctionResult(tstate, callable, result, NULL);
290
549k
}
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
206M
{
326
206M
    PyThreadState *tstate = _PyThreadState_GET();
327
206M
    return _PyObject_VectorcallTstate(tstate, callable,
328
206M
                                      args, nargsf, kwnames);
329
206M
}
330
331
332
PyObject *
333
_PyObject_Call(PyThreadState *tstate, PyObject *callable,
334
               PyObject *args, PyObject *kwargs)
335
32.2M
{
336
32.2M
    ternaryfunc call;
337
32.2M
    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
32.2M
    assert(!_PyErr_Occurred(tstate));
343
32.2M
    assert(PyTuple_Check(args));
344
32.2M
    assert(kwargs == NULL || PyDict_Check(kwargs));
345
32.2M
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, callable);
346
32.2M
    vectorcallfunc vector_func = PyVectorcall_Function(callable);
347
32.2M
    if (vector_func != NULL) {
348
24.2M
        return _PyVectorcall_Call(tstate, vector_func, callable, args, kwargs);
349
24.2M
    }
350
7.97M
    else {
351
7.97M
        call = Py_TYPE(callable)->tp_call;
352
7.97M
        if (call == NULL) {
353
0
            object_is_not_callable(tstate, callable);
354
0
            return NULL;
355
0
        }
356
357
7.97M
        if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object")) {
358
0
            return NULL;
359
0
        }
360
361
7.97M
        result = (*call)(callable, args, kwargs);
362
363
7.97M
        _Py_LeaveRecursiveCallTstate(tstate);
364
365
7.97M
        return _Py_CheckFunctionResult(tstate, callable, result, NULL);
366
7.97M
    }
367
32.2M
}
368
369
PyObject *
370
PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
371
32.1M
{
372
32.1M
    PyThreadState *tstate = _PyThreadState_GET();
373
32.1M
    return _PyObject_Call(tstate, callable, args, kwargs);
374
32.1M
}
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
55.1M
{
388
55.1M
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func);
389
55.1M
    assert(arg != NULL);
390
55.1M
    PyObject *_args[2];
391
55.1M
    PyObject **args = _args + 1;  // For PY_VECTORCALL_ARGUMENTS_OFFSET
392
55.1M
    args[0] = arg;
393
55.1M
    PyThreadState *tstate = _PyThreadState_GET();
394
55.1M
    size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET;
395
55.1M
    return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL);
396
55.1M
}
397
398
399
/* --- PyFunction call functions ---------------------------------- */
400
401
PyObject *
402
_PyFunction_Vectorcall(PyObject *func, PyObject* const* stack,
403
                       size_t nargsf, PyObject *kwnames)
404
158M
{
405
158M
    assert(PyFunction_Check(func));
406
158M
    PyFunctionObject *f = (PyFunctionObject *)func;
407
158M
    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
408
158M
    assert(nargs >= 0);
409
158M
    PyThreadState *tstate = _PyThreadState_GET();
410
158M
    assert(nargs == 0 || stack != NULL);
411
158M
    EVAL_CALL_STAT_INC(EVAL_CALL_FUNCTION_VECTORCALL);
412
158M
    if (((PyCodeObject *)f->func_code)->co_flags & CO_OPTIMIZED) {
413
158M
        return _PyEval_Vector(tstate, f, NULL, stack, nargs, kwnames);
414
158M
    }
415
0
    else {
416
0
        return _PyEval_Vector(tstate, f, f->func_globals, stack, nargs, kwnames);
417
0
    }
418
158M
}
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
119k
{
462
119k
    PyThreadState *tstate = _PyThreadState_GET();
463
119k
    assert(!_PyErr_Occurred(tstate));
464
119k
    if (args == NULL) {
465
0
        return _PyObject_CallNoArgsTstate(tstate, callable);
466
0
    }
467
119k
    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
119k
    return _PyObject_Call(tstate, callable, args, NULL);
473
119k
}
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
41.7M
{
481
41.7M
    assert(PyTuple_Check(args));
482
483
41.7M
    PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
484
41.7M
    PyObject **stack;
485
486
41.7M
    Py_ssize_t argcount = PyTuple_GET_SIZE(args);
487
41.7M
    if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
488
41.6M
        stack = small_stack;
489
41.6M
    }
490
66.7k
    else {
491
66.7k
        stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *));
492
66.7k
        if (stack == NULL) {
493
0
            PyErr_NoMemory();
494
0
            return NULL;
495
0
        }
496
66.7k
    }
497
498
    /* use borrowed references */
499
41.7M
    stack[0] = obj;
500
41.7M
    memcpy(&stack[1],
501
41.7M
           _PyTuple_ITEMS(args),
502
41.7M
           argcount * sizeof(PyObject *));
503
504
41.7M
    PyObject *result = _PyObject_VectorcallDictTstate(tstate, callable,
505
41.7M
                                                      stack, argcount + 1,
506
41.7M
                                                      kwargs);
507
41.7M
    if (stack != small_stack) {
508
66.7k
        PyMem_Free(stack);
509
66.7k
    }
510
41.7M
    return result;
511
41.7M
}
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
4.17M
{
520
4.17M
    PyObject* small_stack[_PY_FASTCALL_SMALL_STACK];
521
4.17M
    const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack);
522
4.17M
    PyObject **stack;
523
4.17M
    Py_ssize_t nargs, i;
524
4.17M
    PyObject *result;
525
526
4.17M
    if (callable == NULL) {
527
0
        return null_error(tstate);
528
0
    }
529
530
4.17M
    if (!format || !*format) {
531
1.71k
        return _PyObject_CallNoArgsTstate(tstate, callable);
532
1.71k
    }
533
534
4.17M
    stack = _Py_VaBuildStack(small_stack, small_stack_len,
535
4.17M
                             format, va, &nargs);
536
4.17M
    if (stack == NULL) {
537
0
        return NULL;
538
0
    }
539
4.17M
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, callable);
540
4.17M
    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
128
        PyObject *args = stack[0];
546
128
        result = _PyObject_VectorcallTstate(tstate, callable,
547
128
                                            _PyTuple_ITEMS(args),
548
128
                                            PyTuple_GET_SIZE(args),
549
128
                                            NULL);
550
128
    }
551
4.17M
    else {
552
4.17M
        result = _PyObject_VectorcallTstate(tstate, callable,
553
4.17M
                                            stack, nargs, NULL);
554
4.17M
    }
555
556
18.7M
    for (i = 0; i < nargs; ++i) {
557
14.5M
        Py_DECREF(stack[i]);
558
14.5M
    }
559
4.17M
    if (stack != small_stack) {
560
192
        PyMem_Free(stack);
561
192
    }
562
4.17M
    return result;
563
4.17M
}
564
565
566
PyObject *
567
PyObject_CallFunction(PyObject *callable, const char *format, ...)
568
2.21M
{
569
2.21M
    va_list va;
570
2.21M
    PyObject *result;
571
2.21M
    PyThreadState *tstate = _PyThreadState_GET();
572
573
2.21M
    va_start(va, format);
574
2.21M
    result = _PyObject_CallFunctionVa(tstate, callable, format, va);
575
2.21M
    va_end(va);
576
577
2.21M
    return result;
578
2.21M
}
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
1.96M
{
618
1.96M
    assert(callable != NULL);
619
1.96M
    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
1.96M
    return _PyObject_CallFunctionVa(tstate, callable, format, va);
627
1.96M
}
628
629
PyObject *
630
PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
631
1.75k
{
632
1.75k
    PyThreadState *tstate = _PyThreadState_GET();
633
634
1.75k
    if (obj == NULL || name == NULL) {
635
0
        return null_error(tstate);
636
0
    }
637
638
1.75k
    PyObject *callable = PyObject_GetAttrString(obj, name);
639
1.75k
    if (callable == NULL) {
640
0
        return NULL;
641
0
    }
642
643
1.75k
    va_list va;
644
1.75k
    va_start(va, format);
645
1.75k
    PyObject *retval = callmethod(tstate, callable, format, va);
646
1.75k
    va_end(va);
647
648
1.75k
    Py_DECREF(callable);
649
1.75k
    return retval;
650
1.75k
}
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
1.96M
{
682
1.96M
    PyThreadState *tstate = _PyThreadState_GET();
683
1.96M
    if (obj == NULL || name == NULL) {
684
0
        return null_error(tstate);
685
0
    }
686
687
1.96M
    PyObject *callable = PyObject_GetAttr(obj, name);
688
1.96M
    if (callable == NULL) {
689
0
        return NULL;
690
0
    }
691
692
1.96M
    va_list va;
693
1.96M
    va_start(va, format);
694
1.96M
    PyObject *retval = callmethod(tstate, callable, format, va);
695
1.96M
    va_end(va);
696
697
1.96M
    Py_DECREF(callable);
698
1.96M
    return retval;
699
1.96M
}
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
117k
{
773
117k
    PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
774
117k
    PyObject **stack;
775
117k
    Py_ssize_t nargs;
776
117k
    PyObject *result;
777
117k
    Py_ssize_t i;
778
117k
    va_list countva;
779
780
117k
    if (callable == NULL) {
781
0
        return null_error(tstate);
782
0
    }
783
784
    /* Count the number of arguments */
785
117k
    va_copy(countva, vargs);
786
117k
    nargs = base ? 1 : 0;
787
475k
    while (1) {
788
475k
        PyObject *arg = va_arg(countva, PyObject *);
789
475k
        if (arg == NULL) {
790
117k
            break;
791
117k
        }
792
357k
        nargs++;
793
357k
    }
794
117k
    va_end(countva);
795
796
    /* Copy arguments */
797
117k
    if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
798
77.1k
        stack = small_stack;
799
77.1k
    }
800
40.0k
    else {
801
40.0k
        stack = PyMem_Malloc(nargs * sizeof(stack[0]));
802
40.0k
        if (stack == NULL) {
803
0
            PyErr_NoMemory();
804
0
            return NULL;
805
0
        }
806
40.0k
    }
807
808
117k
    i = 0;
809
117k
    if (base) {
810
48.2k
        stack[i++] = base;
811
48.2k
    }
812
813
475k
    for (; i < nargs; ++i) {
814
357k
        stack[i] = va_arg(vargs, PyObject *);
815
357k
    }
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
117k
    result = _PyObject_VectorcallTstate(tstate, callable, stack, nargs, NULL);
824
825
117k
    if (stack != small_stack) {
826
40.0k
        PyMem_Free(stack);
827
40.0k
    }
828
117k
    return result;
829
117k
}
830
831
832
PyObject *
833
PyObject_VectorcallMethod(PyObject *name, PyObject *const *args,
834
                           size_t nargsf, PyObject *kwnames)
835
4.62M
{
836
4.62M
    assert(name != NULL);
837
4.62M
    assert(args != NULL);
838
4.62M
    assert(PyVectorcall_NARGS(nargsf) >= 1);
839
840
4.62M
    PyThreadState *tstate = _PyThreadState_GET();
841
4.62M
    _PyCStackRef method;
842
4.62M
    _PyThreadState_PushCStackRef(tstate, &method);
843
    /* Use args[0] as "self" argument */
844
4.62M
    int unbound = _PyObject_GetMethodStackRef(tstate, args[0], name, &method.ref);
845
4.62M
    if (PyStackRef_IsNull(method.ref)) {
846
0
        _PyThreadState_PopCStackRef(tstate, &method);
847
0
        return NULL;
848
0
    }
849
4.62M
    PyObject *callable = PyStackRef_AsPyObjectBorrow(method.ref);
850
851
4.62M
    if (unbound) {
852
        /* We must remove PY_VECTORCALL_ARGUMENTS_OFFSET since
853
         * that would be interpreted as allowing to change args[-1] */
854
4.59M
        nargsf &= ~PY_VECTORCALL_ARGUMENTS_OFFSET;
855
4.59M
    }
856
33.2k
    else {
857
        /* Skip "self". We can keep PY_VECTORCALL_ARGUMENTS_OFFSET since
858
         * args[-1] in the onward call is args[0] here. */
859
33.2k
        args++;
860
33.2k
        nargsf--;
861
33.2k
    }
862
4.62M
    EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_METHOD, callable);
863
4.62M
    PyObject *result = _PyObject_VectorcallTstate(tstate, callable,
864
4.62M
                                                  args, nargsf, kwnames);
865
4.62M
    _PyThreadState_PopCStackRef(tstate, &method);
866
4.62M
    return result;
867
4.62M
}
868
869
870
PyObject *
871
PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)
872
57.7k
{
873
57.7k
    PyThreadState *tstate = _PyThreadState_GET();
874
57.7k
    if (obj == NULL || name == NULL) {
875
0
        return null_error(tstate);
876
0
    }
877
878
57.7k
    _PyCStackRef method;
879
57.7k
    _PyThreadState_PushCStackRef(tstate, &method);
880
57.7k
    int is_method = _PyObject_GetMethodStackRef(tstate, obj, name, &method.ref);
881
57.7k
    if (PyStackRef_IsNull(method.ref)) {
882
0
        _PyThreadState_PopCStackRef(tstate, &method);
883
0
        return NULL;
884
0
    }
885
57.7k
    PyObject *callable = PyStackRef_AsPyObjectBorrow(method.ref);
886
57.7k
    obj = is_method ? obj : NULL;
887
888
57.7k
    va_list vargs;
889
57.7k
    va_start(vargs, name);
890
57.7k
    PyObject *result = object_vacall(tstate, obj, callable, vargs);
891
57.7k
    va_end(vargs);
892
893
57.7k
    _PyThreadState_PopCStackRef(tstate, &method);
894
57.7k
    return result;
895
57.7k
}
896
897
898
PyObject *
899
PyObject_CallFunctionObjArgs(PyObject *callable, ...)
900
59.4k
{
901
59.4k
    PyThreadState *tstate = _PyThreadState_GET();
902
59.4k
    va_list vargs;
903
59.4k
    PyObject *result;
904
905
59.4k
    va_start(vargs, callable);
906
59.4k
    result = object_vacall(tstate, NULL, callable, vargs);
907
59.4k
    va_end(vargs);
908
909
59.4k
    return result;
910
59.4k
}
911
912
913
/* --- PyStack functions ------------------------------------------ */
914
915
PyObject *
916
_PyStack_AsDict(PyObject *const *values, PyObject *kwnames)
917
6.76M
{
918
6.76M
    Py_ssize_t nkwargs;
919
920
6.76M
    assert(kwnames != NULL);
921
6.76M
    nkwargs = PyTuple_GET_SIZE(kwnames);
922
6.76M
    return _PyDict_FromItems(&PyTuple_GET_ITEM(kwnames, 0), 1,
923
6.76M
                             values, 1, nkwargs);
924
6.76M
}
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
7.08M
{
948
7.08M
    assert(nargs >= 0);
949
7.08M
    assert(kwargs != NULL);
950
7.08M
    assert(PyDict_Check(kwargs));
951
952
7.08M
    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
7.08M
    Py_ssize_t maxnargs = PY_SSIZE_T_MAX / sizeof(args[0]) - 1;
957
7.08M
    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
7.08M
    PyObject **stack = PyMem_Malloc((1 + nargs + nkwargs) * sizeof(args[0]));
964
7.08M
    if (stack == NULL) {
965
0
        _PyErr_NoMemory(tstate);
966
0
        return NULL;
967
0
    }
968
969
7.08M
    PyObject *kwnames = PyTuple_New(nkwargs);
970
7.08M
    if (kwnames == NULL) {
971
0
        PyMem_Free(stack);
972
0
        return NULL;
973
0
    }
974
975
7.08M
    stack++;  /* For PY_VECTORCALL_ARGUMENTS_OFFSET */
976
977
    /* Copy positional arguments (borrowed references) */
978
14.3M
    for (Py_ssize_t i = 0; i < nargs; i++) {
979
7.22M
        stack[i] = args[i];
980
7.22M
    }
981
982
7.08M
    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
7.08M
    Py_ssize_t pos = 0, i = 0;
987
7.08M
    PyObject *key, *value;
988
7.08M
    unsigned long keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS;
989
15.1M
    while (PyDict_Next(kwargs, &pos, &key, &value)) {
990
8.06M
        keys_are_strings &= Py_TYPE(key)->tp_flags;
991
8.06M
        PyTuple_SET_ITEM(kwnames, i, Py_NewRef(key));
992
8.06M
        kwstack[i] = Py_NewRef(value);
993
8.06M
        i++;
994
8.06M
    }
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
7.08M
    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
7.08M
    *p_kwnames = kwnames;
1009
7.08M
    return stack;
1010
7.08M
}
1011
1012
void
1013
_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs,
1014
                         PyObject *kwnames)
1015
7.08M
{
1016
    /* Only decref kwargs values, positional args are borrowed */
1017
7.08M
    Py_ssize_t nkwargs = PyTuple_GET_SIZE(kwnames);
1018
15.1M
    for (Py_ssize_t i = 0; i < nkwargs; i++) {
1019
8.06M
        Py_DECREF(stack[nargs + i]);
1020
8.06M
    }
1021
7.08M
    _PyStack_UnpackDict_FreeNoDecRef(stack, kwnames);
1022
7.08M
}
1023
1024
void
1025
_PyStack_UnpackDict_FreeNoDecRef(PyObject *const *stack, PyObject *kwnames)
1026
7.08M
{
1027
7.08M
    PyMem_Free((PyObject **)stack - 1);
1028
7.08M
    Py_DECREF(kwnames);
1029
7.08M
}
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
}