Coverage Report

Created: 2026-03-08 06:40

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