1/*
2 * C Extension module to test Python interpreter C APIs.
3 *
4 * The 'test_*' functions exported by this module are run as part of the
5 * standard Python regression test, via Lib/test/test_capi.py.
6 */
7
8/* This module tests the public (Include/ and Include/cpython/) C API.
9   The internal C API must not be used here: use _testinternalcapi for that.
10
11   The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE
12   macro defined, but only the public C API must be tested here. */
13
14#undef Py_BUILD_CORE_MODULE
15#undef Py_BUILD_CORE_BUILTIN
16#define NEEDS_PY_IDENTIFIER
17
18/* Always enable assertions */
19#undef NDEBUG
20
21#define PY_SSIZE_T_CLEAN
22
23#include "Python.h"
24#include "datetime.h"             // PyDateTimeAPI
25#include "frameobject.h"          // PyFrame_New
26#include "marshal.h"              // PyMarshal_WriteLongToFile
27#include "structmember.h"         // PyMemberDef
28#include <float.h>                // FLT_MAX
29#include <signal.h>
30
31#ifdef MS_WINDOWS
32#  include <winsock2.h>           // struct timeval
33#endif
34
35#ifdef HAVE_SYS_WAIT_H
36#include <sys/wait.h>             // W_STOPCODE
37#endif
38
39#ifdef Py_BUILD_CORE
40#  error "_testcapi must test the public Python C API, not CPython internal C API"
41#endif
42
43#ifdef bool
44#  error "The public headers should not include <stdbool.h>, see bpo-46748"
45#endif
46
47// Forward declarations
48static struct PyModuleDef _testcapimodule;
49static PyType_Spec HeapTypeNameType_Spec;
50static PyObject *TestError;     /* set to exception object in init */
51
52
53/* Raise TestError with test_name + ": " + msg, and return NULL. */
54
55static PyObject *
56raiseTestError(const char* test_name, const char* msg)
57{
58    PyErr_Format(TestError, "%s: %s", test_name, msg);
59    return NULL;
60}
61
62/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
63
64   The ones derived from autoconf on the UNIX-like OSes can be relied
65   upon (in the absence of sloppy cross-compiling), but the Windows
66   platforms have these hardcoded.  Better safe than sorry.
67*/
68static PyObject*
69sizeof_error(const char* fatname, const char* typname,
70    int expected, int got)
71{
72    PyErr_Format(TestError,
73        "%s #define == %d but sizeof(%s) == %d",
74        fatname, expected, typname, got);
75    return (PyObject*)NULL;
76}
77
78static PyObject*
79test_config(PyObject *self, PyObject *Py_UNUSED(ignored))
80{
81#define CHECK_SIZEOF(FATNAME, TYPE) \
82            if (FATNAME != sizeof(TYPE)) \
83                return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
84
85    CHECK_SIZEOF(SIZEOF_SHORT, short);
86    CHECK_SIZEOF(SIZEOF_INT, int);
87    CHECK_SIZEOF(SIZEOF_LONG, long);
88    CHECK_SIZEOF(SIZEOF_VOID_P, void*);
89    CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
90    CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
91
92#undef CHECK_SIZEOF
93
94    Py_RETURN_NONE;
95}
96
97static PyObject*
98test_sizeof_c_types(PyObject *self, PyObject *Py_UNUSED(ignored))
99{
100#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
101#pragma GCC diagnostic push
102#pragma GCC diagnostic ignored "-Wtype-limits"
103#endif
104#define CHECK_SIZEOF(TYPE, EXPECTED)         \
105    if (EXPECTED != sizeof(TYPE))  {         \
106        PyErr_Format(TestError,              \
107            "sizeof(%s) = %u instead of %u", \
108            #TYPE, sizeof(TYPE), EXPECTED);  \
109        return (PyObject*)NULL;              \
110    }
111#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
112#define CHECK_SIGNNESS(TYPE, SIGNED)         \
113    if (IS_SIGNED(TYPE) != SIGNED) {         \
114        PyErr_Format(TestError,              \
115            "%s signness is, instead of %i",  \
116            #TYPE, IS_SIGNED(TYPE), SIGNED); \
117        return (PyObject*)NULL;              \
118    }
119
120    /* integer types */
121    CHECK_SIZEOF(Py_UCS1, 1);
122    CHECK_SIZEOF(Py_UCS2, 2);
123    CHECK_SIZEOF(Py_UCS4, 4);
124    CHECK_SIGNNESS(Py_UCS1, 0);
125    CHECK_SIGNNESS(Py_UCS2, 0);
126    CHECK_SIGNNESS(Py_UCS4, 0);
127    CHECK_SIZEOF(int32_t, 4);
128    CHECK_SIGNNESS(int32_t, 1);
129    CHECK_SIZEOF(uint32_t, 4);
130    CHECK_SIGNNESS(uint32_t, 0);
131    CHECK_SIZEOF(int64_t, 8);
132    CHECK_SIGNNESS(int64_t, 1);
133    CHECK_SIZEOF(uint64_t, 8);
134    CHECK_SIGNNESS(uint64_t, 0);
135
136    /* pointer/size types */
137    CHECK_SIZEOF(size_t, sizeof(void *));
138    CHECK_SIGNNESS(size_t, 0);
139    CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
140    CHECK_SIGNNESS(Py_ssize_t, 1);
141
142    CHECK_SIZEOF(uintptr_t, sizeof(void *));
143    CHECK_SIGNNESS(uintptr_t, 0);
144    CHECK_SIZEOF(intptr_t, sizeof(void *));
145    CHECK_SIGNNESS(intptr_t, 1);
146
147    Py_RETURN_NONE;
148
149#undef IS_SIGNED
150#undef CHECK_SIGNESS
151#undef CHECK_SIZEOF
152#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
153#pragma GCC diagnostic pop
154#endif
155}
156
157static PyObject*
158test_gc_control(PyObject *self, PyObject *Py_UNUSED(ignored))
159{
160    int orig_enabled = PyGC_IsEnabled();
161    const char* msg = "ok";
162    int old_state;
163
164    old_state = PyGC_Enable();
165    msg = "Enable(1)";
166    if (old_state != orig_enabled) {
167        goto failed;
168    }
169    msg = "IsEnabled(1)";
170    if (!PyGC_IsEnabled()) {
171        goto failed;
172    }
173
174    old_state = PyGC_Disable();
175    msg = "disable(2)";
176    if (!old_state) {
177        goto failed;
178    }
179    msg = "IsEnabled(2)";
180    if (PyGC_IsEnabled()) {
181        goto failed;
182    }
183
184    old_state = PyGC_Enable();
185    msg = "enable(3)";
186    if (old_state) {
187        goto failed;
188    }
189    msg = "IsEnabled(3)";
190    if (!PyGC_IsEnabled()) {
191        goto failed;
192    }
193
194    if (!orig_enabled) {
195        old_state = PyGC_Disable();
196        msg = "disable(4)";
197        if (old_state) {
198            goto failed;
199        }
200        msg = "IsEnabled(4)";
201        if (PyGC_IsEnabled()) {
202            goto failed;
203        }
204    }
205
206    Py_RETURN_NONE;
207
208failed:
209    /* Try to clean up if we can. */
210    if (orig_enabled) {
211        PyGC_Enable();
212    } else {
213        PyGC_Disable();
214    }
215    PyErr_Format(TestError, "GC control failed in %s", msg);
216    return NULL;
217}
218
219static PyObject*
220test_list_api(PyObject *self, PyObject *Py_UNUSED(ignored))
221{
222    PyObject* list;
223    int i;
224
225    /* SF bug 132008:  PyList_Reverse segfaults */
226#define NLIST 30
227    list = PyList_New(NLIST);
228    if (list == (PyObject*)NULL)
229        return (PyObject*)NULL;
230    /* list = range(NLIST) */
231    for (i = 0; i < NLIST; ++i) {
232        PyObject* anint = PyLong_FromLong(i);
233        if (anint == (PyObject*)NULL) {
234            Py_DECREF(list);
235            return (PyObject*)NULL;
236        }
237        PyList_SET_ITEM(list, i, anint);
238    }
239    /* list.reverse(), via PyList_Reverse() */
240    i = PyList_Reverse(list);   /* should not blow up! */
241    if (i != 0) {
242        Py_DECREF(list);
243        return (PyObject*)NULL;
244    }
245    /* Check that list == range(29, -1, -1) now */
246    for (i = 0; i < NLIST; ++i) {
247        PyObject* anint = PyList_GET_ITEM(list, i);
248        if (PyLong_AS_LONG(anint) != NLIST-1-i) {
249            PyErr_SetString(TestError,
250                            "test_list_api: reverse screwed up");
251            Py_DECREF(list);
252            return (PyObject*)NULL;
253        }
254    }
255    Py_DECREF(list);
256#undef NLIST
257
258    Py_RETURN_NONE;
259}
260
261static int
262test_dict_inner(int count)
263{
264    Py_ssize_t pos = 0, iterations = 0;
265    int i;
266    PyObject *dict = PyDict_New();
267    PyObject *v, *k;
268
269    if (dict == NULL)
270        return -1;
271
272    for (i = 0; i < count; i++) {
273        v = PyLong_FromLong(i);
274        if (v == NULL) {
275            return -1;
276        }
277        if (PyDict_SetItem(dict, v, v) < 0) {
278            Py_DECREF(v);
279            return -1;
280        }
281        Py_DECREF(v);
282    }
283
284    while (PyDict_Next(dict, &pos, &k, &v)) {
285        PyObject *o;
286        iterations++;
287
288        i = PyLong_AS_LONG(v) + 1;
289        o = PyLong_FromLong(i);
290        if (o == NULL)
291            return -1;
292        if (PyDict_SetItem(dict, k, o) < 0) {
293            Py_DECREF(o);
294            return -1;
295        }
296        Py_DECREF(o);
297    }
298
299    Py_DECREF(dict);
300
301    if (iterations != count) {
302        PyErr_SetString(
303            TestError,
304            "test_dict_iteration: dict iteration went wrong ");
305        return -1;
306    } else {
307        return 0;
308    }
309}
310
311static PyObject*
312test_dict_iteration(PyObject* self, PyObject *Py_UNUSED(ignored))
313{
314    int i;
315
316    for (i = 0; i < 200; i++) {
317        if (test_dict_inner(i) < 0) {
318            return NULL;
319        }
320    }
321
322    Py_RETURN_NONE;
323}
324
325static PyObject*
326dict_getitem_knownhash(PyObject *self, PyObject *args)
327{
328    PyObject *mp, *key, *result;
329    Py_ssize_t hash;
330
331    if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
332                          &mp, &key, &hash)) {
333        return NULL;
334    }
335
336    result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
337    if (result == NULL && !PyErr_Occurred()) {
338        _PyErr_SetKeyError(key);
339        return NULL;
340    }
341
342    Py_XINCREF(result);
343    return result;
344}
345
346/* Issue #4701: Check that PyObject_Hash implicitly calls
347 *   PyType_Ready if it hasn't already been called
348 */
349static PyTypeObject _HashInheritanceTester_Type = {
350    PyVarObject_HEAD_INIT(NULL, 0)
351    "hashinheritancetester",            /* Name of this type */
352    sizeof(PyObject),           /* Basic object size */
353    0,                          /* Item size for varobject */
354    (destructor)PyObject_Del, /* tp_dealloc */
355    0,                          /* tp_vectorcall_offset */
356    0,                          /* tp_getattr */
357    0,                          /* tp_setattr */
358    0,                          /* tp_as_async */
359    0,                          /* tp_repr */
360    0,                          /* tp_as_number */
361    0,                          /* tp_as_sequence */
362    0,                          /* tp_as_mapping */
363    0,                          /* tp_hash */
364    0,                          /* tp_call */
365    0,                          /* tp_str */
366    PyObject_GenericGetAttr,  /* tp_getattro */
367    0,                          /* tp_setattro */
368    0,                          /* tp_as_buffer */
369    Py_TPFLAGS_DEFAULT,         /* tp_flags */
370    0,                          /* tp_doc */
371    0,                          /* tp_traverse */
372    0,                          /* tp_clear */
373    0,                          /* tp_richcompare */
374    0,                          /* tp_weaklistoffset */
375    0,                          /* tp_iter */
376    0,                          /* tp_iternext */
377    0,                          /* tp_methods */
378    0,                          /* tp_members */
379    0,                          /* tp_getset */
380    0,                          /* tp_base */
381    0,                          /* tp_dict */
382    0,                          /* tp_descr_get */
383    0,                          /* tp_descr_set */
384    0,                          /* tp_dictoffset */
385    0,                          /* tp_init */
386    0,                          /* tp_alloc */
387    PyType_GenericNew,                  /* tp_new */
388};
389
390static PyObject*
391pycompilestring(PyObject* self, PyObject *obj) {
392    if (PyBytes_CheckExact(obj) == 0) {
393        PyErr_SetString(PyExc_ValueError, "Argument must be a bytes object");
394        return NULL;
395    }
396    const char *the_string = PyBytes_AsString(obj);
397    if (the_string == NULL) {
398        return NULL;
399    }
400    return Py_CompileString(the_string, "<string>", Py_file_input);
401}
402
403static PyObject*
404test_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
405{
406    PyTypeObject *type;
407    PyObject *obj;
408    Py_hash_t hash;
409
410    type = &_HashInheritanceTester_Type;
411
412    if (type->tp_dict != NULL)
413        /* The type has already been initialized. This probably means
414           -R is being used. */
415        Py_RETURN_NONE;
416
417
418    obj = PyObject_New(PyObject, type);
419    if (obj == NULL) {
420        PyErr_Clear();
421        PyErr_SetString(
422            TestError,
423            "test_lazy_hash_inheritance: failed to create object");
424        return NULL;
425    }
426
427    if (type->tp_dict != NULL) {
428        PyErr_SetString(
429            TestError,
430            "test_lazy_hash_inheritance: type initialised too soon");
431        Py_DECREF(obj);
432        return NULL;
433    }
434
435    hash = PyObject_Hash(obj);
436    if ((hash == -1) && PyErr_Occurred()) {
437        PyErr_Clear();
438        PyErr_SetString(
439            TestError,
440            "test_lazy_hash_inheritance: could not hash object");
441        Py_DECREF(obj);
442        return NULL;
443    }
444
445    if (type->tp_dict == NULL) {
446        PyErr_SetString(
447            TestError,
448            "test_lazy_hash_inheritance: type not initialised by hash()");
449        Py_DECREF(obj);
450        return NULL;
451    }
452
453    if (type->tp_hash != PyType_Type.tp_hash) {
454        PyErr_SetString(
455            TestError,
456            "test_lazy_hash_inheritance: unexpected hash function");
457        Py_DECREF(obj);
458        return NULL;
459    }
460
461    Py_DECREF(obj);
462
463    Py_RETURN_NONE;
464}
465
466
467/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
468   PyLong_{As, From}{Unsigned,}LongLong().
469
470   Note that the meat of the test is contained in testcapi_long.h.
471   This is revolting, but delicate code duplication is worse:  "almost
472   exactly the same" code is needed to test long long, but the ubiquitous
473   dependence on type names makes it impossible to use a parameterized
474   function.  A giant macro would be even worse than this.  A C++ template
475   would be perfect.
476
477   The "report an error" functions are deliberately not part of the #include
478   file:  if the test fails, you can set a breakpoint in the appropriate
479   error function directly, and crawl back from there in the debugger.
480*/
481
482#define UNBIND(X)  Py_DECREF(X); (X) = NULL
483
484static PyObject *
485raise_test_long_error(const char* msg)
486{
487    return raiseTestError("test_long_api", msg);
488}
489
490#define TESTNAME        test_long_api_inner
491#define TYPENAME        long
492#define F_S_TO_PY       PyLong_FromLong
493#define F_PY_TO_S       PyLong_AsLong
494#define F_U_TO_PY       PyLong_FromUnsignedLong
495#define F_PY_TO_U       PyLong_AsUnsignedLong
496
497#include "testcapi_long.h"
498
499static PyObject *
500test_long_api(PyObject* self, PyObject *Py_UNUSED(ignored))
501{
502    return TESTNAME(raise_test_long_error);
503}
504
505#undef TESTNAME
506#undef TYPENAME
507#undef F_S_TO_PY
508#undef F_PY_TO_S
509#undef F_U_TO_PY
510#undef F_PY_TO_U
511
512static PyObject *
513raise_test_longlong_error(const char* msg)
514{
515    return raiseTestError("test_longlong_api", msg);
516}
517
518#define TESTNAME        test_longlong_api_inner
519#define TYPENAME        long long
520#define F_S_TO_PY       PyLong_FromLongLong
521#define F_PY_TO_S       PyLong_AsLongLong
522#define F_U_TO_PY       PyLong_FromUnsignedLongLong
523#define F_PY_TO_U       PyLong_AsUnsignedLongLong
524
525#include "testcapi_long.h"
526
527static PyObject *
528test_longlong_api(PyObject* self, PyObject *args)
529{
530    return TESTNAME(raise_test_longlong_error);
531}
532
533#undef TESTNAME
534#undef TYPENAME
535#undef F_S_TO_PY
536#undef F_PY_TO_S
537#undef F_U_TO_PY
538#undef F_PY_TO_U
539
540/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
541   is tested by test_long_api_inner. This test will concentrate on proper
542   handling of overflow.
543*/
544
545static PyObject *
546test_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
547{
548    PyObject *num, *one, *temp;
549    long value;
550    int overflow;
551
552    /* Test that overflow is set properly for a large value. */
553    /* num is a number larger than LONG_MAX even on 64-bit platforms */
554    num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
555    if (num == NULL)
556        return NULL;
557    overflow = 1234;
558    value = PyLong_AsLongAndOverflow(num, &overflow);
559    Py_DECREF(num);
560    if (value == -1 && PyErr_Occurred())
561        return NULL;
562    if (value != -1)
563        return raiseTestError("test_long_and_overflow",
564            "return value was not set to -1");
565    if (overflow != 1)
566        return raiseTestError("test_long_and_overflow",
567            "overflow was not set to 1");
568
569    /* Same again, with num = LONG_MAX + 1 */
570    num = PyLong_FromLong(LONG_MAX);
571    if (num == NULL)
572        return NULL;
573    one = PyLong_FromLong(1L);
574    if (one == NULL) {
575        Py_DECREF(num);
576        return NULL;
577    }
578    temp = PyNumber_Add(num, one);
579    Py_DECREF(one);
580    Py_DECREF(num);
581    num = temp;
582    if (num == NULL)
583        return NULL;
584    overflow = 0;
585    value = PyLong_AsLongAndOverflow(num, &overflow);
586    Py_DECREF(num);
587    if (value == -1 && PyErr_Occurred())
588        return NULL;
589    if (value != -1)
590        return raiseTestError("test_long_and_overflow",
591            "return value was not set to -1");
592    if (overflow != 1)
593        return raiseTestError("test_long_and_overflow",
594            "overflow was not set to 1");
595
596    /* Test that overflow is set properly for a large negative value. */
597    /* num is a number smaller than LONG_MIN even on 64-bit platforms */
598    num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
599    if (num == NULL)
600        return NULL;
601    overflow = 1234;
602    value = PyLong_AsLongAndOverflow(num, &overflow);
603    Py_DECREF(num);
604    if (value == -1 && PyErr_Occurred())
605        return NULL;
606    if (value != -1)
607        return raiseTestError("test_long_and_overflow",
608            "return value was not set to -1");
609    if (overflow != -1)
610        return raiseTestError("test_long_and_overflow",
611            "overflow was not set to -1");
612
613    /* Same again, with num = LONG_MIN - 1 */
614    num = PyLong_FromLong(LONG_MIN);
615    if (num == NULL)
616        return NULL;
617    one = PyLong_FromLong(1L);
618    if (one == NULL) {
619        Py_DECREF(num);
620        return NULL;
621    }
622    temp = PyNumber_Subtract(num, one);
623    Py_DECREF(one);
624    Py_DECREF(num);
625    num = temp;
626    if (num == NULL)
627        return NULL;
628    overflow = 0;
629    value = PyLong_AsLongAndOverflow(num, &overflow);
630    Py_DECREF(num);
631    if (value == -1 && PyErr_Occurred())
632        return NULL;
633    if (value != -1)
634        return raiseTestError("test_long_and_overflow",
635            "return value was not set to -1");
636    if (overflow != -1)
637        return raiseTestError("test_long_and_overflow",
638            "overflow was not set to -1");
639
640    /* Test that overflow is cleared properly for small values. */
641    num = PyLong_FromString("FF", NULL, 16);
642    if (num == NULL)
643        return NULL;
644    overflow = 1234;
645    value = PyLong_AsLongAndOverflow(num, &overflow);
646    Py_DECREF(num);
647    if (value == -1 && PyErr_Occurred())
648        return NULL;
649    if (value != 0xFF)
650        return raiseTestError("test_long_and_overflow",
651            "expected return value 0xFF");
652    if (overflow != 0)
653        return raiseTestError("test_long_and_overflow",
654            "overflow was not cleared");
655
656    num = PyLong_FromString("-FF", NULL, 16);
657    if (num == NULL)
658        return NULL;
659    overflow = 0;
660    value = PyLong_AsLongAndOverflow(num, &overflow);
661    Py_DECREF(num);
662    if (value == -1 && PyErr_Occurred())
663        return NULL;
664    if (value != -0xFF)
665        return raiseTestError("test_long_and_overflow",
666            "expected return value 0xFF");
667    if (overflow != 0)
668        return raiseTestError("test_long_and_overflow",
669            "overflow was set incorrectly");
670
671    num = PyLong_FromLong(LONG_MAX);
672    if (num == NULL)
673        return NULL;
674    overflow = 1234;
675    value = PyLong_AsLongAndOverflow(num, &overflow);
676    Py_DECREF(num);
677    if (value == -1 && PyErr_Occurred())
678        return NULL;
679    if (value != LONG_MAX)
680        return raiseTestError("test_long_and_overflow",
681            "expected return value LONG_MAX");
682    if (overflow != 0)
683        return raiseTestError("test_long_and_overflow",
684            "overflow was not cleared");
685
686    num = PyLong_FromLong(LONG_MIN);
687    if (num == NULL)
688        return NULL;
689    overflow = 0;
690    value = PyLong_AsLongAndOverflow(num, &overflow);
691    Py_DECREF(num);
692    if (value == -1 && PyErr_Occurred())
693        return NULL;
694    if (value != LONG_MIN)
695        return raiseTestError("test_long_and_overflow",
696            "expected return value LONG_MIN");
697    if (overflow != 0)
698        return raiseTestError("test_long_and_overflow",
699            "overflow was not cleared");
700
701    Py_RETURN_NONE;
702}
703
704/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
705   long long is tested by test_long_api_inner. This test will
706   concentrate on proper handling of overflow.
707*/
708
709static PyObject *
710test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
711{
712    PyObject *num, *one, *temp;
713    long long value;
714    int overflow;
715
716    /* Test that overflow is set properly for a large value. */
717    /* num is a number larger than LLONG_MAX on a typical machine. */
718    num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
719    if (num == NULL)
720        return NULL;
721    overflow = 1234;
722    value = PyLong_AsLongLongAndOverflow(num, &overflow);
723    Py_DECREF(num);
724    if (value == -1 && PyErr_Occurred())
725        return NULL;
726    if (value != -1)
727        return raiseTestError("test_long_long_and_overflow",
728            "return value was not set to -1");
729    if (overflow != 1)
730        return raiseTestError("test_long_long_and_overflow",
731            "overflow was not set to 1");
732
733    /* Same again, with num = LLONG_MAX + 1 */
734    num = PyLong_FromLongLong(LLONG_MAX);
735    if (num == NULL)
736        return NULL;
737    one = PyLong_FromLong(1L);
738    if (one == NULL) {
739        Py_DECREF(num);
740        return NULL;
741    }
742    temp = PyNumber_Add(num, one);
743    Py_DECREF(one);
744    Py_DECREF(num);
745    num = temp;
746    if (num == NULL)
747        return NULL;
748    overflow = 0;
749    value = PyLong_AsLongLongAndOverflow(num, &overflow);
750    Py_DECREF(num);
751    if (value == -1 && PyErr_Occurred())
752        return NULL;
753    if (value != -1)
754        return raiseTestError("test_long_long_and_overflow",
755            "return value was not set to -1");
756    if (overflow != 1)
757        return raiseTestError("test_long_long_and_overflow",
758            "overflow was not set to 1");
759
760    /* Test that overflow is set properly for a large negative value. */
761    /* num is a number smaller than LLONG_MIN on a typical platform */
762    num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
763    if (num == NULL)
764        return NULL;
765    overflow = 1234;
766    value = PyLong_AsLongLongAndOverflow(num, &overflow);
767    Py_DECREF(num);
768    if (value == -1 && PyErr_Occurred())
769        return NULL;
770    if (value != -1)
771        return raiseTestError("test_long_long_and_overflow",
772            "return value was not set to -1");
773    if (overflow != -1)
774        return raiseTestError("test_long_long_and_overflow",
775            "overflow was not set to -1");
776
777    /* Same again, with num = LLONG_MIN - 1 */
778    num = PyLong_FromLongLong(LLONG_MIN);
779    if (num == NULL)
780        return NULL;
781    one = PyLong_FromLong(1L);
782    if (one == NULL) {
783        Py_DECREF(num);
784        return NULL;
785    }
786    temp = PyNumber_Subtract(num, one);
787    Py_DECREF(one);
788    Py_DECREF(num);
789    num = temp;
790    if (num == NULL)
791        return NULL;
792    overflow = 0;
793    value = PyLong_AsLongLongAndOverflow(num, &overflow);
794    Py_DECREF(num);
795    if (value == -1 && PyErr_Occurred())
796        return NULL;
797    if (value != -1)
798        return raiseTestError("test_long_long_and_overflow",
799            "return value was not set to -1");
800    if (overflow != -1)
801        return raiseTestError("test_long_long_and_overflow",
802            "overflow was not set to -1");
803
804    /* Test that overflow is cleared properly for small values. */
805    num = PyLong_FromString("FF", NULL, 16);
806    if (num == NULL)
807        return NULL;
808    overflow = 1234;
809    value = PyLong_AsLongLongAndOverflow(num, &overflow);
810    Py_DECREF(num);
811    if (value == -1 && PyErr_Occurred())
812        return NULL;
813    if (value != 0xFF)
814        return raiseTestError("test_long_long_and_overflow",
815            "expected return value 0xFF");
816    if (overflow != 0)
817        return raiseTestError("test_long_long_and_overflow",
818            "overflow was not cleared");
819
820    num = PyLong_FromString("-FF", NULL, 16);
821    if (num == NULL)
822        return NULL;
823    overflow = 0;
824    value = PyLong_AsLongLongAndOverflow(num, &overflow);
825    Py_DECREF(num);
826    if (value == -1 && PyErr_Occurred())
827        return NULL;
828    if (value != -0xFF)
829        return raiseTestError("test_long_long_and_overflow",
830            "expected return value 0xFF");
831    if (overflow != 0)
832        return raiseTestError("test_long_long_and_overflow",
833            "overflow was set incorrectly");
834
835    num = PyLong_FromLongLong(LLONG_MAX);
836    if (num == NULL)
837        return NULL;
838    overflow = 1234;
839    value = PyLong_AsLongLongAndOverflow(num, &overflow);
840    Py_DECREF(num);
841    if (value == -1 && PyErr_Occurred())
842        return NULL;
843    if (value != LLONG_MAX)
844        return raiseTestError("test_long_long_and_overflow",
845            "expected return value LLONG_MAX");
846    if (overflow != 0)
847        return raiseTestError("test_long_long_and_overflow",
848            "overflow was not cleared");
849
850    num = PyLong_FromLongLong(LLONG_MIN);
851    if (num == NULL)
852        return NULL;
853    overflow = 0;
854    value = PyLong_AsLongLongAndOverflow(num, &overflow);
855    Py_DECREF(num);
856    if (value == -1 && PyErr_Occurred())
857        return NULL;
858    if (value != LLONG_MIN)
859        return raiseTestError("test_long_long_and_overflow",
860            "expected return value LLONG_MIN");
861    if (overflow != 0)
862        return raiseTestError("test_long_long_and_overflow",
863            "overflow was not cleared");
864
865    Py_RETURN_NONE;
866}
867
868/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
869   non-integer arguments are handled correctly. It should be extended to
870   test overflow handling.
871 */
872
873static PyObject *
874test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored))
875{
876    size_t out_u;
877    Py_ssize_t out_s;
878
879    Py_INCREF(Py_None);
880
881    out_u = PyLong_AsSize_t(Py_None);
882    if (out_u != (size_t)-1 || !PyErr_Occurred())
883        return raiseTestError("test_long_as_size_t",
884                              "PyLong_AsSize_t(None) didn't complain");
885    if (!PyErr_ExceptionMatches(PyExc_TypeError))
886        return raiseTestError("test_long_as_size_t",
887                              "PyLong_AsSize_t(None) raised "
888                              "something other than TypeError");
889    PyErr_Clear();
890
891    out_s = PyLong_AsSsize_t(Py_None);
892    if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
893        return raiseTestError("test_long_as_size_t",
894                              "PyLong_AsSsize_t(None) didn't complain");
895    if (!PyErr_ExceptionMatches(PyExc_TypeError))
896        return raiseTestError("test_long_as_size_t",
897                              "PyLong_AsSsize_t(None) raised "
898                              "something other than TypeError");
899    PyErr_Clear();
900
901    /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
902    return Py_None;
903}
904
905static PyObject *
906test_long_as_unsigned_long_long_mask(PyObject *self,
907                                     PyObject *Py_UNUSED(ignored))
908{
909    unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL);
910
911    if (res != (unsigned long long)-1 || !PyErr_Occurred()) {
912        return raiseTestError("test_long_as_unsigned_long_long_mask",
913                              "PyLong_AsUnsignedLongLongMask(NULL) didn't "
914                              "complain");
915    }
916    if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
917        return raiseTestError("test_long_as_unsigned_long_long_mask",
918                              "PyLong_AsUnsignedLongLongMask(NULL) raised "
919                              "something other than SystemError");
920    }
921    PyErr_Clear();
922    Py_RETURN_NONE;
923}
924
925/* Test the PyLong_AsDouble API. At present this just tests that
926   non-integer arguments are handled correctly.
927 */
928
929static PyObject *
930test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
931{
932    double out;
933
934    Py_INCREF(Py_None);
935
936    out = PyLong_AsDouble(Py_None);
937    if (out != -1.0 || !PyErr_Occurred())
938        return raiseTestError("test_long_as_double",
939                              "PyLong_AsDouble(None) didn't complain");
940    if (!PyErr_ExceptionMatches(PyExc_TypeError))
941        return raiseTestError("test_long_as_double",
942                              "PyLong_AsDouble(None) raised "
943                              "something other than TypeError");
944    PyErr_Clear();
945
946    /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
947    return Py_None;
948}
949
950/* Test the L code for PyArg_ParseTuple.  This should deliver a long long
951   for both long and int arguments.  The test may leak a little memory if
952   it fails.
953*/
954static PyObject *
955test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
956{
957    PyObject *tuple, *num;
958    long long value;
959
960    tuple = PyTuple_New(1);
961    if (tuple == NULL)
962        return NULL;
963
964    num = PyLong_FromLong(42);
965    if (num == NULL)
966        return NULL;
967
968    PyTuple_SET_ITEM(tuple, 0, num);
969
970    value = -1;
971    if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
972        return NULL;
973    }
974    if (value != 42)
975        return raiseTestError("test_L_code",
976            "L code returned wrong value for long 42");
977
978    Py_DECREF(num);
979    num = PyLong_FromLong(42);
980    if (num == NULL)
981        return NULL;
982
983    PyTuple_SET_ITEM(tuple, 0, num);
984
985    value = -1;
986    if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
987        return NULL;
988    }
989    if (value != 42)
990        return raiseTestError("test_L_code",
991            "L code returned wrong value for int 42");
992
993    Py_DECREF(tuple);
994    Py_RETURN_NONE;
995}
996
997static PyObject *
998return_none(void *unused)
999{
1000    Py_RETURN_NONE;
1001}
1002
1003static PyObject *
1004raise_error(void *unused)
1005{
1006    PyErr_SetNone(PyExc_ValueError);
1007    return NULL;
1008}
1009
1010static int
1011test_buildvalue_N_error(const char *fmt)
1012{
1013    PyObject *arg, *res;
1014
1015    arg = PyList_New(0);
1016    if (arg == NULL) {
1017        return -1;
1018    }
1019
1020    Py_INCREF(arg);
1021    res = Py_BuildValue(fmt, return_none, NULL, arg);
1022    if (res == NULL) {
1023        return -1;
1024    }
1025    Py_DECREF(res);
1026    if (Py_REFCNT(arg) != 1) {
1027        PyErr_Format(TestError, "test_buildvalue_N: "
1028                     "arg was not decrefed in successful "
1029                     "Py_BuildValue(\"%s\")", fmt);
1030        return -1;
1031    }
1032
1033    Py_INCREF(arg);
1034    res = Py_BuildValue(fmt, raise_error, NULL, arg);
1035    if (res != NULL || !PyErr_Occurred()) {
1036        PyErr_Format(TestError, "test_buildvalue_N: "
1037                     "Py_BuildValue(\"%s\") didn't complain", fmt);
1038        return -1;
1039    }
1040    PyErr_Clear();
1041    if (Py_REFCNT(arg) != 1) {
1042        PyErr_Format(TestError, "test_buildvalue_N: "
1043                     "arg was not decrefed in failed "
1044                     "Py_BuildValue(\"%s\")", fmt);
1045        return -1;
1046    }
1047    Py_DECREF(arg);
1048    return 0;
1049}
1050
1051static PyObject *
1052test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
1053{
1054    PyObject *arg, *res;
1055
1056    arg = PyList_New(0);
1057    if (arg == NULL) {
1058        return NULL;
1059    }
1060    Py_INCREF(arg);
1061    res = Py_BuildValue("N", arg);
1062    if (res == NULL) {
1063        return NULL;
1064    }
1065    if (res != arg) {
1066        return raiseTestError("test_buildvalue_N",
1067                              "Py_BuildValue(\"N\") returned wrong result");
1068    }
1069    if (Py_REFCNT(arg) != 2) {
1070        return raiseTestError("test_buildvalue_N",
1071                              "arg was not decrefed in Py_BuildValue(\"N\")");
1072    }
1073    Py_DECREF(res);
1074    Py_DECREF(arg);
1075
1076    if (test_buildvalue_N_error("O&N") < 0)
1077        return NULL;
1078    if (test_buildvalue_N_error("(O&N)") < 0)
1079        return NULL;
1080    if (test_buildvalue_N_error("[O&N]") < 0)
1081        return NULL;
1082    if (test_buildvalue_N_error("{O&N}") < 0)
1083        return NULL;
1084    if (test_buildvalue_N_error("{()O&(())N}") < 0)
1085        return NULL;
1086
1087    Py_RETURN_NONE;
1088}
1089
1090
1091static PyObject *
1092test_get_statictype_slots(PyObject *self, PyObject *Py_UNUSED(ignored))
1093{
1094    newfunc tp_new = PyType_GetSlot(&PyLong_Type, Py_tp_new);
1095    if (PyLong_Type.tp_new != tp_new) {
1096        PyErr_SetString(PyExc_AssertionError, "mismatch: tp_new of long");
1097        return NULL;
1098    }
1099
1100    reprfunc tp_repr = PyType_GetSlot(&PyLong_Type, Py_tp_repr);
1101    if (PyLong_Type.tp_repr != tp_repr) {
1102        PyErr_SetString(PyExc_AssertionError, "mismatch: tp_repr of long");
1103        return NULL;
1104    }
1105
1106    ternaryfunc tp_call = PyType_GetSlot(&PyLong_Type, Py_tp_call);
1107    if (tp_call != NULL) {
1108        PyErr_SetString(PyExc_AssertionError, "mismatch: tp_call of long");
1109        return NULL;
1110    }
1111
1112    binaryfunc nb_add = PyType_GetSlot(&PyLong_Type, Py_nb_add);
1113    if (PyLong_Type.tp_as_number->nb_add != nb_add) {
1114        PyErr_SetString(PyExc_AssertionError, "mismatch: nb_add of long");
1115        return NULL;
1116    }
1117
1118    lenfunc mp_length = PyType_GetSlot(&PyLong_Type, Py_mp_length);
1119    if (mp_length != NULL) {
1120        PyErr_SetString(PyExc_AssertionError, "mismatch: mp_length of long");
1121        return NULL;
1122    }
1123
1124    void *over_value = PyType_GetSlot(&PyLong_Type, Py_bf_releasebuffer + 1);
1125    if (over_value != NULL) {
1126        PyErr_SetString(PyExc_AssertionError, "mismatch: max+1 of long");
1127        return NULL;
1128    }
1129
1130    tp_new = PyType_GetSlot(&PyLong_Type, 0);
1131    if (tp_new != NULL) {
1132        PyErr_SetString(PyExc_AssertionError, "mismatch: slot 0 of long");
1133        return NULL;
1134    }
1135    if (PyErr_ExceptionMatches(PyExc_SystemError)) {
1136        // This is the right exception
1137        PyErr_Clear();
1138    }
1139    else {
1140        return NULL;
1141    }
1142
1143    Py_RETURN_NONE;
1144}
1145
1146
1147static PyObject *
1148test_get_type_name(PyObject *self, PyObject *Py_UNUSED(ignored))
1149{
1150    PyObject *tp_name = PyType_GetName(&PyLong_Type);
1151    assert(strcmp(PyUnicode_AsUTF8(tp_name), "int") == 0);
1152    Py_DECREF(tp_name);
1153
1154    tp_name = PyType_GetName(&PyModule_Type);
1155    assert(strcmp(PyUnicode_AsUTF8(tp_name), "module") == 0);
1156    Py_DECREF(tp_name);
1157
1158    PyObject *HeapTypeNameType = PyType_FromSpec(&HeapTypeNameType_Spec);
1159    if (HeapTypeNameType == NULL) {
1160        Py_RETURN_NONE;
1161    }
1162    tp_name = PyType_GetName((PyTypeObject *)HeapTypeNameType);
1163    assert(strcmp(PyUnicode_AsUTF8(tp_name), "HeapTypeNameType") == 0);
1164    Py_DECREF(tp_name);
1165
1166    PyObject *name = PyUnicode_FromString("test_name");
1167    if (name == NULL) {
1168        goto done;
1169    }
1170    if (PyObject_SetAttrString(HeapTypeNameType, "__name__", name) < 0) {
1171        Py_DECREF(name);
1172        goto done;
1173    }
1174    tp_name = PyType_GetName((PyTypeObject *)HeapTypeNameType);
1175    assert(strcmp(PyUnicode_AsUTF8(tp_name), "test_name") == 0);
1176    Py_DECREF(name);
1177    Py_DECREF(tp_name);
1178
1179  done:
1180    Py_DECREF(HeapTypeNameType);
1181    Py_RETURN_NONE;
1182}
1183
1184
1185static PyObject *
1186simple_str(PyObject *self) {
1187    return PyUnicode_FromString("<test>");
1188}
1189
1190
1191static PyObject *
1192test_type_from_ephemeral_spec(PyObject *self, PyObject *Py_UNUSED(ignored))
1193{
1194    // Test that a heap type can be created from a spec that's later deleted
1195    // (along with all its contents).
1196    // All necessary data must be copied and held by the class
1197    PyType_Spec *spec = NULL;
1198    char *name = NULL;
1199    char *doc = NULL;
1200    PyType_Slot *slots = NULL;
1201    PyObject *class = NULL;
1202    PyObject *instance = NULL;
1203    PyObject *obj = NULL;
1204    PyObject *result = NULL;
1205
1206    /* create a spec (and all its contents) on the heap */
1207
1208    const char NAME[] = "testcapi._Test";
1209    const char DOC[] = "a test class";
1210
1211    spec = PyMem_New(PyType_Spec, 1);
1212    if (spec == NULL) {
1213        PyErr_NoMemory();
1214        goto finally;
1215    }
1216    name = PyMem_New(char, sizeof(NAME));
1217    if (name == NULL) {
1218        PyErr_NoMemory();
1219        goto finally;
1220    }
1221    memcpy(name, NAME, sizeof(NAME));
1222
1223    doc = PyMem_New(char, sizeof(DOC));
1224    if (doc == NULL) {
1225        PyErr_NoMemory();
1226        goto finally;
1227    }
1228    memcpy(doc, DOC, sizeof(DOC));
1229
1230    spec->name = name;
1231    spec->basicsize = sizeof(PyObject);
1232    spec->itemsize = 0;
1233    spec->flags = Py_TPFLAGS_DEFAULT;
1234    slots = PyMem_New(PyType_Slot, 3);
1235    if (slots == NULL) {
1236        PyErr_NoMemory();
1237        goto finally;
1238    }
1239    slots[0].slot = Py_tp_str;
1240    slots[0].pfunc = simple_str;
1241    slots[1].slot = Py_tp_doc;
1242    slots[1].pfunc = doc;
1243    slots[2].slot = 0;
1244    slots[2].pfunc = NULL;
1245    spec->slots = slots;
1246
1247    /* create the class */
1248
1249    class = PyType_FromSpec(spec);
1250    if (class == NULL) {
1251        goto finally;
1252    }
1253
1254    /* deallocate the spec (and all contents) */
1255
1256    // (Explicitly ovewrite memory before freeing,
1257    // so bugs show themselves even without the debug allocator's help.)
1258    memset(spec, 0xdd, sizeof(PyType_Spec));
1259    PyMem_Del(spec);
1260    spec = NULL;
1261    memset(name, 0xdd, sizeof(NAME));
1262    PyMem_Del(name);
1263    name = NULL;
1264    memset(doc, 0xdd, sizeof(DOC));
1265    PyMem_Del(doc);
1266    doc = NULL;
1267    memset(slots, 0xdd, 3 * sizeof(PyType_Slot));
1268    PyMem_Del(slots);
1269    slots = NULL;
1270
1271    /* check that everything works */
1272
1273    PyTypeObject *class_tp = (PyTypeObject *)class;
1274    PyHeapTypeObject *class_ht = (PyHeapTypeObject *)class;
1275    assert(strcmp(class_tp->tp_name, "testcapi._Test") == 0);
1276    assert(strcmp(PyUnicode_AsUTF8(class_ht->ht_name), "_Test") == 0);
1277    assert(strcmp(PyUnicode_AsUTF8(class_ht->ht_qualname), "_Test") == 0);
1278    assert(strcmp(class_tp->tp_doc, "a test class") == 0);
1279
1280    // call and check __str__
1281    instance = PyObject_CallNoArgs(class);
1282    if (instance == NULL) {
1283        goto finally;
1284    }
1285    obj = PyObject_Str(instance);
1286    if (obj == NULL) {
1287        goto finally;
1288    }
1289    assert(strcmp(PyUnicode_AsUTF8(obj), "<test>") == 0);
1290    Py_CLEAR(obj);
1291
1292    result = Py_NewRef(Py_None);
1293  finally:
1294    PyMem_Del(spec);
1295    PyMem_Del(name);
1296    PyMem_Del(doc);
1297    PyMem_Del(slots);
1298    Py_XDECREF(class);
1299    Py_XDECREF(instance);
1300    Py_XDECREF(obj);
1301    return result;
1302}
1303
1304
1305static PyObject *
1306test_get_type_qualname(PyObject *self, PyObject *Py_UNUSED(ignored))
1307{
1308    PyObject *tp_qualname = PyType_GetQualName(&PyLong_Type);
1309    assert(strcmp(PyUnicode_AsUTF8(tp_qualname), "int") == 0);
1310    Py_DECREF(tp_qualname);
1311
1312    tp_qualname = PyType_GetQualName(&PyODict_Type);
1313    assert(strcmp(PyUnicode_AsUTF8(tp_qualname), "OrderedDict") == 0);
1314    Py_DECREF(tp_qualname);
1315
1316    PyObject *HeapTypeNameType = PyType_FromSpec(&HeapTypeNameType_Spec);
1317    if (HeapTypeNameType == NULL) {
1318        Py_RETURN_NONE;
1319    }
1320    tp_qualname = PyType_GetQualName((PyTypeObject *)HeapTypeNameType);
1321    assert(strcmp(PyUnicode_AsUTF8(tp_qualname), "HeapTypeNameType") == 0);
1322    Py_DECREF(tp_qualname);
1323
1324    PyObject *spec_name = PyUnicode_FromString(HeapTypeNameType_Spec.name);
1325    if (spec_name == NULL) {
1326        goto done;
1327    }
1328    if (PyObject_SetAttrString(HeapTypeNameType,
1329                               "__qualname__", spec_name) < 0) {
1330        Py_DECREF(spec_name);
1331        goto done;
1332    }
1333    tp_qualname = PyType_GetQualName((PyTypeObject *)HeapTypeNameType);
1334    assert(strcmp(PyUnicode_AsUTF8(tp_qualname),
1335                  "_testcapi.HeapTypeNameType") == 0);
1336    Py_DECREF(spec_name);
1337    Py_DECREF(tp_qualname);
1338
1339  done:
1340    Py_DECREF(HeapTypeNameType);
1341    Py_RETURN_NONE;
1342}
1343
1344
1345static PyObject *
1346get_args(PyObject *self, PyObject *args)
1347{
1348    if (args == NULL) {
1349        args = Py_None;
1350    }
1351    Py_INCREF(args);
1352    return args;
1353}
1354
1355static PyObject *
1356get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1357{
1358    if (kwargs == NULL) {
1359        kwargs = Py_None;
1360    }
1361    Py_INCREF(kwargs);
1362    return kwargs;
1363}
1364
1365/* Test tuple argument processing */
1366static PyObject *
1367getargs_tuple(PyObject *self, PyObject *args)
1368{
1369    int a, b, c;
1370    if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1371        return NULL;
1372    return Py_BuildValue("iii", a, b, c);
1373}
1374
1375/* test PyArg_ParseTupleAndKeywords */
1376static PyObject *
1377getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1378{
1379    static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
1380    static const char fmt[] = "(ii)i|(i(ii))(iii)i";
1381    int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
1382
1383    if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1384        &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1385        &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1386        return NULL;
1387    return Py_BuildValue("iiiiiiiiii",
1388        int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1389        int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
1390}
1391
1392/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1393static PyObject *
1394getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1395{
1396    static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1397    int required = -1;
1398    int optional = -1;
1399    int keyword_only = -1;
1400
1401    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1402                                     &required, &optional, &keyword_only))
1403        return NULL;
1404    return Py_BuildValue("iii", required, optional, keyword_only);
1405}
1406
1407/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1408static PyObject *
1409getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1410{
1411    static char *keywords[] = {"", "", "keyword", NULL};
1412    int required = -1;
1413    int optional = -1;
1414    int keyword = -1;
1415
1416    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1417                                     &required, &optional, &keyword))
1418        return NULL;
1419    return Py_BuildValue("iii", required, optional, keyword);
1420}
1421
1422/* Functions to call PyArg_ParseTuple with integer format codes,
1423   and return the result.
1424*/
1425static PyObject *
1426getargs_b(PyObject *self, PyObject *args)
1427{
1428    unsigned char value;
1429    if (!PyArg_ParseTuple(args, "b", &value))
1430        return NULL;
1431    return PyLong_FromUnsignedLong((unsigned long)value);
1432}
1433
1434static PyObject *
1435getargs_B(PyObject *self, PyObject *args)
1436{
1437    unsigned char value;
1438    if (!PyArg_ParseTuple(args, "B", &value))
1439        return NULL;
1440    return PyLong_FromUnsignedLong((unsigned long)value);
1441}
1442
1443static PyObject *
1444getargs_h(PyObject *self, PyObject *args)
1445{
1446    short value;
1447    if (!PyArg_ParseTuple(args, "h", &value))
1448        return NULL;
1449    return PyLong_FromLong((long)value);
1450}
1451
1452static PyObject *
1453getargs_H(PyObject *self, PyObject *args)
1454{
1455    unsigned short value;
1456    if (!PyArg_ParseTuple(args, "H", &value))
1457        return NULL;
1458    return PyLong_FromUnsignedLong((unsigned long)value);
1459}
1460
1461static PyObject *
1462getargs_I(PyObject *self, PyObject *args)
1463{
1464    unsigned int value;
1465    if (!PyArg_ParseTuple(args, "I", &value))
1466        return NULL;
1467    return PyLong_FromUnsignedLong((unsigned long)value);
1468}
1469
1470static PyObject *
1471getargs_k(PyObject *self, PyObject *args)
1472{
1473    unsigned long value;
1474    if (!PyArg_ParseTuple(args, "k", &value))
1475        return NULL;
1476    return PyLong_FromUnsignedLong(value);
1477}
1478
1479static PyObject *
1480getargs_i(PyObject *self, PyObject *args)
1481{
1482    int value;
1483    if (!PyArg_ParseTuple(args, "i", &value))
1484        return NULL;
1485    return PyLong_FromLong((long)value);
1486}
1487
1488static PyObject *
1489getargs_l(PyObject *self, PyObject *args)
1490{
1491    long value;
1492    if (!PyArg_ParseTuple(args, "l", &value))
1493        return NULL;
1494    return PyLong_FromLong(value);
1495}
1496
1497static PyObject *
1498getargs_n(PyObject *self, PyObject *args)
1499{
1500    Py_ssize_t value;
1501    if (!PyArg_ParseTuple(args, "n", &value))
1502        return NULL;
1503    return PyLong_FromSsize_t(value);
1504}
1505
1506static PyObject *
1507getargs_p(PyObject *self, PyObject *args)
1508{
1509    int value;
1510    if (!PyArg_ParseTuple(args, "p", &value))
1511        return NULL;
1512    return PyLong_FromLong(value);
1513}
1514
1515static PyObject *
1516getargs_L(PyObject *self, PyObject *args)
1517{
1518    long long value;
1519    if (!PyArg_ParseTuple(args, "L", &value))
1520        return NULL;
1521    return PyLong_FromLongLong(value);
1522}
1523
1524static PyObject *
1525getargs_K(PyObject *self, PyObject *args)
1526{
1527    unsigned long long value;
1528    if (!PyArg_ParseTuple(args, "K", &value))
1529        return NULL;
1530    return PyLong_FromUnsignedLongLong(value);
1531}
1532
1533/* This function not only tests the 'k' getargs code, but also the
1534   PyLong_AsUnsignedLongMask() function. */
1535static PyObject *
1536test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
1537{
1538    PyObject *tuple, *num;
1539    unsigned long value;
1540
1541    tuple = PyTuple_New(1);
1542    if (tuple == NULL)
1543        return NULL;
1544
1545    /* a number larger than ULONG_MAX even on 64-bit platforms */
1546    num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1547    if (num == NULL)
1548        return NULL;
1549
1550    value = PyLong_AsUnsignedLongMask(num);
1551    if (value != ULONG_MAX)
1552        return raiseTestError("test_k_code",
1553            "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
1554
1555    PyTuple_SET_ITEM(tuple, 0, num);
1556
1557    value = 0;
1558    if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
1559        return NULL;
1560    }
1561    if (value != ULONG_MAX)
1562        return raiseTestError("test_k_code",
1563            "k code returned wrong value for long 0xFFF...FFF");
1564
1565    Py_DECREF(num);
1566    num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1567    if (num == NULL)
1568        return NULL;
1569
1570    value = PyLong_AsUnsignedLongMask(num);
1571    if (value != (unsigned long)-0x42)
1572        return raiseTestError("test_k_code",
1573                              "PyLong_AsUnsignedLongMask() returned wrong "
1574                              "value for long -0xFFF..000042");
1575
1576    PyTuple_SET_ITEM(tuple, 0, num);
1577
1578    value = 0;
1579    if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
1580        return NULL;
1581    }
1582    if (value != (unsigned long)-0x42)
1583        return raiseTestError("test_k_code",
1584            "k code returned wrong value for long -0xFFF..000042");
1585
1586    Py_DECREF(tuple);
1587    Py_RETURN_NONE;
1588}
1589
1590static PyObject *
1591getargs_f(PyObject *self, PyObject *args)
1592{
1593    float f;
1594    if (!PyArg_ParseTuple(args, "f", &f))
1595        return NULL;
1596    return PyFloat_FromDouble(f);
1597}
1598
1599static PyObject *
1600getargs_d(PyObject *self, PyObject *args)
1601{
1602    double d;
1603    if (!PyArg_ParseTuple(args, "d", &d))
1604        return NULL;
1605    return PyFloat_FromDouble(d);
1606}
1607
1608static PyObject *
1609getargs_D(PyObject *self, PyObject *args)
1610{
1611    Py_complex cval;
1612    if (!PyArg_ParseTuple(args, "D", &cval))
1613        return NULL;
1614    return PyComplex_FromCComplex(cval);
1615}
1616
1617static PyObject *
1618getargs_S(PyObject *self, PyObject *args)
1619{
1620    PyObject *obj;
1621    if (!PyArg_ParseTuple(args, "S", &obj))
1622        return NULL;
1623    Py_INCREF(obj);
1624    return obj;
1625}
1626
1627static PyObject *
1628getargs_Y(PyObject *self, PyObject *args)
1629{
1630    PyObject *obj;
1631    if (!PyArg_ParseTuple(args, "Y", &obj))
1632        return NULL;
1633    Py_INCREF(obj);
1634    return obj;
1635}
1636
1637static PyObject *
1638getargs_U(PyObject *self, PyObject *args)
1639{
1640    PyObject *obj;
1641    if (!PyArg_ParseTuple(args, "U", &obj))
1642        return NULL;
1643    Py_INCREF(obj);
1644    return obj;
1645}
1646
1647static PyObject *
1648getargs_c(PyObject *self, PyObject *args)
1649{
1650    char c;
1651    if (!PyArg_ParseTuple(args, "c", &c))
1652        return NULL;
1653    return PyLong_FromLong((unsigned char)c);
1654}
1655
1656static PyObject *
1657getargs_C(PyObject *self, PyObject *args)
1658{
1659    int c;
1660    if (!PyArg_ParseTuple(args, "C", &c))
1661        return NULL;
1662    return PyLong_FromLong(c);
1663}
1664
1665static PyObject *
1666getargs_s(PyObject *self, PyObject *args)
1667{
1668    char *str;
1669    if (!PyArg_ParseTuple(args, "s", &str))
1670        return NULL;
1671    return PyBytes_FromString(str);
1672}
1673
1674static PyObject *
1675getargs_s_star(PyObject *self, PyObject *args)
1676{
1677    Py_buffer buffer;
1678    PyObject *bytes;
1679    if (!PyArg_ParseTuple(args, "s*", &buffer))
1680        return NULL;
1681    bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1682    PyBuffer_Release(&buffer);
1683    return bytes;
1684}
1685
1686static PyObject *
1687getargs_s_hash(PyObject *self, PyObject *args)
1688{
1689    char *str;
1690    Py_ssize_t size;
1691    if (!PyArg_ParseTuple(args, "s#", &str, &size))
1692        return NULL;
1693    return PyBytes_FromStringAndSize(str, size);
1694}
1695
1696static PyObject *
1697getargs_z(PyObject *self, PyObject *args)
1698{
1699    char *str;
1700    if (!PyArg_ParseTuple(args, "z", &str))
1701        return NULL;
1702    if (str != NULL)
1703        return PyBytes_FromString(str);
1704    else
1705        Py_RETURN_NONE;
1706}
1707
1708static PyObject *
1709getargs_z_star(PyObject *self, PyObject *args)
1710{
1711    Py_buffer buffer;
1712    PyObject *bytes;
1713    if (!PyArg_ParseTuple(args, "z*", &buffer))
1714        return NULL;
1715    if (buffer.buf != NULL)
1716        bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1717    else {
1718        Py_INCREF(Py_None);
1719        bytes = Py_None;
1720    }
1721    PyBuffer_Release(&buffer);
1722    return bytes;
1723}
1724
1725static PyObject *
1726getargs_z_hash(PyObject *self, PyObject *args)
1727{
1728    char *str;
1729    Py_ssize_t size;
1730    if (!PyArg_ParseTuple(args, "z#", &str, &size))
1731        return NULL;
1732    if (str != NULL)
1733        return PyBytes_FromStringAndSize(str, size);
1734    else
1735        Py_RETURN_NONE;
1736}
1737
1738static PyObject *
1739getargs_y(PyObject *self, PyObject *args)
1740{
1741    char *str;
1742    if (!PyArg_ParseTuple(args, "y", &str))
1743        return NULL;
1744    return PyBytes_FromString(str);
1745}
1746
1747static PyObject *
1748getargs_y_star(PyObject *self, PyObject *args)
1749{
1750    Py_buffer buffer;
1751    PyObject *bytes;
1752    if (!PyArg_ParseTuple(args, "y*", &buffer))
1753        return NULL;
1754    bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1755    PyBuffer_Release(&buffer);
1756    return bytes;
1757}
1758
1759static PyObject *
1760getargs_y_hash(PyObject *self, PyObject *args)
1761{
1762    char *str;
1763    Py_ssize_t size;
1764    if (!PyArg_ParseTuple(args, "y#", &str, &size))
1765        return NULL;
1766    return PyBytes_FromStringAndSize(str, size);
1767}
1768
1769static PyObject *
1770getargs_u(PyObject *self, PyObject *args)
1771{
1772    Py_UNICODE *str;
1773    if (!PyArg_ParseTuple(args, "u", &str))
1774        return NULL;
1775    return PyUnicode_FromWideChar(str, -1);
1776}
1777
1778static PyObject *
1779getargs_u_hash(PyObject *self, PyObject *args)
1780{
1781    Py_UNICODE *str;
1782    Py_ssize_t size;
1783    if (!PyArg_ParseTuple(args, "u#", &str, &size))
1784        return NULL;
1785    return PyUnicode_FromWideChar(str, size);
1786}
1787
1788static PyObject *
1789getargs_Z(PyObject *self, PyObject *args)
1790{
1791    Py_UNICODE *str;
1792    if (!PyArg_ParseTuple(args, "Z", &str))
1793        return NULL;
1794    if (str != NULL) {
1795        return PyUnicode_FromWideChar(str, -1);
1796    } else
1797        Py_RETURN_NONE;
1798}
1799
1800static PyObject *
1801getargs_Z_hash(PyObject *self, PyObject *args)
1802{
1803    Py_UNICODE *str;
1804    Py_ssize_t size;
1805    if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1806        return NULL;
1807    if (str != NULL)
1808        return PyUnicode_FromWideChar(str, size);
1809    else
1810        Py_RETURN_NONE;
1811}
1812
1813static PyObject *
1814getargs_es(PyObject *self, PyObject *args)
1815{
1816    PyObject *arg, *result;
1817    const char *encoding = NULL;
1818    char *str;
1819
1820    if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1821        return NULL;
1822    if (!PyArg_Parse(arg, "es", encoding, &str))
1823        return NULL;
1824    result = PyBytes_FromString(str);
1825    PyMem_Free(str);
1826    return result;
1827}
1828
1829static PyObject *
1830getargs_et(PyObject *self, PyObject *args)
1831{
1832    PyObject *arg, *result;
1833    const char *encoding = NULL;
1834    char *str;
1835
1836    if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1837        return NULL;
1838    if (!PyArg_Parse(arg, "et", encoding, &str))
1839        return NULL;
1840    result = PyBytes_FromString(str);
1841    PyMem_Free(str);
1842    return result;
1843}
1844
1845static PyObject *
1846getargs_es_hash(PyObject *self, PyObject *args)
1847{
1848    PyObject *arg, *result;
1849    const char *encoding = NULL;
1850    PyByteArrayObject *buffer = NULL;
1851    char *str = NULL;
1852    Py_ssize_t size;
1853
1854    if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1855        return NULL;
1856    if (buffer != NULL) {
1857        str = PyByteArray_AS_STRING(buffer);
1858        size = PyByteArray_GET_SIZE(buffer);
1859    }
1860    if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1861        return NULL;
1862    result = PyBytes_FromStringAndSize(str, size);
1863    if (buffer == NULL)
1864        PyMem_Free(str);
1865    return result;
1866}
1867
1868static PyObject *
1869getargs_et_hash(PyObject *self, PyObject *args)
1870{
1871    PyObject *arg, *result;
1872    const char *encoding = NULL;
1873    PyByteArrayObject *buffer = NULL;
1874    char *str = NULL;
1875    Py_ssize_t size;
1876
1877    if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1878        return NULL;
1879    if (buffer != NULL) {
1880        str = PyByteArray_AS_STRING(buffer);
1881        size = PyByteArray_GET_SIZE(buffer);
1882    }
1883    if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1884        return NULL;
1885    result = PyBytes_FromStringAndSize(str, size);
1886    if (buffer == NULL)
1887        PyMem_Free(str);
1888    return result;
1889}
1890
1891/* Test the s and z codes for PyArg_ParseTuple.
1892*/
1893static PyObject *
1894test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
1895{
1896    /* Unicode strings should be accepted */
1897    PyObject *tuple, *obj;
1898    char *value;
1899
1900    tuple = PyTuple_New(1);
1901    if (tuple == NULL)
1902    return NULL;
1903
1904    obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
1905                           "latin-1", NULL);
1906    if (obj == NULL)
1907    return NULL;
1908
1909    PyTuple_SET_ITEM(tuple, 0, obj);
1910
1911    /* These two blocks used to raise a TypeError:
1912     * "argument must be string without null bytes, not str"
1913     */
1914    if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1915        return NULL;
1916    }
1917
1918    if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1919        return NULL;
1920    }
1921
1922    Py_DECREF(tuple);
1923    Py_RETURN_NONE;
1924}
1925
1926static PyObject *
1927parse_tuple_and_keywords(PyObject *self, PyObject *args)
1928{
1929    PyObject *sub_args;
1930    PyObject *sub_kwargs;
1931    const char *sub_format;
1932    PyObject *sub_keywords;
1933
1934    Py_ssize_t i, size;
1935    char *keywords[8 + 1]; /* space for NULL at end */
1936    PyObject *o;
1937    PyObject *converted[8];
1938
1939    int result;
1940    PyObject *return_value = NULL;
1941
1942    double buffers[8][4]; /* double ensures alignment where necessary */
1943
1944    if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
1945        &sub_args, &sub_kwargs,
1946        &sub_format, &sub_keywords))
1947        return NULL;
1948
1949    if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1950        PyErr_SetString(PyExc_ValueError,
1951            "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1952        return NULL;
1953    }
1954
1955    memset(buffers, 0, sizeof(buffers));
1956    memset(converted, 0, sizeof(converted));
1957    memset(keywords, 0, sizeof(keywords));
1958
1959    size = PySequence_Fast_GET_SIZE(sub_keywords);
1960    if (size > 8) {
1961        PyErr_SetString(PyExc_ValueError,
1962            "parse_tuple_and_keywords: too many keywords in sub_keywords");
1963        goto exit;
1964    }
1965
1966    for (i = 0; i < size; i++) {
1967        o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1968        if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1969            PyErr_Format(PyExc_ValueError,
1970                "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
1971            goto exit;
1972        }
1973        keywords[i] = PyBytes_AS_STRING(converted[i]);
1974    }
1975
1976    result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1977        sub_format, keywords,
1978        buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1979        buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1980
1981    if (result) {
1982        return_value = Py_None;
1983        Py_INCREF(Py_None);
1984    }
1985
1986exit:
1987    size = sizeof(converted) / sizeof(converted[0]);
1988    for (i = 0; i < size; i++) {
1989        Py_XDECREF(converted[i]);
1990    }
1991    return return_value;
1992}
1993
1994static volatile int x;
1995
1996#if USE_UNICODE_WCHAR_CACHE
1997/* Ignore use of deprecated APIs */
1998_Py_COMP_DIAG_PUSH
1999_Py_COMP_DIAG_IGNORE_DEPR_DECLS
2000
2001/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
2002   of an error.
2003*/
2004static PyObject *
2005test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
2006{
2007    PyObject *tuple, *obj;
2008    Py_UNICODE *value;
2009    Py_ssize_t len;
2010
2011    /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
2012    /* Just use the macro and check that it compiles */
2013    x = Py_UNICODE_ISSPACE(25);
2014
2015    tuple = PyTuple_New(1);
2016    if (tuple == NULL)
2017        return NULL;
2018
2019    obj = PyUnicode_Decode("test", strlen("test"),
2020                           "ascii", NULL);
2021    if (obj == NULL)
2022        return NULL;
2023
2024    PyTuple_SET_ITEM(tuple, 0, obj);
2025
2026    value = 0;
2027    if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
2028        return NULL;
2029    }
2030    if (value != PyUnicode_AS_UNICODE(obj))
2031        return raiseTestError("test_u_code",
2032            "u code returned wrong value for u'test'");
2033    value = 0;
2034    if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
2035        return NULL;
2036    }
2037    if (value != PyUnicode_AS_UNICODE(obj) ||
2038        len != PyUnicode_GET_SIZE(obj))
2039        return raiseTestError("test_u_code",
2040            "u# code returned wrong values for u'test'");
2041
2042    Py_DECREF(tuple);
2043    Py_RETURN_NONE;
2044}
2045
2046/* Test Z and Z# codes for PyArg_ParseTuple */
2047static PyObject *
2048test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
2049{
2050    PyObject *tuple, *obj;
2051    const Py_UNICODE *value1, *value2;
2052    Py_ssize_t len1, len2;
2053
2054    tuple = PyTuple_New(2);
2055    if (tuple == NULL)
2056        return NULL;
2057
2058    obj = PyUnicode_FromString("test");
2059    PyTuple_SET_ITEM(tuple, 0, obj);
2060    Py_INCREF(Py_None);
2061    PyTuple_SET_ITEM(tuple, 1, Py_None);
2062
2063    /* swap values on purpose */
2064    value1 = NULL;
2065    value2 = PyUnicode_AS_UNICODE(obj);
2066
2067    /* Test Z for both values */
2068    if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
2069        return NULL;
2070    }
2071    if (value1 != PyUnicode_AS_UNICODE(obj))
2072        return raiseTestError("test_Z_code",
2073            "Z code returned wrong value for 'test'");
2074    if (value2 != NULL)
2075        return raiseTestError("test_Z_code",
2076            "Z code returned wrong value for None");
2077
2078    value1 = NULL;
2079    value2 = PyUnicode_AS_UNICODE(obj);
2080    len1 = -1;
2081    len2 = -1;
2082
2083    /* Test Z# for both values */
2084    if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
2085                          &value2, &len2))
2086    {
2087        return NULL;
2088    }
2089    if (value1 != PyUnicode_AS_UNICODE(obj) ||
2090        len1 != PyUnicode_GET_SIZE(obj))
2091        return raiseTestError("test_Z_code",
2092            "Z# code returned wrong values for 'test'");
2093    if (value2 != NULL ||
2094        len2 != 0)
2095        return raiseTestError("test_Z_code",
2096            "Z# code returned wrong values for None'");
2097
2098    Py_DECREF(tuple);
2099    Py_RETURN_NONE;
2100}
2101_Py_COMP_DIAG_POP
2102#endif /* USE_UNICODE_WCHAR_CACHE */
2103
2104static PyObject *
2105test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
2106{
2107#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
2108    const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
2109    size_t wtextlen = 1;
2110    const wchar_t invalid[1] = {(wchar_t)0x110000u};
2111#else
2112    const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
2113    size_t wtextlen = 2;
2114#endif
2115    PyObject *wide, *utf8;
2116
2117    wide = PyUnicode_FromWideChar(wtext, wtextlen);
2118    if (wide == NULL)
2119        return NULL;
2120
2121    utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
2122    if (utf8 == NULL) {
2123        Py_DECREF(wide);
2124        return NULL;
2125    }
2126
2127    if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
2128        Py_DECREF(wide);
2129        Py_DECREF(utf8);
2130        return raiseTestError("test_widechar",
2131                              "wide string and utf8 string "
2132                              "have different length");
2133    }
2134    if (PyUnicode_Compare(wide, utf8)) {
2135        Py_DECREF(wide);
2136        Py_DECREF(utf8);
2137        if (PyErr_Occurred())
2138            return NULL;
2139        return raiseTestError("test_widechar",
2140                              "wide string and utf8 string "
2141                              "are different");
2142    }
2143
2144    Py_DECREF(wide);
2145    Py_DECREF(utf8);
2146
2147#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
2148    wide = PyUnicode_FromWideChar(invalid, 1);
2149    if (wide == NULL)
2150        PyErr_Clear();
2151    else
2152        return raiseTestError("test_widechar",
2153                              "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
2154
2155#if USE_UNICODE_WCHAR_CACHE
2156/* Ignore use of deprecated APIs */
2157_Py_COMP_DIAG_PUSH
2158_Py_COMP_DIAG_IGNORE_DEPR_DECLS
2159    wide = PyUnicode_FromUnicode(invalid, 1);
2160    if (wide == NULL)
2161        PyErr_Clear();
2162    else
2163        return raiseTestError("test_widechar",
2164                              "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
2165
2166    wide = PyUnicode_FromUnicode(NULL, 1);
2167    if (wide == NULL)
2168        return NULL;
2169    PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
2170    if (_PyUnicode_Ready(wide) < 0) {
2171        Py_DECREF(wide);
2172        PyErr_Clear();
2173    }
2174    else {
2175        Py_DECREF(wide);
2176        return raiseTestError("test_widechar",
2177                              "PyUnicode_Ready() didn't fail");
2178    }
2179_Py_COMP_DIAG_POP
2180#endif /* USE_UNICODE_WCHAR_CACHE */
2181#endif
2182
2183    Py_RETURN_NONE;
2184}
2185
2186static PyObject *
2187unicode_aswidechar(PyObject *self, PyObject *args)
2188{
2189    PyObject *unicode, *result;
2190    Py_ssize_t buflen, size;
2191    wchar_t *buffer;
2192
2193    if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
2194        return NULL;
2195    buffer = PyMem_New(wchar_t, buflen);
2196    if (buffer == NULL)
2197        return PyErr_NoMemory();
2198
2199    size = PyUnicode_AsWideChar(unicode, buffer, buflen);
2200    if (size == -1) {
2201        PyMem_Free(buffer);
2202        return NULL;
2203    }
2204
2205    if (size < buflen)
2206        buflen = size + 1;
2207    else
2208        buflen = size;
2209    result = PyUnicode_FromWideChar(buffer, buflen);
2210    PyMem_Free(buffer);
2211    if (result == NULL)
2212        return NULL;
2213
2214    return Py_BuildValue("(Nn)", result, size);
2215}
2216
2217static PyObject *
2218unicode_aswidecharstring(PyObject *self, PyObject *args)
2219{
2220    PyObject *unicode, *result;
2221    Py_ssize_t size;
2222    wchar_t *buffer;
2223
2224    if (!PyArg_ParseTuple(args, "U", &unicode))
2225        return NULL;
2226
2227    buffer = PyUnicode_AsWideCharString(unicode, &size);
2228    if (buffer == NULL)
2229        return NULL;
2230
2231    result = PyUnicode_FromWideChar(buffer, size + 1);
2232    PyMem_Free(buffer);
2233    if (result == NULL)
2234        return NULL;
2235    return Py_BuildValue("(Nn)", result, size);
2236}
2237
2238static PyObject *
2239unicode_asucs4(PyObject *self, PyObject *args)
2240{
2241    PyObject *unicode, *result;
2242    Py_UCS4 *buffer;
2243    int copy_null;
2244    Py_ssize_t str_len, buf_len;
2245
2246    if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
2247        return NULL;
2248    }
2249
2250    buf_len = str_len + 1;
2251    buffer = PyMem_NEW(Py_UCS4, buf_len);
2252    if (buffer == NULL) {
2253        return PyErr_NoMemory();
2254    }
2255    memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
2256    buffer[str_len] = 0xffffU;
2257
2258    if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
2259        PyMem_Free(buffer);
2260        return NULL;
2261    }
2262
2263    result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
2264    PyMem_Free(buffer);
2265    return result;
2266}
2267
2268static PyObject *
2269unicode_asutf8(PyObject *self, PyObject *args)
2270{
2271    PyObject *unicode;
2272    const char *buffer;
2273
2274    if (!PyArg_ParseTuple(args, "U", &unicode)) {
2275        return NULL;
2276    }
2277
2278    buffer = PyUnicode_AsUTF8(unicode);
2279    if (buffer == NULL) {
2280        return NULL;
2281    }
2282
2283    return PyBytes_FromString(buffer);
2284}
2285
2286static PyObject *
2287unicode_asutf8andsize(PyObject *self, PyObject *args)
2288{
2289    PyObject *unicode, *result;
2290    const char *buffer;
2291    Py_ssize_t utf8_len;
2292
2293    if(!PyArg_ParseTuple(args, "U", &unicode)) {
2294        return NULL;
2295    }
2296
2297    buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len);
2298    if (buffer == NULL) {
2299        return NULL;
2300    }
2301
2302    result = PyBytes_FromString(buffer);
2303    if (result == NULL) {
2304        return NULL;
2305    }
2306
2307    return Py_BuildValue("(Nn)", result, utf8_len);
2308}
2309
2310static PyObject *
2311unicode_findchar(PyObject *self, PyObject *args)
2312{
2313    PyObject *str;
2314    int direction;
2315    unsigned int ch;
2316    Py_ssize_t result;
2317    Py_ssize_t start, end;
2318
2319    if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
2320                          &start, &end, &direction)) {
2321        return NULL;
2322    }
2323
2324    result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
2325    if (result == -2)
2326        return NULL;
2327    else
2328        return PyLong_FromSsize_t(result);
2329}
2330
2331static PyObject *
2332unicode_copycharacters(PyObject *self, PyObject *args)
2333{
2334    PyObject *from, *to, *to_copy;
2335    Py_ssize_t from_start, to_start, how_many, copied;
2336
2337    if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
2338                          &from, &from_start, &how_many)) {
2339        return NULL;
2340    }
2341
2342    if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
2343                                  PyUnicode_MAX_CHAR_VALUE(to)))) {
2344        return NULL;
2345    }
2346    if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
2347        Py_DECREF(to_copy);
2348        return NULL;
2349    }
2350
2351    if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
2352                                           from_start, how_many)) < 0) {
2353        Py_DECREF(to_copy);
2354        return NULL;
2355    }
2356
2357    return Py_BuildValue("(Nn)", to_copy, copied);
2358}
2359
2360#if USE_UNICODE_WCHAR_CACHE
2361/* Ignore use of deprecated APIs */
2362_Py_COMP_DIAG_PUSH
2363_Py_COMP_DIAG_IGNORE_DEPR_DECLS
2364
2365static PyObject *
2366unicode_legacy_string(PyObject *self, PyObject *args)
2367{
2368    Py_UNICODE *data;
2369    Py_ssize_t len;
2370    PyObject *u;
2371
2372    if (!PyArg_ParseTuple(args, "u#", &data, &len))
2373        return NULL;
2374
2375    u = PyUnicode_FromUnicode(NULL, len);
2376    if (u == NULL)
2377        return NULL;
2378
2379    memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2380
2381    if (len > 0) { /* The empty string is always ready. */
2382        assert(!PyUnicode_IS_READY(u));
2383    }
2384
2385    return u;
2386}
2387_Py_COMP_DIAG_POP
2388#endif /* USE_UNICODE_WCHAR_CACHE */
2389
2390static PyObject *
2391getargs_w_star(PyObject *self, PyObject *args)
2392{
2393    Py_buffer buffer;
2394    PyObject *result;
2395    char *str;
2396
2397    if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2398        return NULL;
2399
2400    if (2 <= buffer.len) {
2401        str = buffer.buf;
2402        str[0] = '[';
2403        str[buffer.len-1] = ']';
2404    }
2405
2406    result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2407    PyBuffer_Release(&buffer);
2408    return result;
2409}
2410
2411
2412static PyObject *
2413test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
2414{
2415    /* Test that formats can begin with '|'. See issue #4720. */
2416    PyObject *tuple, *dict = NULL;
2417    static char *kwlist[] = {NULL};
2418    int result;
2419    tuple = PyTuple_New(0);
2420    if (!tuple)
2421        return NULL;
2422    if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
2423        goto done;
2424    }
2425    dict = PyDict_New();
2426    if (!dict)
2427        goto done;
2428    result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
2429  done:
2430    Py_DECREF(tuple);
2431    Py_XDECREF(dict);
2432    if (!result) {
2433        return NULL;
2434    }
2435    else {
2436        Py_RETURN_NONE;
2437    }
2438}
2439
2440static PyObject *
2441codec_incrementalencoder(PyObject *self, PyObject *args)
2442{
2443    const char *encoding, *errors = NULL;
2444    if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2445                          &encoding, &errors))
2446        return NULL;
2447    return PyCodec_IncrementalEncoder(encoding, errors);
2448}
2449
2450static PyObject *
2451codec_incrementaldecoder(PyObject *self, PyObject *args)
2452{
2453    const char *encoding, *errors = NULL;
2454    if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2455                          &encoding, &errors))
2456        return NULL;
2457    return PyCodec_IncrementalDecoder(encoding, errors);
2458}
2459
2460
2461/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
2462static PyObject *
2463test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
2464{
2465    struct triple {
2466        long input;
2467        size_t nbits;
2468        int sign;
2469    } testcases[] = {{0, 0, 0},
2470                     {1L, 1, 1},
2471                     {-1L, 1, -1},
2472                     {2L, 2, 1},
2473                     {-2L, 2, -1},
2474                     {3L, 2, 1},
2475                     {-3L, 2, -1},
2476                     {4L, 3, 1},
2477                     {-4L, 3, -1},
2478                     {0x7fffL, 15, 1},          /* one Python int digit */
2479             {-0x7fffL, 15, -1},
2480             {0xffffL, 16, 1},
2481             {-0xffffL, 16, -1},
2482             {0xfffffffL, 28, 1},
2483             {-0xfffffffL, 28, -1}};
2484    size_t i;
2485
2486    for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
2487        size_t nbits;
2488        int sign;
2489        PyObject *plong;
2490
2491        plong = PyLong_FromLong(testcases[i].input);
2492        if (plong == NULL)
2493            return NULL;
2494        nbits = _PyLong_NumBits(plong);
2495        sign = _PyLong_Sign(plong);
2496
2497        Py_DECREF(plong);
2498        if (nbits != testcases[i].nbits)
2499            return raiseTestError("test_long_numbits",
2500                            "wrong result for _PyLong_NumBits");
2501        if (sign != testcases[i].sign)
2502            return raiseTestError("test_long_numbits",
2503                            "wrong result for _PyLong_Sign");
2504    }
2505    Py_RETURN_NONE;
2506}
2507
2508static PyObject *
2509pyobject_repr_from_null(PyObject *self, PyObject *Py_UNUSED(ignored))
2510{
2511    return PyObject_Repr(NULL);
2512}
2513
2514static PyObject *
2515pyobject_str_from_null(PyObject *self, PyObject *Py_UNUSED(ignored))
2516{
2517    return PyObject_Str(NULL);
2518}
2519
2520static PyObject *
2521pyobject_bytes_from_null(PyObject *self, PyObject *Py_UNUSED(ignored))
2522{
2523    return PyObject_Bytes(NULL);
2524}
2525
2526static PyObject *
2527exc_set_object(PyObject *self, PyObject *args)
2528{
2529    PyObject *exc;
2530    PyObject *obj;
2531
2532    if (!PyArg_ParseTuple(args, "OO:exc_set_object", &exc, &obj)) {
2533        return NULL;
2534    }
2535
2536    PyErr_SetObject(exc, obj);
2537    return NULL;
2538}
2539
2540static PyObject *
2541raise_exception(PyObject *self, PyObject *args)
2542{
2543    PyObject *exc;
2544    PyObject *exc_args, *v;
2545    int num_args, i;
2546
2547    if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2548                          &exc, &num_args))
2549        return NULL;
2550
2551    exc_args = PyTuple_New(num_args);
2552    if (exc_args == NULL)
2553        return NULL;
2554    for (i = 0; i < num_args; ++i) {
2555        v = PyLong_FromLong(i);
2556        if (v == NULL) {
2557            Py_DECREF(exc_args);
2558            return NULL;
2559        }
2560        PyTuple_SET_ITEM(exc_args, i, v);
2561    }
2562    PyErr_SetObject(exc, exc_args);
2563    Py_DECREF(exc_args);
2564    return NULL;
2565}
2566
2567static PyObject *
2568set_errno(PyObject *self, PyObject *args)
2569{
2570    int new_errno;
2571
2572    if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2573        return NULL;
2574
2575    errno = new_errno;
2576    Py_RETURN_NONE;
2577}
2578
2579static PyObject *
2580test_set_exception(PyObject *self, PyObject *new_exc)
2581{
2582    PyObject *exc = PyErr_GetHandledException();
2583    assert(PyExceptionInstance_Check(exc) || exc == NULL);
2584
2585    PyErr_SetHandledException(new_exc);
2586    return exc;
2587}
2588
2589static PyObject *
2590test_set_exc_info(PyObject *self, PyObject *args)
2591{
2592    PyObject *orig_exc;
2593    PyObject *new_type, *new_value, *new_tb;
2594    PyObject *type, *value, *tb;
2595    if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2596                          &new_type, &new_value, &new_tb))
2597        return NULL;
2598
2599    PyErr_GetExcInfo(&type, &value, &tb);
2600
2601    Py_INCREF(new_type);
2602    Py_INCREF(new_value);
2603    Py_INCREF(new_tb);
2604    PyErr_SetExcInfo(new_type, new_value, new_tb);
2605
2606    orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2607    Py_XDECREF(type);
2608    Py_XDECREF(value);
2609    Py_XDECREF(tb);
2610    return orig_exc;
2611}
2612
2613static int test_run_counter = 0;
2614
2615static PyObject *
2616test_datetime_capi(PyObject *self, PyObject *args) {
2617    if (PyDateTimeAPI) {
2618        if (test_run_counter) {
2619            /* Probably regrtest.py -R */
2620            Py_RETURN_NONE;
2621        }
2622        else {
2623            PyErr_SetString(PyExc_AssertionError,
2624                            "PyDateTime_CAPI somehow initialized");
2625            return NULL;
2626        }
2627    }
2628    test_run_counter++;
2629    PyDateTime_IMPORT;
2630
2631    if (PyDateTimeAPI)
2632        Py_RETURN_NONE;
2633    else
2634        return NULL;
2635}
2636
2637/* Functions exposing the C API type checking for testing */
2638#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method)    \
2639    PyObject *obj;                                              \
2640    int exact = 0;                                              \
2641    if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) {         \
2642        return NULL;                                            \
2643    }                                                           \
2644    int rv = exact?exact_method(obj):check_method(obj);         \
2645    if (rv) {                                                   \
2646        Py_RETURN_TRUE;                                         \
2647    } else {                                                    \
2648        Py_RETURN_FALSE;                                        \
2649    }
2650
2651static PyObject *
2652datetime_check_date(PyObject *self, PyObject *args) {
2653    MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2654}
2655
2656static PyObject *
2657datetime_check_time(PyObject *self, PyObject *args) {
2658    MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2659}
2660
2661static PyObject *
2662datetime_check_datetime(PyObject *self, PyObject *args) {
2663    MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2664}
2665
2666static PyObject *
2667datetime_check_delta(PyObject *self, PyObject *args) {
2668    MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2669}
2670
2671static PyObject *
2672datetime_check_tzinfo(PyObject *self, PyObject *args) {
2673    MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2674}
2675
2676
2677/* Makes three variations on timezone representing UTC-5:
2678   1. timezone with offset and name from PyDateTimeAPI
2679   2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2680   3. timezone with offset (no name) from PyTimeZone_FromOffset
2681*/
2682static PyObject *
2683make_timezones_capi(PyObject *self, PyObject *args) {
2684    PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2685    PyObject *name = PyUnicode_FromString("EST");
2686
2687    PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2688    PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2689    PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2690
2691    Py_DecRef(offset);
2692    Py_DecRef(name);
2693
2694    PyObject *rv = PyTuple_New(3);
2695
2696    PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2697    PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2698    PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2699
2700    return rv;
2701}
2702
2703static PyObject *
2704get_timezones_offset_zero(PyObject *self, PyObject *args) {
2705    PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2706    PyObject *name = PyUnicode_FromString("");
2707
2708    // These two should return the UTC singleton
2709    PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2710    PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2711
2712    // This one will return +00:00 zone, but not the UTC singleton
2713    PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2714
2715    Py_DecRef(offset);
2716    Py_DecRef(name);
2717
2718    PyObject *rv = PyTuple_New(3);
2719    PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2720    PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2721    PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2722
2723    return rv;
2724}
2725
2726static PyObject *
2727get_timezone_utc_capi(PyObject* self, PyObject *args) {
2728    int macro = 0;
2729    if (!PyArg_ParseTuple(args, "|p", &macro)) {
2730        return NULL;
2731    }
2732    if (macro) {
2733        Py_INCREF(PyDateTime_TimeZone_UTC);
2734        return PyDateTime_TimeZone_UTC;
2735    } else {
2736        Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
2737        return PyDateTimeAPI->TimeZone_UTC;
2738    }
2739}
2740
2741static PyObject *
2742get_date_fromdate(PyObject *self, PyObject *args)
2743{
2744    PyObject *rv = NULL;
2745    int macro;
2746    int year, month, day;
2747
2748    if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2749        return NULL;
2750    }
2751
2752    if (macro) {
2753        rv = PyDate_FromDate(year, month, day);
2754    }
2755    else {
2756        rv = PyDateTimeAPI->Date_FromDate(
2757            year, month, day,
2758            PyDateTimeAPI->DateType);
2759    }
2760    return rv;
2761}
2762
2763
2764static PyObject *
2765get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2766{
2767    PyObject *rv = NULL;
2768    int macro;
2769    int year, month, day;
2770    int hour, minute, second, microsecond;
2771
2772    if (!PyArg_ParseTuple(args, "piiiiiii",
2773                          &macro,
2774                          &year, &month, &day,
2775                          &hour, &minute, &second, &microsecond)) {
2776        return NULL;
2777    }
2778
2779    if (macro) {
2780        rv = PyDateTime_FromDateAndTime(
2781            year, month, day,
2782            hour, minute, second, microsecond);
2783    }
2784    else {
2785        rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2786            year, month, day,
2787            hour, minute, second, microsecond,
2788            Py_None,
2789            PyDateTimeAPI->DateTimeType);
2790    }
2791    return rv;
2792}
2793
2794static PyObject *
2795get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2796{
2797    PyObject *rv = NULL;
2798    int macro;
2799    int year, month, day;
2800    int hour, minute, second, microsecond, fold;
2801
2802    if (!PyArg_ParseTuple(args, "piiiiiiii",
2803                          &macro,
2804                          &year, &month, &day,
2805                          &hour, &minute, &second, &microsecond,
2806                          &fold)) {
2807        return NULL;
2808    }
2809
2810    if (macro) {
2811        rv = PyDateTime_FromDateAndTimeAndFold(
2812            year, month, day,
2813            hour, minute, second, microsecond,
2814            fold);
2815    }
2816    else {
2817        rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2818            year, month, day,
2819            hour, minute, second, microsecond,
2820            Py_None,
2821            fold,
2822            PyDateTimeAPI->DateTimeType);
2823    }
2824    return rv;
2825}
2826
2827static PyObject *
2828get_time_fromtime(PyObject *self, PyObject *args)
2829{
2830    PyObject *rv = NULL;
2831    int macro;
2832    int hour, minute, second, microsecond;
2833
2834    if (!PyArg_ParseTuple(args, "piiii",
2835                          &macro,
2836                          &hour, &minute, &second, &microsecond)) {
2837        return NULL;
2838    }
2839
2840    if (macro) {
2841        rv = PyTime_FromTime(hour, minute, second, microsecond);
2842    }
2843    else {
2844        rv = PyDateTimeAPI->Time_FromTime(
2845            hour, minute, second, microsecond,
2846            Py_None,
2847            PyDateTimeAPI->TimeType);
2848    }
2849    return rv;
2850}
2851
2852static PyObject *
2853get_time_fromtimeandfold(PyObject *self, PyObject *args)
2854{
2855    PyObject *rv = NULL;
2856    int macro;
2857    int hour, minute, second, microsecond, fold;
2858
2859    if (!PyArg_ParseTuple(args, "piiiii",
2860                          &macro,
2861                          &hour, &minute, &second, &microsecond,
2862                          &fold)) {
2863        return NULL;
2864    }
2865
2866    if (macro) {
2867        rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2868    }
2869    else {
2870        rv = PyDateTimeAPI->Time_FromTimeAndFold(
2871            hour, minute, second, microsecond,
2872            Py_None,
2873            fold,
2874            PyDateTimeAPI->TimeType);
2875    }
2876    return rv;
2877}
2878
2879static PyObject *
2880get_delta_fromdsu(PyObject *self, PyObject *args)
2881{
2882    PyObject *rv = NULL;
2883    int macro;
2884    int days, seconds, microseconds;
2885
2886    if (!PyArg_ParseTuple(args, "piii",
2887                          &macro,
2888                          &days, &seconds, &microseconds)) {
2889        return NULL;
2890    }
2891
2892    if (macro) {
2893        rv = PyDelta_FromDSU(days, seconds, microseconds);
2894    }
2895    else {
2896        rv = PyDateTimeAPI->Delta_FromDelta(
2897            days, seconds, microseconds, 1,
2898            PyDateTimeAPI->DeltaType);
2899    }
2900
2901    return rv;
2902}
2903
2904static PyObject *
2905get_date_fromtimestamp(PyObject* self, PyObject *args)
2906{
2907    PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2908    int macro = 0;
2909
2910    if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2911        return NULL;
2912    }
2913
2914    // Construct the argument tuple
2915    if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2916        return NULL;
2917    }
2918
2919    // Pass along to the API function
2920    if (macro) {
2921        rv = PyDate_FromTimestamp(tsargs);
2922    }
2923    else {
2924        rv = PyDateTimeAPI->Date_FromTimestamp(
2925                (PyObject *)PyDateTimeAPI->DateType, tsargs
2926        );
2927    }
2928
2929    Py_DECREF(tsargs);
2930    return rv;
2931}
2932
2933static PyObject *
2934get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2935{
2936    int macro = 0;
2937    int usetz = 0;
2938    PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2939    if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2940        return NULL;
2941    }
2942
2943    // Construct the argument tuple
2944    if (usetz) {
2945        tsargs = PyTuple_Pack(2, ts, tzinfo);
2946    }
2947    else {
2948        tsargs = PyTuple_Pack(1, ts);
2949    }
2950
2951    if (tsargs == NULL) {
2952        return NULL;
2953    }
2954
2955    // Pass along to the API function
2956    if (macro) {
2957        rv = PyDateTime_FromTimestamp(tsargs);
2958    }
2959    else {
2960        rv = PyDateTimeAPI->DateTime_FromTimestamp(
2961                (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2962        );
2963    }
2964
2965    Py_DECREF(tsargs);
2966    return rv;
2967}
2968
2969static PyObject *
2970test_PyDateTime_GET(PyObject *self, PyObject *obj)
2971{
2972    int year, month, day;
2973
2974    year = PyDateTime_GET_YEAR(obj);
2975    month = PyDateTime_GET_MONTH(obj);
2976    day = PyDateTime_GET_DAY(obj);
2977
2978    return Py_BuildValue("(iii)", year, month, day);
2979}
2980
2981static PyObject *
2982test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
2983{
2984    int hour, minute, second, microsecond;
2985
2986    hour = PyDateTime_DATE_GET_HOUR(obj);
2987    minute = PyDateTime_DATE_GET_MINUTE(obj);
2988    second = PyDateTime_DATE_GET_SECOND(obj);
2989    microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
2990    PyObject *tzinfo = PyDateTime_DATE_GET_TZINFO(obj);
2991
2992    return Py_BuildValue("(iiiiO)", hour, minute, second, microsecond, tzinfo);
2993}
2994
2995static PyObject *
2996test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
2997{
2998    int hour, minute, second, microsecond;
2999
3000    hour = PyDateTime_TIME_GET_HOUR(obj);
3001    minute = PyDateTime_TIME_GET_MINUTE(obj);
3002    second = PyDateTime_TIME_GET_SECOND(obj);
3003    microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
3004    PyObject *tzinfo = PyDateTime_TIME_GET_TZINFO(obj);
3005
3006    return Py_BuildValue("(iiiiO)", hour, minute, second, microsecond, tzinfo);
3007}
3008
3009static PyObject *
3010test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
3011{
3012    int days, seconds, microseconds;
3013
3014    days = PyDateTime_DELTA_GET_DAYS(obj);
3015    seconds = PyDateTime_DELTA_GET_SECONDS(obj);
3016    microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
3017
3018    return Py_BuildValue("(iii)", days, seconds, microseconds);
3019}
3020
3021/* test_thread_state spawns a thread of its own, and that thread releases
3022 * `thread_done` when it's finished.  The driver code has to know when the
3023 * thread finishes, because the thread uses a PyObject (the callable) that
3024 * may go away when the driver finishes.  The former lack of this explicit
3025 * synchronization caused rare segfaults, so rare that they were seen only
3026 * on a Mac buildbot (although they were possible on any box).
3027 */
3028static PyThread_type_lock thread_done = NULL;
3029
3030static int
3031_make_call(void *callable)
3032{
3033    PyObject *rc;
3034    int success;
3035    PyGILState_STATE s = PyGILState_Ensure();
3036    rc = PyObject_CallNoArgs((PyObject *)callable);
3037    success = (rc != NULL);
3038    Py_XDECREF(rc);
3039    PyGILState_Release(s);
3040    return success;
3041}
3042
3043/* Same thing, but releases `thread_done` when it returns.  This variant
3044 * should be called only from threads spawned by test_thread_state().
3045 */
3046static void
3047_make_call_from_thread(void *callable)
3048{
3049    _make_call(callable);
3050    PyThread_release_lock(thread_done);
3051}
3052
3053static PyObject *
3054test_thread_state(PyObject *self, PyObject *args)
3055{
3056    PyObject *fn;
3057    int success = 1;
3058
3059    if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
3060        return NULL;
3061
3062    if (!PyCallable_Check(fn)) {
3063        PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
3064            Py_TYPE(fn)->tp_name);
3065        return NULL;
3066    }
3067
3068    thread_done = PyThread_allocate_lock();
3069    if (thread_done == NULL)
3070        return PyErr_NoMemory();
3071    PyThread_acquire_lock(thread_done, 1);
3072
3073    /* Start a new thread with our callback. */
3074    PyThread_start_new_thread(_make_call_from_thread, fn);
3075    /* Make the callback with the thread lock held by this thread */
3076    success &= _make_call(fn);
3077    /* Do it all again, but this time with the thread-lock released */
3078    Py_BEGIN_ALLOW_THREADS
3079    success &= _make_call(fn);
3080    PyThread_acquire_lock(thread_done, 1);  /* wait for thread to finish */
3081    Py_END_ALLOW_THREADS
3082
3083    /* And once more with and without a thread
3084       XXX - should use a lock and work out exactly what we are trying
3085       to test <wink>
3086    */
3087    Py_BEGIN_ALLOW_THREADS
3088    PyThread_start_new_thread(_make_call_from_thread, fn);
3089    success &= _make_call(fn);
3090    PyThread_acquire_lock(thread_done, 1);  /* wait for thread to finish */
3091    Py_END_ALLOW_THREADS
3092
3093    /* Release lock we acquired above.  This is required on HP-UX. */
3094    PyThread_release_lock(thread_done);
3095
3096    PyThread_free_lock(thread_done);
3097    if (!success)
3098        return NULL;
3099    Py_RETURN_NONE;
3100}
3101
3102/* test Py_AddPendingCalls using threads */
3103static int _pending_callback(void *arg)
3104{
3105    /* we assume the argument is callable object to which we own a reference */
3106    PyObject *callable = (PyObject *)arg;
3107    PyObject *r = PyObject_CallNoArgs(callable);
3108    Py_DECREF(callable);
3109    Py_XDECREF(r);
3110    return r != NULL ? 0 : -1;
3111}
3112
3113/* The following requests n callbacks to _pending_callback.  It can be
3114 * run from any python thread.
3115 */
3116static PyObject *
3117pending_threadfunc(PyObject *self, PyObject *arg)
3118{
3119    PyObject *callable;
3120    int r;
3121    if (PyArg_ParseTuple(arg, "O", &callable) == 0)
3122        return NULL;
3123
3124    /* create the reference for the callbackwhile we hold the lock */
3125    Py_INCREF(callable);
3126
3127    Py_BEGIN_ALLOW_THREADS
3128    r = Py_AddPendingCall(&_pending_callback, callable);
3129    Py_END_ALLOW_THREADS
3130
3131    if (r<0) {
3132        Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
3133        Py_RETURN_FALSE;
3134    }
3135    Py_RETURN_TRUE;
3136}
3137
3138/* Some tests of PyUnicode_FromFormat().  This needs more tests. */
3139static PyObject *
3140test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
3141{
3142    PyObject *result;
3143    char *msg;
3144
3145#define CHECK_1_FORMAT(FORMAT, TYPE)                                \
3146    result = PyUnicode_FromFormat(FORMAT, (TYPE)1);                 \
3147    if (result == NULL)                                             \
3148        return NULL;                                                \
3149    if (!_PyUnicode_EqualToASCIIString(result, "1")) {              \
3150        msg = FORMAT " failed at 1";                                \
3151        goto Fail;                                                  \
3152    }                                                               \
3153    Py_DECREF(result)
3154
3155    CHECK_1_FORMAT("%d", int);
3156    CHECK_1_FORMAT("%ld", long);
3157    /* The z width modifier was added in Python 2.5. */
3158    CHECK_1_FORMAT("%zd", Py_ssize_t);
3159
3160    /* The u type code was added in Python 2.5. */
3161    CHECK_1_FORMAT("%u", unsigned int);
3162    CHECK_1_FORMAT("%lu", unsigned long);
3163    CHECK_1_FORMAT("%zu", size_t);
3164
3165    /* "%lld" and "%llu" support added in Python 2.7. */
3166    CHECK_1_FORMAT("%llu", unsigned long long);
3167    CHECK_1_FORMAT("%lld", long long);
3168
3169    Py_RETURN_NONE;
3170
3171 Fail:
3172    Py_XDECREF(result);
3173    return raiseTestError("test_string_from_format", msg);
3174
3175#undef CHECK_1_FORMAT
3176}
3177
3178
3179static PyObject *
3180test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
3181    PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
3182    int result;
3183    if (py_s == NULL)
3184        return NULL;
3185    result = PyUnicode_CompareWithASCIIString(py_s, "str");
3186    Py_DECREF(py_s);
3187    if (!result) {
3188        PyErr_SetString(TestError, "Python string ending in NULL "
3189                        "should not compare equal to c string.");
3190        return NULL;
3191    }
3192    Py_RETURN_NONE;
3193}
3194
3195/* This is here to provide a docstring for test_descr. */
3196static PyObject *
3197test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
3198{
3199    Py_RETURN_NONE;
3200}
3201
3202/* Test PyOS_string_to_double. */
3203static PyObject *
3204test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
3205    double result;
3206    const char *msg;
3207
3208#define CHECK_STRING(STR, expected)                             \
3209    result = PyOS_string_to_double(STR, NULL, NULL);            \
3210    if (result == -1.0 && PyErr_Occurred())                     \
3211        return NULL;                                            \
3212    if (result != (double)expected) {                           \
3213        msg = "conversion of " STR " to float failed";          \
3214        goto fail;                                              \
3215    }
3216
3217#define CHECK_INVALID(STR)                                              \
3218    result = PyOS_string_to_double(STR, NULL, NULL);                    \
3219    if (result == -1.0 && PyErr_Occurred()) {                           \
3220        if (PyErr_ExceptionMatches(PyExc_ValueError))                   \
3221            PyErr_Clear();                                              \
3222        else                                                            \
3223            return NULL;                                                \
3224    }                                                                   \
3225    else {                                                              \
3226        msg = "conversion of " STR " didn't raise ValueError";          \
3227        goto fail;                                                      \
3228    }
3229
3230    CHECK_STRING("0.1", 0.1);
3231    CHECK_STRING("1.234", 1.234);
3232    CHECK_STRING("-1.35", -1.35);
3233    CHECK_STRING(".1e01", 1.0);
3234    CHECK_STRING("2.e-2", 0.02);
3235
3236    CHECK_INVALID(" 0.1");
3237    CHECK_INVALID("\t\n-3");
3238    CHECK_INVALID(".123 ");
3239    CHECK_INVALID("3\n");
3240    CHECK_INVALID("123abc");
3241
3242    Py_RETURN_NONE;
3243  fail:
3244    return raiseTestError("test_string_to_double", msg);
3245#undef CHECK_STRING
3246#undef CHECK_INVALID
3247}
3248
3249
3250/* Coverage testing of capsule objects. */
3251
3252static const char *capsule_name = "capsule name";
3253static       char *capsule_pointer = "capsule pointer";
3254static       char *capsule_context = "capsule context";
3255static const char *capsule_error = NULL;
3256static int
3257capsule_destructor_call_count = 0;
3258
3259static void
3260capsule_destructor(PyObject *o) {
3261    capsule_destructor_call_count++;
3262    if (PyCapsule_GetContext(o) != capsule_context) {
3263        capsule_error = "context did not match in destructor!";
3264    } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
3265        capsule_error = "destructor did not match in destructor!  (woah!)";
3266    } else if (PyCapsule_GetName(o) != capsule_name) {
3267        capsule_error = "name did not match in destructor!";
3268    } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
3269        capsule_error = "pointer did not match in destructor!";
3270    }
3271}
3272
3273typedef struct {
3274    char *name;
3275    char *module;
3276    char *attribute;
3277} known_capsule;
3278
3279static PyObject *
3280test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
3281{
3282    PyObject *object;
3283    const char *error = NULL;
3284    void *pointer;
3285    void *pointer2;
3286    known_capsule known_capsules[] = {
3287        #define KNOWN_CAPSULE(module, name)             { module "." name, module, name }
3288        KNOWN_CAPSULE("_socket", "CAPI"),
3289        KNOWN_CAPSULE("_curses", "_C_API"),
3290        KNOWN_CAPSULE("datetime", "datetime_CAPI"),
3291        { NULL, NULL },
3292    };
3293    known_capsule *known = &known_capsules[0];
3294
3295#define FAIL(x) { error = (x); goto exit; }
3296
3297#define CHECK_DESTRUCTOR \
3298    if (capsule_error) { \
3299        FAIL(capsule_error); \
3300    } \
3301    else if (!capsule_destructor_call_count) {          \
3302        FAIL("destructor not called!"); \
3303    } \
3304    capsule_destructor_call_count = 0; \
3305
3306    object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
3307    PyCapsule_SetContext(object, capsule_context);
3308    capsule_destructor(object);
3309    CHECK_DESTRUCTOR;
3310    Py_DECREF(object);
3311    CHECK_DESTRUCTOR;
3312
3313    object = PyCapsule_New(known, "ignored", NULL);
3314    PyCapsule_SetPointer(object, capsule_pointer);
3315    PyCapsule_SetName(object, capsule_name);
3316    PyCapsule_SetDestructor(object, capsule_destructor);
3317    PyCapsule_SetContext(object, capsule_context);
3318    capsule_destructor(object);
3319    CHECK_DESTRUCTOR;
3320    /* intentionally access using the wrong name */
3321    pointer2 = PyCapsule_GetPointer(object, "the wrong name");
3322    if (!PyErr_Occurred()) {
3323        FAIL("PyCapsule_GetPointer should have failed but did not!");
3324    }
3325    PyErr_Clear();
3326    if (pointer2) {
3327        if (pointer2 == capsule_pointer) {
3328            FAIL("PyCapsule_GetPointer should not have"
3329                     " returned the internal pointer!");
3330        } else {
3331            FAIL("PyCapsule_GetPointer should have "
3332                     "returned NULL pointer but did not!");
3333        }
3334    }
3335    PyCapsule_SetDestructor(object, NULL);
3336    Py_DECREF(object);
3337    if (capsule_destructor_call_count) {
3338        FAIL("destructor called when it should not have been!");
3339    }
3340
3341    for (known = &known_capsules[0]; known->module != NULL; known++) {
3342        /* yeah, ordinarily I wouldn't do this either,
3343           but it's fine for this test harness.
3344        */
3345        static char buffer[256];
3346#undef FAIL
3347#define FAIL(x) \
3348        { \
3349        sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
3350            x, known->module, known->attribute); \
3351        error = buffer; \
3352        goto exit; \
3353        } \
3354
3355        PyObject *module = PyImport_ImportModule(known->module);
3356        if (module) {
3357            pointer = PyCapsule_Import(known->name, 0);
3358            if (!pointer) {
3359                Py_DECREF(module);
3360                FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
3361            }
3362            object = PyObject_GetAttrString(module, known->attribute);
3363            if (!object) {
3364                Py_DECREF(module);
3365                return NULL;
3366            }
3367            pointer2 = PyCapsule_GetPointer(object,
3368                                    "weebles wobble but they don't fall down");
3369            if (!PyErr_Occurred()) {
3370                Py_DECREF(object);
3371                Py_DECREF(module);
3372                FAIL("PyCapsule_GetPointer should have failed but did not!");
3373            }
3374            PyErr_Clear();
3375            if (pointer2) {
3376                Py_DECREF(module);
3377                Py_DECREF(object);
3378                if (pointer2 == pointer) {
3379                    FAIL("PyCapsule_GetPointer should not have"
3380                             " returned its internal pointer!");
3381                } else {
3382                    FAIL("PyCapsule_GetPointer should have"
3383                             " returned NULL pointer but did not!");
3384                }
3385            }
3386            Py_DECREF(object);
3387            Py_DECREF(module);
3388        }
3389        else
3390            PyErr_Clear();
3391    }
3392
3393  exit:
3394    if (error) {
3395        return raiseTestError("test_capsule", error);
3396    }
3397    Py_RETURN_NONE;
3398#undef FAIL
3399}
3400
3401#ifdef HAVE_GETTIMEOFDAY
3402/* Profiling of integer performance */
3403static void print_delta(int test, struct timeval *s, struct timeval *e)
3404{
3405    e->tv_sec -= s->tv_sec;
3406    e->tv_usec -= s->tv_usec;
3407    if (e->tv_usec < 0) {
3408        e->tv_sec -=1;
3409        e->tv_usec += 1000000;
3410    }
3411    printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
3412}
3413
3414static PyObject *
3415profile_int(PyObject *self, PyObject* args)
3416{
3417    int i, k;
3418    struct timeval start, stop;
3419    PyObject *single, **multiple, *op1, *result;
3420
3421    /* Test 1: Allocate and immediately deallocate
3422       many small integers */
3423    gettimeofday(&start, NULL);
3424    for(k=0; k < 20000; k++)
3425        for(i=0; i < 1000; i++) {
3426            single = PyLong_FromLong(i);
3427            Py_DECREF(single);
3428        }
3429    gettimeofday(&stop, NULL);
3430    print_delta(1, &start, &stop);
3431
3432    /* Test 2: Allocate and immediately deallocate
3433       many large integers */
3434    gettimeofday(&start, NULL);
3435    for(k=0; k < 20000; k++)
3436        for(i=0; i < 1000; i++) {
3437            single = PyLong_FromLong(i+1000000);
3438            Py_DECREF(single);
3439        }
3440    gettimeofday(&stop, NULL);
3441    print_delta(2, &start, &stop);
3442
3443    /* Test 3: Allocate a few integers, then release
3444       them all simultaneously. */
3445    multiple = malloc(sizeof(PyObject*) * 1000);
3446    if (multiple == NULL)
3447        return PyErr_NoMemory();
3448    gettimeofday(&start, NULL);
3449    for(k=0; k < 20000; k++) {
3450        for(i=0; i < 1000; i++) {
3451            multiple[i] = PyLong_FromLong(i+1000000);
3452        }
3453        for(i=0; i < 1000; i++) {
3454            Py_DECREF(multiple[i]);
3455        }
3456    }
3457    gettimeofday(&stop, NULL);
3458    print_delta(3, &start, &stop);
3459    free(multiple);
3460
3461    /* Test 4: Allocate many integers, then release
3462       them all simultaneously. */
3463    multiple = malloc(sizeof(PyObject*) * 1000000);
3464    if (multiple == NULL)
3465        return PyErr_NoMemory();
3466    gettimeofday(&start, NULL);
3467    for(k=0; k < 20; k++) {
3468        for(i=0; i < 1000000; i++) {
3469            multiple[i] = PyLong_FromLong(i+1000000);
3470        }
3471        for(i=0; i < 1000000; i++) {
3472            Py_DECREF(multiple[i]);
3473        }
3474    }
3475    gettimeofday(&stop, NULL);
3476    print_delta(4, &start, &stop);
3477    free(multiple);
3478
3479    /* Test 5: Allocate many integers < 32000 */
3480    multiple = malloc(sizeof(PyObject*) * 1000000);
3481    if (multiple == NULL)
3482        return PyErr_NoMemory();
3483    gettimeofday(&start, NULL);
3484    for(k=0; k < 10; k++) {
3485        for(i=0; i < 1000000; i++) {
3486            multiple[i] = PyLong_FromLong(i+1000);
3487        }
3488        for(i=0; i < 1000000; i++) {
3489            Py_DECREF(multiple[i]);
3490        }
3491    }
3492    gettimeofday(&stop, NULL);
3493    print_delta(5, &start, &stop);
3494    free(multiple);
3495
3496    /* Test 6: Perform small int addition */
3497    op1 = PyLong_FromLong(1);
3498    gettimeofday(&start, NULL);
3499    for(i=0; i < 10000000; i++) {
3500        result = PyNumber_Add(op1, op1);
3501        Py_DECREF(result);
3502    }
3503    gettimeofday(&stop, NULL);
3504    Py_DECREF(op1);
3505    print_delta(6, &start, &stop);
3506
3507    /* Test 7: Perform medium int addition */
3508    op1 = PyLong_FromLong(1000);
3509    if (op1 == NULL)
3510        return NULL;
3511    gettimeofday(&start, NULL);
3512    for(i=0; i < 10000000; i++) {
3513        result = PyNumber_Add(op1, op1);
3514        Py_XDECREF(result);
3515    }
3516    gettimeofday(&stop, NULL);
3517    Py_DECREF(op1);
3518    print_delta(7, &start, &stop);
3519
3520    Py_RETURN_NONE;
3521}
3522#endif
3523
3524/* To test the format of tracebacks as printed out. */
3525static PyObject *
3526traceback_print(PyObject *self, PyObject *args)
3527{
3528    PyObject *file;
3529    PyObject *traceback;
3530    int result;
3531
3532    if (!PyArg_ParseTuple(args, "OO:traceback_print",
3533                            &traceback, &file))
3534        return NULL;
3535
3536    result = PyTraceBack_Print(traceback, file);
3537    if (result < 0)
3538        return NULL;
3539    Py_RETURN_NONE;
3540}
3541
3542/* To test the format of exceptions as printed out. */
3543static PyObject *
3544exception_print(PyObject *self, PyObject *args)
3545{
3546    PyObject *value;
3547    PyObject *tb = NULL;
3548
3549    if (!PyArg_ParseTuple(args, "O:exception_print",
3550                            &value)) {
3551        return NULL;
3552    }
3553
3554    if (PyExceptionInstance_Check(value)) {
3555        tb = PyException_GetTraceback(value);
3556    }
3557
3558    PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3559    Py_XDECREF(tb);
3560
3561    Py_RETURN_NONE;
3562}
3563
3564
3565
3566
3567/* reliably raise a MemoryError */
3568static PyObject *
3569raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
3570{
3571    PyErr_NoMemory();
3572    return NULL;
3573}
3574
3575/* Issue 6012 */
3576static PyObject *str1, *str2;
3577static int
3578failing_converter(PyObject *obj, void *arg)
3579{
3580    /* Clone str1, then let the conversion fail. */
3581    assert(str1);
3582    str2 = str1;
3583    Py_INCREF(str2);
3584    return 0;
3585}
3586static PyObject*
3587argparsing(PyObject *o, PyObject *args)
3588{
3589    PyObject *res;
3590    str1 = str2 = NULL;
3591    if (!PyArg_ParseTuple(args, "O&O&",
3592                          PyUnicode_FSConverter, &str1,
3593                          failing_converter, &str2)) {
3594        if (!str2)
3595            /* argument converter not called? */
3596            return NULL;
3597        /* Should be 1 */
3598        res = PyLong_FromSsize_t(Py_REFCNT(str2));
3599        Py_DECREF(str2);
3600        PyErr_Clear();
3601        return res;
3602    }
3603    Py_RETURN_NONE;
3604}
3605
3606/* To test that the result of PyCode_NewEmpty has the right members. */
3607static PyObject *
3608code_newempty(PyObject *self, PyObject *args)
3609{
3610    const char *filename;
3611    const char *funcname;
3612    int firstlineno;
3613
3614    if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3615                          &filename, &funcname, &firstlineno))
3616        return NULL;
3617
3618    return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
3619}
3620
3621/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3622   Run via Lib/test/test_exceptions.py */
3623static PyObject *
3624make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3625{
3626    const char *name;
3627    const char *doc = NULL;
3628    PyObject *base = NULL;
3629    PyObject *dict = NULL;
3630
3631    static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
3632
3633    if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3634                    "s|sOO:make_exception_with_doc", kwlist,
3635                                     &name, &doc, &base, &dict))
3636        return NULL;
3637
3638    return PyErr_NewExceptionWithDoc(name, doc, base, dict);
3639}
3640
3641static PyObject *
3642make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
3643{
3644    Py_buffer info;
3645    if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3646        return NULL;
3647    return PyMemoryView_FromBuffer(&info);
3648}
3649
3650static PyObject *
3651test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
3652{
3653    int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3654    int init[5] = {0, 1, 2, 3, 4};
3655    Py_ssize_t itemsize = sizeof(int);
3656    Py_ssize_t shape = 5;
3657    Py_ssize_t strides = 2 * itemsize;
3658    Py_buffer view = {
3659        data,
3660        NULL,
3661        5 * itemsize,
3662        itemsize,
3663        1,
3664        1,
3665        NULL,
3666        &shape,
3667        &strides,
3668        NULL,
3669        NULL
3670    };
3671    int *ptr;
3672    int i;
3673
3674    PyBuffer_FromContiguous(&view, init, view.len, 'C');
3675    ptr = view.buf;
3676    for (i = 0; i < 5; i++) {
3677        if (ptr[2*i] != i) {
3678            PyErr_SetString(TestError,
3679                "test_from_contiguous: incorrect result");
3680            return NULL;
3681        }
3682    }
3683
3684    view.buf = &data[8];
3685    view.strides[0] = -2 * itemsize;
3686
3687    PyBuffer_FromContiguous(&view, init, view.len, 'C');
3688    ptr = view.buf;
3689    for (i = 0; i < 5; i++) {
3690        if (*(ptr-2*i) != i) {
3691            PyErr_SetString(TestError,
3692                "test_from_contiguous: incorrect result");
3693            return NULL;
3694        }
3695    }
3696
3697    Py_RETURN_NONE;
3698}
3699
3700#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
3701extern PyTypeObject _PyBytesIOBuffer_Type;
3702
3703static PyObject *
3704test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
3705{
3706    PyTypeObject *type = &_PyBytesIOBuffer_Type;
3707    PyObject *b;
3708    char *dummy[1];
3709    int ret, match;
3710
3711    /* PyBuffer_FillInfo() */
3712    ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3713    match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3714    PyErr_Clear();
3715    if (ret != -1 || match == 0)
3716        goto error;
3717
3718    /* bytesiobuf_getbuffer() */
3719    b = type->tp_alloc(type, 0);
3720    if (b == NULL) {
3721        return NULL;
3722    }
3723
3724    ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3725    Py_DECREF(b);
3726    match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3727    PyErr_Clear();
3728    if (ret != -1 || match == 0)
3729        goto error;
3730
3731    Py_RETURN_NONE;
3732
3733error:
3734    PyErr_SetString(TestError,
3735        "test_pep3118_obsolete_write_locks: failure");
3736    return NULL;
3737}
3738#endif
3739
3740/* This tests functions that historically supported write locks.  It is
3741   wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3742   is entitled to segfault in that case. */
3743static PyObject *
3744getbuffer_with_null_view(PyObject* self, PyObject *obj)
3745{
3746    if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3747        return NULL;
3748
3749    Py_RETURN_NONE;
3750}
3751
3752/* PyBuffer_SizeFromFormat() */
3753static PyObject *
3754test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
3755{
3756    const char *format;
3757    Py_ssize_t result;
3758
3759    if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
3760                          &format)) {
3761        return NULL;
3762    }
3763
3764    result = PyBuffer_SizeFromFormat(format);
3765    if (result == -1) {
3766        return NULL;
3767    }
3768
3769    return PyLong_FromSsize_t(result);
3770}
3771
3772/* Test that the fatal error from not having a current thread doesn't
3773   cause an infinite loop.  Run via Lib/test/test_capi.py */
3774static PyObject *
3775crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
3776{
3777    Py_BEGIN_ALLOW_THREADS
3778    /* Using PyThreadState_Get() directly allows the test to pass in
3779       !pydebug mode. However, the test only actually tests anything
3780       in pydebug mode, since that's where the infinite loop was in
3781       the first place. */
3782    PyThreadState_Get();
3783    Py_END_ALLOW_THREADS
3784    return NULL;
3785}
3786
3787/* To run some code in a sub-interpreter. */
3788static PyObject *
3789run_in_subinterp(PyObject *self, PyObject *args)
3790{
3791    const char *code;
3792    int r;
3793    PyThreadState *substate, *mainstate;
3794    /* only initialise 'cflags.cf_flags' to test backwards compatibility */
3795    PyCompilerFlags cflags = {0};
3796
3797    if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3798                          &code))
3799        return NULL;
3800
3801    mainstate = PyThreadState_Get();
3802
3803    PyThreadState_Swap(NULL);
3804
3805    substate = Py_NewInterpreter();
3806    if (substate == NULL) {
3807        /* Since no new thread state was created, there is no exception to
3808           propagate; raise a fresh one after swapping in the old thread
3809           state. */
3810        PyThreadState_Swap(mainstate);
3811        PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3812        return NULL;
3813    }
3814    r = PyRun_SimpleStringFlags(code, &cflags);
3815    Py_EndInterpreter(substate);
3816
3817    PyThreadState_Swap(mainstate);
3818
3819    return PyLong_FromLong(r);
3820}
3821
3822static int
3823check_time_rounding(int round)
3824{
3825    if (round != _PyTime_ROUND_FLOOR
3826        && round != _PyTime_ROUND_CEILING
3827        && round != _PyTime_ROUND_HALF_EVEN
3828        && round != _PyTime_ROUND_UP) {
3829        PyErr_SetString(PyExc_ValueError, "invalid rounding");
3830        return -1;
3831    }
3832    return 0;
3833}
3834
3835static PyObject *
3836test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3837{
3838    PyObject *obj;
3839    time_t sec;
3840    int round;
3841    if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
3842        return NULL;
3843    if (check_time_rounding(round) < 0)
3844        return NULL;
3845    if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
3846        return NULL;
3847    return _PyLong_FromTime_t(sec);
3848}
3849
3850static PyObject *
3851test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3852{
3853    PyObject *obj;
3854    time_t sec;
3855    long usec;
3856    int round;
3857    if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
3858        return NULL;
3859    if (check_time_rounding(round) < 0)
3860        return NULL;
3861    if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
3862        return NULL;
3863    return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3864}
3865
3866static PyObject *
3867test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3868{
3869    PyObject *obj;
3870    time_t sec;
3871    long nsec;
3872    int round;
3873    if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
3874        return NULL;
3875    if (check_time_rounding(round) < 0)
3876        return NULL;
3877    if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
3878        return NULL;
3879    return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
3880}
3881
3882static void
3883slot_tp_del(PyObject *self)
3884{
3885    _Py_IDENTIFIER(__tp_del__);
3886    PyObject *del, *res;
3887    PyObject *error_type, *error_value, *error_traceback;
3888
3889    /* Temporarily resurrect the object. */
3890    assert(Py_REFCNT(self) == 0);
3891    Py_SET_REFCNT(self, 1);
3892
3893    /* Save the current exception, if any. */
3894    PyErr_Fetch(&error_type, &error_value, &error_traceback);
3895
3896    /* Execute __del__ method, if any. */
3897    del = _PyObject_LookupSpecialId(self, &PyId___tp_del__);
3898    if (del != NULL) {
3899        res = PyObject_CallNoArgs(del);
3900        if (res == NULL)
3901            PyErr_WriteUnraisable(del);
3902        else
3903            Py_DECREF(res);
3904        Py_DECREF(del);
3905    }
3906
3907    /* Restore the saved exception. */
3908    PyErr_Restore(error_type, error_value, error_traceback);
3909
3910    /* Undo the temporary resurrection; can't use DECREF here, it would
3911     * cause a recursive call.
3912     */
3913    assert(Py_REFCNT(self) > 0);
3914    Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
3915    if (Py_REFCNT(self) == 0) {
3916        /* this is the normal path out */
3917        return;
3918    }
3919
3920    /* __del__ resurrected it!  Make it look like the original Py_DECREF
3921     * never happened.
3922     */
3923    {
3924        Py_ssize_t refcnt = Py_REFCNT(self);
3925        _Py_NewReference(self);
3926        Py_SET_REFCNT(self, refcnt);
3927    }
3928    assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self));
3929    /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
3930       _Py_RefTotal, so we need to undo that. */
3931#ifdef Py_REF_DEBUG
3932    _Py_RefTotal--;
3933#endif
3934}
3935
3936static PyObject *
3937with_tp_del(PyObject *self, PyObject *args)
3938{
3939    PyObject *obj;
3940    PyTypeObject *tp;
3941
3942    if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3943        return NULL;
3944    tp = (PyTypeObject *) obj;
3945    if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3946        PyErr_Format(PyExc_TypeError,
3947                     "heap type expected, got %R", obj);
3948        return NULL;
3949    }
3950    tp->tp_del = slot_tp_del;
3951    Py_INCREF(obj);
3952    return obj;
3953}
3954
3955static PyObject *
3956without_gc(PyObject *Py_UNUSED(self), PyObject *obj)
3957{
3958    PyTypeObject *tp = (PyTypeObject*)obj;
3959    if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3960        return PyErr_Format(PyExc_TypeError, "heap type expected, got %R", obj);
3961    }
3962    if (PyType_IS_GC(tp)) {
3963        // Don't try this at home, kids:
3964        tp->tp_flags -= Py_TPFLAGS_HAVE_GC;
3965        tp->tp_free = PyObject_Del;
3966        tp->tp_traverse = NULL;
3967        tp->tp_clear = NULL;
3968    }
3969    assert(!PyType_IS_GC(tp));
3970    Py_INCREF(obj);
3971    return obj;
3972}
3973
3974static PyMethodDef ml;
3975
3976static PyObject *
3977create_cfunction(PyObject *self, PyObject *args)
3978{
3979    return PyCFunction_NewEx(&ml, self, NULL);
3980}
3981
3982static PyMethodDef ml = {
3983    "create_cfunction",
3984    create_cfunction,
3985    METH_NOARGS,
3986    NULL
3987};
3988
3989static PyObject *
3990_test_incref(PyObject *ob)
3991{
3992    Py_INCREF(ob);
3993    return ob;
3994}
3995
3996static PyObject *
3997test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
3998{
3999    PyObject *obj = PyLong_FromLong(0);
4000    Py_XINCREF(_test_incref(obj));
4001    Py_DECREF(obj);
4002    Py_DECREF(obj);
4003    Py_DECREF(obj);
4004    Py_RETURN_NONE;
4005}
4006
4007static PyObject *
4008test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
4009{
4010    PyObject *obj = PyLong_FromLong(0);
4011    Py_INCREF(_test_incref(obj));
4012    Py_DECREF(obj);
4013    Py_DECREF(obj);
4014    Py_DECREF(obj);
4015    Py_RETURN_NONE;
4016}
4017
4018static PyObject *
4019test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
4020{
4021    Py_XDECREF(PyLong_FromLong(0));
4022    Py_RETURN_NONE;
4023}
4024
4025static PyObject *
4026test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
4027{
4028    Py_DECREF(PyLong_FromLong(0));
4029    Py_RETURN_NONE;
4030}
4031
4032static PyObject *
4033test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
4034                              PyObject *Py_UNUSED(args))
4035{
4036    PyStructSequence_Desc descr;
4037    PyStructSequence_Field descr_fields[3];
4038
4039    descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
4040    descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
4041    descr_fields[2] = (PyStructSequence_Field){0, NULL};
4042
4043    descr.name = "_testcapi.test_descr";
4044    descr.doc = "This is used to test for memory leaks in NewType";
4045    descr.fields = descr_fields;
4046    descr.n_in_sequence = 1;
4047
4048    PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
4049    assert(structseq_type != NULL);
4050    assert(PyType_Check(structseq_type));
4051    assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
4052    Py_DECREF(structseq_type);
4053
4054    Py_RETURN_NONE;
4055}
4056
4057static PyObject *
4058test_structseq_newtype_null_descr_doc(PyObject *Py_UNUSED(self),
4059                              PyObject *Py_UNUSED(args))
4060{
4061    PyStructSequence_Field descr_fields[1] = {
4062        (PyStructSequence_Field){NULL, NULL}
4063    };
4064    // Test specifically for NULL .doc field.
4065    PyStructSequence_Desc descr = {"_testcapi.test_descr", NULL, &descr_fields[0], 0};
4066
4067    PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
4068    assert(structseq_type != NULL);
4069    assert(PyType_Check(structseq_type));
4070    assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
4071    Py_DECREF(structseq_type);
4072
4073    Py_RETURN_NONE;
4074}
4075
4076static PyObject *
4077test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
4078{
4079    PyObject *obj = PyLong_FromLong(0);
4080    Py_IncRef(obj);
4081    Py_DecRef(obj);
4082    Py_DecRef(obj);
4083    Py_RETURN_NONE;
4084}
4085
4086static PyObject *
4087test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
4088{
4089    void *ptr;
4090
4091    ptr = PyMem_RawMalloc(0);
4092    if (ptr == NULL) {
4093        PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
4094        return NULL;
4095    }
4096    PyMem_RawFree(ptr);
4097
4098    ptr = PyMem_RawCalloc(0, 0);
4099    if (ptr == NULL) {
4100        PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
4101        return NULL;
4102    }
4103    PyMem_RawFree(ptr);
4104
4105    ptr = PyMem_Malloc(0);
4106    if (ptr == NULL) {
4107        PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
4108        return NULL;
4109    }
4110    PyMem_Free(ptr);
4111
4112    ptr = PyMem_Calloc(0, 0);
4113    if (ptr == NULL) {
4114        PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
4115        return NULL;
4116    }
4117    PyMem_Free(ptr);
4118
4119    ptr = PyObject_Malloc(0);
4120    if (ptr == NULL) {
4121        PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
4122        return NULL;
4123    }
4124    PyObject_Free(ptr);
4125
4126    ptr = PyObject_Calloc(0, 0);
4127    if (ptr == NULL) {
4128        PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
4129        return NULL;
4130    }
4131    PyObject_Free(ptr);
4132
4133    Py_RETURN_NONE;
4134}
4135
4136typedef struct {
4137    PyMemAllocatorEx alloc;
4138
4139    size_t malloc_size;
4140    size_t calloc_nelem;
4141    size_t calloc_elsize;
4142    void *realloc_ptr;
4143    size_t realloc_new_size;
4144    void *free_ptr;
4145    void *ctx;
4146} alloc_hook_t;
4147
4148static void* hook_malloc(void* ctx, size_t size)
4149{
4150    alloc_hook_t *hook = (alloc_hook_t *)ctx;
4151    hook->ctx = ctx;
4152    hook->malloc_size = size;
4153    return hook->alloc.malloc(hook->alloc.ctx, size);
4154}
4155
4156static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
4157{
4158    alloc_hook_t *hook = (alloc_hook_t *)ctx;
4159    hook->ctx = ctx;
4160    hook->calloc_nelem = nelem;
4161    hook->calloc_elsize = elsize;
4162    return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
4163}
4164
4165static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
4166{
4167    alloc_hook_t *hook = (alloc_hook_t *)ctx;
4168    hook->ctx = ctx;
4169    hook->realloc_ptr = ptr;
4170    hook->realloc_new_size = new_size;
4171    return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
4172}
4173
4174static void hook_free(void *ctx, void *ptr)
4175{
4176    alloc_hook_t *hook = (alloc_hook_t *)ctx;
4177    hook->ctx = ctx;
4178    hook->free_ptr = ptr;
4179    hook->alloc.free(hook->alloc.ctx, ptr);
4180}
4181
4182static PyObject *
4183test_setallocators(PyMemAllocatorDomain domain)
4184{
4185    PyObject *res = NULL;
4186    const char *error_msg;
4187    alloc_hook_t hook;
4188    PyMemAllocatorEx alloc;
4189    size_t size, size2, nelem, elsize;
4190    void *ptr, *ptr2;
4191
4192    memset(&hook, 0, sizeof(hook));
4193
4194    alloc.ctx = &hook;
4195    alloc.malloc = &hook_malloc;
4196    alloc.calloc = &hook_calloc;
4197    alloc.realloc = &hook_realloc;
4198    alloc.free = &hook_free;
4199    PyMem_GetAllocator(domain, &hook.alloc);
4200    PyMem_SetAllocator(domain, &alloc);
4201
4202    /* malloc, realloc, free */
4203    size = 42;
4204    hook.ctx = NULL;
4205    switch(domain)
4206    {
4207    case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
4208    case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
4209    case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
4210    default: ptr = NULL; break;
4211    }
4212
4213#define CHECK_CTX(FUNC) \
4214    if (hook.ctx != &hook) { \
4215        error_msg = FUNC " wrong context"; \
4216        goto fail; \
4217    } \
4218    hook.ctx = NULL;  /* reset for next check */
4219
4220    if (ptr == NULL) {
4221        error_msg = "malloc failed";
4222        goto fail;
4223    }
4224    CHECK_CTX("malloc");
4225    if (hook.malloc_size != size) {
4226        error_msg = "malloc invalid size";
4227        goto fail;
4228    }
4229
4230    size2 = 200;
4231    switch(domain)
4232    {
4233    case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
4234    case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
4235    case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
4236    default: ptr2 = NULL; break;
4237    }
4238
4239    if (ptr2 == NULL) {
4240        error_msg = "realloc failed";
4241        goto fail;
4242    }
4243    CHECK_CTX("realloc");
4244    if (hook.realloc_ptr != ptr
4245        || hook.realloc_new_size != size2) {
4246        error_msg = "realloc invalid parameters";
4247        goto fail;
4248    }
4249
4250    switch(domain)
4251    {
4252    case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
4253    case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
4254    case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
4255    }
4256
4257    CHECK_CTX("free");
4258    if (hook.free_ptr != ptr2) {
4259        error_msg = "free invalid pointer";
4260        goto fail;
4261    }
4262
4263    /* calloc, free */
4264    nelem = 2;
4265    elsize = 5;
4266    switch(domain)
4267    {
4268    case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
4269    case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
4270    case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
4271    default: ptr = NULL; break;
4272    }
4273
4274    if (ptr == NULL) {
4275        error_msg = "calloc failed";
4276        goto fail;
4277    }
4278    CHECK_CTX("calloc");
4279    if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
4280        error_msg = "calloc invalid nelem or elsize";
4281        goto fail;
4282    }
4283
4284    hook.free_ptr = NULL;
4285    switch(domain)
4286    {
4287    case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
4288    case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
4289    case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
4290    }
4291
4292    CHECK_CTX("calloc free");
4293    if (hook.free_ptr != ptr) {
4294        error_msg = "calloc free invalid pointer";
4295        goto fail;
4296    }
4297
4298    Py_INCREF(Py_None);
4299    res = Py_None;
4300    goto finally;
4301
4302fail:
4303    PyErr_SetString(PyExc_RuntimeError, error_msg);
4304
4305finally:
4306    PyMem_SetAllocator(domain, &hook.alloc);
4307    return res;
4308
4309#undef CHECK_CTX
4310}
4311
4312static PyObject *
4313test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
4314{
4315    return test_setallocators(PYMEM_DOMAIN_RAW);
4316}
4317
4318static PyObject *
4319test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
4320{
4321    return test_setallocators(PYMEM_DOMAIN_MEM);
4322}
4323
4324static PyObject *
4325test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
4326{
4327    return test_setallocators(PYMEM_DOMAIN_OBJ);
4328}
4329
4330/* Most part of the following code is inherited from the pyfailmalloc project
4331 * written by Victor Stinner. */
4332static struct {
4333    int installed;
4334    PyMemAllocatorEx raw;
4335    PyMemAllocatorEx mem;
4336    PyMemAllocatorEx obj;
4337} FmHook;
4338
4339static struct {
4340    int start;
4341    int stop;
4342    Py_ssize_t count;
4343} FmData;
4344
4345static int
4346fm_nomemory(void)
4347{
4348    FmData.count++;
4349    if (FmData.count > FmData.start &&
4350            (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
4351        return 1;
4352    }
4353    return 0;
4354}
4355
4356static void *
4357hook_fmalloc(void *ctx, size_t size)
4358{
4359    PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4360    if (fm_nomemory()) {
4361        return NULL;
4362    }
4363    return alloc->malloc(alloc->ctx, size);
4364}
4365
4366static void *
4367hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
4368{
4369    PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4370    if (fm_nomemory()) {
4371        return NULL;
4372    }
4373    return alloc->calloc(alloc->ctx, nelem, elsize);
4374}
4375
4376static void *
4377hook_frealloc(void *ctx, void *ptr, size_t new_size)
4378{
4379    PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4380    if (fm_nomemory()) {
4381        return NULL;
4382    }
4383    return alloc->realloc(alloc->ctx, ptr, new_size);
4384}
4385
4386static void
4387hook_ffree(void *ctx, void *ptr)
4388{
4389    PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4390    alloc->free(alloc->ctx, ptr);
4391}
4392
4393static void
4394fm_setup_hooks(void)
4395{
4396    PyMemAllocatorEx alloc;
4397
4398    if (FmHook.installed) {
4399        return;
4400    }
4401    FmHook.installed = 1;
4402
4403    alloc.malloc = hook_fmalloc;
4404    alloc.calloc = hook_fcalloc;
4405    alloc.realloc = hook_frealloc;
4406    alloc.free = hook_ffree;
4407    PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4408    PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4409    PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4410
4411    alloc.ctx = &FmHook.raw;
4412    PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
4413
4414    alloc.ctx = &FmHook.mem;
4415    PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
4416
4417    alloc.ctx = &FmHook.obj;
4418    PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
4419}
4420
4421static void
4422fm_remove_hooks(void)
4423{
4424    if (FmHook.installed) {
4425        FmHook.installed = 0;
4426        PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4427        PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4428        PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4429    }
4430}
4431
4432static PyObject*
4433set_nomemory(PyObject *self, PyObject *args)
4434{
4435    /* Memory allocation fails after 'start' allocation requests, and until
4436     * 'stop' allocation requests except when 'stop' is negative or equal
4437     * to 0 (default) in which case allocation failures never stop. */
4438    FmData.count = 0;
4439    FmData.stop = 0;
4440    if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
4441        return NULL;
4442    }
4443    fm_setup_hooks();
4444    Py_RETURN_NONE;
4445}
4446
4447static PyObject*
4448remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
4449{
4450    fm_remove_hooks();
4451    Py_RETURN_NONE;
4452}
4453
4454PyDoc_STRVAR(docstring_empty,
4455""
4456);
4457
4458PyDoc_STRVAR(docstring_no_signature,
4459"This docstring has no signature."
4460);
4461
4462PyDoc_STRVAR(docstring_with_invalid_signature,
4463"docstring_with_invalid_signature($module, /, boo)\n"
4464"\n"
4465"This docstring has an invalid signature."
4466);
4467
4468PyDoc_STRVAR(docstring_with_invalid_signature2,
4469"docstring_with_invalid_signature2($module, /, boo)\n"
4470"\n"
4471"--\n"
4472"\n"
4473"This docstring also has an invalid signature."
4474);
4475
4476PyDoc_STRVAR(docstring_with_signature,
4477"docstring_with_signature($module, /, sig)\n"
4478"--\n"
4479"\n"
4480"This docstring has a valid signature."
4481);
4482
4483PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4484"docstring_with_signature_but_no_doc($module, /, sig)\n"
4485"--\n"
4486"\n"
4487);
4488
4489PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
4490"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4491"--\n"
4492"\n"
4493"\n"
4494"This docstring has a valid signature and some extra newlines."
4495);
4496
4497PyDoc_STRVAR(docstring_with_signature_with_defaults,
4498"docstring_with_signature_with_defaults(module, s='avocado',\n"
4499"        b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4500"        local=the_number_three, sys=sys.maxsize,\n"
4501"        exp=sys.maxsize - 1)\n"
4502"--\n"
4503"\n"
4504"\n"
4505"\n"
4506"This docstring has a valid signature with parameters,\n"
4507"and the parameters take defaults of varying types."
4508);
4509
4510typedef struct {
4511    PyThread_type_lock start_event;
4512    PyThread_type_lock exit_event;
4513    PyObject *callback;
4514} test_c_thread_t;
4515
4516static void
4517temporary_c_thread(void *data)
4518{
4519    test_c_thread_t *test_c_thread = data;
4520    PyGILState_STATE state;
4521    PyObject *res;
4522
4523    PyThread_release_lock(test_c_thread->start_event);
4524
4525    /* Allocate a Python thread state for this thread */
4526    state = PyGILState_Ensure();
4527
4528    res = PyObject_CallNoArgs(test_c_thread->callback);
4529    Py_CLEAR(test_c_thread->callback);
4530
4531    if (res == NULL) {
4532        PyErr_Print();
4533    }
4534    else {
4535        Py_DECREF(res);
4536    }
4537
4538    /* Destroy the Python thread state for this thread */
4539    PyGILState_Release(state);
4540
4541    PyThread_release_lock(test_c_thread->exit_event);
4542}
4543
4544static test_c_thread_t test_c_thread;
4545
4546static PyObject *
4547call_in_temporary_c_thread(PyObject *self, PyObject *args)
4548{
4549    PyObject *res = NULL;
4550    PyObject *callback = NULL;
4551    long thread;
4552    int wait = 1;
4553    if (!PyArg_ParseTuple(args, "O|i", &callback, &wait))
4554    {
4555        return NULL;
4556    }
4557
4558    test_c_thread.start_event = PyThread_allocate_lock();
4559    test_c_thread.exit_event = PyThread_allocate_lock();
4560    test_c_thread.callback = NULL;
4561    if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4562        PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4563        goto exit;
4564    }
4565
4566    test_c_thread.callback = Py_NewRef(callback);
4567
4568    PyThread_acquire_lock(test_c_thread.start_event, 1);
4569    PyThread_acquire_lock(test_c_thread.exit_event, 1);
4570
4571    thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4572    if (thread == -1) {
4573        PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4574        PyThread_release_lock(test_c_thread.start_event);
4575        PyThread_release_lock(test_c_thread.exit_event);
4576        goto exit;
4577    }
4578
4579    PyThread_acquire_lock(test_c_thread.start_event, 1);
4580    PyThread_release_lock(test_c_thread.start_event);
4581
4582    if (!wait) {
4583        Py_RETURN_NONE;
4584    }
4585
4586    Py_BEGIN_ALLOW_THREADS
4587        PyThread_acquire_lock(test_c_thread.exit_event, 1);
4588        PyThread_release_lock(test_c_thread.exit_event);
4589    Py_END_ALLOW_THREADS
4590
4591    res = Py_NewRef(Py_None);
4592
4593exit:
4594    Py_CLEAR(test_c_thread.callback);
4595    if (test_c_thread.start_event) {
4596        PyThread_free_lock(test_c_thread.start_event);
4597        test_c_thread.start_event = NULL;
4598    }
4599    if (test_c_thread.exit_event) {
4600        PyThread_free_lock(test_c_thread.exit_event);
4601        test_c_thread.exit_event = NULL;
4602    }
4603    return res;
4604}
4605
4606static PyObject *
4607join_temporary_c_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
4608{
4609    Py_BEGIN_ALLOW_THREADS
4610        PyThread_acquire_lock(test_c_thread.exit_event, 1);
4611        PyThread_release_lock(test_c_thread.exit_event);
4612    Py_END_ALLOW_THREADS
4613    Py_CLEAR(test_c_thread.callback);
4614    PyThread_free_lock(test_c_thread.start_event);
4615    test_c_thread.start_event = NULL;
4616    PyThread_free_lock(test_c_thread.exit_event);
4617    test_c_thread.exit_event = NULL;
4618    Py_RETURN_NONE;
4619}
4620
4621/* marshal */
4622
4623static PyObject*
4624pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4625{
4626    long value;
4627    PyObject *filename;
4628    int version;
4629    FILE *fp;
4630
4631    if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file",
4632                          &value, &filename, &version))
4633        return NULL;
4634
4635    fp = _Py_fopen_obj(filename, "wb");
4636    if (fp == NULL) {
4637        PyErr_SetFromErrno(PyExc_OSError);
4638        return NULL;
4639    }
4640
4641    PyMarshal_WriteLongToFile(value, fp, version);
4642    assert(!PyErr_Occurred());
4643
4644    fclose(fp);
4645    Py_RETURN_NONE;
4646}
4647
4648static PyObject*
4649pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4650{
4651    PyObject *obj;
4652    PyObject *filename;
4653    int version;
4654    FILE *fp;
4655
4656    if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file",
4657                          &obj, &filename, &version))
4658        return NULL;
4659
4660    fp = _Py_fopen_obj(filename, "wb");
4661    if (fp == NULL) {
4662        PyErr_SetFromErrno(PyExc_OSError);
4663        return NULL;
4664    }
4665
4666    PyMarshal_WriteObjectToFile(obj, fp, version);
4667    assert(!PyErr_Occurred());
4668
4669    fclose(fp);
4670    Py_RETURN_NONE;
4671}
4672
4673static PyObject*
4674pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4675{
4676    int value;
4677    long pos;
4678    PyObject *filename;
4679    FILE *fp;
4680
4681    if (!PyArg_ParseTuple(args, "O:pymarshal_read_short_from_file", &filename))
4682        return NULL;
4683
4684    fp = _Py_fopen_obj(filename, "rb");
4685    if (fp == NULL) {
4686        PyErr_SetFromErrno(PyExc_OSError);
4687        return NULL;
4688    }
4689
4690    value = PyMarshal_ReadShortFromFile(fp);
4691    pos = ftell(fp);
4692
4693    fclose(fp);
4694    if (PyErr_Occurred())
4695        return NULL;
4696    return Py_BuildValue("il", value, pos);
4697}
4698
4699static PyObject*
4700pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4701{
4702    long value, pos;
4703    PyObject *filename;
4704    FILE *fp;
4705
4706    if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename))
4707        return NULL;
4708
4709    fp = _Py_fopen_obj(filename, "rb");
4710    if (fp == NULL) {
4711        PyErr_SetFromErrno(PyExc_OSError);
4712        return NULL;
4713    }
4714
4715    value = PyMarshal_ReadLongFromFile(fp);
4716    pos = ftell(fp);
4717
4718    fclose(fp);
4719    if (PyErr_Occurred())
4720        return NULL;
4721    return Py_BuildValue("ll", value, pos);
4722}
4723
4724static PyObject*
4725pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4726{
4727    PyObject *filename;
4728    if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename))
4729        return NULL;
4730
4731    FILE *fp = _Py_fopen_obj(filename, "rb");
4732    if (fp == NULL) {
4733        PyErr_SetFromErrno(PyExc_OSError);
4734        return NULL;
4735    }
4736
4737    PyObject *obj = PyMarshal_ReadLastObjectFromFile(fp);
4738    long pos = ftell(fp);
4739
4740    fclose(fp);
4741    if (obj == NULL) {
4742        return NULL;
4743    }
4744    return Py_BuildValue("Nl", obj, pos);
4745}
4746
4747static PyObject*
4748pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4749{
4750    PyObject *filename;
4751    if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename))
4752        return NULL;
4753
4754    FILE *fp = _Py_fopen_obj(filename, "rb");
4755    if (fp == NULL) {
4756        PyErr_SetFromErrno(PyExc_OSError);
4757        return NULL;
4758    }
4759
4760    PyObject *obj = PyMarshal_ReadObjectFromFile(fp);
4761    long pos = ftell(fp);
4762
4763    fclose(fp);
4764    if (obj == NULL) {
4765        return NULL;
4766    }
4767    return Py_BuildValue("Nl", obj, pos);
4768}
4769
4770static PyObject*
4771return_null_without_error(PyObject *self, PyObject *args)
4772{
4773    /* invalid call: return NULL without setting an error,
4774     * _Py_CheckFunctionResult() must detect such bug at runtime. */
4775    PyErr_Clear();
4776    return NULL;
4777}
4778
4779static PyObject*
4780return_result_with_error(PyObject *self, PyObject *args)
4781{
4782    /* invalid call: return a result with an error set,
4783     * _Py_CheckFunctionResult() must detect such bug at runtime. */
4784    PyErr_SetNone(PyExc_ValueError);
4785    Py_RETURN_NONE;
4786}
4787
4788static PyObject*
4789getitem_with_error(PyObject *self, PyObject *args)
4790{
4791    PyObject *map, *key;
4792    if (!PyArg_ParseTuple(args, "OO", &map, &key)) {
4793        return NULL;
4794    }
4795
4796    PyErr_SetString(PyExc_ValueError, "bug");
4797    return PyObject_GetItem(map, key);
4798}
4799
4800static PyObject *
4801test_pytime_fromseconds(PyObject *self, PyObject *args)
4802{
4803    int seconds;
4804    if (!PyArg_ParseTuple(args, "i", &seconds)) {
4805        return NULL;
4806    }
4807    _PyTime_t ts = _PyTime_FromSeconds(seconds);
4808    return _PyTime_AsNanosecondsObject(ts);
4809}
4810
4811static PyObject *
4812test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4813{
4814    PyObject *obj;
4815    int round;
4816    if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
4817        return NULL;
4818    }
4819    if (check_time_rounding(round) < 0) {
4820        return NULL;
4821    }
4822    _PyTime_t ts;
4823    if (_PyTime_FromSecondsObject(&ts, obj, round) == -1) {
4824        return NULL;
4825    }
4826    return _PyTime_AsNanosecondsObject(ts);
4827}
4828
4829static PyObject *
4830test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4831{
4832    PyObject *obj;
4833    if (!PyArg_ParseTuple(args, "O", &obj)) {
4834        return NULL;
4835    }
4836    _PyTime_t ts;
4837    if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4838        return NULL;
4839    }
4840    double d = _PyTime_AsSecondsDouble(ts);
4841    return PyFloat_FromDouble(d);
4842}
4843
4844static PyObject *
4845test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4846{
4847    PyObject *obj;
4848    int round;
4849    if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
4850        return NULL;
4851    }
4852    if (check_time_rounding(round) < 0) {
4853        return NULL;
4854    }
4855    _PyTime_t t;
4856    if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
4857        return NULL;
4858    }
4859    struct timeval tv;
4860    if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4861        return NULL;
4862    }
4863
4864    PyObject *seconds = PyLong_FromLongLong(tv.tv_sec);
4865    if (seconds == NULL) {
4866        return NULL;
4867    }
4868    return Py_BuildValue("Nl", seconds, (long)tv.tv_usec);
4869}
4870
4871static PyObject *
4872test_PyTime_AsTimeval_clamp(PyObject *self, PyObject *args)
4873{
4874    PyObject *obj;
4875    int round;
4876    if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
4877        return NULL;
4878    }
4879    if (check_time_rounding(round) < 0) {
4880        return NULL;
4881    }
4882    _PyTime_t t;
4883    if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
4884        return NULL;
4885    }
4886    struct timeval tv;
4887    _PyTime_AsTimeval_clamp(t, &tv, round);
4888
4889    PyObject *seconds = PyLong_FromLongLong(tv.tv_sec);
4890    if (seconds == NULL) {
4891        return NULL;
4892    }
4893    return Py_BuildValue("Nl", seconds, (long)tv.tv_usec);
4894}
4895
4896#ifdef HAVE_CLOCK_GETTIME
4897static PyObject *
4898test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4899{
4900    PyObject *obj;
4901    if (!PyArg_ParseTuple(args, "O", &obj)) {
4902        return NULL;
4903    }
4904    _PyTime_t t;
4905    if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
4906        return NULL;
4907    }
4908    struct timespec ts;
4909    if (_PyTime_AsTimespec(t, &ts) == -1) {
4910        return NULL;
4911    }
4912    return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4913}
4914
4915static PyObject *
4916test_PyTime_AsTimespec_clamp(PyObject *self, PyObject *args)
4917{
4918    PyObject *obj;
4919    if (!PyArg_ParseTuple(args, "O", &obj)) {
4920        return NULL;
4921    }
4922    _PyTime_t t;
4923    if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
4924        return NULL;
4925    }
4926    struct timespec ts;
4927    _PyTime_AsTimespec_clamp(t, &ts);
4928    return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4929}
4930#endif
4931
4932static PyObject *
4933test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4934{
4935    PyObject *obj;
4936    int round;
4937    if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
4938        return NULL;
4939    }
4940    _PyTime_t t;
4941    if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
4942        return NULL;
4943    }
4944    if (check_time_rounding(round) < 0) {
4945        return NULL;
4946    }
4947    _PyTime_t ms = _PyTime_AsMilliseconds(t, round);
4948    _PyTime_t ns = _PyTime_FromNanoseconds(ms);
4949    return _PyTime_AsNanosecondsObject(ns);
4950}
4951
4952static PyObject *
4953test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4954{
4955    PyObject *obj;
4956    int round;
4957    if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
4958        return NULL;
4959    }
4960    _PyTime_t t;
4961    if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
4962        return NULL;
4963    }
4964    if (check_time_rounding(round) < 0) {
4965        return NULL;
4966    }
4967    _PyTime_t us = _PyTime_AsMicroseconds(t, round);
4968    _PyTime_t ns = _PyTime_FromNanoseconds(us);
4969    return _PyTime_AsNanosecondsObject(ns);
4970}
4971
4972static PyObject*
4973pymem_buffer_overflow(PyObject *self, PyObject *args)
4974{
4975    char *buffer;
4976
4977    /* Deliberate buffer overflow to check that PyMem_Free() detects
4978       the overflow when debug hooks are installed. */
4979    buffer = PyMem_Malloc(16);
4980    if (buffer == NULL) {
4981        PyErr_NoMemory();
4982        return NULL;
4983    }
4984    buffer[16] = 'x';
4985    PyMem_Free(buffer);
4986
4987    Py_RETURN_NONE;
4988}
4989
4990static PyObject*
4991pymem_api_misuse(PyObject *self, PyObject *args)
4992{
4993    char *buffer;
4994
4995    /* Deliberate misusage of Python allocators:
4996       allococate with PyMem but release with PyMem_Raw. */
4997    buffer = PyMem_Malloc(16);
4998    PyMem_RawFree(buffer);
4999
5000    Py_RETURN_NONE;
5001}
5002
5003static PyObject*
5004pymem_malloc_without_gil(PyObject *self, PyObject *args)
5005{
5006    char *buffer;
5007
5008    /* Deliberate bug to test debug hooks on Python memory allocators:
5009       call PyMem_Malloc() without holding the GIL */
5010    Py_BEGIN_ALLOW_THREADS
5011    buffer = PyMem_Malloc(10);
5012    Py_END_ALLOW_THREADS
5013
5014    PyMem_Free(buffer);
5015
5016    Py_RETURN_NONE;
5017}
5018
5019
5020static PyObject*
5021test_pymem_getallocatorsname(PyObject *self, PyObject *args)
5022{
5023    const char *name = _PyMem_GetCurrentAllocatorName();
5024    if (name == NULL) {
5025        PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
5026        return NULL;
5027    }
5028    return PyUnicode_FromString(name);
5029}
5030
5031
5032static PyObject*
5033test_pyobject_is_freed(const char *test_name, PyObject *op)
5034{
5035    if (!_PyObject_IsFreed(op)) {
5036        return raiseTestError(test_name, "object is not seen as freed");
5037    }
5038    Py_RETURN_NONE;
5039}
5040
5041
5042static PyObject*
5043check_pyobject_null_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
5044{
5045    PyObject *op = NULL;
5046    return test_pyobject_is_freed("check_pyobject_null_is_freed", op);
5047}
5048
5049
5050static PyObject*
5051check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
5052{
5053    PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
5054    if (op == NULL) {
5055        return NULL;
5056    }
5057    /* Initialize reference count to avoid early crash in ceval or GC */
5058    Py_SET_REFCNT(op, 1);
5059    /* object fields like ob_type are uninitialized! */
5060    return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
5061}
5062
5063
5064static PyObject*
5065check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
5066{
5067    /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
5068    PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
5069    if (op == NULL) {
5070        return NULL;
5071    }
5072    /* Initialize reference count to avoid early crash in ceval or GC */
5073    Py_SET_REFCNT(op, 1);
5074    /* ob_type field is after the memory block: part of "forbidden bytes"
5075       when using debug hooks on memory allocators! */
5076    return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
5077}
5078
5079
5080static PyObject*
5081check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
5082{
5083    /* This test would fail if run with the address sanitizer */
5084#ifdef _Py_ADDRESS_SANITIZER
5085    Py_RETURN_NONE;
5086#else
5087    PyObject *op = PyObject_CallNoArgs((PyObject *)&PyBaseObject_Type);
5088    if (op == NULL) {
5089        return NULL;
5090    }
5091    Py_TYPE(op)->tp_dealloc(op);
5092    /* Reset reference count to avoid early crash in ceval or GC */
5093    Py_SET_REFCNT(op, 1);
5094    /* object memory is freed! */
5095    return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
5096#endif
5097}
5098
5099
5100static PyObject*
5101pyobject_malloc_without_gil(PyObject *self, PyObject *args)
5102{
5103    char *buffer;
5104
5105    /* Deliberate bug to test debug hooks on Python memory allocators:
5106       call PyObject_Malloc() without holding the GIL */
5107    Py_BEGIN_ALLOW_THREADS
5108    buffer = PyObject_Malloc(10);
5109    Py_END_ALLOW_THREADS
5110
5111    PyObject_Free(buffer);
5112
5113    Py_RETURN_NONE;
5114}
5115
5116static PyObject *
5117tracemalloc_track(PyObject *self, PyObject *args)
5118{
5119    unsigned int domain;
5120    PyObject *ptr_obj;
5121    void *ptr;
5122    Py_ssize_t size;
5123    int release_gil = 0;
5124    int res;
5125
5126    if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
5127        return NULL;
5128    ptr = PyLong_AsVoidPtr(ptr_obj);
5129    if (PyErr_Occurred())
5130        return NULL;
5131
5132    if (release_gil) {
5133        Py_BEGIN_ALLOW_THREADS
5134        res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
5135        Py_END_ALLOW_THREADS
5136    }
5137    else {
5138        res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
5139    }
5140
5141    if (res < 0) {
5142        PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
5143        return NULL;
5144    }
5145
5146    Py_RETURN_NONE;
5147}
5148
5149static PyObject *
5150tracemalloc_untrack(PyObject *self, PyObject *args)
5151{
5152    unsigned int domain;
5153    PyObject *ptr_obj;
5154    void *ptr;
5155    int res;
5156
5157    if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
5158        return NULL;
5159    ptr = PyLong_AsVoidPtr(ptr_obj);
5160    if (PyErr_Occurred())
5161        return NULL;
5162
5163    res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
5164    if (res < 0) {
5165        PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
5166        return NULL;
5167    }
5168
5169    Py_RETURN_NONE;
5170}
5171
5172static PyObject *
5173tracemalloc_get_traceback(PyObject *self, PyObject *args)
5174{
5175    unsigned int domain;
5176    PyObject *ptr_obj;
5177    void *ptr;
5178
5179    if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
5180        return NULL;
5181    ptr = PyLong_AsVoidPtr(ptr_obj);
5182    if (PyErr_Occurred())
5183        return NULL;
5184
5185    return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
5186}
5187
5188static PyObject *
5189dict_get_version(PyObject *self, PyObject *args)
5190{
5191    PyDictObject *dict;
5192    uint64_t version;
5193
5194    if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
5195        return NULL;
5196
5197    version = dict->ma_version_tag;
5198
5199    static_assert(sizeof(unsigned long long) >= sizeof(version),
5200                  "version is larger than unsigned long long");
5201    return PyLong_FromUnsignedLongLong((unsigned long long)version);
5202}
5203
5204
5205static PyObject *
5206raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
5207{
5208    _Py_IDENTIFIER(send);
5209    PyGenObject *gen;
5210
5211    if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
5212        return NULL;
5213
5214    /* This is used in a test to check what happens if a signal arrives just
5215       as we're in the process of entering a yield from chain (see
5216       bpo-30039).
5217
5218       Needs to be done in C, because:
5219       - we don't have a Python wrapper for raise()
5220       - we need to make sure that the Python-level signal handler doesn't run
5221         *before* we enter the generator frame, which is impossible in Python
5222         because we check for signals before every bytecode operation.
5223     */
5224    raise(SIGINT);
5225    return _PyObject_CallMethodIdOneArg((PyObject *)gen, &PyId_send, Py_None);
5226}
5227
5228
5229static int
5230fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
5231{
5232    if (args == Py_None) {
5233        *stack = NULL;
5234        *nargs = 0;
5235    }
5236    else if (PyTuple_Check(args)) {
5237        *stack = ((PyTupleObject *)args)->ob_item;
5238        *nargs = PyTuple_GET_SIZE(args);
5239    }
5240    else {
5241        PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
5242        return -1;
5243    }
5244    return 0;
5245}
5246
5247
5248static PyObject *
5249test_pyobject_fastcall(PyObject *self, PyObject *args)
5250{
5251    PyObject *func, *func_args;
5252    PyObject **stack;
5253    Py_ssize_t nargs;
5254
5255    if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
5256        return NULL;
5257    }
5258
5259    if (fastcall_args(func_args, &stack, &nargs) < 0) {
5260        return NULL;
5261    }
5262    return _PyObject_FastCall(func, stack, nargs);
5263}
5264
5265
5266static PyObject *
5267test_pyobject_fastcalldict(PyObject *self, PyObject *args)
5268{
5269    PyObject *func, *func_args, *kwargs;
5270    PyObject **stack;
5271    Py_ssize_t nargs;
5272
5273    if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
5274        return NULL;
5275    }
5276
5277    if (fastcall_args(func_args, &stack, &nargs) < 0) {
5278        return NULL;
5279    }
5280
5281    if (kwargs == Py_None) {
5282        kwargs = NULL;
5283    }
5284    else if (!PyDict_Check(kwargs)) {
5285        PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
5286        return NULL;
5287    }
5288
5289    return PyObject_VectorcallDict(func, stack, nargs, kwargs);
5290}
5291
5292
5293static PyObject *
5294test_pyobject_vectorcall(PyObject *self, PyObject *args)
5295{
5296    PyObject *func, *func_args, *kwnames = NULL;
5297    PyObject **stack;
5298    Py_ssize_t nargs, nkw;
5299
5300    if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
5301        return NULL;
5302    }
5303
5304    if (fastcall_args(func_args, &stack, &nargs) < 0) {
5305        return NULL;
5306    }
5307
5308    if (kwnames == Py_None) {
5309        kwnames = NULL;
5310    }
5311    else if (PyTuple_Check(kwnames)) {
5312        nkw = PyTuple_GET_SIZE(kwnames);
5313        if (nargs < nkw) {
5314            PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
5315            return NULL;
5316        }
5317        nargs -= nkw;
5318    }
5319    else {
5320        PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
5321        return NULL;
5322    }
5323    return PyObject_Vectorcall(func, stack, nargs, kwnames);
5324}
5325
5326
5327static PyObject *
5328test_pyvectorcall_call(PyObject *self, PyObject *args)
5329{
5330    PyObject *func;
5331    PyObject *argstuple;
5332    PyObject *kwargs = NULL;
5333
5334    if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
5335        return NULL;
5336    }
5337
5338    if (!PyTuple_Check(argstuple)) {
5339        PyErr_SetString(PyExc_TypeError, "args must be a tuple");
5340        return NULL;
5341    }
5342    if (kwargs != NULL && !PyDict_Check(kwargs)) {
5343        PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
5344        return NULL;
5345    }
5346
5347    return PyVectorcall_Call(func, argstuple, kwargs);
5348}
5349
5350
5351static PyObject*
5352stack_pointer(PyObject *self, PyObject *args)
5353{
5354    int v = 5;
5355    return PyLong_FromVoidPtr(&v);
5356}
5357
5358
5359#ifdef W_STOPCODE
5360static PyObject*
5361py_w_stopcode(PyObject *self, PyObject *args)
5362{
5363    int sig, status;
5364    if (!PyArg_ParseTuple(args, "i", &sig)) {
5365        return NULL;
5366    }
5367    status = W_STOPCODE(sig);
5368    return PyLong_FromLong(status);
5369}
5370#endif
5371
5372
5373static PyObject *
5374get_mapping_keys(PyObject* self, PyObject *obj)
5375{
5376    return PyMapping_Keys(obj);
5377}
5378
5379static PyObject *
5380get_mapping_values(PyObject* self, PyObject *obj)
5381{
5382    return PyMapping_Values(obj);
5383}
5384
5385static PyObject *
5386get_mapping_items(PyObject* self, PyObject *obj)
5387{
5388    return PyMapping_Items(obj);
5389}
5390
5391static PyObject *
5392test_mapping_has_key_string(PyObject *self, PyObject *Py_UNUSED(args))
5393{
5394    PyObject *context = PyDict_New();
5395    PyObject *val = PyLong_FromLong(1);
5396
5397    // Since this uses `const char*` it is easier to test this in C:
5398    PyDict_SetItemString(context, "a", val);
5399    if (!PyMapping_HasKeyString(context, "a")) {
5400        PyErr_SetString(PyExc_RuntimeError,
5401                        "Existing mapping key does not exist");
5402        return NULL;
5403    }
5404    if (PyMapping_HasKeyString(context, "b")) {
5405        PyErr_SetString(PyExc_RuntimeError,
5406                        "Missing mapping key exists");
5407        return NULL;
5408    }
5409
5410    Py_DECREF(val);
5411    Py_DECREF(context);
5412    Py_RETURN_NONE;
5413}
5414
5415static PyObject *
5416mapping_has_key(PyObject* self, PyObject *args)
5417{
5418    PyObject *context, *key;
5419    if (!PyArg_ParseTuple(args, "OO", &context, &key)) {
5420        return NULL;
5421    }
5422    return PyLong_FromLong(PyMapping_HasKey(context, key));
5423}
5424
5425static PyObject *
5426sequence_set_slice(PyObject* self, PyObject *args)
5427{
5428    PyObject *sequence, *obj;
5429    Py_ssize_t i1, i2;
5430    if (!PyArg_ParseTuple(args, "OnnO", &sequence, &i1, &i2, &obj)) {
5431        return NULL;
5432    }
5433
5434    int res = PySequence_SetSlice(sequence, i1, i2, obj);
5435    if (res == -1) {
5436        return NULL;
5437    }
5438    Py_RETURN_NONE;
5439}
5440
5441static PyObject *
5442sequence_del_slice(PyObject* self, PyObject *args)
5443{
5444    PyObject *sequence;
5445    Py_ssize_t i1, i2;
5446    if (!PyArg_ParseTuple(args, "Onn", &sequence, &i1, &i2)) {
5447        return NULL;
5448    }
5449
5450    int res = PySequence_DelSlice(sequence, i1, i2);
5451    if (res == -1) {
5452        return NULL;
5453    }
5454    Py_RETURN_NONE;
5455}
5456
5457static PyObject *
5458test_pythread_tss_key_state(PyObject *self, PyObject *args)
5459{
5460    Py_tss_t tss_key = Py_tss_NEEDS_INIT;
5461    if (PyThread_tss_is_created(&tss_key)) {
5462        return raiseTestError("test_pythread_tss_key_state",
5463                              "TSS key not in an uninitialized state at "
5464                              "creation time");
5465    }
5466    if (PyThread_tss_create(&tss_key) != 0) {
5467        PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
5468        return NULL;
5469    }
5470    if (!PyThread_tss_is_created(&tss_key)) {
5471        return raiseTestError("test_pythread_tss_key_state",
5472                              "PyThread_tss_create succeeded, "
5473                              "but with TSS key in an uninitialized state");
5474    }
5475    if (PyThread_tss_create(&tss_key) != 0) {
5476        return raiseTestError("test_pythread_tss_key_state",
5477                              "PyThread_tss_create unsuccessful with "
5478                              "an already initialized key");
5479    }
5480#define CHECK_TSS_API(expr) \
5481        (void)(expr); \
5482        if (!PyThread_tss_is_created(&tss_key)) { \
5483            return raiseTestError("test_pythread_tss_key_state", \
5484                                  "TSS key initialization state was not " \
5485                                  "preserved after calling " #expr); }
5486    CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
5487    CHECK_TSS_API(PyThread_tss_get(&tss_key));
5488#undef CHECK_TSS_API
5489    PyThread_tss_delete(&tss_key);
5490    if (PyThread_tss_is_created(&tss_key)) {
5491        return raiseTestError("test_pythread_tss_key_state",
5492                              "PyThread_tss_delete called, but did not "
5493                              "set the key state to uninitialized");
5494    }
5495
5496    Py_tss_t *ptr_key = PyThread_tss_alloc();
5497    if (ptr_key == NULL) {
5498        PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
5499        return NULL;
5500    }
5501    if (PyThread_tss_is_created(ptr_key)) {
5502        return raiseTestError("test_pythread_tss_key_state",
5503                              "TSS key not in an uninitialized state at "
5504                              "allocation time");
5505    }
5506    PyThread_tss_free(ptr_key);
5507    ptr_key = NULL;
5508    Py_RETURN_NONE;
5509}
5510
5511
5512static PyObject*
5513new_hamt(PyObject *self, PyObject *args)
5514{
5515    return _PyContext_NewHamtForTests();
5516}
5517
5518
5519/* def bad_get(self, obj, cls):
5520       cls()
5521       return repr(self)
5522*/
5523static PyObject*
5524bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5525{
5526    PyObject *self, *obj, *cls;
5527    if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
5528        return NULL;
5529    }
5530
5531    PyObject *res = PyObject_CallNoArgs(cls);
5532    if (res == NULL) {
5533        return NULL;
5534    }
5535    Py_DECREF(res);
5536
5537    return PyObject_Repr(self);
5538}
5539
5540
5541#ifdef Py_REF_DEBUG
5542static PyObject *
5543negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5544{
5545    PyObject *obj = PyUnicode_FromString("negative_refcount");
5546    if (obj == NULL) {
5547        return NULL;
5548    }
5549    assert(Py_REFCNT(obj) == 1);
5550
5551    Py_SET_REFCNT(obj,  0);
5552    /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5553    Py_DECREF(obj);
5554
5555    Py_RETURN_NONE;
5556}
5557#endif
5558
5559
5560static PyObject*
5561test_write_unraisable_exc(PyObject *self, PyObject *args)
5562{
5563    PyObject *exc, *err_msg, *obj;
5564    if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
5565        return NULL;
5566    }
5567
5568    const char *err_msg_utf8;
5569    if (err_msg != Py_None) {
5570        err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5571        if (err_msg_utf8 == NULL) {
5572            return NULL;
5573        }
5574    }
5575    else {
5576        err_msg_utf8 = NULL;
5577    }
5578
5579    PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
5580    _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
5581    Py_RETURN_NONE;
5582}
5583
5584
5585static PyObject *
5586sequence_getitem(PyObject *self, PyObject *args)
5587{
5588    PyObject *seq;
5589    Py_ssize_t i;
5590    if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
5591        return NULL;
5592    }
5593    return PySequence_GetItem(seq, i);
5594}
5595
5596
5597static PyObject *
5598sequence_setitem(PyObject *self, PyObject *args)
5599{
5600    Py_ssize_t i;
5601    PyObject *seq, *val;
5602    if (!PyArg_ParseTuple(args, "OnO", &seq, &i, &val)) {
5603        return NULL;
5604    }
5605    if (PySequence_SetItem(seq, i, val)) {
5606        return NULL;
5607    }
5608    Py_RETURN_NONE;
5609}
5610
5611
5612/* Functions for testing C calling conventions (METH_*) are named meth_*,
5613 * e.g. "meth_varargs" for METH_VARARGS.
5614 *
5615 * They all return a tuple of their C-level arguments, with None instead
5616 * of NULL and Python tuples instead of C arrays.
5617 */
5618
5619
5620static PyObject*
5621_null_to_none(PyObject* obj)
5622{
5623    if (obj == NULL) {
5624        Py_RETURN_NONE;
5625    }
5626    Py_INCREF(obj);
5627    return obj;
5628}
5629
5630static PyObject*
5631meth_varargs(PyObject* self, PyObject* args)
5632{
5633    return Py_BuildValue("NO", _null_to_none(self), args);
5634}
5635
5636static PyObject*
5637meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs)
5638{
5639    return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs));
5640}
5641
5642static PyObject*
5643meth_o(PyObject* self, PyObject* obj)
5644{
5645    return Py_BuildValue("NO", _null_to_none(self), obj);
5646}
5647
5648static PyObject*
5649meth_noargs(PyObject* self, PyObject* ignored)
5650{
5651    return _null_to_none(self);
5652}
5653
5654static PyObject*
5655_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs)
5656{
5657    PyObject *tuple = PyTuple_New(nargs);
5658    if (tuple == NULL) {
5659        return NULL;
5660    }
5661    for (Py_ssize_t i=0; i < nargs; i++) {
5662        Py_INCREF(args[i]);
5663        PyTuple_SET_ITEM(tuple, i, args[i]);
5664    }
5665    return tuple;
5666}
5667
5668static PyObject*
5669meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
5670{
5671    return Py_BuildValue(
5672        "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs)
5673    );
5674}
5675
5676static PyObject*
5677meth_fastcall_keywords(PyObject* self, PyObject* const* args,
5678                       Py_ssize_t nargs, PyObject* kwargs)
5679{
5680    PyObject *pyargs = _fastcall_to_tuple(args, nargs);
5681    if (pyargs == NULL) {
5682        return NULL;
5683    }
5684    assert(args != NULL || nargs == 0);
5685    PyObject* const* args_offset = args == NULL ? NULL : args + nargs;
5686    PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type,
5687                                              args_offset, 0, kwargs);
5688    return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
5689}
5690
5691
5692static PyObject*
5693pynumber_tobase(PyObject *module, PyObject *args)
5694{
5695    PyObject *obj;
5696    int base;
5697    if (!PyArg_ParseTuple(args, "Oi:pynumber_tobase",
5698                          &obj, &base)) {
5699        return NULL;
5700    }
5701    return PyNumber_ToBase(obj, base);
5702}
5703
5704
5705static PyObject*
5706test_set_type_size(PyObject *self, PyObject *Py_UNUSED(ignored))
5707{
5708    PyObject *obj = PyList_New(0);
5709    if (obj == NULL) {
5710        return NULL;
5711    }
5712
5713    // Ensure that following tests don't modify the object,
5714    // to ensure that Py_DECREF() will not crash.
5715    assert(Py_TYPE(obj) == &PyList_Type);
5716    assert(Py_SIZE(obj) == 0);
5717
5718    // bpo-39573: Test Py_SET_TYPE() and Py_SET_SIZE() functions.
5719    Py_SET_TYPE(obj, &PyList_Type);
5720    Py_SET_SIZE(obj, 0);
5721
5722    Py_DECREF(obj);
5723    Py_RETURN_NONE;
5724}
5725
5726
5727#define TEST_REFCOUNT() \
5728    do { \
5729        PyObject *obj = PyList_New(0); \
5730        if (obj == NULL) { \
5731            return NULL; \
5732        } \
5733        assert(Py_REFCNT(obj) == 1); \
5734        \
5735        /* test Py_NewRef() */ \
5736        PyObject *ref = Py_NewRef(obj); \
5737        assert(ref == obj); \
5738        assert(Py_REFCNT(obj) == 2); \
5739        Py_DECREF(ref); \
5740        \
5741        /* test Py_XNewRef() */ \
5742        PyObject *xref = Py_XNewRef(obj); \
5743        assert(xref == obj); \
5744        assert(Py_REFCNT(obj) == 2); \
5745        Py_DECREF(xref); \
5746        \
5747        assert(Py_XNewRef(NULL) == NULL); \
5748        \
5749        Py_DECREF(obj); \
5750        Py_RETURN_NONE; \
5751    } while (0) \
5752
5753
5754// Test Py_NewRef() and Py_XNewRef() macros
5755static PyObject*
5756test_refcount_macros(PyObject *self, PyObject *Py_UNUSED(ignored))
5757{
5758    TEST_REFCOUNT();
5759}
5760
5761#undef Py_NewRef
5762#undef Py_XNewRef
5763
5764// Test Py_NewRef() and Py_XNewRef() functions, after undefining macros.
5765static PyObject*
5766test_refcount_funcs(PyObject *self, PyObject *Py_UNUSED(ignored))
5767{
5768    TEST_REFCOUNT();
5769}
5770
5771
5772// Test Py_Is() function
5773#define TEST_PY_IS() \
5774    do { \
5775        PyObject *o_none = Py_None; \
5776        PyObject *o_true = Py_True; \
5777        PyObject *o_false = Py_False; \
5778        PyObject *obj = PyList_New(0); \
5779        if (obj == NULL) { \
5780            return NULL; \
5781        } \
5782        \
5783        /* test Py_Is() */ \
5784        assert(Py_Is(obj, obj)); \
5785        assert(!Py_Is(obj, o_none)); \
5786        \
5787        /* test Py_None */ \
5788        assert(Py_Is(o_none, o_none)); \
5789        assert(!Py_Is(obj, o_none)); \
5790        \
5791        /* test Py_True */ \
5792        assert(Py_Is(o_true, o_true)); \
5793        assert(!Py_Is(o_false, o_true)); \
5794        assert(!Py_Is(obj, o_true)); \
5795        \
5796        /* test Py_False */ \
5797        assert(Py_Is(o_false, o_false)); \
5798        assert(!Py_Is(o_true, o_false)); \
5799        assert(!Py_Is(obj, o_false)); \
5800        \
5801        Py_DECREF(obj); \
5802        Py_RETURN_NONE; \
5803    } while (0)
5804
5805// Test Py_Is() macro
5806static PyObject*
5807test_py_is_macros(PyObject *self, PyObject *Py_UNUSED(ignored))
5808{
5809    TEST_PY_IS();
5810}
5811
5812#undef Py_Is
5813
5814// Test Py_Is() function, after undefining its macro.
5815static PyObject*
5816test_py_is_funcs(PyObject *self, PyObject *Py_UNUSED(ignored))
5817{
5818    TEST_PY_IS();
5819}
5820
5821
5822static PyObject *
5823test_fatal_error(PyObject *self, PyObject *args)
5824{
5825    char *message;
5826    int release_gil = 0;
5827    if (!PyArg_ParseTuple(args, "y|i:fatal_error", &message, &release_gil))
5828        return NULL;
5829    if (release_gil) {
5830        Py_BEGIN_ALLOW_THREADS
5831        Py_FatalError(message);
5832        Py_END_ALLOW_THREADS
5833    }
5834    else {
5835        Py_FatalError(message);
5836    }
5837    // Py_FatalError() does not return, but exits the process.
5838    Py_RETURN_NONE;
5839}
5840
5841// type->tp_version_tag
5842static PyObject *
5843type_get_version(PyObject *self, PyObject *type)
5844{
5845    if (!PyType_Check(type)) {
5846        PyErr_SetString(PyExc_TypeError, "argument must be a type");
5847        return NULL;
5848    }
5849    PyObject *res = PyLong_FromUnsignedLong(
5850        ((PyTypeObject *)type)->tp_version_tag);
5851    if (res == NULL) {
5852        assert(PyErr_Occurred());
5853        return NULL;
5854    }
5855    return res;
5856}
5857
5858
5859// Test PyThreadState C API
5860static PyObject *
5861test_tstate_capi(PyObject *self, PyObject *Py_UNUSED(args))
5862{
5863    // PyThreadState_Get()
5864    PyThreadState *tstate = PyThreadState_Get();
5865    assert(tstate != NULL);
5866
5867    // PyThreadState_GET()
5868    PyThreadState *tstate2 = PyThreadState_Get();
5869    assert(tstate2 == tstate);
5870
5871    // private _PyThreadState_UncheckedGet()
5872    PyThreadState *tstate3 = _PyThreadState_UncheckedGet();
5873    assert(tstate3 == tstate);
5874
5875    // PyThreadState_EnterTracing(), PyThreadState_LeaveTracing()
5876    PyThreadState_EnterTracing(tstate);
5877    PyThreadState_LeaveTracing(tstate);
5878
5879    // PyThreadState_GetDict(): no tstate argument
5880    PyObject *dict = PyThreadState_GetDict();
5881    // PyThreadState_GetDict() API can return NULL if PyDict_New() fails,
5882    // but it should not occur in practice.
5883    assert(dict != NULL);
5884    assert(PyDict_Check(dict));
5885    // dict is a borrowed reference
5886
5887    // private _PyThreadState_GetDict()
5888    PyObject *dict2 = _PyThreadState_GetDict(tstate);
5889    assert(dict2 == dict);
5890    // dict2 is a borrowed reference
5891
5892    // PyThreadState_GetInterpreter()
5893    PyInterpreterState *interp = PyThreadState_GetInterpreter(tstate);
5894    assert(interp != NULL);
5895
5896    // PyThreadState_GetFrame()
5897    PyFrameObject*frame = PyThreadState_GetFrame(tstate);
5898    assert(frame != NULL);
5899    assert(PyFrame_Check(frame));
5900    Py_DECREF(frame);
5901
5902    // PyThreadState_GetID()
5903    uint64_t id = PyThreadState_GetID(tstate);
5904    assert(id >= 1);
5905
5906    Py_RETURN_NONE;
5907}
5908
5909
5910// Test PyFloat_Pack2(), PyFloat_Pack4() and PyFloat_Pack8()
5911static PyObject *
5912test_float_pack(PyObject *self, PyObject *args)
5913{
5914    int size;
5915    double d;
5916    int le;
5917    if (!PyArg_ParseTuple(args, "idi", &size, &d, &le)) {
5918        return NULL;
5919    }
5920    switch (size)
5921    {
5922    case 2:
5923    {
5924        char data[2];
5925        if (PyFloat_Pack2(d, data, le) < 0) {
5926            return NULL;
5927        }
5928        return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
5929    }
5930    case 4:
5931    {
5932        char data[4];
5933        if (PyFloat_Pack4(d, data, le) < 0) {
5934            return NULL;
5935        }
5936        return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
5937    }
5938    case 8:
5939    {
5940        char data[8];
5941        if (PyFloat_Pack8(d, data, le) < 0) {
5942            return NULL;
5943        }
5944        return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
5945    }
5946    default: break;
5947    }
5948
5949    PyErr_SetString(PyExc_ValueError, "size must 2, 4 or 8");
5950    return NULL;
5951}
5952
5953
5954// Test PyFloat_Unpack2(), PyFloat_Unpack4() and PyFloat_Unpack8()
5955static PyObject *
5956test_float_unpack(PyObject *self, PyObject *args)
5957{
5958    assert(!PyErr_Occurred());
5959    const char *data;
5960    Py_ssize_t size;
5961    int le;
5962    if (!PyArg_ParseTuple(args, "y#i", &data, &size, &le)) {
5963        return NULL;
5964    }
5965    double d;
5966    switch (size)
5967    {
5968    case 2:
5969        d = PyFloat_Unpack2(data, le);
5970        break;
5971    case 4:
5972        d = PyFloat_Unpack4(data, le);
5973        break;
5974    case 8:
5975        d = PyFloat_Unpack8(data, le);
5976        break;
5977    default:
5978        PyErr_SetString(PyExc_ValueError, "data length must 2, 4 or 8 bytes");
5979        return NULL;
5980    }
5981
5982    if (d == -1.0 && PyErr_Occurred()) {
5983        return NULL;
5984    }
5985    return PyFloat_FromDouble(d);
5986}
5987
5988static PyObject *
5989frame_getlocals(PyObject *self, PyObject *frame)
5990{
5991    if (!PyFrame_Check(frame)) {
5992        PyErr_SetString(PyExc_TypeError, "argument must be a frame");
5993        return NULL;
5994    }
5995    return PyFrame_GetLocals((PyFrameObject *)frame);
5996}
5997
5998static PyObject *
5999frame_getglobals(PyObject *self, PyObject *frame)
6000{
6001    if (!PyFrame_Check(frame)) {
6002        PyErr_SetString(PyExc_TypeError, "argument must be a frame");
6003        return NULL;
6004    }
6005    return PyFrame_GetGlobals((PyFrameObject *)frame);
6006}
6007
6008static PyObject *
6009frame_getgenerator(PyObject *self, PyObject *frame)
6010{
6011    if (!PyFrame_Check(frame)) {
6012        PyErr_SetString(PyExc_TypeError, "argument must be a frame");
6013        return NULL;
6014    }
6015    return PyFrame_GetGenerator((PyFrameObject *)frame);
6016}
6017
6018static PyObject *
6019frame_getbuiltins(PyObject *self, PyObject *frame)
6020{
6021    if (!PyFrame_Check(frame)) {
6022        PyErr_SetString(PyExc_TypeError, "argument must be a frame");
6023        return NULL;
6024    }
6025    return PyFrame_GetBuiltins((PyFrameObject *)frame);
6026}
6027
6028static PyObject *
6029frame_getlasti(PyObject *self, PyObject *frame)
6030{
6031    if (!PyFrame_Check(frame)) {
6032        PyErr_SetString(PyExc_TypeError, "argument must be a frame");
6033        return NULL;
6034    }
6035    int lasti = PyFrame_GetLasti((PyFrameObject *)frame);
6036    if (lasti < 0) {
6037        assert(lasti == -1);
6038        Py_RETURN_NONE;
6039    }
6040    return PyLong_FromLong(lasti);
6041}
6042
6043static PyObject *
6044frame_new(PyObject *self, PyObject *args)
6045{
6046    PyObject *code, *globals, *locals;
6047    if (!PyArg_ParseTuple(args, "OOO", &code, &globals, &locals)) {
6048        return NULL;
6049    }
6050    if (!PyCode_Check(code)) {
6051        PyErr_SetString(PyExc_TypeError, "argument must be a code object");
6052        return NULL;
6053    }
6054    PyThreadState *tstate = PyThreadState_Get();
6055
6056    return (PyObject *)PyFrame_New(tstate, (PyCodeObject *)code, globals, locals);
6057}
6058
6059static PyObject *
6060eval_get_func_name(PyObject *self, PyObject *func)
6061{
6062    return PyUnicode_FromString(PyEval_GetFuncName(func));
6063}
6064
6065static PyObject *
6066eval_get_func_desc(PyObject *self, PyObject *func)
6067{
6068    return PyUnicode_FromString(PyEval_GetFuncDesc(func));
6069}
6070
6071static PyObject *
6072eval_eval_code_ex(PyObject *mod, PyObject *pos_args)
6073{
6074    PyObject *result = NULL;
6075    PyObject *code;
6076    PyObject *globals;
6077    PyObject *locals = NULL;
6078    PyObject *args = NULL;
6079    PyObject *kwargs = NULL;
6080    PyObject *defaults = NULL;
6081    PyObject *kw_defaults = NULL;
6082    PyObject *closure = NULL;
6083
6084    PyObject **c_kwargs = NULL;
6085
6086    if (!PyArg_UnpackTuple(pos_args,
6087                           "eval_code_ex",
6088                           2,
6089                           8,
6090                           &code,
6091                           &globals,
6092                           &locals,
6093                           &args,
6094                           &kwargs,
6095                           &defaults,
6096                           &kw_defaults,
6097                           &closure))
6098    {
6099        goto exit;
6100    }
6101
6102    if (!PyCode_Check(code)) {
6103        PyErr_SetString(PyExc_TypeError,
6104                        "code must be a Python code object");
6105        goto exit;
6106    }
6107
6108    if (!PyDict_Check(globals)) {
6109        PyErr_SetString(PyExc_TypeError, "globals must be a dict");
6110        goto exit;
6111    }
6112
6113    if (locals && !PyMapping_Check(locals)) {
6114        PyErr_SetString(PyExc_TypeError, "locals must be a mapping");
6115        goto exit;
6116    }
6117    if (locals == Py_None) {
6118        locals = NULL;
6119    }
6120
6121    PyObject **c_args = NULL;
6122    Py_ssize_t c_args_len = 0;
6123
6124    if (args)
6125    {
6126        if (!PyTuple_Check(args)) {
6127            PyErr_SetString(PyExc_TypeError, "args must be a tuple");
6128            goto exit;
6129        } else {
6130            c_args = &PyTuple_GET_ITEM(args, 0);
6131            c_args_len = PyTuple_Size(args);
6132        }
6133    }
6134
6135    Py_ssize_t c_kwargs_len = 0;
6136
6137    if (kwargs)
6138    {
6139        if (!PyDict_Check(kwargs)) {
6140            PyErr_SetString(PyExc_TypeError, "keywords must be a dict");
6141            goto exit;
6142        } else {
6143            c_kwargs_len = PyDict_Size(kwargs);
6144            if (c_kwargs_len > 0) {
6145                c_kwargs = PyMem_NEW(PyObject*, 2 * c_kwargs_len);
6146                if (!c_kwargs) {
6147                    PyErr_NoMemory();
6148                    goto exit;
6149                }
6150
6151                Py_ssize_t i = 0;
6152                Py_ssize_t pos = 0;
6153
6154                while (PyDict_Next(kwargs,
6155                                   &pos,
6156                                   &c_kwargs[i],
6157                                   &c_kwargs[i + 1]))
6158                {
6159                    i += 2;
6160                }
6161                c_kwargs_len = i / 2;
6162                /* XXX This is broken if the caller deletes dict items! */
6163            }
6164        }
6165    }
6166
6167
6168    PyObject **c_defaults = NULL;
6169    Py_ssize_t c_defaults_len = 0;
6170
6171    if (defaults && PyTuple_Check(defaults)) {
6172        c_defaults = &PyTuple_GET_ITEM(defaults, 0);
6173        c_defaults_len = PyTuple_Size(defaults);
6174    }
6175
6176    if (kw_defaults && !PyDict_Check(kw_defaults)) {
6177        PyErr_SetString(PyExc_TypeError, "kw_defaults must be a dict");
6178        goto exit;
6179    }
6180
6181    if (closure && !PyTuple_Check(closure)) {
6182        PyErr_SetString(PyExc_TypeError, "closure must be a tuple of cells");
6183        goto exit;
6184    }
6185
6186
6187    result = PyEval_EvalCodeEx(
6188        code,
6189        globals,
6190        locals,
6191        c_args,
6192        (int)c_args_len,
6193        c_kwargs,
6194        (int)c_kwargs_len,
6195        c_defaults,
6196        (int)c_defaults_len,
6197        kw_defaults,
6198        closure
6199    );
6200
6201exit:
6202    if (c_kwargs) {
6203        PyMem_DEL(c_kwargs);
6204    }
6205
6206    return result;
6207}
6208
6209static PyObject *
6210get_feature_macros(PyObject *self, PyObject *Py_UNUSED(args))
6211{
6212    PyObject *result = PyDict_New();
6213    if (!result) {
6214        return NULL;
6215    }
6216    int res;
6217#include "_testcapi_feature_macros.inc"
6218    return result;
6219}
6220
6221static PyObject *
6222test_code_api(PyObject *self, PyObject *Py_UNUSED(args))
6223{
6224    PyCodeObject *co = PyCode_NewEmpty("_testcapi", "dummy", 1);
6225    if (co == NULL) {
6226        return NULL;
6227    }
6228    /* co_code */
6229    {
6230        PyObject *co_code = PyCode_GetCode(co);
6231        if (co_code == NULL) {
6232            goto fail;
6233        }
6234        assert(PyBytes_CheckExact(co_code));
6235        if (PyObject_Length(co_code) == 0) {
6236            PyErr_SetString(PyExc_ValueError, "empty co_code");
6237            Py_DECREF(co_code);
6238            goto fail;
6239        }
6240        Py_DECREF(co_code);
6241    }
6242    /* co_varnames */
6243    {
6244        PyObject *co_varnames = PyCode_GetVarnames(co);
6245        if (co_varnames == NULL) {
6246            goto fail;
6247        }
6248        if (!PyTuple_CheckExact(co_varnames)) {
6249            PyErr_SetString(PyExc_TypeError, "co_varnames not tuple");
6250            Py_DECREF(co_varnames);
6251            goto fail;
6252        }
6253        if (PyTuple_GET_SIZE(co_varnames) != 0) {
6254            PyErr_SetString(PyExc_ValueError, "non-empty co_varnames");
6255            Py_DECREF(co_varnames);
6256            goto fail;
6257        }
6258        Py_DECREF(co_varnames);
6259    }
6260    /* co_cellvars */
6261    {
6262        PyObject *co_cellvars = PyCode_GetCellvars(co);
6263        if (co_cellvars == NULL) {
6264            goto fail;
6265        }
6266        if (!PyTuple_CheckExact(co_cellvars)) {
6267            PyErr_SetString(PyExc_TypeError, "co_cellvars not tuple");
6268            Py_DECREF(co_cellvars);
6269            goto fail;
6270        }
6271        if (PyTuple_GET_SIZE(co_cellvars) != 0) {
6272            PyErr_SetString(PyExc_ValueError, "non-empty co_cellvars");
6273            Py_DECREF(co_cellvars);
6274            goto fail;
6275        }
6276        Py_DECREF(co_cellvars);
6277    }
6278    /* co_freevars */
6279    {
6280        PyObject *co_freevars = PyCode_GetFreevars(co);
6281        if (co_freevars == NULL) {
6282            goto fail;
6283        }
6284        if (!PyTuple_CheckExact(co_freevars)) {
6285            PyErr_SetString(PyExc_TypeError, "co_freevars not tuple");
6286            Py_DECREF(co_freevars);
6287            goto fail;
6288        }
6289        if (PyTuple_GET_SIZE(co_freevars) != 0) {
6290            PyErr_SetString(PyExc_ValueError, "non-empty co_freevars");
6291            Py_DECREF(co_freevars);
6292            goto fail;
6293        }
6294        Py_DECREF(co_freevars);
6295    }
6296    Py_DECREF(co);
6297    Py_RETURN_NONE;
6298fail:
6299    Py_DECREF(co);
6300    return NULL;
6301}
6302
6303static int
6304record_func(PyObject *obj, PyFrameObject *f, int what, PyObject *arg)
6305{
6306    assert(PyList_Check(obj));
6307    PyObject *what_obj = NULL;
6308    PyObject *line_obj = NULL;
6309    PyObject *tuple = NULL;
6310    int res = -1;
6311    what_obj = PyLong_FromLong(what);
6312    if (what_obj == NULL) {
6313        goto error;
6314    }
6315    int line = PyFrame_GetLineNumber(f);
6316    line_obj = PyLong_FromLong(line);
6317    if (line_obj == NULL) {
6318        goto error;
6319    }
6320    tuple = PyTuple_Pack(3, what_obj, line_obj, arg);
6321    if (tuple == NULL) {
6322        goto error;
6323    }
6324    PyTuple_SET_ITEM(tuple, 0, what_obj);
6325    if (PyList_Append(obj, tuple)) {
6326        goto error;
6327    }
6328    res = 0;
6329error:
6330    Py_XDECREF(what_obj);
6331    Py_XDECREF(line_obj);
6332    Py_XDECREF(tuple);
6333    return res;
6334}
6335
6336static PyObject *
6337settrace_to_record(PyObject *self, PyObject *list)
6338{
6339
6340   if (!PyList_Check(list)) {
6341        PyErr_SetString(PyExc_TypeError, "argument must be a list");
6342        return NULL;
6343    }
6344    PyEval_SetTrace(record_func, list);
6345    Py_RETURN_NONE;
6346}
6347
6348static int
6349error_func(PyObject *obj, PyFrameObject *f, int what, PyObject *arg)
6350{
6351    assert(PyList_Check(obj));
6352    /* Only raise if list is empty, otherwise append None
6353     * This ensures that we only raise once */
6354    if (PyList_GET_SIZE(obj)) {
6355        return 0;
6356    }
6357    if (PyList_Append(obj, Py_None)) {
6358       return -1;
6359    }
6360    PyErr_SetString(PyExc_Exception, "an exception");
6361    return -1;
6362}
6363
6364static PyObject *
6365settrace_to_error(PyObject *self, PyObject *list)
6366{
6367    if (!PyList_Check(list)) {
6368        PyErr_SetString(PyExc_TypeError, "argument must be a list");
6369        return NULL;
6370    }
6371    PyEval_SetTrace(error_func, list);
6372    Py_RETURN_NONE;
6373}
6374
6375static PyObject *negative_dictoffset(PyObject *, PyObject *);
6376
6377static PyObject *
6378function_get_code(PyObject *self, PyObject *func)
6379{
6380    PyObject *code = PyFunction_GetCode(func);
6381    if (code != NULL) {
6382        Py_INCREF(code);
6383        return code;
6384    } else {
6385        return NULL;
6386    }
6387}
6388
6389static PyObject *
6390function_get_globals(PyObject *self, PyObject *func)
6391{
6392    PyObject *globals = PyFunction_GetGlobals(func);
6393    if (globals != NULL) {
6394        Py_INCREF(globals);
6395        return globals;
6396    } else {
6397        return NULL;
6398    }
6399}
6400
6401static PyObject *
6402function_get_module(PyObject *self, PyObject *func)
6403{
6404    PyObject *module = PyFunction_GetModule(func);
6405    if (module != NULL) {
6406        Py_INCREF(module);
6407        return module;
6408    } else {
6409        return NULL;
6410    }
6411}
6412
6413static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
6414static PyObject *getargs_s_hash_int(PyObject *, PyObject *, PyObject*);
6415static PyObject *getargs_s_hash_int2(PyObject *, PyObject *, PyObject*);
6416static PyObject *gh_99240_clear_args(PyObject *, PyObject *);
6417
6418static PyMethodDef TestMethods[] = {
6419    {"exc_set_object",          exc_set_object,                  METH_VARARGS},
6420    {"raise_exception",         raise_exception,                 METH_VARARGS},
6421    {"raise_memoryerror",       raise_memoryerror,               METH_NOARGS},
6422    {"set_errno",               set_errno,                       METH_VARARGS},
6423    {"test_config",             test_config,                     METH_NOARGS},
6424    {"test_sizeof_c_types",     test_sizeof_c_types,             METH_NOARGS},
6425    {"test_datetime_capi",      test_datetime_capi,              METH_NOARGS},
6426    {"datetime_check_date",     datetime_check_date,             METH_VARARGS},
6427    {"datetime_check_time",     datetime_check_time,             METH_VARARGS},
6428    {"datetime_check_datetime",     datetime_check_datetime,     METH_VARARGS},
6429    {"datetime_check_delta",     datetime_check_delta,           METH_VARARGS},
6430    {"datetime_check_tzinfo",     datetime_check_tzinfo,         METH_VARARGS},
6431    {"make_timezones_capi",     make_timezones_capi,             METH_NOARGS},
6432    {"get_timezones_offset_zero",   get_timezones_offset_zero,   METH_NOARGS},
6433    {"get_timezone_utc_capi",    get_timezone_utc_capi,          METH_VARARGS},
6434    {"get_date_fromdate",        get_date_fromdate,              METH_VARARGS},
6435    {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
6436    {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
6437    {"get_time_fromtime",        get_time_fromtime,              METH_VARARGS},
6438    {"get_time_fromtimeandfold", get_time_fromtimeandfold,       METH_VARARGS},
6439    {"get_delta_fromdsu",        get_delta_fromdsu,              METH_VARARGS},
6440    {"get_date_fromtimestamp",   get_date_fromtimestamp,         METH_VARARGS},
6441    {"get_datetime_fromtimestamp", get_datetime_fromtimestamp,   METH_VARARGS},
6442    {"PyDateTime_GET",             test_PyDateTime_GET,           METH_O},
6443    {"PyDateTime_DATE_GET",        test_PyDateTime_DATE_GET,      METH_O},
6444    {"PyDateTime_TIME_GET",        test_PyDateTime_TIME_GET,      METH_O},
6445    {"PyDateTime_DELTA_GET",       test_PyDateTime_DELTA_GET,     METH_O},
6446    {"test_gc_control",         test_gc_control,                 METH_NOARGS},
6447    {"test_list_api",           test_list_api,                   METH_NOARGS},
6448    {"test_dict_iteration",     test_dict_iteration,             METH_NOARGS},
6449    {"dict_getitem_knownhash",  dict_getitem_knownhash,          METH_VARARGS},
6450    {"test_lazy_hash_inheritance",      test_lazy_hash_inheritance,METH_NOARGS},
6451    {"test_long_api",           test_long_api,                   METH_NOARGS},
6452    {"test_xincref_doesnt_leak",test_xincref_doesnt_leak,        METH_NOARGS},
6453    {"test_incref_doesnt_leak", test_incref_doesnt_leak,         METH_NOARGS},
6454    {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak,        METH_NOARGS},
6455    {"test_decref_doesnt_leak", test_decref_doesnt_leak,         METH_NOARGS},
6456    {"test_structseq_newtype_doesnt_leak",
6457        test_structseq_newtype_doesnt_leak, METH_NOARGS},
6458    {"test_structseq_newtype_null_descr_doc",
6459        test_structseq_newtype_null_descr_doc, METH_NOARGS},
6460    {"test_incref_decref_API",  test_incref_decref_API,          METH_NOARGS},
6461    {"test_long_and_overflow",  test_long_and_overflow,          METH_NOARGS},
6462    {"test_long_as_double",     test_long_as_double,             METH_NOARGS},
6463    {"test_long_as_size_t",     test_long_as_size_t,             METH_NOARGS},
6464    {"test_long_as_unsigned_long_long_mask",
6465        test_long_as_unsigned_long_long_mask, METH_NOARGS},
6466    {"test_long_numbits",       test_long_numbits,               METH_NOARGS},
6467    {"test_k_code",             test_k_code,                     METH_NOARGS},
6468    {"test_empty_argparse",     test_empty_argparse,             METH_NOARGS},
6469    {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
6470    {"pyobject_repr_from_null", pyobject_repr_from_null, METH_NOARGS},
6471    {"pyobject_str_from_null",  pyobject_str_from_null, METH_NOARGS},
6472    {"pyobject_bytes_from_null", pyobject_bytes_from_null, METH_NOARGS},
6473    {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
6474    {"test_with_docstring",     test_with_docstring,             METH_NOARGS,
6475     PyDoc_STR("This is a pretty normal docstring.")},
6476    {"test_string_to_double",   test_string_to_double,           METH_NOARGS},
6477    {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
6478     METH_NOARGS},
6479    {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
6480    {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
6481#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
6482    {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
6483#endif
6484    {"getbuffer_with_null_view", getbuffer_with_null_view,       METH_O},
6485    {"PyBuffer_SizeFromFormat",  test_PyBuffer_SizeFromFormat,   METH_VARARGS},
6486    {"test_buildvalue_N",        test_buildvalue_N,              METH_NOARGS},
6487    {"negative_dictoffset",      negative_dictoffset,            METH_NOARGS},
6488    {"test_buildvalue_issue38913", test_buildvalue_issue38913,   METH_NOARGS},
6489    {"get_args",                  get_args,                      METH_VARARGS},
6490    {"test_get_statictype_slots", test_get_statictype_slots,     METH_NOARGS},
6491    {"test_get_type_name",        test_get_type_name,            METH_NOARGS},
6492    {"test_get_type_qualname",    test_get_type_qualname,        METH_NOARGS},
6493    {"test_type_from_ephemeral_spec", test_type_from_ephemeral_spec, METH_NOARGS},
6494    {"get_kwargs", _PyCFunction_CAST(get_kwargs),
6495      METH_VARARGS|METH_KEYWORDS},
6496    {"getargs_tuple",           getargs_tuple,                   METH_VARARGS},
6497    {"getargs_keywords", _PyCFunction_CAST(getargs_keywords),
6498      METH_VARARGS|METH_KEYWORDS},
6499    {"getargs_keyword_only", _PyCFunction_CAST(getargs_keyword_only),
6500      METH_VARARGS|METH_KEYWORDS},
6501    {"getargs_positional_only_and_keywords",
6502      _PyCFunction_CAST(getargs_positional_only_and_keywords),
6503      METH_VARARGS|METH_KEYWORDS},
6504    {"getargs_b",               getargs_b,                       METH_VARARGS},
6505    {"getargs_B",               getargs_B,                       METH_VARARGS},
6506    {"getargs_h",               getargs_h,                       METH_VARARGS},
6507    {"getargs_H",               getargs_H,                       METH_VARARGS},
6508    {"getargs_I",               getargs_I,                       METH_VARARGS},
6509    {"getargs_k",               getargs_k,                       METH_VARARGS},
6510    {"getargs_i",               getargs_i,                       METH_VARARGS},
6511    {"getargs_l",               getargs_l,                       METH_VARARGS},
6512    {"getargs_n",               getargs_n,                       METH_VARARGS},
6513    {"getargs_p",               getargs_p,                       METH_VARARGS},
6514    {"getargs_L",               getargs_L,                       METH_VARARGS},
6515    {"getargs_K",               getargs_K,                       METH_VARARGS},
6516    {"test_longlong_api",       test_longlong_api,               METH_NOARGS},
6517    {"test_long_long_and_overflow",test_long_long_and_overflow,  METH_NOARGS},
6518    {"test_L_code",             test_L_code,                     METH_NOARGS},
6519    {"getargs_f",               getargs_f,                       METH_VARARGS},
6520    {"getargs_d",               getargs_d,                       METH_VARARGS},
6521    {"getargs_D",               getargs_D,                       METH_VARARGS},
6522    {"getargs_S",               getargs_S,                       METH_VARARGS},
6523    {"getargs_Y",               getargs_Y,                       METH_VARARGS},
6524    {"getargs_U",               getargs_U,                       METH_VARARGS},
6525    {"getargs_c",               getargs_c,                       METH_VARARGS},
6526    {"getargs_C",               getargs_C,                       METH_VARARGS},
6527    {"getargs_s",               getargs_s,                       METH_VARARGS},
6528    {"getargs_s_star",          getargs_s_star,                  METH_VARARGS},
6529    {"getargs_s_hash",          getargs_s_hash,                  METH_VARARGS},
6530    {"getargs_s_hash_int",      _PyCFunction_CAST(getargs_s_hash_int),
6531      METH_VARARGS|METH_KEYWORDS},
6532    {"getargs_s_hash_int2",      _PyCFunction_CAST(getargs_s_hash_int2),
6533      METH_VARARGS|METH_KEYWORDS},
6534    {"gh_99240_clear_args",     gh_99240_clear_args,             METH_VARARGS},
6535    {"getargs_z",               getargs_z,                       METH_VARARGS},
6536    {"getargs_z_star",          getargs_z_star,                  METH_VARARGS},
6537    {"getargs_z_hash",          getargs_z_hash,                  METH_VARARGS},
6538    {"getargs_y",               getargs_y,                       METH_VARARGS},
6539    {"getargs_y_star",          getargs_y_star,                  METH_VARARGS},
6540    {"getargs_y_hash",          getargs_y_hash,                  METH_VARARGS},
6541    {"getargs_u",               getargs_u,                       METH_VARARGS},
6542    {"getargs_u_hash",          getargs_u_hash,                  METH_VARARGS},
6543    {"getargs_Z",               getargs_Z,                       METH_VARARGS},
6544    {"getargs_Z_hash",          getargs_Z_hash,                  METH_VARARGS},
6545    {"getargs_w_star",          getargs_w_star,                  METH_VARARGS},
6546    {"getargs_es",              getargs_es,                      METH_VARARGS},
6547    {"getargs_et",              getargs_et,                      METH_VARARGS},
6548    {"getargs_es_hash",         getargs_es_hash,                 METH_VARARGS},
6549    {"getargs_et_hash",         getargs_et_hash,                 METH_VARARGS},
6550    {"codec_incrementalencoder",
6551     (PyCFunction)codec_incrementalencoder,                      METH_VARARGS},
6552    {"codec_incrementaldecoder",
6553     (PyCFunction)codec_incrementaldecoder,                      METH_VARARGS},
6554    {"test_s_code",             test_s_code,                     METH_NOARGS},
6555#if USE_UNICODE_WCHAR_CACHE
6556    {"test_u_code",             test_u_code,                     METH_NOARGS},
6557    {"test_Z_code",             test_Z_code,                     METH_NOARGS},
6558#endif /* USE_UNICODE_WCHAR_CACHE */
6559    {"test_widechar",           test_widechar,                   METH_NOARGS},
6560    {"unicode_aswidechar",      unicode_aswidechar,              METH_VARARGS},
6561    {"unicode_aswidecharstring",unicode_aswidecharstring,        METH_VARARGS},
6562    {"unicode_asucs4",          unicode_asucs4,                  METH_VARARGS},
6563    {"unicode_asutf8",          unicode_asutf8,                  METH_VARARGS},
6564    {"unicode_asutf8andsize",   unicode_asutf8andsize,           METH_VARARGS},
6565    {"unicode_findchar",        unicode_findchar,                METH_VARARGS},
6566    {"unicode_copycharacters",  unicode_copycharacters,          METH_VARARGS},
6567#if USE_UNICODE_WCHAR_CACHE
6568    {"unicode_legacy_string",   unicode_legacy_string,           METH_VARARGS},
6569#endif /* USE_UNICODE_WCHAR_CACHE */
6570    {"_test_thread_state",      test_thread_state,               METH_VARARGS},
6571    {"_pending_threadfunc",     pending_threadfunc,              METH_VARARGS},
6572#ifdef HAVE_GETTIMEOFDAY
6573    {"profile_int",             profile_int,                     METH_NOARGS},
6574#endif
6575    {"traceback_print",         traceback_print,                 METH_VARARGS},
6576    {"exception_print",         exception_print,                 METH_VARARGS},
6577    {"set_exception",           test_set_exception,              METH_O},
6578    {"set_exc_info",            test_set_exc_info,               METH_VARARGS},
6579    {"argparsing",              argparsing,                      METH_VARARGS},
6580    {"code_newempty",           code_newempty,                   METH_VARARGS},
6581    {"eval_code_ex",            eval_eval_code_ex,               METH_VARARGS},
6582    {"make_exception_with_doc", _PyCFunction_CAST(make_exception_with_doc),
6583     METH_VARARGS | METH_KEYWORDS},
6584    {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
6585     METH_NOARGS},
6586    {"crash_no_current_thread", crash_no_current_thread,         METH_NOARGS},
6587    {"run_in_subinterp",        run_in_subinterp,                METH_VARARGS},
6588    {"pytime_object_to_time_t", test_pytime_object_to_time_t,  METH_VARARGS},
6589    {"pytime_object_to_timeval", test_pytime_object_to_timeval,  METH_VARARGS},
6590    {"pytime_object_to_timespec", test_pytime_object_to_timespec,  METH_VARARGS},
6591    {"with_tp_del",             with_tp_del,                     METH_VARARGS},
6592    {"create_cfunction",        create_cfunction,                METH_NOARGS},
6593    {"test_pymem_alloc0",       test_pymem_alloc0,               METH_NOARGS},
6594    {"test_pymem_setrawallocators",test_pymem_setrawallocators,  METH_NOARGS},
6595    {"test_pymem_setallocators",test_pymem_setallocators,        METH_NOARGS},
6596    {"test_pyobject_setallocators",test_pyobject_setallocators,  METH_NOARGS},
6597    {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
6598     PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
6599    {"remove_mem_hooks",        remove_mem_hooks,                METH_NOARGS,
6600     PyDoc_STR("Remove memory hooks.")},
6601    {"no_docstring",
6602        (PyCFunction)test_with_docstring, METH_NOARGS},
6603    {"docstring_empty",
6604        (PyCFunction)test_with_docstring, METH_NOARGS,
6605        docstring_empty},
6606    {"docstring_no_signature",
6607        (PyCFunction)test_with_docstring, METH_NOARGS,
6608        docstring_no_signature},
6609    {"docstring_with_invalid_signature",
6610        (PyCFunction)test_with_docstring, METH_NOARGS,
6611        docstring_with_invalid_signature},
6612    {"docstring_with_invalid_signature2",
6613        (PyCFunction)test_with_docstring, METH_NOARGS,
6614        docstring_with_invalid_signature2},
6615    {"docstring_with_signature",
6616        (PyCFunction)test_with_docstring, METH_NOARGS,
6617        docstring_with_signature},
6618    {"docstring_with_signature_but_no_doc",
6619        (PyCFunction)test_with_docstring, METH_NOARGS,
6620        docstring_with_signature_but_no_doc},
6621    {"docstring_with_signature_and_extra_newlines",
6622        (PyCFunction)test_with_docstring, METH_NOARGS,
6623        docstring_with_signature_and_extra_newlines},
6624    {"docstring_with_signature_with_defaults",
6625        (PyCFunction)test_with_docstring, METH_NOARGS,
6626        docstring_with_signature_with_defaults},
6627    {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_VARARGS,
6628     PyDoc_STR("set_error_class(error_class) -> None")},
6629    {"join_temporary_c_thread", join_temporary_c_thread, METH_NOARGS},
6630    {"pymarshal_write_long_to_file",
6631        pymarshal_write_long_to_file, METH_VARARGS},
6632    {"pymarshal_write_object_to_file",
6633        pymarshal_write_object_to_file, METH_VARARGS},
6634    {"pymarshal_read_short_from_file",
6635        pymarshal_read_short_from_file, METH_VARARGS},
6636    {"pymarshal_read_long_from_file",
6637        pymarshal_read_long_from_file, METH_VARARGS},
6638    {"pymarshal_read_last_object_from_file",
6639        pymarshal_read_last_object_from_file, METH_VARARGS},
6640    {"pymarshal_read_object_from_file",
6641        pymarshal_read_object_from_file, METH_VARARGS},
6642    {"return_null_without_error", return_null_without_error, METH_NOARGS},
6643    {"return_result_with_error", return_result_with_error, METH_NOARGS},
6644    {"getitem_with_error", getitem_with_error, METH_VARARGS},
6645    {"Py_CompileString",     pycompilestring, METH_O},
6646    {"PyTime_FromSeconds", test_pytime_fromseconds,  METH_VARARGS},
6647    {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject,  METH_VARARGS},
6648    {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
6649    {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
6650    {"PyTime_AsTimeval_clamp", test_PyTime_AsTimeval_clamp, METH_VARARGS},
6651#ifdef HAVE_CLOCK_GETTIME
6652    {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
6653    {"PyTime_AsTimespec_clamp", test_PyTime_AsTimespec_clamp, METH_VARARGS},
6654#endif
6655    {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
6656    {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
6657    {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
6658    {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
6659    {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
6660    {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
6661    {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
6662    {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
6663    {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
6664    {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
6665    {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
6666    {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
6667    {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
6668    {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
6669    {"dict_get_version", dict_get_version, METH_VARARGS},
6670    {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
6671    {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
6672    {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
6673    {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
6674    {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
6675    {"stack_pointer", stack_pointer, METH_NOARGS},
6676#ifdef W_STOPCODE
6677    {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
6678#endif
6679    {"get_mapping_keys", get_mapping_keys, METH_O},
6680    {"get_mapping_values", get_mapping_values, METH_O},
6681    {"get_mapping_items", get_mapping_items, METH_O},
6682    {"test_mapping_has_key_string", test_mapping_has_key_string, METH_NOARGS},
6683    {"mapping_has_key", mapping_has_key, METH_VARARGS},
6684    {"sequence_set_slice", sequence_set_slice, METH_VARARGS},
6685    {"sequence_del_slice", sequence_del_slice, METH_VARARGS},
6686    {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
6687    {"hamt", new_hamt, METH_NOARGS},
6688    {"bad_get", _PyCFunction_CAST(bad_get), METH_FASTCALL},
6689#ifdef Py_REF_DEBUG
6690    {"negative_refcount", negative_refcount, METH_NOARGS},
6691#endif
6692    {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
6693    {"sequence_getitem", sequence_getitem, METH_VARARGS},
6694    {"sequence_setitem", sequence_setitem, METH_VARARGS},
6695    {"meth_varargs", meth_varargs, METH_VARARGS},
6696    {"meth_varargs_keywords", _PyCFunction_CAST(meth_varargs_keywords), METH_VARARGS|METH_KEYWORDS},
6697    {"meth_o", meth_o, METH_O},
6698    {"meth_noargs", meth_noargs, METH_NOARGS},
6699    {"meth_fastcall", _PyCFunction_CAST(meth_fastcall), METH_FASTCALL},
6700    {"meth_fastcall_keywords", _PyCFunction_CAST(meth_fastcall_keywords), METH_FASTCALL|METH_KEYWORDS},
6701    {"pynumber_tobase", pynumber_tobase, METH_VARARGS},
6702    {"without_gc", without_gc, METH_O},
6703    {"test_set_type_size", test_set_type_size, METH_NOARGS},
6704    {"test_refcount_macros", test_refcount_macros, METH_NOARGS},
6705    {"test_refcount_funcs", test_refcount_funcs, METH_NOARGS},
6706    {"test_py_is_macros", test_py_is_macros, METH_NOARGS},
6707    {"test_py_is_funcs", test_py_is_funcs, METH_NOARGS},
6708    {"fatal_error", test_fatal_error, METH_VARARGS,
6709     PyDoc_STR("fatal_error(message, release_gil=False): call Py_FatalError(message)")},
6710    {"type_get_version", type_get_version, METH_O, PyDoc_STR("type->tp_version_tag")},
6711    {"test_tstate_capi", test_tstate_capi, METH_NOARGS, NULL},
6712    {"float_pack", test_float_pack, METH_VARARGS, NULL},
6713    {"float_unpack", test_float_unpack, METH_VARARGS, NULL},
6714    {"frame_getlocals", frame_getlocals, METH_O, NULL},
6715    {"frame_getglobals", frame_getglobals, METH_O, NULL},
6716    {"frame_getgenerator", frame_getgenerator, METH_O, NULL},
6717    {"frame_getbuiltins", frame_getbuiltins, METH_O, NULL},
6718    {"frame_getlasti", frame_getlasti, METH_O, NULL},
6719    {"frame_new", frame_new, METH_VARARGS, NULL},
6720    {"eval_get_func_name", eval_get_func_name, METH_O, NULL},
6721    {"eval_get_func_desc", eval_get_func_desc, METH_O, NULL},
6722    {"get_feature_macros", get_feature_macros, METH_NOARGS, NULL},
6723    {"test_code_api", test_code_api, METH_NOARGS, NULL},
6724    {"settrace_to_error", settrace_to_error, METH_O, NULL},
6725    {"settrace_to_record", settrace_to_record, METH_O, NULL},
6726    {"function_get_code", function_get_code, METH_O, NULL},
6727    {"function_get_globals", function_get_globals, METH_O, NULL},
6728    {"function_get_module", function_get_module, METH_O, NULL},
6729    {NULL, NULL} /* sentinel */
6730};
6731
6732typedef struct {
6733    char bool_member;
6734    char byte_member;
6735    unsigned char ubyte_member;
6736    short short_member;
6737    unsigned short ushort_member;
6738    int int_member;
6739    unsigned int uint_member;
6740    long long_member;
6741    unsigned long ulong_member;
6742    Py_ssize_t pyssizet_member;
6743    float float_member;
6744    double double_member;
6745    char inplace_member[6];
6746    long long longlong_member;
6747    unsigned long long ulonglong_member;
6748} all_structmembers;
6749
6750typedef struct {
6751    PyObject_HEAD
6752    all_structmembers structmembers;
6753} test_structmembers;
6754
6755static struct PyMemberDef test_members[] = {
6756    {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
6757    {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
6758    {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
6759    {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
6760    {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
6761    {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
6762    {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
6763    {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
6764    {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
6765    {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
6766    {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
6767    {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
6768    {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
6769    {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
6770    {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
6771    {NULL}
6772};
6773
6774
6775static PyObject *
6776test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
6777{
6778    static char *keywords[] = {
6779        "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
6780        "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
6781        "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
6782        "T_LONGLONG", "T_ULONGLONG",
6783        NULL};
6784    static const char fmt[] = "|bbBhHiIlknfds#LK";
6785    test_structmembers *ob;
6786    const char *s = NULL;
6787    Py_ssize_t string_len = 0;
6788    ob = PyObject_New(test_structmembers, type);
6789    if (ob == NULL)
6790        return NULL;
6791    memset(&ob->structmembers, 0, sizeof(all_structmembers));
6792    if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
6793                                     &ob->structmembers.bool_member,
6794                                     &ob->structmembers.byte_member,
6795                                     &ob->structmembers.ubyte_member,
6796                                     &ob->structmembers.short_member,
6797                                     &ob->structmembers.ushort_member,
6798                                     &ob->structmembers.int_member,
6799                                     &ob->structmembers.uint_member,
6800                                     &ob->structmembers.long_member,
6801                                     &ob->structmembers.ulong_member,
6802                                     &ob->structmembers.pyssizet_member,
6803                                     &ob->structmembers.float_member,
6804                                     &ob->structmembers.double_member,
6805                                     &s, &string_len
6806                                     , &ob->structmembers.longlong_member,
6807                                     &ob->structmembers.ulonglong_member
6808        )) {
6809        Py_DECREF(ob);
6810        return NULL;
6811    }
6812    if (s != NULL) {
6813        if (string_len > 5) {
6814            Py_DECREF(ob);
6815            PyErr_SetString(PyExc_ValueError, "string too long");
6816            return NULL;
6817        }
6818        strcpy(ob->structmembers.inplace_member, s);
6819    }
6820    else {
6821        strcpy(ob->structmembers.inplace_member, "");
6822    }
6823    return (PyObject *)ob;
6824}
6825
6826static void
6827test_structmembers_free(PyObject *ob)
6828{
6829    PyObject_Free(ob);
6830}
6831
6832static PyTypeObject test_structmembersType = {
6833    PyVarObject_HEAD_INIT(NULL, 0)
6834    "test_structmembersType",
6835    sizeof(test_structmembers),         /* tp_basicsize */
6836    0,                                  /* tp_itemsize */
6837    test_structmembers_free,            /* destructor tp_dealloc */
6838    0,                                  /* tp_vectorcall_offset */
6839    0,                                  /* tp_getattr */
6840    0,                                  /* tp_setattr */
6841    0,                                  /* tp_as_async */
6842    0,                                  /* tp_repr */
6843    0,                                  /* tp_as_number */
6844    0,                                  /* tp_as_sequence */
6845    0,                                  /* tp_as_mapping */
6846    0,                                  /* tp_hash */
6847    0,                                  /* tp_call */
6848    0,                                  /* tp_str */
6849    PyObject_GenericGetAttr,            /* tp_getattro */
6850    PyObject_GenericSetAttr,            /* tp_setattro */
6851    0,                                  /* tp_as_buffer */
6852    0,                                  /* tp_flags */
6853    "Type containing all structmember types",
6854    0,                                  /* traverseproc tp_traverse */
6855    0,                                  /* tp_clear */
6856    0,                                  /* tp_richcompare */
6857    0,                                  /* tp_weaklistoffset */
6858    0,                                  /* tp_iter */
6859    0,                                  /* tp_iternext */
6860    0,                                  /* tp_methods */
6861    test_members,                       /* tp_members */
6862    0,
6863    0,
6864    0,
6865    0,
6866    0,
6867    0,
6868    0,
6869    0,
6870    test_structmembers_new,             /* tp_new */
6871};
6872
6873
6874typedef struct {
6875    PyObject_HEAD
6876} matmulObject;
6877
6878static PyObject *
6879matmulType_matmul(PyObject *self, PyObject *other)
6880{
6881    return Py_BuildValue("(sOO)", "matmul", self, other);
6882}
6883
6884static PyObject *
6885matmulType_imatmul(PyObject *self, PyObject *other)
6886{
6887    return Py_BuildValue("(sOO)", "imatmul", self, other);
6888}
6889
6890static void
6891matmulType_dealloc(PyObject *self)
6892{
6893    Py_TYPE(self)->tp_free(self);
6894}
6895
6896static PyNumberMethods matmulType_as_number = {
6897    0,                          /* nb_add */
6898    0,                          /* nb_subtract */
6899    0,                          /* nb_multiply */
6900    0,                          /* nb_remainde r*/
6901    0,                          /* nb_divmod */
6902    0,                          /* nb_power */
6903    0,                          /* nb_negative */
6904    0,                          /* tp_positive */
6905    0,                          /* tp_absolute */
6906    0,                          /* tp_bool */
6907    0,                          /* nb_invert */
6908    0,                          /* nb_lshift */
6909    0,                          /* nb_rshift */
6910    0,                          /* nb_and */
6911    0,                          /* nb_xor */
6912    0,                          /* nb_or */
6913    0,                          /* nb_int */
6914    0,                          /* nb_reserved */
6915    0,                          /* nb_float */
6916    0,                          /* nb_inplace_add */
6917    0,                          /* nb_inplace_subtract */
6918    0,                          /* nb_inplace_multiply */
6919    0,                          /* nb_inplace_remainder */
6920    0,                          /* nb_inplace_power */
6921    0,                          /* nb_inplace_lshift */
6922    0,                          /* nb_inplace_rshift */
6923    0,                          /* nb_inplace_and */
6924    0,                          /* nb_inplace_xor */
6925    0,                          /* nb_inplace_or */
6926    0,                          /* nb_floor_divide */
6927    0,                          /* nb_true_divide */
6928    0,                          /* nb_inplace_floor_divide */
6929    0,                          /* nb_inplace_true_divide */
6930    0,                          /* nb_index */
6931    matmulType_matmul,        /* nb_matrix_multiply */
6932    matmulType_imatmul        /* nb_matrix_inplace_multiply */
6933};
6934
6935static PyTypeObject matmulType = {
6936    PyVarObject_HEAD_INIT(NULL, 0)
6937    "matmulType",
6938    sizeof(matmulObject),               /* tp_basicsize */
6939    0,                                  /* tp_itemsize */
6940    matmulType_dealloc,                 /* destructor tp_dealloc */
6941    0,                                  /* tp_vectorcall_offset */
6942    0,                                  /* tp_getattr */
6943    0,                                  /* tp_setattr */
6944    0,                                  /* tp_as_async */
6945    0,                                  /* tp_repr */
6946    &matmulType_as_number,              /* tp_as_number */
6947    0,                                  /* tp_as_sequence */
6948    0,                                  /* tp_as_mapping */
6949    0,                                  /* tp_hash */
6950    0,                                  /* tp_call */
6951    0,                                  /* tp_str */
6952    PyObject_GenericGetAttr,            /* tp_getattro */
6953    PyObject_GenericSetAttr,            /* tp_setattro */
6954    0,                                  /* tp_as_buffer */
6955    0,                                  /* tp_flags */
6956    "C level type with matrix operations defined",
6957    0,                                  /* traverseproc tp_traverse */
6958    0,                                  /* tp_clear */
6959    0,                                  /* tp_richcompare */
6960    0,                                  /* tp_weaklistoffset */
6961    0,                                  /* tp_iter */
6962    0,                                  /* tp_iternext */
6963    0,                                  /* tp_methods */
6964    0,                                  /* tp_members */
6965    0,
6966    0,
6967    0,
6968    0,
6969    0,
6970    0,
6971    0,
6972    0,
6973    PyType_GenericNew,                  /* tp_new */
6974    PyObject_Del,                       /* tp_free */
6975};
6976
6977typedef struct {
6978    PyObject_HEAD
6979} ipowObject;
6980
6981static PyObject *
6982ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
6983{
6984    return Py_BuildValue("OO", other, mod);
6985}
6986
6987static PyNumberMethods ipowType_as_number = {
6988    .nb_inplace_power = ipowType_ipow
6989};
6990
6991static PyTypeObject ipowType = {
6992    PyVarObject_HEAD_INIT(NULL, 0)
6993    .tp_name = "ipowType",
6994    .tp_basicsize = sizeof(ipowObject),
6995    .tp_as_number = &ipowType_as_number,
6996    .tp_new = PyType_GenericNew
6997};
6998
6999typedef struct {
7000    PyObject_HEAD
7001    PyObject *ao_iterator;
7002} awaitObject;
7003
7004
7005static PyObject *
7006awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
7007{
7008    PyObject *v;
7009    awaitObject *ao;
7010
7011    if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
7012        return NULL;
7013
7014    ao = (awaitObject *)type->tp_alloc(type, 0);
7015    if (ao == NULL) {
7016        return NULL;
7017    }
7018
7019    Py_INCREF(v);
7020    ao->ao_iterator = v;
7021
7022    return (PyObject *)ao;
7023}
7024
7025
7026static void
7027awaitObject_dealloc(awaitObject *ao)
7028{
7029    Py_CLEAR(ao->ao_iterator);
7030    Py_TYPE(ao)->tp_free(ao);
7031}
7032
7033
7034static PyObject *
7035awaitObject_await(awaitObject *ao)
7036{
7037    Py_INCREF(ao->ao_iterator);
7038    return ao->ao_iterator;
7039}
7040
7041static PyAsyncMethods awaitType_as_async = {
7042    (unaryfunc)awaitObject_await,           /* am_await */
7043    0,                                      /* am_aiter */
7044    0,                                      /* am_anext */
7045    0,                                      /* am_send  */
7046};
7047
7048
7049static PyTypeObject awaitType = {
7050    PyVarObject_HEAD_INIT(NULL, 0)
7051    "awaitType",
7052    sizeof(awaitObject),                /* tp_basicsize */
7053    0,                                  /* tp_itemsize */
7054    (destructor)awaitObject_dealloc,    /* destructor tp_dealloc */
7055    0,                                  /* tp_vectorcall_offset */
7056    0,                                  /* tp_getattr */
7057    0,                                  /* tp_setattr */
7058    &awaitType_as_async,                /* tp_as_async */
7059    0,                                  /* tp_repr */
7060    0,                                  /* tp_as_number */
7061    0,                                  /* tp_as_sequence */
7062    0,                                  /* tp_as_mapping */
7063    0,                                  /* tp_hash */
7064    0,                                  /* tp_call */
7065    0,                                  /* tp_str */
7066    PyObject_GenericGetAttr,            /* tp_getattro */
7067    PyObject_GenericSetAttr,            /* tp_setattro */
7068    0,                                  /* tp_as_buffer */
7069    0,                                  /* tp_flags */
7070    "C level type with tp_as_async",
7071    0,                                  /* traverseproc tp_traverse */
7072    0,                                  /* tp_clear */
7073    0,                                  /* tp_richcompare */
7074    0,                                  /* tp_weaklistoffset */
7075    0,                                  /* tp_iter */
7076    0,                                  /* tp_iternext */
7077    0,                                  /* tp_methods */
7078    0,                                  /* tp_members */
7079    0,
7080    0,
7081    0,
7082    0,
7083    0,
7084    0,
7085    0,
7086    0,
7087    awaitObject_new,                    /* tp_new */
7088    PyObject_Del,                       /* tp_free */
7089};
7090
7091
7092static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
7093
7094static PyTypeObject PyRecursingInfinitelyError_Type = {
7095    PyVarObject_HEAD_INIT(NULL, 0)
7096    "RecursingInfinitelyError",   /* tp_name */
7097    sizeof(PyBaseExceptionObject), /* tp_basicsize */
7098    0,                          /* tp_itemsize */
7099    0,                          /* tp_dealloc */
7100    0,                          /* tp_vectorcall_offset */
7101    0,                          /* tp_getattr */
7102    0,                          /* tp_setattr */
7103    0,                          /* tp_as_async */
7104    0,                          /* tp_repr */
7105    0,                          /* tp_as_number */
7106    0,                          /* tp_as_sequence */
7107    0,                          /* tp_as_mapping */
7108    0,                          /* tp_hash */
7109    0,                          /* tp_call */
7110    0,                          /* tp_str */
7111    0,                          /* tp_getattro */
7112    0,                          /* tp_setattro */
7113    0,                          /* tp_as_buffer */
7114    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
7115    PyDoc_STR("Instantiating this exception starts infinite recursion."), /* tp_doc */
7116    0,                          /* tp_traverse */
7117    0,                          /* tp_clear */
7118    0,                          /* tp_richcompare */
7119    0,                          /* tp_weaklistoffset */
7120    0,                          /* tp_iter */
7121    0,                          /* tp_iternext */
7122    0,                          /* tp_methods */
7123    0,                          /* tp_members */
7124    0,                          /* tp_getset */
7125    0,                          /* tp_base */
7126    0,                          /* tp_dict */
7127    0,                          /* tp_descr_get */
7128    0,                          /* tp_descr_set */
7129    0,                          /* tp_dictoffset */
7130    (initproc)recurse_infinitely_error_init, /* tp_init */
7131    0,                          /* tp_alloc */
7132    0,                          /* tp_new */
7133};
7134
7135static int
7136recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
7137{
7138    PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
7139
7140    /* Instantiating this exception starts infinite recursion. */
7141    Py_INCREF(type);
7142    PyErr_SetObject(type, NULL);
7143    return -1;
7144}
7145
7146
7147/* Test bpo-35983: create a subclass of "list" which checks that instances
7148 * are not deallocated twice */
7149
7150typedef struct {
7151    PyListObject list;
7152    int deallocated;
7153} MyListObject;
7154
7155static PyObject *
7156MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
7157{
7158    PyObject* op = PyList_Type.tp_new(type, args, kwds);
7159    ((MyListObject*)op)->deallocated = 0;
7160    return op;
7161}
7162
7163void
7164MyList_dealloc(MyListObject* op)
7165{
7166    if (op->deallocated) {
7167        /* We cannot raise exceptions here but we still want the testsuite
7168         * to fail when we hit this */
7169        Py_FatalError("MyList instance deallocated twice");
7170    }
7171    op->deallocated = 1;
7172    PyList_Type.tp_dealloc((PyObject *)op);
7173}
7174
7175static PyTypeObject MyList_Type = {
7176    PyVarObject_HEAD_INIT(NULL, 0)
7177    "MyList",
7178    sizeof(MyListObject),
7179    0,
7180    (destructor)MyList_dealloc,                 /* tp_dealloc */
7181    0,                                          /* tp_vectorcall_offset */
7182    0,                                          /* tp_getattr */
7183    0,                                          /* tp_setattr */
7184    0,                                          /* tp_as_async */
7185    0,                                          /* tp_repr */
7186    0,                                          /* tp_as_number */
7187    0,                                          /* tp_as_sequence */
7188    0,                                          /* tp_as_mapping */
7189    0,                                          /* tp_hash */
7190    0,                                          /* tp_call */
7191    0,                                          /* tp_str */
7192    0,                                          /* tp_getattro */
7193    0,                                          /* tp_setattro */
7194    0,                                          /* tp_as_buffer */
7195    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,   /* tp_flags */
7196    0,                                          /* tp_doc */
7197    0,                                          /* tp_traverse */
7198    0,                                          /* tp_clear */
7199    0,                                          /* tp_richcompare */
7200    0,                                          /* tp_weaklistoffset */
7201    0,                                          /* tp_iter */
7202    0,                                          /* tp_iternext */
7203    0,                                          /* tp_methods */
7204    0,                                          /* tp_members */
7205    0,                                          /* tp_getset */
7206    0,  /* &PyList_Type */                      /* tp_base */
7207    0,                                          /* tp_dict */
7208    0,                                          /* tp_descr_get */
7209    0,                                          /* tp_descr_set */
7210    0,                                          /* tp_dictoffset */
7211    0,                                          /* tp_init */
7212    0,                                          /* tp_alloc */
7213    MyList_new,                                 /* tp_new */
7214};
7215
7216
7217/* Test PEP 560 */
7218
7219typedef struct {
7220    PyObject_HEAD
7221    PyObject *item;
7222} PyGenericAliasObject;
7223
7224static void
7225generic_alias_dealloc(PyGenericAliasObject *self)
7226{
7227    Py_CLEAR(self->item);
7228    Py_TYPE(self)->tp_free((PyObject *)self);
7229}
7230
7231static PyObject *
7232generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
7233{
7234    return PyTuple_Pack(1, self->item);
7235}
7236
7237static PyMethodDef generic_alias_methods[] = {
7238    {"__mro_entries__", _PyCFunction_CAST(generic_alias_mro_entries), METH_O, NULL},
7239    {NULL}  /* sentinel */
7240};
7241
7242static PyTypeObject GenericAlias_Type = {
7243    PyVarObject_HEAD_INIT(NULL, 0)
7244    "GenericAlias",
7245    sizeof(PyGenericAliasObject),
7246    0,
7247    .tp_dealloc = (destructor)generic_alias_dealloc,
7248    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7249    .tp_methods = generic_alias_methods,
7250};
7251
7252static PyObject *
7253generic_alias_new(PyObject *item)
7254{
7255    PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
7256    if (o == NULL) {
7257        return NULL;
7258    }
7259    Py_INCREF(item);
7260    o->item = item;
7261    return (PyObject*) o;
7262}
7263
7264typedef struct {
7265    PyObject_HEAD
7266} PyGenericObject;
7267
7268static PyObject *
7269generic_class_getitem(PyObject *type, PyObject *item)
7270{
7271    return generic_alias_new(item);
7272}
7273
7274static PyMethodDef generic_methods[] = {
7275    {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
7276    {NULL}  /* sentinel */
7277};
7278
7279static PyTypeObject Generic_Type = {
7280    PyVarObject_HEAD_INIT(NULL, 0)
7281    "Generic",
7282    sizeof(PyGenericObject),
7283    0,
7284    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7285    .tp_methods = generic_methods,
7286};
7287
7288
7289/* Test PEP 590 */
7290
7291typedef struct {
7292    PyObject_HEAD
7293    vectorcallfunc vectorcall;
7294} MethodDescriptorObject;
7295
7296static PyObject *
7297MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
7298                            size_t nargsf, PyObject *kwnames)
7299{
7300    /* True if using the vectorcall function in MethodDescriptorObject
7301     * but False for MethodDescriptor2Object */
7302    MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
7303    return PyBool_FromLong(md->vectorcall != NULL);
7304}
7305
7306static PyObject *
7307MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
7308{
7309    MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
7310    op->vectorcall = MethodDescriptor_vectorcall;
7311    return (PyObject *)op;
7312}
7313
7314static PyObject *
7315func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
7316{
7317    if (obj == Py_None || obj == NULL) {
7318        Py_INCREF(func);
7319        return func;
7320    }
7321    return PyMethod_New(func, obj);
7322}
7323
7324static PyObject *
7325nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
7326{
7327    Py_INCREF(func);
7328    return func;
7329}
7330
7331static PyObject *
7332call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
7333{
7334    Py_INCREF(args);
7335    return args;
7336}
7337
7338static PyTypeObject MethodDescriptorBase_Type = {
7339    PyVarObject_HEAD_INIT(NULL, 0)
7340    "MethodDescriptorBase",
7341    sizeof(MethodDescriptorObject),
7342    .tp_new = MethodDescriptor_new,
7343    .tp_call = PyVectorcall_Call,
7344    .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
7345    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
7346                Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL,
7347    .tp_descr_get = func_descr_get,
7348};
7349
7350static PyTypeObject MethodDescriptorDerived_Type = {
7351    PyVarObject_HEAD_INIT(NULL, 0)
7352    "MethodDescriptorDerived",
7353    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7354};
7355
7356static PyTypeObject MethodDescriptorNopGet_Type = {
7357    PyVarObject_HEAD_INIT(NULL, 0)
7358    "MethodDescriptorNopGet",
7359    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7360    .tp_call = call_return_args,
7361    .tp_descr_get = nop_descr_get,
7362};
7363
7364typedef struct {
7365    MethodDescriptorObject base;
7366    vectorcallfunc vectorcall;
7367} MethodDescriptor2Object;
7368
7369static PyObject *
7370MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
7371{
7372    MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
7373    op->base.vectorcall = NULL;
7374    op->vectorcall = MethodDescriptor_vectorcall;
7375    return (PyObject *)op;
7376}
7377
7378static PyTypeObject MethodDescriptor2_Type = {
7379    PyVarObject_HEAD_INIT(NULL, 0)
7380    "MethodDescriptor2",
7381    sizeof(MethodDescriptor2Object),
7382    .tp_new = MethodDescriptor2_new,
7383    .tp_call = PyVectorcall_Call,
7384    .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
7385    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL,
7386};
7387
7388PyDoc_STRVAR(heapdocctype__doc__,
7389"HeapDocCType(arg1, arg2)\n"
7390"--\n"
7391"\n"
7392"somedoc");
7393
7394typedef struct {
7395    PyObject_HEAD
7396} HeapDocCTypeObject;
7397
7398static PyType_Slot HeapDocCType_slots[] = {
7399    {Py_tp_doc, (char*)heapdocctype__doc__},
7400    {0},
7401};
7402
7403static PyType_Spec HeapDocCType_spec = {
7404    "_testcapi.HeapDocCType",
7405    sizeof(HeapDocCTypeObject),
7406    0,
7407    Py_TPFLAGS_DEFAULT,
7408    HeapDocCType_slots
7409};
7410
7411typedef struct {
7412    PyObject_HEAD
7413} HeapTypeNameObject;
7414
7415static PyType_Slot HeapTypeNameType_slots[] = {
7416    {0},
7417};
7418
7419static PyType_Spec HeapTypeNameType_Spec = {
7420    .name = "_testcapi.HeapTypeNameType",
7421    .basicsize = sizeof(HeapTypeNameObject),
7422    .flags = Py_TPFLAGS_DEFAULT,
7423    .slots = HeapTypeNameType_slots,
7424};
7425
7426typedef struct {
7427    PyObject_HEAD
7428} NullTpDocTypeObject;
7429
7430static PyType_Slot NullTpDocType_slots[] = {
7431    {Py_tp_doc, NULL},
7432    {0, 0},
7433};
7434
7435static PyType_Spec NullTpDocType_spec = {
7436    "_testcapi.NullTpDocType",
7437    sizeof(NullTpDocTypeObject),
7438    0,
7439    Py_TPFLAGS_DEFAULT,
7440    NullTpDocType_slots
7441};
7442
7443
7444PyDoc_STRVAR(heapgctype__doc__,
7445"A heap type with GC, and with overridden dealloc.\n\n"
7446"The 'value' attribute is set to 10 in __init__.");
7447
7448typedef struct {
7449    PyObject_HEAD
7450    int value;
7451} HeapCTypeObject;
7452
7453static struct PyMemberDef heapctype_members[] = {
7454    {"value", T_INT, offsetof(HeapCTypeObject, value)},
7455    {NULL} /* Sentinel */
7456};
7457
7458static int
7459heapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
7460{
7461    ((HeapCTypeObject *)self)->value = 10;
7462    return 0;
7463}
7464
7465static int
7466heapgcctype_traverse(HeapCTypeObject *self, visitproc visit, void *arg)
7467{
7468    Py_VISIT(Py_TYPE(self));
7469    return 0;
7470}
7471
7472static void
7473heapgcctype_dealloc(HeapCTypeObject *self)
7474{
7475    PyTypeObject *tp = Py_TYPE(self);
7476    PyObject_GC_UnTrack(self);
7477    PyObject_GC_Del(self);
7478    Py_DECREF(tp);
7479}
7480
7481static PyType_Slot HeapGcCType_slots[] = {
7482    {Py_tp_init, heapctype_init},
7483    {Py_tp_members, heapctype_members},
7484    {Py_tp_dealloc, heapgcctype_dealloc},
7485    {Py_tp_traverse, heapgcctype_traverse},
7486    {Py_tp_doc, (char*)heapgctype__doc__},
7487    {0, 0},
7488};
7489
7490static PyType_Spec HeapGcCType_spec = {
7491    "_testcapi.HeapGcCType",
7492    sizeof(HeapCTypeObject),
7493    0,
7494    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
7495    HeapGcCType_slots
7496};
7497
7498PyDoc_STRVAR(heapctype__doc__,
7499"A heap type without GC, but with overridden dealloc.\n\n"
7500"The 'value' attribute is set to 10 in __init__.");
7501
7502static void
7503heapctype_dealloc(HeapCTypeObject *self)
7504{
7505    PyTypeObject *tp = Py_TYPE(self);
7506    PyObject_Free(self);
7507    Py_DECREF(tp);
7508}
7509
7510static PyType_Slot HeapCType_slots[] = {
7511    {Py_tp_init, heapctype_init},
7512    {Py_tp_members, heapctype_members},
7513    {Py_tp_dealloc, heapctype_dealloc},
7514    {Py_tp_doc, (char*)heapctype__doc__},
7515    {0, 0},
7516};
7517
7518static PyType_Spec HeapCType_spec = {
7519    "_testcapi.HeapCType",
7520    sizeof(HeapCTypeObject),
7521    0,
7522    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7523    HeapCType_slots
7524};
7525
7526PyDoc_STRVAR(heapctypesubclass__doc__,
7527"Subclass of HeapCType, without GC.\n\n"
7528"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
7529
7530typedef struct {
7531    HeapCTypeObject base;
7532    int value2;
7533} HeapCTypeSubclassObject;
7534
7535static int
7536heapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
7537{
7538    /* Call __init__ of the superclass */
7539    if (heapctype_init(self, args, kwargs) < 0) {
7540        return -1;
7541    }
7542    /* Initialize additional element */
7543    ((HeapCTypeSubclassObject *)self)->value2 = 20;
7544    return 0;
7545}
7546
7547static struct PyMemberDef heapctypesubclass_members[] = {
7548    {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
7549    {NULL} /* Sentinel */
7550};
7551
7552static PyType_Slot HeapCTypeSubclass_slots[] = {
7553    {Py_tp_init, heapctypesubclass_init},
7554    {Py_tp_members, heapctypesubclass_members},
7555    {Py_tp_doc, (char*)heapctypesubclass__doc__},
7556    {0, 0},
7557};
7558
7559static PyType_Spec HeapCTypeSubclass_spec = {
7560    "_testcapi.HeapCTypeSubclass",
7561    sizeof(HeapCTypeSubclassObject),
7562    0,
7563    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7564    HeapCTypeSubclass_slots
7565};
7566
7567PyDoc_STRVAR(heapctypewithbuffer__doc__,
7568"Heap type with buffer support.\n\n"
7569"The buffer is set to [b'1', b'2', b'3', b'4']");
7570
7571typedef struct {
7572    HeapCTypeObject base;
7573    char buffer[4];
7574} HeapCTypeWithBufferObject;
7575
7576static int
7577heapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags)
7578{
7579    self->buffer[0] = '1';
7580    self->buffer[1] = '2';
7581    self->buffer[2] = '3';
7582    self->buffer[3] = '4';
7583    return PyBuffer_FillInfo(
7584        view, (PyObject*)self, (void *)self->buffer, 4, 1, flags);
7585}
7586
7587static void
7588heapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view)
7589{
7590    assert(view->obj == (void*) self);
7591}
7592
7593static PyType_Slot HeapCTypeWithBuffer_slots[] = {
7594    {Py_bf_getbuffer, heapctypewithbuffer_getbuffer},
7595    {Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer},
7596    {Py_tp_doc, (char*)heapctypewithbuffer__doc__},
7597    {0, 0},
7598};
7599
7600static PyType_Spec HeapCTypeWithBuffer_spec = {
7601    "_testcapi.HeapCTypeWithBuffer",
7602    sizeof(HeapCTypeWithBufferObject),
7603    0,
7604    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7605    HeapCTypeWithBuffer_slots
7606};
7607
7608PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
7609"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
7610"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
7611"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
7612
7613static int
7614heapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
7615{
7616    PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
7617    initproc base_init = PyType_GetSlot(base, Py_tp_init);
7618    base_init(self, args, kwargs);
7619    return 0;
7620}
7621
7622static void
7623heapctypesubclasswithfinalizer_finalize(PyObject *self)
7624{
7625    PyObject *error_type, *error_value, *error_traceback, *m;
7626    PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
7627
7628    /* Save the current exception, if any. */
7629    PyErr_Fetch(&error_type, &error_value, &error_traceback);
7630
7631    m = PyState_FindModule(&_testcapimodule);
7632    if (m == NULL) {
7633        goto cleanup_finalize;
7634    }
7635    oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
7636    newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
7637    if (oldtype == NULL || newtype == NULL) {
7638        goto cleanup_finalize;
7639    }
7640
7641    if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
7642        goto cleanup_finalize;
7643    }
7644    refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
7645    if (refcnt == NULL) {
7646        goto cleanup_finalize;
7647    }
7648    if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
7649        goto cleanup_finalize;
7650    }
7651    Py_DECREF(refcnt);
7652    refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
7653    if (refcnt == NULL) {
7654        goto cleanup_finalize;
7655    }
7656    if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
7657        goto cleanup_finalize;
7658    }
7659
7660cleanup_finalize:
7661    Py_XDECREF(oldtype);
7662    Py_XDECREF(newtype);
7663    Py_XDECREF(refcnt);
7664
7665    /* Restore the saved exception. */
7666    PyErr_Restore(error_type, error_value, error_traceback);
7667}
7668
7669static PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
7670    {Py_tp_init, heapctypesubclasswithfinalizer_init},
7671    {Py_tp_members, heapctypesubclass_members},
7672    {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
7673    {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
7674    {0, 0},
7675};
7676
7677static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
7678    "_testcapi.HeapCTypeSubclassWithFinalizer",
7679    sizeof(HeapCTypeSubclassObject),
7680    0,
7681    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
7682    HeapCTypeSubclassWithFinalizer_slots
7683};
7684
7685typedef struct {
7686    PyObject_HEAD
7687    PyObject *dict;
7688} HeapCTypeWithDictObject;
7689
7690static void
7691heapctypewithdict_dealloc(HeapCTypeWithDictObject* self)
7692{
7693
7694    PyTypeObject *tp = Py_TYPE(self);
7695    Py_XDECREF(self->dict);
7696    PyObject_Free(self);
7697    Py_DECREF(tp);
7698}
7699
7700static PyGetSetDef heapctypewithdict_getsetlist[] = {
7701    {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
7702    {NULL} /* Sentinel */
7703};
7704
7705static struct PyMemberDef heapctypewithdict_members[] = {
7706    {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
7707    {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY},
7708    {NULL} /* Sentinel */
7709};
7710
7711static PyType_Slot HeapCTypeWithDict_slots[] = {
7712    {Py_tp_members, heapctypewithdict_members},
7713    {Py_tp_getset, heapctypewithdict_getsetlist},
7714    {Py_tp_dealloc, heapctypewithdict_dealloc},
7715    {0, 0},
7716};
7717
7718static PyType_Spec HeapCTypeWithDict_spec = {
7719    "_testcapi.HeapCTypeWithDict",
7720    sizeof(HeapCTypeWithDictObject),
7721    0,
7722    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7723    HeapCTypeWithDict_slots
7724};
7725
7726static PyType_Spec HeapCTypeWithDict2_spec = {
7727    "_testcapi.HeapCTypeWithDict2",
7728    sizeof(HeapCTypeWithDictObject),
7729    0,
7730    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7731    HeapCTypeWithDict_slots
7732};
7733
7734static struct PyMemberDef heapctypewithnegativedict_members[] = {
7735    {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
7736    {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY},
7737    {NULL} /* Sentinel */
7738};
7739
7740static PyType_Slot HeapCTypeWithNegativeDict_slots[] = {
7741    {Py_tp_members, heapctypewithnegativedict_members},
7742    {Py_tp_getset, heapctypewithdict_getsetlist},
7743    {Py_tp_dealloc, heapctypewithdict_dealloc},
7744    {0, 0},
7745};
7746
7747static PyType_Spec HeapCTypeWithNegativeDict_spec = {
7748    "_testcapi.HeapCTypeWithNegativeDict",
7749    sizeof(HeapCTypeWithDictObject),
7750    0,
7751    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7752    HeapCTypeWithNegativeDict_slots
7753};
7754
7755typedef struct {
7756    PyObject_HEAD
7757    PyObject *weakreflist;
7758} HeapCTypeWithWeakrefObject;
7759
7760static struct PyMemberDef heapctypewithweakref_members[] = {
7761    {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)},
7762    {"__weaklistoffset__", T_PYSSIZET,
7763      offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY},
7764    {NULL} /* Sentinel */
7765};
7766
7767static void
7768heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self)
7769{
7770
7771    PyTypeObject *tp = Py_TYPE(self);
7772    if (self->weakreflist != NULL)
7773        PyObject_ClearWeakRefs((PyObject *) self);
7774    Py_XDECREF(self->weakreflist);
7775    PyObject_Free(self);
7776    Py_DECREF(tp);
7777}
7778
7779static PyType_Slot HeapCTypeWithWeakref_slots[] = {
7780    {Py_tp_members, heapctypewithweakref_members},
7781    {Py_tp_dealloc, heapctypewithweakref_dealloc},
7782    {0, 0},
7783};
7784
7785static PyType_Spec HeapCTypeWithWeakref_spec = {
7786    "_testcapi.HeapCTypeWithWeakref",
7787    sizeof(HeapCTypeWithWeakrefObject),
7788    0,
7789    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7790    HeapCTypeWithWeakref_slots
7791};
7792
7793static PyType_Spec HeapCTypeWithWeakref2_spec = {
7794    "_testcapi.HeapCTypeWithWeakref2",
7795    sizeof(HeapCTypeWithWeakrefObject),
7796    0,
7797    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7798    HeapCTypeWithWeakref_slots
7799};
7800
7801PyDoc_STRVAR(heapctypesetattr__doc__,
7802"A heap type without GC, but with overridden __setattr__.\n\n"
7803"The 'value' attribute is set to 10 in __init__ and updated via attribute setting.");
7804
7805typedef struct {
7806    PyObject_HEAD
7807    long value;
7808} HeapCTypeSetattrObject;
7809
7810static struct PyMemberDef heapctypesetattr_members[] = {
7811    {"pvalue", T_LONG, offsetof(HeapCTypeSetattrObject, value)},
7812    {NULL} /* Sentinel */
7813};
7814
7815static int
7816heapctypesetattr_init(PyObject *self, PyObject *args, PyObject *kwargs)
7817{
7818    ((HeapCTypeSetattrObject *)self)->value = 10;
7819    return 0;
7820}
7821
7822static void
7823heapctypesetattr_dealloc(HeapCTypeSetattrObject *self)
7824{
7825    PyTypeObject *tp = Py_TYPE(self);
7826    PyObject_Free(self);
7827    Py_DECREF(tp);
7828}
7829
7830static int
7831heapctypesetattr_setattro(HeapCTypeSetattrObject *self, PyObject *attr, PyObject *value)
7832{
7833    PyObject *svalue = PyUnicode_FromString("value");
7834    if (svalue == NULL)
7835        return -1;
7836    int eq = PyObject_RichCompareBool(svalue, attr, Py_EQ);
7837    Py_DECREF(svalue);
7838    if (eq < 0)
7839        return -1;
7840    if (!eq) {
7841        return PyObject_GenericSetAttr((PyObject*) self, attr, value);
7842    }
7843    if (value == NULL) {
7844        self->value = 0;
7845        return 0;
7846    }
7847    PyObject *ivalue = PyNumber_Long(value);
7848    if (ivalue == NULL)
7849        return -1;
7850    long v = PyLong_AsLong(ivalue);
7851    Py_DECREF(ivalue);
7852    if (v == -1 && PyErr_Occurred())
7853        return -1;
7854    self->value = v;
7855    return 0;
7856}
7857
7858static PyType_Slot HeapCTypeSetattr_slots[] = {
7859    {Py_tp_init, heapctypesetattr_init},
7860    {Py_tp_members, heapctypesetattr_members},
7861    {Py_tp_setattro, heapctypesetattr_setattro},
7862    {Py_tp_dealloc, heapctypesetattr_dealloc},
7863    {Py_tp_doc, (char*)heapctypesetattr__doc__},
7864    {0, 0},
7865};
7866
7867static PyType_Spec HeapCTypeSetattr_spec = {
7868    "_testcapi.HeapCTypeSetattr",
7869    sizeof(HeapCTypeSetattrObject),
7870    0,
7871    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7872    HeapCTypeSetattr_slots
7873};
7874
7875static PyMethodDef meth_instance_methods[] = {
7876    {"meth_varargs", meth_varargs, METH_VARARGS},
7877    {"meth_varargs_keywords", _PyCFunction_CAST(meth_varargs_keywords), METH_VARARGS|METH_KEYWORDS},
7878    {"meth_o", meth_o, METH_O},
7879    {"meth_noargs", meth_noargs, METH_NOARGS},
7880    {"meth_fastcall", _PyCFunction_CAST(meth_fastcall), METH_FASTCALL},
7881    {"meth_fastcall_keywords", _PyCFunction_CAST(meth_fastcall_keywords), METH_FASTCALL|METH_KEYWORDS},
7882    {NULL, NULL} /* sentinel */
7883};
7884
7885
7886static PyTypeObject MethInstance_Type = {
7887    PyVarObject_HEAD_INIT(NULL, 0)
7888    "MethInstance",
7889    sizeof(PyObject),
7890    .tp_new = PyType_GenericNew,
7891    .tp_flags = Py_TPFLAGS_DEFAULT,
7892    .tp_methods = meth_instance_methods,
7893    .tp_doc = (char*)PyDoc_STR(
7894        "Class with normal (instance) methods to test calling conventions"),
7895};
7896
7897static PyMethodDef meth_class_methods[] = {
7898    {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS},
7899    {"meth_varargs_keywords", _PyCFunction_CAST(meth_varargs_keywords), METH_VARARGS|METH_KEYWORDS|METH_CLASS},
7900    {"meth_o", meth_o, METH_O|METH_CLASS},
7901    {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS},
7902    {"meth_fastcall", _PyCFunction_CAST(meth_fastcall), METH_FASTCALL|METH_CLASS},
7903    {"meth_fastcall_keywords", _PyCFunction_CAST(meth_fastcall_keywords), METH_FASTCALL|METH_KEYWORDS|METH_CLASS},
7904    {NULL, NULL} /* sentinel */
7905};
7906
7907
7908static PyTypeObject MethClass_Type = {
7909    PyVarObject_HEAD_INIT(NULL, 0)
7910    "MethClass",
7911    sizeof(PyObject),
7912    .tp_new = PyType_GenericNew,
7913    .tp_flags = Py_TPFLAGS_DEFAULT,
7914    .tp_methods = meth_class_methods,
7915    .tp_doc = PyDoc_STR(
7916        "Class with class methods to test calling conventions"),
7917};
7918
7919static PyMethodDef meth_static_methods[] = {
7920    {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC},
7921    {"meth_varargs_keywords", _PyCFunction_CAST(meth_varargs_keywords), METH_VARARGS|METH_KEYWORDS|METH_STATIC},
7922    {"meth_o", meth_o, METH_O|METH_STATIC},
7923    {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC},
7924    {"meth_fastcall", _PyCFunction_CAST(meth_fastcall), METH_FASTCALL|METH_STATIC},
7925    {"meth_fastcall_keywords", _PyCFunction_CAST(meth_fastcall_keywords), METH_FASTCALL|METH_KEYWORDS|METH_STATIC},
7926    {NULL, NULL} /* sentinel */
7927};
7928
7929
7930static PyTypeObject MethStatic_Type = {
7931    PyVarObject_HEAD_INIT(NULL, 0)
7932    "MethStatic",
7933    sizeof(PyObject),
7934    .tp_new = PyType_GenericNew,
7935    .tp_flags = Py_TPFLAGS_DEFAULT,
7936    .tp_methods = meth_static_methods,
7937    .tp_doc = PyDoc_STR(
7938        "Class with static methods to test calling conventions"),
7939};
7940
7941/* ContainerNoGC -- a simple container without GC methods */
7942
7943typedef struct {
7944    PyObject_HEAD
7945    PyObject *value;
7946} ContainerNoGCobject;
7947
7948static PyObject *
7949ContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
7950{
7951    PyObject *value;
7952    char *names[] = {"value", NULL};
7953    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) {
7954        return NULL;
7955    }
7956    PyObject *self = type->tp_alloc(type, 0);
7957    if (self == NULL) {
7958        return NULL;
7959    }
7960    Py_INCREF(value);
7961    ((ContainerNoGCobject *)self)->value = value;
7962    return self;
7963}
7964
7965static void
7966ContainerNoGC_dealloc(ContainerNoGCobject *self)
7967{
7968    Py_DECREF(self->value);
7969    Py_TYPE(self)->tp_free((PyObject *)self);
7970}
7971
7972static PyMemberDef ContainerNoGC_members[] = {
7973    {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY,
7974     PyDoc_STR("a container value for test purposes")},
7975    {0}
7976};
7977
7978static PyTypeObject ContainerNoGC_type = {
7979    PyVarObject_HEAD_INIT(NULL, 0)
7980    "_testcapi.ContainerNoGC",
7981    sizeof(ContainerNoGCobject),
7982    .tp_dealloc = (destructor)ContainerNoGC_dealloc,
7983    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7984    .tp_members = ContainerNoGC_members,
7985    .tp_new = ContainerNoGC_new,
7986};
7987
7988
7989static struct PyModuleDef _testcapimodule = {
7990    PyModuleDef_HEAD_INIT,
7991    "_testcapi",
7992    NULL,
7993    -1,
7994    TestMethods,
7995    NULL,
7996    NULL,
7997    NULL,
7998    NULL
7999};
8000
8001/* Per PEP 489, this module will not be converted to multi-phase initialization
8002 */
8003
8004PyMODINIT_FUNC
8005PyInit__testcapi(void)
8006{
8007    PyObject *m;
8008
8009    m = PyModule_Create(&_testcapimodule);
8010    if (m == NULL)
8011        return NULL;
8012
8013    Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type);
8014
8015    Py_SET_TYPE(&test_structmembersType, &PyType_Type);
8016    Py_INCREF(&test_structmembersType);
8017    /* don't use a name starting with "test", since we don't want
8018       test_capi to automatically call this */
8019    PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
8020    if (PyType_Ready(&matmulType) < 0)
8021        return NULL;
8022    Py_INCREF(&matmulType);
8023    PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
8024    if (PyType_Ready(&ipowType) < 0) {
8025        return NULL;
8026    }
8027    Py_INCREF(&ipowType);
8028    PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
8029
8030    if (PyType_Ready(&awaitType) < 0)
8031        return NULL;
8032    Py_INCREF(&awaitType);
8033    PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
8034
8035    MyList_Type.tp_base = &PyList_Type;
8036    if (PyType_Ready(&MyList_Type) < 0)
8037        return NULL;
8038    Py_INCREF(&MyList_Type);
8039    PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
8040
8041    if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
8042        return NULL;
8043    Py_INCREF(&MethodDescriptorBase_Type);
8044    PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
8045
8046    MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
8047    if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
8048        return NULL;
8049    Py_INCREF(&MethodDescriptorDerived_Type);
8050    PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
8051
8052    MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
8053    if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
8054        return NULL;
8055    Py_INCREF(&MethodDescriptorNopGet_Type);
8056    PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
8057
8058    MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
8059    if (PyType_Ready(&MethodDescriptor2_Type) < 0)
8060        return NULL;
8061    Py_INCREF(&MethodDescriptor2_Type);
8062    PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
8063
8064    if (PyType_Ready(&GenericAlias_Type) < 0)
8065        return NULL;
8066    Py_INCREF(&GenericAlias_Type);
8067    PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
8068
8069    if (PyType_Ready(&Generic_Type) < 0)
8070        return NULL;
8071    Py_INCREF(&Generic_Type);
8072    PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
8073
8074    if (PyType_Ready(&MethInstance_Type) < 0)
8075        return NULL;
8076    Py_INCREF(&MethInstance_Type);
8077    PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type);
8078
8079    if (PyType_Ready(&MethClass_Type) < 0)
8080        return NULL;
8081    Py_INCREF(&MethClass_Type);
8082    PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type);
8083
8084    if (PyType_Ready(&MethStatic_Type) < 0)
8085        return NULL;
8086    Py_INCREF(&MethStatic_Type);
8087    PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type);
8088
8089    PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
8090    if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
8091        return NULL;
8092    }
8093    Py_INCREF(&PyRecursingInfinitelyError_Type);
8094    PyModule_AddObject(m, "RecursingInfinitelyError",
8095                       (PyObject *)&PyRecursingInfinitelyError_Type);
8096
8097    PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
8098    PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
8099    PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
8100    PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
8101    PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
8102    PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
8103    PyModule_AddObject(m, "INT_MAX",  PyLong_FromLong(INT_MAX));
8104    PyModule_AddObject(m, "INT_MIN",  PyLong_FromLong(INT_MIN));
8105    PyModule_AddObject(m, "UINT_MAX",  PyLong_FromUnsignedLong(UINT_MAX));
8106    PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
8107    PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
8108    PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
8109    PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
8110    PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
8111    PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
8112    PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
8113    PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX));
8114    PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN));
8115    PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX));
8116    PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
8117    PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
8118    PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
8119    PyModule_AddObject(m, "Py_Version", PyLong_FromUnsignedLong(Py_Version));
8120    Py_INCREF(&PyInstanceMethod_Type);
8121    PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
8122
8123    PyModule_AddIntConstant(m, "the_number_three", 3);
8124    PyObject *v;
8125#ifdef WITH_PYMALLOC
8126    v = Py_True;
8127#else
8128    v = Py_False;
8129#endif
8130    Py_INCREF(v);
8131    PyModule_AddObject(m, "WITH_PYMALLOC", v);
8132
8133    TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
8134    Py_INCREF(TestError);
8135    PyModule_AddObject(m, "error", TestError);
8136
8137    PyObject *HeapDocCType = PyType_FromSpec(&HeapDocCType_spec);
8138    if (HeapDocCType == NULL) {
8139        return NULL;
8140    }
8141    PyModule_AddObject(m, "HeapDocCType", HeapDocCType);
8142
8143    /* bpo-41832: Add a new type to test PyType_FromSpec()
8144       now can accept a NULL tp_doc slot. */
8145    PyObject *NullTpDocType = PyType_FromSpec(&NullTpDocType_spec);
8146    if (NullTpDocType == NULL) {
8147        return NULL;
8148    }
8149    PyModule_AddObject(m, "NullTpDocType", NullTpDocType);
8150
8151    PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
8152    if (HeapGcCType == NULL) {
8153        return NULL;
8154    }
8155    PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
8156
8157    PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
8158    if (HeapCType == NULL) {
8159        return NULL;
8160    }
8161    PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
8162    if (subclass_bases == NULL) {
8163        return NULL;
8164    }
8165    PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
8166    if (HeapCTypeSubclass == NULL) {
8167        return NULL;
8168    }
8169    Py_DECREF(subclass_bases);
8170    PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
8171
8172    PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec);
8173    if (HeapCTypeWithDict == NULL) {
8174        return NULL;
8175    }
8176    PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict);
8177
8178    PyObject *HeapCTypeWithDict2 = PyType_FromSpec(&HeapCTypeWithDict2_spec);
8179    if (HeapCTypeWithDict2 == NULL) {
8180        return NULL;
8181    }
8182    PyModule_AddObject(m, "HeapCTypeWithDict2", HeapCTypeWithDict2);
8183
8184    PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
8185    if (HeapCTypeWithNegativeDict == NULL) {
8186        return NULL;
8187    }
8188    PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict);
8189
8190    PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec);
8191    if (HeapCTypeWithWeakref == NULL) {
8192        return NULL;
8193    }
8194    PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref);
8195
8196    PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec);
8197    if (HeapCTypeWithBuffer == NULL) {
8198        return NULL;
8199    }
8200    PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer);
8201
8202    PyObject *HeapCTypeWithWeakref2 = PyType_FromSpec(&HeapCTypeWithWeakref2_spec);
8203    if (HeapCTypeWithWeakref2 == NULL) {
8204        return NULL;
8205    }
8206    PyModule_AddObject(m, "HeapCTypeWithWeakref2", HeapCTypeWithWeakref2);
8207
8208    PyObject *HeapCTypeSetattr = PyType_FromSpec(&HeapCTypeSetattr_spec);
8209    if (HeapCTypeSetattr == NULL) {
8210        return NULL;
8211    }
8212    PyModule_AddObject(m, "HeapCTypeSetattr", HeapCTypeSetattr);
8213
8214    PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
8215    if (subclass_with_finalizer_bases == NULL) {
8216        return NULL;
8217    }
8218    PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
8219        &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
8220    if (HeapCTypeSubclassWithFinalizer == NULL) {
8221        return NULL;
8222    }
8223    Py_DECREF(subclass_with_finalizer_bases);
8224    PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
8225
8226    if (PyType_Ready(&ContainerNoGC_type) < 0) {
8227        return NULL;
8228    }
8229    Py_INCREF(&ContainerNoGC_type);
8230    if (PyModule_AddObject(m, "ContainerNoGC",
8231                           (PyObject *) &ContainerNoGC_type) < 0)
8232        return NULL;
8233
8234    PyState_AddModule(m, &_testcapimodule);
8235    return m;
8236}
8237
8238static PyObject *
8239negative_dictoffset(PyObject *self, PyObject *Py_UNUSED(ignored))
8240{
8241    return PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
8242}
8243
8244/* Test the C API exposed when PY_SSIZE_T_CLEAN is not defined */
8245
8246#undef Py_BuildValue
8247PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
8248
8249static PyObject *
8250test_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
8251{
8252    PyObject *res;
8253    const char str[] = "string";
8254    const Py_UNICODE unicode[] = L"unicode";
8255    assert(!PyErr_Occurred());
8256
8257    res = Py_BuildValue("(s#O)", str, 1, Py_None);
8258    assert(res == NULL);
8259    if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
8260        return NULL;
8261    }
8262    PyErr_Clear();
8263
8264    res = Py_BuildValue("(z#O)", str, 1, Py_None);
8265    assert(res == NULL);
8266    if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
8267        return NULL;
8268    }
8269    PyErr_Clear();
8270
8271    res = Py_BuildValue("(y#O)", str, 1, Py_None);
8272    assert(res == NULL);
8273    if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
8274        return NULL;
8275    }
8276    PyErr_Clear();
8277
8278    res = Py_BuildValue("(u#O)", unicode, 1, Py_None);
8279    assert(res == NULL);
8280    if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
8281        return NULL;
8282    }
8283    PyErr_Clear();
8284
8285
8286    Py_RETURN_NONE;
8287}
8288
8289#undef PyArg_ParseTupleAndKeywords
8290PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
8291                                            const char *, char **, ...);
8292
8293static PyObject *
8294getargs_s_hash_int(PyObject *self, PyObject *args, PyObject *kwargs)
8295{
8296    static char *keywords[] = {"", "", "x", NULL};
8297    Py_buffer buf = {NULL};
8298    const char *s;
8299    int len;
8300    int i = 0;
8301    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "w*|s#i", keywords, &buf, &s, &len, &i))
8302        return NULL;
8303    PyBuffer_Release(&buf);
8304    Py_RETURN_NONE;
8305}
8306
8307static PyObject *
8308getargs_s_hash_int2(PyObject *self, PyObject *args, PyObject *kwargs)
8309{
8310    static char *keywords[] = {"", "", "x", NULL};
8311    Py_buffer buf = {NULL};
8312    const char *s;
8313    int len;
8314    int i = 0;
8315    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "w*|(s#)i", keywords, &buf, &s, &len, &i))
8316        return NULL;
8317    PyBuffer_Release(&buf);
8318    Py_RETURN_NONE;
8319}
8320
8321static PyObject *
8322gh_99240_clear_args(PyObject *self, PyObject *args)
8323{
8324    char *a = NULL;
8325    char *b = NULL;
8326
8327    if (!PyArg_ParseTuple(args, "eses", "idna", &a, "idna", &b)) {
8328        if (a || b) {
8329            PyErr_Clear();
8330            PyErr_SetString(PyExc_AssertionError, "Arguments are not cleared.");
8331        }
8332        return NULL;
8333    }
8334    PyMem_Free(a);
8335    PyMem_Free(b);
8336    Py_RETURN_NONE;
8337}
8338