Coverage Report

Created: 2026-10-17 06:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython/Python/getargs.c
Line
Count
Source
1
2
/* New getargs implementation */
3
4
#define PY_CXX_CONST const
5
#include "Python.h"
6
#include "pycore_abstract.h"      // _PyNumber_Index()
7
#include "pycore_dict.h"          // _PyDict_HasOnlyStringKeys()
8
#include "pycore_modsupport.h"    // export _PyArg_NoKeywords()
9
#include "pycore_pylifecycle.h"   // _PyArg_Fini
10
#include "pycore_pystate.h"       // _Py_IsMainInterpreter()
11
#include "pycore_tuple.h"         // _PyTuple_ITEMS()
12
#include "pycore_pyerrors.h"      // _Py_CalculateSuggestions()
13
#include "pycore_unicodeobject.h" // _PyUnicode_InternImmortal
14
15
/* Export Stable ABIs (abi only) */
16
PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, const char *, ...);
17
PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *, const char *, ...);
18
PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
19
                                                  const char *, const char * const *, ...);
20
PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *, const char *, va_list);
21
PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
22
                                              const char *, const char * const *, va_list);
23
24
36.1M
#define FLAG_COMPAT 1
25
26
typedef int (*destr_t)(PyObject *, void *);
27
28
29
/* Keep track of "objects" that have been allocated or initialized and
30
   which will need to be deallocated or cleaned up somehow if overall
31
   parsing fails.
32
*/
33
typedef struct {
34
  void *item;
35
  destr_t destructor;
36
} freelistentry_t;
37
38
typedef struct {
39
  freelistentry_t *entries;
40
  int first_available;
41
  int entries_malloced;
42
} freelist_t;
43
44
13.9M
#define STATIC_FREELIST_ENTRIES 8
45
46
/* Forward */
47
static int vgetargs1_impl(PyObject *args, PyObject *const *stack, Py_ssize_t nargs,
48
                          const char *format, va_list *p_va, int flags);
49
static int vgetargs1(PyObject *, const char *, va_list *, int);
50
static void seterror(Py_ssize_t, const char *, int *, const char *, const char *);
51
static const char *convertitem(PyObject *, const char **, va_list *, int, int *,
52
                               char *, size_t, freelist_t *);
53
static const char *converttuple(PyObject *, const char **, va_list *, int,
54
                                int *, char *, size_t, freelist_t *);
55
static const char *convertsimple(PyObject *, const char **, va_list *, int,
56
                                 char *, size_t, freelist_t *);
57
static Py_ssize_t convertbuffer(PyObject *, const void **p, const char **);
58
static int getbuffer(PyObject *, Py_buffer *, const char**);
59
60
static int
61
vgetargskeywords(PyObject *args, PyObject *kwargs,
62
                 const char *format, const char * const *kwlist,
63
                 va_list *p_va, int flags);
64
static int
65
vgetargskeywords_impl(PyObject *const *args, Py_ssize_t nargs,
66
                      PyObject *kwargs, PyObject *kwnames,
67
                      const char *format, const char * const *kwlist,
68
                      va_list *p_va, int flags);
69
static int vgetargskeywordsfast(PyObject *, PyObject *,
70
                            struct _PyArg_Parser *, va_list *, int);
71
static int vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs,
72
                          PyObject *keywords, PyObject *kwnames,
73
                          struct _PyArg_Parser *parser,
74
                          va_list *p_va, int flags);
75
static const char *skipitem(const char **, va_list *, int);
76
77
int
78
PyArg_Parse(PyObject *args, const char *format, ...)
79
1.08M
{
80
1.08M
    int retval;
81
1.08M
    va_list va;
82
83
1.08M
    va_start(va, format);
84
1.08M
    retval = vgetargs1(args, format, &va, FLAG_COMPAT);
85
1.08M
    va_end(va);
86
1.08M
    return retval;
87
1.08M
}
88
89
PyAPI_FUNC(int)
90
_PyArg_Parse_SizeT(PyObject *args, const char *format, ...)
91
0
{
92
0
    int retval;
93
0
    va_list va;
94
95
0
    va_start(va, format);
96
0
    retval = vgetargs1(args, format, &va, FLAG_COMPAT);
97
0
    va_end(va);
98
0
    return retval;
99
0
}
100
101
102
int
103
PyArg_ParseTuple(PyObject *args, const char *format, ...)
104
10.6M
{
105
10.6M
    int retval;
106
10.6M
    va_list va;
107
108
10.6M
    va_start(va, format);
109
10.6M
    retval = vgetargs1(args, format, &va, 0);
110
10.6M
    va_end(va);
111
10.6M
    return retval;
112
10.6M
}
113
114
int
115
_PyArg_ParseTuple_SizeT(PyObject *args, const char *format, ...)
116
0
{
117
0
    int retval;
118
0
    va_list va;
119
120
0
    va_start(va, format);
121
0
    retval = vgetargs1(args, format, &va, 0);
122
0
    va_end(va);
123
0
    return retval;
124
0
}
125
126
127
int
128
PyArg_ParseArray(PyObject *const *args, Py_ssize_t nargs, const char *format, ...)
129
0
{
130
0
    va_list va;
131
0
    va_start(va, format);
132
0
    int retval = vgetargs1_impl(NULL, args, nargs, format, &va, 0);
133
0
    va_end(va);
134
0
    return retval;
135
0
}
136
137
int
138
PyArg_ParseArrayAndKeywords(PyObject *const *args, Py_ssize_t nargs,
139
                            PyObject *kwnames,
140
                            const char *format,
141
                            const char * const *kwlist, ...)
142
0
{
143
0
    if ((args == NULL && nargs != 0) ||
144
0
        (kwnames != NULL && !PyTuple_Check(kwnames)) ||
145
0
        format == NULL ||
146
0
        kwlist == NULL)
147
0
    {
148
0
        PyErr_BadInternalCall();
149
0
        return 0;
150
0
    }
151
152
0
    va_list va;
153
0
    va_start(va, kwlist);
154
0
    int retval = vgetargskeywords_impl(args, nargs, NULL, kwnames, format,
155
0
                                       kwlist, &va, 0);
156
0
    va_end(va);
157
0
    return retval;
158
0
}
159
160
161
int
162
PyArg_VaParse(PyObject *args, const char *format, va_list va)
163
0
{
164
0
    va_list lva;
165
0
    int retval;
166
167
0
    va_copy(lva, va);
168
169
0
    retval = vgetargs1(args, format, &lva, 0);
170
0
    va_end(lva);
171
0
    return retval;
172
0
}
173
174
int
175
_PyArg_VaParse_SizeT(PyObject *args, const char *format, va_list va)
176
0
{
177
0
    va_list lva;
178
0
    int retval;
179
180
0
    va_copy(lva, va);
181
182
0
    retval = vgetargs1(args, format, &lva, 0);
183
0
    va_end(lva);
184
0
    return retval;
185
0
}
186
187
188
/* Handle cleanup of allocated memory in case of exception */
189
190
static int
191
cleanup_ptr(PyObject *self, void *ptr)
192
0
{
193
0
    void **pptr = (void **)ptr;
194
0
    PyMem_Free(*pptr);
195
0
    *pptr = NULL;
196
0
    return 0;
197
0
}
198
199
static int
200
cleanup_buffer(PyObject *self, void *ptr)
201
0
{
202
0
    Py_buffer *buf = (Py_buffer *)ptr;
203
0
    if (buf) {
204
0
        PyBuffer_Release(buf);
205
0
    }
206
0
    return 0;
207
0
}
208
209
static int
210
addcleanup(void *ptr, freelist_t *freelist, destr_t destructor)
211
0
{
212
0
    int index;
213
214
0
    index = freelist->first_available;
215
0
    freelist->first_available += 1;
216
217
0
    freelist->entries[index].item = ptr;
218
0
    freelist->entries[index].destructor = destructor;
219
220
0
    return 0;
221
0
}
222
223
static int
224
cleanreturn(int retval, freelist_t *freelist)
225
13.9M
{
226
13.9M
    int index;
227
228
13.9M
    if (retval == 0) {
229
      /* A failure occurred, therefore execute all of the cleanup
230
         functions.
231
      */
232
144
      for (index = 0; index < freelist->first_available; ++index) {
233
0
          freelist->entries[index].destructor(NULL,
234
0
                                              freelist->entries[index].item);
235
0
      }
236
144
    }
237
13.9M
    if (freelist->entries_malloced)
238
13.2k
        PyMem_Free(freelist->entries);
239
13.9M
    return retval;
240
13.9M
}
241
242
243
static int
244
vgetargs1_impl(PyObject *compat_args, PyObject *const *stack, Py_ssize_t nargs, const char *format,
245
               va_list *p_va, int flags)
246
11.6M
{
247
11.6M
    char msgbuf[256];
248
11.6M
    int levels[32];
249
11.6M
    const char *fname = NULL;
250
11.6M
    const char *message = NULL;
251
11.6M
    int min = -1;
252
11.6M
    int max = 0;
253
11.6M
    int level = 0;
254
11.6M
    int endfmt = 0;
255
11.6M
    const char *formatsave = format;
256
11.6M
    Py_ssize_t i;
257
11.6M
    const char *msg;
258
11.6M
    int compat = flags & FLAG_COMPAT;
259
11.6M
    freelistentry_t static_entries[STATIC_FREELIST_ENTRIES];
260
11.6M
    freelist_t freelist;
261
262
11.6M
    assert(nargs == 0 || stack != NULL);
263
264
11.6M
    freelist.entries = static_entries;
265
11.6M
    freelist.first_available = 0;
266
11.6M
    freelist.entries_malloced = 0;
267
268
11.6M
    flags = flags & ~FLAG_COMPAT;
269
270
67.5M
    while (endfmt == 0) {
271
55.8M
        int c = *format++;
272
55.8M
        switch (c) {
273
0
        case '(':
274
0
            if (level == 0)
275
0
                max++;
276
0
            level++;
277
0
            if (level >= 30)
278
0
                Py_FatalError("too many tuple nesting levels "
279
0
                              "in argument format string");
280
0
            break;
281
0
        case ')':
282
0
            if (level == 0)
283
0
                Py_FatalError("excess ')' in getargs format");
284
0
            else
285
0
                level--;
286
0
            break;
287
5.57M
        case '\0':
288
5.57M
            endfmt = 1;
289
5.57M
            break;
290
4.75M
        case ':':
291
4.75M
            fname = format;
292
4.75M
            endfmt = 1;
293
4.75M
            break;
294
1.36M
        case ';':
295
1.36M
            message = format;
296
1.36M
            endfmt = 1;
297
1.36M
            break;
298
4.58M
        case '|':
299
4.58M
            if (level == 0)
300
4.58M
                min = max;
301
4.58M
            break;
302
39.5M
        default:
303
39.5M
            if (level == 0) {
304
39.5M
                if (Py_ISALPHA(c))
305
39.3M
                    if (c != 'e') /* skip encoded */
306
39.3M
                        max++;
307
39.5M
            }
308
39.5M
            break;
309
55.8M
        }
310
55.8M
    }
311
312
11.6M
    if (level != 0)
313
0
        Py_FatalError(/* '(' */ "missing ')' in getargs format");
314
315
11.6M
    if (min < 0)
316
7.11M
        min = max;
317
318
11.6M
    format = formatsave;
319
320
11.6M
    if (max > STATIC_FREELIST_ENTRIES) {
321
0
        freelist.entries = PyMem_NEW(freelistentry_t, max);
322
0
        if (freelist.entries == NULL) {
323
0
            PyErr_NoMemory();
324
0
            return 0;
325
0
        }
326
0
        freelist.entries_malloced = 1;
327
0
    }
328
329
11.6M
    if (compat) {
330
1.08M
        if (max == 0) {
331
0
            if (compat_args == NULL)
332
0
                return 1;
333
0
            PyErr_Format(PyExc_TypeError,
334
0
                         "%.200s%s takes no arguments",
335
0
                         fname==NULL ? "function" : fname,
336
0
                         fname==NULL ? "" : "()");
337
0
            return cleanreturn(0, &freelist);
338
0
        }
339
1.08M
        else if (min == 1 && max == 1) {
340
1.08M
            if (compat_args == NULL) {
341
0
                PyErr_Format(PyExc_TypeError,
342
0
                             "%.200s%s takes at least one argument",
343
0
                             fname==NULL ? "function" : fname,
344
0
                             fname==NULL ? "" : "()");
345
0
                return cleanreturn(0, &freelist);
346
0
            }
347
1.08M
            msg = convertitem(compat_args, &format, p_va, flags, levels,
348
1.08M
                              msgbuf, sizeof(msgbuf), &freelist);
349
1.08M
            if (msg == NULL)
350
1.08M
                return cleanreturn(1, &freelist);
351
0
            seterror(levels[0], msg, levels+1, fname, message);
352
0
            return cleanreturn(0, &freelist);
353
1.08M
        }
354
0
        else {
355
0
            PyErr_SetString(PyExc_SystemError,
356
0
                "old style getargs format uses new features");
357
0
            return cleanreturn(0, &freelist);
358
0
        }
359
1.08M
    }
360
361
10.6M
    if (nargs < min || max < nargs) {
362
0
        if (message == NULL)
363
0
            PyErr_Format(PyExc_TypeError,
364
0
                         "%.150s%s takes %s %d argument%s (%zd given)",
365
0
                         fname==NULL ? "function" : fname,
366
0
                         fname==NULL ? "" : "()",
367
0
                         min==max ? "exactly"
368
0
                         : nargs < min ? "at least" : "at most",
369
0
                         nargs < min ? min : max,
370
0
                         (nargs < min ? min : max) == 1 ? "" : "s",
371
0
                         nargs);
372
0
        else
373
0
            PyErr_SetString(PyExc_TypeError, message);
374
0
        return cleanreturn(0, &freelist);
375
0
    }
376
377
44.3M
    for (i = 0; i < nargs; i++) {
378
33.7M
        if (*format == '|')
379
60.7k
            format++;
380
33.7M
        msg = convertitem(stack[i], &format, p_va,
381
33.7M
                          flags, levels, msgbuf,
382
33.7M
                          sizeof(msgbuf), &freelist);
383
33.7M
        if (msg) {
384
144
            seterror(i+1, msg, levels, fname, message);
385
144
            return cleanreturn(0, &freelist);
386
144
        }
387
33.7M
    }
388
389
10.6M
    if (*format != '\0' && !Py_ISALPHA(*format) &&
390
5.03M
        *format != '(' &&
391
5.03M
        *format != '|' && *format != ':' && *format != ';') {
392
0
        PyErr_Format(PyExc_SystemError,
393
0
                     "bad format string: %.200s", formatsave);
394
0
        return cleanreturn(0, &freelist);
395
0
    }
396
397
10.6M
    return cleanreturn(1, &freelist);
398
10.6M
}
399
400
static int
401
vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)
402
11.6M
{
403
11.6M
    PyObject **stack;
404
11.6M
    Py_ssize_t nargs;
405
406
11.6M
    if (!(flags & FLAG_COMPAT)) {
407
10.6M
        assert(args != NULL);
408
409
10.6M
        if (!PyTuple_Check(args)) {
410
0
            PyErr_SetString(PyExc_SystemError,
411
0
                "new style getargs format but argument is not a tuple");
412
0
            return 0;
413
0
        }
414
415
10.6M
        stack = _PyTuple_ITEMS(args);
416
10.6M
        nargs = PyTuple_GET_SIZE(args);
417
10.6M
    }
418
1.08M
    else {
419
1.08M
        stack = NULL;
420
1.08M
        nargs = 0;
421
1.08M
    }
422
423
11.6M
    return vgetargs1_impl(args, stack, nargs, format, p_va, flags);
424
11.6M
}
425
426
427
static void
428
seterror(Py_ssize_t iarg, const char *msg, int *levels, const char *fname,
429
         const char *message)
430
144
{
431
144
    char buf[512];
432
144
    int i;
433
144
    char *p = buf;
434
435
144
    if (PyErr_Occurred())
436
144
        return;
437
0
    else if (message == NULL) {
438
0
        if (fname != NULL) {
439
0
            PyOS_snprintf(p, sizeof(buf), "%.200s() ", fname);
440
0
            p += strlen(p);
441
0
        }
442
0
        if (iarg != 0) {
443
0
            PyOS_snprintf(p, sizeof(buf) - (p - buf),
444
0
                          "argument %zd", iarg);
445
0
            i = 0;
446
0
            p += strlen(p);
447
0
            while (i < 32 && levels[i] > 0 && (int)(p-buf) < 220) {
448
0
                PyOS_snprintf(p, sizeof(buf) - (p - buf),
449
0
                              ", item %d", levels[i]-1);
450
0
                p += strlen(p);
451
0
                i++;
452
0
            }
453
0
        }
454
0
        else {
455
0
            PyOS_snprintf(p, sizeof(buf) - (p - buf), "argument");
456
0
            p += strlen(p);
457
0
        }
458
0
        PyOS_snprintf(p, sizeof(buf) - (p - buf), " %.256s", msg);
459
0
        message = buf;
460
0
    }
461
0
    if (msg[0] == '(') {
462
0
        PyErr_SetString(PyExc_SystemError, message);
463
0
    }
464
0
    else {
465
0
        PyErr_SetString(PyExc_TypeError, message);
466
0
    }
467
0
}
468
469
470
/* Convert a tuple argument.
471
   On entry, *p_format points to the character _after_ the opening '('.
472
   On successful exit, *p_format points to the closing ')'.
473
   If successful:
474
      *p_format and *p_va are updated,
475
      *levels and *msgbuf are untouched,
476
      and NULL is returned.
477
   If the argument is invalid:
478
      *p_format is unchanged,
479
      *p_va is undefined,
480
      *levels is a 0-terminated list of item numbers,
481
      *msgbuf contains an error message, whose format is:
482
     "must be <typename1>, not <typename2>", where:
483
        <typename1> is the name of the expected type, and
484
        <typename2> is the name of the actual type,
485
      and msgbuf is returned.
486
*/
487
488
static const char *
489
converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
490
             int *levels, char *msgbuf, size_t bufsize,
491
             freelist_t *freelist)
492
0
{
493
0
    int level = 0;
494
0
    int n = 0;
495
0
    const char *format = *p_format;
496
0
    int i;
497
0
    Py_ssize_t len;
498
0
    int istuple = PyTuple_Check(arg);
499
0
    int mustbetuple = istuple;
500
501
0
    for (;;) {
502
0
        int c = *format++;
503
0
        if (c == '(') {
504
0
            if (level == 0)
505
0
                n++;
506
0
            level++;
507
0
        }
508
0
        else if (c == ')') {
509
0
            if (level == 0)
510
0
                break;
511
0
            level--;
512
0
        }
513
0
        else if (c == ':' || c == ';' || c == '\0')
514
0
            break;
515
0
        else {
516
0
            if (level == 0 && Py_ISALPHA(c)) {
517
0
                n++;
518
0
            }
519
0
            if (c == 'e' && (*format == 's' || *format == 't')) {
520
0
                format++;
521
0
                continue;
522
0
            }
523
0
            if (!mustbetuple) {
524
0
                switch (c) {
525
0
                    case 'y':
526
0
                    case 's':
527
0
                    case 'z':
528
0
                        if (*format != '*') {
529
0
                            mustbetuple = 1;
530
0
                        }
531
0
                        break;
532
0
                    case 'S':
533
0
                    case 'Y':
534
0
                    case 'U':
535
0
                        mustbetuple = 1;
536
0
                        break;
537
0
                    case 'O':
538
0
                        if (*format != '&') {
539
0
                            mustbetuple = 1;
540
0
                        }
541
0
                        break;
542
0
                }
543
0
            }
544
0
        }
545
0
    }
546
547
0
    if (istuple) {
548
        /* fallthrough */
549
0
    }
550
0
    else if (!PySequence_Check(arg) ||
551
0
        PyUnicode_Check(arg) || PyBytes_Check(arg) || PyByteArray_Check(arg))
552
0
    {
553
0
        levels[0] = 0;
554
0
        PyOS_snprintf(msgbuf, bufsize,
555
0
                      "must be %d-item tuple, not %.50s",
556
0
                  n,
557
0
                  arg == Py_None ? "None" : Py_TYPE(arg)->tp_name);
558
0
        return msgbuf;
559
0
    }
560
0
    else {
561
0
        if (mustbetuple) {
562
0
            if (PyErr_WarnFormat(PyExc_DeprecationWarning, 0,
563
0
                    "argument must be %d-item tuple, not %T", n, arg))
564
0
            {
565
0
                return msgbuf;
566
0
            }
567
0
        }
568
0
        len = PySequence_Size(arg);
569
0
        if (len != n) {
570
0
            levels[0] = 0;
571
0
            PyOS_snprintf(msgbuf, bufsize,
572
0
                          "must be %s of length %d, not %zd",
573
0
                          mustbetuple ? "tuple" : "sequence", n, len);
574
0
            return msgbuf;
575
0
        }
576
0
        arg = PySequence_Tuple(arg);
577
0
        if (arg == NULL) {
578
0
            return msgbuf;
579
0
        }
580
0
    }
581
582
0
    len = PyTuple_GET_SIZE(arg);
583
0
    if (len != n) {
584
0
        levels[0] = 0;
585
0
        PyOS_snprintf(msgbuf, bufsize,
586
0
                      "must be tuple of length %d, not %zd",
587
0
                      n, len);
588
0
        if (!istuple) {
589
0
            Py_DECREF(arg);
590
0
        }
591
0
        return msgbuf;
592
0
    }
593
594
0
    format = *p_format;
595
0
    for (i = 0; i < n; i++) {
596
0
        const char *msg;
597
0
        PyObject *item = PyTuple_GET_ITEM(arg, i);
598
0
        msg = convertitem(item, &format, p_va, flags, levels+1,
599
0
                          msgbuf, bufsize, freelist);
600
0
        if (msg != NULL) {
601
0
            levels[0] = i+1;
602
0
            if (!istuple) {
603
0
                Py_DECREF(arg);
604
0
            }
605
0
            return msg;
606
0
        }
607
0
    }
608
609
0
    *p_format = format;
610
0
    if (!istuple) {
611
0
        Py_DECREF(arg);
612
0
    }
613
0
    return NULL;
614
0
}
615
616
617
/* Convert a single item. */
618
619
static const char *
620
convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags,
621
            int *levels, char *msgbuf, size_t bufsize, freelist_t *freelist)
622
34.9M
{
623
34.9M
    const char *msg;
624
34.9M
    const char *format = *p_format;
625
626
34.9M
    if (*format == '(' /* ')' */) {
627
0
        format++;
628
0
        msg = converttuple(arg, &format, p_va, flags, levels, msgbuf,
629
0
                           bufsize, freelist);
630
0
        if (msg == NULL)
631
0
            format++;
632
0
    }
633
34.9M
    else {
634
34.9M
        msg = convertsimple(arg, &format, p_va, flags,
635
34.9M
                            msgbuf, bufsize, freelist);
636
34.9M
        if (msg != NULL)
637
144
            levels[0] = 0;
638
34.9M
    }
639
34.9M
    if (msg == NULL)
640
34.9M
        *p_format = format;
641
34.9M
    return msg;
642
34.9M
}
643
644
645
646
/* Format an error message generated by convertsimple().
647
   displayname must be UTF-8 encoded.
648
*/
649
650
void
651
_PyArg_BadArgument(const char *fname, const char *displayname,
652
                   const char *expected, PyObject *arg)
653
0
{
654
0
    PyErr_Format(PyExc_TypeError,
655
0
                 "%.200s() %.200s must be %.50s, not %.50s",
656
0
                 fname, displayname, expected,
657
0
                 arg == Py_None ? "None" : Py_TYPE(arg)->tp_name);
658
0
}
659
660
static const char *
661
converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize)
662
0
{
663
0
    assert(expected != NULL);
664
0
    assert(arg != NULL);
665
0
    if (expected[0] == '(') {
666
0
        PyOS_snprintf(msgbuf, bufsize,
667
0
                      "%.100s", expected);
668
0
    }
669
0
    else {
670
0
        PyOS_snprintf(msgbuf, bufsize,
671
0
                      "must be %.50s, not %.50s", expected,
672
0
                      arg == Py_None ? "None" : Py_TYPE(arg)->tp_name);
673
0
    }
674
0
    return msgbuf;
675
0
}
676
677
static const char *
678
convertcharerr(const char *expected, const char *what, Py_ssize_t size,
679
               char *msgbuf, size_t bufsize)
680
0
{
681
0
    assert(expected != NULL);
682
0
    PyOS_snprintf(msgbuf, bufsize,
683
0
                  "must be %.50s, not %.50s of length %zd",
684
0
                  expected, what, size);
685
0
    return msgbuf;
686
0
}
687
688
0
#define CONV_UNICODE "(unicode conversion error)"
689
690
/* Convert a non-tuple argument.  Return NULL if conversion went OK,
691
   or a string with a message describing the failure.  The message is
692
   formatted as "must be <desired type>, not <actual type>".
693
   When failing, an exception may or may not have been raised.
694
   Don't call if a tuple is expected.
695
696
   When you add new format codes, please don't forget poor skipitem() below.
697
*/
698
699
static const char *
700
convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
701
              char *msgbuf, size_t bufsize, freelist_t *freelist)
702
34.9M
{
703
34.9M
#define RETURN_ERR_OCCURRED return msgbuf
704
705
34.9M
    const char *format = *p_format;
706
34.9M
    char c = *format++;
707
34.9M
    const char *sarg;
708
709
34.9M
    switch (c) {
710
711
1.06M
    case 'b': { /* unsigned byte -- very short int */
712
1.06M
        unsigned char *p = va_arg(*p_va, unsigned char *);
713
1.06M
        long ival = PyLong_AsLong(arg);
714
1.06M
        if (ival == -1 && PyErr_Occurred())
715
0
            RETURN_ERR_OCCURRED;
716
1.06M
        else if (ival < 0) {
717
0
            PyErr_SetString(PyExc_OverflowError,
718
0
                            "unsigned byte integer is less than minimum");
719
0
            RETURN_ERR_OCCURRED;
720
0
        }
721
1.06M
        else if (ival > UCHAR_MAX) {
722
0
            PyErr_SetString(PyExc_OverflowError,
723
0
                            "unsigned byte integer is greater than maximum");
724
0
            RETURN_ERR_OCCURRED;
725
0
        }
726
1.06M
        else
727
1.06M
            *p = (unsigned char) ival;
728
1.06M
        break;
729
1.06M
    }
730
731
1.06M
    case 'B': {/* byte sized bitfield - both signed and unsigned
732
                  values allowed */
733
0
        unsigned char *p = va_arg(*p_va, unsigned char *);
734
0
        Py_ssize_t bytes = PyLong_AsNativeBytes(arg, p, sizeof(unsigned char),
735
0
                Py_ASNATIVEBYTES_NATIVE_ENDIAN |
736
0
                Py_ASNATIVEBYTES_ALLOW_INDEX |
737
0
                Py_ASNATIVEBYTES_UNSIGNED_BUFFER);
738
0
        if (bytes < 0) {
739
0
            RETURN_ERR_OCCURRED;
740
0
        }
741
0
        if ((size_t)bytes > sizeof(unsigned char)) {
742
0
            if (PyErr_WarnEx(PyExc_DeprecationWarning,
743
0
                "integer value out of range", 1) < 0)
744
0
            {
745
0
                RETURN_ERR_OCCURRED;
746
0
            }
747
0
        }
748
0
        break;
749
0
    }
750
751
0
    case 'h': {/* signed short int */
752
0
        short *p = va_arg(*p_va, short *);
753
0
        long ival = PyLong_AsLong(arg);
754
0
        if (ival == -1 && PyErr_Occurred())
755
0
            RETURN_ERR_OCCURRED;
756
0
        else if (ival < SHRT_MIN) {
757
0
            PyErr_SetString(PyExc_OverflowError,
758
0
                            "signed short integer is less than minimum");
759
0
            RETURN_ERR_OCCURRED;
760
0
        }
761
0
        else if (ival > SHRT_MAX) {
762
0
            PyErr_SetString(PyExc_OverflowError,
763
0
                            "signed short integer is greater than maximum");
764
0
            RETURN_ERR_OCCURRED;
765
0
        }
766
0
        else
767
0
            *p = (short) ival;
768
0
        break;
769
0
    }
770
771
0
    case 'H': { /* short int sized bitfield, both signed and
772
                   unsigned allowed */
773
0
        unsigned short *p = va_arg(*p_va, unsigned short *);
774
0
        Py_ssize_t bytes = PyLong_AsNativeBytes(arg, p, sizeof(unsigned short),
775
0
                Py_ASNATIVEBYTES_NATIVE_ENDIAN |
776
0
                Py_ASNATIVEBYTES_ALLOW_INDEX |
777
0
                Py_ASNATIVEBYTES_UNSIGNED_BUFFER);
778
0
        if (bytes < 0) {
779
0
            RETURN_ERR_OCCURRED;
780
0
        }
781
0
        if ((size_t)bytes > sizeof(unsigned short)) {
782
0
            if (PyErr_WarnEx(PyExc_DeprecationWarning,
783
0
                "integer value out of range", 1) < 0)
784
0
            {
785
0
                RETURN_ERR_OCCURRED;
786
0
            }
787
0
        }
788
0
        break;
789
0
    }
790
791
19.5k
    case 'i': {/* signed int */
792
19.5k
        int *p = va_arg(*p_va, int *);
793
19.5k
        long ival = PyLong_AsLong(arg);
794
19.5k
        if (ival == -1 && PyErr_Occurred())
795
0
            RETURN_ERR_OCCURRED;
796
19.5k
        else if (ival > INT_MAX) {
797
0
            PyErr_SetString(PyExc_OverflowError,
798
0
                            "signed integer is greater than maximum");
799
0
            RETURN_ERR_OCCURRED;
800
0
        }
801
19.5k
        else if (ival < INT_MIN) {
802
0
            PyErr_SetString(PyExc_OverflowError,
803
0
                            "signed integer is less than minimum");
804
0
            RETURN_ERR_OCCURRED;
805
0
        }
806
19.5k
        else
807
19.5k
            *p = ival;
808
19.5k
        break;
809
19.5k
    }
810
811
19.5k
    case 'I': { /* int sized bitfield, both signed and
812
                   unsigned allowed */
813
0
        unsigned int *p = va_arg(*p_va, unsigned int *);
814
0
        Py_ssize_t bytes = PyLong_AsNativeBytes(arg, p, sizeof(unsigned int),
815
0
                Py_ASNATIVEBYTES_NATIVE_ENDIAN |
816
0
                Py_ASNATIVEBYTES_ALLOW_INDEX |
817
0
                Py_ASNATIVEBYTES_UNSIGNED_BUFFER);
818
0
        if (bytes < 0) {
819
0
            RETURN_ERR_OCCURRED;
820
0
        }
821
0
        if ((size_t)bytes > sizeof(unsigned int)) {
822
0
            if (PyErr_WarnEx(PyExc_DeprecationWarning,
823
0
                "integer value out of range", 1) < 0)
824
0
            {
825
0
                RETURN_ERR_OCCURRED;
826
0
            }
827
0
        }
828
0
        break;
829
0
    }
830
831
11.3M
    case 'n': /* Py_ssize_t */
832
11.3M
    {
833
11.3M
        PyObject *iobj;
834
11.3M
        Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *);
835
11.3M
        Py_ssize_t ival = -1;
836
11.3M
        iobj = _PyNumber_Index(arg);
837
11.3M
        if (iobj != NULL) {
838
11.3M
            ival = PyLong_AsSsize_t(iobj);
839
11.3M
            Py_DECREF(iobj);
840
11.3M
        }
841
11.3M
        if (ival == -1 && PyErr_Occurred())
842
144
            RETURN_ERR_OCCURRED;
843
11.3M
        *p = ival;
844
11.3M
        break;
845
11.3M
    }
846
0
    case 'l': {/* long int */
847
0
        long *p = va_arg(*p_va, long *);
848
0
        long ival = PyLong_AsLong(arg);
849
0
        if (ival == -1 && PyErr_Occurred())
850
0
            RETURN_ERR_OCCURRED;
851
0
        else
852
0
            *p = ival;
853
0
        break;
854
0
    }
855
856
0
    case 'k': { /* long sized bitfield */
857
0
        unsigned long *p = va_arg(*p_va, unsigned long *);
858
0
        if (!PyIndex_Check(arg)) {
859
0
            return converterr("int", arg, msgbuf, bufsize);
860
0
        }
861
0
        Py_ssize_t bytes = PyLong_AsNativeBytes(arg, p, sizeof(unsigned long),
862
0
                Py_ASNATIVEBYTES_NATIVE_ENDIAN |
863
0
                Py_ASNATIVEBYTES_ALLOW_INDEX |
864
0
                Py_ASNATIVEBYTES_UNSIGNED_BUFFER);
865
0
        if (bytes < 0) {
866
0
            RETURN_ERR_OCCURRED;
867
0
        }
868
0
        if ((size_t)bytes > sizeof(unsigned long)) {
869
0
            if (PyErr_WarnEx(PyExc_DeprecationWarning,
870
0
                "integer value out of range", 1) < 0)
871
0
            {
872
0
                RETURN_ERR_OCCURRED;
873
0
            }
874
0
        }
875
0
        break;
876
0
    }
877
878
0
    case 'L': {/* long long */
879
0
        long long *p = va_arg( *p_va, long long * );
880
0
        long long ival = PyLong_AsLongLong(arg);
881
0
        if (ival == (long long)-1 && PyErr_Occurred())
882
0
            RETURN_ERR_OCCURRED;
883
0
        else
884
0
            *p = ival;
885
0
        break;
886
0
    }
887
888
0
    case 'K': { /* long long sized bitfield */
889
0
        unsigned long long *p = va_arg(*p_va, unsigned long long *);
890
0
        if (!PyIndex_Check(arg)) {
891
0
            return converterr("int", arg, msgbuf, bufsize);
892
0
        }
893
0
        Py_ssize_t bytes = PyLong_AsNativeBytes(arg, p, sizeof(unsigned long long),
894
0
                Py_ASNATIVEBYTES_NATIVE_ENDIAN |
895
0
                Py_ASNATIVEBYTES_ALLOW_INDEX |
896
0
                Py_ASNATIVEBYTES_UNSIGNED_BUFFER);
897
0
        if (bytes < 0) {
898
0
            RETURN_ERR_OCCURRED;
899
0
        }
900
0
        if ((size_t)bytes > sizeof(unsigned long long)) {
901
0
            if (PyErr_WarnEx(PyExc_DeprecationWarning,
902
0
                "integer value out of range", 1) < 0)
903
0
            {
904
0
                RETURN_ERR_OCCURRED;
905
0
            }
906
0
        }
907
0
        break;
908
0
    }
909
910
0
    case 'f': {/* float */
911
0
        float *p = va_arg(*p_va, float *);
912
0
        double dval = PyFloat_AsDouble(arg);
913
0
        if (dval == -1.0 && PyErr_Occurred())
914
0
            RETURN_ERR_OCCURRED;
915
0
        else
916
0
            *p = (float) dval;
917
0
        break;
918
0
    }
919
920
0
    case 'd': {/* double */
921
0
        double *p = va_arg(*p_va, double *);
922
0
        double dval = PyFloat_AsDouble(arg);
923
0
        if (dval == -1.0 && PyErr_Occurred())
924
0
            RETURN_ERR_OCCURRED;
925
0
        else
926
0
            *p = dval;
927
0
        break;
928
0
    }
929
930
0
    case 'D': {/* complex double */
931
0
        Py_complex *p = va_arg(*p_va, Py_complex *);
932
0
        Py_complex cval;
933
0
        cval = PyComplex_AsCComplex(arg);
934
0
        if (PyErr_Occurred())
935
0
            RETURN_ERR_OCCURRED;
936
0
        else
937
0
            *p = cval;
938
0
        break;
939
0
    }
940
941
0
    case 'c': {/* char */
942
0
        char *p = va_arg(*p_va, char *);
943
0
        if (PyBytes_Check(arg)) {
944
0
            if (PyBytes_GET_SIZE(arg) != 1) {
945
0
                return convertcharerr("a byte string of length 1",
946
0
                                      "a bytes object", PyBytes_GET_SIZE(arg),
947
0
                                      msgbuf, bufsize);
948
0
            }
949
0
            *p = PyBytes_AS_STRING(arg)[0];
950
0
        }
951
0
        else if (PyByteArray_Check(arg)) {
952
0
            if (PyByteArray_GET_SIZE(arg) != 1) {
953
0
                return convertcharerr("a byte string of length 1",
954
0
                                      "a bytearray object", PyByteArray_GET_SIZE(arg),
955
0
                                      msgbuf, bufsize);
956
0
            }
957
0
            *p = PyByteArray_AS_STRING(arg)[0];
958
0
        }
959
0
        else
960
0
            return converterr("a byte string of length 1", arg, msgbuf, bufsize);
961
0
        break;
962
0
    }
963
964
0
    case 'C': {/* unicode char */
965
0
        int *p = va_arg(*p_va, int *);
966
0
        int kind;
967
0
        const void *data;
968
969
0
        if (!PyUnicode_Check(arg))
970
0
            return converterr("a unicode character", arg, msgbuf, bufsize);
971
972
0
        if (PyUnicode_GET_LENGTH(arg) != 1) {
973
0
            return convertcharerr("a unicode character",
974
0
                                  "a string", PyUnicode_GET_LENGTH(arg),
975
0
                                  msgbuf, bufsize);
976
0
        }
977
978
0
        kind = PyUnicode_KIND(arg);
979
0
        data = PyUnicode_DATA(arg);
980
0
        *p = PyUnicode_READ(kind, data, 0);
981
0
        break;
982
0
    }
983
984
60.6k
    case 'p': {/* boolean *p*redicate */
985
60.6k
        int *p = va_arg(*p_va, int *);
986
60.6k
        int val = PyObject_IsTrue(arg);
987
60.6k
        if (val > 0)
988
52.7k
            *p = 1;
989
7.88k
        else if (val == 0)
990
7.88k
            *p = 0;
991
0
        else
992
0
            RETURN_ERR_OCCURRED;
993
60.6k
        break;
994
60.6k
    }
995
996
    /* XXX WAAAAH!  's', 'y', 'z', 'u', 'Z', 'e', 'w' codes all
997
       need to be cleaned up! */
998
999
60.6k
    case 'y': {/* any bytes-like object */
1000
0
        void **p = (void **)va_arg(*p_va, char **);
1001
0
        const char *buf;
1002
0
        Py_ssize_t count;
1003
0
        if (*format == '*') {
1004
0
            if (getbuffer(arg, (Py_buffer*)p, &buf) < 0)
1005
0
                return converterr(buf, arg, msgbuf, bufsize);
1006
0
            format++;
1007
0
            if (addcleanup(p, freelist, cleanup_buffer)) {
1008
0
                return converterr(
1009
0
                    "(cleanup problem)",
1010
0
                    arg, msgbuf, bufsize);
1011
0
            }
1012
0
            break;
1013
0
        }
1014
0
        count = convertbuffer(arg, (const void **)p, &buf);
1015
0
        if (count < 0)
1016
0
            return converterr(buf, arg, msgbuf, bufsize);
1017
0
        if (*format == '#') {
1018
0
            Py_ssize_t *psize = va_arg(*p_va, Py_ssize_t*);
1019
0
            *psize = count;
1020
0
            format++;
1021
0
        } else {
1022
0
            if (strlen(*p) != (size_t)count) {
1023
0
                PyErr_SetString(PyExc_ValueError, "embedded null byte");
1024
0
                RETURN_ERR_OCCURRED;
1025
0
            }
1026
0
        }
1027
0
        break;
1028
0
    }
1029
1030
5.42k
    case 's': /* text string or bytes-like object */
1031
5.42k
    case 'z': /* text string, bytes-like object or None */
1032
5.42k
    {
1033
5.42k
        if (*format == '*') {
1034
            /* "s*" or "z*" */
1035
0
            Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *);
1036
1037
0
            if (c == 'z' && arg == Py_None)
1038
0
                PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0);
1039
0
            else if (PyUnicode_Check(arg)) {
1040
0
                Py_ssize_t len;
1041
0
                sarg = PyUnicode_AsUTF8AndSize(arg, &len);
1042
0
                if (sarg == NULL)
1043
0
                    return converterr(CONV_UNICODE,
1044
0
                                      arg, msgbuf, bufsize);
1045
0
                PyBuffer_FillInfo(p, arg, (void *)sarg, len, 1, 0);
1046
0
            }
1047
0
            else { /* any bytes-like object */
1048
0
                const char *buf;
1049
0
                if (getbuffer(arg, p, &buf) < 0)
1050
0
                    return converterr(buf, arg, msgbuf, bufsize);
1051
0
            }
1052
0
            if (addcleanup(p, freelist, cleanup_buffer)) {
1053
0
                return converterr(
1054
0
                    "(cleanup problem)",
1055
0
                    arg, msgbuf, bufsize);
1056
0
            }
1057
0
            format++;
1058
5.42k
        } else if (*format == '#') { /* a string or read-only bytes-like object */
1059
            /* "s#" or "z#" */
1060
169
            const void **p = (const void **)va_arg(*p_va, const char **);
1061
169
            Py_ssize_t *psize = va_arg(*p_va, Py_ssize_t*);
1062
1063
169
            if (c == 'z' && arg == Py_None) {
1064
0
                *p = NULL;
1065
0
                *psize = 0;
1066
0
            }
1067
169
            else if (PyUnicode_Check(arg)) {
1068
169
                Py_ssize_t len;
1069
169
                sarg = PyUnicode_AsUTF8AndSize(arg, &len);
1070
169
                if (sarg == NULL)
1071
0
                    return converterr(CONV_UNICODE,
1072
0
                                      arg, msgbuf, bufsize);
1073
169
                *p = sarg;
1074
169
                *psize = len;
1075
169
            }
1076
0
            else { /* read-only bytes-like object */
1077
                /* XXX Really? */
1078
0
                const char *buf;
1079
0
                Py_ssize_t count = convertbuffer(arg, p, &buf);
1080
0
                if (count < 0)
1081
0
                    return converterr(buf, arg, msgbuf, bufsize);
1082
0
                *psize = count;
1083
0
            }
1084
169
            format++;
1085
5.25k
        } else {
1086
            /* "s" or "z" */
1087
5.25k
            const char **p = va_arg(*p_va, const char **);
1088
5.25k
            Py_ssize_t len;
1089
5.25k
            sarg = NULL;
1090
1091
5.25k
            if (c == 'z' && arg == Py_None)
1092
0
                *p = NULL;
1093
5.25k
            else if (PyUnicode_Check(arg)) {
1094
5.25k
                sarg = PyUnicode_AsUTF8AndSize(arg, &len);
1095
5.25k
                if (sarg == NULL)
1096
0
                    return converterr(CONV_UNICODE,
1097
0
                                      arg, msgbuf, bufsize);
1098
5.25k
                if (strlen(sarg) != (size_t)len) {
1099
0
                    PyErr_SetString(PyExc_ValueError, "embedded null character");
1100
0
                    RETURN_ERR_OCCURRED;
1101
0
                }
1102
5.25k
                *p = sarg;
1103
5.25k
            }
1104
0
            else
1105
0
                return converterr(c == 'z' ? "str or None" : "str",
1106
0
                                  arg, msgbuf, bufsize);
1107
5.25k
        }
1108
5.42k
        break;
1109
5.42k
    }
1110
1111
5.42k
    case 'e': {/* encoded string */
1112
0
        char **buffer;
1113
0
        const char *encoding;
1114
0
        PyObject *s;
1115
0
        int recode_strings;
1116
0
        Py_ssize_t size;
1117
0
        const char *ptr;
1118
1119
        /* Get 'e' parameter: the encoding name */
1120
0
        encoding = (const char *)va_arg(*p_va, const char *);
1121
0
        if (encoding == NULL)
1122
0
            encoding = PyUnicode_GetDefaultEncoding();
1123
1124
        /* Get output buffer parameter:
1125
           's' (recode all objects via Unicode) or
1126
           't' (only recode non-string objects)
1127
        */
1128
0
        if (*format == 's')
1129
0
            recode_strings = 1;
1130
0
        else if (*format == 't')
1131
0
            recode_strings = 0;
1132
0
        else
1133
0
            return converterr(
1134
0
                "(unknown parser marker combination)",
1135
0
                arg, msgbuf, bufsize);
1136
0
        buffer = (char **)va_arg(*p_va, char **);
1137
0
        format++;
1138
0
        if (buffer == NULL)
1139
0
            return converterr("(buffer is NULL)",
1140
0
                              arg, msgbuf, bufsize);
1141
1142
        /* Encode object */
1143
0
        if (!recode_strings &&
1144
0
            (PyBytes_Check(arg) || PyByteArray_Check(arg))) {
1145
0
            s = Py_NewRef(arg);
1146
0
            if (PyBytes_Check(arg)) {
1147
0
                size = PyBytes_GET_SIZE(s);
1148
0
                ptr = PyBytes_AS_STRING(s);
1149
0
            }
1150
0
            else {
1151
0
                size = PyByteArray_GET_SIZE(s);
1152
0
                ptr = PyByteArray_AS_STRING(s);
1153
0
            }
1154
0
        }
1155
0
        else if (PyUnicode_Check(arg)) {
1156
            /* Encode object; use default error handling */
1157
0
            s = PyUnicode_AsEncodedString(arg,
1158
0
                                          encoding,
1159
0
                                          NULL);
1160
0
            if (s == NULL)
1161
0
                return converterr("(encoding failed)",
1162
0
                                  arg, msgbuf, bufsize);
1163
0
            assert(PyBytes_Check(s));
1164
0
            size = PyBytes_GET_SIZE(s);
1165
0
            ptr = PyBytes_AS_STRING(s);
1166
0
            if (ptr == NULL)
1167
0
                ptr = "";
1168
0
        }
1169
0
        else {
1170
0
            return converterr(
1171
0
                recode_strings ? "str" : "str, bytes or bytearray",
1172
0
                arg, msgbuf, bufsize);
1173
0
        }
1174
1175
        /* Write output; output is guaranteed to be 0-terminated */
1176
0
        if (*format == '#') {
1177
            /* Using buffer length parameter '#':
1178
1179
               - if *buffer is NULL, a new buffer of the
1180
               needed size is allocated and the data
1181
               copied into it; *buffer is updated to point
1182
               to the new buffer; the caller is
1183
               responsible for PyMem_Free()ing it after
1184
               usage
1185
1186
               - if *buffer is not NULL, the data is
1187
               copied to *buffer; *buffer_len has to be
1188
               set to the size of the buffer on input;
1189
               buffer overflow is signalled with an error;
1190
               buffer has to provide enough room for the
1191
               encoded string plus the trailing 0-byte
1192
1193
               - in both cases, *buffer_len is updated to
1194
               the size of the buffer /excluding/ the
1195
               trailing 0-byte
1196
1197
            */
1198
0
            Py_ssize_t *psize = va_arg(*p_va, Py_ssize_t*);
1199
1200
0
            format++;
1201
0
            if (psize == NULL) {
1202
0
                Py_DECREF(s);
1203
0
                return converterr(
1204
0
                    "(buffer_len is NULL)",
1205
0
                    arg, msgbuf, bufsize);
1206
0
            }
1207
0
            if (*buffer == NULL) {
1208
0
                *buffer = PyMem_NEW(char, size + 1);
1209
0
                if (*buffer == NULL) {
1210
0
                    Py_DECREF(s);
1211
0
                    PyErr_NoMemory();
1212
0
                    RETURN_ERR_OCCURRED;
1213
0
                }
1214
0
                if (addcleanup(buffer, freelist, cleanup_ptr)) {
1215
0
                    Py_DECREF(s);
1216
0
                    return converterr(
1217
0
                        "(cleanup problem)",
1218
0
                        arg, msgbuf, bufsize);
1219
0
                }
1220
0
            } else {
1221
0
                if (size + 1 > *psize) {
1222
0
                    Py_DECREF(s);
1223
0
                    PyErr_Format(PyExc_ValueError,
1224
0
                                 "encoded string too long "
1225
0
                                 "(%zd, maximum length %zd)",
1226
0
                                 (Py_ssize_t)size, (Py_ssize_t)(*psize - 1));
1227
0
                    RETURN_ERR_OCCURRED;
1228
0
                }
1229
0
            }
1230
0
            memcpy(*buffer, ptr, size+1);
1231
1232
0
            *psize = size;
1233
0
        }
1234
0
        else {
1235
            /* Using a 0-terminated buffer:
1236
1237
               - the encoded string has to be 0-terminated
1238
               for this variant to work; if it is not, an
1239
               error raised
1240
1241
               - a new buffer of the needed size is
1242
               allocated and the data copied into it;
1243
               *buffer is updated to point to the new
1244
               buffer; the caller is responsible for
1245
               PyMem_Free()ing it after usage
1246
1247
            */
1248
0
            if ((Py_ssize_t)strlen(ptr) != size) {
1249
0
                Py_DECREF(s);
1250
0
                return converterr(
1251
0
                    "encoded string without null bytes",
1252
0
                    arg, msgbuf, bufsize);
1253
0
            }
1254
0
            *buffer = PyMem_NEW(char, size + 1);
1255
0
            if (*buffer == NULL) {
1256
0
                Py_DECREF(s);
1257
0
                PyErr_NoMemory();
1258
0
                RETURN_ERR_OCCURRED;
1259
0
            }
1260
0
            if (addcleanup(buffer, freelist, cleanup_ptr)) {
1261
0
                Py_DECREF(s);
1262
0
                return converterr("(cleanup problem)",
1263
0
                                arg, msgbuf, bufsize);
1264
0
            }
1265
0
            memcpy(*buffer, ptr, size+1);
1266
0
        }
1267
0
        Py_DECREF(s);
1268
0
        break;
1269
0
    }
1270
1271
0
    case 'S': { /* PyBytes object */
1272
0
        PyObject **p = va_arg(*p_va, PyObject **);
1273
0
        if (PyBytes_Check(arg))
1274
0
            *p = arg;
1275
0
        else
1276
0
            return converterr("bytes", arg, msgbuf, bufsize);
1277
0
        break;
1278
0
    }
1279
1280
0
    case 'Y': { /* PyByteArray object */
1281
0
        PyObject **p = va_arg(*p_va, PyObject **);
1282
0
        if (PyByteArray_Check(arg))
1283
0
            *p = arg;
1284
0
        else
1285
0
            return converterr("bytearray", arg, msgbuf, bufsize);
1286
0
        break;
1287
0
    }
1288
1289
14.1M
    case 'U': { /* PyUnicode object */
1290
14.1M
        PyObject **p = va_arg(*p_va, PyObject **);
1291
14.1M
        if (PyUnicode_Check(arg)) {
1292
14.1M
            *p = arg;
1293
14.1M
        }
1294
0
        else
1295
0
            return converterr("str", arg, msgbuf, bufsize);
1296
14.1M
        break;
1297
14.1M
    }
1298
1299
14.1M
    case 'O': { /* object */
1300
8.37M
        PyTypeObject *type;
1301
8.37M
        PyObject **p;
1302
8.37M
        if (*format == '!') {
1303
227k
            type = va_arg(*p_va, PyTypeObject*);
1304
227k
            p = va_arg(*p_va, PyObject **);
1305
227k
            format++;
1306
227k
            if (PyType_IsSubtype(Py_TYPE(arg), type))
1307
227k
                *p = arg;
1308
0
            else
1309
0
                return converterr(type->tp_name, arg, msgbuf, bufsize);
1310
1311
227k
        }
1312
8.14M
        else if (*format == '&') {
1313
13.3k
            typedef int (*converter)(PyObject *, void *);
1314
13.3k
            converter convert = va_arg(*p_va, converter);
1315
13.3k
            void *addr = va_arg(*p_va, void *);
1316
13.3k
            int res;
1317
13.3k
            format++;
1318
13.3k
            if (! (res = (*convert)(arg, addr)))
1319
0
                return converterr("(unspecified)",
1320
0
                                  arg, msgbuf, bufsize);
1321
13.3k
            if (res == Py_CLEANUP_SUPPORTED &&
1322
0
                addcleanup(addr, freelist, convert) == -1)
1323
0
                return converterr("(cleanup problem)",
1324
0
                                arg, msgbuf, bufsize);
1325
13.3k
        }
1326
8.13M
        else {
1327
8.13M
            p = va_arg(*p_va, PyObject **);
1328
8.13M
            *p = arg;
1329
8.13M
        }
1330
8.37M
        break;
1331
8.37M
    }
1332
1333
1334
8.37M
    case 'w': { /* "w*": memory buffer, read-write access */
1335
0
        void **p = va_arg(*p_va, void **);
1336
1337
0
        if (*format != '*')
1338
0
            return converterr(
1339
0
                "(invalid use of 'w' format character)",
1340
0
                arg, msgbuf, bufsize);
1341
0
        format++;
1342
1343
        /* Caller is interested in Py_buffer, and the object supports it
1344
           directly. The request implicitly asks for PyBUF_SIMPLE, so the
1345
           result is C-contiguous with format 'B'. */
1346
0
        if (PyObject_GetBuffer(arg, (Py_buffer*)p, PyBUF_WRITABLE) < 0) {
1347
0
            PyErr_Clear();
1348
0
            return converterr("read-write bytes-like object",
1349
0
                              arg, msgbuf, bufsize);
1350
0
        }
1351
0
        assert(PyBuffer_IsContiguous((Py_buffer *)p, 'C'));
1352
0
        if (addcleanup(p, freelist, cleanup_buffer)) {
1353
0
            return converterr(
1354
0
                "(cleanup problem)",
1355
0
                arg, msgbuf, bufsize);
1356
0
        }
1357
0
        break;
1358
0
    }
1359
1360
0
    default:
1361
0
        return converterr("(impossible<bad format char>)", arg, msgbuf, bufsize);
1362
1363
34.9M
    }
1364
1365
34.9M
    *p_format = format;
1366
34.9M
    return NULL;
1367
1368
34.9M
#undef RETURN_ERR_OCCURRED
1369
34.9M
}
1370
1371
static Py_ssize_t
1372
convertbuffer(PyObject *arg, const void **p, const char **errmsg)
1373
0
{
1374
0
    PyBufferProcs *pb = Py_TYPE(arg)->tp_as_buffer;
1375
0
    Py_ssize_t count;
1376
0
    Py_buffer view;
1377
1378
0
    *errmsg = NULL;
1379
0
    *p = NULL;
1380
0
    if (pb != NULL && pb->bf_releasebuffer != NULL) {
1381
0
        *errmsg = "read-only bytes-like object";
1382
0
        return -1;
1383
0
    }
1384
1385
0
    if (getbuffer(arg, &view, errmsg) < 0)
1386
0
        return -1;
1387
0
    count = view.len;
1388
0
    *p = view.buf;
1389
0
    PyBuffer_Release(&view);
1390
0
    return count;
1391
0
}
1392
1393
static int
1394
getbuffer(PyObject *arg, Py_buffer *view, const char **errmsg)
1395
0
{
1396
    /* PyBUF_SIMPLE implies C-contiguous */
1397
0
    if (PyObject_GetBuffer(arg, view, PyBUF_SIMPLE) != 0) {
1398
0
        *errmsg = "bytes-like object";
1399
0
        return -1;
1400
0
    }
1401
0
    assert(PyBuffer_IsContiguous(view, 'C'));
1402
0
    return 0;
1403
0
}
1404
1405
/* Support for keyword arguments donated by
1406
   Geoff Philbrick <philbric@delphi.hks.com> */
1407
1408
/* Return false (0) for error, else true. */
1409
int
1410
PyArg_ParseTupleAndKeywords(PyObject *args,
1411
                            PyObject *keywords,
1412
                            const char *format,
1413
                            const char * const *kwlist, ...)
1414
2.24M
{
1415
2.24M
    int retval;
1416
2.24M
    va_list va;
1417
1418
2.24M
    if ((args == NULL || !PyTuple_Check(args)) ||
1419
2.24M
        (keywords != NULL && !PyDict_Check(keywords)) ||
1420
2.24M
        format == NULL ||
1421
2.24M
        kwlist == NULL)
1422
0
    {
1423
0
        PyErr_BadInternalCall();
1424
0
        return 0;
1425
0
    }
1426
1427
2.24M
    va_start(va, kwlist);
1428
2.24M
    retval = vgetargskeywords(args, keywords, format, kwlist, &va, 0);
1429
2.24M
    va_end(va);
1430
2.24M
    return retval;
1431
2.24M
}
1432
1433
int
1434
_PyArg_ParseTupleAndKeywords_SizeT(PyObject *args,
1435
                                  PyObject *keywords,
1436
                                  const char *format,
1437
                                  const char * const *kwlist, ...)
1438
0
{
1439
0
    int retval;
1440
0
    va_list va;
1441
1442
0
    if ((args == NULL || !PyTuple_Check(args)) ||
1443
0
        (keywords != NULL && !PyDict_Check(keywords)) ||
1444
0
        format == NULL ||
1445
0
        kwlist == NULL)
1446
0
    {
1447
0
        PyErr_BadInternalCall();
1448
0
        return 0;
1449
0
    }
1450
1451
0
    va_start(va, kwlist);
1452
0
    retval = vgetargskeywords(args, keywords, format,
1453
0
                              kwlist, &va, 0);
1454
0
    va_end(va);
1455
0
    return retval;
1456
0
}
1457
1458
1459
int
1460
PyArg_VaParseTupleAndKeywords(PyObject *args,
1461
                              PyObject *keywords,
1462
                              const char *format,
1463
                              const char * const *kwlist, va_list va)
1464
0
{
1465
0
    int retval;
1466
0
    va_list lva;
1467
1468
0
    if ((args == NULL || !PyTuple_Check(args)) ||
1469
0
        (keywords != NULL && !PyDict_Check(keywords)) ||
1470
0
        format == NULL ||
1471
0
        kwlist == NULL)
1472
0
    {
1473
0
        PyErr_BadInternalCall();
1474
0
        return 0;
1475
0
    }
1476
1477
0
    va_copy(lva, va);
1478
1479
0
    retval = vgetargskeywords(args, keywords, format, kwlist, &lva, 0);
1480
0
    va_end(lva);
1481
0
    return retval;
1482
0
}
1483
1484
int
1485
_PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args,
1486
                                    PyObject *keywords,
1487
                                    const char *format,
1488
                                    const char * const *kwlist, va_list va)
1489
0
{
1490
0
    int retval;
1491
0
    va_list lva;
1492
1493
0
    if ((args == NULL || !PyTuple_Check(args)) ||
1494
0
        (keywords != NULL && !PyDict_Check(keywords)) ||
1495
0
        format == NULL ||
1496
0
        kwlist == NULL)
1497
0
    {
1498
0
        PyErr_BadInternalCall();
1499
0
        return 0;
1500
0
    }
1501
1502
0
    va_copy(lva, va);
1503
1504
0
    retval = vgetargskeywords(args, keywords, format,
1505
0
                              kwlist, &lva, 0);
1506
0
    va_end(lva);
1507
0
    return retval;
1508
0
}
1509
1510
PyAPI_FUNC(int)
1511
_PyArg_ParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords,
1512
                            struct _PyArg_Parser *parser, ...)
1513
0
{
1514
0
    int retval;
1515
0
    va_list va;
1516
1517
0
    va_start(va, parser);
1518
0
    retval = vgetargskeywordsfast(args, keywords, parser, &va, 0);
1519
0
    va_end(va);
1520
0
    return retval;
1521
0
}
1522
1523
int
1524
_PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords,
1525
                            struct _PyArg_Parser *parser, ...)
1526
0
{
1527
0
    int retval;
1528
0
    va_list va;
1529
1530
0
    va_start(va, parser);
1531
0
    retval = vgetargskeywordsfast(args, keywords, parser, &va, 0);
1532
0
    va_end(va);
1533
0
    return retval;
1534
0
}
1535
1536
int
1537
_PyArg_ParseStackAndKeywords(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames,
1538
                  struct _PyArg_Parser *parser, ...)
1539
13.7k
{
1540
13.7k
    int retval;
1541
13.7k
    va_list va;
1542
1543
13.7k
    va_start(va, parser);
1544
13.7k
    retval = vgetargskeywordsfast_impl(args, nargs, NULL, kwnames, parser, &va, 0);
1545
13.7k
    va_end(va);
1546
13.7k
    return retval;
1547
13.7k
}
1548
1549
int
1550
_PyArg_ParseStackAndKeywords_SizeT(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames,
1551
                        struct _PyArg_Parser *parser, ...)
1552
0
{
1553
0
    int retval;
1554
0
    va_list va;
1555
1556
0
    va_start(va, parser);
1557
0
    retval = vgetargskeywordsfast_impl(args, nargs, NULL, kwnames, parser, &va, 0);
1558
0
    va_end(va);
1559
0
    return retval;
1560
0
}
1561
1562
1563
static void
1564
error_unexpected_keyword_arg(PyObject *kwargs, PyObject *kwnames, PyObject *kwtuple, const char *fname)
1565
0
{
1566
    /* make sure there are no extraneous keyword arguments */
1567
0
    Py_ssize_t j = 0;
1568
0
    while (1) {
1569
0
        PyObject *keyword;
1570
0
        if (kwargs != NULL) {
1571
0
            if (!PyDict_Next(kwargs, &j, &keyword, NULL))
1572
0
                break;
1573
0
        }
1574
0
        else {
1575
0
            if (j >= PyTuple_GET_SIZE(kwnames))
1576
0
                break;
1577
0
            keyword = PyTuple_GET_ITEM(kwnames, j);
1578
0
            j++;
1579
0
        }
1580
0
        if (!PyUnicode_Check(keyword)) {
1581
0
            PyErr_SetString(PyExc_TypeError,
1582
0
                            "keywords must be strings");
1583
0
            return;
1584
0
        }
1585
1586
0
        int match = PySequence_Contains(kwtuple, keyword);
1587
0
        if (match <= 0) {
1588
0
            if (!match) {
1589
0
                PyObject *kwlist = PySequence_List(kwtuple);
1590
0
                if (!kwlist) {
1591
0
                    return;
1592
0
                }
1593
0
                PyObject *suggestion_keyword = _Py_CalculateSuggestions(kwlist, keyword);
1594
0
                Py_DECREF(kwlist);
1595
1596
0
                if (suggestion_keyword) {
1597
0
                    PyErr_Format(PyExc_TypeError,
1598
0
                                "%.200s%s got an unexpected keyword argument '%S'."
1599
0
                                " Did you mean '%S'?",
1600
0
                                (fname == NULL) ? "this function" : fname,
1601
0
                                (fname == NULL) ? "" : "()",
1602
0
                                keyword,
1603
0
                                suggestion_keyword);
1604
0
                    Py_DECREF(suggestion_keyword);
1605
0
                }
1606
0
                else {
1607
0
                    PyErr_Format(PyExc_TypeError,
1608
0
                                "%.200s%s got an unexpected keyword argument '%S'",
1609
0
                                (fname == NULL) ? "this function" : fname,
1610
0
                                (fname == NULL) ? "" : "()",
1611
0
                                keyword);
1612
0
                }
1613
1614
0
            }
1615
0
            return;
1616
0
        }
1617
0
    }
1618
    /* Something wrong happened. There are extraneous keyword arguments,
1619
     * but we don't know what. And we don't bother. */
1620
0
    PyErr_Format(PyExc_TypeError,
1621
0
                 "invalid keyword argument for %.200s%s",
1622
0
                 (fname == NULL) ? "this function" : fname,
1623
0
                 (fname == NULL) ? "" : "()");
1624
0
}
1625
1626
int
1627
PyArg_ValidateKeywordArguments(PyObject *kwargs)
1628
595
{
1629
595
    if (!PyDict_Check(kwargs)) {
1630
0
        PyErr_BadInternalCall();
1631
0
        return 0;
1632
0
    }
1633
595
    if (!_PyDict_HasOnlyStringKeys(kwargs)) {
1634
0
        PyErr_SetString(PyExc_TypeError,
1635
0
                        "keywords must be strings");
1636
0
        return 0;
1637
0
    }
1638
595
    return 1;
1639
595
}
1640
1641
static PyObject *
1642
new_kwtuple(const char * const *keywords, int total, int pos);
1643
1644
static PyObject*
1645
find_keyword_str(PyObject *kwnames, PyObject *const *kwstack, const char *key)
1646
0
{
1647
0
    Py_ssize_t nkwargs = PyTuple_GET_SIZE(kwnames);
1648
0
    for (Py_ssize_t i = 0; i < nkwargs; i++) {
1649
0
        PyObject *kwname = PyTuple_GET_ITEM(kwnames, i);
1650
0
        assert(PyUnicode_Check(kwname));
1651
0
        if (PyUnicode_EqualToUTF8(kwname, key)) {
1652
0
            return Py_NewRef(kwstack[i]);
1653
0
        }
1654
0
    }
1655
0
    return NULL;
1656
0
}
1657
1658
2.50M
#define IS_END_OF_FORMAT(c) (c == '\0' || c == ';' || c == ':')
1659
1660
static int
1661
vgetargskeywords_impl(PyObject *const *args, Py_ssize_t nargs,
1662
                      PyObject *kwargs, PyObject *kwnames,
1663
                      const char *format, const char * const *kwlist,
1664
                      va_list *p_va, int flags)
1665
2.24M
{
1666
2.24M
    char msgbuf[512];
1667
2.24M
    int levels[32];
1668
2.24M
    const char *fname, *msg, *custom_msg;
1669
2.24M
    int min = INT_MAX;
1670
2.24M
    int max = INT_MAX;
1671
2.24M
    int i, pos, len;
1672
2.24M
    int skip = 0;
1673
2.24M
    Py_ssize_t nkwargs;
1674
2.24M
    freelistentry_t static_entries[STATIC_FREELIST_ENTRIES];
1675
2.24M
    freelist_t freelist;
1676
2.24M
    PyObject * const *kwstack = NULL;
1677
1678
2.24M
    freelist.entries = static_entries;
1679
2.24M
    freelist.first_available = 0;
1680
2.24M
    freelist.entries_malloced = 0;
1681
1682
2.24M
    assert(args != NULL || nargs == 0);
1683
2.24M
    assert(kwargs == NULL || PyDict_Check(kwargs));
1684
2.24M
    assert(kwnames == NULL || PyTuple_Check(kwnames));
1685
2.24M
    assert(format != NULL);
1686
2.24M
    assert(kwlist != NULL);
1687
2.24M
    assert(p_va != NULL);
1688
1689
    /* grab the function name or custom error msg first (mutually exclusive) */
1690
2.24M
    fname = strchr(format, ':');
1691
2.24M
    if (fname) {
1692
2.23M
        fname++;
1693
2.23M
        custom_msg = NULL;
1694
2.23M
    }
1695
9.44k
    else {
1696
9.44k
        custom_msg = strchr(format,';');
1697
9.44k
        if (custom_msg)
1698
0
            custom_msg++;
1699
9.44k
    }
1700
1701
    /* scan kwlist and count the number of positional-only parameters */
1702
2.24M
    for (pos = 0; kwlist[pos] && !*kwlist[pos]; pos++) {
1703
29
    }
1704
    /* scan kwlist and get greatest possible nbr of args */
1705
6.80M
    for (len = pos; kwlist[len]; len++) {
1706
4.55M
        if (!*kwlist[len]) {
1707
0
            PyErr_SetString(PyExc_SystemError,
1708
0
                            "Empty keyword parameter name");
1709
0
            return cleanreturn(0, &freelist);
1710
0
        }
1711
4.55M
    }
1712
1713
2.24M
    if (len > STATIC_FREELIST_ENTRIES) {
1714
13.2k
        freelist.entries = PyMem_NEW(freelistentry_t, len);
1715
13.2k
        if (freelist.entries == NULL) {
1716
0
            PyErr_NoMemory();
1717
0
            return 0;
1718
0
        }
1719
13.2k
        freelist.entries_malloced = 1;
1720
13.2k
    }
1721
1722
2.24M
    if (kwargs != NULL) {
1723
67.2k
        nkwargs = PyDict_GET_SIZE(kwargs);
1724
67.2k
    }
1725
2.18M
    else if (kwnames != NULL) {
1726
0
        nkwargs = PyTuple_GET_SIZE(kwnames);
1727
0
        kwstack = args + nargs;
1728
0
    }
1729
2.18M
    else {
1730
2.18M
        nkwargs = 0;
1731
2.18M
    }
1732
2.24M
    if (nargs + nkwargs > len) {
1733
        /* Adding "keyword" (when nargs == 0) prevents producing wrong error
1734
           messages in some special cases (see bpo-31229). */
1735
0
        PyErr_Format(PyExc_TypeError,
1736
0
                     "%.200s%s takes at most %d %sargument%s (%zd given)",
1737
0
                     (fname == NULL) ? "function" : fname,
1738
0
                     (fname == NULL) ? "" : "()",
1739
0
                     len,
1740
0
                     (nargs == 0) ? "keyword " : "",
1741
0
                     (len == 1) ? "" : "s",
1742
0
                     nargs + nkwargs);
1743
0
        return cleanreturn(0, &freelist);
1744
0
    }
1745
1746
    /* convert tuple args and keyword args in same loop, using kwlist to drive process */
1747
2.42M
    for (i = 0; i < len; i++) {
1748
2.34M
        if (*format == '|') {
1749
2.22M
            if (min != INT_MAX) {
1750
0
                PyErr_SetString(PyExc_SystemError,
1751
0
                                "Invalid format string (| specified twice)");
1752
0
                return cleanreturn(0, &freelist);
1753
0
            }
1754
1755
2.22M
            min = i;
1756
2.22M
            format++;
1757
1758
2.22M
            if (max != INT_MAX) {
1759
0
                PyErr_SetString(PyExc_SystemError,
1760
0
                                "Invalid format string ($ before |)");
1761
0
                return cleanreturn(0, &freelist);
1762
0
            }
1763
2.22M
        }
1764
2.34M
        if (*format == '$') {
1765
2.20M
            if (max != INT_MAX) {
1766
0
                PyErr_SetString(PyExc_SystemError,
1767
0
                                "Invalid format string ($ specified twice)");
1768
0
                return cleanreturn(0, &freelist);
1769
0
            }
1770
1771
2.20M
            max = i;
1772
2.20M
            format++;
1773
1774
2.20M
            if (max < pos) {
1775
0
                PyErr_SetString(PyExc_SystemError,
1776
0
                                "Empty parameter name after $");
1777
0
                return cleanreturn(0, &freelist);
1778
0
            }
1779
2.20M
            if (skip) {
1780
                /* Now we know the minimal and the maximal numbers of
1781
                 * positional arguments and can raise an exception with
1782
                 * informative message (see below). */
1783
0
                break;
1784
0
            }
1785
2.20M
            if (max < nargs) {
1786
0
                if (max == 0) {
1787
0
                    PyErr_Format(PyExc_TypeError,
1788
0
                                 "%.200s%s takes no positional arguments",
1789
0
                                 (fname == NULL) ? "function" : fname,
1790
0
                                 (fname == NULL) ? "" : "()");
1791
0
                }
1792
0
                else {
1793
0
                    PyErr_Format(PyExc_TypeError,
1794
0
                                 "%.200s%s takes %s %d positional argument%s"
1795
0
                                 " (%zd given)",
1796
0
                                 (fname == NULL) ? "function" : fname,
1797
0
                                 (fname == NULL) ? "" : "()",
1798
0
                                 (min != INT_MAX) ? "at most" : "exactly",
1799
0
                                 max,
1800
0
                                 max == 1 ? "" : "s",
1801
0
                                 nargs);
1802
0
                }
1803
0
                return cleanreturn(0, &freelist);
1804
0
            }
1805
2.20M
        }
1806
2.34M
        if (IS_END_OF_FORMAT(*format)) {
1807
0
            PyErr_Format(PyExc_SystemError,
1808
0
                         "More keyword list entries (%d) than "
1809
0
                         "format specifiers (%d)", len, i);
1810
0
            return cleanreturn(0, &freelist);
1811
0
        }
1812
2.34M
        if (!skip) {
1813
2.34M
            PyObject *current_arg;
1814
2.34M
            if (i < nargs) {
1815
82.2k
                current_arg = Py_NewRef(args[i]);
1816
82.2k
            }
1817
2.26M
            else if (nkwargs && i >= pos) {
1818
93.7k
                if (kwargs != NULL) {
1819
93.7k
                    if (PyDict_GetItemStringRef(kwargs, kwlist[i], &current_arg) < 0) {
1820
0
                        return cleanreturn(0, &freelist);
1821
0
                    }
1822
93.7k
                }
1823
0
                else {
1824
0
                    current_arg = find_keyword_str(kwnames, kwstack, kwlist[i]);
1825
0
                }
1826
93.7k
                if (current_arg) {
1827
80.7k
                    --nkwargs;
1828
80.7k
                }
1829
93.7k
            }
1830
2.16M
            else {
1831
2.16M
                current_arg = NULL;
1832
2.16M
            }
1833
1834
2.34M
            if (current_arg) {
1835
163k
                msg = convertitem(current_arg, &format, p_va, flags,
1836
163k
                    levels, msgbuf, sizeof(msgbuf), &freelist);
1837
163k
                Py_DECREF(current_arg);
1838
163k
                if (msg) {
1839
0
                    seterror(i+1, msg, levels, fname, custom_msg);
1840
0
                    return cleanreturn(0, &freelist);
1841
0
                }
1842
163k
                continue;
1843
163k
            }
1844
1845
2.18M
            if (i < min) {
1846
0
                if (i < pos) {
1847
0
                    assert (min == INT_MAX);
1848
0
                    assert (max == INT_MAX);
1849
0
                    skip = 1;
1850
                    /* At that moment we still don't know the minimal and
1851
                     * the maximal numbers of positional arguments.  Raising
1852
                     * an exception is deferred until we encounter | and $
1853
                     * or the end of the format. */
1854
0
                }
1855
0
                else {
1856
0
                    PyErr_Format(PyExc_TypeError,  "%.200s%s missing required "
1857
0
                                 "argument '%s' (pos %d)",
1858
0
                                 (fname == NULL) ? "function" : fname,
1859
0
                                 (fname == NULL) ? "" : "()",
1860
0
                                 kwlist[i], i+1);
1861
0
                    return cleanreturn(0, &freelist);
1862
0
                }
1863
0
            }
1864
            /* current code reports success when all required args
1865
             * fulfilled and no keyword args left, with no further
1866
             * validation. XXX Maybe skip this in debug build ?
1867
             */
1868
2.18M
            if (!nkwargs && !skip) {
1869
2.16M
                return cleanreturn(1, &freelist);
1870
2.16M
            }
1871
2.18M
        }
1872
1873
        /* We are into optional args, skip through to any remaining
1874
         * keyword args */
1875
13.0k
        msg = skipitem(&format, p_va, flags);
1876
13.0k
        if (msg) {
1877
0
            PyErr_Format(PyExc_SystemError, "%s: '%s'", msg,
1878
0
                         format);
1879
0
            return cleanreturn(0, &freelist);
1880
0
        }
1881
13.0k
    }
1882
1883
78.0k
    if (skip) {
1884
0
        PyErr_Format(PyExc_TypeError,
1885
0
                     "%.200s%s takes %s %d positional argument%s"
1886
0
                     " (%zd given)",
1887
0
                     (fname == NULL) ? "function" : fname,
1888
0
                     (fname == NULL) ? "" : "()",
1889
0
                     (Py_MIN(pos, min) < i) ? "at least" : "exactly",
1890
0
                     Py_MIN(pos, min),
1891
0
                     Py_MIN(pos, min) == 1 ? "" : "s",
1892
0
                     nargs);
1893
0
        return cleanreturn(0, &freelist);
1894
0
    }
1895
1896
78.0k
    if (!IS_END_OF_FORMAT(*format) && (*format != '|') && (*format != '$')) {
1897
0
        PyErr_Format(PyExc_SystemError,
1898
0
            "more argument specifiers than keyword list entries "
1899
0
            "(remaining format:'%s')", format);
1900
0
        return cleanreturn(0, &freelist);
1901
0
    }
1902
1903
78.0k
    if (nkwargs > 0) {
1904
0
        PyObject *key;
1905
0
        Py_ssize_t j;
1906
        /* make sure there are no arguments given by name and position */
1907
0
        for (i = pos; i < nargs; i++) {
1908
0
            PyObject *current_arg;
1909
0
            if (kwargs != NULL) {
1910
0
                if (PyDict_GetItemStringRef(kwargs, kwlist[i], &current_arg) < 0) {
1911
0
                    return cleanreturn(0, &freelist);
1912
0
                }
1913
0
            }
1914
0
            else {
1915
0
                current_arg = find_keyword_str(kwnames, kwstack, kwlist[i]);
1916
0
            }
1917
0
            if (current_arg) {
1918
0
                Py_DECREF(current_arg);
1919
                /* arg present in tuple and in dict */
1920
0
                PyErr_Format(PyExc_TypeError,
1921
0
                             "argument for %.200s%s given by name ('%s') "
1922
0
                             "and position (%d)",
1923
0
                             (fname == NULL) ? "function" : fname,
1924
0
                             (fname == NULL) ? "" : "()",
1925
0
                             kwlist[i], i+1);
1926
0
                return cleanreturn(0, &freelist);
1927
0
            }
1928
0
        }
1929
        /* make sure there are no extraneous keyword arguments */
1930
0
        j = 0;
1931
0
        while (1) {
1932
0
            if (kwargs != NULL) {
1933
0
                if (!PyDict_Next(kwargs, &j, &key, NULL)) {
1934
0
                    break;
1935
0
                }
1936
0
            }
1937
0
            else {
1938
0
                if (j >= nkwargs) {
1939
0
                    break;
1940
0
                }
1941
0
                key = PyTuple_GET_ITEM(kwnames, j);
1942
0
                j++;
1943
0
            }
1944
1945
0
            int match = 0;
1946
0
            if (!PyUnicode_Check(key)) {
1947
0
                PyErr_SetString(PyExc_TypeError,
1948
0
                                "keywords must be strings");
1949
0
                return cleanreturn(0, &freelist);
1950
0
            }
1951
0
            for (i = pos; i < len; i++) {
1952
0
                if (PyUnicode_EqualToUTF8(key, kwlist[i])) {
1953
0
                    match = 1;
1954
0
                    break;
1955
0
                }
1956
0
            }
1957
0
            if (!match) {
1958
0
                PyObject *_pykwtuple = new_kwtuple(kwlist, len, pos);
1959
0
                if (!_pykwtuple) {
1960
0
                    return cleanreturn(0, &freelist);
1961
0
                }
1962
0
                PyObject *pykwlist = PySequence_List(_pykwtuple);
1963
0
                Py_DECREF(_pykwtuple);
1964
0
                if (!pykwlist) {
1965
0
                    return cleanreturn(0, &freelist);
1966
0
                }
1967
0
                PyObject *suggestion_keyword = _Py_CalculateSuggestions(pykwlist, key);
1968
0
                Py_DECREF(pykwlist);
1969
1970
0
                if (suggestion_keyword) {
1971
0
                    PyErr_Format(PyExc_TypeError,
1972
0
                                "%.200s%s got an unexpected keyword argument '%S'."
1973
0
                                " Did you mean '%S'?",
1974
0
                                (fname == NULL) ? "this function" : fname,
1975
0
                                (fname == NULL) ? "" : "()",
1976
0
                                key,
1977
0
                                suggestion_keyword);
1978
0
                    Py_DECREF(suggestion_keyword);
1979
0
                }
1980
0
                else {
1981
0
                    PyErr_Format(PyExc_TypeError,
1982
0
                                "%.200s%s got an unexpected keyword argument '%S'",
1983
0
                                (fname == NULL) ? "this function" : fname,
1984
0
                                (fname == NULL) ? "" : "()",
1985
0
                                key);
1986
0
                }
1987
0
                return cleanreturn(0, &freelist);
1988
0
            }
1989
0
        }
1990
        /* Something wrong happened. There are extraneous keyword arguments,
1991
         * but we don't know what. And we don't bother. */
1992
0
        PyErr_Format(PyExc_TypeError,
1993
0
                     "invalid keyword argument for %.200s%s",
1994
0
                     (fname == NULL) ? "this function" : fname,
1995
0
                     (fname == NULL) ? "" : "()");
1996
0
        return cleanreturn(0, &freelist);
1997
0
    }
1998
1999
78.0k
    return cleanreturn(1, &freelist);
2000
78.0k
}
2001
2002
static int
2003
vgetargskeywords(PyObject *argstuple, PyObject *kwargs,
2004
                 const char *format, const char * const *kwlist,
2005
                 va_list *p_va, int flags)
2006
2.24M
{
2007
2.24M
    PyObject *const *args = _PyTuple_ITEMS(argstuple);
2008
2.24M
    Py_ssize_t nargs = PyTuple_GET_SIZE(argstuple);
2009
2.24M
    return vgetargskeywords_impl(args, nargs, kwargs, NULL,
2010
2.24M
                                 format, kwlist, p_va, flags);
2011
2.24M
}
2012
2013
static int
2014
scan_keywords(const char * const *keywords, int *ptotal, int *pposonly)
2015
235
{
2016
    /* scan keywords and count the number of positional-only parameters */
2017
235
    int i;
2018
257
    for (i = 0; keywords[i] && !*keywords[i]; i++) {
2019
22
    }
2020
235
    *pposonly = i;
2021
2022
    /* scan keywords and get greatest possible nbr of args */
2023
1.16k
    for (; keywords[i]; i++) {
2024
932
        if (!*keywords[i]) {
2025
0
            PyErr_SetString(PyExc_SystemError,
2026
0
                            "Empty keyword parameter name");
2027
0
            return -1;
2028
0
        }
2029
932
    }
2030
235
    *ptotal = i;
2031
235
    return 0;
2032
235
}
2033
2034
static int
2035
parse_format(const char *format, int total, int npos,
2036
             const char **pfname, const char **pcustommsg,
2037
             int *pmin, int *pmax)
2038
8
{
2039
    /* grab the function name or custom error msg first (mutually exclusive) */
2040
8
    const char *custommsg;
2041
8
    const char *fname = strchr(format, ':');
2042
8
    if (fname) {
2043
8
        fname++;
2044
8
        custommsg = NULL;
2045
8
    }
2046
0
    else {
2047
0
        custommsg = strchr(format,';');
2048
0
        if (custommsg) {
2049
0
            custommsg++;
2050
0
        }
2051
0
    }
2052
2053
8
    int min = INT_MAX;
2054
8
    int max = INT_MAX;
2055
24
    for (int i = 0; i < total; i++) {
2056
16
        if (*format == '|') {
2057
8
            if (min != INT_MAX) {
2058
0
                PyErr_SetString(PyExc_SystemError,
2059
0
                                "Invalid format string (| specified twice)");
2060
0
                return -1;
2061
0
            }
2062
8
            if (max != INT_MAX) {
2063
0
                PyErr_SetString(PyExc_SystemError,
2064
0
                                "Invalid format string ($ before |)");
2065
0
                return -1;
2066
0
            }
2067
8
            min = i;
2068
8
            format++;
2069
8
        }
2070
16
        if (*format == '$') {
2071
8
            if (max != INT_MAX) {
2072
0
                PyErr_SetString(PyExc_SystemError,
2073
0
                                "Invalid format string ($ specified twice)");
2074
0
                return -1;
2075
0
            }
2076
8
            if (i < npos) {
2077
0
                PyErr_SetString(PyExc_SystemError,
2078
0
                                "Empty parameter name after $");
2079
0
                return -1;
2080
0
            }
2081
8
            max = i;
2082
8
            format++;
2083
8
        }
2084
16
        if (IS_END_OF_FORMAT(*format)) {
2085
0
            PyErr_Format(PyExc_SystemError,
2086
0
                        "More keyword list entries (%d) than "
2087
0
                        "format specifiers (%d)", total, i);
2088
0
            return -1;
2089
0
        }
2090
2091
16
        const char *msg = skipitem(&format, NULL, 0);
2092
16
        if (msg) {
2093
0
            PyErr_Format(PyExc_SystemError, "%s: '%s'", msg,
2094
0
                        format);
2095
0
            return -1;
2096
0
        }
2097
16
    }
2098
8
    min = Py_MIN(min, total);
2099
8
    max = Py_MIN(max, total);
2100
2101
8
    if (!IS_END_OF_FORMAT(*format) && (*format != '|') && (*format != '$')) {
2102
0
        PyErr_Format(PyExc_SystemError,
2103
0
            "more argument specifiers than keyword list entries "
2104
0
            "(remaining format:'%s')", format);
2105
0
        return -1;
2106
0
    }
2107
2108
8
    *pfname = fname;
2109
8
    *pcustommsg = custommsg;
2110
8
    *pmin = min;
2111
8
    *pmax = max;
2112
8
    return 0;
2113
8
}
2114
2115
static PyObject *
2116
new_kwtuple(const char * const *keywords, int total, int pos)
2117
75
{
2118
75
    int nkw = total - pos;
2119
75
    PyObject *kwtuple = PyTuple_New(nkw);
2120
75
    if (kwtuple == NULL) {
2121
0
        return NULL;
2122
0
    }
2123
75
    keywords += pos;
2124
291
    for (int i = 0; i < nkw; i++) {
2125
216
        PyObject *str = PyUnicode_FromString(keywords[i]);
2126
216
        if (str == NULL) {
2127
0
            Py_DECREF(kwtuple);
2128
0
            return NULL;
2129
0
        }
2130
216
        PyInterpreterState *interp = _PyInterpreterState_GET();
2131
216
        _PyUnicode_InternImmortal(interp, &str);
2132
216
        PyTuple_SET_ITEM(kwtuple, i, str);
2133
216
    }
2134
75
    return kwtuple;
2135
75
}
2136
2137
static int
2138
_parser_init(void *arg)
2139
235
{
2140
235
    struct _PyArg_Parser *parser = (struct _PyArg_Parser *)arg;
2141
235
    const char * const *keywords = parser->keywords;
2142
235
    assert(keywords != NULL);
2143
235
    assert(parser->pos == 0 &&
2144
235
           (parser->format == NULL || parser->fname == NULL) &&
2145
235
           parser->custom_msg == NULL &&
2146
235
           parser->min == 0 &&
2147
235
           parser->max == 0);
2148
2149
235
    int len, pos;
2150
235
    if (scan_keywords(keywords, &len, &pos) < 0) {
2151
0
        return -1;
2152
0
    }
2153
2154
235
    const char *fname, *custommsg = NULL;
2155
235
    int min = 0, max = 0;
2156
235
    if (parser->format) {
2157
8
        assert(parser->fname == NULL);
2158
8
        if (parse_format(parser->format, len, pos,
2159
8
                         &fname, &custommsg, &min, &max) < 0) {
2160
0
            return -1;
2161
0
        }
2162
8
    }
2163
227
    else {
2164
227
        assert(parser->fname != NULL);
2165
227
        fname = parser->fname;
2166
227
    }
2167
2168
235
    int owned;
2169
235
    PyObject *kwtuple = parser->kwtuple;
2170
235
    if (kwtuple == NULL) {
2171
        /* We may temporarily switch to the main interpreter to avoid
2172
         * creating a tuple that could outlive its owning interpreter. */
2173
75
        PyThreadState *save_tstate = NULL;
2174
75
        PyThreadState *temp_tstate = NULL;
2175
75
        if (!_Py_IsMainInterpreter(PyInterpreterState_Get())) {
2176
0
            temp_tstate = PyThreadState_New(_PyInterpreterState_Main());
2177
0
            if (temp_tstate == NULL) {
2178
0
                return -1;
2179
0
            }
2180
0
            save_tstate = PyThreadState_Swap(temp_tstate);
2181
0
        }
2182
75
        kwtuple = new_kwtuple(keywords, len, pos);
2183
75
        if (temp_tstate != NULL) {
2184
0
            PyThreadState_Clear(temp_tstate);
2185
0
            (void)PyThreadState_Swap(save_tstate);
2186
0
            PyThreadState_Delete(temp_tstate);
2187
0
        }
2188
75
        if (kwtuple == NULL) {
2189
0
            return -1;
2190
0
        }
2191
75
        owned = 1;
2192
75
    }
2193
160
    else {
2194
160
        owned = 0;
2195
160
    }
2196
2197
235
    parser->pos = pos;
2198
235
    parser->fname = fname;
2199
235
    parser->custom_msg = custommsg;
2200
235
    parser->min = min;
2201
235
    parser->max = max;
2202
235
    parser->kwtuple = kwtuple;
2203
235
    parser->is_kwtuple_owned = owned;
2204
2205
235
    assert(parser->next == NULL);
2206
235
    parser->next = _Py_atomic_load_ptr(&_PyRuntime.getargs.static_parsers);
2207
235
    do {
2208
        // compare-exchange updates parser->next on failure
2209
235
    } while (!_Py_atomic_compare_exchange_ptr(&_PyRuntime.getargs.static_parsers,
2210
235
                                              &parser->next, parser));
2211
235
    return 0;
2212
235
}
2213
2214
static int
2215
parser_init(struct _PyArg_Parser *parser)
2216
2.40M
{
2217
2.40M
    return _PyOnceFlag_CallOnce(&parser->once, &_parser_init, parser);
2218
2.40M
}
2219
2220
static void
2221
parser_clear(struct _PyArg_Parser *parser)
2222
0
{
2223
0
    if (parser->is_kwtuple_owned) {
2224
0
        Py_CLEAR(parser->kwtuple);
2225
0
    }
2226
2227
0
    if (parser->format) {
2228
0
        parser->fname = NULL;
2229
0
    }
2230
0
    else {
2231
0
        assert(parser->fname != NULL);
2232
0
    }
2233
0
    parser->custom_msg = NULL;
2234
0
    parser->pos = 0;
2235
0
    parser->min = 0;
2236
0
    parser->max = 0;
2237
0
    parser->is_kwtuple_owned = 0;
2238
0
    parser->once.v = 0;
2239
0
}
2240
2241
static PyObject*
2242
find_keyword(PyObject *kwnames, PyObject *const *kwstack, PyObject *key)
2243
2.98M
{
2244
2.98M
    Py_ssize_t i, nkwargs;
2245
2246
2.98M
    nkwargs = PyTuple_GET_SIZE(kwnames);
2247
4.32M
    for (i = 0; i < nkwargs; i++) {
2248
4.00M
        PyObject *kwname = PyTuple_GET_ITEM(kwnames, i);
2249
2250
        /* kwname == key will normally find a match in since keyword keys
2251
           should be interned strings; if not retry below in a new loop. */
2252
4.00M
        if (kwname == key) {
2253
2.66M
            return Py_NewRef(kwstack[i]);
2254
2.66M
        }
2255
4.00M
    }
2256
2257
1.03M
    for (i = 0; i < nkwargs; i++) {
2258
714k
        PyObject *kwname = PyTuple_GET_ITEM(kwnames, i);
2259
714k
        assert(PyUnicode_Check(kwname));
2260
714k
        if (_PyUnicode_Equal(kwname, key)) {
2261
0
            return Py_NewRef(kwstack[i]);
2262
0
        }
2263
714k
    }
2264
320k
    return NULL;
2265
320k
}
2266
2267
static int
2268
vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs,
2269
                          PyObject *kwargs, PyObject *kwnames,
2270
                          struct _PyArg_Parser *parser,
2271
                          va_list *p_va, int flags)
2272
13.7k
{
2273
13.7k
    PyObject *kwtuple;
2274
13.7k
    char msgbuf[512];
2275
13.7k
    int levels[32];
2276
13.7k
    const char *format;
2277
13.7k
    const char *msg;
2278
13.7k
    PyObject *keyword;
2279
13.7k
    Py_ssize_t i;
2280
13.7k
    int pos, len;
2281
13.7k
    Py_ssize_t nkwargs;
2282
13.7k
    freelistentry_t static_entries[STATIC_FREELIST_ENTRIES];
2283
13.7k
    freelist_t freelist;
2284
13.7k
    PyObject *const *kwstack = NULL;
2285
2286
13.7k
    freelist.entries = static_entries;
2287
13.7k
    freelist.first_available = 0;
2288
13.7k
    freelist.entries_malloced = 0;
2289
2290
13.7k
    assert(kwargs == NULL || PyDict_Check(kwargs));
2291
13.7k
    assert(kwargs == NULL || kwnames == NULL);
2292
13.7k
    assert(p_va != NULL);
2293
2294
13.7k
    if (parser == NULL) {
2295
0
        PyErr_BadInternalCall();
2296
0
        return 0;
2297
0
    }
2298
2299
13.7k
    if (kwnames != NULL && !PyTuple_Check(kwnames)) {
2300
0
        PyErr_BadInternalCall();
2301
0
        return 0;
2302
0
    }
2303
2304
13.7k
    if (parser_init(parser) < 0) {
2305
0
        return 0;
2306
0
    }
2307
2308
13.7k
    kwtuple = parser->kwtuple;
2309
13.7k
    pos = parser->pos;
2310
13.7k
    len = pos + (int)PyTuple_GET_SIZE(kwtuple);
2311
2312
13.7k
    if (len > STATIC_FREELIST_ENTRIES) {
2313
0
        freelist.entries = PyMem_NEW(freelistentry_t, len);
2314
0
        if (freelist.entries == NULL) {
2315
0
            PyErr_NoMemory();
2316
0
            return 0;
2317
0
        }
2318
0
        freelist.entries_malloced = 1;
2319
0
    }
2320
2321
13.7k
    if (kwargs != NULL) {
2322
0
        nkwargs = PyDict_GET_SIZE(kwargs);
2323
0
    }
2324
13.7k
    else if (kwnames != NULL) {
2325
13.7k
        nkwargs = PyTuple_GET_SIZE(kwnames);
2326
13.7k
        kwstack = args + nargs;
2327
13.7k
    }
2328
0
    else {
2329
0
        nkwargs = 0;
2330
0
    }
2331
13.7k
    if (nargs + nkwargs > len) {
2332
        /* Adding "keyword" (when nargs == 0) prevents producing wrong error
2333
           messages in some special cases (see bpo-31229). */
2334
0
        PyErr_Format(PyExc_TypeError,
2335
0
                     "%.200s%s takes at most %d %sargument%s (%zd given)",
2336
0
                     (parser->fname == NULL) ? "function" : parser->fname,
2337
0
                     (parser->fname == NULL) ? "" : "()",
2338
0
                     len,
2339
0
                     (nargs == 0) ? "keyword " : "",
2340
0
                     (len == 1) ? "" : "s",
2341
0
                     nargs + nkwargs);
2342
0
        return cleanreturn(0, &freelist);
2343
0
    }
2344
13.7k
    if (parser->max < nargs) {
2345
0
        if (parser->max == 0) {
2346
0
            PyErr_Format(PyExc_TypeError,
2347
0
                         "%.200s%s takes no positional arguments",
2348
0
                         (parser->fname == NULL) ? "function" : parser->fname,
2349
0
                         (parser->fname == NULL) ? "" : "()");
2350
0
        }
2351
0
        else {
2352
0
            PyErr_Format(PyExc_TypeError,
2353
0
                         "%.200s%s takes %s %d positional argument%s (%zd given)",
2354
0
                         (parser->fname == NULL) ? "function" : parser->fname,
2355
0
                         (parser->fname == NULL) ? "" : "()",
2356
0
                         (parser->min < parser->max) ? "at most" : "exactly",
2357
0
                         parser->max,
2358
0
                         parser->max == 1 ? "" : "s",
2359
0
                         nargs);
2360
0
        }
2361
0
        return cleanreturn(0, &freelist);
2362
0
    }
2363
2364
13.7k
    format = parser->format;
2365
13.7k
    assert(format != NULL || len == 0);
2366
    /* convert tuple args and keyword args in same loop, using kwtuple to drive process */
2367
27.6k
    for (i = 0; i < len; i++) {
2368
27.5k
        if (*format == '|') {
2369
13.7k
            format++;
2370
13.7k
        }
2371
27.5k
        if (*format == '$') {
2372
13.7k
            format++;
2373
13.7k
        }
2374
27.5k
        assert(!IS_END_OF_FORMAT(*format));
2375
2376
27.5k
        PyObject *current_arg;
2377
27.5k
        if (i < nargs) {
2378
0
            current_arg = Py_NewRef(args[i]);
2379
0
        }
2380
27.5k
        else if (nkwargs && i >= pos) {
2381
13.8k
            keyword = PyTuple_GET_ITEM(kwtuple, i - pos);
2382
13.8k
            if (kwargs != NULL) {
2383
0
                if (PyDict_GetItemRef(kwargs, keyword, &current_arg) < 0) {
2384
0
                    return cleanreturn(0, &freelist);
2385
0
                }
2386
0
            }
2387
13.8k
            else {
2388
13.8k
                current_arg = find_keyword(kwnames, kwstack, keyword);
2389
13.8k
            }
2390
13.8k
            if (current_arg) {
2391
13.7k
                --nkwargs;
2392
13.7k
            }
2393
13.8k
        }
2394
13.6k
        else {
2395
13.6k
            current_arg = NULL;
2396
13.6k
        }
2397
2398
27.5k
        if (current_arg) {
2399
13.7k
            msg = convertitem(current_arg, &format, p_va, flags,
2400
13.7k
                levels, msgbuf, sizeof(msgbuf), &freelist);
2401
13.7k
            Py_DECREF(current_arg);
2402
13.7k
            if (msg) {
2403
0
                seterror(i+1, msg, levels, parser->fname, parser->custom_msg);
2404
0
                return cleanreturn(0, &freelist);
2405
0
            }
2406
13.7k
            continue;
2407
13.7k
        }
2408
2409
13.7k
        if (i < parser->min) {
2410
            /* Less arguments than required */
2411
0
            if (i < pos) {
2412
0
                int min = Py_MIN(pos, parser->min);
2413
0
                PyErr_Format(PyExc_TypeError,
2414
0
                             "%.200s%s takes %s %d positional argument%s"
2415
0
                             " (%zd given)",
2416
0
                             (parser->fname == NULL) ? "function" : parser->fname,
2417
0
                             (parser->fname == NULL) ? "" : "()",
2418
0
                             min < parser->max ? "at least" : "exactly",
2419
0
                             min,
2420
0
                             min == 1 ? "" : "s",
2421
0
                             nargs);
2422
0
            }
2423
0
            else {
2424
0
                keyword = PyTuple_GET_ITEM(kwtuple, i - pos);
2425
0
                PyErr_Format(PyExc_TypeError,  "%.200s%s missing required "
2426
0
                             "argument '%U' (pos %zd)",
2427
0
                             (parser->fname == NULL) ? "function" : parser->fname,
2428
0
                             (parser->fname == NULL) ? "" : "()",
2429
0
                             keyword, i+1);
2430
0
            }
2431
0
            return cleanreturn(0, &freelist);
2432
0
        }
2433
        /* current code reports success when all required args
2434
         * fulfilled and no keyword args left, with no further
2435
         * validation. XXX Maybe skip this in debug build ?
2436
         */
2437
13.7k
        if (!nkwargs) {
2438
13.6k
            return cleanreturn(1, &freelist);
2439
13.6k
        }
2440
2441
        /* We are into optional args, skip through to any remaining
2442
         * keyword args */
2443
120
        msg = skipitem(&format, p_va, flags);
2444
120
        assert(msg == NULL);
2445
120
    }
2446
2447
13.7k
    assert(IS_END_OF_FORMAT(*format) || (*format == '|') || (*format == '$'));
2448
2449
120
    if (nkwargs > 0) {
2450
        /* make sure there are no arguments given by name and position */
2451
0
        for (i = pos; i < nargs; i++) {
2452
0
            PyObject *current_arg;
2453
0
            keyword = PyTuple_GET_ITEM(kwtuple, i - pos);
2454
0
            if (kwargs != NULL) {
2455
0
                if (PyDict_GetItemRef(kwargs, keyword, &current_arg) < 0) {
2456
0
                    return cleanreturn(0, &freelist);
2457
0
                }
2458
0
            }
2459
0
            else {
2460
0
                current_arg = find_keyword(kwnames, kwstack, keyword);
2461
0
            }
2462
0
            if (current_arg) {
2463
0
                Py_DECREF(current_arg);
2464
                /* arg present in tuple and in dict */
2465
0
                PyErr_Format(PyExc_TypeError,
2466
0
                             "argument for %.200s%s given by name ('%U') "
2467
0
                             "and position (%zd)",
2468
0
                             (parser->fname == NULL) ? "function" : parser->fname,
2469
0
                             (parser->fname == NULL) ? "" : "()",
2470
0
                             keyword, i+1);
2471
0
                return cleanreturn(0, &freelist);
2472
0
            }
2473
0
        }
2474
2475
0
        error_unexpected_keyword_arg(kwargs, kwnames, kwtuple, parser->fname);
2476
0
        return cleanreturn(0, &freelist);
2477
0
    }
2478
2479
120
    return cleanreturn(1, &freelist);
2480
120
}
2481
2482
static int
2483
vgetargskeywordsfast(PyObject *args, PyObject *keywords,
2484
                     struct _PyArg_Parser *parser, va_list *p_va, int flags)
2485
0
{
2486
0
    PyObject **stack;
2487
0
    Py_ssize_t nargs;
2488
2489
0
    if (args == NULL
2490
0
        || !PyTuple_Check(args)
2491
0
        || (keywords != NULL && !PyDict_Check(keywords)))
2492
0
    {
2493
0
        PyErr_BadInternalCall();
2494
0
        return 0;
2495
0
    }
2496
2497
0
    stack = _PyTuple_ITEMS(args);
2498
0
    nargs = PyTuple_GET_SIZE(args);
2499
0
    return vgetargskeywordsfast_impl(stack, nargs, keywords, NULL,
2500
0
                                     parser, p_va, flags);
2501
0
}
2502
2503
2504
#undef _PyArg_UnpackKeywords
2505
2506
PyObject * const *
2507
_PyArg_UnpackKeywords(PyObject *const *args, Py_ssize_t nargs,
2508
                      PyObject *kwargs, PyObject *kwnames,
2509
                      struct _PyArg_Parser *parser,
2510
                      int minpos, int maxpos, int minkw, int varpos,
2511
                      PyObject **buf)
2512
2.39M
{
2513
2.39M
    PyObject *kwtuple;
2514
2.39M
    PyObject *keyword;
2515
2.39M
    int i, posonly, minposonly, maxargs;
2516
2.39M
    int reqlimit = minkw ? maxpos + minkw : minpos;
2517
2.39M
    Py_ssize_t nkwargs;
2518
2.39M
    PyObject * const *kwstack = NULL;
2519
2520
2.39M
    assert(kwargs == NULL || PyDict_Check(kwargs));
2521
2.39M
    assert(kwargs == NULL || kwnames == NULL);
2522
2523
2.39M
    if (parser == NULL) {
2524
0
        PyErr_BadInternalCall();
2525
0
        return NULL;
2526
0
    }
2527
2528
2.39M
    if (kwnames != NULL && !PyTuple_Check(kwnames)) {
2529
0
        PyErr_BadInternalCall();
2530
0
        return NULL;
2531
0
    }
2532
2533
2.39M
    if (args == NULL && nargs == 0) {
2534
0
        args = buf;
2535
0
    }
2536
2537
2.39M
    if (parser_init(parser) < 0) {
2538
0
        return NULL;
2539
0
    }
2540
2541
2.39M
    kwtuple = parser->kwtuple;
2542
2.39M
    posonly = parser->pos;
2543
2.39M
    minposonly = Py_MIN(posonly, minpos);
2544
2.39M
    maxargs = posonly + (int)PyTuple_GET_SIZE(kwtuple);
2545
2546
2.39M
    if (kwargs != NULL) {
2547
102k
        nkwargs = PyDict_GET_SIZE(kwargs);
2548
102k
    }
2549
2.29M
    else if (kwnames != NULL) {
2550
2.29M
        nkwargs = PyTuple_GET_SIZE(kwnames);
2551
2.29M
        kwstack = args + nargs;
2552
2.29M
    }
2553
0
    else {
2554
0
        nkwargs = 0;
2555
0
    }
2556
2.39M
    if (nkwargs == 0 && minkw == 0 && minpos <= nargs && (varpos || nargs <= maxpos)) {
2557
        /* Fast path. */
2558
0
        return args;
2559
0
    }
2560
2.39M
    if (!varpos && nargs + nkwargs > maxargs) {
2561
        /* Adding "keyword" (when nargs == 0) prevents producing wrong error
2562
           messages in some special cases (see bpo-31229). */
2563
0
        PyErr_Format(PyExc_TypeError,
2564
0
                     "%.200s%s takes at most %d %sargument%s (%zd given)",
2565
0
                     (parser->fname == NULL) ? "function" : parser->fname,
2566
0
                     (parser->fname == NULL) ? "" : "()",
2567
0
                     maxargs,
2568
0
                     (nargs == 0) ? "keyword " : "",
2569
0
                     (maxargs == 1) ? "" : "s",
2570
0
                     nargs + nkwargs);
2571
0
        return NULL;
2572
0
    }
2573
2.39M
    if (!varpos && nargs > maxpos) {
2574
0
        if (maxpos == 0) {
2575
0
            PyErr_Format(PyExc_TypeError,
2576
0
                         "%.200s%s takes no positional arguments",
2577
0
                         (parser->fname == NULL) ? "function" : parser->fname,
2578
0
                         (parser->fname == NULL) ? "" : "()");
2579
0
        }
2580
0
        else {
2581
0
            PyErr_Format(PyExc_TypeError,
2582
0
                         "%.200s%s takes %s %d positional argument%s (%zd given)",
2583
0
                         (parser->fname == NULL) ? "function" : parser->fname,
2584
0
                         (parser->fname == NULL) ? "" : "()",
2585
0
                         (minpos < maxpos) ? "at most" : "exactly",
2586
0
                         maxpos,
2587
0
                         (maxpos == 1) ? "" : "s",
2588
0
                         nargs);
2589
0
        }
2590
0
        return NULL;
2591
0
    }
2592
2.39M
    if (nargs < minposonly) {
2593
0
        PyErr_Format(PyExc_TypeError,
2594
0
                     "%.200s%s takes %s %d positional argument%s"
2595
0
                     " (%zd given)",
2596
0
                     (parser->fname == NULL) ? "function" : parser->fname,
2597
0
                     (parser->fname == NULL) ? "" : "()",
2598
0
                     (varpos || minposonly < maxpos) ? "at least" : "exactly",
2599
0
                     minposonly,
2600
0
                     minposonly == 1 ? "" : "s",
2601
0
                     nargs);
2602
0
        return NULL;
2603
0
    }
2604
2605
2.39M
    if (varpos) {
2606
56
        nargs = Py_MIN(maxpos, nargs);
2607
56
    }
2608
    /* copy tuple args */
2609
5.20M
    for (i = 0; i < nargs; i++) {
2610
2.81M
        buf[i] = args[i];
2611
2.81M
    }
2612
2613
    /* copy keyword args using kwtuple to drive process */
2614
5.56M
    for (i = Py_MAX((int)nargs, posonly); i < maxargs; i++) {
2615
4.88M
        PyObject *current_arg;
2616
4.88M
        if (nkwargs) {
2617
3.17M
            keyword = PyTuple_GET_ITEM(kwtuple, i - posonly);
2618
3.17M
            if (kwargs != NULL) {
2619
205k
                if (PyDict_GetItemRef(kwargs, keyword, &current_arg) < 0) {
2620
0
                    return NULL;
2621
0
                }
2622
205k
            }
2623
2.96M
            else {
2624
2.96M
                current_arg = find_keyword(kwnames, kwstack, keyword);
2625
2.96M
            }
2626
3.17M
        }
2627
1.71M
        else if (i >= reqlimit) {
2628
1.71M
            break;
2629
1.71M
        }
2630
0
        else {
2631
0
            current_arg = NULL;
2632
0
        }
2633
2634
3.17M
        buf[i] = current_arg;
2635
2636
3.17M
        if (current_arg) {
2637
2.78M
            Py_DECREF(current_arg);
2638
2.78M
            --nkwargs;
2639
2.78M
        }
2640
384k
        else if (i < minpos || (maxpos <= i && i < reqlimit)) {
2641
            /* Less arguments than required */
2642
0
            keyword = PyTuple_GET_ITEM(kwtuple, i - posonly);
2643
0
            PyErr_Format(PyExc_TypeError,  "%.200s%s missing required "
2644
0
                         "argument '%U' (pos %d)",
2645
0
                         (parser->fname == NULL) ? "function" : parser->fname,
2646
0
                         (parser->fname == NULL) ? "" : "()",
2647
0
                         keyword, i+1);
2648
0
            return NULL;
2649
0
        }
2650
3.17M
    }
2651
2652
2.39M
    if (nkwargs > 0) {
2653
        /* make sure there are no arguments given by name and position */
2654
0
        for (i = posonly; i < nargs; i++) {
2655
0
            PyObject *current_arg;
2656
0
            keyword = PyTuple_GET_ITEM(kwtuple, i - posonly);
2657
0
            if (kwargs != NULL) {
2658
0
                if (PyDict_GetItemRef(kwargs, keyword, &current_arg) < 0) {
2659
0
                    return NULL;
2660
0
                }
2661
0
            }
2662
0
            else {
2663
0
                current_arg = find_keyword(kwnames, kwstack, keyword);
2664
0
            }
2665
0
            if (current_arg) {
2666
0
                Py_DECREF(current_arg);
2667
                /* arg present in tuple and in dict */
2668
0
                PyErr_Format(PyExc_TypeError,
2669
0
                             "argument for %.200s%s given by name ('%U') "
2670
0
                             "and position (%d)",
2671
0
                             (parser->fname == NULL) ? "function" : parser->fname,
2672
0
                             (parser->fname == NULL) ? "" : "()",
2673
0
                             keyword, i+1);
2674
0
                return NULL;
2675
0
            }
2676
0
        }
2677
2678
0
        error_unexpected_keyword_arg(kwargs, kwnames, kwtuple, parser->fname);
2679
0
        return NULL;
2680
0
    }
2681
2682
2.39M
    return buf;
2683
2.39M
}
2684
2685
static const char *
2686
skipitem(const char **p_format, va_list *p_va, int flags)
2687
13.1k
{
2688
13.1k
    const char *format = *p_format;
2689
13.1k
    char c = *format++;
2690
2691
13.1k
    switch (c) {
2692
2693
    /*
2694
     * codes that take a single data pointer as an argument
2695
     * (the type of the pointer is irrelevant)
2696
     */
2697
2698
0
    case 'b': /* byte -- very short int */
2699
0
    case 'B': /* byte as bitfield */
2700
0
    case 'h': /* short int */
2701
0
    case 'H': /* short int as bitfield */
2702
3.17k
    case 'i': /* int */
2703
3.17k
    case 'I': /* int sized bitfield */
2704
3.17k
    case 'l': /* long int */
2705
3.17k
    case 'k': /* long int sized bitfield */
2706
3.17k
    case 'L': /* long long */
2707
3.17k
    case 'K': /* long long sized bitfield */
2708
3.17k
    case 'n': /* Py_ssize_t */
2709
3.17k
    case 'f': /* float */
2710
3.17k
    case 'd': /* double */
2711
3.17k
    case 'D': /* complex double */
2712
3.17k
    case 'c': /* char */
2713
3.17k
    case 'C': /* unicode char */
2714
3.17k
    case 'p': /* boolean predicate */
2715
3.17k
    case 'S': /* string object */
2716
3.17k
    case 'Y': /* string object */
2717
3.17k
    case 'U': /* unicode string object */
2718
3.17k
        {
2719
3.17k
            if (p_va != NULL) {
2720
3.17k
                (void) va_arg(*p_va, void *);
2721
3.17k
            }
2722
3.17k
            break;
2723
3.17k
        }
2724
2725
    /* string codes */
2726
2727
0
    case 'e': /* string with encoding */
2728
0
        {
2729
0
            if (p_va != NULL) {
2730
0
                (void) va_arg(*p_va, const char *);
2731
0
            }
2732
0
            if (!(*format == 's' || *format == 't'))
2733
                /* after 'e', only 's' and 't' is allowed */
2734
0
                goto err;
2735
0
            format++;
2736
0
        }
2737
0
        _Py_FALLTHROUGH;
2738
2739
0
    case 's': /* string */
2740
0
    case 'z': /* string or None */
2741
0
    case 'y': /* bytes */
2742
0
    case 'w': /* buffer, read-write */
2743
0
        {
2744
0
            if (p_va != NULL) {
2745
0
                (void) va_arg(*p_va, char **);
2746
0
            }
2747
0
            if (c == 'w' && *format != '*')
2748
0
            {
2749
                /* after 'w', only '*' is allowed */
2750
0
                goto err;
2751
0
            }
2752
0
            if (*format == '#') {
2753
0
                if (p_va != NULL) {
2754
0
                    (void) va_arg(*p_va, Py_ssize_t *);
2755
0
                }
2756
0
                format++;
2757
0
            } else if ((c == 's' || c == 'z' || c == 'y' || c == 'w')
2758
0
                       && *format == '*')
2759
0
            {
2760
0
                format++;
2761
0
            }
2762
0
            break;
2763
0
        }
2764
2765
9.96k
    case 'O': /* object */
2766
9.96k
        {
2767
9.96k
            if (*format == '!') {
2768
0
                format++;
2769
0
                if (p_va != NULL) {
2770
0
                    (void) va_arg(*p_va, PyTypeObject*);
2771
0
                    (void) va_arg(*p_va, PyObject **);
2772
0
                }
2773
0
            }
2774
9.96k
            else if (*format == '&') {
2775
0
                typedef int (*converter)(PyObject *, void *);
2776
0
                if (p_va != NULL) {
2777
0
                    (void) va_arg(*p_va, converter);
2778
0
                    (void) va_arg(*p_va, void *);
2779
0
                }
2780
0
                format++;
2781
0
            }
2782
9.96k
            else {
2783
9.96k
                if (p_va != NULL) {
2784
9.95k
                    (void) va_arg(*p_va, PyObject **);
2785
9.95k
                }
2786
9.96k
            }
2787
9.96k
            break;
2788
0
        }
2789
2790
0
    case '(':           /* bypass tuple, not handled at all previously */
2791
0
        {
2792
0
            const char *msg;
2793
0
            for (;;) {
2794
0
                if (*format==')')
2795
0
                    break;
2796
0
                if (IS_END_OF_FORMAT(*format))
2797
0
                    return "Unmatched left paren in format "
2798
0
                           "string";
2799
0
                msg = skipitem(&format, p_va, flags);
2800
0
                if (msg)
2801
0
                    return msg;
2802
0
            }
2803
0
            format++;
2804
0
            break;
2805
0
        }
2806
2807
0
    case ')':
2808
0
        return "Unmatched right paren in format string";
2809
2810
0
    default:
2811
0
err:
2812
0
        return "impossible<bad format char>";
2813
2814
13.1k
    }
2815
2816
13.1k
    *p_format = format;
2817
13.1k
    return NULL;
2818
13.1k
}
2819
2820
2821
#undef _PyArg_CheckPositional
2822
2823
int
2824
_PyArg_CheckPositional(const char *name, Py_ssize_t nargs,
2825
                       Py_ssize_t min, Py_ssize_t max)
2826
5.96M
{
2827
5.96M
    assert(min >= 0);
2828
5.96M
    assert(min <= max);
2829
2830
5.96M
    if (nargs < min) {
2831
0
        if (name != NULL)
2832
0
            PyErr_Format(
2833
0
                PyExc_TypeError,
2834
0
                "%.200s expected %s%zd argument%s, got %zd",
2835
0
                name, (min == max ? "" : "at least "), min, min == 1 ? "" : "s", nargs);
2836
0
        else
2837
0
            PyErr_Format(
2838
0
                PyExc_TypeError,
2839
0
                "unpacked tuple should have %s%zd element%s,"
2840
0
                " but has %zd",
2841
0
                (min == max ? "" : "at least "), min, min == 1 ? "" : "s", nargs);
2842
0
        return 0;
2843
0
    }
2844
2845
5.96M
    if (nargs == 0) {
2846
16.6k
        return 1;
2847
16.6k
    }
2848
2849
5.94M
    if (nargs > max) {
2850
0
        if (name != NULL)
2851
0
            PyErr_Format(
2852
0
                PyExc_TypeError,
2853
0
                "%.200s expected %s%zd argument%s, got %zd",
2854
0
                name, (min == max ? "" : "at most "), max, max == 1 ? "" : "s", nargs);
2855
0
        else
2856
0
            PyErr_Format(
2857
0
                PyExc_TypeError,
2858
0
                "unpacked tuple should have %s%zd element%s,"
2859
0
                " but has %zd",
2860
0
                (min == max ? "" : "at most "), max, max == 1 ? "" : "s", nargs);
2861
0
        return 0;
2862
0
    }
2863
2864
5.94M
    return 1;
2865
5.94M
}
2866
2867
static int
2868
unpack_stack(PyObject *const *args, Py_ssize_t nargs, const char *name,
2869
             Py_ssize_t min, Py_ssize_t max, va_list vargs)
2870
5.96M
{
2871
5.96M
    Py_ssize_t i;
2872
5.96M
    PyObject **o;
2873
2874
5.96M
    if (!_PyArg_CheckPositional(name, nargs, min, max)) {
2875
0
        return 0;
2876
0
    }
2877
2878
13.1M
    for (i = 0; i < nargs; i++) {
2879
7.18M
        o = va_arg(vargs, PyObject **);
2880
7.18M
        *o = args[i];
2881
7.18M
    }
2882
5.96M
    return 1;
2883
5.96M
}
2884
2885
int
2886
PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...)
2887
1.77M
{
2888
1.77M
    PyObject **stack;
2889
1.77M
    Py_ssize_t nargs;
2890
1.77M
    int retval;
2891
1.77M
    va_list vargs;
2892
2893
1.77M
    if (!PyTuple_Check(args)) {
2894
0
        PyErr_SetString(PyExc_SystemError,
2895
0
            "PyArg_UnpackTuple() argument list is not a tuple");
2896
0
        return 0;
2897
0
    }
2898
1.77M
    stack = _PyTuple_ITEMS(args);
2899
1.77M
    nargs = PyTuple_GET_SIZE(args);
2900
2901
1.77M
    va_start(vargs, max);
2902
1.77M
    retval = unpack_stack(stack, nargs, name, min, max, vargs);
2903
1.77M
    va_end(vargs);
2904
1.77M
    return retval;
2905
1.77M
}
2906
2907
int
2908
_PyArg_UnpackStack(PyObject *const *args, Py_ssize_t nargs, const char *name,
2909
                   Py_ssize_t min, Py_ssize_t max, ...)
2910
4.18M
{
2911
4.18M
    int retval;
2912
4.18M
    va_list vargs;
2913
2914
4.18M
    va_start(vargs, max);
2915
4.18M
    retval = unpack_stack(args, nargs, name, min, max, vargs);
2916
4.18M
    va_end(vargs);
2917
4.18M
    return retval;
2918
4.18M
}
2919
2920
2921
#undef _PyArg_NoKeywords
2922
#undef _PyArg_NoKwnames
2923
#undef _PyArg_NoPositional
2924
2925
/* For type constructors that don't take keyword args
2926
 *
2927
 * Sets a TypeError and returns 0 if the args/kwargs is
2928
 * not empty, returns 1 otherwise
2929
 */
2930
int
2931
_PyArg_NoKeywords(const char *funcname, PyObject *kwargs)
2932
10.4M
{
2933
10.4M
    if (kwargs == NULL) {
2934
0
        return 1;
2935
0
    }
2936
10.4M
    if (!PyDict_CheckExact(kwargs)) {
2937
0
        PyErr_BadInternalCall();
2938
0
        return 0;
2939
0
    }
2940
10.4M
    if (PyDict_GET_SIZE(kwargs) == 0) {
2941
10.4M
        return 1;
2942
10.4M
    }
2943
2944
0
    PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
2945
0
                    funcname);
2946
0
    return 0;
2947
10.4M
}
2948
2949
int
2950
_PyArg_NoPositional(const char *funcname, PyObject *args)
2951
25.3k
{
2952
25.3k
    if (args == NULL)
2953
0
        return 1;
2954
25.3k
    if (!PyTuple_CheckExact(args)) {
2955
0
        PyErr_BadInternalCall();
2956
0
        return 0;
2957
0
    }
2958
25.3k
    if (PyTuple_GET_SIZE(args) == 0)
2959
25.3k
        return 1;
2960
2961
0
    PyErr_Format(PyExc_TypeError, "%.200s() takes no positional arguments",
2962
0
                    funcname);
2963
0
    return 0;
2964
25.3k
}
2965
2966
int
2967
_PyArg_NoKwnames(const char *funcname, PyObject *kwnames)
2968
0
{
2969
0
    if (kwnames == NULL) {
2970
0
        return 1;
2971
0
    }
2972
2973
0
    assert(PyTuple_CheckExact(kwnames));
2974
2975
0
    if (PyTuple_GET_SIZE(kwnames) == 0) {
2976
0
        return 1;
2977
0
    }
2978
2979
0
    PyErr_Format(PyExc_TypeError, "%s() takes no keyword arguments", funcname);
2980
0
    return 0;
2981
0
}
2982
2983
void
2984
_PyArg_Fini(void)
2985
0
{
2986
0
    struct _PyArg_Parser *tmp, *s = _PyRuntime.getargs.static_parsers;
2987
0
    while (s) {
2988
0
        tmp = s->next;
2989
0
        s->next = NULL;
2990
0
        parser_clear(s);
2991
0
        s = tmp;
2992
0
    }
2993
    _PyRuntime.getargs.static_parsers = NULL;
2994
0
}