17db96d56Sopenharmony_ci/*
27db96d56Sopenharmony_ci * C Extension module to test Python interpreter C APIs.
37db96d56Sopenharmony_ci *
47db96d56Sopenharmony_ci * The 'test_*' functions exported by this module are run as part of the
57db96d56Sopenharmony_ci * standard Python regression test, via Lib/test/test_capi.py.
67db96d56Sopenharmony_ci */
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci/* This module tests the public (Include/ and Include/cpython/) C API.
97db96d56Sopenharmony_ci   The internal C API must not be used here: use _testinternalcapi for that.
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci   The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE
127db96d56Sopenharmony_ci   macro defined, but only the public C API must be tested here. */
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci#undef Py_BUILD_CORE_MODULE
157db96d56Sopenharmony_ci#undef Py_BUILD_CORE_BUILTIN
167db96d56Sopenharmony_ci#define NEEDS_PY_IDENTIFIER
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci/* Always enable assertions */
197db96d56Sopenharmony_ci#undef NDEBUG
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci#define PY_SSIZE_T_CLEAN
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci#include "Python.h"
247db96d56Sopenharmony_ci#include "datetime.h"             // PyDateTimeAPI
257db96d56Sopenharmony_ci#include "frameobject.h"          // PyFrame_New
267db96d56Sopenharmony_ci#include "marshal.h"              // PyMarshal_WriteLongToFile
277db96d56Sopenharmony_ci#include "structmember.h"         // PyMemberDef
287db96d56Sopenharmony_ci#include <float.h>                // FLT_MAX
297db96d56Sopenharmony_ci#include <signal.h>
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci#ifdef MS_WINDOWS
327db96d56Sopenharmony_ci#  include <winsock2.h>           // struct timeval
337db96d56Sopenharmony_ci#endif
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci#ifdef HAVE_SYS_WAIT_H
367db96d56Sopenharmony_ci#include <sys/wait.h>             // W_STOPCODE
377db96d56Sopenharmony_ci#endif
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci#ifdef Py_BUILD_CORE
407db96d56Sopenharmony_ci#  error "_testcapi must test the public Python C API, not CPython internal C API"
417db96d56Sopenharmony_ci#endif
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci#ifdef bool
447db96d56Sopenharmony_ci#  error "The public headers should not include <stdbool.h>, see bpo-46748"
457db96d56Sopenharmony_ci#endif
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ci// Forward declarations
487db96d56Sopenharmony_cistatic struct PyModuleDef _testcapimodule;
497db96d56Sopenharmony_cistatic PyType_Spec HeapTypeNameType_Spec;
507db96d56Sopenharmony_cistatic PyObject *TestError;     /* set to exception object in init */
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci/* Raise TestError with test_name + ": " + msg, and return NULL. */
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_cistatic PyObject *
567db96d56Sopenharmony_ciraiseTestError(const char* test_name, const char* msg)
577db96d56Sopenharmony_ci{
587db96d56Sopenharmony_ci    PyErr_Format(TestError, "%s: %s", test_name, msg);
597db96d56Sopenharmony_ci    return NULL;
607db96d56Sopenharmony_ci}
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci   The ones derived from autoconf on the UNIX-like OSes can be relied
657db96d56Sopenharmony_ci   upon (in the absence of sloppy cross-compiling), but the Windows
667db96d56Sopenharmony_ci   platforms have these hardcoded.  Better safe than sorry.
677db96d56Sopenharmony_ci*/
687db96d56Sopenharmony_cistatic PyObject*
697db96d56Sopenharmony_cisizeof_error(const char* fatname, const char* typname,
707db96d56Sopenharmony_ci    int expected, int got)
717db96d56Sopenharmony_ci{
727db96d56Sopenharmony_ci    PyErr_Format(TestError,
737db96d56Sopenharmony_ci        "%s #define == %d but sizeof(%s) == %d",
747db96d56Sopenharmony_ci        fatname, expected, typname, got);
757db96d56Sopenharmony_ci    return (PyObject*)NULL;
767db96d56Sopenharmony_ci}
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_cistatic PyObject*
797db96d56Sopenharmony_citest_config(PyObject *self, PyObject *Py_UNUSED(ignored))
807db96d56Sopenharmony_ci{
817db96d56Sopenharmony_ci#define CHECK_SIZEOF(FATNAME, TYPE) \
827db96d56Sopenharmony_ci            if (FATNAME != sizeof(TYPE)) \
837db96d56Sopenharmony_ci                return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci    CHECK_SIZEOF(SIZEOF_SHORT, short);
867db96d56Sopenharmony_ci    CHECK_SIZEOF(SIZEOF_INT, int);
877db96d56Sopenharmony_ci    CHECK_SIZEOF(SIZEOF_LONG, long);
887db96d56Sopenharmony_ci    CHECK_SIZEOF(SIZEOF_VOID_P, void*);
897db96d56Sopenharmony_ci    CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
907db96d56Sopenharmony_ci    CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci#undef CHECK_SIZEOF
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci    Py_RETURN_NONE;
957db96d56Sopenharmony_ci}
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_cistatic PyObject*
987db96d56Sopenharmony_citest_sizeof_c_types(PyObject *self, PyObject *Py_UNUSED(ignored))
997db96d56Sopenharmony_ci{
1007db96d56Sopenharmony_ci#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
1017db96d56Sopenharmony_ci#pragma GCC diagnostic push
1027db96d56Sopenharmony_ci#pragma GCC diagnostic ignored "-Wtype-limits"
1037db96d56Sopenharmony_ci#endif
1047db96d56Sopenharmony_ci#define CHECK_SIZEOF(TYPE, EXPECTED)         \
1057db96d56Sopenharmony_ci    if (EXPECTED != sizeof(TYPE))  {         \
1067db96d56Sopenharmony_ci        PyErr_Format(TestError,              \
1077db96d56Sopenharmony_ci            "sizeof(%s) = %u instead of %u", \
1087db96d56Sopenharmony_ci            #TYPE, sizeof(TYPE), EXPECTED);  \
1097db96d56Sopenharmony_ci        return (PyObject*)NULL;              \
1107db96d56Sopenharmony_ci    }
1117db96d56Sopenharmony_ci#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
1127db96d56Sopenharmony_ci#define CHECK_SIGNNESS(TYPE, SIGNED)         \
1137db96d56Sopenharmony_ci    if (IS_SIGNED(TYPE) != SIGNED) {         \
1147db96d56Sopenharmony_ci        PyErr_Format(TestError,              \
1157db96d56Sopenharmony_ci            "%s signness is, instead of %i",  \
1167db96d56Sopenharmony_ci            #TYPE, IS_SIGNED(TYPE), SIGNED); \
1177db96d56Sopenharmony_ci        return (PyObject*)NULL;              \
1187db96d56Sopenharmony_ci    }
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci    /* integer types */
1217db96d56Sopenharmony_ci    CHECK_SIZEOF(Py_UCS1, 1);
1227db96d56Sopenharmony_ci    CHECK_SIZEOF(Py_UCS2, 2);
1237db96d56Sopenharmony_ci    CHECK_SIZEOF(Py_UCS4, 4);
1247db96d56Sopenharmony_ci    CHECK_SIGNNESS(Py_UCS1, 0);
1257db96d56Sopenharmony_ci    CHECK_SIGNNESS(Py_UCS2, 0);
1267db96d56Sopenharmony_ci    CHECK_SIGNNESS(Py_UCS4, 0);
1277db96d56Sopenharmony_ci    CHECK_SIZEOF(int32_t, 4);
1287db96d56Sopenharmony_ci    CHECK_SIGNNESS(int32_t, 1);
1297db96d56Sopenharmony_ci    CHECK_SIZEOF(uint32_t, 4);
1307db96d56Sopenharmony_ci    CHECK_SIGNNESS(uint32_t, 0);
1317db96d56Sopenharmony_ci    CHECK_SIZEOF(int64_t, 8);
1327db96d56Sopenharmony_ci    CHECK_SIGNNESS(int64_t, 1);
1337db96d56Sopenharmony_ci    CHECK_SIZEOF(uint64_t, 8);
1347db96d56Sopenharmony_ci    CHECK_SIGNNESS(uint64_t, 0);
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci    /* pointer/size types */
1377db96d56Sopenharmony_ci    CHECK_SIZEOF(size_t, sizeof(void *));
1387db96d56Sopenharmony_ci    CHECK_SIGNNESS(size_t, 0);
1397db96d56Sopenharmony_ci    CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
1407db96d56Sopenharmony_ci    CHECK_SIGNNESS(Py_ssize_t, 1);
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci    CHECK_SIZEOF(uintptr_t, sizeof(void *));
1437db96d56Sopenharmony_ci    CHECK_SIGNNESS(uintptr_t, 0);
1447db96d56Sopenharmony_ci    CHECK_SIZEOF(intptr_t, sizeof(void *));
1457db96d56Sopenharmony_ci    CHECK_SIGNNESS(intptr_t, 1);
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci    Py_RETURN_NONE;
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci#undef IS_SIGNED
1507db96d56Sopenharmony_ci#undef CHECK_SIGNESS
1517db96d56Sopenharmony_ci#undef CHECK_SIZEOF
1527db96d56Sopenharmony_ci#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
1537db96d56Sopenharmony_ci#pragma GCC diagnostic pop
1547db96d56Sopenharmony_ci#endif
1557db96d56Sopenharmony_ci}
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_cistatic PyObject*
1587db96d56Sopenharmony_citest_gc_control(PyObject *self, PyObject *Py_UNUSED(ignored))
1597db96d56Sopenharmony_ci{
1607db96d56Sopenharmony_ci    int orig_enabled = PyGC_IsEnabled();
1617db96d56Sopenharmony_ci    const char* msg = "ok";
1627db96d56Sopenharmony_ci    int old_state;
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci    old_state = PyGC_Enable();
1657db96d56Sopenharmony_ci    msg = "Enable(1)";
1667db96d56Sopenharmony_ci    if (old_state != orig_enabled) {
1677db96d56Sopenharmony_ci        goto failed;
1687db96d56Sopenharmony_ci    }
1697db96d56Sopenharmony_ci    msg = "IsEnabled(1)";
1707db96d56Sopenharmony_ci    if (!PyGC_IsEnabled()) {
1717db96d56Sopenharmony_ci        goto failed;
1727db96d56Sopenharmony_ci    }
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci    old_state = PyGC_Disable();
1757db96d56Sopenharmony_ci    msg = "disable(2)";
1767db96d56Sopenharmony_ci    if (!old_state) {
1777db96d56Sopenharmony_ci        goto failed;
1787db96d56Sopenharmony_ci    }
1797db96d56Sopenharmony_ci    msg = "IsEnabled(2)";
1807db96d56Sopenharmony_ci    if (PyGC_IsEnabled()) {
1817db96d56Sopenharmony_ci        goto failed;
1827db96d56Sopenharmony_ci    }
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci    old_state = PyGC_Enable();
1857db96d56Sopenharmony_ci    msg = "enable(3)";
1867db96d56Sopenharmony_ci    if (old_state) {
1877db96d56Sopenharmony_ci        goto failed;
1887db96d56Sopenharmony_ci    }
1897db96d56Sopenharmony_ci    msg = "IsEnabled(3)";
1907db96d56Sopenharmony_ci    if (!PyGC_IsEnabled()) {
1917db96d56Sopenharmony_ci        goto failed;
1927db96d56Sopenharmony_ci    }
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci    if (!orig_enabled) {
1957db96d56Sopenharmony_ci        old_state = PyGC_Disable();
1967db96d56Sopenharmony_ci        msg = "disable(4)";
1977db96d56Sopenharmony_ci        if (old_state) {
1987db96d56Sopenharmony_ci            goto failed;
1997db96d56Sopenharmony_ci        }
2007db96d56Sopenharmony_ci        msg = "IsEnabled(4)";
2017db96d56Sopenharmony_ci        if (PyGC_IsEnabled()) {
2027db96d56Sopenharmony_ci            goto failed;
2037db96d56Sopenharmony_ci        }
2047db96d56Sopenharmony_ci    }
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci    Py_RETURN_NONE;
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_cifailed:
2097db96d56Sopenharmony_ci    /* Try to clean up if we can. */
2107db96d56Sopenharmony_ci    if (orig_enabled) {
2117db96d56Sopenharmony_ci        PyGC_Enable();
2127db96d56Sopenharmony_ci    } else {
2137db96d56Sopenharmony_ci        PyGC_Disable();
2147db96d56Sopenharmony_ci    }
2157db96d56Sopenharmony_ci    PyErr_Format(TestError, "GC control failed in %s", msg);
2167db96d56Sopenharmony_ci    return NULL;
2177db96d56Sopenharmony_ci}
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_cistatic PyObject*
2207db96d56Sopenharmony_citest_list_api(PyObject *self, PyObject *Py_UNUSED(ignored))
2217db96d56Sopenharmony_ci{
2227db96d56Sopenharmony_ci    PyObject* list;
2237db96d56Sopenharmony_ci    int i;
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci    /* SF bug 132008:  PyList_Reverse segfaults */
2267db96d56Sopenharmony_ci#define NLIST 30
2277db96d56Sopenharmony_ci    list = PyList_New(NLIST);
2287db96d56Sopenharmony_ci    if (list == (PyObject*)NULL)
2297db96d56Sopenharmony_ci        return (PyObject*)NULL;
2307db96d56Sopenharmony_ci    /* list = range(NLIST) */
2317db96d56Sopenharmony_ci    for (i = 0; i < NLIST; ++i) {
2327db96d56Sopenharmony_ci        PyObject* anint = PyLong_FromLong(i);
2337db96d56Sopenharmony_ci        if (anint == (PyObject*)NULL) {
2347db96d56Sopenharmony_ci            Py_DECREF(list);
2357db96d56Sopenharmony_ci            return (PyObject*)NULL;
2367db96d56Sopenharmony_ci        }
2377db96d56Sopenharmony_ci        PyList_SET_ITEM(list, i, anint);
2387db96d56Sopenharmony_ci    }
2397db96d56Sopenharmony_ci    /* list.reverse(), via PyList_Reverse() */
2407db96d56Sopenharmony_ci    i = PyList_Reverse(list);   /* should not blow up! */
2417db96d56Sopenharmony_ci    if (i != 0) {
2427db96d56Sopenharmony_ci        Py_DECREF(list);
2437db96d56Sopenharmony_ci        return (PyObject*)NULL;
2447db96d56Sopenharmony_ci    }
2457db96d56Sopenharmony_ci    /* Check that list == range(29, -1, -1) now */
2467db96d56Sopenharmony_ci    for (i = 0; i < NLIST; ++i) {
2477db96d56Sopenharmony_ci        PyObject* anint = PyList_GET_ITEM(list, i);
2487db96d56Sopenharmony_ci        if (PyLong_AS_LONG(anint) != NLIST-1-i) {
2497db96d56Sopenharmony_ci            PyErr_SetString(TestError,
2507db96d56Sopenharmony_ci                            "test_list_api: reverse screwed up");
2517db96d56Sopenharmony_ci            Py_DECREF(list);
2527db96d56Sopenharmony_ci            return (PyObject*)NULL;
2537db96d56Sopenharmony_ci        }
2547db96d56Sopenharmony_ci    }
2557db96d56Sopenharmony_ci    Py_DECREF(list);
2567db96d56Sopenharmony_ci#undef NLIST
2577db96d56Sopenharmony_ci
2587db96d56Sopenharmony_ci    Py_RETURN_NONE;
2597db96d56Sopenharmony_ci}
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_cistatic int
2627db96d56Sopenharmony_citest_dict_inner(int count)
2637db96d56Sopenharmony_ci{
2647db96d56Sopenharmony_ci    Py_ssize_t pos = 0, iterations = 0;
2657db96d56Sopenharmony_ci    int i;
2667db96d56Sopenharmony_ci    PyObject *dict = PyDict_New();
2677db96d56Sopenharmony_ci    PyObject *v, *k;
2687db96d56Sopenharmony_ci
2697db96d56Sopenharmony_ci    if (dict == NULL)
2707db96d56Sopenharmony_ci        return -1;
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci    for (i = 0; i < count; i++) {
2737db96d56Sopenharmony_ci        v = PyLong_FromLong(i);
2747db96d56Sopenharmony_ci        if (v == NULL) {
2757db96d56Sopenharmony_ci            return -1;
2767db96d56Sopenharmony_ci        }
2777db96d56Sopenharmony_ci        if (PyDict_SetItem(dict, v, v) < 0) {
2787db96d56Sopenharmony_ci            Py_DECREF(v);
2797db96d56Sopenharmony_ci            return -1;
2807db96d56Sopenharmony_ci        }
2817db96d56Sopenharmony_ci        Py_DECREF(v);
2827db96d56Sopenharmony_ci    }
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ci    while (PyDict_Next(dict, &pos, &k, &v)) {
2857db96d56Sopenharmony_ci        PyObject *o;
2867db96d56Sopenharmony_ci        iterations++;
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ci        i = PyLong_AS_LONG(v) + 1;
2897db96d56Sopenharmony_ci        o = PyLong_FromLong(i);
2907db96d56Sopenharmony_ci        if (o == NULL)
2917db96d56Sopenharmony_ci            return -1;
2927db96d56Sopenharmony_ci        if (PyDict_SetItem(dict, k, o) < 0) {
2937db96d56Sopenharmony_ci            Py_DECREF(o);
2947db96d56Sopenharmony_ci            return -1;
2957db96d56Sopenharmony_ci        }
2967db96d56Sopenharmony_ci        Py_DECREF(o);
2977db96d56Sopenharmony_ci    }
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci    Py_DECREF(dict);
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci    if (iterations != count) {
3027db96d56Sopenharmony_ci        PyErr_SetString(
3037db96d56Sopenharmony_ci            TestError,
3047db96d56Sopenharmony_ci            "test_dict_iteration: dict iteration went wrong ");
3057db96d56Sopenharmony_ci        return -1;
3067db96d56Sopenharmony_ci    } else {
3077db96d56Sopenharmony_ci        return 0;
3087db96d56Sopenharmony_ci    }
3097db96d56Sopenharmony_ci}
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_cistatic PyObject*
3127db96d56Sopenharmony_citest_dict_iteration(PyObject* self, PyObject *Py_UNUSED(ignored))
3137db96d56Sopenharmony_ci{
3147db96d56Sopenharmony_ci    int i;
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ci    for (i = 0; i < 200; i++) {
3177db96d56Sopenharmony_ci        if (test_dict_inner(i) < 0) {
3187db96d56Sopenharmony_ci            return NULL;
3197db96d56Sopenharmony_ci        }
3207db96d56Sopenharmony_ci    }
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ci    Py_RETURN_NONE;
3237db96d56Sopenharmony_ci}
3247db96d56Sopenharmony_ci
3257db96d56Sopenharmony_cistatic PyObject*
3267db96d56Sopenharmony_cidict_getitem_knownhash(PyObject *self, PyObject *args)
3277db96d56Sopenharmony_ci{
3287db96d56Sopenharmony_ci    PyObject *mp, *key, *result;
3297db96d56Sopenharmony_ci    Py_ssize_t hash;
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
3327db96d56Sopenharmony_ci                          &mp, &key, &hash)) {
3337db96d56Sopenharmony_ci        return NULL;
3347db96d56Sopenharmony_ci    }
3357db96d56Sopenharmony_ci
3367db96d56Sopenharmony_ci    result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
3377db96d56Sopenharmony_ci    if (result == NULL && !PyErr_Occurred()) {
3387db96d56Sopenharmony_ci        _PyErr_SetKeyError(key);
3397db96d56Sopenharmony_ci        return NULL;
3407db96d56Sopenharmony_ci    }
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci    Py_XINCREF(result);
3437db96d56Sopenharmony_ci    return result;
3447db96d56Sopenharmony_ci}
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci/* Issue #4701: Check that PyObject_Hash implicitly calls
3477db96d56Sopenharmony_ci *   PyType_Ready if it hasn't already been called
3487db96d56Sopenharmony_ci */
3497db96d56Sopenharmony_cistatic PyTypeObject _HashInheritanceTester_Type = {
3507db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
3517db96d56Sopenharmony_ci    "hashinheritancetester",            /* Name of this type */
3527db96d56Sopenharmony_ci    sizeof(PyObject),           /* Basic object size */
3537db96d56Sopenharmony_ci    0,                          /* Item size for varobject */
3547db96d56Sopenharmony_ci    (destructor)PyObject_Del, /* tp_dealloc */
3557db96d56Sopenharmony_ci    0,                          /* tp_vectorcall_offset */
3567db96d56Sopenharmony_ci    0,                          /* tp_getattr */
3577db96d56Sopenharmony_ci    0,                          /* tp_setattr */
3587db96d56Sopenharmony_ci    0,                          /* tp_as_async */
3597db96d56Sopenharmony_ci    0,                          /* tp_repr */
3607db96d56Sopenharmony_ci    0,                          /* tp_as_number */
3617db96d56Sopenharmony_ci    0,                          /* tp_as_sequence */
3627db96d56Sopenharmony_ci    0,                          /* tp_as_mapping */
3637db96d56Sopenharmony_ci    0,                          /* tp_hash */
3647db96d56Sopenharmony_ci    0,                          /* tp_call */
3657db96d56Sopenharmony_ci    0,                          /* tp_str */
3667db96d56Sopenharmony_ci    PyObject_GenericGetAttr,  /* tp_getattro */
3677db96d56Sopenharmony_ci    0,                          /* tp_setattro */
3687db96d56Sopenharmony_ci    0,                          /* tp_as_buffer */
3697db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT,         /* tp_flags */
3707db96d56Sopenharmony_ci    0,                          /* tp_doc */
3717db96d56Sopenharmony_ci    0,                          /* tp_traverse */
3727db96d56Sopenharmony_ci    0,                          /* tp_clear */
3737db96d56Sopenharmony_ci    0,                          /* tp_richcompare */
3747db96d56Sopenharmony_ci    0,                          /* tp_weaklistoffset */
3757db96d56Sopenharmony_ci    0,                          /* tp_iter */
3767db96d56Sopenharmony_ci    0,                          /* tp_iternext */
3777db96d56Sopenharmony_ci    0,                          /* tp_methods */
3787db96d56Sopenharmony_ci    0,                          /* tp_members */
3797db96d56Sopenharmony_ci    0,                          /* tp_getset */
3807db96d56Sopenharmony_ci    0,                          /* tp_base */
3817db96d56Sopenharmony_ci    0,                          /* tp_dict */
3827db96d56Sopenharmony_ci    0,                          /* tp_descr_get */
3837db96d56Sopenharmony_ci    0,                          /* tp_descr_set */
3847db96d56Sopenharmony_ci    0,                          /* tp_dictoffset */
3857db96d56Sopenharmony_ci    0,                          /* tp_init */
3867db96d56Sopenharmony_ci    0,                          /* tp_alloc */
3877db96d56Sopenharmony_ci    PyType_GenericNew,                  /* tp_new */
3887db96d56Sopenharmony_ci};
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_cistatic PyObject*
3917db96d56Sopenharmony_cipycompilestring(PyObject* self, PyObject *obj) {
3927db96d56Sopenharmony_ci    if (PyBytes_CheckExact(obj) == 0) {
3937db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "Argument must be a bytes object");
3947db96d56Sopenharmony_ci        return NULL;
3957db96d56Sopenharmony_ci    }
3967db96d56Sopenharmony_ci    const char *the_string = PyBytes_AsString(obj);
3977db96d56Sopenharmony_ci    if (the_string == NULL) {
3987db96d56Sopenharmony_ci        return NULL;
3997db96d56Sopenharmony_ci    }
4007db96d56Sopenharmony_ci    return Py_CompileString(the_string, "<string>", Py_file_input);
4017db96d56Sopenharmony_ci}
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_cistatic PyObject*
4047db96d56Sopenharmony_citest_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
4057db96d56Sopenharmony_ci{
4067db96d56Sopenharmony_ci    PyTypeObject *type;
4077db96d56Sopenharmony_ci    PyObject *obj;
4087db96d56Sopenharmony_ci    Py_hash_t hash;
4097db96d56Sopenharmony_ci
4107db96d56Sopenharmony_ci    type = &_HashInheritanceTester_Type;
4117db96d56Sopenharmony_ci
4127db96d56Sopenharmony_ci    if (type->tp_dict != NULL)
4137db96d56Sopenharmony_ci        /* The type has already been initialized. This probably means
4147db96d56Sopenharmony_ci           -R is being used. */
4157db96d56Sopenharmony_ci        Py_RETURN_NONE;
4167db96d56Sopenharmony_ci
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci    obj = PyObject_New(PyObject, type);
4197db96d56Sopenharmony_ci    if (obj == NULL) {
4207db96d56Sopenharmony_ci        PyErr_Clear();
4217db96d56Sopenharmony_ci        PyErr_SetString(
4227db96d56Sopenharmony_ci            TestError,
4237db96d56Sopenharmony_ci            "test_lazy_hash_inheritance: failed to create object");
4247db96d56Sopenharmony_ci        return NULL;
4257db96d56Sopenharmony_ci    }
4267db96d56Sopenharmony_ci
4277db96d56Sopenharmony_ci    if (type->tp_dict != NULL) {
4287db96d56Sopenharmony_ci        PyErr_SetString(
4297db96d56Sopenharmony_ci            TestError,
4307db96d56Sopenharmony_ci            "test_lazy_hash_inheritance: type initialised too soon");
4317db96d56Sopenharmony_ci        Py_DECREF(obj);
4327db96d56Sopenharmony_ci        return NULL;
4337db96d56Sopenharmony_ci    }
4347db96d56Sopenharmony_ci
4357db96d56Sopenharmony_ci    hash = PyObject_Hash(obj);
4367db96d56Sopenharmony_ci    if ((hash == -1) && PyErr_Occurred()) {
4377db96d56Sopenharmony_ci        PyErr_Clear();
4387db96d56Sopenharmony_ci        PyErr_SetString(
4397db96d56Sopenharmony_ci            TestError,
4407db96d56Sopenharmony_ci            "test_lazy_hash_inheritance: could not hash object");
4417db96d56Sopenharmony_ci        Py_DECREF(obj);
4427db96d56Sopenharmony_ci        return NULL;
4437db96d56Sopenharmony_ci    }
4447db96d56Sopenharmony_ci
4457db96d56Sopenharmony_ci    if (type->tp_dict == NULL) {
4467db96d56Sopenharmony_ci        PyErr_SetString(
4477db96d56Sopenharmony_ci            TestError,
4487db96d56Sopenharmony_ci            "test_lazy_hash_inheritance: type not initialised by hash()");
4497db96d56Sopenharmony_ci        Py_DECREF(obj);
4507db96d56Sopenharmony_ci        return NULL;
4517db96d56Sopenharmony_ci    }
4527db96d56Sopenharmony_ci
4537db96d56Sopenharmony_ci    if (type->tp_hash != PyType_Type.tp_hash) {
4547db96d56Sopenharmony_ci        PyErr_SetString(
4557db96d56Sopenharmony_ci            TestError,
4567db96d56Sopenharmony_ci            "test_lazy_hash_inheritance: unexpected hash function");
4577db96d56Sopenharmony_ci        Py_DECREF(obj);
4587db96d56Sopenharmony_ci        return NULL;
4597db96d56Sopenharmony_ci    }
4607db96d56Sopenharmony_ci
4617db96d56Sopenharmony_ci    Py_DECREF(obj);
4627db96d56Sopenharmony_ci
4637db96d56Sopenharmony_ci    Py_RETURN_NONE;
4647db96d56Sopenharmony_ci}
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
4687db96d56Sopenharmony_ci   PyLong_{As, From}{Unsigned,}LongLong().
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci   Note that the meat of the test is contained in testcapi_long.h.
4717db96d56Sopenharmony_ci   This is revolting, but delicate code duplication is worse:  "almost
4727db96d56Sopenharmony_ci   exactly the same" code is needed to test long long, but the ubiquitous
4737db96d56Sopenharmony_ci   dependence on type names makes it impossible to use a parameterized
4747db96d56Sopenharmony_ci   function.  A giant macro would be even worse than this.  A C++ template
4757db96d56Sopenharmony_ci   would be perfect.
4767db96d56Sopenharmony_ci
4777db96d56Sopenharmony_ci   The "report an error" functions are deliberately not part of the #include
4787db96d56Sopenharmony_ci   file:  if the test fails, you can set a breakpoint in the appropriate
4797db96d56Sopenharmony_ci   error function directly, and crawl back from there in the debugger.
4807db96d56Sopenharmony_ci*/
4817db96d56Sopenharmony_ci
4827db96d56Sopenharmony_ci#define UNBIND(X)  Py_DECREF(X); (X) = NULL
4837db96d56Sopenharmony_ci
4847db96d56Sopenharmony_cistatic PyObject *
4857db96d56Sopenharmony_ciraise_test_long_error(const char* msg)
4867db96d56Sopenharmony_ci{
4877db96d56Sopenharmony_ci    return raiseTestError("test_long_api", msg);
4887db96d56Sopenharmony_ci}
4897db96d56Sopenharmony_ci
4907db96d56Sopenharmony_ci#define TESTNAME        test_long_api_inner
4917db96d56Sopenharmony_ci#define TYPENAME        long
4927db96d56Sopenharmony_ci#define F_S_TO_PY       PyLong_FromLong
4937db96d56Sopenharmony_ci#define F_PY_TO_S       PyLong_AsLong
4947db96d56Sopenharmony_ci#define F_U_TO_PY       PyLong_FromUnsignedLong
4957db96d56Sopenharmony_ci#define F_PY_TO_U       PyLong_AsUnsignedLong
4967db96d56Sopenharmony_ci
4977db96d56Sopenharmony_ci#include "testcapi_long.h"
4987db96d56Sopenharmony_ci
4997db96d56Sopenharmony_cistatic PyObject *
5007db96d56Sopenharmony_citest_long_api(PyObject* self, PyObject *Py_UNUSED(ignored))
5017db96d56Sopenharmony_ci{
5027db96d56Sopenharmony_ci    return TESTNAME(raise_test_long_error);
5037db96d56Sopenharmony_ci}
5047db96d56Sopenharmony_ci
5057db96d56Sopenharmony_ci#undef TESTNAME
5067db96d56Sopenharmony_ci#undef TYPENAME
5077db96d56Sopenharmony_ci#undef F_S_TO_PY
5087db96d56Sopenharmony_ci#undef F_PY_TO_S
5097db96d56Sopenharmony_ci#undef F_U_TO_PY
5107db96d56Sopenharmony_ci#undef F_PY_TO_U
5117db96d56Sopenharmony_ci
5127db96d56Sopenharmony_cistatic PyObject *
5137db96d56Sopenharmony_ciraise_test_longlong_error(const char* msg)
5147db96d56Sopenharmony_ci{
5157db96d56Sopenharmony_ci    return raiseTestError("test_longlong_api", msg);
5167db96d56Sopenharmony_ci}
5177db96d56Sopenharmony_ci
5187db96d56Sopenharmony_ci#define TESTNAME        test_longlong_api_inner
5197db96d56Sopenharmony_ci#define TYPENAME        long long
5207db96d56Sopenharmony_ci#define F_S_TO_PY       PyLong_FromLongLong
5217db96d56Sopenharmony_ci#define F_PY_TO_S       PyLong_AsLongLong
5227db96d56Sopenharmony_ci#define F_U_TO_PY       PyLong_FromUnsignedLongLong
5237db96d56Sopenharmony_ci#define F_PY_TO_U       PyLong_AsUnsignedLongLong
5247db96d56Sopenharmony_ci
5257db96d56Sopenharmony_ci#include "testcapi_long.h"
5267db96d56Sopenharmony_ci
5277db96d56Sopenharmony_cistatic PyObject *
5287db96d56Sopenharmony_citest_longlong_api(PyObject* self, PyObject *args)
5297db96d56Sopenharmony_ci{
5307db96d56Sopenharmony_ci    return TESTNAME(raise_test_longlong_error);
5317db96d56Sopenharmony_ci}
5327db96d56Sopenharmony_ci
5337db96d56Sopenharmony_ci#undef TESTNAME
5347db96d56Sopenharmony_ci#undef TYPENAME
5357db96d56Sopenharmony_ci#undef F_S_TO_PY
5367db96d56Sopenharmony_ci#undef F_PY_TO_S
5377db96d56Sopenharmony_ci#undef F_U_TO_PY
5387db96d56Sopenharmony_ci#undef F_PY_TO_U
5397db96d56Sopenharmony_ci
5407db96d56Sopenharmony_ci/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
5417db96d56Sopenharmony_ci   is tested by test_long_api_inner. This test will concentrate on proper
5427db96d56Sopenharmony_ci   handling of overflow.
5437db96d56Sopenharmony_ci*/
5447db96d56Sopenharmony_ci
5457db96d56Sopenharmony_cistatic PyObject *
5467db96d56Sopenharmony_citest_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
5477db96d56Sopenharmony_ci{
5487db96d56Sopenharmony_ci    PyObject *num, *one, *temp;
5497db96d56Sopenharmony_ci    long value;
5507db96d56Sopenharmony_ci    int overflow;
5517db96d56Sopenharmony_ci
5527db96d56Sopenharmony_ci    /* Test that overflow is set properly for a large value. */
5537db96d56Sopenharmony_ci    /* num is a number larger than LONG_MAX even on 64-bit platforms */
5547db96d56Sopenharmony_ci    num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
5557db96d56Sopenharmony_ci    if (num == NULL)
5567db96d56Sopenharmony_ci        return NULL;
5577db96d56Sopenharmony_ci    overflow = 1234;
5587db96d56Sopenharmony_ci    value = PyLong_AsLongAndOverflow(num, &overflow);
5597db96d56Sopenharmony_ci    Py_DECREF(num);
5607db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
5617db96d56Sopenharmony_ci        return NULL;
5627db96d56Sopenharmony_ci    if (value != -1)
5637db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
5647db96d56Sopenharmony_ci            "return value was not set to -1");
5657db96d56Sopenharmony_ci    if (overflow != 1)
5667db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
5677db96d56Sopenharmony_ci            "overflow was not set to 1");
5687db96d56Sopenharmony_ci
5697db96d56Sopenharmony_ci    /* Same again, with num = LONG_MAX + 1 */
5707db96d56Sopenharmony_ci    num = PyLong_FromLong(LONG_MAX);
5717db96d56Sopenharmony_ci    if (num == NULL)
5727db96d56Sopenharmony_ci        return NULL;
5737db96d56Sopenharmony_ci    one = PyLong_FromLong(1L);
5747db96d56Sopenharmony_ci    if (one == NULL) {
5757db96d56Sopenharmony_ci        Py_DECREF(num);
5767db96d56Sopenharmony_ci        return NULL;
5777db96d56Sopenharmony_ci    }
5787db96d56Sopenharmony_ci    temp = PyNumber_Add(num, one);
5797db96d56Sopenharmony_ci    Py_DECREF(one);
5807db96d56Sopenharmony_ci    Py_DECREF(num);
5817db96d56Sopenharmony_ci    num = temp;
5827db96d56Sopenharmony_ci    if (num == NULL)
5837db96d56Sopenharmony_ci        return NULL;
5847db96d56Sopenharmony_ci    overflow = 0;
5857db96d56Sopenharmony_ci    value = PyLong_AsLongAndOverflow(num, &overflow);
5867db96d56Sopenharmony_ci    Py_DECREF(num);
5877db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
5887db96d56Sopenharmony_ci        return NULL;
5897db96d56Sopenharmony_ci    if (value != -1)
5907db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
5917db96d56Sopenharmony_ci            "return value was not set to -1");
5927db96d56Sopenharmony_ci    if (overflow != 1)
5937db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
5947db96d56Sopenharmony_ci            "overflow was not set to 1");
5957db96d56Sopenharmony_ci
5967db96d56Sopenharmony_ci    /* Test that overflow is set properly for a large negative value. */
5977db96d56Sopenharmony_ci    /* num is a number smaller than LONG_MIN even on 64-bit platforms */
5987db96d56Sopenharmony_ci    num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
5997db96d56Sopenharmony_ci    if (num == NULL)
6007db96d56Sopenharmony_ci        return NULL;
6017db96d56Sopenharmony_ci    overflow = 1234;
6027db96d56Sopenharmony_ci    value = PyLong_AsLongAndOverflow(num, &overflow);
6037db96d56Sopenharmony_ci    Py_DECREF(num);
6047db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
6057db96d56Sopenharmony_ci        return NULL;
6067db96d56Sopenharmony_ci    if (value != -1)
6077db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
6087db96d56Sopenharmony_ci            "return value was not set to -1");
6097db96d56Sopenharmony_ci    if (overflow != -1)
6107db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
6117db96d56Sopenharmony_ci            "overflow was not set to -1");
6127db96d56Sopenharmony_ci
6137db96d56Sopenharmony_ci    /* Same again, with num = LONG_MIN - 1 */
6147db96d56Sopenharmony_ci    num = PyLong_FromLong(LONG_MIN);
6157db96d56Sopenharmony_ci    if (num == NULL)
6167db96d56Sopenharmony_ci        return NULL;
6177db96d56Sopenharmony_ci    one = PyLong_FromLong(1L);
6187db96d56Sopenharmony_ci    if (one == NULL) {
6197db96d56Sopenharmony_ci        Py_DECREF(num);
6207db96d56Sopenharmony_ci        return NULL;
6217db96d56Sopenharmony_ci    }
6227db96d56Sopenharmony_ci    temp = PyNumber_Subtract(num, one);
6237db96d56Sopenharmony_ci    Py_DECREF(one);
6247db96d56Sopenharmony_ci    Py_DECREF(num);
6257db96d56Sopenharmony_ci    num = temp;
6267db96d56Sopenharmony_ci    if (num == NULL)
6277db96d56Sopenharmony_ci        return NULL;
6287db96d56Sopenharmony_ci    overflow = 0;
6297db96d56Sopenharmony_ci    value = PyLong_AsLongAndOverflow(num, &overflow);
6307db96d56Sopenharmony_ci    Py_DECREF(num);
6317db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
6327db96d56Sopenharmony_ci        return NULL;
6337db96d56Sopenharmony_ci    if (value != -1)
6347db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
6357db96d56Sopenharmony_ci            "return value was not set to -1");
6367db96d56Sopenharmony_ci    if (overflow != -1)
6377db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
6387db96d56Sopenharmony_ci            "overflow was not set to -1");
6397db96d56Sopenharmony_ci
6407db96d56Sopenharmony_ci    /* Test that overflow is cleared properly for small values. */
6417db96d56Sopenharmony_ci    num = PyLong_FromString("FF", NULL, 16);
6427db96d56Sopenharmony_ci    if (num == NULL)
6437db96d56Sopenharmony_ci        return NULL;
6447db96d56Sopenharmony_ci    overflow = 1234;
6457db96d56Sopenharmony_ci    value = PyLong_AsLongAndOverflow(num, &overflow);
6467db96d56Sopenharmony_ci    Py_DECREF(num);
6477db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
6487db96d56Sopenharmony_ci        return NULL;
6497db96d56Sopenharmony_ci    if (value != 0xFF)
6507db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
6517db96d56Sopenharmony_ci            "expected return value 0xFF");
6527db96d56Sopenharmony_ci    if (overflow != 0)
6537db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
6547db96d56Sopenharmony_ci            "overflow was not cleared");
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci    num = PyLong_FromString("-FF", NULL, 16);
6577db96d56Sopenharmony_ci    if (num == NULL)
6587db96d56Sopenharmony_ci        return NULL;
6597db96d56Sopenharmony_ci    overflow = 0;
6607db96d56Sopenharmony_ci    value = PyLong_AsLongAndOverflow(num, &overflow);
6617db96d56Sopenharmony_ci    Py_DECREF(num);
6627db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
6637db96d56Sopenharmony_ci        return NULL;
6647db96d56Sopenharmony_ci    if (value != -0xFF)
6657db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
6667db96d56Sopenharmony_ci            "expected return value 0xFF");
6677db96d56Sopenharmony_ci    if (overflow != 0)
6687db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
6697db96d56Sopenharmony_ci            "overflow was set incorrectly");
6707db96d56Sopenharmony_ci
6717db96d56Sopenharmony_ci    num = PyLong_FromLong(LONG_MAX);
6727db96d56Sopenharmony_ci    if (num == NULL)
6737db96d56Sopenharmony_ci        return NULL;
6747db96d56Sopenharmony_ci    overflow = 1234;
6757db96d56Sopenharmony_ci    value = PyLong_AsLongAndOverflow(num, &overflow);
6767db96d56Sopenharmony_ci    Py_DECREF(num);
6777db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
6787db96d56Sopenharmony_ci        return NULL;
6797db96d56Sopenharmony_ci    if (value != LONG_MAX)
6807db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
6817db96d56Sopenharmony_ci            "expected return value LONG_MAX");
6827db96d56Sopenharmony_ci    if (overflow != 0)
6837db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
6847db96d56Sopenharmony_ci            "overflow was not cleared");
6857db96d56Sopenharmony_ci
6867db96d56Sopenharmony_ci    num = PyLong_FromLong(LONG_MIN);
6877db96d56Sopenharmony_ci    if (num == NULL)
6887db96d56Sopenharmony_ci        return NULL;
6897db96d56Sopenharmony_ci    overflow = 0;
6907db96d56Sopenharmony_ci    value = PyLong_AsLongAndOverflow(num, &overflow);
6917db96d56Sopenharmony_ci    Py_DECREF(num);
6927db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
6937db96d56Sopenharmony_ci        return NULL;
6947db96d56Sopenharmony_ci    if (value != LONG_MIN)
6957db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
6967db96d56Sopenharmony_ci            "expected return value LONG_MIN");
6977db96d56Sopenharmony_ci    if (overflow != 0)
6987db96d56Sopenharmony_ci        return raiseTestError("test_long_and_overflow",
6997db96d56Sopenharmony_ci            "overflow was not cleared");
7007db96d56Sopenharmony_ci
7017db96d56Sopenharmony_ci    Py_RETURN_NONE;
7027db96d56Sopenharmony_ci}
7037db96d56Sopenharmony_ci
7047db96d56Sopenharmony_ci/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
7057db96d56Sopenharmony_ci   long long is tested by test_long_api_inner. This test will
7067db96d56Sopenharmony_ci   concentrate on proper handling of overflow.
7077db96d56Sopenharmony_ci*/
7087db96d56Sopenharmony_ci
7097db96d56Sopenharmony_cistatic PyObject *
7107db96d56Sopenharmony_citest_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
7117db96d56Sopenharmony_ci{
7127db96d56Sopenharmony_ci    PyObject *num, *one, *temp;
7137db96d56Sopenharmony_ci    long long value;
7147db96d56Sopenharmony_ci    int overflow;
7157db96d56Sopenharmony_ci
7167db96d56Sopenharmony_ci    /* Test that overflow is set properly for a large value. */
7177db96d56Sopenharmony_ci    /* num is a number larger than LLONG_MAX on a typical machine. */
7187db96d56Sopenharmony_ci    num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
7197db96d56Sopenharmony_ci    if (num == NULL)
7207db96d56Sopenharmony_ci        return NULL;
7217db96d56Sopenharmony_ci    overflow = 1234;
7227db96d56Sopenharmony_ci    value = PyLong_AsLongLongAndOverflow(num, &overflow);
7237db96d56Sopenharmony_ci    Py_DECREF(num);
7247db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
7257db96d56Sopenharmony_ci        return NULL;
7267db96d56Sopenharmony_ci    if (value != -1)
7277db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
7287db96d56Sopenharmony_ci            "return value was not set to -1");
7297db96d56Sopenharmony_ci    if (overflow != 1)
7307db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
7317db96d56Sopenharmony_ci            "overflow was not set to 1");
7327db96d56Sopenharmony_ci
7337db96d56Sopenharmony_ci    /* Same again, with num = LLONG_MAX + 1 */
7347db96d56Sopenharmony_ci    num = PyLong_FromLongLong(LLONG_MAX);
7357db96d56Sopenharmony_ci    if (num == NULL)
7367db96d56Sopenharmony_ci        return NULL;
7377db96d56Sopenharmony_ci    one = PyLong_FromLong(1L);
7387db96d56Sopenharmony_ci    if (one == NULL) {
7397db96d56Sopenharmony_ci        Py_DECREF(num);
7407db96d56Sopenharmony_ci        return NULL;
7417db96d56Sopenharmony_ci    }
7427db96d56Sopenharmony_ci    temp = PyNumber_Add(num, one);
7437db96d56Sopenharmony_ci    Py_DECREF(one);
7447db96d56Sopenharmony_ci    Py_DECREF(num);
7457db96d56Sopenharmony_ci    num = temp;
7467db96d56Sopenharmony_ci    if (num == NULL)
7477db96d56Sopenharmony_ci        return NULL;
7487db96d56Sopenharmony_ci    overflow = 0;
7497db96d56Sopenharmony_ci    value = PyLong_AsLongLongAndOverflow(num, &overflow);
7507db96d56Sopenharmony_ci    Py_DECREF(num);
7517db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
7527db96d56Sopenharmony_ci        return NULL;
7537db96d56Sopenharmony_ci    if (value != -1)
7547db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
7557db96d56Sopenharmony_ci            "return value was not set to -1");
7567db96d56Sopenharmony_ci    if (overflow != 1)
7577db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
7587db96d56Sopenharmony_ci            "overflow was not set to 1");
7597db96d56Sopenharmony_ci
7607db96d56Sopenharmony_ci    /* Test that overflow is set properly for a large negative value. */
7617db96d56Sopenharmony_ci    /* num is a number smaller than LLONG_MIN on a typical platform */
7627db96d56Sopenharmony_ci    num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
7637db96d56Sopenharmony_ci    if (num == NULL)
7647db96d56Sopenharmony_ci        return NULL;
7657db96d56Sopenharmony_ci    overflow = 1234;
7667db96d56Sopenharmony_ci    value = PyLong_AsLongLongAndOverflow(num, &overflow);
7677db96d56Sopenharmony_ci    Py_DECREF(num);
7687db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
7697db96d56Sopenharmony_ci        return NULL;
7707db96d56Sopenharmony_ci    if (value != -1)
7717db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
7727db96d56Sopenharmony_ci            "return value was not set to -1");
7737db96d56Sopenharmony_ci    if (overflow != -1)
7747db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
7757db96d56Sopenharmony_ci            "overflow was not set to -1");
7767db96d56Sopenharmony_ci
7777db96d56Sopenharmony_ci    /* Same again, with num = LLONG_MIN - 1 */
7787db96d56Sopenharmony_ci    num = PyLong_FromLongLong(LLONG_MIN);
7797db96d56Sopenharmony_ci    if (num == NULL)
7807db96d56Sopenharmony_ci        return NULL;
7817db96d56Sopenharmony_ci    one = PyLong_FromLong(1L);
7827db96d56Sopenharmony_ci    if (one == NULL) {
7837db96d56Sopenharmony_ci        Py_DECREF(num);
7847db96d56Sopenharmony_ci        return NULL;
7857db96d56Sopenharmony_ci    }
7867db96d56Sopenharmony_ci    temp = PyNumber_Subtract(num, one);
7877db96d56Sopenharmony_ci    Py_DECREF(one);
7887db96d56Sopenharmony_ci    Py_DECREF(num);
7897db96d56Sopenharmony_ci    num = temp;
7907db96d56Sopenharmony_ci    if (num == NULL)
7917db96d56Sopenharmony_ci        return NULL;
7927db96d56Sopenharmony_ci    overflow = 0;
7937db96d56Sopenharmony_ci    value = PyLong_AsLongLongAndOverflow(num, &overflow);
7947db96d56Sopenharmony_ci    Py_DECREF(num);
7957db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
7967db96d56Sopenharmony_ci        return NULL;
7977db96d56Sopenharmony_ci    if (value != -1)
7987db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
7997db96d56Sopenharmony_ci            "return value was not set to -1");
8007db96d56Sopenharmony_ci    if (overflow != -1)
8017db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
8027db96d56Sopenharmony_ci            "overflow was not set to -1");
8037db96d56Sopenharmony_ci
8047db96d56Sopenharmony_ci    /* Test that overflow is cleared properly for small values. */
8057db96d56Sopenharmony_ci    num = PyLong_FromString("FF", NULL, 16);
8067db96d56Sopenharmony_ci    if (num == NULL)
8077db96d56Sopenharmony_ci        return NULL;
8087db96d56Sopenharmony_ci    overflow = 1234;
8097db96d56Sopenharmony_ci    value = PyLong_AsLongLongAndOverflow(num, &overflow);
8107db96d56Sopenharmony_ci    Py_DECREF(num);
8117db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
8127db96d56Sopenharmony_ci        return NULL;
8137db96d56Sopenharmony_ci    if (value != 0xFF)
8147db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
8157db96d56Sopenharmony_ci            "expected return value 0xFF");
8167db96d56Sopenharmony_ci    if (overflow != 0)
8177db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
8187db96d56Sopenharmony_ci            "overflow was not cleared");
8197db96d56Sopenharmony_ci
8207db96d56Sopenharmony_ci    num = PyLong_FromString("-FF", NULL, 16);
8217db96d56Sopenharmony_ci    if (num == NULL)
8227db96d56Sopenharmony_ci        return NULL;
8237db96d56Sopenharmony_ci    overflow = 0;
8247db96d56Sopenharmony_ci    value = PyLong_AsLongLongAndOverflow(num, &overflow);
8257db96d56Sopenharmony_ci    Py_DECREF(num);
8267db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
8277db96d56Sopenharmony_ci        return NULL;
8287db96d56Sopenharmony_ci    if (value != -0xFF)
8297db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
8307db96d56Sopenharmony_ci            "expected return value 0xFF");
8317db96d56Sopenharmony_ci    if (overflow != 0)
8327db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
8337db96d56Sopenharmony_ci            "overflow was set incorrectly");
8347db96d56Sopenharmony_ci
8357db96d56Sopenharmony_ci    num = PyLong_FromLongLong(LLONG_MAX);
8367db96d56Sopenharmony_ci    if (num == NULL)
8377db96d56Sopenharmony_ci        return NULL;
8387db96d56Sopenharmony_ci    overflow = 1234;
8397db96d56Sopenharmony_ci    value = PyLong_AsLongLongAndOverflow(num, &overflow);
8407db96d56Sopenharmony_ci    Py_DECREF(num);
8417db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
8427db96d56Sopenharmony_ci        return NULL;
8437db96d56Sopenharmony_ci    if (value != LLONG_MAX)
8447db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
8457db96d56Sopenharmony_ci            "expected return value LLONG_MAX");
8467db96d56Sopenharmony_ci    if (overflow != 0)
8477db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
8487db96d56Sopenharmony_ci            "overflow was not cleared");
8497db96d56Sopenharmony_ci
8507db96d56Sopenharmony_ci    num = PyLong_FromLongLong(LLONG_MIN);
8517db96d56Sopenharmony_ci    if (num == NULL)
8527db96d56Sopenharmony_ci        return NULL;
8537db96d56Sopenharmony_ci    overflow = 0;
8547db96d56Sopenharmony_ci    value = PyLong_AsLongLongAndOverflow(num, &overflow);
8557db96d56Sopenharmony_ci    Py_DECREF(num);
8567db96d56Sopenharmony_ci    if (value == -1 && PyErr_Occurred())
8577db96d56Sopenharmony_ci        return NULL;
8587db96d56Sopenharmony_ci    if (value != LLONG_MIN)
8597db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
8607db96d56Sopenharmony_ci            "expected return value LLONG_MIN");
8617db96d56Sopenharmony_ci    if (overflow != 0)
8627db96d56Sopenharmony_ci        return raiseTestError("test_long_long_and_overflow",
8637db96d56Sopenharmony_ci            "overflow was not cleared");
8647db96d56Sopenharmony_ci
8657db96d56Sopenharmony_ci    Py_RETURN_NONE;
8667db96d56Sopenharmony_ci}
8677db96d56Sopenharmony_ci
8687db96d56Sopenharmony_ci/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
8697db96d56Sopenharmony_ci   non-integer arguments are handled correctly. It should be extended to
8707db96d56Sopenharmony_ci   test overflow handling.
8717db96d56Sopenharmony_ci */
8727db96d56Sopenharmony_ci
8737db96d56Sopenharmony_cistatic PyObject *
8747db96d56Sopenharmony_citest_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored))
8757db96d56Sopenharmony_ci{
8767db96d56Sopenharmony_ci    size_t out_u;
8777db96d56Sopenharmony_ci    Py_ssize_t out_s;
8787db96d56Sopenharmony_ci
8797db96d56Sopenharmony_ci    Py_INCREF(Py_None);
8807db96d56Sopenharmony_ci
8817db96d56Sopenharmony_ci    out_u = PyLong_AsSize_t(Py_None);
8827db96d56Sopenharmony_ci    if (out_u != (size_t)-1 || !PyErr_Occurred())
8837db96d56Sopenharmony_ci        return raiseTestError("test_long_as_size_t",
8847db96d56Sopenharmony_ci                              "PyLong_AsSize_t(None) didn't complain");
8857db96d56Sopenharmony_ci    if (!PyErr_ExceptionMatches(PyExc_TypeError))
8867db96d56Sopenharmony_ci        return raiseTestError("test_long_as_size_t",
8877db96d56Sopenharmony_ci                              "PyLong_AsSize_t(None) raised "
8887db96d56Sopenharmony_ci                              "something other than TypeError");
8897db96d56Sopenharmony_ci    PyErr_Clear();
8907db96d56Sopenharmony_ci
8917db96d56Sopenharmony_ci    out_s = PyLong_AsSsize_t(Py_None);
8927db96d56Sopenharmony_ci    if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
8937db96d56Sopenharmony_ci        return raiseTestError("test_long_as_size_t",
8947db96d56Sopenharmony_ci                              "PyLong_AsSsize_t(None) didn't complain");
8957db96d56Sopenharmony_ci    if (!PyErr_ExceptionMatches(PyExc_TypeError))
8967db96d56Sopenharmony_ci        return raiseTestError("test_long_as_size_t",
8977db96d56Sopenharmony_ci                              "PyLong_AsSsize_t(None) raised "
8987db96d56Sopenharmony_ci                              "something other than TypeError");
8997db96d56Sopenharmony_ci    PyErr_Clear();
9007db96d56Sopenharmony_ci
9017db96d56Sopenharmony_ci    /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
9027db96d56Sopenharmony_ci    return Py_None;
9037db96d56Sopenharmony_ci}
9047db96d56Sopenharmony_ci
9057db96d56Sopenharmony_cistatic PyObject *
9067db96d56Sopenharmony_citest_long_as_unsigned_long_long_mask(PyObject *self,
9077db96d56Sopenharmony_ci                                     PyObject *Py_UNUSED(ignored))
9087db96d56Sopenharmony_ci{
9097db96d56Sopenharmony_ci    unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL);
9107db96d56Sopenharmony_ci
9117db96d56Sopenharmony_ci    if (res != (unsigned long long)-1 || !PyErr_Occurred()) {
9127db96d56Sopenharmony_ci        return raiseTestError("test_long_as_unsigned_long_long_mask",
9137db96d56Sopenharmony_ci                              "PyLong_AsUnsignedLongLongMask(NULL) didn't "
9147db96d56Sopenharmony_ci                              "complain");
9157db96d56Sopenharmony_ci    }
9167db96d56Sopenharmony_ci    if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
9177db96d56Sopenharmony_ci        return raiseTestError("test_long_as_unsigned_long_long_mask",
9187db96d56Sopenharmony_ci                              "PyLong_AsUnsignedLongLongMask(NULL) raised "
9197db96d56Sopenharmony_ci                              "something other than SystemError");
9207db96d56Sopenharmony_ci    }
9217db96d56Sopenharmony_ci    PyErr_Clear();
9227db96d56Sopenharmony_ci    Py_RETURN_NONE;
9237db96d56Sopenharmony_ci}
9247db96d56Sopenharmony_ci
9257db96d56Sopenharmony_ci/* Test the PyLong_AsDouble API. At present this just tests that
9267db96d56Sopenharmony_ci   non-integer arguments are handled correctly.
9277db96d56Sopenharmony_ci */
9287db96d56Sopenharmony_ci
9297db96d56Sopenharmony_cistatic PyObject *
9307db96d56Sopenharmony_citest_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
9317db96d56Sopenharmony_ci{
9327db96d56Sopenharmony_ci    double out;
9337db96d56Sopenharmony_ci
9347db96d56Sopenharmony_ci    Py_INCREF(Py_None);
9357db96d56Sopenharmony_ci
9367db96d56Sopenharmony_ci    out = PyLong_AsDouble(Py_None);
9377db96d56Sopenharmony_ci    if (out != -1.0 || !PyErr_Occurred())
9387db96d56Sopenharmony_ci        return raiseTestError("test_long_as_double",
9397db96d56Sopenharmony_ci                              "PyLong_AsDouble(None) didn't complain");
9407db96d56Sopenharmony_ci    if (!PyErr_ExceptionMatches(PyExc_TypeError))
9417db96d56Sopenharmony_ci        return raiseTestError("test_long_as_double",
9427db96d56Sopenharmony_ci                              "PyLong_AsDouble(None) raised "
9437db96d56Sopenharmony_ci                              "something other than TypeError");
9447db96d56Sopenharmony_ci    PyErr_Clear();
9457db96d56Sopenharmony_ci
9467db96d56Sopenharmony_ci    /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
9477db96d56Sopenharmony_ci    return Py_None;
9487db96d56Sopenharmony_ci}
9497db96d56Sopenharmony_ci
9507db96d56Sopenharmony_ci/* Test the L code for PyArg_ParseTuple.  This should deliver a long long
9517db96d56Sopenharmony_ci   for both long and int arguments.  The test may leak a little memory if
9527db96d56Sopenharmony_ci   it fails.
9537db96d56Sopenharmony_ci*/
9547db96d56Sopenharmony_cistatic PyObject *
9557db96d56Sopenharmony_citest_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
9567db96d56Sopenharmony_ci{
9577db96d56Sopenharmony_ci    PyObject *tuple, *num;
9587db96d56Sopenharmony_ci    long long value;
9597db96d56Sopenharmony_ci
9607db96d56Sopenharmony_ci    tuple = PyTuple_New(1);
9617db96d56Sopenharmony_ci    if (tuple == NULL)
9627db96d56Sopenharmony_ci        return NULL;
9637db96d56Sopenharmony_ci
9647db96d56Sopenharmony_ci    num = PyLong_FromLong(42);
9657db96d56Sopenharmony_ci    if (num == NULL)
9667db96d56Sopenharmony_ci        return NULL;
9677db96d56Sopenharmony_ci
9687db96d56Sopenharmony_ci    PyTuple_SET_ITEM(tuple, 0, num);
9697db96d56Sopenharmony_ci
9707db96d56Sopenharmony_ci    value = -1;
9717db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
9727db96d56Sopenharmony_ci        return NULL;
9737db96d56Sopenharmony_ci    }
9747db96d56Sopenharmony_ci    if (value != 42)
9757db96d56Sopenharmony_ci        return raiseTestError("test_L_code",
9767db96d56Sopenharmony_ci            "L code returned wrong value for long 42");
9777db96d56Sopenharmony_ci
9787db96d56Sopenharmony_ci    Py_DECREF(num);
9797db96d56Sopenharmony_ci    num = PyLong_FromLong(42);
9807db96d56Sopenharmony_ci    if (num == NULL)
9817db96d56Sopenharmony_ci        return NULL;
9827db96d56Sopenharmony_ci
9837db96d56Sopenharmony_ci    PyTuple_SET_ITEM(tuple, 0, num);
9847db96d56Sopenharmony_ci
9857db96d56Sopenharmony_ci    value = -1;
9867db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
9877db96d56Sopenharmony_ci        return NULL;
9887db96d56Sopenharmony_ci    }
9897db96d56Sopenharmony_ci    if (value != 42)
9907db96d56Sopenharmony_ci        return raiseTestError("test_L_code",
9917db96d56Sopenharmony_ci            "L code returned wrong value for int 42");
9927db96d56Sopenharmony_ci
9937db96d56Sopenharmony_ci    Py_DECREF(tuple);
9947db96d56Sopenharmony_ci    Py_RETURN_NONE;
9957db96d56Sopenharmony_ci}
9967db96d56Sopenharmony_ci
9977db96d56Sopenharmony_cistatic PyObject *
9987db96d56Sopenharmony_cireturn_none(void *unused)
9997db96d56Sopenharmony_ci{
10007db96d56Sopenharmony_ci    Py_RETURN_NONE;
10017db96d56Sopenharmony_ci}
10027db96d56Sopenharmony_ci
10037db96d56Sopenharmony_cistatic PyObject *
10047db96d56Sopenharmony_ciraise_error(void *unused)
10057db96d56Sopenharmony_ci{
10067db96d56Sopenharmony_ci    PyErr_SetNone(PyExc_ValueError);
10077db96d56Sopenharmony_ci    return NULL;
10087db96d56Sopenharmony_ci}
10097db96d56Sopenharmony_ci
10107db96d56Sopenharmony_cistatic int
10117db96d56Sopenharmony_citest_buildvalue_N_error(const char *fmt)
10127db96d56Sopenharmony_ci{
10137db96d56Sopenharmony_ci    PyObject *arg, *res;
10147db96d56Sopenharmony_ci
10157db96d56Sopenharmony_ci    arg = PyList_New(0);
10167db96d56Sopenharmony_ci    if (arg == NULL) {
10177db96d56Sopenharmony_ci        return -1;
10187db96d56Sopenharmony_ci    }
10197db96d56Sopenharmony_ci
10207db96d56Sopenharmony_ci    Py_INCREF(arg);
10217db96d56Sopenharmony_ci    res = Py_BuildValue(fmt, return_none, NULL, arg);
10227db96d56Sopenharmony_ci    if (res == NULL) {
10237db96d56Sopenharmony_ci        return -1;
10247db96d56Sopenharmony_ci    }
10257db96d56Sopenharmony_ci    Py_DECREF(res);
10267db96d56Sopenharmony_ci    if (Py_REFCNT(arg) != 1) {
10277db96d56Sopenharmony_ci        PyErr_Format(TestError, "test_buildvalue_N: "
10287db96d56Sopenharmony_ci                     "arg was not decrefed in successful "
10297db96d56Sopenharmony_ci                     "Py_BuildValue(\"%s\")", fmt);
10307db96d56Sopenharmony_ci        return -1;
10317db96d56Sopenharmony_ci    }
10327db96d56Sopenharmony_ci
10337db96d56Sopenharmony_ci    Py_INCREF(arg);
10347db96d56Sopenharmony_ci    res = Py_BuildValue(fmt, raise_error, NULL, arg);
10357db96d56Sopenharmony_ci    if (res != NULL || !PyErr_Occurred()) {
10367db96d56Sopenharmony_ci        PyErr_Format(TestError, "test_buildvalue_N: "
10377db96d56Sopenharmony_ci                     "Py_BuildValue(\"%s\") didn't complain", fmt);
10387db96d56Sopenharmony_ci        return -1;
10397db96d56Sopenharmony_ci    }
10407db96d56Sopenharmony_ci    PyErr_Clear();
10417db96d56Sopenharmony_ci    if (Py_REFCNT(arg) != 1) {
10427db96d56Sopenharmony_ci        PyErr_Format(TestError, "test_buildvalue_N: "
10437db96d56Sopenharmony_ci                     "arg was not decrefed in failed "
10447db96d56Sopenharmony_ci                     "Py_BuildValue(\"%s\")", fmt);
10457db96d56Sopenharmony_ci        return -1;
10467db96d56Sopenharmony_ci    }
10477db96d56Sopenharmony_ci    Py_DECREF(arg);
10487db96d56Sopenharmony_ci    return 0;
10497db96d56Sopenharmony_ci}
10507db96d56Sopenharmony_ci
10517db96d56Sopenharmony_cistatic PyObject *
10527db96d56Sopenharmony_citest_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
10537db96d56Sopenharmony_ci{
10547db96d56Sopenharmony_ci    PyObject *arg, *res;
10557db96d56Sopenharmony_ci
10567db96d56Sopenharmony_ci    arg = PyList_New(0);
10577db96d56Sopenharmony_ci    if (arg == NULL) {
10587db96d56Sopenharmony_ci        return NULL;
10597db96d56Sopenharmony_ci    }
10607db96d56Sopenharmony_ci    Py_INCREF(arg);
10617db96d56Sopenharmony_ci    res = Py_BuildValue("N", arg);
10627db96d56Sopenharmony_ci    if (res == NULL) {
10637db96d56Sopenharmony_ci        return NULL;
10647db96d56Sopenharmony_ci    }
10657db96d56Sopenharmony_ci    if (res != arg) {
10667db96d56Sopenharmony_ci        return raiseTestError("test_buildvalue_N",
10677db96d56Sopenharmony_ci                              "Py_BuildValue(\"N\") returned wrong result");
10687db96d56Sopenharmony_ci    }
10697db96d56Sopenharmony_ci    if (Py_REFCNT(arg) != 2) {
10707db96d56Sopenharmony_ci        return raiseTestError("test_buildvalue_N",
10717db96d56Sopenharmony_ci                              "arg was not decrefed in Py_BuildValue(\"N\")");
10727db96d56Sopenharmony_ci    }
10737db96d56Sopenharmony_ci    Py_DECREF(res);
10747db96d56Sopenharmony_ci    Py_DECREF(arg);
10757db96d56Sopenharmony_ci
10767db96d56Sopenharmony_ci    if (test_buildvalue_N_error("O&N") < 0)
10777db96d56Sopenharmony_ci        return NULL;
10787db96d56Sopenharmony_ci    if (test_buildvalue_N_error("(O&N)") < 0)
10797db96d56Sopenharmony_ci        return NULL;
10807db96d56Sopenharmony_ci    if (test_buildvalue_N_error("[O&N]") < 0)
10817db96d56Sopenharmony_ci        return NULL;
10827db96d56Sopenharmony_ci    if (test_buildvalue_N_error("{O&N}") < 0)
10837db96d56Sopenharmony_ci        return NULL;
10847db96d56Sopenharmony_ci    if (test_buildvalue_N_error("{()O&(())N}") < 0)
10857db96d56Sopenharmony_ci        return NULL;
10867db96d56Sopenharmony_ci
10877db96d56Sopenharmony_ci    Py_RETURN_NONE;
10887db96d56Sopenharmony_ci}
10897db96d56Sopenharmony_ci
10907db96d56Sopenharmony_ci
10917db96d56Sopenharmony_cistatic PyObject *
10927db96d56Sopenharmony_citest_get_statictype_slots(PyObject *self, PyObject *Py_UNUSED(ignored))
10937db96d56Sopenharmony_ci{
10947db96d56Sopenharmony_ci    newfunc tp_new = PyType_GetSlot(&PyLong_Type, Py_tp_new);
10957db96d56Sopenharmony_ci    if (PyLong_Type.tp_new != tp_new) {
10967db96d56Sopenharmony_ci        PyErr_SetString(PyExc_AssertionError, "mismatch: tp_new of long");
10977db96d56Sopenharmony_ci        return NULL;
10987db96d56Sopenharmony_ci    }
10997db96d56Sopenharmony_ci
11007db96d56Sopenharmony_ci    reprfunc tp_repr = PyType_GetSlot(&PyLong_Type, Py_tp_repr);
11017db96d56Sopenharmony_ci    if (PyLong_Type.tp_repr != tp_repr) {
11027db96d56Sopenharmony_ci        PyErr_SetString(PyExc_AssertionError, "mismatch: tp_repr of long");
11037db96d56Sopenharmony_ci        return NULL;
11047db96d56Sopenharmony_ci    }
11057db96d56Sopenharmony_ci
11067db96d56Sopenharmony_ci    ternaryfunc tp_call = PyType_GetSlot(&PyLong_Type, Py_tp_call);
11077db96d56Sopenharmony_ci    if (tp_call != NULL) {
11087db96d56Sopenharmony_ci        PyErr_SetString(PyExc_AssertionError, "mismatch: tp_call of long");
11097db96d56Sopenharmony_ci        return NULL;
11107db96d56Sopenharmony_ci    }
11117db96d56Sopenharmony_ci
11127db96d56Sopenharmony_ci    binaryfunc nb_add = PyType_GetSlot(&PyLong_Type, Py_nb_add);
11137db96d56Sopenharmony_ci    if (PyLong_Type.tp_as_number->nb_add != nb_add) {
11147db96d56Sopenharmony_ci        PyErr_SetString(PyExc_AssertionError, "mismatch: nb_add of long");
11157db96d56Sopenharmony_ci        return NULL;
11167db96d56Sopenharmony_ci    }
11177db96d56Sopenharmony_ci
11187db96d56Sopenharmony_ci    lenfunc mp_length = PyType_GetSlot(&PyLong_Type, Py_mp_length);
11197db96d56Sopenharmony_ci    if (mp_length != NULL) {
11207db96d56Sopenharmony_ci        PyErr_SetString(PyExc_AssertionError, "mismatch: mp_length of long");
11217db96d56Sopenharmony_ci        return NULL;
11227db96d56Sopenharmony_ci    }
11237db96d56Sopenharmony_ci
11247db96d56Sopenharmony_ci    void *over_value = PyType_GetSlot(&PyLong_Type, Py_bf_releasebuffer + 1);
11257db96d56Sopenharmony_ci    if (over_value != NULL) {
11267db96d56Sopenharmony_ci        PyErr_SetString(PyExc_AssertionError, "mismatch: max+1 of long");
11277db96d56Sopenharmony_ci        return NULL;
11287db96d56Sopenharmony_ci    }
11297db96d56Sopenharmony_ci
11307db96d56Sopenharmony_ci    tp_new = PyType_GetSlot(&PyLong_Type, 0);
11317db96d56Sopenharmony_ci    if (tp_new != NULL) {
11327db96d56Sopenharmony_ci        PyErr_SetString(PyExc_AssertionError, "mismatch: slot 0 of long");
11337db96d56Sopenharmony_ci        return NULL;
11347db96d56Sopenharmony_ci    }
11357db96d56Sopenharmony_ci    if (PyErr_ExceptionMatches(PyExc_SystemError)) {
11367db96d56Sopenharmony_ci        // This is the right exception
11377db96d56Sopenharmony_ci        PyErr_Clear();
11387db96d56Sopenharmony_ci    }
11397db96d56Sopenharmony_ci    else {
11407db96d56Sopenharmony_ci        return NULL;
11417db96d56Sopenharmony_ci    }
11427db96d56Sopenharmony_ci
11437db96d56Sopenharmony_ci    Py_RETURN_NONE;
11447db96d56Sopenharmony_ci}
11457db96d56Sopenharmony_ci
11467db96d56Sopenharmony_ci
11477db96d56Sopenharmony_cistatic PyObject *
11487db96d56Sopenharmony_citest_get_type_name(PyObject *self, PyObject *Py_UNUSED(ignored))
11497db96d56Sopenharmony_ci{
11507db96d56Sopenharmony_ci    PyObject *tp_name = PyType_GetName(&PyLong_Type);
11517db96d56Sopenharmony_ci    assert(strcmp(PyUnicode_AsUTF8(tp_name), "int") == 0);
11527db96d56Sopenharmony_ci    Py_DECREF(tp_name);
11537db96d56Sopenharmony_ci
11547db96d56Sopenharmony_ci    tp_name = PyType_GetName(&PyModule_Type);
11557db96d56Sopenharmony_ci    assert(strcmp(PyUnicode_AsUTF8(tp_name), "module") == 0);
11567db96d56Sopenharmony_ci    Py_DECREF(tp_name);
11577db96d56Sopenharmony_ci
11587db96d56Sopenharmony_ci    PyObject *HeapTypeNameType = PyType_FromSpec(&HeapTypeNameType_Spec);
11597db96d56Sopenharmony_ci    if (HeapTypeNameType == NULL) {
11607db96d56Sopenharmony_ci        Py_RETURN_NONE;
11617db96d56Sopenharmony_ci    }
11627db96d56Sopenharmony_ci    tp_name = PyType_GetName((PyTypeObject *)HeapTypeNameType);
11637db96d56Sopenharmony_ci    assert(strcmp(PyUnicode_AsUTF8(tp_name), "HeapTypeNameType") == 0);
11647db96d56Sopenharmony_ci    Py_DECREF(tp_name);
11657db96d56Sopenharmony_ci
11667db96d56Sopenharmony_ci    PyObject *name = PyUnicode_FromString("test_name");
11677db96d56Sopenharmony_ci    if (name == NULL) {
11687db96d56Sopenharmony_ci        goto done;
11697db96d56Sopenharmony_ci    }
11707db96d56Sopenharmony_ci    if (PyObject_SetAttrString(HeapTypeNameType, "__name__", name) < 0) {
11717db96d56Sopenharmony_ci        Py_DECREF(name);
11727db96d56Sopenharmony_ci        goto done;
11737db96d56Sopenharmony_ci    }
11747db96d56Sopenharmony_ci    tp_name = PyType_GetName((PyTypeObject *)HeapTypeNameType);
11757db96d56Sopenharmony_ci    assert(strcmp(PyUnicode_AsUTF8(tp_name), "test_name") == 0);
11767db96d56Sopenharmony_ci    Py_DECREF(name);
11777db96d56Sopenharmony_ci    Py_DECREF(tp_name);
11787db96d56Sopenharmony_ci
11797db96d56Sopenharmony_ci  done:
11807db96d56Sopenharmony_ci    Py_DECREF(HeapTypeNameType);
11817db96d56Sopenharmony_ci    Py_RETURN_NONE;
11827db96d56Sopenharmony_ci}
11837db96d56Sopenharmony_ci
11847db96d56Sopenharmony_ci
11857db96d56Sopenharmony_cistatic PyObject *
11867db96d56Sopenharmony_cisimple_str(PyObject *self) {
11877db96d56Sopenharmony_ci    return PyUnicode_FromString("<test>");
11887db96d56Sopenharmony_ci}
11897db96d56Sopenharmony_ci
11907db96d56Sopenharmony_ci
11917db96d56Sopenharmony_cistatic PyObject *
11927db96d56Sopenharmony_citest_type_from_ephemeral_spec(PyObject *self, PyObject *Py_UNUSED(ignored))
11937db96d56Sopenharmony_ci{
11947db96d56Sopenharmony_ci    // Test that a heap type can be created from a spec that's later deleted
11957db96d56Sopenharmony_ci    // (along with all its contents).
11967db96d56Sopenharmony_ci    // All necessary data must be copied and held by the class
11977db96d56Sopenharmony_ci    PyType_Spec *spec = NULL;
11987db96d56Sopenharmony_ci    char *name = NULL;
11997db96d56Sopenharmony_ci    char *doc = NULL;
12007db96d56Sopenharmony_ci    PyType_Slot *slots = NULL;
12017db96d56Sopenharmony_ci    PyObject *class = NULL;
12027db96d56Sopenharmony_ci    PyObject *instance = NULL;
12037db96d56Sopenharmony_ci    PyObject *obj = NULL;
12047db96d56Sopenharmony_ci    PyObject *result = NULL;
12057db96d56Sopenharmony_ci
12067db96d56Sopenharmony_ci    /* create a spec (and all its contents) on the heap */
12077db96d56Sopenharmony_ci
12087db96d56Sopenharmony_ci    const char NAME[] = "testcapi._Test";
12097db96d56Sopenharmony_ci    const char DOC[] = "a test class";
12107db96d56Sopenharmony_ci
12117db96d56Sopenharmony_ci    spec = PyMem_New(PyType_Spec, 1);
12127db96d56Sopenharmony_ci    if (spec == NULL) {
12137db96d56Sopenharmony_ci        PyErr_NoMemory();
12147db96d56Sopenharmony_ci        goto finally;
12157db96d56Sopenharmony_ci    }
12167db96d56Sopenharmony_ci    name = PyMem_New(char, sizeof(NAME));
12177db96d56Sopenharmony_ci    if (name == NULL) {
12187db96d56Sopenharmony_ci        PyErr_NoMemory();
12197db96d56Sopenharmony_ci        goto finally;
12207db96d56Sopenharmony_ci    }
12217db96d56Sopenharmony_ci    memcpy(name, NAME, sizeof(NAME));
12227db96d56Sopenharmony_ci
12237db96d56Sopenharmony_ci    doc = PyMem_New(char, sizeof(DOC));
12247db96d56Sopenharmony_ci    if (doc == NULL) {
12257db96d56Sopenharmony_ci        PyErr_NoMemory();
12267db96d56Sopenharmony_ci        goto finally;
12277db96d56Sopenharmony_ci    }
12287db96d56Sopenharmony_ci    memcpy(doc, DOC, sizeof(DOC));
12297db96d56Sopenharmony_ci
12307db96d56Sopenharmony_ci    spec->name = name;
12317db96d56Sopenharmony_ci    spec->basicsize = sizeof(PyObject);
12327db96d56Sopenharmony_ci    spec->itemsize = 0;
12337db96d56Sopenharmony_ci    spec->flags = Py_TPFLAGS_DEFAULT;
12347db96d56Sopenharmony_ci    slots = PyMem_New(PyType_Slot, 3);
12357db96d56Sopenharmony_ci    if (slots == NULL) {
12367db96d56Sopenharmony_ci        PyErr_NoMemory();
12377db96d56Sopenharmony_ci        goto finally;
12387db96d56Sopenharmony_ci    }
12397db96d56Sopenharmony_ci    slots[0].slot = Py_tp_str;
12407db96d56Sopenharmony_ci    slots[0].pfunc = simple_str;
12417db96d56Sopenharmony_ci    slots[1].slot = Py_tp_doc;
12427db96d56Sopenharmony_ci    slots[1].pfunc = doc;
12437db96d56Sopenharmony_ci    slots[2].slot = 0;
12447db96d56Sopenharmony_ci    slots[2].pfunc = NULL;
12457db96d56Sopenharmony_ci    spec->slots = slots;
12467db96d56Sopenharmony_ci
12477db96d56Sopenharmony_ci    /* create the class */
12487db96d56Sopenharmony_ci
12497db96d56Sopenharmony_ci    class = PyType_FromSpec(spec);
12507db96d56Sopenharmony_ci    if (class == NULL) {
12517db96d56Sopenharmony_ci        goto finally;
12527db96d56Sopenharmony_ci    }
12537db96d56Sopenharmony_ci
12547db96d56Sopenharmony_ci    /* deallocate the spec (and all contents) */
12557db96d56Sopenharmony_ci
12567db96d56Sopenharmony_ci    // (Explicitly ovewrite memory before freeing,
12577db96d56Sopenharmony_ci    // so bugs show themselves even without the debug allocator's help.)
12587db96d56Sopenharmony_ci    memset(spec, 0xdd, sizeof(PyType_Spec));
12597db96d56Sopenharmony_ci    PyMem_Del(spec);
12607db96d56Sopenharmony_ci    spec = NULL;
12617db96d56Sopenharmony_ci    memset(name, 0xdd, sizeof(NAME));
12627db96d56Sopenharmony_ci    PyMem_Del(name);
12637db96d56Sopenharmony_ci    name = NULL;
12647db96d56Sopenharmony_ci    memset(doc, 0xdd, sizeof(DOC));
12657db96d56Sopenharmony_ci    PyMem_Del(doc);
12667db96d56Sopenharmony_ci    doc = NULL;
12677db96d56Sopenharmony_ci    memset(slots, 0xdd, 3 * sizeof(PyType_Slot));
12687db96d56Sopenharmony_ci    PyMem_Del(slots);
12697db96d56Sopenharmony_ci    slots = NULL;
12707db96d56Sopenharmony_ci
12717db96d56Sopenharmony_ci    /* check that everything works */
12727db96d56Sopenharmony_ci
12737db96d56Sopenharmony_ci    PyTypeObject *class_tp = (PyTypeObject *)class;
12747db96d56Sopenharmony_ci    PyHeapTypeObject *class_ht = (PyHeapTypeObject *)class;
12757db96d56Sopenharmony_ci    assert(strcmp(class_tp->tp_name, "testcapi._Test") == 0);
12767db96d56Sopenharmony_ci    assert(strcmp(PyUnicode_AsUTF8(class_ht->ht_name), "_Test") == 0);
12777db96d56Sopenharmony_ci    assert(strcmp(PyUnicode_AsUTF8(class_ht->ht_qualname), "_Test") == 0);
12787db96d56Sopenharmony_ci    assert(strcmp(class_tp->tp_doc, "a test class") == 0);
12797db96d56Sopenharmony_ci
12807db96d56Sopenharmony_ci    // call and check __str__
12817db96d56Sopenharmony_ci    instance = PyObject_CallNoArgs(class);
12827db96d56Sopenharmony_ci    if (instance == NULL) {
12837db96d56Sopenharmony_ci        goto finally;
12847db96d56Sopenharmony_ci    }
12857db96d56Sopenharmony_ci    obj = PyObject_Str(instance);
12867db96d56Sopenharmony_ci    if (obj == NULL) {
12877db96d56Sopenharmony_ci        goto finally;
12887db96d56Sopenharmony_ci    }
12897db96d56Sopenharmony_ci    assert(strcmp(PyUnicode_AsUTF8(obj), "<test>") == 0);
12907db96d56Sopenharmony_ci    Py_CLEAR(obj);
12917db96d56Sopenharmony_ci
12927db96d56Sopenharmony_ci    result = Py_NewRef(Py_None);
12937db96d56Sopenharmony_ci  finally:
12947db96d56Sopenharmony_ci    PyMem_Del(spec);
12957db96d56Sopenharmony_ci    PyMem_Del(name);
12967db96d56Sopenharmony_ci    PyMem_Del(doc);
12977db96d56Sopenharmony_ci    PyMem_Del(slots);
12987db96d56Sopenharmony_ci    Py_XDECREF(class);
12997db96d56Sopenharmony_ci    Py_XDECREF(instance);
13007db96d56Sopenharmony_ci    Py_XDECREF(obj);
13017db96d56Sopenharmony_ci    return result;
13027db96d56Sopenharmony_ci}
13037db96d56Sopenharmony_ci
13047db96d56Sopenharmony_ci
13057db96d56Sopenharmony_cistatic PyObject *
13067db96d56Sopenharmony_citest_get_type_qualname(PyObject *self, PyObject *Py_UNUSED(ignored))
13077db96d56Sopenharmony_ci{
13087db96d56Sopenharmony_ci    PyObject *tp_qualname = PyType_GetQualName(&PyLong_Type);
13097db96d56Sopenharmony_ci    assert(strcmp(PyUnicode_AsUTF8(tp_qualname), "int") == 0);
13107db96d56Sopenharmony_ci    Py_DECREF(tp_qualname);
13117db96d56Sopenharmony_ci
13127db96d56Sopenharmony_ci    tp_qualname = PyType_GetQualName(&PyODict_Type);
13137db96d56Sopenharmony_ci    assert(strcmp(PyUnicode_AsUTF8(tp_qualname), "OrderedDict") == 0);
13147db96d56Sopenharmony_ci    Py_DECREF(tp_qualname);
13157db96d56Sopenharmony_ci
13167db96d56Sopenharmony_ci    PyObject *HeapTypeNameType = PyType_FromSpec(&HeapTypeNameType_Spec);
13177db96d56Sopenharmony_ci    if (HeapTypeNameType == NULL) {
13187db96d56Sopenharmony_ci        Py_RETURN_NONE;
13197db96d56Sopenharmony_ci    }
13207db96d56Sopenharmony_ci    tp_qualname = PyType_GetQualName((PyTypeObject *)HeapTypeNameType);
13217db96d56Sopenharmony_ci    assert(strcmp(PyUnicode_AsUTF8(tp_qualname), "HeapTypeNameType") == 0);
13227db96d56Sopenharmony_ci    Py_DECREF(tp_qualname);
13237db96d56Sopenharmony_ci
13247db96d56Sopenharmony_ci    PyObject *spec_name = PyUnicode_FromString(HeapTypeNameType_Spec.name);
13257db96d56Sopenharmony_ci    if (spec_name == NULL) {
13267db96d56Sopenharmony_ci        goto done;
13277db96d56Sopenharmony_ci    }
13287db96d56Sopenharmony_ci    if (PyObject_SetAttrString(HeapTypeNameType,
13297db96d56Sopenharmony_ci                               "__qualname__", spec_name) < 0) {
13307db96d56Sopenharmony_ci        Py_DECREF(spec_name);
13317db96d56Sopenharmony_ci        goto done;
13327db96d56Sopenharmony_ci    }
13337db96d56Sopenharmony_ci    tp_qualname = PyType_GetQualName((PyTypeObject *)HeapTypeNameType);
13347db96d56Sopenharmony_ci    assert(strcmp(PyUnicode_AsUTF8(tp_qualname),
13357db96d56Sopenharmony_ci                  "_testcapi.HeapTypeNameType") == 0);
13367db96d56Sopenharmony_ci    Py_DECREF(spec_name);
13377db96d56Sopenharmony_ci    Py_DECREF(tp_qualname);
13387db96d56Sopenharmony_ci
13397db96d56Sopenharmony_ci  done:
13407db96d56Sopenharmony_ci    Py_DECREF(HeapTypeNameType);
13417db96d56Sopenharmony_ci    Py_RETURN_NONE;
13427db96d56Sopenharmony_ci}
13437db96d56Sopenharmony_ci
13447db96d56Sopenharmony_ci
13457db96d56Sopenharmony_cistatic PyObject *
13467db96d56Sopenharmony_ciget_args(PyObject *self, PyObject *args)
13477db96d56Sopenharmony_ci{
13487db96d56Sopenharmony_ci    if (args == NULL) {
13497db96d56Sopenharmony_ci        args = Py_None;
13507db96d56Sopenharmony_ci    }
13517db96d56Sopenharmony_ci    Py_INCREF(args);
13527db96d56Sopenharmony_ci    return args;
13537db96d56Sopenharmony_ci}
13547db96d56Sopenharmony_ci
13557db96d56Sopenharmony_cistatic PyObject *
13567db96d56Sopenharmony_ciget_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
13577db96d56Sopenharmony_ci{
13587db96d56Sopenharmony_ci    if (kwargs == NULL) {
13597db96d56Sopenharmony_ci        kwargs = Py_None;
13607db96d56Sopenharmony_ci    }
13617db96d56Sopenharmony_ci    Py_INCREF(kwargs);
13627db96d56Sopenharmony_ci    return kwargs;
13637db96d56Sopenharmony_ci}
13647db96d56Sopenharmony_ci
13657db96d56Sopenharmony_ci/* Test tuple argument processing */
13667db96d56Sopenharmony_cistatic PyObject *
13677db96d56Sopenharmony_cigetargs_tuple(PyObject *self, PyObject *args)
13687db96d56Sopenharmony_ci{
13697db96d56Sopenharmony_ci    int a, b, c;
13707db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
13717db96d56Sopenharmony_ci        return NULL;
13727db96d56Sopenharmony_ci    return Py_BuildValue("iii", a, b, c);
13737db96d56Sopenharmony_ci}
13747db96d56Sopenharmony_ci
13757db96d56Sopenharmony_ci/* test PyArg_ParseTupleAndKeywords */
13767db96d56Sopenharmony_cistatic PyObject *
13777db96d56Sopenharmony_cigetargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
13787db96d56Sopenharmony_ci{
13797db96d56Sopenharmony_ci    static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
13807db96d56Sopenharmony_ci    static const char fmt[] = "(ii)i|(i(ii))(iii)i";
13817db96d56Sopenharmony_ci    int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
13827db96d56Sopenharmony_ci
13837db96d56Sopenharmony_ci    if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
13847db96d56Sopenharmony_ci        &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
13857db96d56Sopenharmony_ci        &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
13867db96d56Sopenharmony_ci        return NULL;
13877db96d56Sopenharmony_ci    return Py_BuildValue("iiiiiiiiii",
13887db96d56Sopenharmony_ci        int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
13897db96d56Sopenharmony_ci        int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
13907db96d56Sopenharmony_ci}
13917db96d56Sopenharmony_ci
13927db96d56Sopenharmony_ci/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
13937db96d56Sopenharmony_cistatic PyObject *
13947db96d56Sopenharmony_cigetargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
13957db96d56Sopenharmony_ci{
13967db96d56Sopenharmony_ci    static char *keywords[] = {"required", "optional", "keyword_only", NULL};
13977db96d56Sopenharmony_ci    int required = -1;
13987db96d56Sopenharmony_ci    int optional = -1;
13997db96d56Sopenharmony_ci    int keyword_only = -1;
14007db96d56Sopenharmony_ci
14017db96d56Sopenharmony_ci    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
14027db96d56Sopenharmony_ci                                     &required, &optional, &keyword_only))
14037db96d56Sopenharmony_ci        return NULL;
14047db96d56Sopenharmony_ci    return Py_BuildValue("iii", required, optional, keyword_only);
14057db96d56Sopenharmony_ci}
14067db96d56Sopenharmony_ci
14077db96d56Sopenharmony_ci/* test PyArg_ParseTupleAndKeywords positional-only arguments */
14087db96d56Sopenharmony_cistatic PyObject *
14097db96d56Sopenharmony_cigetargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
14107db96d56Sopenharmony_ci{
14117db96d56Sopenharmony_ci    static char *keywords[] = {"", "", "keyword", NULL};
14127db96d56Sopenharmony_ci    int required = -1;
14137db96d56Sopenharmony_ci    int optional = -1;
14147db96d56Sopenharmony_ci    int keyword = -1;
14157db96d56Sopenharmony_ci
14167db96d56Sopenharmony_ci    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
14177db96d56Sopenharmony_ci                                     &required, &optional, &keyword))
14187db96d56Sopenharmony_ci        return NULL;
14197db96d56Sopenharmony_ci    return Py_BuildValue("iii", required, optional, keyword);
14207db96d56Sopenharmony_ci}
14217db96d56Sopenharmony_ci
14227db96d56Sopenharmony_ci/* Functions to call PyArg_ParseTuple with integer format codes,
14237db96d56Sopenharmony_ci   and return the result.
14247db96d56Sopenharmony_ci*/
14257db96d56Sopenharmony_cistatic PyObject *
14267db96d56Sopenharmony_cigetargs_b(PyObject *self, PyObject *args)
14277db96d56Sopenharmony_ci{
14287db96d56Sopenharmony_ci    unsigned char value;
14297db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "b", &value))
14307db96d56Sopenharmony_ci        return NULL;
14317db96d56Sopenharmony_ci    return PyLong_FromUnsignedLong((unsigned long)value);
14327db96d56Sopenharmony_ci}
14337db96d56Sopenharmony_ci
14347db96d56Sopenharmony_cistatic PyObject *
14357db96d56Sopenharmony_cigetargs_B(PyObject *self, PyObject *args)
14367db96d56Sopenharmony_ci{
14377db96d56Sopenharmony_ci    unsigned char value;
14387db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "B", &value))
14397db96d56Sopenharmony_ci        return NULL;
14407db96d56Sopenharmony_ci    return PyLong_FromUnsignedLong((unsigned long)value);
14417db96d56Sopenharmony_ci}
14427db96d56Sopenharmony_ci
14437db96d56Sopenharmony_cistatic PyObject *
14447db96d56Sopenharmony_cigetargs_h(PyObject *self, PyObject *args)
14457db96d56Sopenharmony_ci{
14467db96d56Sopenharmony_ci    short value;
14477db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "h", &value))
14487db96d56Sopenharmony_ci        return NULL;
14497db96d56Sopenharmony_ci    return PyLong_FromLong((long)value);
14507db96d56Sopenharmony_ci}
14517db96d56Sopenharmony_ci
14527db96d56Sopenharmony_cistatic PyObject *
14537db96d56Sopenharmony_cigetargs_H(PyObject *self, PyObject *args)
14547db96d56Sopenharmony_ci{
14557db96d56Sopenharmony_ci    unsigned short value;
14567db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "H", &value))
14577db96d56Sopenharmony_ci        return NULL;
14587db96d56Sopenharmony_ci    return PyLong_FromUnsignedLong((unsigned long)value);
14597db96d56Sopenharmony_ci}
14607db96d56Sopenharmony_ci
14617db96d56Sopenharmony_cistatic PyObject *
14627db96d56Sopenharmony_cigetargs_I(PyObject *self, PyObject *args)
14637db96d56Sopenharmony_ci{
14647db96d56Sopenharmony_ci    unsigned int value;
14657db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "I", &value))
14667db96d56Sopenharmony_ci        return NULL;
14677db96d56Sopenharmony_ci    return PyLong_FromUnsignedLong((unsigned long)value);
14687db96d56Sopenharmony_ci}
14697db96d56Sopenharmony_ci
14707db96d56Sopenharmony_cistatic PyObject *
14717db96d56Sopenharmony_cigetargs_k(PyObject *self, PyObject *args)
14727db96d56Sopenharmony_ci{
14737db96d56Sopenharmony_ci    unsigned long value;
14747db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "k", &value))
14757db96d56Sopenharmony_ci        return NULL;
14767db96d56Sopenharmony_ci    return PyLong_FromUnsignedLong(value);
14777db96d56Sopenharmony_ci}
14787db96d56Sopenharmony_ci
14797db96d56Sopenharmony_cistatic PyObject *
14807db96d56Sopenharmony_cigetargs_i(PyObject *self, PyObject *args)
14817db96d56Sopenharmony_ci{
14827db96d56Sopenharmony_ci    int value;
14837db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "i", &value))
14847db96d56Sopenharmony_ci        return NULL;
14857db96d56Sopenharmony_ci    return PyLong_FromLong((long)value);
14867db96d56Sopenharmony_ci}
14877db96d56Sopenharmony_ci
14887db96d56Sopenharmony_cistatic PyObject *
14897db96d56Sopenharmony_cigetargs_l(PyObject *self, PyObject *args)
14907db96d56Sopenharmony_ci{
14917db96d56Sopenharmony_ci    long value;
14927db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "l", &value))
14937db96d56Sopenharmony_ci        return NULL;
14947db96d56Sopenharmony_ci    return PyLong_FromLong(value);
14957db96d56Sopenharmony_ci}
14967db96d56Sopenharmony_ci
14977db96d56Sopenharmony_cistatic PyObject *
14987db96d56Sopenharmony_cigetargs_n(PyObject *self, PyObject *args)
14997db96d56Sopenharmony_ci{
15007db96d56Sopenharmony_ci    Py_ssize_t value;
15017db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "n", &value))
15027db96d56Sopenharmony_ci        return NULL;
15037db96d56Sopenharmony_ci    return PyLong_FromSsize_t(value);
15047db96d56Sopenharmony_ci}
15057db96d56Sopenharmony_ci
15067db96d56Sopenharmony_cistatic PyObject *
15077db96d56Sopenharmony_cigetargs_p(PyObject *self, PyObject *args)
15087db96d56Sopenharmony_ci{
15097db96d56Sopenharmony_ci    int value;
15107db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "p", &value))
15117db96d56Sopenharmony_ci        return NULL;
15127db96d56Sopenharmony_ci    return PyLong_FromLong(value);
15137db96d56Sopenharmony_ci}
15147db96d56Sopenharmony_ci
15157db96d56Sopenharmony_cistatic PyObject *
15167db96d56Sopenharmony_cigetargs_L(PyObject *self, PyObject *args)
15177db96d56Sopenharmony_ci{
15187db96d56Sopenharmony_ci    long long value;
15197db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "L", &value))
15207db96d56Sopenharmony_ci        return NULL;
15217db96d56Sopenharmony_ci    return PyLong_FromLongLong(value);
15227db96d56Sopenharmony_ci}
15237db96d56Sopenharmony_ci
15247db96d56Sopenharmony_cistatic PyObject *
15257db96d56Sopenharmony_cigetargs_K(PyObject *self, PyObject *args)
15267db96d56Sopenharmony_ci{
15277db96d56Sopenharmony_ci    unsigned long long value;
15287db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "K", &value))
15297db96d56Sopenharmony_ci        return NULL;
15307db96d56Sopenharmony_ci    return PyLong_FromUnsignedLongLong(value);
15317db96d56Sopenharmony_ci}
15327db96d56Sopenharmony_ci
15337db96d56Sopenharmony_ci/* This function not only tests the 'k' getargs code, but also the
15347db96d56Sopenharmony_ci   PyLong_AsUnsignedLongMask() function. */
15357db96d56Sopenharmony_cistatic PyObject *
15367db96d56Sopenharmony_citest_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
15377db96d56Sopenharmony_ci{
15387db96d56Sopenharmony_ci    PyObject *tuple, *num;
15397db96d56Sopenharmony_ci    unsigned long value;
15407db96d56Sopenharmony_ci
15417db96d56Sopenharmony_ci    tuple = PyTuple_New(1);
15427db96d56Sopenharmony_ci    if (tuple == NULL)
15437db96d56Sopenharmony_ci        return NULL;
15447db96d56Sopenharmony_ci
15457db96d56Sopenharmony_ci    /* a number larger than ULONG_MAX even on 64-bit platforms */
15467db96d56Sopenharmony_ci    num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
15477db96d56Sopenharmony_ci    if (num == NULL)
15487db96d56Sopenharmony_ci        return NULL;
15497db96d56Sopenharmony_ci
15507db96d56Sopenharmony_ci    value = PyLong_AsUnsignedLongMask(num);
15517db96d56Sopenharmony_ci    if (value != ULONG_MAX)
15527db96d56Sopenharmony_ci        return raiseTestError("test_k_code",
15537db96d56Sopenharmony_ci            "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
15547db96d56Sopenharmony_ci
15557db96d56Sopenharmony_ci    PyTuple_SET_ITEM(tuple, 0, num);
15567db96d56Sopenharmony_ci
15577db96d56Sopenharmony_ci    value = 0;
15587db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
15597db96d56Sopenharmony_ci        return NULL;
15607db96d56Sopenharmony_ci    }
15617db96d56Sopenharmony_ci    if (value != ULONG_MAX)
15627db96d56Sopenharmony_ci        return raiseTestError("test_k_code",
15637db96d56Sopenharmony_ci            "k code returned wrong value for long 0xFFF...FFF");
15647db96d56Sopenharmony_ci
15657db96d56Sopenharmony_ci    Py_DECREF(num);
15667db96d56Sopenharmony_ci    num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
15677db96d56Sopenharmony_ci    if (num == NULL)
15687db96d56Sopenharmony_ci        return NULL;
15697db96d56Sopenharmony_ci
15707db96d56Sopenharmony_ci    value = PyLong_AsUnsignedLongMask(num);
15717db96d56Sopenharmony_ci    if (value != (unsigned long)-0x42)
15727db96d56Sopenharmony_ci        return raiseTestError("test_k_code",
15737db96d56Sopenharmony_ci                              "PyLong_AsUnsignedLongMask() returned wrong "
15747db96d56Sopenharmony_ci                              "value for long -0xFFF..000042");
15757db96d56Sopenharmony_ci
15767db96d56Sopenharmony_ci    PyTuple_SET_ITEM(tuple, 0, num);
15777db96d56Sopenharmony_ci
15787db96d56Sopenharmony_ci    value = 0;
15797db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
15807db96d56Sopenharmony_ci        return NULL;
15817db96d56Sopenharmony_ci    }
15827db96d56Sopenharmony_ci    if (value != (unsigned long)-0x42)
15837db96d56Sopenharmony_ci        return raiseTestError("test_k_code",
15847db96d56Sopenharmony_ci            "k code returned wrong value for long -0xFFF..000042");
15857db96d56Sopenharmony_ci
15867db96d56Sopenharmony_ci    Py_DECREF(tuple);
15877db96d56Sopenharmony_ci    Py_RETURN_NONE;
15887db96d56Sopenharmony_ci}
15897db96d56Sopenharmony_ci
15907db96d56Sopenharmony_cistatic PyObject *
15917db96d56Sopenharmony_cigetargs_f(PyObject *self, PyObject *args)
15927db96d56Sopenharmony_ci{
15937db96d56Sopenharmony_ci    float f;
15947db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "f", &f))
15957db96d56Sopenharmony_ci        return NULL;
15967db96d56Sopenharmony_ci    return PyFloat_FromDouble(f);
15977db96d56Sopenharmony_ci}
15987db96d56Sopenharmony_ci
15997db96d56Sopenharmony_cistatic PyObject *
16007db96d56Sopenharmony_cigetargs_d(PyObject *self, PyObject *args)
16017db96d56Sopenharmony_ci{
16027db96d56Sopenharmony_ci    double d;
16037db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "d", &d))
16047db96d56Sopenharmony_ci        return NULL;
16057db96d56Sopenharmony_ci    return PyFloat_FromDouble(d);
16067db96d56Sopenharmony_ci}
16077db96d56Sopenharmony_ci
16087db96d56Sopenharmony_cistatic PyObject *
16097db96d56Sopenharmony_cigetargs_D(PyObject *self, PyObject *args)
16107db96d56Sopenharmony_ci{
16117db96d56Sopenharmony_ci    Py_complex cval;
16127db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "D", &cval))
16137db96d56Sopenharmony_ci        return NULL;
16147db96d56Sopenharmony_ci    return PyComplex_FromCComplex(cval);
16157db96d56Sopenharmony_ci}
16167db96d56Sopenharmony_ci
16177db96d56Sopenharmony_cistatic PyObject *
16187db96d56Sopenharmony_cigetargs_S(PyObject *self, PyObject *args)
16197db96d56Sopenharmony_ci{
16207db96d56Sopenharmony_ci    PyObject *obj;
16217db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "S", &obj))
16227db96d56Sopenharmony_ci        return NULL;
16237db96d56Sopenharmony_ci    Py_INCREF(obj);
16247db96d56Sopenharmony_ci    return obj;
16257db96d56Sopenharmony_ci}
16267db96d56Sopenharmony_ci
16277db96d56Sopenharmony_cistatic PyObject *
16287db96d56Sopenharmony_cigetargs_Y(PyObject *self, PyObject *args)
16297db96d56Sopenharmony_ci{
16307db96d56Sopenharmony_ci    PyObject *obj;
16317db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Y", &obj))
16327db96d56Sopenharmony_ci        return NULL;
16337db96d56Sopenharmony_ci    Py_INCREF(obj);
16347db96d56Sopenharmony_ci    return obj;
16357db96d56Sopenharmony_ci}
16367db96d56Sopenharmony_ci
16377db96d56Sopenharmony_cistatic PyObject *
16387db96d56Sopenharmony_cigetargs_U(PyObject *self, PyObject *args)
16397db96d56Sopenharmony_ci{
16407db96d56Sopenharmony_ci    PyObject *obj;
16417db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "U", &obj))
16427db96d56Sopenharmony_ci        return NULL;
16437db96d56Sopenharmony_ci    Py_INCREF(obj);
16447db96d56Sopenharmony_ci    return obj;
16457db96d56Sopenharmony_ci}
16467db96d56Sopenharmony_ci
16477db96d56Sopenharmony_cistatic PyObject *
16487db96d56Sopenharmony_cigetargs_c(PyObject *self, PyObject *args)
16497db96d56Sopenharmony_ci{
16507db96d56Sopenharmony_ci    char c;
16517db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "c", &c))
16527db96d56Sopenharmony_ci        return NULL;
16537db96d56Sopenharmony_ci    return PyLong_FromLong((unsigned char)c);
16547db96d56Sopenharmony_ci}
16557db96d56Sopenharmony_ci
16567db96d56Sopenharmony_cistatic PyObject *
16577db96d56Sopenharmony_cigetargs_C(PyObject *self, PyObject *args)
16587db96d56Sopenharmony_ci{
16597db96d56Sopenharmony_ci    int c;
16607db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "C", &c))
16617db96d56Sopenharmony_ci        return NULL;
16627db96d56Sopenharmony_ci    return PyLong_FromLong(c);
16637db96d56Sopenharmony_ci}
16647db96d56Sopenharmony_ci
16657db96d56Sopenharmony_cistatic PyObject *
16667db96d56Sopenharmony_cigetargs_s(PyObject *self, PyObject *args)
16677db96d56Sopenharmony_ci{
16687db96d56Sopenharmony_ci    char *str;
16697db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "s", &str))
16707db96d56Sopenharmony_ci        return NULL;
16717db96d56Sopenharmony_ci    return PyBytes_FromString(str);
16727db96d56Sopenharmony_ci}
16737db96d56Sopenharmony_ci
16747db96d56Sopenharmony_cistatic PyObject *
16757db96d56Sopenharmony_cigetargs_s_star(PyObject *self, PyObject *args)
16767db96d56Sopenharmony_ci{
16777db96d56Sopenharmony_ci    Py_buffer buffer;
16787db96d56Sopenharmony_ci    PyObject *bytes;
16797db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "s*", &buffer))
16807db96d56Sopenharmony_ci        return NULL;
16817db96d56Sopenharmony_ci    bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
16827db96d56Sopenharmony_ci    PyBuffer_Release(&buffer);
16837db96d56Sopenharmony_ci    return bytes;
16847db96d56Sopenharmony_ci}
16857db96d56Sopenharmony_ci
16867db96d56Sopenharmony_cistatic PyObject *
16877db96d56Sopenharmony_cigetargs_s_hash(PyObject *self, PyObject *args)
16887db96d56Sopenharmony_ci{
16897db96d56Sopenharmony_ci    char *str;
16907db96d56Sopenharmony_ci    Py_ssize_t size;
16917db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "s#", &str, &size))
16927db96d56Sopenharmony_ci        return NULL;
16937db96d56Sopenharmony_ci    return PyBytes_FromStringAndSize(str, size);
16947db96d56Sopenharmony_ci}
16957db96d56Sopenharmony_ci
16967db96d56Sopenharmony_cistatic PyObject *
16977db96d56Sopenharmony_cigetargs_z(PyObject *self, PyObject *args)
16987db96d56Sopenharmony_ci{
16997db96d56Sopenharmony_ci    char *str;
17007db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "z", &str))
17017db96d56Sopenharmony_ci        return NULL;
17027db96d56Sopenharmony_ci    if (str != NULL)
17037db96d56Sopenharmony_ci        return PyBytes_FromString(str);
17047db96d56Sopenharmony_ci    else
17057db96d56Sopenharmony_ci        Py_RETURN_NONE;
17067db96d56Sopenharmony_ci}
17077db96d56Sopenharmony_ci
17087db96d56Sopenharmony_cistatic PyObject *
17097db96d56Sopenharmony_cigetargs_z_star(PyObject *self, PyObject *args)
17107db96d56Sopenharmony_ci{
17117db96d56Sopenharmony_ci    Py_buffer buffer;
17127db96d56Sopenharmony_ci    PyObject *bytes;
17137db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "z*", &buffer))
17147db96d56Sopenharmony_ci        return NULL;
17157db96d56Sopenharmony_ci    if (buffer.buf != NULL)
17167db96d56Sopenharmony_ci        bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
17177db96d56Sopenharmony_ci    else {
17187db96d56Sopenharmony_ci        Py_INCREF(Py_None);
17197db96d56Sopenharmony_ci        bytes = Py_None;
17207db96d56Sopenharmony_ci    }
17217db96d56Sopenharmony_ci    PyBuffer_Release(&buffer);
17227db96d56Sopenharmony_ci    return bytes;
17237db96d56Sopenharmony_ci}
17247db96d56Sopenharmony_ci
17257db96d56Sopenharmony_cistatic PyObject *
17267db96d56Sopenharmony_cigetargs_z_hash(PyObject *self, PyObject *args)
17277db96d56Sopenharmony_ci{
17287db96d56Sopenharmony_ci    char *str;
17297db96d56Sopenharmony_ci    Py_ssize_t size;
17307db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "z#", &str, &size))
17317db96d56Sopenharmony_ci        return NULL;
17327db96d56Sopenharmony_ci    if (str != NULL)
17337db96d56Sopenharmony_ci        return PyBytes_FromStringAndSize(str, size);
17347db96d56Sopenharmony_ci    else
17357db96d56Sopenharmony_ci        Py_RETURN_NONE;
17367db96d56Sopenharmony_ci}
17377db96d56Sopenharmony_ci
17387db96d56Sopenharmony_cistatic PyObject *
17397db96d56Sopenharmony_cigetargs_y(PyObject *self, PyObject *args)
17407db96d56Sopenharmony_ci{
17417db96d56Sopenharmony_ci    char *str;
17427db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "y", &str))
17437db96d56Sopenharmony_ci        return NULL;
17447db96d56Sopenharmony_ci    return PyBytes_FromString(str);
17457db96d56Sopenharmony_ci}
17467db96d56Sopenharmony_ci
17477db96d56Sopenharmony_cistatic PyObject *
17487db96d56Sopenharmony_cigetargs_y_star(PyObject *self, PyObject *args)
17497db96d56Sopenharmony_ci{
17507db96d56Sopenharmony_ci    Py_buffer buffer;
17517db96d56Sopenharmony_ci    PyObject *bytes;
17527db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "y*", &buffer))
17537db96d56Sopenharmony_ci        return NULL;
17547db96d56Sopenharmony_ci    bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
17557db96d56Sopenharmony_ci    PyBuffer_Release(&buffer);
17567db96d56Sopenharmony_ci    return bytes;
17577db96d56Sopenharmony_ci}
17587db96d56Sopenharmony_ci
17597db96d56Sopenharmony_cistatic PyObject *
17607db96d56Sopenharmony_cigetargs_y_hash(PyObject *self, PyObject *args)
17617db96d56Sopenharmony_ci{
17627db96d56Sopenharmony_ci    char *str;
17637db96d56Sopenharmony_ci    Py_ssize_t size;
17647db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "y#", &str, &size))
17657db96d56Sopenharmony_ci        return NULL;
17667db96d56Sopenharmony_ci    return PyBytes_FromStringAndSize(str, size);
17677db96d56Sopenharmony_ci}
17687db96d56Sopenharmony_ci
17697db96d56Sopenharmony_cistatic PyObject *
17707db96d56Sopenharmony_cigetargs_u(PyObject *self, PyObject *args)
17717db96d56Sopenharmony_ci{
17727db96d56Sopenharmony_ci    Py_UNICODE *str;
17737db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "u", &str))
17747db96d56Sopenharmony_ci        return NULL;
17757db96d56Sopenharmony_ci    return PyUnicode_FromWideChar(str, -1);
17767db96d56Sopenharmony_ci}
17777db96d56Sopenharmony_ci
17787db96d56Sopenharmony_cistatic PyObject *
17797db96d56Sopenharmony_cigetargs_u_hash(PyObject *self, PyObject *args)
17807db96d56Sopenharmony_ci{
17817db96d56Sopenharmony_ci    Py_UNICODE *str;
17827db96d56Sopenharmony_ci    Py_ssize_t size;
17837db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "u#", &str, &size))
17847db96d56Sopenharmony_ci        return NULL;
17857db96d56Sopenharmony_ci    return PyUnicode_FromWideChar(str, size);
17867db96d56Sopenharmony_ci}
17877db96d56Sopenharmony_ci
17887db96d56Sopenharmony_cistatic PyObject *
17897db96d56Sopenharmony_cigetargs_Z(PyObject *self, PyObject *args)
17907db96d56Sopenharmony_ci{
17917db96d56Sopenharmony_ci    Py_UNICODE *str;
17927db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Z", &str))
17937db96d56Sopenharmony_ci        return NULL;
17947db96d56Sopenharmony_ci    if (str != NULL) {
17957db96d56Sopenharmony_ci        return PyUnicode_FromWideChar(str, -1);
17967db96d56Sopenharmony_ci    } else
17977db96d56Sopenharmony_ci        Py_RETURN_NONE;
17987db96d56Sopenharmony_ci}
17997db96d56Sopenharmony_ci
18007db96d56Sopenharmony_cistatic PyObject *
18017db96d56Sopenharmony_cigetargs_Z_hash(PyObject *self, PyObject *args)
18027db96d56Sopenharmony_ci{
18037db96d56Sopenharmony_ci    Py_UNICODE *str;
18047db96d56Sopenharmony_ci    Py_ssize_t size;
18057db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Z#", &str, &size))
18067db96d56Sopenharmony_ci        return NULL;
18077db96d56Sopenharmony_ci    if (str != NULL)
18087db96d56Sopenharmony_ci        return PyUnicode_FromWideChar(str, size);
18097db96d56Sopenharmony_ci    else
18107db96d56Sopenharmony_ci        Py_RETURN_NONE;
18117db96d56Sopenharmony_ci}
18127db96d56Sopenharmony_ci
18137db96d56Sopenharmony_cistatic PyObject *
18147db96d56Sopenharmony_cigetargs_es(PyObject *self, PyObject *args)
18157db96d56Sopenharmony_ci{
18167db96d56Sopenharmony_ci    PyObject *arg, *result;
18177db96d56Sopenharmony_ci    const char *encoding = NULL;
18187db96d56Sopenharmony_ci    char *str;
18197db96d56Sopenharmony_ci
18207db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
18217db96d56Sopenharmony_ci        return NULL;
18227db96d56Sopenharmony_ci    if (!PyArg_Parse(arg, "es", encoding, &str))
18237db96d56Sopenharmony_ci        return NULL;
18247db96d56Sopenharmony_ci    result = PyBytes_FromString(str);
18257db96d56Sopenharmony_ci    PyMem_Free(str);
18267db96d56Sopenharmony_ci    return result;
18277db96d56Sopenharmony_ci}
18287db96d56Sopenharmony_ci
18297db96d56Sopenharmony_cistatic PyObject *
18307db96d56Sopenharmony_cigetargs_et(PyObject *self, PyObject *args)
18317db96d56Sopenharmony_ci{
18327db96d56Sopenharmony_ci    PyObject *arg, *result;
18337db96d56Sopenharmony_ci    const char *encoding = NULL;
18347db96d56Sopenharmony_ci    char *str;
18357db96d56Sopenharmony_ci
18367db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
18377db96d56Sopenharmony_ci        return NULL;
18387db96d56Sopenharmony_ci    if (!PyArg_Parse(arg, "et", encoding, &str))
18397db96d56Sopenharmony_ci        return NULL;
18407db96d56Sopenharmony_ci    result = PyBytes_FromString(str);
18417db96d56Sopenharmony_ci    PyMem_Free(str);
18427db96d56Sopenharmony_ci    return result;
18437db96d56Sopenharmony_ci}
18447db96d56Sopenharmony_ci
18457db96d56Sopenharmony_cistatic PyObject *
18467db96d56Sopenharmony_cigetargs_es_hash(PyObject *self, PyObject *args)
18477db96d56Sopenharmony_ci{
18487db96d56Sopenharmony_ci    PyObject *arg, *result;
18497db96d56Sopenharmony_ci    const char *encoding = NULL;
18507db96d56Sopenharmony_ci    PyByteArrayObject *buffer = NULL;
18517db96d56Sopenharmony_ci    char *str = NULL;
18527db96d56Sopenharmony_ci    Py_ssize_t size;
18537db96d56Sopenharmony_ci
18547db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
18557db96d56Sopenharmony_ci        return NULL;
18567db96d56Sopenharmony_ci    if (buffer != NULL) {
18577db96d56Sopenharmony_ci        str = PyByteArray_AS_STRING(buffer);
18587db96d56Sopenharmony_ci        size = PyByteArray_GET_SIZE(buffer);
18597db96d56Sopenharmony_ci    }
18607db96d56Sopenharmony_ci    if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
18617db96d56Sopenharmony_ci        return NULL;
18627db96d56Sopenharmony_ci    result = PyBytes_FromStringAndSize(str, size);
18637db96d56Sopenharmony_ci    if (buffer == NULL)
18647db96d56Sopenharmony_ci        PyMem_Free(str);
18657db96d56Sopenharmony_ci    return result;
18667db96d56Sopenharmony_ci}
18677db96d56Sopenharmony_ci
18687db96d56Sopenharmony_cistatic PyObject *
18697db96d56Sopenharmony_cigetargs_et_hash(PyObject *self, PyObject *args)
18707db96d56Sopenharmony_ci{
18717db96d56Sopenharmony_ci    PyObject *arg, *result;
18727db96d56Sopenharmony_ci    const char *encoding = NULL;
18737db96d56Sopenharmony_ci    PyByteArrayObject *buffer = NULL;
18747db96d56Sopenharmony_ci    char *str = NULL;
18757db96d56Sopenharmony_ci    Py_ssize_t size;
18767db96d56Sopenharmony_ci
18777db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
18787db96d56Sopenharmony_ci        return NULL;
18797db96d56Sopenharmony_ci    if (buffer != NULL) {
18807db96d56Sopenharmony_ci        str = PyByteArray_AS_STRING(buffer);
18817db96d56Sopenharmony_ci        size = PyByteArray_GET_SIZE(buffer);
18827db96d56Sopenharmony_ci    }
18837db96d56Sopenharmony_ci    if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
18847db96d56Sopenharmony_ci        return NULL;
18857db96d56Sopenharmony_ci    result = PyBytes_FromStringAndSize(str, size);
18867db96d56Sopenharmony_ci    if (buffer == NULL)
18877db96d56Sopenharmony_ci        PyMem_Free(str);
18887db96d56Sopenharmony_ci    return result;
18897db96d56Sopenharmony_ci}
18907db96d56Sopenharmony_ci
18917db96d56Sopenharmony_ci/* Test the s and z codes for PyArg_ParseTuple.
18927db96d56Sopenharmony_ci*/
18937db96d56Sopenharmony_cistatic PyObject *
18947db96d56Sopenharmony_citest_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
18957db96d56Sopenharmony_ci{
18967db96d56Sopenharmony_ci    /* Unicode strings should be accepted */
18977db96d56Sopenharmony_ci    PyObject *tuple, *obj;
18987db96d56Sopenharmony_ci    char *value;
18997db96d56Sopenharmony_ci
19007db96d56Sopenharmony_ci    tuple = PyTuple_New(1);
19017db96d56Sopenharmony_ci    if (tuple == NULL)
19027db96d56Sopenharmony_ci    return NULL;
19037db96d56Sopenharmony_ci
19047db96d56Sopenharmony_ci    obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
19057db96d56Sopenharmony_ci                           "latin-1", NULL);
19067db96d56Sopenharmony_ci    if (obj == NULL)
19077db96d56Sopenharmony_ci    return NULL;
19087db96d56Sopenharmony_ci
19097db96d56Sopenharmony_ci    PyTuple_SET_ITEM(tuple, 0, obj);
19107db96d56Sopenharmony_ci
19117db96d56Sopenharmony_ci    /* These two blocks used to raise a TypeError:
19127db96d56Sopenharmony_ci     * "argument must be string without null bytes, not str"
19137db96d56Sopenharmony_ci     */
19147db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
19157db96d56Sopenharmony_ci        return NULL;
19167db96d56Sopenharmony_ci    }
19177db96d56Sopenharmony_ci
19187db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
19197db96d56Sopenharmony_ci        return NULL;
19207db96d56Sopenharmony_ci    }
19217db96d56Sopenharmony_ci
19227db96d56Sopenharmony_ci    Py_DECREF(tuple);
19237db96d56Sopenharmony_ci    Py_RETURN_NONE;
19247db96d56Sopenharmony_ci}
19257db96d56Sopenharmony_ci
19267db96d56Sopenharmony_cistatic PyObject *
19277db96d56Sopenharmony_ciparse_tuple_and_keywords(PyObject *self, PyObject *args)
19287db96d56Sopenharmony_ci{
19297db96d56Sopenharmony_ci    PyObject *sub_args;
19307db96d56Sopenharmony_ci    PyObject *sub_kwargs;
19317db96d56Sopenharmony_ci    const char *sub_format;
19327db96d56Sopenharmony_ci    PyObject *sub_keywords;
19337db96d56Sopenharmony_ci
19347db96d56Sopenharmony_ci    Py_ssize_t i, size;
19357db96d56Sopenharmony_ci    char *keywords[8 + 1]; /* space for NULL at end */
19367db96d56Sopenharmony_ci    PyObject *o;
19377db96d56Sopenharmony_ci    PyObject *converted[8];
19387db96d56Sopenharmony_ci
19397db96d56Sopenharmony_ci    int result;
19407db96d56Sopenharmony_ci    PyObject *return_value = NULL;
19417db96d56Sopenharmony_ci
19427db96d56Sopenharmony_ci    double buffers[8][4]; /* double ensures alignment where necessary */
19437db96d56Sopenharmony_ci
19447db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
19457db96d56Sopenharmony_ci        &sub_args, &sub_kwargs,
19467db96d56Sopenharmony_ci        &sub_format, &sub_keywords))
19477db96d56Sopenharmony_ci        return NULL;
19487db96d56Sopenharmony_ci
19497db96d56Sopenharmony_ci    if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
19507db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
19517db96d56Sopenharmony_ci            "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
19527db96d56Sopenharmony_ci        return NULL;
19537db96d56Sopenharmony_ci    }
19547db96d56Sopenharmony_ci
19557db96d56Sopenharmony_ci    memset(buffers, 0, sizeof(buffers));
19567db96d56Sopenharmony_ci    memset(converted, 0, sizeof(converted));
19577db96d56Sopenharmony_ci    memset(keywords, 0, sizeof(keywords));
19587db96d56Sopenharmony_ci
19597db96d56Sopenharmony_ci    size = PySequence_Fast_GET_SIZE(sub_keywords);
19607db96d56Sopenharmony_ci    if (size > 8) {
19617db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError,
19627db96d56Sopenharmony_ci            "parse_tuple_and_keywords: too many keywords in sub_keywords");
19637db96d56Sopenharmony_ci        goto exit;
19647db96d56Sopenharmony_ci    }
19657db96d56Sopenharmony_ci
19667db96d56Sopenharmony_ci    for (i = 0; i < size; i++) {
19677db96d56Sopenharmony_ci        o = PySequence_Fast_GET_ITEM(sub_keywords, i);
19687db96d56Sopenharmony_ci        if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
19697db96d56Sopenharmony_ci            PyErr_Format(PyExc_ValueError,
19707db96d56Sopenharmony_ci                "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
19717db96d56Sopenharmony_ci            goto exit;
19727db96d56Sopenharmony_ci        }
19737db96d56Sopenharmony_ci        keywords[i] = PyBytes_AS_STRING(converted[i]);
19747db96d56Sopenharmony_ci    }
19757db96d56Sopenharmony_ci
19767db96d56Sopenharmony_ci    result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
19777db96d56Sopenharmony_ci        sub_format, keywords,
19787db96d56Sopenharmony_ci        buffers + 0, buffers + 1, buffers + 2, buffers + 3,
19797db96d56Sopenharmony_ci        buffers + 4, buffers + 5, buffers + 6, buffers + 7);
19807db96d56Sopenharmony_ci
19817db96d56Sopenharmony_ci    if (result) {
19827db96d56Sopenharmony_ci        return_value = Py_None;
19837db96d56Sopenharmony_ci        Py_INCREF(Py_None);
19847db96d56Sopenharmony_ci    }
19857db96d56Sopenharmony_ci
19867db96d56Sopenharmony_ciexit:
19877db96d56Sopenharmony_ci    size = sizeof(converted) / sizeof(converted[0]);
19887db96d56Sopenharmony_ci    for (i = 0; i < size; i++) {
19897db96d56Sopenharmony_ci        Py_XDECREF(converted[i]);
19907db96d56Sopenharmony_ci    }
19917db96d56Sopenharmony_ci    return return_value;
19927db96d56Sopenharmony_ci}
19937db96d56Sopenharmony_ci
19947db96d56Sopenharmony_cistatic volatile int x;
19957db96d56Sopenharmony_ci
19967db96d56Sopenharmony_ci#if USE_UNICODE_WCHAR_CACHE
19977db96d56Sopenharmony_ci/* Ignore use of deprecated APIs */
19987db96d56Sopenharmony_ci_Py_COMP_DIAG_PUSH
19997db96d56Sopenharmony_ci_Py_COMP_DIAG_IGNORE_DEPR_DECLS
20007db96d56Sopenharmony_ci
20017db96d56Sopenharmony_ci/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
20027db96d56Sopenharmony_ci   of an error.
20037db96d56Sopenharmony_ci*/
20047db96d56Sopenharmony_cistatic PyObject *
20057db96d56Sopenharmony_citest_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
20067db96d56Sopenharmony_ci{
20077db96d56Sopenharmony_ci    PyObject *tuple, *obj;
20087db96d56Sopenharmony_ci    Py_UNICODE *value;
20097db96d56Sopenharmony_ci    Py_ssize_t len;
20107db96d56Sopenharmony_ci
20117db96d56Sopenharmony_ci    /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
20127db96d56Sopenharmony_ci    /* Just use the macro and check that it compiles */
20137db96d56Sopenharmony_ci    x = Py_UNICODE_ISSPACE(25);
20147db96d56Sopenharmony_ci
20157db96d56Sopenharmony_ci    tuple = PyTuple_New(1);
20167db96d56Sopenharmony_ci    if (tuple == NULL)
20177db96d56Sopenharmony_ci        return NULL;
20187db96d56Sopenharmony_ci
20197db96d56Sopenharmony_ci    obj = PyUnicode_Decode("test", strlen("test"),
20207db96d56Sopenharmony_ci                           "ascii", NULL);
20217db96d56Sopenharmony_ci    if (obj == NULL)
20227db96d56Sopenharmony_ci        return NULL;
20237db96d56Sopenharmony_ci
20247db96d56Sopenharmony_ci    PyTuple_SET_ITEM(tuple, 0, obj);
20257db96d56Sopenharmony_ci
20267db96d56Sopenharmony_ci    value = 0;
20277db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
20287db96d56Sopenharmony_ci        return NULL;
20297db96d56Sopenharmony_ci    }
20307db96d56Sopenharmony_ci    if (value != PyUnicode_AS_UNICODE(obj))
20317db96d56Sopenharmony_ci        return raiseTestError("test_u_code",
20327db96d56Sopenharmony_ci            "u code returned wrong value for u'test'");
20337db96d56Sopenharmony_ci    value = 0;
20347db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
20357db96d56Sopenharmony_ci        return NULL;
20367db96d56Sopenharmony_ci    }
20377db96d56Sopenharmony_ci    if (value != PyUnicode_AS_UNICODE(obj) ||
20387db96d56Sopenharmony_ci        len != PyUnicode_GET_SIZE(obj))
20397db96d56Sopenharmony_ci        return raiseTestError("test_u_code",
20407db96d56Sopenharmony_ci            "u# code returned wrong values for u'test'");
20417db96d56Sopenharmony_ci
20427db96d56Sopenharmony_ci    Py_DECREF(tuple);
20437db96d56Sopenharmony_ci    Py_RETURN_NONE;
20447db96d56Sopenharmony_ci}
20457db96d56Sopenharmony_ci
20467db96d56Sopenharmony_ci/* Test Z and Z# codes for PyArg_ParseTuple */
20477db96d56Sopenharmony_cistatic PyObject *
20487db96d56Sopenharmony_citest_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
20497db96d56Sopenharmony_ci{
20507db96d56Sopenharmony_ci    PyObject *tuple, *obj;
20517db96d56Sopenharmony_ci    const Py_UNICODE *value1, *value2;
20527db96d56Sopenharmony_ci    Py_ssize_t len1, len2;
20537db96d56Sopenharmony_ci
20547db96d56Sopenharmony_ci    tuple = PyTuple_New(2);
20557db96d56Sopenharmony_ci    if (tuple == NULL)
20567db96d56Sopenharmony_ci        return NULL;
20577db96d56Sopenharmony_ci
20587db96d56Sopenharmony_ci    obj = PyUnicode_FromString("test");
20597db96d56Sopenharmony_ci    PyTuple_SET_ITEM(tuple, 0, obj);
20607db96d56Sopenharmony_ci    Py_INCREF(Py_None);
20617db96d56Sopenharmony_ci    PyTuple_SET_ITEM(tuple, 1, Py_None);
20627db96d56Sopenharmony_ci
20637db96d56Sopenharmony_ci    /* swap values on purpose */
20647db96d56Sopenharmony_ci    value1 = NULL;
20657db96d56Sopenharmony_ci    value2 = PyUnicode_AS_UNICODE(obj);
20667db96d56Sopenharmony_ci
20677db96d56Sopenharmony_ci    /* Test Z for both values */
20687db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
20697db96d56Sopenharmony_ci        return NULL;
20707db96d56Sopenharmony_ci    }
20717db96d56Sopenharmony_ci    if (value1 != PyUnicode_AS_UNICODE(obj))
20727db96d56Sopenharmony_ci        return raiseTestError("test_Z_code",
20737db96d56Sopenharmony_ci            "Z code returned wrong value for 'test'");
20747db96d56Sopenharmony_ci    if (value2 != NULL)
20757db96d56Sopenharmony_ci        return raiseTestError("test_Z_code",
20767db96d56Sopenharmony_ci            "Z code returned wrong value for None");
20777db96d56Sopenharmony_ci
20787db96d56Sopenharmony_ci    value1 = NULL;
20797db96d56Sopenharmony_ci    value2 = PyUnicode_AS_UNICODE(obj);
20807db96d56Sopenharmony_ci    len1 = -1;
20817db96d56Sopenharmony_ci    len2 = -1;
20827db96d56Sopenharmony_ci
20837db96d56Sopenharmony_ci    /* Test Z# for both values */
20847db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
20857db96d56Sopenharmony_ci                          &value2, &len2))
20867db96d56Sopenharmony_ci    {
20877db96d56Sopenharmony_ci        return NULL;
20887db96d56Sopenharmony_ci    }
20897db96d56Sopenharmony_ci    if (value1 != PyUnicode_AS_UNICODE(obj) ||
20907db96d56Sopenharmony_ci        len1 != PyUnicode_GET_SIZE(obj))
20917db96d56Sopenharmony_ci        return raiseTestError("test_Z_code",
20927db96d56Sopenharmony_ci            "Z# code returned wrong values for 'test'");
20937db96d56Sopenharmony_ci    if (value2 != NULL ||
20947db96d56Sopenharmony_ci        len2 != 0)
20957db96d56Sopenharmony_ci        return raiseTestError("test_Z_code",
20967db96d56Sopenharmony_ci            "Z# code returned wrong values for None'");
20977db96d56Sopenharmony_ci
20987db96d56Sopenharmony_ci    Py_DECREF(tuple);
20997db96d56Sopenharmony_ci    Py_RETURN_NONE;
21007db96d56Sopenharmony_ci}
21017db96d56Sopenharmony_ci_Py_COMP_DIAG_POP
21027db96d56Sopenharmony_ci#endif /* USE_UNICODE_WCHAR_CACHE */
21037db96d56Sopenharmony_ci
21047db96d56Sopenharmony_cistatic PyObject *
21057db96d56Sopenharmony_citest_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
21067db96d56Sopenharmony_ci{
21077db96d56Sopenharmony_ci#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
21087db96d56Sopenharmony_ci    const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
21097db96d56Sopenharmony_ci    size_t wtextlen = 1;
21107db96d56Sopenharmony_ci    const wchar_t invalid[1] = {(wchar_t)0x110000u};
21117db96d56Sopenharmony_ci#else
21127db96d56Sopenharmony_ci    const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
21137db96d56Sopenharmony_ci    size_t wtextlen = 2;
21147db96d56Sopenharmony_ci#endif
21157db96d56Sopenharmony_ci    PyObject *wide, *utf8;
21167db96d56Sopenharmony_ci
21177db96d56Sopenharmony_ci    wide = PyUnicode_FromWideChar(wtext, wtextlen);
21187db96d56Sopenharmony_ci    if (wide == NULL)
21197db96d56Sopenharmony_ci        return NULL;
21207db96d56Sopenharmony_ci
21217db96d56Sopenharmony_ci    utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
21227db96d56Sopenharmony_ci    if (utf8 == NULL) {
21237db96d56Sopenharmony_ci        Py_DECREF(wide);
21247db96d56Sopenharmony_ci        return NULL;
21257db96d56Sopenharmony_ci    }
21267db96d56Sopenharmony_ci
21277db96d56Sopenharmony_ci    if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
21287db96d56Sopenharmony_ci        Py_DECREF(wide);
21297db96d56Sopenharmony_ci        Py_DECREF(utf8);
21307db96d56Sopenharmony_ci        return raiseTestError("test_widechar",
21317db96d56Sopenharmony_ci                              "wide string and utf8 string "
21327db96d56Sopenharmony_ci                              "have different length");
21337db96d56Sopenharmony_ci    }
21347db96d56Sopenharmony_ci    if (PyUnicode_Compare(wide, utf8)) {
21357db96d56Sopenharmony_ci        Py_DECREF(wide);
21367db96d56Sopenharmony_ci        Py_DECREF(utf8);
21377db96d56Sopenharmony_ci        if (PyErr_Occurred())
21387db96d56Sopenharmony_ci            return NULL;
21397db96d56Sopenharmony_ci        return raiseTestError("test_widechar",
21407db96d56Sopenharmony_ci                              "wide string and utf8 string "
21417db96d56Sopenharmony_ci                              "are different");
21427db96d56Sopenharmony_ci    }
21437db96d56Sopenharmony_ci
21447db96d56Sopenharmony_ci    Py_DECREF(wide);
21457db96d56Sopenharmony_ci    Py_DECREF(utf8);
21467db96d56Sopenharmony_ci
21477db96d56Sopenharmony_ci#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
21487db96d56Sopenharmony_ci    wide = PyUnicode_FromWideChar(invalid, 1);
21497db96d56Sopenharmony_ci    if (wide == NULL)
21507db96d56Sopenharmony_ci        PyErr_Clear();
21517db96d56Sopenharmony_ci    else
21527db96d56Sopenharmony_ci        return raiseTestError("test_widechar",
21537db96d56Sopenharmony_ci                              "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
21547db96d56Sopenharmony_ci
21557db96d56Sopenharmony_ci#if USE_UNICODE_WCHAR_CACHE
21567db96d56Sopenharmony_ci/* Ignore use of deprecated APIs */
21577db96d56Sopenharmony_ci_Py_COMP_DIAG_PUSH
21587db96d56Sopenharmony_ci_Py_COMP_DIAG_IGNORE_DEPR_DECLS
21597db96d56Sopenharmony_ci    wide = PyUnicode_FromUnicode(invalid, 1);
21607db96d56Sopenharmony_ci    if (wide == NULL)
21617db96d56Sopenharmony_ci        PyErr_Clear();
21627db96d56Sopenharmony_ci    else
21637db96d56Sopenharmony_ci        return raiseTestError("test_widechar",
21647db96d56Sopenharmony_ci                              "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
21657db96d56Sopenharmony_ci
21667db96d56Sopenharmony_ci    wide = PyUnicode_FromUnicode(NULL, 1);
21677db96d56Sopenharmony_ci    if (wide == NULL)
21687db96d56Sopenharmony_ci        return NULL;
21697db96d56Sopenharmony_ci    PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
21707db96d56Sopenharmony_ci    if (_PyUnicode_Ready(wide) < 0) {
21717db96d56Sopenharmony_ci        Py_DECREF(wide);
21727db96d56Sopenharmony_ci        PyErr_Clear();
21737db96d56Sopenharmony_ci    }
21747db96d56Sopenharmony_ci    else {
21757db96d56Sopenharmony_ci        Py_DECREF(wide);
21767db96d56Sopenharmony_ci        return raiseTestError("test_widechar",
21777db96d56Sopenharmony_ci                              "PyUnicode_Ready() didn't fail");
21787db96d56Sopenharmony_ci    }
21797db96d56Sopenharmony_ci_Py_COMP_DIAG_POP
21807db96d56Sopenharmony_ci#endif /* USE_UNICODE_WCHAR_CACHE */
21817db96d56Sopenharmony_ci#endif
21827db96d56Sopenharmony_ci
21837db96d56Sopenharmony_ci    Py_RETURN_NONE;
21847db96d56Sopenharmony_ci}
21857db96d56Sopenharmony_ci
21867db96d56Sopenharmony_cistatic PyObject *
21877db96d56Sopenharmony_ciunicode_aswidechar(PyObject *self, PyObject *args)
21887db96d56Sopenharmony_ci{
21897db96d56Sopenharmony_ci    PyObject *unicode, *result;
21907db96d56Sopenharmony_ci    Py_ssize_t buflen, size;
21917db96d56Sopenharmony_ci    wchar_t *buffer;
21927db96d56Sopenharmony_ci
21937db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
21947db96d56Sopenharmony_ci        return NULL;
21957db96d56Sopenharmony_ci    buffer = PyMem_New(wchar_t, buflen);
21967db96d56Sopenharmony_ci    if (buffer == NULL)
21977db96d56Sopenharmony_ci        return PyErr_NoMemory();
21987db96d56Sopenharmony_ci
21997db96d56Sopenharmony_ci    size = PyUnicode_AsWideChar(unicode, buffer, buflen);
22007db96d56Sopenharmony_ci    if (size == -1) {
22017db96d56Sopenharmony_ci        PyMem_Free(buffer);
22027db96d56Sopenharmony_ci        return NULL;
22037db96d56Sopenharmony_ci    }
22047db96d56Sopenharmony_ci
22057db96d56Sopenharmony_ci    if (size < buflen)
22067db96d56Sopenharmony_ci        buflen = size + 1;
22077db96d56Sopenharmony_ci    else
22087db96d56Sopenharmony_ci        buflen = size;
22097db96d56Sopenharmony_ci    result = PyUnicode_FromWideChar(buffer, buflen);
22107db96d56Sopenharmony_ci    PyMem_Free(buffer);
22117db96d56Sopenharmony_ci    if (result == NULL)
22127db96d56Sopenharmony_ci        return NULL;
22137db96d56Sopenharmony_ci
22147db96d56Sopenharmony_ci    return Py_BuildValue("(Nn)", result, size);
22157db96d56Sopenharmony_ci}
22167db96d56Sopenharmony_ci
22177db96d56Sopenharmony_cistatic PyObject *
22187db96d56Sopenharmony_ciunicode_aswidecharstring(PyObject *self, PyObject *args)
22197db96d56Sopenharmony_ci{
22207db96d56Sopenharmony_ci    PyObject *unicode, *result;
22217db96d56Sopenharmony_ci    Py_ssize_t size;
22227db96d56Sopenharmony_ci    wchar_t *buffer;
22237db96d56Sopenharmony_ci
22247db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "U", &unicode))
22257db96d56Sopenharmony_ci        return NULL;
22267db96d56Sopenharmony_ci
22277db96d56Sopenharmony_ci    buffer = PyUnicode_AsWideCharString(unicode, &size);
22287db96d56Sopenharmony_ci    if (buffer == NULL)
22297db96d56Sopenharmony_ci        return NULL;
22307db96d56Sopenharmony_ci
22317db96d56Sopenharmony_ci    result = PyUnicode_FromWideChar(buffer, size + 1);
22327db96d56Sopenharmony_ci    PyMem_Free(buffer);
22337db96d56Sopenharmony_ci    if (result == NULL)
22347db96d56Sopenharmony_ci        return NULL;
22357db96d56Sopenharmony_ci    return Py_BuildValue("(Nn)", result, size);
22367db96d56Sopenharmony_ci}
22377db96d56Sopenharmony_ci
22387db96d56Sopenharmony_cistatic PyObject *
22397db96d56Sopenharmony_ciunicode_asucs4(PyObject *self, PyObject *args)
22407db96d56Sopenharmony_ci{
22417db96d56Sopenharmony_ci    PyObject *unicode, *result;
22427db96d56Sopenharmony_ci    Py_UCS4 *buffer;
22437db96d56Sopenharmony_ci    int copy_null;
22447db96d56Sopenharmony_ci    Py_ssize_t str_len, buf_len;
22457db96d56Sopenharmony_ci
22467db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
22477db96d56Sopenharmony_ci        return NULL;
22487db96d56Sopenharmony_ci    }
22497db96d56Sopenharmony_ci
22507db96d56Sopenharmony_ci    buf_len = str_len + 1;
22517db96d56Sopenharmony_ci    buffer = PyMem_NEW(Py_UCS4, buf_len);
22527db96d56Sopenharmony_ci    if (buffer == NULL) {
22537db96d56Sopenharmony_ci        return PyErr_NoMemory();
22547db96d56Sopenharmony_ci    }
22557db96d56Sopenharmony_ci    memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
22567db96d56Sopenharmony_ci    buffer[str_len] = 0xffffU;
22577db96d56Sopenharmony_ci
22587db96d56Sopenharmony_ci    if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
22597db96d56Sopenharmony_ci        PyMem_Free(buffer);
22607db96d56Sopenharmony_ci        return NULL;
22617db96d56Sopenharmony_ci    }
22627db96d56Sopenharmony_ci
22637db96d56Sopenharmony_ci    result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
22647db96d56Sopenharmony_ci    PyMem_Free(buffer);
22657db96d56Sopenharmony_ci    return result;
22667db96d56Sopenharmony_ci}
22677db96d56Sopenharmony_ci
22687db96d56Sopenharmony_cistatic PyObject *
22697db96d56Sopenharmony_ciunicode_asutf8(PyObject *self, PyObject *args)
22707db96d56Sopenharmony_ci{
22717db96d56Sopenharmony_ci    PyObject *unicode;
22727db96d56Sopenharmony_ci    const char *buffer;
22737db96d56Sopenharmony_ci
22747db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "U", &unicode)) {
22757db96d56Sopenharmony_ci        return NULL;
22767db96d56Sopenharmony_ci    }
22777db96d56Sopenharmony_ci
22787db96d56Sopenharmony_ci    buffer = PyUnicode_AsUTF8(unicode);
22797db96d56Sopenharmony_ci    if (buffer == NULL) {
22807db96d56Sopenharmony_ci        return NULL;
22817db96d56Sopenharmony_ci    }
22827db96d56Sopenharmony_ci
22837db96d56Sopenharmony_ci    return PyBytes_FromString(buffer);
22847db96d56Sopenharmony_ci}
22857db96d56Sopenharmony_ci
22867db96d56Sopenharmony_cistatic PyObject *
22877db96d56Sopenharmony_ciunicode_asutf8andsize(PyObject *self, PyObject *args)
22887db96d56Sopenharmony_ci{
22897db96d56Sopenharmony_ci    PyObject *unicode, *result;
22907db96d56Sopenharmony_ci    const char *buffer;
22917db96d56Sopenharmony_ci    Py_ssize_t utf8_len;
22927db96d56Sopenharmony_ci
22937db96d56Sopenharmony_ci    if(!PyArg_ParseTuple(args, "U", &unicode)) {
22947db96d56Sopenharmony_ci        return NULL;
22957db96d56Sopenharmony_ci    }
22967db96d56Sopenharmony_ci
22977db96d56Sopenharmony_ci    buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len);
22987db96d56Sopenharmony_ci    if (buffer == NULL) {
22997db96d56Sopenharmony_ci        return NULL;
23007db96d56Sopenharmony_ci    }
23017db96d56Sopenharmony_ci
23027db96d56Sopenharmony_ci    result = PyBytes_FromString(buffer);
23037db96d56Sopenharmony_ci    if (result == NULL) {
23047db96d56Sopenharmony_ci        return NULL;
23057db96d56Sopenharmony_ci    }
23067db96d56Sopenharmony_ci
23077db96d56Sopenharmony_ci    return Py_BuildValue("(Nn)", result, utf8_len);
23087db96d56Sopenharmony_ci}
23097db96d56Sopenharmony_ci
23107db96d56Sopenharmony_cistatic PyObject *
23117db96d56Sopenharmony_ciunicode_findchar(PyObject *self, PyObject *args)
23127db96d56Sopenharmony_ci{
23137db96d56Sopenharmony_ci    PyObject *str;
23147db96d56Sopenharmony_ci    int direction;
23157db96d56Sopenharmony_ci    unsigned int ch;
23167db96d56Sopenharmony_ci    Py_ssize_t result;
23177db96d56Sopenharmony_ci    Py_ssize_t start, end;
23187db96d56Sopenharmony_ci
23197db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
23207db96d56Sopenharmony_ci                          &start, &end, &direction)) {
23217db96d56Sopenharmony_ci        return NULL;
23227db96d56Sopenharmony_ci    }
23237db96d56Sopenharmony_ci
23247db96d56Sopenharmony_ci    result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
23257db96d56Sopenharmony_ci    if (result == -2)
23267db96d56Sopenharmony_ci        return NULL;
23277db96d56Sopenharmony_ci    else
23287db96d56Sopenharmony_ci        return PyLong_FromSsize_t(result);
23297db96d56Sopenharmony_ci}
23307db96d56Sopenharmony_ci
23317db96d56Sopenharmony_cistatic PyObject *
23327db96d56Sopenharmony_ciunicode_copycharacters(PyObject *self, PyObject *args)
23337db96d56Sopenharmony_ci{
23347db96d56Sopenharmony_ci    PyObject *from, *to, *to_copy;
23357db96d56Sopenharmony_ci    Py_ssize_t from_start, to_start, how_many, copied;
23367db96d56Sopenharmony_ci
23377db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
23387db96d56Sopenharmony_ci                          &from, &from_start, &how_many)) {
23397db96d56Sopenharmony_ci        return NULL;
23407db96d56Sopenharmony_ci    }
23417db96d56Sopenharmony_ci
23427db96d56Sopenharmony_ci    if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
23437db96d56Sopenharmony_ci                                  PyUnicode_MAX_CHAR_VALUE(to)))) {
23447db96d56Sopenharmony_ci        return NULL;
23457db96d56Sopenharmony_ci    }
23467db96d56Sopenharmony_ci    if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
23477db96d56Sopenharmony_ci        Py_DECREF(to_copy);
23487db96d56Sopenharmony_ci        return NULL;
23497db96d56Sopenharmony_ci    }
23507db96d56Sopenharmony_ci
23517db96d56Sopenharmony_ci    if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
23527db96d56Sopenharmony_ci                                           from_start, how_many)) < 0) {
23537db96d56Sopenharmony_ci        Py_DECREF(to_copy);
23547db96d56Sopenharmony_ci        return NULL;
23557db96d56Sopenharmony_ci    }
23567db96d56Sopenharmony_ci
23577db96d56Sopenharmony_ci    return Py_BuildValue("(Nn)", to_copy, copied);
23587db96d56Sopenharmony_ci}
23597db96d56Sopenharmony_ci
23607db96d56Sopenharmony_ci#if USE_UNICODE_WCHAR_CACHE
23617db96d56Sopenharmony_ci/* Ignore use of deprecated APIs */
23627db96d56Sopenharmony_ci_Py_COMP_DIAG_PUSH
23637db96d56Sopenharmony_ci_Py_COMP_DIAG_IGNORE_DEPR_DECLS
23647db96d56Sopenharmony_ci
23657db96d56Sopenharmony_cistatic PyObject *
23667db96d56Sopenharmony_ciunicode_legacy_string(PyObject *self, PyObject *args)
23677db96d56Sopenharmony_ci{
23687db96d56Sopenharmony_ci    Py_UNICODE *data;
23697db96d56Sopenharmony_ci    Py_ssize_t len;
23707db96d56Sopenharmony_ci    PyObject *u;
23717db96d56Sopenharmony_ci
23727db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "u#", &data, &len))
23737db96d56Sopenharmony_ci        return NULL;
23747db96d56Sopenharmony_ci
23757db96d56Sopenharmony_ci    u = PyUnicode_FromUnicode(NULL, len);
23767db96d56Sopenharmony_ci    if (u == NULL)
23777db96d56Sopenharmony_ci        return NULL;
23787db96d56Sopenharmony_ci
23797db96d56Sopenharmony_ci    memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
23807db96d56Sopenharmony_ci
23817db96d56Sopenharmony_ci    if (len > 0) { /* The empty string is always ready. */
23827db96d56Sopenharmony_ci        assert(!PyUnicode_IS_READY(u));
23837db96d56Sopenharmony_ci    }
23847db96d56Sopenharmony_ci
23857db96d56Sopenharmony_ci    return u;
23867db96d56Sopenharmony_ci}
23877db96d56Sopenharmony_ci_Py_COMP_DIAG_POP
23887db96d56Sopenharmony_ci#endif /* USE_UNICODE_WCHAR_CACHE */
23897db96d56Sopenharmony_ci
23907db96d56Sopenharmony_cistatic PyObject *
23917db96d56Sopenharmony_cigetargs_w_star(PyObject *self, PyObject *args)
23927db96d56Sopenharmony_ci{
23937db96d56Sopenharmony_ci    Py_buffer buffer;
23947db96d56Sopenharmony_ci    PyObject *result;
23957db96d56Sopenharmony_ci    char *str;
23967db96d56Sopenharmony_ci
23977db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
23987db96d56Sopenharmony_ci        return NULL;
23997db96d56Sopenharmony_ci
24007db96d56Sopenharmony_ci    if (2 <= buffer.len) {
24017db96d56Sopenharmony_ci        str = buffer.buf;
24027db96d56Sopenharmony_ci        str[0] = '[';
24037db96d56Sopenharmony_ci        str[buffer.len-1] = ']';
24047db96d56Sopenharmony_ci    }
24057db96d56Sopenharmony_ci
24067db96d56Sopenharmony_ci    result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
24077db96d56Sopenharmony_ci    PyBuffer_Release(&buffer);
24087db96d56Sopenharmony_ci    return result;
24097db96d56Sopenharmony_ci}
24107db96d56Sopenharmony_ci
24117db96d56Sopenharmony_ci
24127db96d56Sopenharmony_cistatic PyObject *
24137db96d56Sopenharmony_citest_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
24147db96d56Sopenharmony_ci{
24157db96d56Sopenharmony_ci    /* Test that formats can begin with '|'. See issue #4720. */
24167db96d56Sopenharmony_ci    PyObject *tuple, *dict = NULL;
24177db96d56Sopenharmony_ci    static char *kwlist[] = {NULL};
24187db96d56Sopenharmony_ci    int result;
24197db96d56Sopenharmony_ci    tuple = PyTuple_New(0);
24207db96d56Sopenharmony_ci    if (!tuple)
24217db96d56Sopenharmony_ci        return NULL;
24227db96d56Sopenharmony_ci    if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
24237db96d56Sopenharmony_ci        goto done;
24247db96d56Sopenharmony_ci    }
24257db96d56Sopenharmony_ci    dict = PyDict_New();
24267db96d56Sopenharmony_ci    if (!dict)
24277db96d56Sopenharmony_ci        goto done;
24287db96d56Sopenharmony_ci    result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
24297db96d56Sopenharmony_ci  done:
24307db96d56Sopenharmony_ci    Py_DECREF(tuple);
24317db96d56Sopenharmony_ci    Py_XDECREF(dict);
24327db96d56Sopenharmony_ci    if (!result) {
24337db96d56Sopenharmony_ci        return NULL;
24347db96d56Sopenharmony_ci    }
24357db96d56Sopenharmony_ci    else {
24367db96d56Sopenharmony_ci        Py_RETURN_NONE;
24377db96d56Sopenharmony_ci    }
24387db96d56Sopenharmony_ci}
24397db96d56Sopenharmony_ci
24407db96d56Sopenharmony_cistatic PyObject *
24417db96d56Sopenharmony_cicodec_incrementalencoder(PyObject *self, PyObject *args)
24427db96d56Sopenharmony_ci{
24437db96d56Sopenharmony_ci    const char *encoding, *errors = NULL;
24447db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
24457db96d56Sopenharmony_ci                          &encoding, &errors))
24467db96d56Sopenharmony_ci        return NULL;
24477db96d56Sopenharmony_ci    return PyCodec_IncrementalEncoder(encoding, errors);
24487db96d56Sopenharmony_ci}
24497db96d56Sopenharmony_ci
24507db96d56Sopenharmony_cistatic PyObject *
24517db96d56Sopenharmony_cicodec_incrementaldecoder(PyObject *self, PyObject *args)
24527db96d56Sopenharmony_ci{
24537db96d56Sopenharmony_ci    const char *encoding, *errors = NULL;
24547db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
24557db96d56Sopenharmony_ci                          &encoding, &errors))
24567db96d56Sopenharmony_ci        return NULL;
24577db96d56Sopenharmony_ci    return PyCodec_IncrementalDecoder(encoding, errors);
24587db96d56Sopenharmony_ci}
24597db96d56Sopenharmony_ci
24607db96d56Sopenharmony_ci
24617db96d56Sopenharmony_ci/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
24627db96d56Sopenharmony_cistatic PyObject *
24637db96d56Sopenharmony_citest_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
24647db96d56Sopenharmony_ci{
24657db96d56Sopenharmony_ci    struct triple {
24667db96d56Sopenharmony_ci        long input;
24677db96d56Sopenharmony_ci        size_t nbits;
24687db96d56Sopenharmony_ci        int sign;
24697db96d56Sopenharmony_ci    } testcases[] = {{0, 0, 0},
24707db96d56Sopenharmony_ci                     {1L, 1, 1},
24717db96d56Sopenharmony_ci                     {-1L, 1, -1},
24727db96d56Sopenharmony_ci                     {2L, 2, 1},
24737db96d56Sopenharmony_ci                     {-2L, 2, -1},
24747db96d56Sopenharmony_ci                     {3L, 2, 1},
24757db96d56Sopenharmony_ci                     {-3L, 2, -1},
24767db96d56Sopenharmony_ci                     {4L, 3, 1},
24777db96d56Sopenharmony_ci                     {-4L, 3, -1},
24787db96d56Sopenharmony_ci                     {0x7fffL, 15, 1},          /* one Python int digit */
24797db96d56Sopenharmony_ci             {-0x7fffL, 15, -1},
24807db96d56Sopenharmony_ci             {0xffffL, 16, 1},
24817db96d56Sopenharmony_ci             {-0xffffL, 16, -1},
24827db96d56Sopenharmony_ci             {0xfffffffL, 28, 1},
24837db96d56Sopenharmony_ci             {-0xfffffffL, 28, -1}};
24847db96d56Sopenharmony_ci    size_t i;
24857db96d56Sopenharmony_ci
24867db96d56Sopenharmony_ci    for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
24877db96d56Sopenharmony_ci        size_t nbits;
24887db96d56Sopenharmony_ci        int sign;
24897db96d56Sopenharmony_ci        PyObject *plong;
24907db96d56Sopenharmony_ci
24917db96d56Sopenharmony_ci        plong = PyLong_FromLong(testcases[i].input);
24927db96d56Sopenharmony_ci        if (plong == NULL)
24937db96d56Sopenharmony_ci            return NULL;
24947db96d56Sopenharmony_ci        nbits = _PyLong_NumBits(plong);
24957db96d56Sopenharmony_ci        sign = _PyLong_Sign(plong);
24967db96d56Sopenharmony_ci
24977db96d56Sopenharmony_ci        Py_DECREF(plong);
24987db96d56Sopenharmony_ci        if (nbits != testcases[i].nbits)
24997db96d56Sopenharmony_ci            return raiseTestError("test_long_numbits",
25007db96d56Sopenharmony_ci                            "wrong result for _PyLong_NumBits");
25017db96d56Sopenharmony_ci        if (sign != testcases[i].sign)
25027db96d56Sopenharmony_ci            return raiseTestError("test_long_numbits",
25037db96d56Sopenharmony_ci                            "wrong result for _PyLong_Sign");
25047db96d56Sopenharmony_ci    }
25057db96d56Sopenharmony_ci    Py_RETURN_NONE;
25067db96d56Sopenharmony_ci}
25077db96d56Sopenharmony_ci
25087db96d56Sopenharmony_cistatic PyObject *
25097db96d56Sopenharmony_cipyobject_repr_from_null(PyObject *self, PyObject *Py_UNUSED(ignored))
25107db96d56Sopenharmony_ci{
25117db96d56Sopenharmony_ci    return PyObject_Repr(NULL);
25127db96d56Sopenharmony_ci}
25137db96d56Sopenharmony_ci
25147db96d56Sopenharmony_cistatic PyObject *
25157db96d56Sopenharmony_cipyobject_str_from_null(PyObject *self, PyObject *Py_UNUSED(ignored))
25167db96d56Sopenharmony_ci{
25177db96d56Sopenharmony_ci    return PyObject_Str(NULL);
25187db96d56Sopenharmony_ci}
25197db96d56Sopenharmony_ci
25207db96d56Sopenharmony_cistatic PyObject *
25217db96d56Sopenharmony_cipyobject_bytes_from_null(PyObject *self, PyObject *Py_UNUSED(ignored))
25227db96d56Sopenharmony_ci{
25237db96d56Sopenharmony_ci    return PyObject_Bytes(NULL);
25247db96d56Sopenharmony_ci}
25257db96d56Sopenharmony_ci
25267db96d56Sopenharmony_cistatic PyObject *
25277db96d56Sopenharmony_ciexc_set_object(PyObject *self, PyObject *args)
25287db96d56Sopenharmony_ci{
25297db96d56Sopenharmony_ci    PyObject *exc;
25307db96d56Sopenharmony_ci    PyObject *obj;
25317db96d56Sopenharmony_ci
25327db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OO:exc_set_object", &exc, &obj)) {
25337db96d56Sopenharmony_ci        return NULL;
25347db96d56Sopenharmony_ci    }
25357db96d56Sopenharmony_ci
25367db96d56Sopenharmony_ci    PyErr_SetObject(exc, obj);
25377db96d56Sopenharmony_ci    return NULL;
25387db96d56Sopenharmony_ci}
25397db96d56Sopenharmony_ci
25407db96d56Sopenharmony_cistatic PyObject *
25417db96d56Sopenharmony_ciraise_exception(PyObject *self, PyObject *args)
25427db96d56Sopenharmony_ci{
25437db96d56Sopenharmony_ci    PyObject *exc;
25447db96d56Sopenharmony_ci    PyObject *exc_args, *v;
25457db96d56Sopenharmony_ci    int num_args, i;
25467db96d56Sopenharmony_ci
25477db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Oi:raise_exception",
25487db96d56Sopenharmony_ci                          &exc, &num_args))
25497db96d56Sopenharmony_ci        return NULL;
25507db96d56Sopenharmony_ci
25517db96d56Sopenharmony_ci    exc_args = PyTuple_New(num_args);
25527db96d56Sopenharmony_ci    if (exc_args == NULL)
25537db96d56Sopenharmony_ci        return NULL;
25547db96d56Sopenharmony_ci    for (i = 0; i < num_args; ++i) {
25557db96d56Sopenharmony_ci        v = PyLong_FromLong(i);
25567db96d56Sopenharmony_ci        if (v == NULL) {
25577db96d56Sopenharmony_ci            Py_DECREF(exc_args);
25587db96d56Sopenharmony_ci            return NULL;
25597db96d56Sopenharmony_ci        }
25607db96d56Sopenharmony_ci        PyTuple_SET_ITEM(exc_args, i, v);
25617db96d56Sopenharmony_ci    }
25627db96d56Sopenharmony_ci    PyErr_SetObject(exc, exc_args);
25637db96d56Sopenharmony_ci    Py_DECREF(exc_args);
25647db96d56Sopenharmony_ci    return NULL;
25657db96d56Sopenharmony_ci}
25667db96d56Sopenharmony_ci
25677db96d56Sopenharmony_cistatic PyObject *
25687db96d56Sopenharmony_ciset_errno(PyObject *self, PyObject *args)
25697db96d56Sopenharmony_ci{
25707db96d56Sopenharmony_ci    int new_errno;
25717db96d56Sopenharmony_ci
25727db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
25737db96d56Sopenharmony_ci        return NULL;
25747db96d56Sopenharmony_ci
25757db96d56Sopenharmony_ci    errno = new_errno;
25767db96d56Sopenharmony_ci    Py_RETURN_NONE;
25777db96d56Sopenharmony_ci}
25787db96d56Sopenharmony_ci
25797db96d56Sopenharmony_cistatic PyObject *
25807db96d56Sopenharmony_citest_set_exception(PyObject *self, PyObject *new_exc)
25817db96d56Sopenharmony_ci{
25827db96d56Sopenharmony_ci    PyObject *exc = PyErr_GetHandledException();
25837db96d56Sopenharmony_ci    assert(PyExceptionInstance_Check(exc) || exc == NULL);
25847db96d56Sopenharmony_ci
25857db96d56Sopenharmony_ci    PyErr_SetHandledException(new_exc);
25867db96d56Sopenharmony_ci    return exc;
25877db96d56Sopenharmony_ci}
25887db96d56Sopenharmony_ci
25897db96d56Sopenharmony_cistatic PyObject *
25907db96d56Sopenharmony_citest_set_exc_info(PyObject *self, PyObject *args)
25917db96d56Sopenharmony_ci{
25927db96d56Sopenharmony_ci    PyObject *orig_exc;
25937db96d56Sopenharmony_ci    PyObject *new_type, *new_value, *new_tb;
25947db96d56Sopenharmony_ci    PyObject *type, *value, *tb;
25957db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
25967db96d56Sopenharmony_ci                          &new_type, &new_value, &new_tb))
25977db96d56Sopenharmony_ci        return NULL;
25987db96d56Sopenharmony_ci
25997db96d56Sopenharmony_ci    PyErr_GetExcInfo(&type, &value, &tb);
26007db96d56Sopenharmony_ci
26017db96d56Sopenharmony_ci    Py_INCREF(new_type);
26027db96d56Sopenharmony_ci    Py_INCREF(new_value);
26037db96d56Sopenharmony_ci    Py_INCREF(new_tb);
26047db96d56Sopenharmony_ci    PyErr_SetExcInfo(new_type, new_value, new_tb);
26057db96d56Sopenharmony_ci
26067db96d56Sopenharmony_ci    orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
26077db96d56Sopenharmony_ci    Py_XDECREF(type);
26087db96d56Sopenharmony_ci    Py_XDECREF(value);
26097db96d56Sopenharmony_ci    Py_XDECREF(tb);
26107db96d56Sopenharmony_ci    return orig_exc;
26117db96d56Sopenharmony_ci}
26127db96d56Sopenharmony_ci
26137db96d56Sopenharmony_cistatic int test_run_counter = 0;
26147db96d56Sopenharmony_ci
26157db96d56Sopenharmony_cistatic PyObject *
26167db96d56Sopenharmony_citest_datetime_capi(PyObject *self, PyObject *args) {
26177db96d56Sopenharmony_ci    if (PyDateTimeAPI) {
26187db96d56Sopenharmony_ci        if (test_run_counter) {
26197db96d56Sopenharmony_ci            /* Probably regrtest.py -R */
26207db96d56Sopenharmony_ci            Py_RETURN_NONE;
26217db96d56Sopenharmony_ci        }
26227db96d56Sopenharmony_ci        else {
26237db96d56Sopenharmony_ci            PyErr_SetString(PyExc_AssertionError,
26247db96d56Sopenharmony_ci                            "PyDateTime_CAPI somehow initialized");
26257db96d56Sopenharmony_ci            return NULL;
26267db96d56Sopenharmony_ci        }
26277db96d56Sopenharmony_ci    }
26287db96d56Sopenharmony_ci    test_run_counter++;
26297db96d56Sopenharmony_ci    PyDateTime_IMPORT;
26307db96d56Sopenharmony_ci
26317db96d56Sopenharmony_ci    if (PyDateTimeAPI)
26327db96d56Sopenharmony_ci        Py_RETURN_NONE;
26337db96d56Sopenharmony_ci    else
26347db96d56Sopenharmony_ci        return NULL;
26357db96d56Sopenharmony_ci}
26367db96d56Sopenharmony_ci
26377db96d56Sopenharmony_ci/* Functions exposing the C API type checking for testing */
26387db96d56Sopenharmony_ci#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method)    \
26397db96d56Sopenharmony_ci    PyObject *obj;                                              \
26407db96d56Sopenharmony_ci    int exact = 0;                                              \
26417db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) {         \
26427db96d56Sopenharmony_ci        return NULL;                                            \
26437db96d56Sopenharmony_ci    }                                                           \
26447db96d56Sopenharmony_ci    int rv = exact?exact_method(obj):check_method(obj);         \
26457db96d56Sopenharmony_ci    if (rv) {                                                   \
26467db96d56Sopenharmony_ci        Py_RETURN_TRUE;                                         \
26477db96d56Sopenharmony_ci    } else {                                                    \
26487db96d56Sopenharmony_ci        Py_RETURN_FALSE;                                        \
26497db96d56Sopenharmony_ci    }
26507db96d56Sopenharmony_ci
26517db96d56Sopenharmony_cistatic PyObject *
26527db96d56Sopenharmony_cidatetime_check_date(PyObject *self, PyObject *args) {
26537db96d56Sopenharmony_ci    MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
26547db96d56Sopenharmony_ci}
26557db96d56Sopenharmony_ci
26567db96d56Sopenharmony_cistatic PyObject *
26577db96d56Sopenharmony_cidatetime_check_time(PyObject *self, PyObject *args) {
26587db96d56Sopenharmony_ci    MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
26597db96d56Sopenharmony_ci}
26607db96d56Sopenharmony_ci
26617db96d56Sopenharmony_cistatic PyObject *
26627db96d56Sopenharmony_cidatetime_check_datetime(PyObject *self, PyObject *args) {
26637db96d56Sopenharmony_ci    MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
26647db96d56Sopenharmony_ci}
26657db96d56Sopenharmony_ci
26667db96d56Sopenharmony_cistatic PyObject *
26677db96d56Sopenharmony_cidatetime_check_delta(PyObject *self, PyObject *args) {
26687db96d56Sopenharmony_ci    MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
26697db96d56Sopenharmony_ci}
26707db96d56Sopenharmony_ci
26717db96d56Sopenharmony_cistatic PyObject *
26727db96d56Sopenharmony_cidatetime_check_tzinfo(PyObject *self, PyObject *args) {
26737db96d56Sopenharmony_ci    MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
26747db96d56Sopenharmony_ci}
26757db96d56Sopenharmony_ci
26767db96d56Sopenharmony_ci
26777db96d56Sopenharmony_ci/* Makes three variations on timezone representing UTC-5:
26787db96d56Sopenharmony_ci   1. timezone with offset and name from PyDateTimeAPI
26797db96d56Sopenharmony_ci   2. timezone with offset and name from PyTimeZone_FromOffsetAndName
26807db96d56Sopenharmony_ci   3. timezone with offset (no name) from PyTimeZone_FromOffset
26817db96d56Sopenharmony_ci*/
26827db96d56Sopenharmony_cistatic PyObject *
26837db96d56Sopenharmony_cimake_timezones_capi(PyObject *self, PyObject *args) {
26847db96d56Sopenharmony_ci    PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
26857db96d56Sopenharmony_ci    PyObject *name = PyUnicode_FromString("EST");
26867db96d56Sopenharmony_ci
26877db96d56Sopenharmony_ci    PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
26887db96d56Sopenharmony_ci    PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
26897db96d56Sopenharmony_ci    PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
26907db96d56Sopenharmony_ci
26917db96d56Sopenharmony_ci    Py_DecRef(offset);
26927db96d56Sopenharmony_ci    Py_DecRef(name);
26937db96d56Sopenharmony_ci
26947db96d56Sopenharmony_ci    PyObject *rv = PyTuple_New(3);
26957db96d56Sopenharmony_ci
26967db96d56Sopenharmony_ci    PyTuple_SET_ITEM(rv, 0, est_zone_capi);
26977db96d56Sopenharmony_ci    PyTuple_SET_ITEM(rv, 1, est_zone_macro);
26987db96d56Sopenharmony_ci    PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
26997db96d56Sopenharmony_ci
27007db96d56Sopenharmony_ci    return rv;
27017db96d56Sopenharmony_ci}
27027db96d56Sopenharmony_ci
27037db96d56Sopenharmony_cistatic PyObject *
27047db96d56Sopenharmony_ciget_timezones_offset_zero(PyObject *self, PyObject *args) {
27057db96d56Sopenharmony_ci    PyObject *offset = PyDelta_FromDSU(0, 0, 0);
27067db96d56Sopenharmony_ci    PyObject *name = PyUnicode_FromString("");
27077db96d56Sopenharmony_ci
27087db96d56Sopenharmony_ci    // These two should return the UTC singleton
27097db96d56Sopenharmony_ci    PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
27107db96d56Sopenharmony_ci    PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
27117db96d56Sopenharmony_ci
27127db96d56Sopenharmony_ci    // This one will return +00:00 zone, but not the UTC singleton
27137db96d56Sopenharmony_ci    PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
27147db96d56Sopenharmony_ci
27157db96d56Sopenharmony_ci    Py_DecRef(offset);
27167db96d56Sopenharmony_ci    Py_DecRef(name);
27177db96d56Sopenharmony_ci
27187db96d56Sopenharmony_ci    PyObject *rv = PyTuple_New(3);
27197db96d56Sopenharmony_ci    PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
27207db96d56Sopenharmony_ci    PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
27217db96d56Sopenharmony_ci    PyTuple_SET_ITEM(rv, 2, non_utc_zone);
27227db96d56Sopenharmony_ci
27237db96d56Sopenharmony_ci    return rv;
27247db96d56Sopenharmony_ci}
27257db96d56Sopenharmony_ci
27267db96d56Sopenharmony_cistatic PyObject *
27277db96d56Sopenharmony_ciget_timezone_utc_capi(PyObject* self, PyObject *args) {
27287db96d56Sopenharmony_ci    int macro = 0;
27297db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "|p", &macro)) {
27307db96d56Sopenharmony_ci        return NULL;
27317db96d56Sopenharmony_ci    }
27327db96d56Sopenharmony_ci    if (macro) {
27337db96d56Sopenharmony_ci        Py_INCREF(PyDateTime_TimeZone_UTC);
27347db96d56Sopenharmony_ci        return PyDateTime_TimeZone_UTC;
27357db96d56Sopenharmony_ci    } else {
27367db96d56Sopenharmony_ci        Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
27377db96d56Sopenharmony_ci        return PyDateTimeAPI->TimeZone_UTC;
27387db96d56Sopenharmony_ci    }
27397db96d56Sopenharmony_ci}
27407db96d56Sopenharmony_ci
27417db96d56Sopenharmony_cistatic PyObject *
27427db96d56Sopenharmony_ciget_date_fromdate(PyObject *self, PyObject *args)
27437db96d56Sopenharmony_ci{
27447db96d56Sopenharmony_ci    PyObject *rv = NULL;
27457db96d56Sopenharmony_ci    int macro;
27467db96d56Sopenharmony_ci    int year, month, day;
27477db96d56Sopenharmony_ci
27487db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
27497db96d56Sopenharmony_ci        return NULL;
27507db96d56Sopenharmony_ci    }
27517db96d56Sopenharmony_ci
27527db96d56Sopenharmony_ci    if (macro) {
27537db96d56Sopenharmony_ci        rv = PyDate_FromDate(year, month, day);
27547db96d56Sopenharmony_ci    }
27557db96d56Sopenharmony_ci    else {
27567db96d56Sopenharmony_ci        rv = PyDateTimeAPI->Date_FromDate(
27577db96d56Sopenharmony_ci            year, month, day,
27587db96d56Sopenharmony_ci            PyDateTimeAPI->DateType);
27597db96d56Sopenharmony_ci    }
27607db96d56Sopenharmony_ci    return rv;
27617db96d56Sopenharmony_ci}
27627db96d56Sopenharmony_ci
27637db96d56Sopenharmony_ci
27647db96d56Sopenharmony_cistatic PyObject *
27657db96d56Sopenharmony_ciget_datetime_fromdateandtime(PyObject *self, PyObject *args)
27667db96d56Sopenharmony_ci{
27677db96d56Sopenharmony_ci    PyObject *rv = NULL;
27687db96d56Sopenharmony_ci    int macro;
27697db96d56Sopenharmony_ci    int year, month, day;
27707db96d56Sopenharmony_ci    int hour, minute, second, microsecond;
27717db96d56Sopenharmony_ci
27727db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "piiiiiii",
27737db96d56Sopenharmony_ci                          &macro,
27747db96d56Sopenharmony_ci                          &year, &month, &day,
27757db96d56Sopenharmony_ci                          &hour, &minute, &second, &microsecond)) {
27767db96d56Sopenharmony_ci        return NULL;
27777db96d56Sopenharmony_ci    }
27787db96d56Sopenharmony_ci
27797db96d56Sopenharmony_ci    if (macro) {
27807db96d56Sopenharmony_ci        rv = PyDateTime_FromDateAndTime(
27817db96d56Sopenharmony_ci            year, month, day,
27827db96d56Sopenharmony_ci            hour, minute, second, microsecond);
27837db96d56Sopenharmony_ci    }
27847db96d56Sopenharmony_ci    else {
27857db96d56Sopenharmony_ci        rv = PyDateTimeAPI->DateTime_FromDateAndTime(
27867db96d56Sopenharmony_ci            year, month, day,
27877db96d56Sopenharmony_ci            hour, minute, second, microsecond,
27887db96d56Sopenharmony_ci            Py_None,
27897db96d56Sopenharmony_ci            PyDateTimeAPI->DateTimeType);
27907db96d56Sopenharmony_ci    }
27917db96d56Sopenharmony_ci    return rv;
27927db96d56Sopenharmony_ci}
27937db96d56Sopenharmony_ci
27947db96d56Sopenharmony_cistatic PyObject *
27957db96d56Sopenharmony_ciget_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
27967db96d56Sopenharmony_ci{
27977db96d56Sopenharmony_ci    PyObject *rv = NULL;
27987db96d56Sopenharmony_ci    int macro;
27997db96d56Sopenharmony_ci    int year, month, day;
28007db96d56Sopenharmony_ci    int hour, minute, second, microsecond, fold;
28017db96d56Sopenharmony_ci
28027db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "piiiiiiii",
28037db96d56Sopenharmony_ci                          &macro,
28047db96d56Sopenharmony_ci                          &year, &month, &day,
28057db96d56Sopenharmony_ci                          &hour, &minute, &second, &microsecond,
28067db96d56Sopenharmony_ci                          &fold)) {
28077db96d56Sopenharmony_ci        return NULL;
28087db96d56Sopenharmony_ci    }
28097db96d56Sopenharmony_ci
28107db96d56Sopenharmony_ci    if (macro) {
28117db96d56Sopenharmony_ci        rv = PyDateTime_FromDateAndTimeAndFold(
28127db96d56Sopenharmony_ci            year, month, day,
28137db96d56Sopenharmony_ci            hour, minute, second, microsecond,
28147db96d56Sopenharmony_ci            fold);
28157db96d56Sopenharmony_ci    }
28167db96d56Sopenharmony_ci    else {
28177db96d56Sopenharmony_ci        rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
28187db96d56Sopenharmony_ci            year, month, day,
28197db96d56Sopenharmony_ci            hour, minute, second, microsecond,
28207db96d56Sopenharmony_ci            Py_None,
28217db96d56Sopenharmony_ci            fold,
28227db96d56Sopenharmony_ci            PyDateTimeAPI->DateTimeType);
28237db96d56Sopenharmony_ci    }
28247db96d56Sopenharmony_ci    return rv;
28257db96d56Sopenharmony_ci}
28267db96d56Sopenharmony_ci
28277db96d56Sopenharmony_cistatic PyObject *
28287db96d56Sopenharmony_ciget_time_fromtime(PyObject *self, PyObject *args)
28297db96d56Sopenharmony_ci{
28307db96d56Sopenharmony_ci    PyObject *rv = NULL;
28317db96d56Sopenharmony_ci    int macro;
28327db96d56Sopenharmony_ci    int hour, minute, second, microsecond;
28337db96d56Sopenharmony_ci
28347db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "piiii",
28357db96d56Sopenharmony_ci                          &macro,
28367db96d56Sopenharmony_ci                          &hour, &minute, &second, &microsecond)) {
28377db96d56Sopenharmony_ci        return NULL;
28387db96d56Sopenharmony_ci    }
28397db96d56Sopenharmony_ci
28407db96d56Sopenharmony_ci    if (macro) {
28417db96d56Sopenharmony_ci        rv = PyTime_FromTime(hour, minute, second, microsecond);
28427db96d56Sopenharmony_ci    }
28437db96d56Sopenharmony_ci    else {
28447db96d56Sopenharmony_ci        rv = PyDateTimeAPI->Time_FromTime(
28457db96d56Sopenharmony_ci            hour, minute, second, microsecond,
28467db96d56Sopenharmony_ci            Py_None,
28477db96d56Sopenharmony_ci            PyDateTimeAPI->TimeType);
28487db96d56Sopenharmony_ci    }
28497db96d56Sopenharmony_ci    return rv;
28507db96d56Sopenharmony_ci}
28517db96d56Sopenharmony_ci
28527db96d56Sopenharmony_cistatic PyObject *
28537db96d56Sopenharmony_ciget_time_fromtimeandfold(PyObject *self, PyObject *args)
28547db96d56Sopenharmony_ci{
28557db96d56Sopenharmony_ci    PyObject *rv = NULL;
28567db96d56Sopenharmony_ci    int macro;
28577db96d56Sopenharmony_ci    int hour, minute, second, microsecond, fold;
28587db96d56Sopenharmony_ci
28597db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "piiiii",
28607db96d56Sopenharmony_ci                          &macro,
28617db96d56Sopenharmony_ci                          &hour, &minute, &second, &microsecond,
28627db96d56Sopenharmony_ci                          &fold)) {
28637db96d56Sopenharmony_ci        return NULL;
28647db96d56Sopenharmony_ci    }
28657db96d56Sopenharmony_ci
28667db96d56Sopenharmony_ci    if (macro) {
28677db96d56Sopenharmony_ci        rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
28687db96d56Sopenharmony_ci    }
28697db96d56Sopenharmony_ci    else {
28707db96d56Sopenharmony_ci        rv = PyDateTimeAPI->Time_FromTimeAndFold(
28717db96d56Sopenharmony_ci            hour, minute, second, microsecond,
28727db96d56Sopenharmony_ci            Py_None,
28737db96d56Sopenharmony_ci            fold,
28747db96d56Sopenharmony_ci            PyDateTimeAPI->TimeType);
28757db96d56Sopenharmony_ci    }
28767db96d56Sopenharmony_ci    return rv;
28777db96d56Sopenharmony_ci}
28787db96d56Sopenharmony_ci
28797db96d56Sopenharmony_cistatic PyObject *
28807db96d56Sopenharmony_ciget_delta_fromdsu(PyObject *self, PyObject *args)
28817db96d56Sopenharmony_ci{
28827db96d56Sopenharmony_ci    PyObject *rv = NULL;
28837db96d56Sopenharmony_ci    int macro;
28847db96d56Sopenharmony_ci    int days, seconds, microseconds;
28857db96d56Sopenharmony_ci
28867db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "piii",
28877db96d56Sopenharmony_ci                          &macro,
28887db96d56Sopenharmony_ci                          &days, &seconds, &microseconds)) {
28897db96d56Sopenharmony_ci        return NULL;
28907db96d56Sopenharmony_ci    }
28917db96d56Sopenharmony_ci
28927db96d56Sopenharmony_ci    if (macro) {
28937db96d56Sopenharmony_ci        rv = PyDelta_FromDSU(days, seconds, microseconds);
28947db96d56Sopenharmony_ci    }
28957db96d56Sopenharmony_ci    else {
28967db96d56Sopenharmony_ci        rv = PyDateTimeAPI->Delta_FromDelta(
28977db96d56Sopenharmony_ci            days, seconds, microseconds, 1,
28987db96d56Sopenharmony_ci            PyDateTimeAPI->DeltaType);
28997db96d56Sopenharmony_ci    }
29007db96d56Sopenharmony_ci
29017db96d56Sopenharmony_ci    return rv;
29027db96d56Sopenharmony_ci}
29037db96d56Sopenharmony_ci
29047db96d56Sopenharmony_cistatic PyObject *
29057db96d56Sopenharmony_ciget_date_fromtimestamp(PyObject* self, PyObject *args)
29067db96d56Sopenharmony_ci{
29077db96d56Sopenharmony_ci    PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
29087db96d56Sopenharmony_ci    int macro = 0;
29097db96d56Sopenharmony_ci
29107db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
29117db96d56Sopenharmony_ci        return NULL;
29127db96d56Sopenharmony_ci    }
29137db96d56Sopenharmony_ci
29147db96d56Sopenharmony_ci    // Construct the argument tuple
29157db96d56Sopenharmony_ci    if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
29167db96d56Sopenharmony_ci        return NULL;
29177db96d56Sopenharmony_ci    }
29187db96d56Sopenharmony_ci
29197db96d56Sopenharmony_ci    // Pass along to the API function
29207db96d56Sopenharmony_ci    if (macro) {
29217db96d56Sopenharmony_ci        rv = PyDate_FromTimestamp(tsargs);
29227db96d56Sopenharmony_ci    }
29237db96d56Sopenharmony_ci    else {
29247db96d56Sopenharmony_ci        rv = PyDateTimeAPI->Date_FromTimestamp(
29257db96d56Sopenharmony_ci                (PyObject *)PyDateTimeAPI->DateType, tsargs
29267db96d56Sopenharmony_ci        );
29277db96d56Sopenharmony_ci    }
29287db96d56Sopenharmony_ci
29297db96d56Sopenharmony_ci    Py_DECREF(tsargs);
29307db96d56Sopenharmony_ci    return rv;
29317db96d56Sopenharmony_ci}
29327db96d56Sopenharmony_ci
29337db96d56Sopenharmony_cistatic PyObject *
29347db96d56Sopenharmony_ciget_datetime_fromtimestamp(PyObject* self, PyObject *args)
29357db96d56Sopenharmony_ci{
29367db96d56Sopenharmony_ci    int macro = 0;
29377db96d56Sopenharmony_ci    int usetz = 0;
29387db96d56Sopenharmony_ci    PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
29397db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
29407db96d56Sopenharmony_ci        return NULL;
29417db96d56Sopenharmony_ci    }
29427db96d56Sopenharmony_ci
29437db96d56Sopenharmony_ci    // Construct the argument tuple
29447db96d56Sopenharmony_ci    if (usetz) {
29457db96d56Sopenharmony_ci        tsargs = PyTuple_Pack(2, ts, tzinfo);
29467db96d56Sopenharmony_ci    }
29477db96d56Sopenharmony_ci    else {
29487db96d56Sopenharmony_ci        tsargs = PyTuple_Pack(1, ts);
29497db96d56Sopenharmony_ci    }
29507db96d56Sopenharmony_ci
29517db96d56Sopenharmony_ci    if (tsargs == NULL) {
29527db96d56Sopenharmony_ci        return NULL;
29537db96d56Sopenharmony_ci    }
29547db96d56Sopenharmony_ci
29557db96d56Sopenharmony_ci    // Pass along to the API function
29567db96d56Sopenharmony_ci    if (macro) {
29577db96d56Sopenharmony_ci        rv = PyDateTime_FromTimestamp(tsargs);
29587db96d56Sopenharmony_ci    }
29597db96d56Sopenharmony_ci    else {
29607db96d56Sopenharmony_ci        rv = PyDateTimeAPI->DateTime_FromTimestamp(
29617db96d56Sopenharmony_ci                (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
29627db96d56Sopenharmony_ci        );
29637db96d56Sopenharmony_ci    }
29647db96d56Sopenharmony_ci
29657db96d56Sopenharmony_ci    Py_DECREF(tsargs);
29667db96d56Sopenharmony_ci    return rv;
29677db96d56Sopenharmony_ci}
29687db96d56Sopenharmony_ci
29697db96d56Sopenharmony_cistatic PyObject *
29707db96d56Sopenharmony_citest_PyDateTime_GET(PyObject *self, PyObject *obj)
29717db96d56Sopenharmony_ci{
29727db96d56Sopenharmony_ci    int year, month, day;
29737db96d56Sopenharmony_ci
29747db96d56Sopenharmony_ci    year = PyDateTime_GET_YEAR(obj);
29757db96d56Sopenharmony_ci    month = PyDateTime_GET_MONTH(obj);
29767db96d56Sopenharmony_ci    day = PyDateTime_GET_DAY(obj);
29777db96d56Sopenharmony_ci
29787db96d56Sopenharmony_ci    return Py_BuildValue("(iii)", year, month, day);
29797db96d56Sopenharmony_ci}
29807db96d56Sopenharmony_ci
29817db96d56Sopenharmony_cistatic PyObject *
29827db96d56Sopenharmony_citest_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
29837db96d56Sopenharmony_ci{
29847db96d56Sopenharmony_ci    int hour, minute, second, microsecond;
29857db96d56Sopenharmony_ci
29867db96d56Sopenharmony_ci    hour = PyDateTime_DATE_GET_HOUR(obj);
29877db96d56Sopenharmony_ci    minute = PyDateTime_DATE_GET_MINUTE(obj);
29887db96d56Sopenharmony_ci    second = PyDateTime_DATE_GET_SECOND(obj);
29897db96d56Sopenharmony_ci    microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
29907db96d56Sopenharmony_ci    PyObject *tzinfo = PyDateTime_DATE_GET_TZINFO(obj);
29917db96d56Sopenharmony_ci
29927db96d56Sopenharmony_ci    return Py_BuildValue("(iiiiO)", hour, minute, second, microsecond, tzinfo);
29937db96d56Sopenharmony_ci}
29947db96d56Sopenharmony_ci
29957db96d56Sopenharmony_cistatic PyObject *
29967db96d56Sopenharmony_citest_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
29977db96d56Sopenharmony_ci{
29987db96d56Sopenharmony_ci    int hour, minute, second, microsecond;
29997db96d56Sopenharmony_ci
30007db96d56Sopenharmony_ci    hour = PyDateTime_TIME_GET_HOUR(obj);
30017db96d56Sopenharmony_ci    minute = PyDateTime_TIME_GET_MINUTE(obj);
30027db96d56Sopenharmony_ci    second = PyDateTime_TIME_GET_SECOND(obj);
30037db96d56Sopenharmony_ci    microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
30047db96d56Sopenharmony_ci    PyObject *tzinfo = PyDateTime_TIME_GET_TZINFO(obj);
30057db96d56Sopenharmony_ci
30067db96d56Sopenharmony_ci    return Py_BuildValue("(iiiiO)", hour, minute, second, microsecond, tzinfo);
30077db96d56Sopenharmony_ci}
30087db96d56Sopenharmony_ci
30097db96d56Sopenharmony_cistatic PyObject *
30107db96d56Sopenharmony_citest_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
30117db96d56Sopenharmony_ci{
30127db96d56Sopenharmony_ci    int days, seconds, microseconds;
30137db96d56Sopenharmony_ci
30147db96d56Sopenharmony_ci    days = PyDateTime_DELTA_GET_DAYS(obj);
30157db96d56Sopenharmony_ci    seconds = PyDateTime_DELTA_GET_SECONDS(obj);
30167db96d56Sopenharmony_ci    microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
30177db96d56Sopenharmony_ci
30187db96d56Sopenharmony_ci    return Py_BuildValue("(iii)", days, seconds, microseconds);
30197db96d56Sopenharmony_ci}
30207db96d56Sopenharmony_ci
30217db96d56Sopenharmony_ci/* test_thread_state spawns a thread of its own, and that thread releases
30227db96d56Sopenharmony_ci * `thread_done` when it's finished.  The driver code has to know when the
30237db96d56Sopenharmony_ci * thread finishes, because the thread uses a PyObject (the callable) that
30247db96d56Sopenharmony_ci * may go away when the driver finishes.  The former lack of this explicit
30257db96d56Sopenharmony_ci * synchronization caused rare segfaults, so rare that they were seen only
30267db96d56Sopenharmony_ci * on a Mac buildbot (although they were possible on any box).
30277db96d56Sopenharmony_ci */
30287db96d56Sopenharmony_cistatic PyThread_type_lock thread_done = NULL;
30297db96d56Sopenharmony_ci
30307db96d56Sopenharmony_cistatic int
30317db96d56Sopenharmony_ci_make_call(void *callable)
30327db96d56Sopenharmony_ci{
30337db96d56Sopenharmony_ci    PyObject *rc;
30347db96d56Sopenharmony_ci    int success;
30357db96d56Sopenharmony_ci    PyGILState_STATE s = PyGILState_Ensure();
30367db96d56Sopenharmony_ci    rc = PyObject_CallNoArgs((PyObject *)callable);
30377db96d56Sopenharmony_ci    success = (rc != NULL);
30387db96d56Sopenharmony_ci    Py_XDECREF(rc);
30397db96d56Sopenharmony_ci    PyGILState_Release(s);
30407db96d56Sopenharmony_ci    return success;
30417db96d56Sopenharmony_ci}
30427db96d56Sopenharmony_ci
30437db96d56Sopenharmony_ci/* Same thing, but releases `thread_done` when it returns.  This variant
30447db96d56Sopenharmony_ci * should be called only from threads spawned by test_thread_state().
30457db96d56Sopenharmony_ci */
30467db96d56Sopenharmony_cistatic void
30477db96d56Sopenharmony_ci_make_call_from_thread(void *callable)
30487db96d56Sopenharmony_ci{
30497db96d56Sopenharmony_ci    _make_call(callable);
30507db96d56Sopenharmony_ci    PyThread_release_lock(thread_done);
30517db96d56Sopenharmony_ci}
30527db96d56Sopenharmony_ci
30537db96d56Sopenharmony_cistatic PyObject *
30547db96d56Sopenharmony_citest_thread_state(PyObject *self, PyObject *args)
30557db96d56Sopenharmony_ci{
30567db96d56Sopenharmony_ci    PyObject *fn;
30577db96d56Sopenharmony_ci    int success = 1;
30587db96d56Sopenharmony_ci
30597db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
30607db96d56Sopenharmony_ci        return NULL;
30617db96d56Sopenharmony_ci
30627db96d56Sopenharmony_ci    if (!PyCallable_Check(fn)) {
30637db96d56Sopenharmony_ci        PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
30647db96d56Sopenharmony_ci            Py_TYPE(fn)->tp_name);
30657db96d56Sopenharmony_ci        return NULL;
30667db96d56Sopenharmony_ci    }
30677db96d56Sopenharmony_ci
30687db96d56Sopenharmony_ci    thread_done = PyThread_allocate_lock();
30697db96d56Sopenharmony_ci    if (thread_done == NULL)
30707db96d56Sopenharmony_ci        return PyErr_NoMemory();
30717db96d56Sopenharmony_ci    PyThread_acquire_lock(thread_done, 1);
30727db96d56Sopenharmony_ci
30737db96d56Sopenharmony_ci    /* Start a new thread with our callback. */
30747db96d56Sopenharmony_ci    PyThread_start_new_thread(_make_call_from_thread, fn);
30757db96d56Sopenharmony_ci    /* Make the callback with the thread lock held by this thread */
30767db96d56Sopenharmony_ci    success &= _make_call(fn);
30777db96d56Sopenharmony_ci    /* Do it all again, but this time with the thread-lock released */
30787db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
30797db96d56Sopenharmony_ci    success &= _make_call(fn);
30807db96d56Sopenharmony_ci    PyThread_acquire_lock(thread_done, 1);  /* wait for thread to finish */
30817db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
30827db96d56Sopenharmony_ci
30837db96d56Sopenharmony_ci    /* And once more with and without a thread
30847db96d56Sopenharmony_ci       XXX - should use a lock and work out exactly what we are trying
30857db96d56Sopenharmony_ci       to test <wink>
30867db96d56Sopenharmony_ci    */
30877db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
30887db96d56Sopenharmony_ci    PyThread_start_new_thread(_make_call_from_thread, fn);
30897db96d56Sopenharmony_ci    success &= _make_call(fn);
30907db96d56Sopenharmony_ci    PyThread_acquire_lock(thread_done, 1);  /* wait for thread to finish */
30917db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
30927db96d56Sopenharmony_ci
30937db96d56Sopenharmony_ci    /* Release lock we acquired above.  This is required on HP-UX. */
30947db96d56Sopenharmony_ci    PyThread_release_lock(thread_done);
30957db96d56Sopenharmony_ci
30967db96d56Sopenharmony_ci    PyThread_free_lock(thread_done);
30977db96d56Sopenharmony_ci    if (!success)
30987db96d56Sopenharmony_ci        return NULL;
30997db96d56Sopenharmony_ci    Py_RETURN_NONE;
31007db96d56Sopenharmony_ci}
31017db96d56Sopenharmony_ci
31027db96d56Sopenharmony_ci/* test Py_AddPendingCalls using threads */
31037db96d56Sopenharmony_cistatic int _pending_callback(void *arg)
31047db96d56Sopenharmony_ci{
31057db96d56Sopenharmony_ci    /* we assume the argument is callable object to which we own a reference */
31067db96d56Sopenharmony_ci    PyObject *callable = (PyObject *)arg;
31077db96d56Sopenharmony_ci    PyObject *r = PyObject_CallNoArgs(callable);
31087db96d56Sopenharmony_ci    Py_DECREF(callable);
31097db96d56Sopenharmony_ci    Py_XDECREF(r);
31107db96d56Sopenharmony_ci    return r != NULL ? 0 : -1;
31117db96d56Sopenharmony_ci}
31127db96d56Sopenharmony_ci
31137db96d56Sopenharmony_ci/* The following requests n callbacks to _pending_callback.  It can be
31147db96d56Sopenharmony_ci * run from any python thread.
31157db96d56Sopenharmony_ci */
31167db96d56Sopenharmony_cistatic PyObject *
31177db96d56Sopenharmony_cipending_threadfunc(PyObject *self, PyObject *arg)
31187db96d56Sopenharmony_ci{
31197db96d56Sopenharmony_ci    PyObject *callable;
31207db96d56Sopenharmony_ci    int r;
31217db96d56Sopenharmony_ci    if (PyArg_ParseTuple(arg, "O", &callable) == 0)
31227db96d56Sopenharmony_ci        return NULL;
31237db96d56Sopenharmony_ci
31247db96d56Sopenharmony_ci    /* create the reference for the callbackwhile we hold the lock */
31257db96d56Sopenharmony_ci    Py_INCREF(callable);
31267db96d56Sopenharmony_ci
31277db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
31287db96d56Sopenharmony_ci    r = Py_AddPendingCall(&_pending_callback, callable);
31297db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
31307db96d56Sopenharmony_ci
31317db96d56Sopenharmony_ci    if (r<0) {
31327db96d56Sopenharmony_ci        Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
31337db96d56Sopenharmony_ci        Py_RETURN_FALSE;
31347db96d56Sopenharmony_ci    }
31357db96d56Sopenharmony_ci    Py_RETURN_TRUE;
31367db96d56Sopenharmony_ci}
31377db96d56Sopenharmony_ci
31387db96d56Sopenharmony_ci/* Some tests of PyUnicode_FromFormat().  This needs more tests. */
31397db96d56Sopenharmony_cistatic PyObject *
31407db96d56Sopenharmony_citest_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
31417db96d56Sopenharmony_ci{
31427db96d56Sopenharmony_ci    PyObject *result;
31437db96d56Sopenharmony_ci    char *msg;
31447db96d56Sopenharmony_ci
31457db96d56Sopenharmony_ci#define CHECK_1_FORMAT(FORMAT, TYPE)                                \
31467db96d56Sopenharmony_ci    result = PyUnicode_FromFormat(FORMAT, (TYPE)1);                 \
31477db96d56Sopenharmony_ci    if (result == NULL)                                             \
31487db96d56Sopenharmony_ci        return NULL;                                                \
31497db96d56Sopenharmony_ci    if (!_PyUnicode_EqualToASCIIString(result, "1")) {              \
31507db96d56Sopenharmony_ci        msg = FORMAT " failed at 1";                                \
31517db96d56Sopenharmony_ci        goto Fail;                                                  \
31527db96d56Sopenharmony_ci    }                                                               \
31537db96d56Sopenharmony_ci    Py_DECREF(result)
31547db96d56Sopenharmony_ci
31557db96d56Sopenharmony_ci    CHECK_1_FORMAT("%d", int);
31567db96d56Sopenharmony_ci    CHECK_1_FORMAT("%ld", long);
31577db96d56Sopenharmony_ci    /* The z width modifier was added in Python 2.5. */
31587db96d56Sopenharmony_ci    CHECK_1_FORMAT("%zd", Py_ssize_t);
31597db96d56Sopenharmony_ci
31607db96d56Sopenharmony_ci    /* The u type code was added in Python 2.5. */
31617db96d56Sopenharmony_ci    CHECK_1_FORMAT("%u", unsigned int);
31627db96d56Sopenharmony_ci    CHECK_1_FORMAT("%lu", unsigned long);
31637db96d56Sopenharmony_ci    CHECK_1_FORMAT("%zu", size_t);
31647db96d56Sopenharmony_ci
31657db96d56Sopenharmony_ci    /* "%lld" and "%llu" support added in Python 2.7. */
31667db96d56Sopenharmony_ci    CHECK_1_FORMAT("%llu", unsigned long long);
31677db96d56Sopenharmony_ci    CHECK_1_FORMAT("%lld", long long);
31687db96d56Sopenharmony_ci
31697db96d56Sopenharmony_ci    Py_RETURN_NONE;
31707db96d56Sopenharmony_ci
31717db96d56Sopenharmony_ci Fail:
31727db96d56Sopenharmony_ci    Py_XDECREF(result);
31737db96d56Sopenharmony_ci    return raiseTestError("test_string_from_format", msg);
31747db96d56Sopenharmony_ci
31757db96d56Sopenharmony_ci#undef CHECK_1_FORMAT
31767db96d56Sopenharmony_ci}
31777db96d56Sopenharmony_ci
31787db96d56Sopenharmony_ci
31797db96d56Sopenharmony_cistatic PyObject *
31807db96d56Sopenharmony_citest_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
31817db96d56Sopenharmony_ci    PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
31827db96d56Sopenharmony_ci    int result;
31837db96d56Sopenharmony_ci    if (py_s == NULL)
31847db96d56Sopenharmony_ci        return NULL;
31857db96d56Sopenharmony_ci    result = PyUnicode_CompareWithASCIIString(py_s, "str");
31867db96d56Sopenharmony_ci    Py_DECREF(py_s);
31877db96d56Sopenharmony_ci    if (!result) {
31887db96d56Sopenharmony_ci        PyErr_SetString(TestError, "Python string ending in NULL "
31897db96d56Sopenharmony_ci                        "should not compare equal to c string.");
31907db96d56Sopenharmony_ci        return NULL;
31917db96d56Sopenharmony_ci    }
31927db96d56Sopenharmony_ci    Py_RETURN_NONE;
31937db96d56Sopenharmony_ci}
31947db96d56Sopenharmony_ci
31957db96d56Sopenharmony_ci/* This is here to provide a docstring for test_descr. */
31967db96d56Sopenharmony_cistatic PyObject *
31977db96d56Sopenharmony_citest_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
31987db96d56Sopenharmony_ci{
31997db96d56Sopenharmony_ci    Py_RETURN_NONE;
32007db96d56Sopenharmony_ci}
32017db96d56Sopenharmony_ci
32027db96d56Sopenharmony_ci/* Test PyOS_string_to_double. */
32037db96d56Sopenharmony_cistatic PyObject *
32047db96d56Sopenharmony_citest_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
32057db96d56Sopenharmony_ci    double result;
32067db96d56Sopenharmony_ci    const char *msg;
32077db96d56Sopenharmony_ci
32087db96d56Sopenharmony_ci#define CHECK_STRING(STR, expected)                             \
32097db96d56Sopenharmony_ci    result = PyOS_string_to_double(STR, NULL, NULL);            \
32107db96d56Sopenharmony_ci    if (result == -1.0 && PyErr_Occurred())                     \
32117db96d56Sopenharmony_ci        return NULL;                                            \
32127db96d56Sopenharmony_ci    if (result != (double)expected) {                           \
32137db96d56Sopenharmony_ci        msg = "conversion of " STR " to float failed";          \
32147db96d56Sopenharmony_ci        goto fail;                                              \
32157db96d56Sopenharmony_ci    }
32167db96d56Sopenharmony_ci
32177db96d56Sopenharmony_ci#define CHECK_INVALID(STR)                                              \
32187db96d56Sopenharmony_ci    result = PyOS_string_to_double(STR, NULL, NULL);                    \
32197db96d56Sopenharmony_ci    if (result == -1.0 && PyErr_Occurred()) {                           \
32207db96d56Sopenharmony_ci        if (PyErr_ExceptionMatches(PyExc_ValueError))                   \
32217db96d56Sopenharmony_ci            PyErr_Clear();                                              \
32227db96d56Sopenharmony_ci        else                                                            \
32237db96d56Sopenharmony_ci            return NULL;                                                \
32247db96d56Sopenharmony_ci    }                                                                   \
32257db96d56Sopenharmony_ci    else {                                                              \
32267db96d56Sopenharmony_ci        msg = "conversion of " STR " didn't raise ValueError";          \
32277db96d56Sopenharmony_ci        goto fail;                                                      \
32287db96d56Sopenharmony_ci    }
32297db96d56Sopenharmony_ci
32307db96d56Sopenharmony_ci    CHECK_STRING("0.1", 0.1);
32317db96d56Sopenharmony_ci    CHECK_STRING("1.234", 1.234);
32327db96d56Sopenharmony_ci    CHECK_STRING("-1.35", -1.35);
32337db96d56Sopenharmony_ci    CHECK_STRING(".1e01", 1.0);
32347db96d56Sopenharmony_ci    CHECK_STRING("2.e-2", 0.02);
32357db96d56Sopenharmony_ci
32367db96d56Sopenharmony_ci    CHECK_INVALID(" 0.1");
32377db96d56Sopenharmony_ci    CHECK_INVALID("\t\n-3");
32387db96d56Sopenharmony_ci    CHECK_INVALID(".123 ");
32397db96d56Sopenharmony_ci    CHECK_INVALID("3\n");
32407db96d56Sopenharmony_ci    CHECK_INVALID("123abc");
32417db96d56Sopenharmony_ci
32427db96d56Sopenharmony_ci    Py_RETURN_NONE;
32437db96d56Sopenharmony_ci  fail:
32447db96d56Sopenharmony_ci    return raiseTestError("test_string_to_double", msg);
32457db96d56Sopenharmony_ci#undef CHECK_STRING
32467db96d56Sopenharmony_ci#undef CHECK_INVALID
32477db96d56Sopenharmony_ci}
32487db96d56Sopenharmony_ci
32497db96d56Sopenharmony_ci
32507db96d56Sopenharmony_ci/* Coverage testing of capsule objects. */
32517db96d56Sopenharmony_ci
32527db96d56Sopenharmony_cistatic const char *capsule_name = "capsule name";
32537db96d56Sopenharmony_cistatic       char *capsule_pointer = "capsule pointer";
32547db96d56Sopenharmony_cistatic       char *capsule_context = "capsule context";
32557db96d56Sopenharmony_cistatic const char *capsule_error = NULL;
32567db96d56Sopenharmony_cistatic int
32577db96d56Sopenharmony_cicapsule_destructor_call_count = 0;
32587db96d56Sopenharmony_ci
32597db96d56Sopenharmony_cistatic void
32607db96d56Sopenharmony_cicapsule_destructor(PyObject *o) {
32617db96d56Sopenharmony_ci    capsule_destructor_call_count++;
32627db96d56Sopenharmony_ci    if (PyCapsule_GetContext(o) != capsule_context) {
32637db96d56Sopenharmony_ci        capsule_error = "context did not match in destructor!";
32647db96d56Sopenharmony_ci    } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
32657db96d56Sopenharmony_ci        capsule_error = "destructor did not match in destructor!  (woah!)";
32667db96d56Sopenharmony_ci    } else if (PyCapsule_GetName(o) != capsule_name) {
32677db96d56Sopenharmony_ci        capsule_error = "name did not match in destructor!";
32687db96d56Sopenharmony_ci    } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
32697db96d56Sopenharmony_ci        capsule_error = "pointer did not match in destructor!";
32707db96d56Sopenharmony_ci    }
32717db96d56Sopenharmony_ci}
32727db96d56Sopenharmony_ci
32737db96d56Sopenharmony_citypedef struct {
32747db96d56Sopenharmony_ci    char *name;
32757db96d56Sopenharmony_ci    char *module;
32767db96d56Sopenharmony_ci    char *attribute;
32777db96d56Sopenharmony_ci} known_capsule;
32787db96d56Sopenharmony_ci
32797db96d56Sopenharmony_cistatic PyObject *
32807db96d56Sopenharmony_citest_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
32817db96d56Sopenharmony_ci{
32827db96d56Sopenharmony_ci    PyObject *object;
32837db96d56Sopenharmony_ci    const char *error = NULL;
32847db96d56Sopenharmony_ci    void *pointer;
32857db96d56Sopenharmony_ci    void *pointer2;
32867db96d56Sopenharmony_ci    known_capsule known_capsules[] = {
32877db96d56Sopenharmony_ci        #define KNOWN_CAPSULE(module, name)             { module "." name, module, name }
32887db96d56Sopenharmony_ci        KNOWN_CAPSULE("_socket", "CAPI"),
32897db96d56Sopenharmony_ci        KNOWN_CAPSULE("_curses", "_C_API"),
32907db96d56Sopenharmony_ci        KNOWN_CAPSULE("datetime", "datetime_CAPI"),
32917db96d56Sopenharmony_ci        { NULL, NULL },
32927db96d56Sopenharmony_ci    };
32937db96d56Sopenharmony_ci    known_capsule *known = &known_capsules[0];
32947db96d56Sopenharmony_ci
32957db96d56Sopenharmony_ci#define FAIL(x) { error = (x); goto exit; }
32967db96d56Sopenharmony_ci
32977db96d56Sopenharmony_ci#define CHECK_DESTRUCTOR \
32987db96d56Sopenharmony_ci    if (capsule_error) { \
32997db96d56Sopenharmony_ci        FAIL(capsule_error); \
33007db96d56Sopenharmony_ci    } \
33017db96d56Sopenharmony_ci    else if (!capsule_destructor_call_count) {          \
33027db96d56Sopenharmony_ci        FAIL("destructor not called!"); \
33037db96d56Sopenharmony_ci    } \
33047db96d56Sopenharmony_ci    capsule_destructor_call_count = 0; \
33057db96d56Sopenharmony_ci
33067db96d56Sopenharmony_ci    object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
33077db96d56Sopenharmony_ci    PyCapsule_SetContext(object, capsule_context);
33087db96d56Sopenharmony_ci    capsule_destructor(object);
33097db96d56Sopenharmony_ci    CHECK_DESTRUCTOR;
33107db96d56Sopenharmony_ci    Py_DECREF(object);
33117db96d56Sopenharmony_ci    CHECK_DESTRUCTOR;
33127db96d56Sopenharmony_ci
33137db96d56Sopenharmony_ci    object = PyCapsule_New(known, "ignored", NULL);
33147db96d56Sopenharmony_ci    PyCapsule_SetPointer(object, capsule_pointer);
33157db96d56Sopenharmony_ci    PyCapsule_SetName(object, capsule_name);
33167db96d56Sopenharmony_ci    PyCapsule_SetDestructor(object, capsule_destructor);
33177db96d56Sopenharmony_ci    PyCapsule_SetContext(object, capsule_context);
33187db96d56Sopenharmony_ci    capsule_destructor(object);
33197db96d56Sopenharmony_ci    CHECK_DESTRUCTOR;
33207db96d56Sopenharmony_ci    /* intentionally access using the wrong name */
33217db96d56Sopenharmony_ci    pointer2 = PyCapsule_GetPointer(object, "the wrong name");
33227db96d56Sopenharmony_ci    if (!PyErr_Occurred()) {
33237db96d56Sopenharmony_ci        FAIL("PyCapsule_GetPointer should have failed but did not!");
33247db96d56Sopenharmony_ci    }
33257db96d56Sopenharmony_ci    PyErr_Clear();
33267db96d56Sopenharmony_ci    if (pointer2) {
33277db96d56Sopenharmony_ci        if (pointer2 == capsule_pointer) {
33287db96d56Sopenharmony_ci            FAIL("PyCapsule_GetPointer should not have"
33297db96d56Sopenharmony_ci                     " returned the internal pointer!");
33307db96d56Sopenharmony_ci        } else {
33317db96d56Sopenharmony_ci            FAIL("PyCapsule_GetPointer should have "
33327db96d56Sopenharmony_ci                     "returned NULL pointer but did not!");
33337db96d56Sopenharmony_ci        }
33347db96d56Sopenharmony_ci    }
33357db96d56Sopenharmony_ci    PyCapsule_SetDestructor(object, NULL);
33367db96d56Sopenharmony_ci    Py_DECREF(object);
33377db96d56Sopenharmony_ci    if (capsule_destructor_call_count) {
33387db96d56Sopenharmony_ci        FAIL("destructor called when it should not have been!");
33397db96d56Sopenharmony_ci    }
33407db96d56Sopenharmony_ci
33417db96d56Sopenharmony_ci    for (known = &known_capsules[0]; known->module != NULL; known++) {
33427db96d56Sopenharmony_ci        /* yeah, ordinarily I wouldn't do this either,
33437db96d56Sopenharmony_ci           but it's fine for this test harness.
33447db96d56Sopenharmony_ci        */
33457db96d56Sopenharmony_ci        static char buffer[256];
33467db96d56Sopenharmony_ci#undef FAIL
33477db96d56Sopenharmony_ci#define FAIL(x) \
33487db96d56Sopenharmony_ci        { \
33497db96d56Sopenharmony_ci        sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
33507db96d56Sopenharmony_ci            x, known->module, known->attribute); \
33517db96d56Sopenharmony_ci        error = buffer; \
33527db96d56Sopenharmony_ci        goto exit; \
33537db96d56Sopenharmony_ci        } \
33547db96d56Sopenharmony_ci
33557db96d56Sopenharmony_ci        PyObject *module = PyImport_ImportModule(known->module);
33567db96d56Sopenharmony_ci        if (module) {
33577db96d56Sopenharmony_ci            pointer = PyCapsule_Import(known->name, 0);
33587db96d56Sopenharmony_ci            if (!pointer) {
33597db96d56Sopenharmony_ci                Py_DECREF(module);
33607db96d56Sopenharmony_ci                FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
33617db96d56Sopenharmony_ci            }
33627db96d56Sopenharmony_ci            object = PyObject_GetAttrString(module, known->attribute);
33637db96d56Sopenharmony_ci            if (!object) {
33647db96d56Sopenharmony_ci                Py_DECREF(module);
33657db96d56Sopenharmony_ci                return NULL;
33667db96d56Sopenharmony_ci            }
33677db96d56Sopenharmony_ci            pointer2 = PyCapsule_GetPointer(object,
33687db96d56Sopenharmony_ci                                    "weebles wobble but they don't fall down");
33697db96d56Sopenharmony_ci            if (!PyErr_Occurred()) {
33707db96d56Sopenharmony_ci                Py_DECREF(object);
33717db96d56Sopenharmony_ci                Py_DECREF(module);
33727db96d56Sopenharmony_ci                FAIL("PyCapsule_GetPointer should have failed but did not!");
33737db96d56Sopenharmony_ci            }
33747db96d56Sopenharmony_ci            PyErr_Clear();
33757db96d56Sopenharmony_ci            if (pointer2) {
33767db96d56Sopenharmony_ci                Py_DECREF(module);
33777db96d56Sopenharmony_ci                Py_DECREF(object);
33787db96d56Sopenharmony_ci                if (pointer2 == pointer) {
33797db96d56Sopenharmony_ci                    FAIL("PyCapsule_GetPointer should not have"
33807db96d56Sopenharmony_ci                             " returned its internal pointer!");
33817db96d56Sopenharmony_ci                } else {
33827db96d56Sopenharmony_ci                    FAIL("PyCapsule_GetPointer should have"
33837db96d56Sopenharmony_ci                             " returned NULL pointer but did not!");
33847db96d56Sopenharmony_ci                }
33857db96d56Sopenharmony_ci            }
33867db96d56Sopenharmony_ci            Py_DECREF(object);
33877db96d56Sopenharmony_ci            Py_DECREF(module);
33887db96d56Sopenharmony_ci        }
33897db96d56Sopenharmony_ci        else
33907db96d56Sopenharmony_ci            PyErr_Clear();
33917db96d56Sopenharmony_ci    }
33927db96d56Sopenharmony_ci
33937db96d56Sopenharmony_ci  exit:
33947db96d56Sopenharmony_ci    if (error) {
33957db96d56Sopenharmony_ci        return raiseTestError("test_capsule", error);
33967db96d56Sopenharmony_ci    }
33977db96d56Sopenharmony_ci    Py_RETURN_NONE;
33987db96d56Sopenharmony_ci#undef FAIL
33997db96d56Sopenharmony_ci}
34007db96d56Sopenharmony_ci
34017db96d56Sopenharmony_ci#ifdef HAVE_GETTIMEOFDAY
34027db96d56Sopenharmony_ci/* Profiling of integer performance */
34037db96d56Sopenharmony_cistatic void print_delta(int test, struct timeval *s, struct timeval *e)
34047db96d56Sopenharmony_ci{
34057db96d56Sopenharmony_ci    e->tv_sec -= s->tv_sec;
34067db96d56Sopenharmony_ci    e->tv_usec -= s->tv_usec;
34077db96d56Sopenharmony_ci    if (e->tv_usec < 0) {
34087db96d56Sopenharmony_ci        e->tv_sec -=1;
34097db96d56Sopenharmony_ci        e->tv_usec += 1000000;
34107db96d56Sopenharmony_ci    }
34117db96d56Sopenharmony_ci    printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
34127db96d56Sopenharmony_ci}
34137db96d56Sopenharmony_ci
34147db96d56Sopenharmony_cistatic PyObject *
34157db96d56Sopenharmony_ciprofile_int(PyObject *self, PyObject* args)
34167db96d56Sopenharmony_ci{
34177db96d56Sopenharmony_ci    int i, k;
34187db96d56Sopenharmony_ci    struct timeval start, stop;
34197db96d56Sopenharmony_ci    PyObject *single, **multiple, *op1, *result;
34207db96d56Sopenharmony_ci
34217db96d56Sopenharmony_ci    /* Test 1: Allocate and immediately deallocate
34227db96d56Sopenharmony_ci       many small integers */
34237db96d56Sopenharmony_ci    gettimeofday(&start, NULL);
34247db96d56Sopenharmony_ci    for(k=0; k < 20000; k++)
34257db96d56Sopenharmony_ci        for(i=0; i < 1000; i++) {
34267db96d56Sopenharmony_ci            single = PyLong_FromLong(i);
34277db96d56Sopenharmony_ci            Py_DECREF(single);
34287db96d56Sopenharmony_ci        }
34297db96d56Sopenharmony_ci    gettimeofday(&stop, NULL);
34307db96d56Sopenharmony_ci    print_delta(1, &start, &stop);
34317db96d56Sopenharmony_ci
34327db96d56Sopenharmony_ci    /* Test 2: Allocate and immediately deallocate
34337db96d56Sopenharmony_ci       many large integers */
34347db96d56Sopenharmony_ci    gettimeofday(&start, NULL);
34357db96d56Sopenharmony_ci    for(k=0; k < 20000; k++)
34367db96d56Sopenharmony_ci        for(i=0; i < 1000; i++) {
34377db96d56Sopenharmony_ci            single = PyLong_FromLong(i+1000000);
34387db96d56Sopenharmony_ci            Py_DECREF(single);
34397db96d56Sopenharmony_ci        }
34407db96d56Sopenharmony_ci    gettimeofday(&stop, NULL);
34417db96d56Sopenharmony_ci    print_delta(2, &start, &stop);
34427db96d56Sopenharmony_ci
34437db96d56Sopenharmony_ci    /* Test 3: Allocate a few integers, then release
34447db96d56Sopenharmony_ci       them all simultaneously. */
34457db96d56Sopenharmony_ci    multiple = malloc(sizeof(PyObject*) * 1000);
34467db96d56Sopenharmony_ci    if (multiple == NULL)
34477db96d56Sopenharmony_ci        return PyErr_NoMemory();
34487db96d56Sopenharmony_ci    gettimeofday(&start, NULL);
34497db96d56Sopenharmony_ci    for(k=0; k < 20000; k++) {
34507db96d56Sopenharmony_ci        for(i=0; i < 1000; i++) {
34517db96d56Sopenharmony_ci            multiple[i] = PyLong_FromLong(i+1000000);
34527db96d56Sopenharmony_ci        }
34537db96d56Sopenharmony_ci        for(i=0; i < 1000; i++) {
34547db96d56Sopenharmony_ci            Py_DECREF(multiple[i]);
34557db96d56Sopenharmony_ci        }
34567db96d56Sopenharmony_ci    }
34577db96d56Sopenharmony_ci    gettimeofday(&stop, NULL);
34587db96d56Sopenharmony_ci    print_delta(3, &start, &stop);
34597db96d56Sopenharmony_ci    free(multiple);
34607db96d56Sopenharmony_ci
34617db96d56Sopenharmony_ci    /* Test 4: Allocate many integers, then release
34627db96d56Sopenharmony_ci       them all simultaneously. */
34637db96d56Sopenharmony_ci    multiple = malloc(sizeof(PyObject*) * 1000000);
34647db96d56Sopenharmony_ci    if (multiple == NULL)
34657db96d56Sopenharmony_ci        return PyErr_NoMemory();
34667db96d56Sopenharmony_ci    gettimeofday(&start, NULL);
34677db96d56Sopenharmony_ci    for(k=0; k < 20; k++) {
34687db96d56Sopenharmony_ci        for(i=0; i < 1000000; i++) {
34697db96d56Sopenharmony_ci            multiple[i] = PyLong_FromLong(i+1000000);
34707db96d56Sopenharmony_ci        }
34717db96d56Sopenharmony_ci        for(i=0; i < 1000000; i++) {
34727db96d56Sopenharmony_ci            Py_DECREF(multiple[i]);
34737db96d56Sopenharmony_ci        }
34747db96d56Sopenharmony_ci    }
34757db96d56Sopenharmony_ci    gettimeofday(&stop, NULL);
34767db96d56Sopenharmony_ci    print_delta(4, &start, &stop);
34777db96d56Sopenharmony_ci    free(multiple);
34787db96d56Sopenharmony_ci
34797db96d56Sopenharmony_ci    /* Test 5: Allocate many integers < 32000 */
34807db96d56Sopenharmony_ci    multiple = malloc(sizeof(PyObject*) * 1000000);
34817db96d56Sopenharmony_ci    if (multiple == NULL)
34827db96d56Sopenharmony_ci        return PyErr_NoMemory();
34837db96d56Sopenharmony_ci    gettimeofday(&start, NULL);
34847db96d56Sopenharmony_ci    for(k=0; k < 10; k++) {
34857db96d56Sopenharmony_ci        for(i=0; i < 1000000; i++) {
34867db96d56Sopenharmony_ci            multiple[i] = PyLong_FromLong(i+1000);
34877db96d56Sopenharmony_ci        }
34887db96d56Sopenharmony_ci        for(i=0; i < 1000000; i++) {
34897db96d56Sopenharmony_ci            Py_DECREF(multiple[i]);
34907db96d56Sopenharmony_ci        }
34917db96d56Sopenharmony_ci    }
34927db96d56Sopenharmony_ci    gettimeofday(&stop, NULL);
34937db96d56Sopenharmony_ci    print_delta(5, &start, &stop);
34947db96d56Sopenharmony_ci    free(multiple);
34957db96d56Sopenharmony_ci
34967db96d56Sopenharmony_ci    /* Test 6: Perform small int addition */
34977db96d56Sopenharmony_ci    op1 = PyLong_FromLong(1);
34987db96d56Sopenharmony_ci    gettimeofday(&start, NULL);
34997db96d56Sopenharmony_ci    for(i=0; i < 10000000; i++) {
35007db96d56Sopenharmony_ci        result = PyNumber_Add(op1, op1);
35017db96d56Sopenharmony_ci        Py_DECREF(result);
35027db96d56Sopenharmony_ci    }
35037db96d56Sopenharmony_ci    gettimeofday(&stop, NULL);
35047db96d56Sopenharmony_ci    Py_DECREF(op1);
35057db96d56Sopenharmony_ci    print_delta(6, &start, &stop);
35067db96d56Sopenharmony_ci
35077db96d56Sopenharmony_ci    /* Test 7: Perform medium int addition */
35087db96d56Sopenharmony_ci    op1 = PyLong_FromLong(1000);
35097db96d56Sopenharmony_ci    if (op1 == NULL)
35107db96d56Sopenharmony_ci        return NULL;
35117db96d56Sopenharmony_ci    gettimeofday(&start, NULL);
35127db96d56Sopenharmony_ci    for(i=0; i < 10000000; i++) {
35137db96d56Sopenharmony_ci        result = PyNumber_Add(op1, op1);
35147db96d56Sopenharmony_ci        Py_XDECREF(result);
35157db96d56Sopenharmony_ci    }
35167db96d56Sopenharmony_ci    gettimeofday(&stop, NULL);
35177db96d56Sopenharmony_ci    Py_DECREF(op1);
35187db96d56Sopenharmony_ci    print_delta(7, &start, &stop);
35197db96d56Sopenharmony_ci
35207db96d56Sopenharmony_ci    Py_RETURN_NONE;
35217db96d56Sopenharmony_ci}
35227db96d56Sopenharmony_ci#endif
35237db96d56Sopenharmony_ci
35247db96d56Sopenharmony_ci/* To test the format of tracebacks as printed out. */
35257db96d56Sopenharmony_cistatic PyObject *
35267db96d56Sopenharmony_citraceback_print(PyObject *self, PyObject *args)
35277db96d56Sopenharmony_ci{
35287db96d56Sopenharmony_ci    PyObject *file;
35297db96d56Sopenharmony_ci    PyObject *traceback;
35307db96d56Sopenharmony_ci    int result;
35317db96d56Sopenharmony_ci
35327db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OO:traceback_print",
35337db96d56Sopenharmony_ci                            &traceback, &file))
35347db96d56Sopenharmony_ci        return NULL;
35357db96d56Sopenharmony_ci
35367db96d56Sopenharmony_ci    result = PyTraceBack_Print(traceback, file);
35377db96d56Sopenharmony_ci    if (result < 0)
35387db96d56Sopenharmony_ci        return NULL;
35397db96d56Sopenharmony_ci    Py_RETURN_NONE;
35407db96d56Sopenharmony_ci}
35417db96d56Sopenharmony_ci
35427db96d56Sopenharmony_ci/* To test the format of exceptions as printed out. */
35437db96d56Sopenharmony_cistatic PyObject *
35447db96d56Sopenharmony_ciexception_print(PyObject *self, PyObject *args)
35457db96d56Sopenharmony_ci{
35467db96d56Sopenharmony_ci    PyObject *value;
35477db96d56Sopenharmony_ci    PyObject *tb = NULL;
35487db96d56Sopenharmony_ci
35497db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O:exception_print",
35507db96d56Sopenharmony_ci                            &value)) {
35517db96d56Sopenharmony_ci        return NULL;
35527db96d56Sopenharmony_ci    }
35537db96d56Sopenharmony_ci
35547db96d56Sopenharmony_ci    if (PyExceptionInstance_Check(value)) {
35557db96d56Sopenharmony_ci        tb = PyException_GetTraceback(value);
35567db96d56Sopenharmony_ci    }
35577db96d56Sopenharmony_ci
35587db96d56Sopenharmony_ci    PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
35597db96d56Sopenharmony_ci    Py_XDECREF(tb);
35607db96d56Sopenharmony_ci
35617db96d56Sopenharmony_ci    Py_RETURN_NONE;
35627db96d56Sopenharmony_ci}
35637db96d56Sopenharmony_ci
35647db96d56Sopenharmony_ci
35657db96d56Sopenharmony_ci
35667db96d56Sopenharmony_ci
35677db96d56Sopenharmony_ci/* reliably raise a MemoryError */
35687db96d56Sopenharmony_cistatic PyObject *
35697db96d56Sopenharmony_ciraise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
35707db96d56Sopenharmony_ci{
35717db96d56Sopenharmony_ci    PyErr_NoMemory();
35727db96d56Sopenharmony_ci    return NULL;
35737db96d56Sopenharmony_ci}
35747db96d56Sopenharmony_ci
35757db96d56Sopenharmony_ci/* Issue 6012 */
35767db96d56Sopenharmony_cistatic PyObject *str1, *str2;
35777db96d56Sopenharmony_cistatic int
35787db96d56Sopenharmony_cifailing_converter(PyObject *obj, void *arg)
35797db96d56Sopenharmony_ci{
35807db96d56Sopenharmony_ci    /* Clone str1, then let the conversion fail. */
35817db96d56Sopenharmony_ci    assert(str1);
35827db96d56Sopenharmony_ci    str2 = str1;
35837db96d56Sopenharmony_ci    Py_INCREF(str2);
35847db96d56Sopenharmony_ci    return 0;
35857db96d56Sopenharmony_ci}
35867db96d56Sopenharmony_cistatic PyObject*
35877db96d56Sopenharmony_ciargparsing(PyObject *o, PyObject *args)
35887db96d56Sopenharmony_ci{
35897db96d56Sopenharmony_ci    PyObject *res;
35907db96d56Sopenharmony_ci    str1 = str2 = NULL;
35917db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O&O&",
35927db96d56Sopenharmony_ci                          PyUnicode_FSConverter, &str1,
35937db96d56Sopenharmony_ci                          failing_converter, &str2)) {
35947db96d56Sopenharmony_ci        if (!str2)
35957db96d56Sopenharmony_ci            /* argument converter not called? */
35967db96d56Sopenharmony_ci            return NULL;
35977db96d56Sopenharmony_ci        /* Should be 1 */
35987db96d56Sopenharmony_ci        res = PyLong_FromSsize_t(Py_REFCNT(str2));
35997db96d56Sopenharmony_ci        Py_DECREF(str2);
36007db96d56Sopenharmony_ci        PyErr_Clear();
36017db96d56Sopenharmony_ci        return res;
36027db96d56Sopenharmony_ci    }
36037db96d56Sopenharmony_ci    Py_RETURN_NONE;
36047db96d56Sopenharmony_ci}
36057db96d56Sopenharmony_ci
36067db96d56Sopenharmony_ci/* To test that the result of PyCode_NewEmpty has the right members. */
36077db96d56Sopenharmony_cistatic PyObject *
36087db96d56Sopenharmony_cicode_newempty(PyObject *self, PyObject *args)
36097db96d56Sopenharmony_ci{
36107db96d56Sopenharmony_ci    const char *filename;
36117db96d56Sopenharmony_ci    const char *funcname;
36127db96d56Sopenharmony_ci    int firstlineno;
36137db96d56Sopenharmony_ci
36147db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "ssi:code_newempty",
36157db96d56Sopenharmony_ci                          &filename, &funcname, &firstlineno))
36167db96d56Sopenharmony_ci        return NULL;
36177db96d56Sopenharmony_ci
36187db96d56Sopenharmony_ci    return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
36197db96d56Sopenharmony_ci}
36207db96d56Sopenharmony_ci
36217db96d56Sopenharmony_ci/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
36227db96d56Sopenharmony_ci   Run via Lib/test/test_exceptions.py */
36237db96d56Sopenharmony_cistatic PyObject *
36247db96d56Sopenharmony_cimake_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
36257db96d56Sopenharmony_ci{
36267db96d56Sopenharmony_ci    const char *name;
36277db96d56Sopenharmony_ci    const char *doc = NULL;
36287db96d56Sopenharmony_ci    PyObject *base = NULL;
36297db96d56Sopenharmony_ci    PyObject *dict = NULL;
36307db96d56Sopenharmony_ci
36317db96d56Sopenharmony_ci    static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
36327db96d56Sopenharmony_ci
36337db96d56Sopenharmony_ci    if (!PyArg_ParseTupleAndKeywords(args, kwargs,
36347db96d56Sopenharmony_ci                    "s|sOO:make_exception_with_doc", kwlist,
36357db96d56Sopenharmony_ci                                     &name, &doc, &base, &dict))
36367db96d56Sopenharmony_ci        return NULL;
36377db96d56Sopenharmony_ci
36387db96d56Sopenharmony_ci    return PyErr_NewExceptionWithDoc(name, doc, base, dict);
36397db96d56Sopenharmony_ci}
36407db96d56Sopenharmony_ci
36417db96d56Sopenharmony_cistatic PyObject *
36427db96d56Sopenharmony_cimake_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
36437db96d56Sopenharmony_ci{
36447db96d56Sopenharmony_ci    Py_buffer info;
36457db96d56Sopenharmony_ci    if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
36467db96d56Sopenharmony_ci        return NULL;
36477db96d56Sopenharmony_ci    return PyMemoryView_FromBuffer(&info);
36487db96d56Sopenharmony_ci}
36497db96d56Sopenharmony_ci
36507db96d56Sopenharmony_cistatic PyObject *
36517db96d56Sopenharmony_citest_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
36527db96d56Sopenharmony_ci{
36537db96d56Sopenharmony_ci    int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
36547db96d56Sopenharmony_ci    int init[5] = {0, 1, 2, 3, 4};
36557db96d56Sopenharmony_ci    Py_ssize_t itemsize = sizeof(int);
36567db96d56Sopenharmony_ci    Py_ssize_t shape = 5;
36577db96d56Sopenharmony_ci    Py_ssize_t strides = 2 * itemsize;
36587db96d56Sopenharmony_ci    Py_buffer view = {
36597db96d56Sopenharmony_ci        data,
36607db96d56Sopenharmony_ci        NULL,
36617db96d56Sopenharmony_ci        5 * itemsize,
36627db96d56Sopenharmony_ci        itemsize,
36637db96d56Sopenharmony_ci        1,
36647db96d56Sopenharmony_ci        1,
36657db96d56Sopenharmony_ci        NULL,
36667db96d56Sopenharmony_ci        &shape,
36677db96d56Sopenharmony_ci        &strides,
36687db96d56Sopenharmony_ci        NULL,
36697db96d56Sopenharmony_ci        NULL
36707db96d56Sopenharmony_ci    };
36717db96d56Sopenharmony_ci    int *ptr;
36727db96d56Sopenharmony_ci    int i;
36737db96d56Sopenharmony_ci
36747db96d56Sopenharmony_ci    PyBuffer_FromContiguous(&view, init, view.len, 'C');
36757db96d56Sopenharmony_ci    ptr = view.buf;
36767db96d56Sopenharmony_ci    for (i = 0; i < 5; i++) {
36777db96d56Sopenharmony_ci        if (ptr[2*i] != i) {
36787db96d56Sopenharmony_ci            PyErr_SetString(TestError,
36797db96d56Sopenharmony_ci                "test_from_contiguous: incorrect result");
36807db96d56Sopenharmony_ci            return NULL;
36817db96d56Sopenharmony_ci        }
36827db96d56Sopenharmony_ci    }
36837db96d56Sopenharmony_ci
36847db96d56Sopenharmony_ci    view.buf = &data[8];
36857db96d56Sopenharmony_ci    view.strides[0] = -2 * itemsize;
36867db96d56Sopenharmony_ci
36877db96d56Sopenharmony_ci    PyBuffer_FromContiguous(&view, init, view.len, 'C');
36887db96d56Sopenharmony_ci    ptr = view.buf;
36897db96d56Sopenharmony_ci    for (i = 0; i < 5; i++) {
36907db96d56Sopenharmony_ci        if (*(ptr-2*i) != i) {
36917db96d56Sopenharmony_ci            PyErr_SetString(TestError,
36927db96d56Sopenharmony_ci                "test_from_contiguous: incorrect result");
36937db96d56Sopenharmony_ci            return NULL;
36947db96d56Sopenharmony_ci        }
36957db96d56Sopenharmony_ci    }
36967db96d56Sopenharmony_ci
36977db96d56Sopenharmony_ci    Py_RETURN_NONE;
36987db96d56Sopenharmony_ci}
36997db96d56Sopenharmony_ci
37007db96d56Sopenharmony_ci#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
37017db96d56Sopenharmony_ciextern PyTypeObject _PyBytesIOBuffer_Type;
37027db96d56Sopenharmony_ci
37037db96d56Sopenharmony_cistatic PyObject *
37047db96d56Sopenharmony_citest_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
37057db96d56Sopenharmony_ci{
37067db96d56Sopenharmony_ci    PyTypeObject *type = &_PyBytesIOBuffer_Type;
37077db96d56Sopenharmony_ci    PyObject *b;
37087db96d56Sopenharmony_ci    char *dummy[1];
37097db96d56Sopenharmony_ci    int ret, match;
37107db96d56Sopenharmony_ci
37117db96d56Sopenharmony_ci    /* PyBuffer_FillInfo() */
37127db96d56Sopenharmony_ci    ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
37137db96d56Sopenharmony_ci    match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
37147db96d56Sopenharmony_ci    PyErr_Clear();
37157db96d56Sopenharmony_ci    if (ret != -1 || match == 0)
37167db96d56Sopenharmony_ci        goto error;
37177db96d56Sopenharmony_ci
37187db96d56Sopenharmony_ci    /* bytesiobuf_getbuffer() */
37197db96d56Sopenharmony_ci    b = type->tp_alloc(type, 0);
37207db96d56Sopenharmony_ci    if (b == NULL) {
37217db96d56Sopenharmony_ci        return NULL;
37227db96d56Sopenharmony_ci    }
37237db96d56Sopenharmony_ci
37247db96d56Sopenharmony_ci    ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
37257db96d56Sopenharmony_ci    Py_DECREF(b);
37267db96d56Sopenharmony_ci    match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
37277db96d56Sopenharmony_ci    PyErr_Clear();
37287db96d56Sopenharmony_ci    if (ret != -1 || match == 0)
37297db96d56Sopenharmony_ci        goto error;
37307db96d56Sopenharmony_ci
37317db96d56Sopenharmony_ci    Py_RETURN_NONE;
37327db96d56Sopenharmony_ci
37337db96d56Sopenharmony_cierror:
37347db96d56Sopenharmony_ci    PyErr_SetString(TestError,
37357db96d56Sopenharmony_ci        "test_pep3118_obsolete_write_locks: failure");
37367db96d56Sopenharmony_ci    return NULL;
37377db96d56Sopenharmony_ci}
37387db96d56Sopenharmony_ci#endif
37397db96d56Sopenharmony_ci
37407db96d56Sopenharmony_ci/* This tests functions that historically supported write locks.  It is
37417db96d56Sopenharmony_ci   wrong to call getbuffer() with view==NULL and a compliant getbufferproc
37427db96d56Sopenharmony_ci   is entitled to segfault in that case. */
37437db96d56Sopenharmony_cistatic PyObject *
37447db96d56Sopenharmony_cigetbuffer_with_null_view(PyObject* self, PyObject *obj)
37457db96d56Sopenharmony_ci{
37467db96d56Sopenharmony_ci    if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
37477db96d56Sopenharmony_ci        return NULL;
37487db96d56Sopenharmony_ci
37497db96d56Sopenharmony_ci    Py_RETURN_NONE;
37507db96d56Sopenharmony_ci}
37517db96d56Sopenharmony_ci
37527db96d56Sopenharmony_ci/* PyBuffer_SizeFromFormat() */
37537db96d56Sopenharmony_cistatic PyObject *
37547db96d56Sopenharmony_citest_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
37557db96d56Sopenharmony_ci{
37567db96d56Sopenharmony_ci    const char *format;
37577db96d56Sopenharmony_ci    Py_ssize_t result;
37587db96d56Sopenharmony_ci
37597db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
37607db96d56Sopenharmony_ci                          &format)) {
37617db96d56Sopenharmony_ci        return NULL;
37627db96d56Sopenharmony_ci    }
37637db96d56Sopenharmony_ci
37647db96d56Sopenharmony_ci    result = PyBuffer_SizeFromFormat(format);
37657db96d56Sopenharmony_ci    if (result == -1) {
37667db96d56Sopenharmony_ci        return NULL;
37677db96d56Sopenharmony_ci    }
37687db96d56Sopenharmony_ci
37697db96d56Sopenharmony_ci    return PyLong_FromSsize_t(result);
37707db96d56Sopenharmony_ci}
37717db96d56Sopenharmony_ci
37727db96d56Sopenharmony_ci/* Test that the fatal error from not having a current thread doesn't
37737db96d56Sopenharmony_ci   cause an infinite loop.  Run via Lib/test/test_capi.py */
37747db96d56Sopenharmony_cistatic PyObject *
37757db96d56Sopenharmony_cicrash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
37767db96d56Sopenharmony_ci{
37777db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
37787db96d56Sopenharmony_ci    /* Using PyThreadState_Get() directly allows the test to pass in
37797db96d56Sopenharmony_ci       !pydebug mode. However, the test only actually tests anything
37807db96d56Sopenharmony_ci       in pydebug mode, since that's where the infinite loop was in
37817db96d56Sopenharmony_ci       the first place. */
37827db96d56Sopenharmony_ci    PyThreadState_Get();
37837db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
37847db96d56Sopenharmony_ci    return NULL;
37857db96d56Sopenharmony_ci}
37867db96d56Sopenharmony_ci
37877db96d56Sopenharmony_ci/* To run some code in a sub-interpreter. */
37887db96d56Sopenharmony_cistatic PyObject *
37897db96d56Sopenharmony_cirun_in_subinterp(PyObject *self, PyObject *args)
37907db96d56Sopenharmony_ci{
37917db96d56Sopenharmony_ci    const char *code;
37927db96d56Sopenharmony_ci    int r;
37937db96d56Sopenharmony_ci    PyThreadState *substate, *mainstate;
37947db96d56Sopenharmony_ci    /* only initialise 'cflags.cf_flags' to test backwards compatibility */
37957db96d56Sopenharmony_ci    PyCompilerFlags cflags = {0};
37967db96d56Sopenharmony_ci
37977db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
37987db96d56Sopenharmony_ci                          &code))
37997db96d56Sopenharmony_ci        return NULL;
38007db96d56Sopenharmony_ci
38017db96d56Sopenharmony_ci    mainstate = PyThreadState_Get();
38027db96d56Sopenharmony_ci
38037db96d56Sopenharmony_ci    PyThreadState_Swap(NULL);
38047db96d56Sopenharmony_ci
38057db96d56Sopenharmony_ci    substate = Py_NewInterpreter();
38067db96d56Sopenharmony_ci    if (substate == NULL) {
38077db96d56Sopenharmony_ci        /* Since no new thread state was created, there is no exception to
38087db96d56Sopenharmony_ci           propagate; raise a fresh one after swapping in the old thread
38097db96d56Sopenharmony_ci           state. */
38107db96d56Sopenharmony_ci        PyThreadState_Swap(mainstate);
38117db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
38127db96d56Sopenharmony_ci        return NULL;
38137db96d56Sopenharmony_ci    }
38147db96d56Sopenharmony_ci    r = PyRun_SimpleStringFlags(code, &cflags);
38157db96d56Sopenharmony_ci    Py_EndInterpreter(substate);
38167db96d56Sopenharmony_ci
38177db96d56Sopenharmony_ci    PyThreadState_Swap(mainstate);
38187db96d56Sopenharmony_ci
38197db96d56Sopenharmony_ci    return PyLong_FromLong(r);
38207db96d56Sopenharmony_ci}
38217db96d56Sopenharmony_ci
38227db96d56Sopenharmony_cistatic int
38237db96d56Sopenharmony_cicheck_time_rounding(int round)
38247db96d56Sopenharmony_ci{
38257db96d56Sopenharmony_ci    if (round != _PyTime_ROUND_FLOOR
38267db96d56Sopenharmony_ci        && round != _PyTime_ROUND_CEILING
38277db96d56Sopenharmony_ci        && round != _PyTime_ROUND_HALF_EVEN
38287db96d56Sopenharmony_ci        && round != _PyTime_ROUND_UP) {
38297db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "invalid rounding");
38307db96d56Sopenharmony_ci        return -1;
38317db96d56Sopenharmony_ci    }
38327db96d56Sopenharmony_ci    return 0;
38337db96d56Sopenharmony_ci}
38347db96d56Sopenharmony_ci
38357db96d56Sopenharmony_cistatic PyObject *
38367db96d56Sopenharmony_citest_pytime_object_to_time_t(PyObject *self, PyObject *args)
38377db96d56Sopenharmony_ci{
38387db96d56Sopenharmony_ci    PyObject *obj;
38397db96d56Sopenharmony_ci    time_t sec;
38407db96d56Sopenharmony_ci    int round;
38417db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
38427db96d56Sopenharmony_ci        return NULL;
38437db96d56Sopenharmony_ci    if (check_time_rounding(round) < 0)
38447db96d56Sopenharmony_ci        return NULL;
38457db96d56Sopenharmony_ci    if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
38467db96d56Sopenharmony_ci        return NULL;
38477db96d56Sopenharmony_ci    return _PyLong_FromTime_t(sec);
38487db96d56Sopenharmony_ci}
38497db96d56Sopenharmony_ci
38507db96d56Sopenharmony_cistatic PyObject *
38517db96d56Sopenharmony_citest_pytime_object_to_timeval(PyObject *self, PyObject *args)
38527db96d56Sopenharmony_ci{
38537db96d56Sopenharmony_ci    PyObject *obj;
38547db96d56Sopenharmony_ci    time_t sec;
38557db96d56Sopenharmony_ci    long usec;
38567db96d56Sopenharmony_ci    int round;
38577db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
38587db96d56Sopenharmony_ci        return NULL;
38597db96d56Sopenharmony_ci    if (check_time_rounding(round) < 0)
38607db96d56Sopenharmony_ci        return NULL;
38617db96d56Sopenharmony_ci    if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
38627db96d56Sopenharmony_ci        return NULL;
38637db96d56Sopenharmony_ci    return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
38647db96d56Sopenharmony_ci}
38657db96d56Sopenharmony_ci
38667db96d56Sopenharmony_cistatic PyObject *
38677db96d56Sopenharmony_citest_pytime_object_to_timespec(PyObject *self, PyObject *args)
38687db96d56Sopenharmony_ci{
38697db96d56Sopenharmony_ci    PyObject *obj;
38707db96d56Sopenharmony_ci    time_t sec;
38717db96d56Sopenharmony_ci    long nsec;
38727db96d56Sopenharmony_ci    int round;
38737db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
38747db96d56Sopenharmony_ci        return NULL;
38757db96d56Sopenharmony_ci    if (check_time_rounding(round) < 0)
38767db96d56Sopenharmony_ci        return NULL;
38777db96d56Sopenharmony_ci    if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
38787db96d56Sopenharmony_ci        return NULL;
38797db96d56Sopenharmony_ci    return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
38807db96d56Sopenharmony_ci}
38817db96d56Sopenharmony_ci
38827db96d56Sopenharmony_cistatic void
38837db96d56Sopenharmony_cislot_tp_del(PyObject *self)
38847db96d56Sopenharmony_ci{
38857db96d56Sopenharmony_ci    _Py_IDENTIFIER(__tp_del__);
38867db96d56Sopenharmony_ci    PyObject *del, *res;
38877db96d56Sopenharmony_ci    PyObject *error_type, *error_value, *error_traceback;
38887db96d56Sopenharmony_ci
38897db96d56Sopenharmony_ci    /* Temporarily resurrect the object. */
38907db96d56Sopenharmony_ci    assert(Py_REFCNT(self) == 0);
38917db96d56Sopenharmony_ci    Py_SET_REFCNT(self, 1);
38927db96d56Sopenharmony_ci
38937db96d56Sopenharmony_ci    /* Save the current exception, if any. */
38947db96d56Sopenharmony_ci    PyErr_Fetch(&error_type, &error_value, &error_traceback);
38957db96d56Sopenharmony_ci
38967db96d56Sopenharmony_ci    /* Execute __del__ method, if any. */
38977db96d56Sopenharmony_ci    del = _PyObject_LookupSpecialId(self, &PyId___tp_del__);
38987db96d56Sopenharmony_ci    if (del != NULL) {
38997db96d56Sopenharmony_ci        res = PyObject_CallNoArgs(del);
39007db96d56Sopenharmony_ci        if (res == NULL)
39017db96d56Sopenharmony_ci            PyErr_WriteUnraisable(del);
39027db96d56Sopenharmony_ci        else
39037db96d56Sopenharmony_ci            Py_DECREF(res);
39047db96d56Sopenharmony_ci        Py_DECREF(del);
39057db96d56Sopenharmony_ci    }
39067db96d56Sopenharmony_ci
39077db96d56Sopenharmony_ci    /* Restore the saved exception. */
39087db96d56Sopenharmony_ci    PyErr_Restore(error_type, error_value, error_traceback);
39097db96d56Sopenharmony_ci
39107db96d56Sopenharmony_ci    /* Undo the temporary resurrection; can't use DECREF here, it would
39117db96d56Sopenharmony_ci     * cause a recursive call.
39127db96d56Sopenharmony_ci     */
39137db96d56Sopenharmony_ci    assert(Py_REFCNT(self) > 0);
39147db96d56Sopenharmony_ci    Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
39157db96d56Sopenharmony_ci    if (Py_REFCNT(self) == 0) {
39167db96d56Sopenharmony_ci        /* this is the normal path out */
39177db96d56Sopenharmony_ci        return;
39187db96d56Sopenharmony_ci    }
39197db96d56Sopenharmony_ci
39207db96d56Sopenharmony_ci    /* __del__ resurrected it!  Make it look like the original Py_DECREF
39217db96d56Sopenharmony_ci     * never happened.
39227db96d56Sopenharmony_ci     */
39237db96d56Sopenharmony_ci    {
39247db96d56Sopenharmony_ci        Py_ssize_t refcnt = Py_REFCNT(self);
39257db96d56Sopenharmony_ci        _Py_NewReference(self);
39267db96d56Sopenharmony_ci        Py_SET_REFCNT(self, refcnt);
39277db96d56Sopenharmony_ci    }
39287db96d56Sopenharmony_ci    assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self));
39297db96d56Sopenharmony_ci    /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
39307db96d56Sopenharmony_ci       _Py_RefTotal, so we need to undo that. */
39317db96d56Sopenharmony_ci#ifdef Py_REF_DEBUG
39327db96d56Sopenharmony_ci    _Py_RefTotal--;
39337db96d56Sopenharmony_ci#endif
39347db96d56Sopenharmony_ci}
39357db96d56Sopenharmony_ci
39367db96d56Sopenharmony_cistatic PyObject *
39377db96d56Sopenharmony_ciwith_tp_del(PyObject *self, PyObject *args)
39387db96d56Sopenharmony_ci{
39397db96d56Sopenharmony_ci    PyObject *obj;
39407db96d56Sopenharmony_ci    PyTypeObject *tp;
39417db96d56Sopenharmony_ci
39427db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
39437db96d56Sopenharmony_ci        return NULL;
39447db96d56Sopenharmony_ci    tp = (PyTypeObject *) obj;
39457db96d56Sopenharmony_ci    if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
39467db96d56Sopenharmony_ci        PyErr_Format(PyExc_TypeError,
39477db96d56Sopenharmony_ci                     "heap type expected, got %R", obj);
39487db96d56Sopenharmony_ci        return NULL;
39497db96d56Sopenharmony_ci    }
39507db96d56Sopenharmony_ci    tp->tp_del = slot_tp_del;
39517db96d56Sopenharmony_ci    Py_INCREF(obj);
39527db96d56Sopenharmony_ci    return obj;
39537db96d56Sopenharmony_ci}
39547db96d56Sopenharmony_ci
39557db96d56Sopenharmony_cistatic PyObject *
39567db96d56Sopenharmony_ciwithout_gc(PyObject *Py_UNUSED(self), PyObject *obj)
39577db96d56Sopenharmony_ci{
39587db96d56Sopenharmony_ci    PyTypeObject *tp = (PyTypeObject*)obj;
39597db96d56Sopenharmony_ci    if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
39607db96d56Sopenharmony_ci        return PyErr_Format(PyExc_TypeError, "heap type expected, got %R", obj);
39617db96d56Sopenharmony_ci    }
39627db96d56Sopenharmony_ci    if (PyType_IS_GC(tp)) {
39637db96d56Sopenharmony_ci        // Don't try this at home, kids:
39647db96d56Sopenharmony_ci        tp->tp_flags -= Py_TPFLAGS_HAVE_GC;
39657db96d56Sopenharmony_ci        tp->tp_free = PyObject_Del;
39667db96d56Sopenharmony_ci        tp->tp_traverse = NULL;
39677db96d56Sopenharmony_ci        tp->tp_clear = NULL;
39687db96d56Sopenharmony_ci    }
39697db96d56Sopenharmony_ci    assert(!PyType_IS_GC(tp));
39707db96d56Sopenharmony_ci    Py_INCREF(obj);
39717db96d56Sopenharmony_ci    return obj;
39727db96d56Sopenharmony_ci}
39737db96d56Sopenharmony_ci
39747db96d56Sopenharmony_cistatic PyMethodDef ml;
39757db96d56Sopenharmony_ci
39767db96d56Sopenharmony_cistatic PyObject *
39777db96d56Sopenharmony_cicreate_cfunction(PyObject *self, PyObject *args)
39787db96d56Sopenharmony_ci{
39797db96d56Sopenharmony_ci    return PyCFunction_NewEx(&ml, self, NULL);
39807db96d56Sopenharmony_ci}
39817db96d56Sopenharmony_ci
39827db96d56Sopenharmony_cistatic PyMethodDef ml = {
39837db96d56Sopenharmony_ci    "create_cfunction",
39847db96d56Sopenharmony_ci    create_cfunction,
39857db96d56Sopenharmony_ci    METH_NOARGS,
39867db96d56Sopenharmony_ci    NULL
39877db96d56Sopenharmony_ci};
39887db96d56Sopenharmony_ci
39897db96d56Sopenharmony_cistatic PyObject *
39907db96d56Sopenharmony_ci_test_incref(PyObject *ob)
39917db96d56Sopenharmony_ci{
39927db96d56Sopenharmony_ci    Py_INCREF(ob);
39937db96d56Sopenharmony_ci    return ob;
39947db96d56Sopenharmony_ci}
39957db96d56Sopenharmony_ci
39967db96d56Sopenharmony_cistatic PyObject *
39977db96d56Sopenharmony_citest_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
39987db96d56Sopenharmony_ci{
39997db96d56Sopenharmony_ci    PyObject *obj = PyLong_FromLong(0);
40007db96d56Sopenharmony_ci    Py_XINCREF(_test_incref(obj));
40017db96d56Sopenharmony_ci    Py_DECREF(obj);
40027db96d56Sopenharmony_ci    Py_DECREF(obj);
40037db96d56Sopenharmony_ci    Py_DECREF(obj);
40047db96d56Sopenharmony_ci    Py_RETURN_NONE;
40057db96d56Sopenharmony_ci}
40067db96d56Sopenharmony_ci
40077db96d56Sopenharmony_cistatic PyObject *
40087db96d56Sopenharmony_citest_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
40097db96d56Sopenharmony_ci{
40107db96d56Sopenharmony_ci    PyObject *obj = PyLong_FromLong(0);
40117db96d56Sopenharmony_ci    Py_INCREF(_test_incref(obj));
40127db96d56Sopenharmony_ci    Py_DECREF(obj);
40137db96d56Sopenharmony_ci    Py_DECREF(obj);
40147db96d56Sopenharmony_ci    Py_DECREF(obj);
40157db96d56Sopenharmony_ci    Py_RETURN_NONE;
40167db96d56Sopenharmony_ci}
40177db96d56Sopenharmony_ci
40187db96d56Sopenharmony_cistatic PyObject *
40197db96d56Sopenharmony_citest_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
40207db96d56Sopenharmony_ci{
40217db96d56Sopenharmony_ci    Py_XDECREF(PyLong_FromLong(0));
40227db96d56Sopenharmony_ci    Py_RETURN_NONE;
40237db96d56Sopenharmony_ci}
40247db96d56Sopenharmony_ci
40257db96d56Sopenharmony_cistatic PyObject *
40267db96d56Sopenharmony_citest_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
40277db96d56Sopenharmony_ci{
40287db96d56Sopenharmony_ci    Py_DECREF(PyLong_FromLong(0));
40297db96d56Sopenharmony_ci    Py_RETURN_NONE;
40307db96d56Sopenharmony_ci}
40317db96d56Sopenharmony_ci
40327db96d56Sopenharmony_cistatic PyObject *
40337db96d56Sopenharmony_citest_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
40347db96d56Sopenharmony_ci                              PyObject *Py_UNUSED(args))
40357db96d56Sopenharmony_ci{
40367db96d56Sopenharmony_ci    PyStructSequence_Desc descr;
40377db96d56Sopenharmony_ci    PyStructSequence_Field descr_fields[3];
40387db96d56Sopenharmony_ci
40397db96d56Sopenharmony_ci    descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
40407db96d56Sopenharmony_ci    descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
40417db96d56Sopenharmony_ci    descr_fields[2] = (PyStructSequence_Field){0, NULL};
40427db96d56Sopenharmony_ci
40437db96d56Sopenharmony_ci    descr.name = "_testcapi.test_descr";
40447db96d56Sopenharmony_ci    descr.doc = "This is used to test for memory leaks in NewType";
40457db96d56Sopenharmony_ci    descr.fields = descr_fields;
40467db96d56Sopenharmony_ci    descr.n_in_sequence = 1;
40477db96d56Sopenharmony_ci
40487db96d56Sopenharmony_ci    PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
40497db96d56Sopenharmony_ci    assert(structseq_type != NULL);
40507db96d56Sopenharmony_ci    assert(PyType_Check(structseq_type));
40517db96d56Sopenharmony_ci    assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
40527db96d56Sopenharmony_ci    Py_DECREF(structseq_type);
40537db96d56Sopenharmony_ci
40547db96d56Sopenharmony_ci    Py_RETURN_NONE;
40557db96d56Sopenharmony_ci}
40567db96d56Sopenharmony_ci
40577db96d56Sopenharmony_cistatic PyObject *
40587db96d56Sopenharmony_citest_structseq_newtype_null_descr_doc(PyObject *Py_UNUSED(self),
40597db96d56Sopenharmony_ci                              PyObject *Py_UNUSED(args))
40607db96d56Sopenharmony_ci{
40617db96d56Sopenharmony_ci    PyStructSequence_Field descr_fields[1] = {
40627db96d56Sopenharmony_ci        (PyStructSequence_Field){NULL, NULL}
40637db96d56Sopenharmony_ci    };
40647db96d56Sopenharmony_ci    // Test specifically for NULL .doc field.
40657db96d56Sopenharmony_ci    PyStructSequence_Desc descr = {"_testcapi.test_descr", NULL, &descr_fields[0], 0};
40667db96d56Sopenharmony_ci
40677db96d56Sopenharmony_ci    PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
40687db96d56Sopenharmony_ci    assert(structseq_type != NULL);
40697db96d56Sopenharmony_ci    assert(PyType_Check(structseq_type));
40707db96d56Sopenharmony_ci    assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
40717db96d56Sopenharmony_ci    Py_DECREF(structseq_type);
40727db96d56Sopenharmony_ci
40737db96d56Sopenharmony_ci    Py_RETURN_NONE;
40747db96d56Sopenharmony_ci}
40757db96d56Sopenharmony_ci
40767db96d56Sopenharmony_cistatic PyObject *
40777db96d56Sopenharmony_citest_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
40787db96d56Sopenharmony_ci{
40797db96d56Sopenharmony_ci    PyObject *obj = PyLong_FromLong(0);
40807db96d56Sopenharmony_ci    Py_IncRef(obj);
40817db96d56Sopenharmony_ci    Py_DecRef(obj);
40827db96d56Sopenharmony_ci    Py_DecRef(obj);
40837db96d56Sopenharmony_ci    Py_RETURN_NONE;
40847db96d56Sopenharmony_ci}
40857db96d56Sopenharmony_ci
40867db96d56Sopenharmony_cistatic PyObject *
40877db96d56Sopenharmony_citest_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
40887db96d56Sopenharmony_ci{
40897db96d56Sopenharmony_ci    void *ptr;
40907db96d56Sopenharmony_ci
40917db96d56Sopenharmony_ci    ptr = PyMem_RawMalloc(0);
40927db96d56Sopenharmony_ci    if (ptr == NULL) {
40937db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
40947db96d56Sopenharmony_ci        return NULL;
40957db96d56Sopenharmony_ci    }
40967db96d56Sopenharmony_ci    PyMem_RawFree(ptr);
40977db96d56Sopenharmony_ci
40987db96d56Sopenharmony_ci    ptr = PyMem_RawCalloc(0, 0);
40997db96d56Sopenharmony_ci    if (ptr == NULL) {
41007db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
41017db96d56Sopenharmony_ci        return NULL;
41027db96d56Sopenharmony_ci    }
41037db96d56Sopenharmony_ci    PyMem_RawFree(ptr);
41047db96d56Sopenharmony_ci
41057db96d56Sopenharmony_ci    ptr = PyMem_Malloc(0);
41067db96d56Sopenharmony_ci    if (ptr == NULL) {
41077db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
41087db96d56Sopenharmony_ci        return NULL;
41097db96d56Sopenharmony_ci    }
41107db96d56Sopenharmony_ci    PyMem_Free(ptr);
41117db96d56Sopenharmony_ci
41127db96d56Sopenharmony_ci    ptr = PyMem_Calloc(0, 0);
41137db96d56Sopenharmony_ci    if (ptr == NULL) {
41147db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
41157db96d56Sopenharmony_ci        return NULL;
41167db96d56Sopenharmony_ci    }
41177db96d56Sopenharmony_ci    PyMem_Free(ptr);
41187db96d56Sopenharmony_ci
41197db96d56Sopenharmony_ci    ptr = PyObject_Malloc(0);
41207db96d56Sopenharmony_ci    if (ptr == NULL) {
41217db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
41227db96d56Sopenharmony_ci        return NULL;
41237db96d56Sopenharmony_ci    }
41247db96d56Sopenharmony_ci    PyObject_Free(ptr);
41257db96d56Sopenharmony_ci
41267db96d56Sopenharmony_ci    ptr = PyObject_Calloc(0, 0);
41277db96d56Sopenharmony_ci    if (ptr == NULL) {
41287db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
41297db96d56Sopenharmony_ci        return NULL;
41307db96d56Sopenharmony_ci    }
41317db96d56Sopenharmony_ci    PyObject_Free(ptr);
41327db96d56Sopenharmony_ci
41337db96d56Sopenharmony_ci    Py_RETURN_NONE;
41347db96d56Sopenharmony_ci}
41357db96d56Sopenharmony_ci
41367db96d56Sopenharmony_citypedef struct {
41377db96d56Sopenharmony_ci    PyMemAllocatorEx alloc;
41387db96d56Sopenharmony_ci
41397db96d56Sopenharmony_ci    size_t malloc_size;
41407db96d56Sopenharmony_ci    size_t calloc_nelem;
41417db96d56Sopenharmony_ci    size_t calloc_elsize;
41427db96d56Sopenharmony_ci    void *realloc_ptr;
41437db96d56Sopenharmony_ci    size_t realloc_new_size;
41447db96d56Sopenharmony_ci    void *free_ptr;
41457db96d56Sopenharmony_ci    void *ctx;
41467db96d56Sopenharmony_ci} alloc_hook_t;
41477db96d56Sopenharmony_ci
41487db96d56Sopenharmony_cistatic void* hook_malloc(void* ctx, size_t size)
41497db96d56Sopenharmony_ci{
41507db96d56Sopenharmony_ci    alloc_hook_t *hook = (alloc_hook_t *)ctx;
41517db96d56Sopenharmony_ci    hook->ctx = ctx;
41527db96d56Sopenharmony_ci    hook->malloc_size = size;
41537db96d56Sopenharmony_ci    return hook->alloc.malloc(hook->alloc.ctx, size);
41547db96d56Sopenharmony_ci}
41557db96d56Sopenharmony_ci
41567db96d56Sopenharmony_cistatic void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
41577db96d56Sopenharmony_ci{
41587db96d56Sopenharmony_ci    alloc_hook_t *hook = (alloc_hook_t *)ctx;
41597db96d56Sopenharmony_ci    hook->ctx = ctx;
41607db96d56Sopenharmony_ci    hook->calloc_nelem = nelem;
41617db96d56Sopenharmony_ci    hook->calloc_elsize = elsize;
41627db96d56Sopenharmony_ci    return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
41637db96d56Sopenharmony_ci}
41647db96d56Sopenharmony_ci
41657db96d56Sopenharmony_cistatic void* hook_realloc(void* ctx, void* ptr, size_t new_size)
41667db96d56Sopenharmony_ci{
41677db96d56Sopenharmony_ci    alloc_hook_t *hook = (alloc_hook_t *)ctx;
41687db96d56Sopenharmony_ci    hook->ctx = ctx;
41697db96d56Sopenharmony_ci    hook->realloc_ptr = ptr;
41707db96d56Sopenharmony_ci    hook->realloc_new_size = new_size;
41717db96d56Sopenharmony_ci    return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
41727db96d56Sopenharmony_ci}
41737db96d56Sopenharmony_ci
41747db96d56Sopenharmony_cistatic void hook_free(void *ctx, void *ptr)
41757db96d56Sopenharmony_ci{
41767db96d56Sopenharmony_ci    alloc_hook_t *hook = (alloc_hook_t *)ctx;
41777db96d56Sopenharmony_ci    hook->ctx = ctx;
41787db96d56Sopenharmony_ci    hook->free_ptr = ptr;
41797db96d56Sopenharmony_ci    hook->alloc.free(hook->alloc.ctx, ptr);
41807db96d56Sopenharmony_ci}
41817db96d56Sopenharmony_ci
41827db96d56Sopenharmony_cistatic PyObject *
41837db96d56Sopenharmony_citest_setallocators(PyMemAllocatorDomain domain)
41847db96d56Sopenharmony_ci{
41857db96d56Sopenharmony_ci    PyObject *res = NULL;
41867db96d56Sopenharmony_ci    const char *error_msg;
41877db96d56Sopenharmony_ci    alloc_hook_t hook;
41887db96d56Sopenharmony_ci    PyMemAllocatorEx alloc;
41897db96d56Sopenharmony_ci    size_t size, size2, nelem, elsize;
41907db96d56Sopenharmony_ci    void *ptr, *ptr2;
41917db96d56Sopenharmony_ci
41927db96d56Sopenharmony_ci    memset(&hook, 0, sizeof(hook));
41937db96d56Sopenharmony_ci
41947db96d56Sopenharmony_ci    alloc.ctx = &hook;
41957db96d56Sopenharmony_ci    alloc.malloc = &hook_malloc;
41967db96d56Sopenharmony_ci    alloc.calloc = &hook_calloc;
41977db96d56Sopenharmony_ci    alloc.realloc = &hook_realloc;
41987db96d56Sopenharmony_ci    alloc.free = &hook_free;
41997db96d56Sopenharmony_ci    PyMem_GetAllocator(domain, &hook.alloc);
42007db96d56Sopenharmony_ci    PyMem_SetAllocator(domain, &alloc);
42017db96d56Sopenharmony_ci
42027db96d56Sopenharmony_ci    /* malloc, realloc, free */
42037db96d56Sopenharmony_ci    size = 42;
42047db96d56Sopenharmony_ci    hook.ctx = NULL;
42057db96d56Sopenharmony_ci    switch(domain)
42067db96d56Sopenharmony_ci    {
42077db96d56Sopenharmony_ci    case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
42087db96d56Sopenharmony_ci    case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
42097db96d56Sopenharmony_ci    case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
42107db96d56Sopenharmony_ci    default: ptr = NULL; break;
42117db96d56Sopenharmony_ci    }
42127db96d56Sopenharmony_ci
42137db96d56Sopenharmony_ci#define CHECK_CTX(FUNC) \
42147db96d56Sopenharmony_ci    if (hook.ctx != &hook) { \
42157db96d56Sopenharmony_ci        error_msg = FUNC " wrong context"; \
42167db96d56Sopenharmony_ci        goto fail; \
42177db96d56Sopenharmony_ci    } \
42187db96d56Sopenharmony_ci    hook.ctx = NULL;  /* reset for next check */
42197db96d56Sopenharmony_ci
42207db96d56Sopenharmony_ci    if (ptr == NULL) {
42217db96d56Sopenharmony_ci        error_msg = "malloc failed";
42227db96d56Sopenharmony_ci        goto fail;
42237db96d56Sopenharmony_ci    }
42247db96d56Sopenharmony_ci    CHECK_CTX("malloc");
42257db96d56Sopenharmony_ci    if (hook.malloc_size != size) {
42267db96d56Sopenharmony_ci        error_msg = "malloc invalid size";
42277db96d56Sopenharmony_ci        goto fail;
42287db96d56Sopenharmony_ci    }
42297db96d56Sopenharmony_ci
42307db96d56Sopenharmony_ci    size2 = 200;
42317db96d56Sopenharmony_ci    switch(domain)
42327db96d56Sopenharmony_ci    {
42337db96d56Sopenharmony_ci    case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
42347db96d56Sopenharmony_ci    case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
42357db96d56Sopenharmony_ci    case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
42367db96d56Sopenharmony_ci    default: ptr2 = NULL; break;
42377db96d56Sopenharmony_ci    }
42387db96d56Sopenharmony_ci
42397db96d56Sopenharmony_ci    if (ptr2 == NULL) {
42407db96d56Sopenharmony_ci        error_msg = "realloc failed";
42417db96d56Sopenharmony_ci        goto fail;
42427db96d56Sopenharmony_ci    }
42437db96d56Sopenharmony_ci    CHECK_CTX("realloc");
42447db96d56Sopenharmony_ci    if (hook.realloc_ptr != ptr
42457db96d56Sopenharmony_ci        || hook.realloc_new_size != size2) {
42467db96d56Sopenharmony_ci        error_msg = "realloc invalid parameters";
42477db96d56Sopenharmony_ci        goto fail;
42487db96d56Sopenharmony_ci    }
42497db96d56Sopenharmony_ci
42507db96d56Sopenharmony_ci    switch(domain)
42517db96d56Sopenharmony_ci    {
42527db96d56Sopenharmony_ci    case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
42537db96d56Sopenharmony_ci    case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
42547db96d56Sopenharmony_ci    case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
42557db96d56Sopenharmony_ci    }
42567db96d56Sopenharmony_ci
42577db96d56Sopenharmony_ci    CHECK_CTX("free");
42587db96d56Sopenharmony_ci    if (hook.free_ptr != ptr2) {
42597db96d56Sopenharmony_ci        error_msg = "free invalid pointer";
42607db96d56Sopenharmony_ci        goto fail;
42617db96d56Sopenharmony_ci    }
42627db96d56Sopenharmony_ci
42637db96d56Sopenharmony_ci    /* calloc, free */
42647db96d56Sopenharmony_ci    nelem = 2;
42657db96d56Sopenharmony_ci    elsize = 5;
42667db96d56Sopenharmony_ci    switch(domain)
42677db96d56Sopenharmony_ci    {
42687db96d56Sopenharmony_ci    case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
42697db96d56Sopenharmony_ci    case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
42707db96d56Sopenharmony_ci    case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
42717db96d56Sopenharmony_ci    default: ptr = NULL; break;
42727db96d56Sopenharmony_ci    }
42737db96d56Sopenharmony_ci
42747db96d56Sopenharmony_ci    if (ptr == NULL) {
42757db96d56Sopenharmony_ci        error_msg = "calloc failed";
42767db96d56Sopenharmony_ci        goto fail;
42777db96d56Sopenharmony_ci    }
42787db96d56Sopenharmony_ci    CHECK_CTX("calloc");
42797db96d56Sopenharmony_ci    if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
42807db96d56Sopenharmony_ci        error_msg = "calloc invalid nelem or elsize";
42817db96d56Sopenharmony_ci        goto fail;
42827db96d56Sopenharmony_ci    }
42837db96d56Sopenharmony_ci
42847db96d56Sopenharmony_ci    hook.free_ptr = NULL;
42857db96d56Sopenharmony_ci    switch(domain)
42867db96d56Sopenharmony_ci    {
42877db96d56Sopenharmony_ci    case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
42887db96d56Sopenharmony_ci    case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
42897db96d56Sopenharmony_ci    case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
42907db96d56Sopenharmony_ci    }
42917db96d56Sopenharmony_ci
42927db96d56Sopenharmony_ci    CHECK_CTX("calloc free");
42937db96d56Sopenharmony_ci    if (hook.free_ptr != ptr) {
42947db96d56Sopenharmony_ci        error_msg = "calloc free invalid pointer";
42957db96d56Sopenharmony_ci        goto fail;
42967db96d56Sopenharmony_ci    }
42977db96d56Sopenharmony_ci
42987db96d56Sopenharmony_ci    Py_INCREF(Py_None);
42997db96d56Sopenharmony_ci    res = Py_None;
43007db96d56Sopenharmony_ci    goto finally;
43017db96d56Sopenharmony_ci
43027db96d56Sopenharmony_cifail:
43037db96d56Sopenharmony_ci    PyErr_SetString(PyExc_RuntimeError, error_msg);
43047db96d56Sopenharmony_ci
43057db96d56Sopenharmony_cifinally:
43067db96d56Sopenharmony_ci    PyMem_SetAllocator(domain, &hook.alloc);
43077db96d56Sopenharmony_ci    return res;
43087db96d56Sopenharmony_ci
43097db96d56Sopenharmony_ci#undef CHECK_CTX
43107db96d56Sopenharmony_ci}
43117db96d56Sopenharmony_ci
43127db96d56Sopenharmony_cistatic PyObject *
43137db96d56Sopenharmony_citest_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
43147db96d56Sopenharmony_ci{
43157db96d56Sopenharmony_ci    return test_setallocators(PYMEM_DOMAIN_RAW);
43167db96d56Sopenharmony_ci}
43177db96d56Sopenharmony_ci
43187db96d56Sopenharmony_cistatic PyObject *
43197db96d56Sopenharmony_citest_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
43207db96d56Sopenharmony_ci{
43217db96d56Sopenharmony_ci    return test_setallocators(PYMEM_DOMAIN_MEM);
43227db96d56Sopenharmony_ci}
43237db96d56Sopenharmony_ci
43247db96d56Sopenharmony_cistatic PyObject *
43257db96d56Sopenharmony_citest_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
43267db96d56Sopenharmony_ci{
43277db96d56Sopenharmony_ci    return test_setallocators(PYMEM_DOMAIN_OBJ);
43287db96d56Sopenharmony_ci}
43297db96d56Sopenharmony_ci
43307db96d56Sopenharmony_ci/* Most part of the following code is inherited from the pyfailmalloc project
43317db96d56Sopenharmony_ci * written by Victor Stinner. */
43327db96d56Sopenharmony_cistatic struct {
43337db96d56Sopenharmony_ci    int installed;
43347db96d56Sopenharmony_ci    PyMemAllocatorEx raw;
43357db96d56Sopenharmony_ci    PyMemAllocatorEx mem;
43367db96d56Sopenharmony_ci    PyMemAllocatorEx obj;
43377db96d56Sopenharmony_ci} FmHook;
43387db96d56Sopenharmony_ci
43397db96d56Sopenharmony_cistatic struct {
43407db96d56Sopenharmony_ci    int start;
43417db96d56Sopenharmony_ci    int stop;
43427db96d56Sopenharmony_ci    Py_ssize_t count;
43437db96d56Sopenharmony_ci} FmData;
43447db96d56Sopenharmony_ci
43457db96d56Sopenharmony_cistatic int
43467db96d56Sopenharmony_cifm_nomemory(void)
43477db96d56Sopenharmony_ci{
43487db96d56Sopenharmony_ci    FmData.count++;
43497db96d56Sopenharmony_ci    if (FmData.count > FmData.start &&
43507db96d56Sopenharmony_ci            (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
43517db96d56Sopenharmony_ci        return 1;
43527db96d56Sopenharmony_ci    }
43537db96d56Sopenharmony_ci    return 0;
43547db96d56Sopenharmony_ci}
43557db96d56Sopenharmony_ci
43567db96d56Sopenharmony_cistatic void *
43577db96d56Sopenharmony_cihook_fmalloc(void *ctx, size_t size)
43587db96d56Sopenharmony_ci{
43597db96d56Sopenharmony_ci    PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
43607db96d56Sopenharmony_ci    if (fm_nomemory()) {
43617db96d56Sopenharmony_ci        return NULL;
43627db96d56Sopenharmony_ci    }
43637db96d56Sopenharmony_ci    return alloc->malloc(alloc->ctx, size);
43647db96d56Sopenharmony_ci}
43657db96d56Sopenharmony_ci
43667db96d56Sopenharmony_cistatic void *
43677db96d56Sopenharmony_cihook_fcalloc(void *ctx, size_t nelem, size_t elsize)
43687db96d56Sopenharmony_ci{
43697db96d56Sopenharmony_ci    PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
43707db96d56Sopenharmony_ci    if (fm_nomemory()) {
43717db96d56Sopenharmony_ci        return NULL;
43727db96d56Sopenharmony_ci    }
43737db96d56Sopenharmony_ci    return alloc->calloc(alloc->ctx, nelem, elsize);
43747db96d56Sopenharmony_ci}
43757db96d56Sopenharmony_ci
43767db96d56Sopenharmony_cistatic void *
43777db96d56Sopenharmony_cihook_frealloc(void *ctx, void *ptr, size_t new_size)
43787db96d56Sopenharmony_ci{
43797db96d56Sopenharmony_ci    PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
43807db96d56Sopenharmony_ci    if (fm_nomemory()) {
43817db96d56Sopenharmony_ci        return NULL;
43827db96d56Sopenharmony_ci    }
43837db96d56Sopenharmony_ci    return alloc->realloc(alloc->ctx, ptr, new_size);
43847db96d56Sopenharmony_ci}
43857db96d56Sopenharmony_ci
43867db96d56Sopenharmony_cistatic void
43877db96d56Sopenharmony_cihook_ffree(void *ctx, void *ptr)
43887db96d56Sopenharmony_ci{
43897db96d56Sopenharmony_ci    PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
43907db96d56Sopenharmony_ci    alloc->free(alloc->ctx, ptr);
43917db96d56Sopenharmony_ci}
43927db96d56Sopenharmony_ci
43937db96d56Sopenharmony_cistatic void
43947db96d56Sopenharmony_cifm_setup_hooks(void)
43957db96d56Sopenharmony_ci{
43967db96d56Sopenharmony_ci    PyMemAllocatorEx alloc;
43977db96d56Sopenharmony_ci
43987db96d56Sopenharmony_ci    if (FmHook.installed) {
43997db96d56Sopenharmony_ci        return;
44007db96d56Sopenharmony_ci    }
44017db96d56Sopenharmony_ci    FmHook.installed = 1;
44027db96d56Sopenharmony_ci
44037db96d56Sopenharmony_ci    alloc.malloc = hook_fmalloc;
44047db96d56Sopenharmony_ci    alloc.calloc = hook_fcalloc;
44057db96d56Sopenharmony_ci    alloc.realloc = hook_frealloc;
44067db96d56Sopenharmony_ci    alloc.free = hook_ffree;
44077db96d56Sopenharmony_ci    PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
44087db96d56Sopenharmony_ci    PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
44097db96d56Sopenharmony_ci    PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
44107db96d56Sopenharmony_ci
44117db96d56Sopenharmony_ci    alloc.ctx = &FmHook.raw;
44127db96d56Sopenharmony_ci    PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
44137db96d56Sopenharmony_ci
44147db96d56Sopenharmony_ci    alloc.ctx = &FmHook.mem;
44157db96d56Sopenharmony_ci    PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
44167db96d56Sopenharmony_ci
44177db96d56Sopenharmony_ci    alloc.ctx = &FmHook.obj;
44187db96d56Sopenharmony_ci    PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
44197db96d56Sopenharmony_ci}
44207db96d56Sopenharmony_ci
44217db96d56Sopenharmony_cistatic void
44227db96d56Sopenharmony_cifm_remove_hooks(void)
44237db96d56Sopenharmony_ci{
44247db96d56Sopenharmony_ci    if (FmHook.installed) {
44257db96d56Sopenharmony_ci        FmHook.installed = 0;
44267db96d56Sopenharmony_ci        PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
44277db96d56Sopenharmony_ci        PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
44287db96d56Sopenharmony_ci        PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
44297db96d56Sopenharmony_ci    }
44307db96d56Sopenharmony_ci}
44317db96d56Sopenharmony_ci
44327db96d56Sopenharmony_cistatic PyObject*
44337db96d56Sopenharmony_ciset_nomemory(PyObject *self, PyObject *args)
44347db96d56Sopenharmony_ci{
44357db96d56Sopenharmony_ci    /* Memory allocation fails after 'start' allocation requests, and until
44367db96d56Sopenharmony_ci     * 'stop' allocation requests except when 'stop' is negative or equal
44377db96d56Sopenharmony_ci     * to 0 (default) in which case allocation failures never stop. */
44387db96d56Sopenharmony_ci    FmData.count = 0;
44397db96d56Sopenharmony_ci    FmData.stop = 0;
44407db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
44417db96d56Sopenharmony_ci        return NULL;
44427db96d56Sopenharmony_ci    }
44437db96d56Sopenharmony_ci    fm_setup_hooks();
44447db96d56Sopenharmony_ci    Py_RETURN_NONE;
44457db96d56Sopenharmony_ci}
44467db96d56Sopenharmony_ci
44477db96d56Sopenharmony_cistatic PyObject*
44487db96d56Sopenharmony_ciremove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
44497db96d56Sopenharmony_ci{
44507db96d56Sopenharmony_ci    fm_remove_hooks();
44517db96d56Sopenharmony_ci    Py_RETURN_NONE;
44527db96d56Sopenharmony_ci}
44537db96d56Sopenharmony_ci
44547db96d56Sopenharmony_ciPyDoc_STRVAR(docstring_empty,
44557db96d56Sopenharmony_ci""
44567db96d56Sopenharmony_ci);
44577db96d56Sopenharmony_ci
44587db96d56Sopenharmony_ciPyDoc_STRVAR(docstring_no_signature,
44597db96d56Sopenharmony_ci"This docstring has no signature."
44607db96d56Sopenharmony_ci);
44617db96d56Sopenharmony_ci
44627db96d56Sopenharmony_ciPyDoc_STRVAR(docstring_with_invalid_signature,
44637db96d56Sopenharmony_ci"docstring_with_invalid_signature($module, /, boo)\n"
44647db96d56Sopenharmony_ci"\n"
44657db96d56Sopenharmony_ci"This docstring has an invalid signature."
44667db96d56Sopenharmony_ci);
44677db96d56Sopenharmony_ci
44687db96d56Sopenharmony_ciPyDoc_STRVAR(docstring_with_invalid_signature2,
44697db96d56Sopenharmony_ci"docstring_with_invalid_signature2($module, /, boo)\n"
44707db96d56Sopenharmony_ci"\n"
44717db96d56Sopenharmony_ci"--\n"
44727db96d56Sopenharmony_ci"\n"
44737db96d56Sopenharmony_ci"This docstring also has an invalid signature."
44747db96d56Sopenharmony_ci);
44757db96d56Sopenharmony_ci
44767db96d56Sopenharmony_ciPyDoc_STRVAR(docstring_with_signature,
44777db96d56Sopenharmony_ci"docstring_with_signature($module, /, sig)\n"
44787db96d56Sopenharmony_ci"--\n"
44797db96d56Sopenharmony_ci"\n"
44807db96d56Sopenharmony_ci"This docstring has a valid signature."
44817db96d56Sopenharmony_ci);
44827db96d56Sopenharmony_ci
44837db96d56Sopenharmony_ciPyDoc_STRVAR(docstring_with_signature_but_no_doc,
44847db96d56Sopenharmony_ci"docstring_with_signature_but_no_doc($module, /, sig)\n"
44857db96d56Sopenharmony_ci"--\n"
44867db96d56Sopenharmony_ci"\n"
44877db96d56Sopenharmony_ci);
44887db96d56Sopenharmony_ci
44897db96d56Sopenharmony_ciPyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
44907db96d56Sopenharmony_ci"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
44917db96d56Sopenharmony_ci"--\n"
44927db96d56Sopenharmony_ci"\n"
44937db96d56Sopenharmony_ci"\n"
44947db96d56Sopenharmony_ci"This docstring has a valid signature and some extra newlines."
44957db96d56Sopenharmony_ci);
44967db96d56Sopenharmony_ci
44977db96d56Sopenharmony_ciPyDoc_STRVAR(docstring_with_signature_with_defaults,
44987db96d56Sopenharmony_ci"docstring_with_signature_with_defaults(module, s='avocado',\n"
44997db96d56Sopenharmony_ci"        b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
45007db96d56Sopenharmony_ci"        local=the_number_three, sys=sys.maxsize,\n"
45017db96d56Sopenharmony_ci"        exp=sys.maxsize - 1)\n"
45027db96d56Sopenharmony_ci"--\n"
45037db96d56Sopenharmony_ci"\n"
45047db96d56Sopenharmony_ci"\n"
45057db96d56Sopenharmony_ci"\n"
45067db96d56Sopenharmony_ci"This docstring has a valid signature with parameters,\n"
45077db96d56Sopenharmony_ci"and the parameters take defaults of varying types."
45087db96d56Sopenharmony_ci);
45097db96d56Sopenharmony_ci
45107db96d56Sopenharmony_citypedef struct {
45117db96d56Sopenharmony_ci    PyThread_type_lock start_event;
45127db96d56Sopenharmony_ci    PyThread_type_lock exit_event;
45137db96d56Sopenharmony_ci    PyObject *callback;
45147db96d56Sopenharmony_ci} test_c_thread_t;
45157db96d56Sopenharmony_ci
45167db96d56Sopenharmony_cistatic void
45177db96d56Sopenharmony_citemporary_c_thread(void *data)
45187db96d56Sopenharmony_ci{
45197db96d56Sopenharmony_ci    test_c_thread_t *test_c_thread = data;
45207db96d56Sopenharmony_ci    PyGILState_STATE state;
45217db96d56Sopenharmony_ci    PyObject *res;
45227db96d56Sopenharmony_ci
45237db96d56Sopenharmony_ci    PyThread_release_lock(test_c_thread->start_event);
45247db96d56Sopenharmony_ci
45257db96d56Sopenharmony_ci    /* Allocate a Python thread state for this thread */
45267db96d56Sopenharmony_ci    state = PyGILState_Ensure();
45277db96d56Sopenharmony_ci
45287db96d56Sopenharmony_ci    res = PyObject_CallNoArgs(test_c_thread->callback);
45297db96d56Sopenharmony_ci    Py_CLEAR(test_c_thread->callback);
45307db96d56Sopenharmony_ci
45317db96d56Sopenharmony_ci    if (res == NULL) {
45327db96d56Sopenharmony_ci        PyErr_Print();
45337db96d56Sopenharmony_ci    }
45347db96d56Sopenharmony_ci    else {
45357db96d56Sopenharmony_ci        Py_DECREF(res);
45367db96d56Sopenharmony_ci    }
45377db96d56Sopenharmony_ci
45387db96d56Sopenharmony_ci    /* Destroy the Python thread state for this thread */
45397db96d56Sopenharmony_ci    PyGILState_Release(state);
45407db96d56Sopenharmony_ci
45417db96d56Sopenharmony_ci    PyThread_release_lock(test_c_thread->exit_event);
45427db96d56Sopenharmony_ci}
45437db96d56Sopenharmony_ci
45447db96d56Sopenharmony_cistatic test_c_thread_t test_c_thread;
45457db96d56Sopenharmony_ci
45467db96d56Sopenharmony_cistatic PyObject *
45477db96d56Sopenharmony_cicall_in_temporary_c_thread(PyObject *self, PyObject *args)
45487db96d56Sopenharmony_ci{
45497db96d56Sopenharmony_ci    PyObject *res = NULL;
45507db96d56Sopenharmony_ci    PyObject *callback = NULL;
45517db96d56Sopenharmony_ci    long thread;
45527db96d56Sopenharmony_ci    int wait = 1;
45537db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O|i", &callback, &wait))
45547db96d56Sopenharmony_ci    {
45557db96d56Sopenharmony_ci        return NULL;
45567db96d56Sopenharmony_ci    }
45577db96d56Sopenharmony_ci
45587db96d56Sopenharmony_ci    test_c_thread.start_event = PyThread_allocate_lock();
45597db96d56Sopenharmony_ci    test_c_thread.exit_event = PyThread_allocate_lock();
45607db96d56Sopenharmony_ci    test_c_thread.callback = NULL;
45617db96d56Sopenharmony_ci    if (!test_c_thread.start_event || !test_c_thread.exit_event) {
45627db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
45637db96d56Sopenharmony_ci        goto exit;
45647db96d56Sopenharmony_ci    }
45657db96d56Sopenharmony_ci
45667db96d56Sopenharmony_ci    test_c_thread.callback = Py_NewRef(callback);
45677db96d56Sopenharmony_ci
45687db96d56Sopenharmony_ci    PyThread_acquire_lock(test_c_thread.start_event, 1);
45697db96d56Sopenharmony_ci    PyThread_acquire_lock(test_c_thread.exit_event, 1);
45707db96d56Sopenharmony_ci
45717db96d56Sopenharmony_ci    thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
45727db96d56Sopenharmony_ci    if (thread == -1) {
45737db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
45747db96d56Sopenharmony_ci        PyThread_release_lock(test_c_thread.start_event);
45757db96d56Sopenharmony_ci        PyThread_release_lock(test_c_thread.exit_event);
45767db96d56Sopenharmony_ci        goto exit;
45777db96d56Sopenharmony_ci    }
45787db96d56Sopenharmony_ci
45797db96d56Sopenharmony_ci    PyThread_acquire_lock(test_c_thread.start_event, 1);
45807db96d56Sopenharmony_ci    PyThread_release_lock(test_c_thread.start_event);
45817db96d56Sopenharmony_ci
45827db96d56Sopenharmony_ci    if (!wait) {
45837db96d56Sopenharmony_ci        Py_RETURN_NONE;
45847db96d56Sopenharmony_ci    }
45857db96d56Sopenharmony_ci
45867db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
45877db96d56Sopenharmony_ci        PyThread_acquire_lock(test_c_thread.exit_event, 1);
45887db96d56Sopenharmony_ci        PyThread_release_lock(test_c_thread.exit_event);
45897db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
45907db96d56Sopenharmony_ci
45917db96d56Sopenharmony_ci    res = Py_NewRef(Py_None);
45927db96d56Sopenharmony_ci
45937db96d56Sopenharmony_ciexit:
45947db96d56Sopenharmony_ci    Py_CLEAR(test_c_thread.callback);
45957db96d56Sopenharmony_ci    if (test_c_thread.start_event) {
45967db96d56Sopenharmony_ci        PyThread_free_lock(test_c_thread.start_event);
45977db96d56Sopenharmony_ci        test_c_thread.start_event = NULL;
45987db96d56Sopenharmony_ci    }
45997db96d56Sopenharmony_ci    if (test_c_thread.exit_event) {
46007db96d56Sopenharmony_ci        PyThread_free_lock(test_c_thread.exit_event);
46017db96d56Sopenharmony_ci        test_c_thread.exit_event = NULL;
46027db96d56Sopenharmony_ci    }
46037db96d56Sopenharmony_ci    return res;
46047db96d56Sopenharmony_ci}
46057db96d56Sopenharmony_ci
46067db96d56Sopenharmony_cistatic PyObject *
46077db96d56Sopenharmony_cijoin_temporary_c_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
46087db96d56Sopenharmony_ci{
46097db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
46107db96d56Sopenharmony_ci        PyThread_acquire_lock(test_c_thread.exit_event, 1);
46117db96d56Sopenharmony_ci        PyThread_release_lock(test_c_thread.exit_event);
46127db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
46137db96d56Sopenharmony_ci    Py_CLEAR(test_c_thread.callback);
46147db96d56Sopenharmony_ci    PyThread_free_lock(test_c_thread.start_event);
46157db96d56Sopenharmony_ci    test_c_thread.start_event = NULL;
46167db96d56Sopenharmony_ci    PyThread_free_lock(test_c_thread.exit_event);
46177db96d56Sopenharmony_ci    test_c_thread.exit_event = NULL;
46187db96d56Sopenharmony_ci    Py_RETURN_NONE;
46197db96d56Sopenharmony_ci}
46207db96d56Sopenharmony_ci
46217db96d56Sopenharmony_ci/* marshal */
46227db96d56Sopenharmony_ci
46237db96d56Sopenharmony_cistatic PyObject*
46247db96d56Sopenharmony_cipymarshal_write_long_to_file(PyObject* self, PyObject *args)
46257db96d56Sopenharmony_ci{
46267db96d56Sopenharmony_ci    long value;
46277db96d56Sopenharmony_ci    PyObject *filename;
46287db96d56Sopenharmony_ci    int version;
46297db96d56Sopenharmony_ci    FILE *fp;
46307db96d56Sopenharmony_ci
46317db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file",
46327db96d56Sopenharmony_ci                          &value, &filename, &version))
46337db96d56Sopenharmony_ci        return NULL;
46347db96d56Sopenharmony_ci
46357db96d56Sopenharmony_ci    fp = _Py_fopen_obj(filename, "wb");
46367db96d56Sopenharmony_ci    if (fp == NULL) {
46377db96d56Sopenharmony_ci        PyErr_SetFromErrno(PyExc_OSError);
46387db96d56Sopenharmony_ci        return NULL;
46397db96d56Sopenharmony_ci    }
46407db96d56Sopenharmony_ci
46417db96d56Sopenharmony_ci    PyMarshal_WriteLongToFile(value, fp, version);
46427db96d56Sopenharmony_ci    assert(!PyErr_Occurred());
46437db96d56Sopenharmony_ci
46447db96d56Sopenharmony_ci    fclose(fp);
46457db96d56Sopenharmony_ci    Py_RETURN_NONE;
46467db96d56Sopenharmony_ci}
46477db96d56Sopenharmony_ci
46487db96d56Sopenharmony_cistatic PyObject*
46497db96d56Sopenharmony_cipymarshal_write_object_to_file(PyObject* self, PyObject *args)
46507db96d56Sopenharmony_ci{
46517db96d56Sopenharmony_ci    PyObject *obj;
46527db96d56Sopenharmony_ci    PyObject *filename;
46537db96d56Sopenharmony_ci    int version;
46547db96d56Sopenharmony_ci    FILE *fp;
46557db96d56Sopenharmony_ci
46567db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file",
46577db96d56Sopenharmony_ci                          &obj, &filename, &version))
46587db96d56Sopenharmony_ci        return NULL;
46597db96d56Sopenharmony_ci
46607db96d56Sopenharmony_ci    fp = _Py_fopen_obj(filename, "wb");
46617db96d56Sopenharmony_ci    if (fp == NULL) {
46627db96d56Sopenharmony_ci        PyErr_SetFromErrno(PyExc_OSError);
46637db96d56Sopenharmony_ci        return NULL;
46647db96d56Sopenharmony_ci    }
46657db96d56Sopenharmony_ci
46667db96d56Sopenharmony_ci    PyMarshal_WriteObjectToFile(obj, fp, version);
46677db96d56Sopenharmony_ci    assert(!PyErr_Occurred());
46687db96d56Sopenharmony_ci
46697db96d56Sopenharmony_ci    fclose(fp);
46707db96d56Sopenharmony_ci    Py_RETURN_NONE;
46717db96d56Sopenharmony_ci}
46727db96d56Sopenharmony_ci
46737db96d56Sopenharmony_cistatic PyObject*
46747db96d56Sopenharmony_cipymarshal_read_short_from_file(PyObject* self, PyObject *args)
46757db96d56Sopenharmony_ci{
46767db96d56Sopenharmony_ci    int value;
46777db96d56Sopenharmony_ci    long pos;
46787db96d56Sopenharmony_ci    PyObject *filename;
46797db96d56Sopenharmony_ci    FILE *fp;
46807db96d56Sopenharmony_ci
46817db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O:pymarshal_read_short_from_file", &filename))
46827db96d56Sopenharmony_ci        return NULL;
46837db96d56Sopenharmony_ci
46847db96d56Sopenharmony_ci    fp = _Py_fopen_obj(filename, "rb");
46857db96d56Sopenharmony_ci    if (fp == NULL) {
46867db96d56Sopenharmony_ci        PyErr_SetFromErrno(PyExc_OSError);
46877db96d56Sopenharmony_ci        return NULL;
46887db96d56Sopenharmony_ci    }
46897db96d56Sopenharmony_ci
46907db96d56Sopenharmony_ci    value = PyMarshal_ReadShortFromFile(fp);
46917db96d56Sopenharmony_ci    pos = ftell(fp);
46927db96d56Sopenharmony_ci
46937db96d56Sopenharmony_ci    fclose(fp);
46947db96d56Sopenharmony_ci    if (PyErr_Occurred())
46957db96d56Sopenharmony_ci        return NULL;
46967db96d56Sopenharmony_ci    return Py_BuildValue("il", value, pos);
46977db96d56Sopenharmony_ci}
46987db96d56Sopenharmony_ci
46997db96d56Sopenharmony_cistatic PyObject*
47007db96d56Sopenharmony_cipymarshal_read_long_from_file(PyObject* self, PyObject *args)
47017db96d56Sopenharmony_ci{
47027db96d56Sopenharmony_ci    long value, pos;
47037db96d56Sopenharmony_ci    PyObject *filename;
47047db96d56Sopenharmony_ci    FILE *fp;
47057db96d56Sopenharmony_ci
47067db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename))
47077db96d56Sopenharmony_ci        return NULL;
47087db96d56Sopenharmony_ci
47097db96d56Sopenharmony_ci    fp = _Py_fopen_obj(filename, "rb");
47107db96d56Sopenharmony_ci    if (fp == NULL) {
47117db96d56Sopenharmony_ci        PyErr_SetFromErrno(PyExc_OSError);
47127db96d56Sopenharmony_ci        return NULL;
47137db96d56Sopenharmony_ci    }
47147db96d56Sopenharmony_ci
47157db96d56Sopenharmony_ci    value = PyMarshal_ReadLongFromFile(fp);
47167db96d56Sopenharmony_ci    pos = ftell(fp);
47177db96d56Sopenharmony_ci
47187db96d56Sopenharmony_ci    fclose(fp);
47197db96d56Sopenharmony_ci    if (PyErr_Occurred())
47207db96d56Sopenharmony_ci        return NULL;
47217db96d56Sopenharmony_ci    return Py_BuildValue("ll", value, pos);
47227db96d56Sopenharmony_ci}
47237db96d56Sopenharmony_ci
47247db96d56Sopenharmony_cistatic PyObject*
47257db96d56Sopenharmony_cipymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
47267db96d56Sopenharmony_ci{
47277db96d56Sopenharmony_ci    PyObject *filename;
47287db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename))
47297db96d56Sopenharmony_ci        return NULL;
47307db96d56Sopenharmony_ci
47317db96d56Sopenharmony_ci    FILE *fp = _Py_fopen_obj(filename, "rb");
47327db96d56Sopenharmony_ci    if (fp == NULL) {
47337db96d56Sopenharmony_ci        PyErr_SetFromErrno(PyExc_OSError);
47347db96d56Sopenharmony_ci        return NULL;
47357db96d56Sopenharmony_ci    }
47367db96d56Sopenharmony_ci
47377db96d56Sopenharmony_ci    PyObject *obj = PyMarshal_ReadLastObjectFromFile(fp);
47387db96d56Sopenharmony_ci    long pos = ftell(fp);
47397db96d56Sopenharmony_ci
47407db96d56Sopenharmony_ci    fclose(fp);
47417db96d56Sopenharmony_ci    if (obj == NULL) {
47427db96d56Sopenharmony_ci        return NULL;
47437db96d56Sopenharmony_ci    }
47447db96d56Sopenharmony_ci    return Py_BuildValue("Nl", obj, pos);
47457db96d56Sopenharmony_ci}
47467db96d56Sopenharmony_ci
47477db96d56Sopenharmony_cistatic PyObject*
47487db96d56Sopenharmony_cipymarshal_read_object_from_file(PyObject* self, PyObject *args)
47497db96d56Sopenharmony_ci{
47507db96d56Sopenharmony_ci    PyObject *filename;
47517db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename))
47527db96d56Sopenharmony_ci        return NULL;
47537db96d56Sopenharmony_ci
47547db96d56Sopenharmony_ci    FILE *fp = _Py_fopen_obj(filename, "rb");
47557db96d56Sopenharmony_ci    if (fp == NULL) {
47567db96d56Sopenharmony_ci        PyErr_SetFromErrno(PyExc_OSError);
47577db96d56Sopenharmony_ci        return NULL;
47587db96d56Sopenharmony_ci    }
47597db96d56Sopenharmony_ci
47607db96d56Sopenharmony_ci    PyObject *obj = PyMarshal_ReadObjectFromFile(fp);
47617db96d56Sopenharmony_ci    long pos = ftell(fp);
47627db96d56Sopenharmony_ci
47637db96d56Sopenharmony_ci    fclose(fp);
47647db96d56Sopenharmony_ci    if (obj == NULL) {
47657db96d56Sopenharmony_ci        return NULL;
47667db96d56Sopenharmony_ci    }
47677db96d56Sopenharmony_ci    return Py_BuildValue("Nl", obj, pos);
47687db96d56Sopenharmony_ci}
47697db96d56Sopenharmony_ci
47707db96d56Sopenharmony_cistatic PyObject*
47717db96d56Sopenharmony_cireturn_null_without_error(PyObject *self, PyObject *args)
47727db96d56Sopenharmony_ci{
47737db96d56Sopenharmony_ci    /* invalid call: return NULL without setting an error,
47747db96d56Sopenharmony_ci     * _Py_CheckFunctionResult() must detect such bug at runtime. */
47757db96d56Sopenharmony_ci    PyErr_Clear();
47767db96d56Sopenharmony_ci    return NULL;
47777db96d56Sopenharmony_ci}
47787db96d56Sopenharmony_ci
47797db96d56Sopenharmony_cistatic PyObject*
47807db96d56Sopenharmony_cireturn_result_with_error(PyObject *self, PyObject *args)
47817db96d56Sopenharmony_ci{
47827db96d56Sopenharmony_ci    /* invalid call: return a result with an error set,
47837db96d56Sopenharmony_ci     * _Py_CheckFunctionResult() must detect such bug at runtime. */
47847db96d56Sopenharmony_ci    PyErr_SetNone(PyExc_ValueError);
47857db96d56Sopenharmony_ci    Py_RETURN_NONE;
47867db96d56Sopenharmony_ci}
47877db96d56Sopenharmony_ci
47887db96d56Sopenharmony_cistatic PyObject*
47897db96d56Sopenharmony_cigetitem_with_error(PyObject *self, PyObject *args)
47907db96d56Sopenharmony_ci{
47917db96d56Sopenharmony_ci    PyObject *map, *key;
47927db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OO", &map, &key)) {
47937db96d56Sopenharmony_ci        return NULL;
47947db96d56Sopenharmony_ci    }
47957db96d56Sopenharmony_ci
47967db96d56Sopenharmony_ci    PyErr_SetString(PyExc_ValueError, "bug");
47977db96d56Sopenharmony_ci    return PyObject_GetItem(map, key);
47987db96d56Sopenharmony_ci}
47997db96d56Sopenharmony_ci
48007db96d56Sopenharmony_cistatic PyObject *
48017db96d56Sopenharmony_citest_pytime_fromseconds(PyObject *self, PyObject *args)
48027db96d56Sopenharmony_ci{
48037db96d56Sopenharmony_ci    int seconds;
48047db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "i", &seconds)) {
48057db96d56Sopenharmony_ci        return NULL;
48067db96d56Sopenharmony_ci    }
48077db96d56Sopenharmony_ci    _PyTime_t ts = _PyTime_FromSeconds(seconds);
48087db96d56Sopenharmony_ci    return _PyTime_AsNanosecondsObject(ts);
48097db96d56Sopenharmony_ci}
48107db96d56Sopenharmony_ci
48117db96d56Sopenharmony_cistatic PyObject *
48127db96d56Sopenharmony_citest_pytime_fromsecondsobject(PyObject *self, PyObject *args)
48137db96d56Sopenharmony_ci{
48147db96d56Sopenharmony_ci    PyObject *obj;
48157db96d56Sopenharmony_ci    int round;
48167db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
48177db96d56Sopenharmony_ci        return NULL;
48187db96d56Sopenharmony_ci    }
48197db96d56Sopenharmony_ci    if (check_time_rounding(round) < 0) {
48207db96d56Sopenharmony_ci        return NULL;
48217db96d56Sopenharmony_ci    }
48227db96d56Sopenharmony_ci    _PyTime_t ts;
48237db96d56Sopenharmony_ci    if (_PyTime_FromSecondsObject(&ts, obj, round) == -1) {
48247db96d56Sopenharmony_ci        return NULL;
48257db96d56Sopenharmony_ci    }
48267db96d56Sopenharmony_ci    return _PyTime_AsNanosecondsObject(ts);
48277db96d56Sopenharmony_ci}
48287db96d56Sopenharmony_ci
48297db96d56Sopenharmony_cistatic PyObject *
48307db96d56Sopenharmony_citest_pytime_assecondsdouble(PyObject *self, PyObject *args)
48317db96d56Sopenharmony_ci{
48327db96d56Sopenharmony_ci    PyObject *obj;
48337db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O", &obj)) {
48347db96d56Sopenharmony_ci        return NULL;
48357db96d56Sopenharmony_ci    }
48367db96d56Sopenharmony_ci    _PyTime_t ts;
48377db96d56Sopenharmony_ci    if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
48387db96d56Sopenharmony_ci        return NULL;
48397db96d56Sopenharmony_ci    }
48407db96d56Sopenharmony_ci    double d = _PyTime_AsSecondsDouble(ts);
48417db96d56Sopenharmony_ci    return PyFloat_FromDouble(d);
48427db96d56Sopenharmony_ci}
48437db96d56Sopenharmony_ci
48447db96d56Sopenharmony_cistatic PyObject *
48457db96d56Sopenharmony_citest_PyTime_AsTimeval(PyObject *self, PyObject *args)
48467db96d56Sopenharmony_ci{
48477db96d56Sopenharmony_ci    PyObject *obj;
48487db96d56Sopenharmony_ci    int round;
48497db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
48507db96d56Sopenharmony_ci        return NULL;
48517db96d56Sopenharmony_ci    }
48527db96d56Sopenharmony_ci    if (check_time_rounding(round) < 0) {
48537db96d56Sopenharmony_ci        return NULL;
48547db96d56Sopenharmony_ci    }
48557db96d56Sopenharmony_ci    _PyTime_t t;
48567db96d56Sopenharmony_ci    if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
48577db96d56Sopenharmony_ci        return NULL;
48587db96d56Sopenharmony_ci    }
48597db96d56Sopenharmony_ci    struct timeval tv;
48607db96d56Sopenharmony_ci    if (_PyTime_AsTimeval(t, &tv, round) < 0) {
48617db96d56Sopenharmony_ci        return NULL;
48627db96d56Sopenharmony_ci    }
48637db96d56Sopenharmony_ci
48647db96d56Sopenharmony_ci    PyObject *seconds = PyLong_FromLongLong(tv.tv_sec);
48657db96d56Sopenharmony_ci    if (seconds == NULL) {
48667db96d56Sopenharmony_ci        return NULL;
48677db96d56Sopenharmony_ci    }
48687db96d56Sopenharmony_ci    return Py_BuildValue("Nl", seconds, (long)tv.tv_usec);
48697db96d56Sopenharmony_ci}
48707db96d56Sopenharmony_ci
48717db96d56Sopenharmony_cistatic PyObject *
48727db96d56Sopenharmony_citest_PyTime_AsTimeval_clamp(PyObject *self, PyObject *args)
48737db96d56Sopenharmony_ci{
48747db96d56Sopenharmony_ci    PyObject *obj;
48757db96d56Sopenharmony_ci    int round;
48767db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
48777db96d56Sopenharmony_ci        return NULL;
48787db96d56Sopenharmony_ci    }
48797db96d56Sopenharmony_ci    if (check_time_rounding(round) < 0) {
48807db96d56Sopenharmony_ci        return NULL;
48817db96d56Sopenharmony_ci    }
48827db96d56Sopenharmony_ci    _PyTime_t t;
48837db96d56Sopenharmony_ci    if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
48847db96d56Sopenharmony_ci        return NULL;
48857db96d56Sopenharmony_ci    }
48867db96d56Sopenharmony_ci    struct timeval tv;
48877db96d56Sopenharmony_ci    _PyTime_AsTimeval_clamp(t, &tv, round);
48887db96d56Sopenharmony_ci
48897db96d56Sopenharmony_ci    PyObject *seconds = PyLong_FromLongLong(tv.tv_sec);
48907db96d56Sopenharmony_ci    if (seconds == NULL) {
48917db96d56Sopenharmony_ci        return NULL;
48927db96d56Sopenharmony_ci    }
48937db96d56Sopenharmony_ci    return Py_BuildValue("Nl", seconds, (long)tv.tv_usec);
48947db96d56Sopenharmony_ci}
48957db96d56Sopenharmony_ci
48967db96d56Sopenharmony_ci#ifdef HAVE_CLOCK_GETTIME
48977db96d56Sopenharmony_cistatic PyObject *
48987db96d56Sopenharmony_citest_PyTime_AsTimespec(PyObject *self, PyObject *args)
48997db96d56Sopenharmony_ci{
49007db96d56Sopenharmony_ci    PyObject *obj;
49017db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O", &obj)) {
49027db96d56Sopenharmony_ci        return NULL;
49037db96d56Sopenharmony_ci    }
49047db96d56Sopenharmony_ci    _PyTime_t t;
49057db96d56Sopenharmony_ci    if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
49067db96d56Sopenharmony_ci        return NULL;
49077db96d56Sopenharmony_ci    }
49087db96d56Sopenharmony_ci    struct timespec ts;
49097db96d56Sopenharmony_ci    if (_PyTime_AsTimespec(t, &ts) == -1) {
49107db96d56Sopenharmony_ci        return NULL;
49117db96d56Sopenharmony_ci    }
49127db96d56Sopenharmony_ci    return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
49137db96d56Sopenharmony_ci}
49147db96d56Sopenharmony_ci
49157db96d56Sopenharmony_cistatic PyObject *
49167db96d56Sopenharmony_citest_PyTime_AsTimespec_clamp(PyObject *self, PyObject *args)
49177db96d56Sopenharmony_ci{
49187db96d56Sopenharmony_ci    PyObject *obj;
49197db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O", &obj)) {
49207db96d56Sopenharmony_ci        return NULL;
49217db96d56Sopenharmony_ci    }
49227db96d56Sopenharmony_ci    _PyTime_t t;
49237db96d56Sopenharmony_ci    if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
49247db96d56Sopenharmony_ci        return NULL;
49257db96d56Sopenharmony_ci    }
49267db96d56Sopenharmony_ci    struct timespec ts;
49277db96d56Sopenharmony_ci    _PyTime_AsTimespec_clamp(t, &ts);
49287db96d56Sopenharmony_ci    return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
49297db96d56Sopenharmony_ci}
49307db96d56Sopenharmony_ci#endif
49317db96d56Sopenharmony_ci
49327db96d56Sopenharmony_cistatic PyObject *
49337db96d56Sopenharmony_citest_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
49347db96d56Sopenharmony_ci{
49357db96d56Sopenharmony_ci    PyObject *obj;
49367db96d56Sopenharmony_ci    int round;
49377db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
49387db96d56Sopenharmony_ci        return NULL;
49397db96d56Sopenharmony_ci    }
49407db96d56Sopenharmony_ci    _PyTime_t t;
49417db96d56Sopenharmony_ci    if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
49427db96d56Sopenharmony_ci        return NULL;
49437db96d56Sopenharmony_ci    }
49447db96d56Sopenharmony_ci    if (check_time_rounding(round) < 0) {
49457db96d56Sopenharmony_ci        return NULL;
49467db96d56Sopenharmony_ci    }
49477db96d56Sopenharmony_ci    _PyTime_t ms = _PyTime_AsMilliseconds(t, round);
49487db96d56Sopenharmony_ci    _PyTime_t ns = _PyTime_FromNanoseconds(ms);
49497db96d56Sopenharmony_ci    return _PyTime_AsNanosecondsObject(ns);
49507db96d56Sopenharmony_ci}
49517db96d56Sopenharmony_ci
49527db96d56Sopenharmony_cistatic PyObject *
49537db96d56Sopenharmony_citest_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
49547db96d56Sopenharmony_ci{
49557db96d56Sopenharmony_ci    PyObject *obj;
49567db96d56Sopenharmony_ci    int round;
49577db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
49587db96d56Sopenharmony_ci        return NULL;
49597db96d56Sopenharmony_ci    }
49607db96d56Sopenharmony_ci    _PyTime_t t;
49617db96d56Sopenharmony_ci    if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
49627db96d56Sopenharmony_ci        return NULL;
49637db96d56Sopenharmony_ci    }
49647db96d56Sopenharmony_ci    if (check_time_rounding(round) < 0) {
49657db96d56Sopenharmony_ci        return NULL;
49667db96d56Sopenharmony_ci    }
49677db96d56Sopenharmony_ci    _PyTime_t us = _PyTime_AsMicroseconds(t, round);
49687db96d56Sopenharmony_ci    _PyTime_t ns = _PyTime_FromNanoseconds(us);
49697db96d56Sopenharmony_ci    return _PyTime_AsNanosecondsObject(ns);
49707db96d56Sopenharmony_ci}
49717db96d56Sopenharmony_ci
49727db96d56Sopenharmony_cistatic PyObject*
49737db96d56Sopenharmony_cipymem_buffer_overflow(PyObject *self, PyObject *args)
49747db96d56Sopenharmony_ci{
49757db96d56Sopenharmony_ci    char *buffer;
49767db96d56Sopenharmony_ci
49777db96d56Sopenharmony_ci    /* Deliberate buffer overflow to check that PyMem_Free() detects
49787db96d56Sopenharmony_ci       the overflow when debug hooks are installed. */
49797db96d56Sopenharmony_ci    buffer = PyMem_Malloc(16);
49807db96d56Sopenharmony_ci    if (buffer == NULL) {
49817db96d56Sopenharmony_ci        PyErr_NoMemory();
49827db96d56Sopenharmony_ci        return NULL;
49837db96d56Sopenharmony_ci    }
49847db96d56Sopenharmony_ci    buffer[16] = 'x';
49857db96d56Sopenharmony_ci    PyMem_Free(buffer);
49867db96d56Sopenharmony_ci
49877db96d56Sopenharmony_ci    Py_RETURN_NONE;
49887db96d56Sopenharmony_ci}
49897db96d56Sopenharmony_ci
49907db96d56Sopenharmony_cistatic PyObject*
49917db96d56Sopenharmony_cipymem_api_misuse(PyObject *self, PyObject *args)
49927db96d56Sopenharmony_ci{
49937db96d56Sopenharmony_ci    char *buffer;
49947db96d56Sopenharmony_ci
49957db96d56Sopenharmony_ci    /* Deliberate misusage of Python allocators:
49967db96d56Sopenharmony_ci       allococate with PyMem but release with PyMem_Raw. */
49977db96d56Sopenharmony_ci    buffer = PyMem_Malloc(16);
49987db96d56Sopenharmony_ci    PyMem_RawFree(buffer);
49997db96d56Sopenharmony_ci
50007db96d56Sopenharmony_ci    Py_RETURN_NONE;
50017db96d56Sopenharmony_ci}
50027db96d56Sopenharmony_ci
50037db96d56Sopenharmony_cistatic PyObject*
50047db96d56Sopenharmony_cipymem_malloc_without_gil(PyObject *self, PyObject *args)
50057db96d56Sopenharmony_ci{
50067db96d56Sopenharmony_ci    char *buffer;
50077db96d56Sopenharmony_ci
50087db96d56Sopenharmony_ci    /* Deliberate bug to test debug hooks on Python memory allocators:
50097db96d56Sopenharmony_ci       call PyMem_Malloc() without holding the GIL */
50107db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
50117db96d56Sopenharmony_ci    buffer = PyMem_Malloc(10);
50127db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
50137db96d56Sopenharmony_ci
50147db96d56Sopenharmony_ci    PyMem_Free(buffer);
50157db96d56Sopenharmony_ci
50167db96d56Sopenharmony_ci    Py_RETURN_NONE;
50177db96d56Sopenharmony_ci}
50187db96d56Sopenharmony_ci
50197db96d56Sopenharmony_ci
50207db96d56Sopenharmony_cistatic PyObject*
50217db96d56Sopenharmony_citest_pymem_getallocatorsname(PyObject *self, PyObject *args)
50227db96d56Sopenharmony_ci{
50237db96d56Sopenharmony_ci    const char *name = _PyMem_GetCurrentAllocatorName();
50247db96d56Sopenharmony_ci    if (name == NULL) {
50257db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
50267db96d56Sopenharmony_ci        return NULL;
50277db96d56Sopenharmony_ci    }
50287db96d56Sopenharmony_ci    return PyUnicode_FromString(name);
50297db96d56Sopenharmony_ci}
50307db96d56Sopenharmony_ci
50317db96d56Sopenharmony_ci
50327db96d56Sopenharmony_cistatic PyObject*
50337db96d56Sopenharmony_citest_pyobject_is_freed(const char *test_name, PyObject *op)
50347db96d56Sopenharmony_ci{
50357db96d56Sopenharmony_ci    if (!_PyObject_IsFreed(op)) {
50367db96d56Sopenharmony_ci        return raiseTestError(test_name, "object is not seen as freed");
50377db96d56Sopenharmony_ci    }
50387db96d56Sopenharmony_ci    Py_RETURN_NONE;
50397db96d56Sopenharmony_ci}
50407db96d56Sopenharmony_ci
50417db96d56Sopenharmony_ci
50427db96d56Sopenharmony_cistatic PyObject*
50437db96d56Sopenharmony_cicheck_pyobject_null_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
50447db96d56Sopenharmony_ci{
50457db96d56Sopenharmony_ci    PyObject *op = NULL;
50467db96d56Sopenharmony_ci    return test_pyobject_is_freed("check_pyobject_null_is_freed", op);
50477db96d56Sopenharmony_ci}
50487db96d56Sopenharmony_ci
50497db96d56Sopenharmony_ci
50507db96d56Sopenharmony_cistatic PyObject*
50517db96d56Sopenharmony_cicheck_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
50527db96d56Sopenharmony_ci{
50537db96d56Sopenharmony_ci    PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
50547db96d56Sopenharmony_ci    if (op == NULL) {
50557db96d56Sopenharmony_ci        return NULL;
50567db96d56Sopenharmony_ci    }
50577db96d56Sopenharmony_ci    /* Initialize reference count to avoid early crash in ceval or GC */
50587db96d56Sopenharmony_ci    Py_SET_REFCNT(op, 1);
50597db96d56Sopenharmony_ci    /* object fields like ob_type are uninitialized! */
50607db96d56Sopenharmony_ci    return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
50617db96d56Sopenharmony_ci}
50627db96d56Sopenharmony_ci
50637db96d56Sopenharmony_ci
50647db96d56Sopenharmony_cistatic PyObject*
50657db96d56Sopenharmony_cicheck_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
50667db96d56Sopenharmony_ci{
50677db96d56Sopenharmony_ci    /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
50687db96d56Sopenharmony_ci    PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
50697db96d56Sopenharmony_ci    if (op == NULL) {
50707db96d56Sopenharmony_ci        return NULL;
50717db96d56Sopenharmony_ci    }
50727db96d56Sopenharmony_ci    /* Initialize reference count to avoid early crash in ceval or GC */
50737db96d56Sopenharmony_ci    Py_SET_REFCNT(op, 1);
50747db96d56Sopenharmony_ci    /* ob_type field is after the memory block: part of "forbidden bytes"
50757db96d56Sopenharmony_ci       when using debug hooks on memory allocators! */
50767db96d56Sopenharmony_ci    return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
50777db96d56Sopenharmony_ci}
50787db96d56Sopenharmony_ci
50797db96d56Sopenharmony_ci
50807db96d56Sopenharmony_cistatic PyObject*
50817db96d56Sopenharmony_cicheck_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
50827db96d56Sopenharmony_ci{
50837db96d56Sopenharmony_ci    /* This test would fail if run with the address sanitizer */
50847db96d56Sopenharmony_ci#ifdef _Py_ADDRESS_SANITIZER
50857db96d56Sopenharmony_ci    Py_RETURN_NONE;
50867db96d56Sopenharmony_ci#else
50877db96d56Sopenharmony_ci    PyObject *op = PyObject_CallNoArgs((PyObject *)&PyBaseObject_Type);
50887db96d56Sopenharmony_ci    if (op == NULL) {
50897db96d56Sopenharmony_ci        return NULL;
50907db96d56Sopenharmony_ci    }
50917db96d56Sopenharmony_ci    Py_TYPE(op)->tp_dealloc(op);
50927db96d56Sopenharmony_ci    /* Reset reference count to avoid early crash in ceval or GC */
50937db96d56Sopenharmony_ci    Py_SET_REFCNT(op, 1);
50947db96d56Sopenharmony_ci    /* object memory is freed! */
50957db96d56Sopenharmony_ci    return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
50967db96d56Sopenharmony_ci#endif
50977db96d56Sopenharmony_ci}
50987db96d56Sopenharmony_ci
50997db96d56Sopenharmony_ci
51007db96d56Sopenharmony_cistatic PyObject*
51017db96d56Sopenharmony_cipyobject_malloc_without_gil(PyObject *self, PyObject *args)
51027db96d56Sopenharmony_ci{
51037db96d56Sopenharmony_ci    char *buffer;
51047db96d56Sopenharmony_ci
51057db96d56Sopenharmony_ci    /* Deliberate bug to test debug hooks on Python memory allocators:
51067db96d56Sopenharmony_ci       call PyObject_Malloc() without holding the GIL */
51077db96d56Sopenharmony_ci    Py_BEGIN_ALLOW_THREADS
51087db96d56Sopenharmony_ci    buffer = PyObject_Malloc(10);
51097db96d56Sopenharmony_ci    Py_END_ALLOW_THREADS
51107db96d56Sopenharmony_ci
51117db96d56Sopenharmony_ci    PyObject_Free(buffer);
51127db96d56Sopenharmony_ci
51137db96d56Sopenharmony_ci    Py_RETURN_NONE;
51147db96d56Sopenharmony_ci}
51157db96d56Sopenharmony_ci
51167db96d56Sopenharmony_cistatic PyObject *
51177db96d56Sopenharmony_citracemalloc_track(PyObject *self, PyObject *args)
51187db96d56Sopenharmony_ci{
51197db96d56Sopenharmony_ci    unsigned int domain;
51207db96d56Sopenharmony_ci    PyObject *ptr_obj;
51217db96d56Sopenharmony_ci    void *ptr;
51227db96d56Sopenharmony_ci    Py_ssize_t size;
51237db96d56Sopenharmony_ci    int release_gil = 0;
51247db96d56Sopenharmony_ci    int res;
51257db96d56Sopenharmony_ci
51267db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
51277db96d56Sopenharmony_ci        return NULL;
51287db96d56Sopenharmony_ci    ptr = PyLong_AsVoidPtr(ptr_obj);
51297db96d56Sopenharmony_ci    if (PyErr_Occurred())
51307db96d56Sopenharmony_ci        return NULL;
51317db96d56Sopenharmony_ci
51327db96d56Sopenharmony_ci    if (release_gil) {
51337db96d56Sopenharmony_ci        Py_BEGIN_ALLOW_THREADS
51347db96d56Sopenharmony_ci        res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
51357db96d56Sopenharmony_ci        Py_END_ALLOW_THREADS
51367db96d56Sopenharmony_ci    }
51377db96d56Sopenharmony_ci    else {
51387db96d56Sopenharmony_ci        res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
51397db96d56Sopenharmony_ci    }
51407db96d56Sopenharmony_ci
51417db96d56Sopenharmony_ci    if (res < 0) {
51427db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
51437db96d56Sopenharmony_ci        return NULL;
51447db96d56Sopenharmony_ci    }
51457db96d56Sopenharmony_ci
51467db96d56Sopenharmony_ci    Py_RETURN_NONE;
51477db96d56Sopenharmony_ci}
51487db96d56Sopenharmony_ci
51497db96d56Sopenharmony_cistatic PyObject *
51507db96d56Sopenharmony_citracemalloc_untrack(PyObject *self, PyObject *args)
51517db96d56Sopenharmony_ci{
51527db96d56Sopenharmony_ci    unsigned int domain;
51537db96d56Sopenharmony_ci    PyObject *ptr_obj;
51547db96d56Sopenharmony_ci    void *ptr;
51557db96d56Sopenharmony_ci    int res;
51567db96d56Sopenharmony_ci
51577db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
51587db96d56Sopenharmony_ci        return NULL;
51597db96d56Sopenharmony_ci    ptr = PyLong_AsVoidPtr(ptr_obj);
51607db96d56Sopenharmony_ci    if (PyErr_Occurred())
51617db96d56Sopenharmony_ci        return NULL;
51627db96d56Sopenharmony_ci
51637db96d56Sopenharmony_ci    res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
51647db96d56Sopenharmony_ci    if (res < 0) {
51657db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
51667db96d56Sopenharmony_ci        return NULL;
51677db96d56Sopenharmony_ci    }
51687db96d56Sopenharmony_ci
51697db96d56Sopenharmony_ci    Py_RETURN_NONE;
51707db96d56Sopenharmony_ci}
51717db96d56Sopenharmony_ci
51727db96d56Sopenharmony_cistatic PyObject *
51737db96d56Sopenharmony_citracemalloc_get_traceback(PyObject *self, PyObject *args)
51747db96d56Sopenharmony_ci{
51757db96d56Sopenharmony_ci    unsigned int domain;
51767db96d56Sopenharmony_ci    PyObject *ptr_obj;
51777db96d56Sopenharmony_ci    void *ptr;
51787db96d56Sopenharmony_ci
51797db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
51807db96d56Sopenharmony_ci        return NULL;
51817db96d56Sopenharmony_ci    ptr = PyLong_AsVoidPtr(ptr_obj);
51827db96d56Sopenharmony_ci    if (PyErr_Occurred())
51837db96d56Sopenharmony_ci        return NULL;
51847db96d56Sopenharmony_ci
51857db96d56Sopenharmony_ci    return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
51867db96d56Sopenharmony_ci}
51877db96d56Sopenharmony_ci
51887db96d56Sopenharmony_cistatic PyObject *
51897db96d56Sopenharmony_cidict_get_version(PyObject *self, PyObject *args)
51907db96d56Sopenharmony_ci{
51917db96d56Sopenharmony_ci    PyDictObject *dict;
51927db96d56Sopenharmony_ci    uint64_t version;
51937db96d56Sopenharmony_ci
51947db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
51957db96d56Sopenharmony_ci        return NULL;
51967db96d56Sopenharmony_ci
51977db96d56Sopenharmony_ci    version = dict->ma_version_tag;
51987db96d56Sopenharmony_ci
51997db96d56Sopenharmony_ci    static_assert(sizeof(unsigned long long) >= sizeof(version),
52007db96d56Sopenharmony_ci                  "version is larger than unsigned long long");
52017db96d56Sopenharmony_ci    return PyLong_FromUnsignedLongLong((unsigned long long)version);
52027db96d56Sopenharmony_ci}
52037db96d56Sopenharmony_ci
52047db96d56Sopenharmony_ci
52057db96d56Sopenharmony_cistatic PyObject *
52067db96d56Sopenharmony_ciraise_SIGINT_then_send_None(PyObject *self, PyObject *args)
52077db96d56Sopenharmony_ci{
52087db96d56Sopenharmony_ci    _Py_IDENTIFIER(send);
52097db96d56Sopenharmony_ci    PyGenObject *gen;
52107db96d56Sopenharmony_ci
52117db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
52127db96d56Sopenharmony_ci        return NULL;
52137db96d56Sopenharmony_ci
52147db96d56Sopenharmony_ci    /* This is used in a test to check what happens if a signal arrives just
52157db96d56Sopenharmony_ci       as we're in the process of entering a yield from chain (see
52167db96d56Sopenharmony_ci       bpo-30039).
52177db96d56Sopenharmony_ci
52187db96d56Sopenharmony_ci       Needs to be done in C, because:
52197db96d56Sopenharmony_ci       - we don't have a Python wrapper for raise()
52207db96d56Sopenharmony_ci       - we need to make sure that the Python-level signal handler doesn't run
52217db96d56Sopenharmony_ci         *before* we enter the generator frame, which is impossible in Python
52227db96d56Sopenharmony_ci         because we check for signals before every bytecode operation.
52237db96d56Sopenharmony_ci     */
52247db96d56Sopenharmony_ci    raise(SIGINT);
52257db96d56Sopenharmony_ci    return _PyObject_CallMethodIdOneArg((PyObject *)gen, &PyId_send, Py_None);
52267db96d56Sopenharmony_ci}
52277db96d56Sopenharmony_ci
52287db96d56Sopenharmony_ci
52297db96d56Sopenharmony_cistatic int
52307db96d56Sopenharmony_cifastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
52317db96d56Sopenharmony_ci{
52327db96d56Sopenharmony_ci    if (args == Py_None) {
52337db96d56Sopenharmony_ci        *stack = NULL;
52347db96d56Sopenharmony_ci        *nargs = 0;
52357db96d56Sopenharmony_ci    }
52367db96d56Sopenharmony_ci    else if (PyTuple_Check(args)) {
52377db96d56Sopenharmony_ci        *stack = ((PyTupleObject *)args)->ob_item;
52387db96d56Sopenharmony_ci        *nargs = PyTuple_GET_SIZE(args);
52397db96d56Sopenharmony_ci    }
52407db96d56Sopenharmony_ci    else {
52417db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
52427db96d56Sopenharmony_ci        return -1;
52437db96d56Sopenharmony_ci    }
52447db96d56Sopenharmony_ci    return 0;
52457db96d56Sopenharmony_ci}
52467db96d56Sopenharmony_ci
52477db96d56Sopenharmony_ci
52487db96d56Sopenharmony_cistatic PyObject *
52497db96d56Sopenharmony_citest_pyobject_fastcall(PyObject *self, PyObject *args)
52507db96d56Sopenharmony_ci{
52517db96d56Sopenharmony_ci    PyObject *func, *func_args;
52527db96d56Sopenharmony_ci    PyObject **stack;
52537db96d56Sopenharmony_ci    Py_ssize_t nargs;
52547db96d56Sopenharmony_ci
52557db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
52567db96d56Sopenharmony_ci        return NULL;
52577db96d56Sopenharmony_ci    }
52587db96d56Sopenharmony_ci
52597db96d56Sopenharmony_ci    if (fastcall_args(func_args, &stack, &nargs) < 0) {
52607db96d56Sopenharmony_ci        return NULL;
52617db96d56Sopenharmony_ci    }
52627db96d56Sopenharmony_ci    return _PyObject_FastCall(func, stack, nargs);
52637db96d56Sopenharmony_ci}
52647db96d56Sopenharmony_ci
52657db96d56Sopenharmony_ci
52667db96d56Sopenharmony_cistatic PyObject *
52677db96d56Sopenharmony_citest_pyobject_fastcalldict(PyObject *self, PyObject *args)
52687db96d56Sopenharmony_ci{
52697db96d56Sopenharmony_ci    PyObject *func, *func_args, *kwargs;
52707db96d56Sopenharmony_ci    PyObject **stack;
52717db96d56Sopenharmony_ci    Py_ssize_t nargs;
52727db96d56Sopenharmony_ci
52737db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
52747db96d56Sopenharmony_ci        return NULL;
52757db96d56Sopenharmony_ci    }
52767db96d56Sopenharmony_ci
52777db96d56Sopenharmony_ci    if (fastcall_args(func_args, &stack, &nargs) < 0) {
52787db96d56Sopenharmony_ci        return NULL;
52797db96d56Sopenharmony_ci    }
52807db96d56Sopenharmony_ci
52817db96d56Sopenharmony_ci    if (kwargs == Py_None) {
52827db96d56Sopenharmony_ci        kwargs = NULL;
52837db96d56Sopenharmony_ci    }
52847db96d56Sopenharmony_ci    else if (!PyDict_Check(kwargs)) {
52857db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
52867db96d56Sopenharmony_ci        return NULL;
52877db96d56Sopenharmony_ci    }
52887db96d56Sopenharmony_ci
52897db96d56Sopenharmony_ci    return PyObject_VectorcallDict(func, stack, nargs, kwargs);
52907db96d56Sopenharmony_ci}
52917db96d56Sopenharmony_ci
52927db96d56Sopenharmony_ci
52937db96d56Sopenharmony_cistatic PyObject *
52947db96d56Sopenharmony_citest_pyobject_vectorcall(PyObject *self, PyObject *args)
52957db96d56Sopenharmony_ci{
52967db96d56Sopenharmony_ci    PyObject *func, *func_args, *kwnames = NULL;
52977db96d56Sopenharmony_ci    PyObject **stack;
52987db96d56Sopenharmony_ci    Py_ssize_t nargs, nkw;
52997db96d56Sopenharmony_ci
53007db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
53017db96d56Sopenharmony_ci        return NULL;
53027db96d56Sopenharmony_ci    }
53037db96d56Sopenharmony_ci
53047db96d56Sopenharmony_ci    if (fastcall_args(func_args, &stack, &nargs) < 0) {
53057db96d56Sopenharmony_ci        return NULL;
53067db96d56Sopenharmony_ci    }
53077db96d56Sopenharmony_ci
53087db96d56Sopenharmony_ci    if (kwnames == Py_None) {
53097db96d56Sopenharmony_ci        kwnames = NULL;
53107db96d56Sopenharmony_ci    }
53117db96d56Sopenharmony_ci    else if (PyTuple_Check(kwnames)) {
53127db96d56Sopenharmony_ci        nkw = PyTuple_GET_SIZE(kwnames);
53137db96d56Sopenharmony_ci        if (nargs < nkw) {
53147db96d56Sopenharmony_ci            PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
53157db96d56Sopenharmony_ci            return NULL;
53167db96d56Sopenharmony_ci        }
53177db96d56Sopenharmony_ci        nargs -= nkw;
53187db96d56Sopenharmony_ci    }
53197db96d56Sopenharmony_ci    else {
53207db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
53217db96d56Sopenharmony_ci        return NULL;
53227db96d56Sopenharmony_ci    }
53237db96d56Sopenharmony_ci    return PyObject_Vectorcall(func, stack, nargs, kwnames);
53247db96d56Sopenharmony_ci}
53257db96d56Sopenharmony_ci
53267db96d56Sopenharmony_ci
53277db96d56Sopenharmony_cistatic PyObject *
53287db96d56Sopenharmony_citest_pyvectorcall_call(PyObject *self, PyObject *args)
53297db96d56Sopenharmony_ci{
53307db96d56Sopenharmony_ci    PyObject *func;
53317db96d56Sopenharmony_ci    PyObject *argstuple;
53327db96d56Sopenharmony_ci    PyObject *kwargs = NULL;
53337db96d56Sopenharmony_ci
53347db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
53357db96d56Sopenharmony_ci        return NULL;
53367db96d56Sopenharmony_ci    }
53377db96d56Sopenharmony_ci
53387db96d56Sopenharmony_ci    if (!PyTuple_Check(argstuple)) {
53397db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "args must be a tuple");
53407db96d56Sopenharmony_ci        return NULL;
53417db96d56Sopenharmony_ci    }
53427db96d56Sopenharmony_ci    if (kwargs != NULL && !PyDict_Check(kwargs)) {
53437db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
53447db96d56Sopenharmony_ci        return NULL;
53457db96d56Sopenharmony_ci    }
53467db96d56Sopenharmony_ci
53477db96d56Sopenharmony_ci    return PyVectorcall_Call(func, argstuple, kwargs);
53487db96d56Sopenharmony_ci}
53497db96d56Sopenharmony_ci
53507db96d56Sopenharmony_ci
53517db96d56Sopenharmony_cistatic PyObject*
53527db96d56Sopenharmony_cistack_pointer(PyObject *self, PyObject *args)
53537db96d56Sopenharmony_ci{
53547db96d56Sopenharmony_ci    int v = 5;
53557db96d56Sopenharmony_ci    return PyLong_FromVoidPtr(&v);
53567db96d56Sopenharmony_ci}
53577db96d56Sopenharmony_ci
53587db96d56Sopenharmony_ci
53597db96d56Sopenharmony_ci#ifdef W_STOPCODE
53607db96d56Sopenharmony_cistatic PyObject*
53617db96d56Sopenharmony_cipy_w_stopcode(PyObject *self, PyObject *args)
53627db96d56Sopenharmony_ci{
53637db96d56Sopenharmony_ci    int sig, status;
53647db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "i", &sig)) {
53657db96d56Sopenharmony_ci        return NULL;
53667db96d56Sopenharmony_ci    }
53677db96d56Sopenharmony_ci    status = W_STOPCODE(sig);
53687db96d56Sopenharmony_ci    return PyLong_FromLong(status);
53697db96d56Sopenharmony_ci}
53707db96d56Sopenharmony_ci#endif
53717db96d56Sopenharmony_ci
53727db96d56Sopenharmony_ci
53737db96d56Sopenharmony_cistatic PyObject *
53747db96d56Sopenharmony_ciget_mapping_keys(PyObject* self, PyObject *obj)
53757db96d56Sopenharmony_ci{
53767db96d56Sopenharmony_ci    return PyMapping_Keys(obj);
53777db96d56Sopenharmony_ci}
53787db96d56Sopenharmony_ci
53797db96d56Sopenharmony_cistatic PyObject *
53807db96d56Sopenharmony_ciget_mapping_values(PyObject* self, PyObject *obj)
53817db96d56Sopenharmony_ci{
53827db96d56Sopenharmony_ci    return PyMapping_Values(obj);
53837db96d56Sopenharmony_ci}
53847db96d56Sopenharmony_ci
53857db96d56Sopenharmony_cistatic PyObject *
53867db96d56Sopenharmony_ciget_mapping_items(PyObject* self, PyObject *obj)
53877db96d56Sopenharmony_ci{
53887db96d56Sopenharmony_ci    return PyMapping_Items(obj);
53897db96d56Sopenharmony_ci}
53907db96d56Sopenharmony_ci
53917db96d56Sopenharmony_cistatic PyObject *
53927db96d56Sopenharmony_citest_mapping_has_key_string(PyObject *self, PyObject *Py_UNUSED(args))
53937db96d56Sopenharmony_ci{
53947db96d56Sopenharmony_ci    PyObject *context = PyDict_New();
53957db96d56Sopenharmony_ci    PyObject *val = PyLong_FromLong(1);
53967db96d56Sopenharmony_ci
53977db96d56Sopenharmony_ci    // Since this uses `const char*` it is easier to test this in C:
53987db96d56Sopenharmony_ci    PyDict_SetItemString(context, "a", val);
53997db96d56Sopenharmony_ci    if (!PyMapping_HasKeyString(context, "a")) {
54007db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError,
54017db96d56Sopenharmony_ci                        "Existing mapping key does not exist");
54027db96d56Sopenharmony_ci        return NULL;
54037db96d56Sopenharmony_ci    }
54047db96d56Sopenharmony_ci    if (PyMapping_HasKeyString(context, "b")) {
54057db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError,
54067db96d56Sopenharmony_ci                        "Missing mapping key exists");
54077db96d56Sopenharmony_ci        return NULL;
54087db96d56Sopenharmony_ci    }
54097db96d56Sopenharmony_ci
54107db96d56Sopenharmony_ci    Py_DECREF(val);
54117db96d56Sopenharmony_ci    Py_DECREF(context);
54127db96d56Sopenharmony_ci    Py_RETURN_NONE;
54137db96d56Sopenharmony_ci}
54147db96d56Sopenharmony_ci
54157db96d56Sopenharmony_cistatic PyObject *
54167db96d56Sopenharmony_cimapping_has_key(PyObject* self, PyObject *args)
54177db96d56Sopenharmony_ci{
54187db96d56Sopenharmony_ci    PyObject *context, *key;
54197db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OO", &context, &key)) {
54207db96d56Sopenharmony_ci        return NULL;
54217db96d56Sopenharmony_ci    }
54227db96d56Sopenharmony_ci    return PyLong_FromLong(PyMapping_HasKey(context, key));
54237db96d56Sopenharmony_ci}
54247db96d56Sopenharmony_ci
54257db96d56Sopenharmony_cistatic PyObject *
54267db96d56Sopenharmony_cisequence_set_slice(PyObject* self, PyObject *args)
54277db96d56Sopenharmony_ci{
54287db96d56Sopenharmony_ci    PyObject *sequence, *obj;
54297db96d56Sopenharmony_ci    Py_ssize_t i1, i2;
54307db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OnnO", &sequence, &i1, &i2, &obj)) {
54317db96d56Sopenharmony_ci        return NULL;
54327db96d56Sopenharmony_ci    }
54337db96d56Sopenharmony_ci
54347db96d56Sopenharmony_ci    int res = PySequence_SetSlice(sequence, i1, i2, obj);
54357db96d56Sopenharmony_ci    if (res == -1) {
54367db96d56Sopenharmony_ci        return NULL;
54377db96d56Sopenharmony_ci    }
54387db96d56Sopenharmony_ci    Py_RETURN_NONE;
54397db96d56Sopenharmony_ci}
54407db96d56Sopenharmony_ci
54417db96d56Sopenharmony_cistatic PyObject *
54427db96d56Sopenharmony_cisequence_del_slice(PyObject* self, PyObject *args)
54437db96d56Sopenharmony_ci{
54447db96d56Sopenharmony_ci    PyObject *sequence;
54457db96d56Sopenharmony_ci    Py_ssize_t i1, i2;
54467db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Onn", &sequence, &i1, &i2)) {
54477db96d56Sopenharmony_ci        return NULL;
54487db96d56Sopenharmony_ci    }
54497db96d56Sopenharmony_ci
54507db96d56Sopenharmony_ci    int res = PySequence_DelSlice(sequence, i1, i2);
54517db96d56Sopenharmony_ci    if (res == -1) {
54527db96d56Sopenharmony_ci        return NULL;
54537db96d56Sopenharmony_ci    }
54547db96d56Sopenharmony_ci    Py_RETURN_NONE;
54557db96d56Sopenharmony_ci}
54567db96d56Sopenharmony_ci
54577db96d56Sopenharmony_cistatic PyObject *
54587db96d56Sopenharmony_citest_pythread_tss_key_state(PyObject *self, PyObject *args)
54597db96d56Sopenharmony_ci{
54607db96d56Sopenharmony_ci    Py_tss_t tss_key = Py_tss_NEEDS_INIT;
54617db96d56Sopenharmony_ci    if (PyThread_tss_is_created(&tss_key)) {
54627db96d56Sopenharmony_ci        return raiseTestError("test_pythread_tss_key_state",
54637db96d56Sopenharmony_ci                              "TSS key not in an uninitialized state at "
54647db96d56Sopenharmony_ci                              "creation time");
54657db96d56Sopenharmony_ci    }
54667db96d56Sopenharmony_ci    if (PyThread_tss_create(&tss_key) != 0) {
54677db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
54687db96d56Sopenharmony_ci        return NULL;
54697db96d56Sopenharmony_ci    }
54707db96d56Sopenharmony_ci    if (!PyThread_tss_is_created(&tss_key)) {
54717db96d56Sopenharmony_ci        return raiseTestError("test_pythread_tss_key_state",
54727db96d56Sopenharmony_ci                              "PyThread_tss_create succeeded, "
54737db96d56Sopenharmony_ci                              "but with TSS key in an uninitialized state");
54747db96d56Sopenharmony_ci    }
54757db96d56Sopenharmony_ci    if (PyThread_tss_create(&tss_key) != 0) {
54767db96d56Sopenharmony_ci        return raiseTestError("test_pythread_tss_key_state",
54777db96d56Sopenharmony_ci                              "PyThread_tss_create unsuccessful with "
54787db96d56Sopenharmony_ci                              "an already initialized key");
54797db96d56Sopenharmony_ci    }
54807db96d56Sopenharmony_ci#define CHECK_TSS_API(expr) \
54817db96d56Sopenharmony_ci        (void)(expr); \
54827db96d56Sopenharmony_ci        if (!PyThread_tss_is_created(&tss_key)) { \
54837db96d56Sopenharmony_ci            return raiseTestError("test_pythread_tss_key_state", \
54847db96d56Sopenharmony_ci                                  "TSS key initialization state was not " \
54857db96d56Sopenharmony_ci                                  "preserved after calling " #expr); }
54867db96d56Sopenharmony_ci    CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
54877db96d56Sopenharmony_ci    CHECK_TSS_API(PyThread_tss_get(&tss_key));
54887db96d56Sopenharmony_ci#undef CHECK_TSS_API
54897db96d56Sopenharmony_ci    PyThread_tss_delete(&tss_key);
54907db96d56Sopenharmony_ci    if (PyThread_tss_is_created(&tss_key)) {
54917db96d56Sopenharmony_ci        return raiseTestError("test_pythread_tss_key_state",
54927db96d56Sopenharmony_ci                              "PyThread_tss_delete called, but did not "
54937db96d56Sopenharmony_ci                              "set the key state to uninitialized");
54947db96d56Sopenharmony_ci    }
54957db96d56Sopenharmony_ci
54967db96d56Sopenharmony_ci    Py_tss_t *ptr_key = PyThread_tss_alloc();
54977db96d56Sopenharmony_ci    if (ptr_key == NULL) {
54987db96d56Sopenharmony_ci        PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
54997db96d56Sopenharmony_ci        return NULL;
55007db96d56Sopenharmony_ci    }
55017db96d56Sopenharmony_ci    if (PyThread_tss_is_created(ptr_key)) {
55027db96d56Sopenharmony_ci        return raiseTestError("test_pythread_tss_key_state",
55037db96d56Sopenharmony_ci                              "TSS key not in an uninitialized state at "
55047db96d56Sopenharmony_ci                              "allocation time");
55057db96d56Sopenharmony_ci    }
55067db96d56Sopenharmony_ci    PyThread_tss_free(ptr_key);
55077db96d56Sopenharmony_ci    ptr_key = NULL;
55087db96d56Sopenharmony_ci    Py_RETURN_NONE;
55097db96d56Sopenharmony_ci}
55107db96d56Sopenharmony_ci
55117db96d56Sopenharmony_ci
55127db96d56Sopenharmony_cistatic PyObject*
55137db96d56Sopenharmony_cinew_hamt(PyObject *self, PyObject *args)
55147db96d56Sopenharmony_ci{
55157db96d56Sopenharmony_ci    return _PyContext_NewHamtForTests();
55167db96d56Sopenharmony_ci}
55177db96d56Sopenharmony_ci
55187db96d56Sopenharmony_ci
55197db96d56Sopenharmony_ci/* def bad_get(self, obj, cls):
55207db96d56Sopenharmony_ci       cls()
55217db96d56Sopenharmony_ci       return repr(self)
55227db96d56Sopenharmony_ci*/
55237db96d56Sopenharmony_cistatic PyObject*
55247db96d56Sopenharmony_cibad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
55257db96d56Sopenharmony_ci{
55267db96d56Sopenharmony_ci    PyObject *self, *obj, *cls;
55277db96d56Sopenharmony_ci    if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
55287db96d56Sopenharmony_ci        return NULL;
55297db96d56Sopenharmony_ci    }
55307db96d56Sopenharmony_ci
55317db96d56Sopenharmony_ci    PyObject *res = PyObject_CallNoArgs(cls);
55327db96d56Sopenharmony_ci    if (res == NULL) {
55337db96d56Sopenharmony_ci        return NULL;
55347db96d56Sopenharmony_ci    }
55357db96d56Sopenharmony_ci    Py_DECREF(res);
55367db96d56Sopenharmony_ci
55377db96d56Sopenharmony_ci    return PyObject_Repr(self);
55387db96d56Sopenharmony_ci}
55397db96d56Sopenharmony_ci
55407db96d56Sopenharmony_ci
55417db96d56Sopenharmony_ci#ifdef Py_REF_DEBUG
55427db96d56Sopenharmony_cistatic PyObject *
55437db96d56Sopenharmony_cinegative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
55447db96d56Sopenharmony_ci{
55457db96d56Sopenharmony_ci    PyObject *obj = PyUnicode_FromString("negative_refcount");
55467db96d56Sopenharmony_ci    if (obj == NULL) {
55477db96d56Sopenharmony_ci        return NULL;
55487db96d56Sopenharmony_ci    }
55497db96d56Sopenharmony_ci    assert(Py_REFCNT(obj) == 1);
55507db96d56Sopenharmony_ci
55517db96d56Sopenharmony_ci    Py_SET_REFCNT(obj,  0);
55527db96d56Sopenharmony_ci    /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
55537db96d56Sopenharmony_ci    Py_DECREF(obj);
55547db96d56Sopenharmony_ci
55557db96d56Sopenharmony_ci    Py_RETURN_NONE;
55567db96d56Sopenharmony_ci}
55577db96d56Sopenharmony_ci#endif
55587db96d56Sopenharmony_ci
55597db96d56Sopenharmony_ci
55607db96d56Sopenharmony_cistatic PyObject*
55617db96d56Sopenharmony_citest_write_unraisable_exc(PyObject *self, PyObject *args)
55627db96d56Sopenharmony_ci{
55637db96d56Sopenharmony_ci    PyObject *exc, *err_msg, *obj;
55647db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
55657db96d56Sopenharmony_ci        return NULL;
55667db96d56Sopenharmony_ci    }
55677db96d56Sopenharmony_ci
55687db96d56Sopenharmony_ci    const char *err_msg_utf8;
55697db96d56Sopenharmony_ci    if (err_msg != Py_None) {
55707db96d56Sopenharmony_ci        err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
55717db96d56Sopenharmony_ci        if (err_msg_utf8 == NULL) {
55727db96d56Sopenharmony_ci            return NULL;
55737db96d56Sopenharmony_ci        }
55747db96d56Sopenharmony_ci    }
55757db96d56Sopenharmony_ci    else {
55767db96d56Sopenharmony_ci        err_msg_utf8 = NULL;
55777db96d56Sopenharmony_ci    }
55787db96d56Sopenharmony_ci
55797db96d56Sopenharmony_ci    PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
55807db96d56Sopenharmony_ci    _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
55817db96d56Sopenharmony_ci    Py_RETURN_NONE;
55827db96d56Sopenharmony_ci}
55837db96d56Sopenharmony_ci
55847db96d56Sopenharmony_ci
55857db96d56Sopenharmony_cistatic PyObject *
55867db96d56Sopenharmony_cisequence_getitem(PyObject *self, PyObject *args)
55877db96d56Sopenharmony_ci{
55887db96d56Sopenharmony_ci    PyObject *seq;
55897db96d56Sopenharmony_ci    Py_ssize_t i;
55907db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
55917db96d56Sopenharmony_ci        return NULL;
55927db96d56Sopenharmony_ci    }
55937db96d56Sopenharmony_ci    return PySequence_GetItem(seq, i);
55947db96d56Sopenharmony_ci}
55957db96d56Sopenharmony_ci
55967db96d56Sopenharmony_ci
55977db96d56Sopenharmony_cistatic PyObject *
55987db96d56Sopenharmony_cisequence_setitem(PyObject *self, PyObject *args)
55997db96d56Sopenharmony_ci{
56007db96d56Sopenharmony_ci    Py_ssize_t i;
56017db96d56Sopenharmony_ci    PyObject *seq, *val;
56027db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OnO", &seq, &i, &val)) {
56037db96d56Sopenharmony_ci        return NULL;
56047db96d56Sopenharmony_ci    }
56057db96d56Sopenharmony_ci    if (PySequence_SetItem(seq, i, val)) {
56067db96d56Sopenharmony_ci        return NULL;
56077db96d56Sopenharmony_ci    }
56087db96d56Sopenharmony_ci    Py_RETURN_NONE;
56097db96d56Sopenharmony_ci}
56107db96d56Sopenharmony_ci
56117db96d56Sopenharmony_ci
56127db96d56Sopenharmony_ci/* Functions for testing C calling conventions (METH_*) are named meth_*,
56137db96d56Sopenharmony_ci * e.g. "meth_varargs" for METH_VARARGS.
56147db96d56Sopenharmony_ci *
56157db96d56Sopenharmony_ci * They all return a tuple of their C-level arguments, with None instead
56167db96d56Sopenharmony_ci * of NULL and Python tuples instead of C arrays.
56177db96d56Sopenharmony_ci */
56187db96d56Sopenharmony_ci
56197db96d56Sopenharmony_ci
56207db96d56Sopenharmony_cistatic PyObject*
56217db96d56Sopenharmony_ci_null_to_none(PyObject* obj)
56227db96d56Sopenharmony_ci{
56237db96d56Sopenharmony_ci    if (obj == NULL) {
56247db96d56Sopenharmony_ci        Py_RETURN_NONE;
56257db96d56Sopenharmony_ci    }
56267db96d56Sopenharmony_ci    Py_INCREF(obj);
56277db96d56Sopenharmony_ci    return obj;
56287db96d56Sopenharmony_ci}
56297db96d56Sopenharmony_ci
56307db96d56Sopenharmony_cistatic PyObject*
56317db96d56Sopenharmony_cimeth_varargs(PyObject* self, PyObject* args)
56327db96d56Sopenharmony_ci{
56337db96d56Sopenharmony_ci    return Py_BuildValue("NO", _null_to_none(self), args);
56347db96d56Sopenharmony_ci}
56357db96d56Sopenharmony_ci
56367db96d56Sopenharmony_cistatic PyObject*
56377db96d56Sopenharmony_cimeth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs)
56387db96d56Sopenharmony_ci{
56397db96d56Sopenharmony_ci    return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs));
56407db96d56Sopenharmony_ci}
56417db96d56Sopenharmony_ci
56427db96d56Sopenharmony_cistatic PyObject*
56437db96d56Sopenharmony_cimeth_o(PyObject* self, PyObject* obj)
56447db96d56Sopenharmony_ci{
56457db96d56Sopenharmony_ci    return Py_BuildValue("NO", _null_to_none(self), obj);
56467db96d56Sopenharmony_ci}
56477db96d56Sopenharmony_ci
56487db96d56Sopenharmony_cistatic PyObject*
56497db96d56Sopenharmony_cimeth_noargs(PyObject* self, PyObject* ignored)
56507db96d56Sopenharmony_ci{
56517db96d56Sopenharmony_ci    return _null_to_none(self);
56527db96d56Sopenharmony_ci}
56537db96d56Sopenharmony_ci
56547db96d56Sopenharmony_cistatic PyObject*
56557db96d56Sopenharmony_ci_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs)
56567db96d56Sopenharmony_ci{
56577db96d56Sopenharmony_ci    PyObject *tuple = PyTuple_New(nargs);
56587db96d56Sopenharmony_ci    if (tuple == NULL) {
56597db96d56Sopenharmony_ci        return NULL;
56607db96d56Sopenharmony_ci    }
56617db96d56Sopenharmony_ci    for (Py_ssize_t i=0; i < nargs; i++) {
56627db96d56Sopenharmony_ci        Py_INCREF(args[i]);
56637db96d56Sopenharmony_ci        PyTuple_SET_ITEM(tuple, i, args[i]);
56647db96d56Sopenharmony_ci    }
56657db96d56Sopenharmony_ci    return tuple;
56667db96d56Sopenharmony_ci}
56677db96d56Sopenharmony_ci
56687db96d56Sopenharmony_cistatic PyObject*
56697db96d56Sopenharmony_cimeth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
56707db96d56Sopenharmony_ci{
56717db96d56Sopenharmony_ci    return Py_BuildValue(
56727db96d56Sopenharmony_ci        "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs)
56737db96d56Sopenharmony_ci    );
56747db96d56Sopenharmony_ci}
56757db96d56Sopenharmony_ci
56767db96d56Sopenharmony_cistatic PyObject*
56777db96d56Sopenharmony_cimeth_fastcall_keywords(PyObject* self, PyObject* const* args,
56787db96d56Sopenharmony_ci                       Py_ssize_t nargs, PyObject* kwargs)
56797db96d56Sopenharmony_ci{
56807db96d56Sopenharmony_ci    PyObject *pyargs = _fastcall_to_tuple(args, nargs);
56817db96d56Sopenharmony_ci    if (pyargs == NULL) {
56827db96d56Sopenharmony_ci        return NULL;
56837db96d56Sopenharmony_ci    }
56847db96d56Sopenharmony_ci    assert(args != NULL || nargs == 0);
56857db96d56Sopenharmony_ci    PyObject* const* args_offset = args == NULL ? NULL : args + nargs;
56867db96d56Sopenharmony_ci    PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type,
56877db96d56Sopenharmony_ci                                              args_offset, 0, kwargs);
56887db96d56Sopenharmony_ci    return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
56897db96d56Sopenharmony_ci}
56907db96d56Sopenharmony_ci
56917db96d56Sopenharmony_ci
56927db96d56Sopenharmony_cistatic PyObject*
56937db96d56Sopenharmony_cipynumber_tobase(PyObject *module, PyObject *args)
56947db96d56Sopenharmony_ci{
56957db96d56Sopenharmony_ci    PyObject *obj;
56967db96d56Sopenharmony_ci    int base;
56977db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "Oi:pynumber_tobase",
56987db96d56Sopenharmony_ci                          &obj, &base)) {
56997db96d56Sopenharmony_ci        return NULL;
57007db96d56Sopenharmony_ci    }
57017db96d56Sopenharmony_ci    return PyNumber_ToBase(obj, base);
57027db96d56Sopenharmony_ci}
57037db96d56Sopenharmony_ci
57047db96d56Sopenharmony_ci
57057db96d56Sopenharmony_cistatic PyObject*
57067db96d56Sopenharmony_citest_set_type_size(PyObject *self, PyObject *Py_UNUSED(ignored))
57077db96d56Sopenharmony_ci{
57087db96d56Sopenharmony_ci    PyObject *obj = PyList_New(0);
57097db96d56Sopenharmony_ci    if (obj == NULL) {
57107db96d56Sopenharmony_ci        return NULL;
57117db96d56Sopenharmony_ci    }
57127db96d56Sopenharmony_ci
57137db96d56Sopenharmony_ci    // Ensure that following tests don't modify the object,
57147db96d56Sopenharmony_ci    // to ensure that Py_DECREF() will not crash.
57157db96d56Sopenharmony_ci    assert(Py_TYPE(obj) == &PyList_Type);
57167db96d56Sopenharmony_ci    assert(Py_SIZE(obj) == 0);
57177db96d56Sopenharmony_ci
57187db96d56Sopenharmony_ci    // bpo-39573: Test Py_SET_TYPE() and Py_SET_SIZE() functions.
57197db96d56Sopenharmony_ci    Py_SET_TYPE(obj, &PyList_Type);
57207db96d56Sopenharmony_ci    Py_SET_SIZE(obj, 0);
57217db96d56Sopenharmony_ci
57227db96d56Sopenharmony_ci    Py_DECREF(obj);
57237db96d56Sopenharmony_ci    Py_RETURN_NONE;
57247db96d56Sopenharmony_ci}
57257db96d56Sopenharmony_ci
57267db96d56Sopenharmony_ci
57277db96d56Sopenharmony_ci#define TEST_REFCOUNT() \
57287db96d56Sopenharmony_ci    do { \
57297db96d56Sopenharmony_ci        PyObject *obj = PyList_New(0); \
57307db96d56Sopenharmony_ci        if (obj == NULL) { \
57317db96d56Sopenharmony_ci            return NULL; \
57327db96d56Sopenharmony_ci        } \
57337db96d56Sopenharmony_ci        assert(Py_REFCNT(obj) == 1); \
57347db96d56Sopenharmony_ci        \
57357db96d56Sopenharmony_ci        /* test Py_NewRef() */ \
57367db96d56Sopenharmony_ci        PyObject *ref = Py_NewRef(obj); \
57377db96d56Sopenharmony_ci        assert(ref == obj); \
57387db96d56Sopenharmony_ci        assert(Py_REFCNT(obj) == 2); \
57397db96d56Sopenharmony_ci        Py_DECREF(ref); \
57407db96d56Sopenharmony_ci        \
57417db96d56Sopenharmony_ci        /* test Py_XNewRef() */ \
57427db96d56Sopenharmony_ci        PyObject *xref = Py_XNewRef(obj); \
57437db96d56Sopenharmony_ci        assert(xref == obj); \
57447db96d56Sopenharmony_ci        assert(Py_REFCNT(obj) == 2); \
57457db96d56Sopenharmony_ci        Py_DECREF(xref); \
57467db96d56Sopenharmony_ci        \
57477db96d56Sopenharmony_ci        assert(Py_XNewRef(NULL) == NULL); \
57487db96d56Sopenharmony_ci        \
57497db96d56Sopenharmony_ci        Py_DECREF(obj); \
57507db96d56Sopenharmony_ci        Py_RETURN_NONE; \
57517db96d56Sopenharmony_ci    } while (0) \
57527db96d56Sopenharmony_ci
57537db96d56Sopenharmony_ci
57547db96d56Sopenharmony_ci// Test Py_NewRef() and Py_XNewRef() macros
57557db96d56Sopenharmony_cistatic PyObject*
57567db96d56Sopenharmony_citest_refcount_macros(PyObject *self, PyObject *Py_UNUSED(ignored))
57577db96d56Sopenharmony_ci{
57587db96d56Sopenharmony_ci    TEST_REFCOUNT();
57597db96d56Sopenharmony_ci}
57607db96d56Sopenharmony_ci
57617db96d56Sopenharmony_ci#undef Py_NewRef
57627db96d56Sopenharmony_ci#undef Py_XNewRef
57637db96d56Sopenharmony_ci
57647db96d56Sopenharmony_ci// Test Py_NewRef() and Py_XNewRef() functions, after undefining macros.
57657db96d56Sopenharmony_cistatic PyObject*
57667db96d56Sopenharmony_citest_refcount_funcs(PyObject *self, PyObject *Py_UNUSED(ignored))
57677db96d56Sopenharmony_ci{
57687db96d56Sopenharmony_ci    TEST_REFCOUNT();
57697db96d56Sopenharmony_ci}
57707db96d56Sopenharmony_ci
57717db96d56Sopenharmony_ci
57727db96d56Sopenharmony_ci// Test Py_Is() function
57737db96d56Sopenharmony_ci#define TEST_PY_IS() \
57747db96d56Sopenharmony_ci    do { \
57757db96d56Sopenharmony_ci        PyObject *o_none = Py_None; \
57767db96d56Sopenharmony_ci        PyObject *o_true = Py_True; \
57777db96d56Sopenharmony_ci        PyObject *o_false = Py_False; \
57787db96d56Sopenharmony_ci        PyObject *obj = PyList_New(0); \
57797db96d56Sopenharmony_ci        if (obj == NULL) { \
57807db96d56Sopenharmony_ci            return NULL; \
57817db96d56Sopenharmony_ci        } \
57827db96d56Sopenharmony_ci        \
57837db96d56Sopenharmony_ci        /* test Py_Is() */ \
57847db96d56Sopenharmony_ci        assert(Py_Is(obj, obj)); \
57857db96d56Sopenharmony_ci        assert(!Py_Is(obj, o_none)); \
57867db96d56Sopenharmony_ci        \
57877db96d56Sopenharmony_ci        /* test Py_None */ \
57887db96d56Sopenharmony_ci        assert(Py_Is(o_none, o_none)); \
57897db96d56Sopenharmony_ci        assert(!Py_Is(obj, o_none)); \
57907db96d56Sopenharmony_ci        \
57917db96d56Sopenharmony_ci        /* test Py_True */ \
57927db96d56Sopenharmony_ci        assert(Py_Is(o_true, o_true)); \
57937db96d56Sopenharmony_ci        assert(!Py_Is(o_false, o_true)); \
57947db96d56Sopenharmony_ci        assert(!Py_Is(obj, o_true)); \
57957db96d56Sopenharmony_ci        \
57967db96d56Sopenharmony_ci        /* test Py_False */ \
57977db96d56Sopenharmony_ci        assert(Py_Is(o_false, o_false)); \
57987db96d56Sopenharmony_ci        assert(!Py_Is(o_true, o_false)); \
57997db96d56Sopenharmony_ci        assert(!Py_Is(obj, o_false)); \
58007db96d56Sopenharmony_ci        \
58017db96d56Sopenharmony_ci        Py_DECREF(obj); \
58027db96d56Sopenharmony_ci        Py_RETURN_NONE; \
58037db96d56Sopenharmony_ci    } while (0)
58047db96d56Sopenharmony_ci
58057db96d56Sopenharmony_ci// Test Py_Is() macro
58067db96d56Sopenharmony_cistatic PyObject*
58077db96d56Sopenharmony_citest_py_is_macros(PyObject *self, PyObject *Py_UNUSED(ignored))
58087db96d56Sopenharmony_ci{
58097db96d56Sopenharmony_ci    TEST_PY_IS();
58107db96d56Sopenharmony_ci}
58117db96d56Sopenharmony_ci
58127db96d56Sopenharmony_ci#undef Py_Is
58137db96d56Sopenharmony_ci
58147db96d56Sopenharmony_ci// Test Py_Is() function, after undefining its macro.
58157db96d56Sopenharmony_cistatic PyObject*
58167db96d56Sopenharmony_citest_py_is_funcs(PyObject *self, PyObject *Py_UNUSED(ignored))
58177db96d56Sopenharmony_ci{
58187db96d56Sopenharmony_ci    TEST_PY_IS();
58197db96d56Sopenharmony_ci}
58207db96d56Sopenharmony_ci
58217db96d56Sopenharmony_ci
58227db96d56Sopenharmony_cistatic PyObject *
58237db96d56Sopenharmony_citest_fatal_error(PyObject *self, PyObject *args)
58247db96d56Sopenharmony_ci{
58257db96d56Sopenharmony_ci    char *message;
58267db96d56Sopenharmony_ci    int release_gil = 0;
58277db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "y|i:fatal_error", &message, &release_gil))
58287db96d56Sopenharmony_ci        return NULL;
58297db96d56Sopenharmony_ci    if (release_gil) {
58307db96d56Sopenharmony_ci        Py_BEGIN_ALLOW_THREADS
58317db96d56Sopenharmony_ci        Py_FatalError(message);
58327db96d56Sopenharmony_ci        Py_END_ALLOW_THREADS
58337db96d56Sopenharmony_ci    }
58347db96d56Sopenharmony_ci    else {
58357db96d56Sopenharmony_ci        Py_FatalError(message);
58367db96d56Sopenharmony_ci    }
58377db96d56Sopenharmony_ci    // Py_FatalError() does not return, but exits the process.
58387db96d56Sopenharmony_ci    Py_RETURN_NONE;
58397db96d56Sopenharmony_ci}
58407db96d56Sopenharmony_ci
58417db96d56Sopenharmony_ci// type->tp_version_tag
58427db96d56Sopenharmony_cistatic PyObject *
58437db96d56Sopenharmony_citype_get_version(PyObject *self, PyObject *type)
58447db96d56Sopenharmony_ci{
58457db96d56Sopenharmony_ci    if (!PyType_Check(type)) {
58467db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "argument must be a type");
58477db96d56Sopenharmony_ci        return NULL;
58487db96d56Sopenharmony_ci    }
58497db96d56Sopenharmony_ci    PyObject *res = PyLong_FromUnsignedLong(
58507db96d56Sopenharmony_ci        ((PyTypeObject *)type)->tp_version_tag);
58517db96d56Sopenharmony_ci    if (res == NULL) {
58527db96d56Sopenharmony_ci        assert(PyErr_Occurred());
58537db96d56Sopenharmony_ci        return NULL;
58547db96d56Sopenharmony_ci    }
58557db96d56Sopenharmony_ci    return res;
58567db96d56Sopenharmony_ci}
58577db96d56Sopenharmony_ci
58587db96d56Sopenharmony_ci
58597db96d56Sopenharmony_ci// Test PyThreadState C API
58607db96d56Sopenharmony_cistatic PyObject *
58617db96d56Sopenharmony_citest_tstate_capi(PyObject *self, PyObject *Py_UNUSED(args))
58627db96d56Sopenharmony_ci{
58637db96d56Sopenharmony_ci    // PyThreadState_Get()
58647db96d56Sopenharmony_ci    PyThreadState *tstate = PyThreadState_Get();
58657db96d56Sopenharmony_ci    assert(tstate != NULL);
58667db96d56Sopenharmony_ci
58677db96d56Sopenharmony_ci    // PyThreadState_GET()
58687db96d56Sopenharmony_ci    PyThreadState *tstate2 = PyThreadState_Get();
58697db96d56Sopenharmony_ci    assert(tstate2 == tstate);
58707db96d56Sopenharmony_ci
58717db96d56Sopenharmony_ci    // private _PyThreadState_UncheckedGet()
58727db96d56Sopenharmony_ci    PyThreadState *tstate3 = _PyThreadState_UncheckedGet();
58737db96d56Sopenharmony_ci    assert(tstate3 == tstate);
58747db96d56Sopenharmony_ci
58757db96d56Sopenharmony_ci    // PyThreadState_EnterTracing(), PyThreadState_LeaveTracing()
58767db96d56Sopenharmony_ci    PyThreadState_EnterTracing(tstate);
58777db96d56Sopenharmony_ci    PyThreadState_LeaveTracing(tstate);
58787db96d56Sopenharmony_ci
58797db96d56Sopenharmony_ci    // PyThreadState_GetDict(): no tstate argument
58807db96d56Sopenharmony_ci    PyObject *dict = PyThreadState_GetDict();
58817db96d56Sopenharmony_ci    // PyThreadState_GetDict() API can return NULL if PyDict_New() fails,
58827db96d56Sopenharmony_ci    // but it should not occur in practice.
58837db96d56Sopenharmony_ci    assert(dict != NULL);
58847db96d56Sopenharmony_ci    assert(PyDict_Check(dict));
58857db96d56Sopenharmony_ci    // dict is a borrowed reference
58867db96d56Sopenharmony_ci
58877db96d56Sopenharmony_ci    // private _PyThreadState_GetDict()
58887db96d56Sopenharmony_ci    PyObject *dict2 = _PyThreadState_GetDict(tstate);
58897db96d56Sopenharmony_ci    assert(dict2 == dict);
58907db96d56Sopenharmony_ci    // dict2 is a borrowed reference
58917db96d56Sopenharmony_ci
58927db96d56Sopenharmony_ci    // PyThreadState_GetInterpreter()
58937db96d56Sopenharmony_ci    PyInterpreterState *interp = PyThreadState_GetInterpreter(tstate);
58947db96d56Sopenharmony_ci    assert(interp != NULL);
58957db96d56Sopenharmony_ci
58967db96d56Sopenharmony_ci    // PyThreadState_GetFrame()
58977db96d56Sopenharmony_ci    PyFrameObject*frame = PyThreadState_GetFrame(tstate);
58987db96d56Sopenharmony_ci    assert(frame != NULL);
58997db96d56Sopenharmony_ci    assert(PyFrame_Check(frame));
59007db96d56Sopenharmony_ci    Py_DECREF(frame);
59017db96d56Sopenharmony_ci
59027db96d56Sopenharmony_ci    // PyThreadState_GetID()
59037db96d56Sopenharmony_ci    uint64_t id = PyThreadState_GetID(tstate);
59047db96d56Sopenharmony_ci    assert(id >= 1);
59057db96d56Sopenharmony_ci
59067db96d56Sopenharmony_ci    Py_RETURN_NONE;
59077db96d56Sopenharmony_ci}
59087db96d56Sopenharmony_ci
59097db96d56Sopenharmony_ci
59107db96d56Sopenharmony_ci// Test PyFloat_Pack2(), PyFloat_Pack4() and PyFloat_Pack8()
59117db96d56Sopenharmony_cistatic PyObject *
59127db96d56Sopenharmony_citest_float_pack(PyObject *self, PyObject *args)
59137db96d56Sopenharmony_ci{
59147db96d56Sopenharmony_ci    int size;
59157db96d56Sopenharmony_ci    double d;
59167db96d56Sopenharmony_ci    int le;
59177db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "idi", &size, &d, &le)) {
59187db96d56Sopenharmony_ci        return NULL;
59197db96d56Sopenharmony_ci    }
59207db96d56Sopenharmony_ci    switch (size)
59217db96d56Sopenharmony_ci    {
59227db96d56Sopenharmony_ci    case 2:
59237db96d56Sopenharmony_ci    {
59247db96d56Sopenharmony_ci        char data[2];
59257db96d56Sopenharmony_ci        if (PyFloat_Pack2(d, data, le) < 0) {
59267db96d56Sopenharmony_ci            return NULL;
59277db96d56Sopenharmony_ci        }
59287db96d56Sopenharmony_ci        return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
59297db96d56Sopenharmony_ci    }
59307db96d56Sopenharmony_ci    case 4:
59317db96d56Sopenharmony_ci    {
59327db96d56Sopenharmony_ci        char data[4];
59337db96d56Sopenharmony_ci        if (PyFloat_Pack4(d, data, le) < 0) {
59347db96d56Sopenharmony_ci            return NULL;
59357db96d56Sopenharmony_ci        }
59367db96d56Sopenharmony_ci        return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
59377db96d56Sopenharmony_ci    }
59387db96d56Sopenharmony_ci    case 8:
59397db96d56Sopenharmony_ci    {
59407db96d56Sopenharmony_ci        char data[8];
59417db96d56Sopenharmony_ci        if (PyFloat_Pack8(d, data, le) < 0) {
59427db96d56Sopenharmony_ci            return NULL;
59437db96d56Sopenharmony_ci        }
59447db96d56Sopenharmony_ci        return PyBytes_FromStringAndSize(data, Py_ARRAY_LENGTH(data));
59457db96d56Sopenharmony_ci    }
59467db96d56Sopenharmony_ci    default: break;
59477db96d56Sopenharmony_ci    }
59487db96d56Sopenharmony_ci
59497db96d56Sopenharmony_ci    PyErr_SetString(PyExc_ValueError, "size must 2, 4 or 8");
59507db96d56Sopenharmony_ci    return NULL;
59517db96d56Sopenharmony_ci}
59527db96d56Sopenharmony_ci
59537db96d56Sopenharmony_ci
59547db96d56Sopenharmony_ci// Test PyFloat_Unpack2(), PyFloat_Unpack4() and PyFloat_Unpack8()
59557db96d56Sopenharmony_cistatic PyObject *
59567db96d56Sopenharmony_citest_float_unpack(PyObject *self, PyObject *args)
59577db96d56Sopenharmony_ci{
59587db96d56Sopenharmony_ci    assert(!PyErr_Occurred());
59597db96d56Sopenharmony_ci    const char *data;
59607db96d56Sopenharmony_ci    Py_ssize_t size;
59617db96d56Sopenharmony_ci    int le;
59627db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "y#i", &data, &size, &le)) {
59637db96d56Sopenharmony_ci        return NULL;
59647db96d56Sopenharmony_ci    }
59657db96d56Sopenharmony_ci    double d;
59667db96d56Sopenharmony_ci    switch (size)
59677db96d56Sopenharmony_ci    {
59687db96d56Sopenharmony_ci    case 2:
59697db96d56Sopenharmony_ci        d = PyFloat_Unpack2(data, le);
59707db96d56Sopenharmony_ci        break;
59717db96d56Sopenharmony_ci    case 4:
59727db96d56Sopenharmony_ci        d = PyFloat_Unpack4(data, le);
59737db96d56Sopenharmony_ci        break;
59747db96d56Sopenharmony_ci    case 8:
59757db96d56Sopenharmony_ci        d = PyFloat_Unpack8(data, le);
59767db96d56Sopenharmony_ci        break;
59777db96d56Sopenharmony_ci    default:
59787db96d56Sopenharmony_ci        PyErr_SetString(PyExc_ValueError, "data length must 2, 4 or 8 bytes");
59797db96d56Sopenharmony_ci        return NULL;
59807db96d56Sopenharmony_ci    }
59817db96d56Sopenharmony_ci
59827db96d56Sopenharmony_ci    if (d == -1.0 && PyErr_Occurred()) {
59837db96d56Sopenharmony_ci        return NULL;
59847db96d56Sopenharmony_ci    }
59857db96d56Sopenharmony_ci    return PyFloat_FromDouble(d);
59867db96d56Sopenharmony_ci}
59877db96d56Sopenharmony_ci
59887db96d56Sopenharmony_cistatic PyObject *
59897db96d56Sopenharmony_ciframe_getlocals(PyObject *self, PyObject *frame)
59907db96d56Sopenharmony_ci{
59917db96d56Sopenharmony_ci    if (!PyFrame_Check(frame)) {
59927db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "argument must be a frame");
59937db96d56Sopenharmony_ci        return NULL;
59947db96d56Sopenharmony_ci    }
59957db96d56Sopenharmony_ci    return PyFrame_GetLocals((PyFrameObject *)frame);
59967db96d56Sopenharmony_ci}
59977db96d56Sopenharmony_ci
59987db96d56Sopenharmony_cistatic PyObject *
59997db96d56Sopenharmony_ciframe_getglobals(PyObject *self, PyObject *frame)
60007db96d56Sopenharmony_ci{
60017db96d56Sopenharmony_ci    if (!PyFrame_Check(frame)) {
60027db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "argument must be a frame");
60037db96d56Sopenharmony_ci        return NULL;
60047db96d56Sopenharmony_ci    }
60057db96d56Sopenharmony_ci    return PyFrame_GetGlobals((PyFrameObject *)frame);
60067db96d56Sopenharmony_ci}
60077db96d56Sopenharmony_ci
60087db96d56Sopenharmony_cistatic PyObject *
60097db96d56Sopenharmony_ciframe_getgenerator(PyObject *self, PyObject *frame)
60107db96d56Sopenharmony_ci{
60117db96d56Sopenharmony_ci    if (!PyFrame_Check(frame)) {
60127db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "argument must be a frame");
60137db96d56Sopenharmony_ci        return NULL;
60147db96d56Sopenharmony_ci    }
60157db96d56Sopenharmony_ci    return PyFrame_GetGenerator((PyFrameObject *)frame);
60167db96d56Sopenharmony_ci}
60177db96d56Sopenharmony_ci
60187db96d56Sopenharmony_cistatic PyObject *
60197db96d56Sopenharmony_ciframe_getbuiltins(PyObject *self, PyObject *frame)
60207db96d56Sopenharmony_ci{
60217db96d56Sopenharmony_ci    if (!PyFrame_Check(frame)) {
60227db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "argument must be a frame");
60237db96d56Sopenharmony_ci        return NULL;
60247db96d56Sopenharmony_ci    }
60257db96d56Sopenharmony_ci    return PyFrame_GetBuiltins((PyFrameObject *)frame);
60267db96d56Sopenharmony_ci}
60277db96d56Sopenharmony_ci
60287db96d56Sopenharmony_cistatic PyObject *
60297db96d56Sopenharmony_ciframe_getlasti(PyObject *self, PyObject *frame)
60307db96d56Sopenharmony_ci{
60317db96d56Sopenharmony_ci    if (!PyFrame_Check(frame)) {
60327db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "argument must be a frame");
60337db96d56Sopenharmony_ci        return NULL;
60347db96d56Sopenharmony_ci    }
60357db96d56Sopenharmony_ci    int lasti = PyFrame_GetLasti((PyFrameObject *)frame);
60367db96d56Sopenharmony_ci    if (lasti < 0) {
60377db96d56Sopenharmony_ci        assert(lasti == -1);
60387db96d56Sopenharmony_ci        Py_RETURN_NONE;
60397db96d56Sopenharmony_ci    }
60407db96d56Sopenharmony_ci    return PyLong_FromLong(lasti);
60417db96d56Sopenharmony_ci}
60427db96d56Sopenharmony_ci
60437db96d56Sopenharmony_cistatic PyObject *
60447db96d56Sopenharmony_ciframe_new(PyObject *self, PyObject *args)
60457db96d56Sopenharmony_ci{
60467db96d56Sopenharmony_ci    PyObject *code, *globals, *locals;
60477db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "OOO", &code, &globals, &locals)) {
60487db96d56Sopenharmony_ci        return NULL;
60497db96d56Sopenharmony_ci    }
60507db96d56Sopenharmony_ci    if (!PyCode_Check(code)) {
60517db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "argument must be a code object");
60527db96d56Sopenharmony_ci        return NULL;
60537db96d56Sopenharmony_ci    }
60547db96d56Sopenharmony_ci    PyThreadState *tstate = PyThreadState_Get();
60557db96d56Sopenharmony_ci
60567db96d56Sopenharmony_ci    return (PyObject *)PyFrame_New(tstate, (PyCodeObject *)code, globals, locals);
60577db96d56Sopenharmony_ci}
60587db96d56Sopenharmony_ci
60597db96d56Sopenharmony_cistatic PyObject *
60607db96d56Sopenharmony_cieval_get_func_name(PyObject *self, PyObject *func)
60617db96d56Sopenharmony_ci{
60627db96d56Sopenharmony_ci    return PyUnicode_FromString(PyEval_GetFuncName(func));
60637db96d56Sopenharmony_ci}
60647db96d56Sopenharmony_ci
60657db96d56Sopenharmony_cistatic PyObject *
60667db96d56Sopenharmony_cieval_get_func_desc(PyObject *self, PyObject *func)
60677db96d56Sopenharmony_ci{
60687db96d56Sopenharmony_ci    return PyUnicode_FromString(PyEval_GetFuncDesc(func));
60697db96d56Sopenharmony_ci}
60707db96d56Sopenharmony_ci
60717db96d56Sopenharmony_cistatic PyObject *
60727db96d56Sopenharmony_cieval_eval_code_ex(PyObject *mod, PyObject *pos_args)
60737db96d56Sopenharmony_ci{
60747db96d56Sopenharmony_ci    PyObject *result = NULL;
60757db96d56Sopenharmony_ci    PyObject *code;
60767db96d56Sopenharmony_ci    PyObject *globals;
60777db96d56Sopenharmony_ci    PyObject *locals = NULL;
60787db96d56Sopenharmony_ci    PyObject *args = NULL;
60797db96d56Sopenharmony_ci    PyObject *kwargs = NULL;
60807db96d56Sopenharmony_ci    PyObject *defaults = NULL;
60817db96d56Sopenharmony_ci    PyObject *kw_defaults = NULL;
60827db96d56Sopenharmony_ci    PyObject *closure = NULL;
60837db96d56Sopenharmony_ci
60847db96d56Sopenharmony_ci    PyObject **c_kwargs = NULL;
60857db96d56Sopenharmony_ci
60867db96d56Sopenharmony_ci    if (!PyArg_UnpackTuple(pos_args,
60877db96d56Sopenharmony_ci                           "eval_code_ex",
60887db96d56Sopenharmony_ci                           2,
60897db96d56Sopenharmony_ci                           8,
60907db96d56Sopenharmony_ci                           &code,
60917db96d56Sopenharmony_ci                           &globals,
60927db96d56Sopenharmony_ci                           &locals,
60937db96d56Sopenharmony_ci                           &args,
60947db96d56Sopenharmony_ci                           &kwargs,
60957db96d56Sopenharmony_ci                           &defaults,
60967db96d56Sopenharmony_ci                           &kw_defaults,
60977db96d56Sopenharmony_ci                           &closure))
60987db96d56Sopenharmony_ci    {
60997db96d56Sopenharmony_ci        goto exit;
61007db96d56Sopenharmony_ci    }
61017db96d56Sopenharmony_ci
61027db96d56Sopenharmony_ci    if (!PyCode_Check(code)) {
61037db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError,
61047db96d56Sopenharmony_ci                        "code must be a Python code object");
61057db96d56Sopenharmony_ci        goto exit;
61067db96d56Sopenharmony_ci    }
61077db96d56Sopenharmony_ci
61087db96d56Sopenharmony_ci    if (!PyDict_Check(globals)) {
61097db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "globals must be a dict");
61107db96d56Sopenharmony_ci        goto exit;
61117db96d56Sopenharmony_ci    }
61127db96d56Sopenharmony_ci
61137db96d56Sopenharmony_ci    if (locals && !PyMapping_Check(locals)) {
61147db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "locals must be a mapping");
61157db96d56Sopenharmony_ci        goto exit;
61167db96d56Sopenharmony_ci    }
61177db96d56Sopenharmony_ci    if (locals == Py_None) {
61187db96d56Sopenharmony_ci        locals = NULL;
61197db96d56Sopenharmony_ci    }
61207db96d56Sopenharmony_ci
61217db96d56Sopenharmony_ci    PyObject **c_args = NULL;
61227db96d56Sopenharmony_ci    Py_ssize_t c_args_len = 0;
61237db96d56Sopenharmony_ci
61247db96d56Sopenharmony_ci    if (args)
61257db96d56Sopenharmony_ci    {
61267db96d56Sopenharmony_ci        if (!PyTuple_Check(args)) {
61277db96d56Sopenharmony_ci            PyErr_SetString(PyExc_TypeError, "args must be a tuple");
61287db96d56Sopenharmony_ci            goto exit;
61297db96d56Sopenharmony_ci        } else {
61307db96d56Sopenharmony_ci            c_args = &PyTuple_GET_ITEM(args, 0);
61317db96d56Sopenharmony_ci            c_args_len = PyTuple_Size(args);
61327db96d56Sopenharmony_ci        }
61337db96d56Sopenharmony_ci    }
61347db96d56Sopenharmony_ci
61357db96d56Sopenharmony_ci    Py_ssize_t c_kwargs_len = 0;
61367db96d56Sopenharmony_ci
61377db96d56Sopenharmony_ci    if (kwargs)
61387db96d56Sopenharmony_ci    {
61397db96d56Sopenharmony_ci        if (!PyDict_Check(kwargs)) {
61407db96d56Sopenharmony_ci            PyErr_SetString(PyExc_TypeError, "keywords must be a dict");
61417db96d56Sopenharmony_ci            goto exit;
61427db96d56Sopenharmony_ci        } else {
61437db96d56Sopenharmony_ci            c_kwargs_len = PyDict_Size(kwargs);
61447db96d56Sopenharmony_ci            if (c_kwargs_len > 0) {
61457db96d56Sopenharmony_ci                c_kwargs = PyMem_NEW(PyObject*, 2 * c_kwargs_len);
61467db96d56Sopenharmony_ci                if (!c_kwargs) {
61477db96d56Sopenharmony_ci                    PyErr_NoMemory();
61487db96d56Sopenharmony_ci                    goto exit;
61497db96d56Sopenharmony_ci                }
61507db96d56Sopenharmony_ci
61517db96d56Sopenharmony_ci                Py_ssize_t i = 0;
61527db96d56Sopenharmony_ci                Py_ssize_t pos = 0;
61537db96d56Sopenharmony_ci
61547db96d56Sopenharmony_ci                while (PyDict_Next(kwargs,
61557db96d56Sopenharmony_ci                                   &pos,
61567db96d56Sopenharmony_ci                                   &c_kwargs[i],
61577db96d56Sopenharmony_ci                                   &c_kwargs[i + 1]))
61587db96d56Sopenharmony_ci                {
61597db96d56Sopenharmony_ci                    i += 2;
61607db96d56Sopenharmony_ci                }
61617db96d56Sopenharmony_ci                c_kwargs_len = i / 2;
61627db96d56Sopenharmony_ci                /* XXX This is broken if the caller deletes dict items! */
61637db96d56Sopenharmony_ci            }
61647db96d56Sopenharmony_ci        }
61657db96d56Sopenharmony_ci    }
61667db96d56Sopenharmony_ci
61677db96d56Sopenharmony_ci
61687db96d56Sopenharmony_ci    PyObject **c_defaults = NULL;
61697db96d56Sopenharmony_ci    Py_ssize_t c_defaults_len = 0;
61707db96d56Sopenharmony_ci
61717db96d56Sopenharmony_ci    if (defaults && PyTuple_Check(defaults)) {
61727db96d56Sopenharmony_ci        c_defaults = &PyTuple_GET_ITEM(defaults, 0);
61737db96d56Sopenharmony_ci        c_defaults_len = PyTuple_Size(defaults);
61747db96d56Sopenharmony_ci    }
61757db96d56Sopenharmony_ci
61767db96d56Sopenharmony_ci    if (kw_defaults && !PyDict_Check(kw_defaults)) {
61777db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "kw_defaults must be a dict");
61787db96d56Sopenharmony_ci        goto exit;
61797db96d56Sopenharmony_ci    }
61807db96d56Sopenharmony_ci
61817db96d56Sopenharmony_ci    if (closure && !PyTuple_Check(closure)) {
61827db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "closure must be a tuple of cells");
61837db96d56Sopenharmony_ci        goto exit;
61847db96d56Sopenharmony_ci    }
61857db96d56Sopenharmony_ci
61867db96d56Sopenharmony_ci
61877db96d56Sopenharmony_ci    result = PyEval_EvalCodeEx(
61887db96d56Sopenharmony_ci        code,
61897db96d56Sopenharmony_ci        globals,
61907db96d56Sopenharmony_ci        locals,
61917db96d56Sopenharmony_ci        c_args,
61927db96d56Sopenharmony_ci        (int)c_args_len,
61937db96d56Sopenharmony_ci        c_kwargs,
61947db96d56Sopenharmony_ci        (int)c_kwargs_len,
61957db96d56Sopenharmony_ci        c_defaults,
61967db96d56Sopenharmony_ci        (int)c_defaults_len,
61977db96d56Sopenharmony_ci        kw_defaults,
61987db96d56Sopenharmony_ci        closure
61997db96d56Sopenharmony_ci    );
62007db96d56Sopenharmony_ci
62017db96d56Sopenharmony_ciexit:
62027db96d56Sopenharmony_ci    if (c_kwargs) {
62037db96d56Sopenharmony_ci        PyMem_DEL(c_kwargs);
62047db96d56Sopenharmony_ci    }
62057db96d56Sopenharmony_ci
62067db96d56Sopenharmony_ci    return result;
62077db96d56Sopenharmony_ci}
62087db96d56Sopenharmony_ci
62097db96d56Sopenharmony_cistatic PyObject *
62107db96d56Sopenharmony_ciget_feature_macros(PyObject *self, PyObject *Py_UNUSED(args))
62117db96d56Sopenharmony_ci{
62127db96d56Sopenharmony_ci    PyObject *result = PyDict_New();
62137db96d56Sopenharmony_ci    if (!result) {
62147db96d56Sopenharmony_ci        return NULL;
62157db96d56Sopenharmony_ci    }
62167db96d56Sopenharmony_ci    int res;
62177db96d56Sopenharmony_ci#include "_testcapi_feature_macros.inc"
62187db96d56Sopenharmony_ci    return result;
62197db96d56Sopenharmony_ci}
62207db96d56Sopenharmony_ci
62217db96d56Sopenharmony_cistatic PyObject *
62227db96d56Sopenharmony_citest_code_api(PyObject *self, PyObject *Py_UNUSED(args))
62237db96d56Sopenharmony_ci{
62247db96d56Sopenharmony_ci    PyCodeObject *co = PyCode_NewEmpty("_testcapi", "dummy", 1);
62257db96d56Sopenharmony_ci    if (co == NULL) {
62267db96d56Sopenharmony_ci        return NULL;
62277db96d56Sopenharmony_ci    }
62287db96d56Sopenharmony_ci    /* co_code */
62297db96d56Sopenharmony_ci    {
62307db96d56Sopenharmony_ci        PyObject *co_code = PyCode_GetCode(co);
62317db96d56Sopenharmony_ci        if (co_code == NULL) {
62327db96d56Sopenharmony_ci            goto fail;
62337db96d56Sopenharmony_ci        }
62347db96d56Sopenharmony_ci        assert(PyBytes_CheckExact(co_code));
62357db96d56Sopenharmony_ci        if (PyObject_Length(co_code) == 0) {
62367db96d56Sopenharmony_ci            PyErr_SetString(PyExc_ValueError, "empty co_code");
62377db96d56Sopenharmony_ci            Py_DECREF(co_code);
62387db96d56Sopenharmony_ci            goto fail;
62397db96d56Sopenharmony_ci        }
62407db96d56Sopenharmony_ci        Py_DECREF(co_code);
62417db96d56Sopenharmony_ci    }
62427db96d56Sopenharmony_ci    /* co_varnames */
62437db96d56Sopenharmony_ci    {
62447db96d56Sopenharmony_ci        PyObject *co_varnames = PyCode_GetVarnames(co);
62457db96d56Sopenharmony_ci        if (co_varnames == NULL) {
62467db96d56Sopenharmony_ci            goto fail;
62477db96d56Sopenharmony_ci        }
62487db96d56Sopenharmony_ci        if (!PyTuple_CheckExact(co_varnames)) {
62497db96d56Sopenharmony_ci            PyErr_SetString(PyExc_TypeError, "co_varnames not tuple");
62507db96d56Sopenharmony_ci            Py_DECREF(co_varnames);
62517db96d56Sopenharmony_ci            goto fail;
62527db96d56Sopenharmony_ci        }
62537db96d56Sopenharmony_ci        if (PyTuple_GET_SIZE(co_varnames) != 0) {
62547db96d56Sopenharmony_ci            PyErr_SetString(PyExc_ValueError, "non-empty co_varnames");
62557db96d56Sopenharmony_ci            Py_DECREF(co_varnames);
62567db96d56Sopenharmony_ci            goto fail;
62577db96d56Sopenharmony_ci        }
62587db96d56Sopenharmony_ci        Py_DECREF(co_varnames);
62597db96d56Sopenharmony_ci    }
62607db96d56Sopenharmony_ci    /* co_cellvars */
62617db96d56Sopenharmony_ci    {
62627db96d56Sopenharmony_ci        PyObject *co_cellvars = PyCode_GetCellvars(co);
62637db96d56Sopenharmony_ci        if (co_cellvars == NULL) {
62647db96d56Sopenharmony_ci            goto fail;
62657db96d56Sopenharmony_ci        }
62667db96d56Sopenharmony_ci        if (!PyTuple_CheckExact(co_cellvars)) {
62677db96d56Sopenharmony_ci            PyErr_SetString(PyExc_TypeError, "co_cellvars not tuple");
62687db96d56Sopenharmony_ci            Py_DECREF(co_cellvars);
62697db96d56Sopenharmony_ci            goto fail;
62707db96d56Sopenharmony_ci        }
62717db96d56Sopenharmony_ci        if (PyTuple_GET_SIZE(co_cellvars) != 0) {
62727db96d56Sopenharmony_ci            PyErr_SetString(PyExc_ValueError, "non-empty co_cellvars");
62737db96d56Sopenharmony_ci            Py_DECREF(co_cellvars);
62747db96d56Sopenharmony_ci            goto fail;
62757db96d56Sopenharmony_ci        }
62767db96d56Sopenharmony_ci        Py_DECREF(co_cellvars);
62777db96d56Sopenharmony_ci    }
62787db96d56Sopenharmony_ci    /* co_freevars */
62797db96d56Sopenharmony_ci    {
62807db96d56Sopenharmony_ci        PyObject *co_freevars = PyCode_GetFreevars(co);
62817db96d56Sopenharmony_ci        if (co_freevars == NULL) {
62827db96d56Sopenharmony_ci            goto fail;
62837db96d56Sopenharmony_ci        }
62847db96d56Sopenharmony_ci        if (!PyTuple_CheckExact(co_freevars)) {
62857db96d56Sopenharmony_ci            PyErr_SetString(PyExc_TypeError, "co_freevars not tuple");
62867db96d56Sopenharmony_ci            Py_DECREF(co_freevars);
62877db96d56Sopenharmony_ci            goto fail;
62887db96d56Sopenharmony_ci        }
62897db96d56Sopenharmony_ci        if (PyTuple_GET_SIZE(co_freevars) != 0) {
62907db96d56Sopenharmony_ci            PyErr_SetString(PyExc_ValueError, "non-empty co_freevars");
62917db96d56Sopenharmony_ci            Py_DECREF(co_freevars);
62927db96d56Sopenharmony_ci            goto fail;
62937db96d56Sopenharmony_ci        }
62947db96d56Sopenharmony_ci        Py_DECREF(co_freevars);
62957db96d56Sopenharmony_ci    }
62967db96d56Sopenharmony_ci    Py_DECREF(co);
62977db96d56Sopenharmony_ci    Py_RETURN_NONE;
62987db96d56Sopenharmony_cifail:
62997db96d56Sopenharmony_ci    Py_DECREF(co);
63007db96d56Sopenharmony_ci    return NULL;
63017db96d56Sopenharmony_ci}
63027db96d56Sopenharmony_ci
63037db96d56Sopenharmony_cistatic int
63047db96d56Sopenharmony_cirecord_func(PyObject *obj, PyFrameObject *f, int what, PyObject *arg)
63057db96d56Sopenharmony_ci{
63067db96d56Sopenharmony_ci    assert(PyList_Check(obj));
63077db96d56Sopenharmony_ci    PyObject *what_obj = NULL;
63087db96d56Sopenharmony_ci    PyObject *line_obj = NULL;
63097db96d56Sopenharmony_ci    PyObject *tuple = NULL;
63107db96d56Sopenharmony_ci    int res = -1;
63117db96d56Sopenharmony_ci    what_obj = PyLong_FromLong(what);
63127db96d56Sopenharmony_ci    if (what_obj == NULL) {
63137db96d56Sopenharmony_ci        goto error;
63147db96d56Sopenharmony_ci    }
63157db96d56Sopenharmony_ci    int line = PyFrame_GetLineNumber(f);
63167db96d56Sopenharmony_ci    line_obj = PyLong_FromLong(line);
63177db96d56Sopenharmony_ci    if (line_obj == NULL) {
63187db96d56Sopenharmony_ci        goto error;
63197db96d56Sopenharmony_ci    }
63207db96d56Sopenharmony_ci    tuple = PyTuple_Pack(3, what_obj, line_obj, arg);
63217db96d56Sopenharmony_ci    if (tuple == NULL) {
63227db96d56Sopenharmony_ci        goto error;
63237db96d56Sopenharmony_ci    }
63247db96d56Sopenharmony_ci    PyTuple_SET_ITEM(tuple, 0, what_obj);
63257db96d56Sopenharmony_ci    if (PyList_Append(obj, tuple)) {
63267db96d56Sopenharmony_ci        goto error;
63277db96d56Sopenharmony_ci    }
63287db96d56Sopenharmony_ci    res = 0;
63297db96d56Sopenharmony_cierror:
63307db96d56Sopenharmony_ci    Py_XDECREF(what_obj);
63317db96d56Sopenharmony_ci    Py_XDECREF(line_obj);
63327db96d56Sopenharmony_ci    Py_XDECREF(tuple);
63337db96d56Sopenharmony_ci    return res;
63347db96d56Sopenharmony_ci}
63357db96d56Sopenharmony_ci
63367db96d56Sopenharmony_cistatic PyObject *
63377db96d56Sopenharmony_cisettrace_to_record(PyObject *self, PyObject *list)
63387db96d56Sopenharmony_ci{
63397db96d56Sopenharmony_ci
63407db96d56Sopenharmony_ci   if (!PyList_Check(list)) {
63417db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "argument must be a list");
63427db96d56Sopenharmony_ci        return NULL;
63437db96d56Sopenharmony_ci    }
63447db96d56Sopenharmony_ci    PyEval_SetTrace(record_func, list);
63457db96d56Sopenharmony_ci    Py_RETURN_NONE;
63467db96d56Sopenharmony_ci}
63477db96d56Sopenharmony_ci
63487db96d56Sopenharmony_cistatic int
63497db96d56Sopenharmony_cierror_func(PyObject *obj, PyFrameObject *f, int what, PyObject *arg)
63507db96d56Sopenharmony_ci{
63517db96d56Sopenharmony_ci    assert(PyList_Check(obj));
63527db96d56Sopenharmony_ci    /* Only raise if list is empty, otherwise append None
63537db96d56Sopenharmony_ci     * This ensures that we only raise once */
63547db96d56Sopenharmony_ci    if (PyList_GET_SIZE(obj)) {
63557db96d56Sopenharmony_ci        return 0;
63567db96d56Sopenharmony_ci    }
63577db96d56Sopenharmony_ci    if (PyList_Append(obj, Py_None)) {
63587db96d56Sopenharmony_ci       return -1;
63597db96d56Sopenharmony_ci    }
63607db96d56Sopenharmony_ci    PyErr_SetString(PyExc_Exception, "an exception");
63617db96d56Sopenharmony_ci    return -1;
63627db96d56Sopenharmony_ci}
63637db96d56Sopenharmony_ci
63647db96d56Sopenharmony_cistatic PyObject *
63657db96d56Sopenharmony_cisettrace_to_error(PyObject *self, PyObject *list)
63667db96d56Sopenharmony_ci{
63677db96d56Sopenharmony_ci    if (!PyList_Check(list)) {
63687db96d56Sopenharmony_ci        PyErr_SetString(PyExc_TypeError, "argument must be a list");
63697db96d56Sopenharmony_ci        return NULL;
63707db96d56Sopenharmony_ci    }
63717db96d56Sopenharmony_ci    PyEval_SetTrace(error_func, list);
63727db96d56Sopenharmony_ci    Py_RETURN_NONE;
63737db96d56Sopenharmony_ci}
63747db96d56Sopenharmony_ci
63757db96d56Sopenharmony_cistatic PyObject *negative_dictoffset(PyObject *, PyObject *);
63767db96d56Sopenharmony_ci
63777db96d56Sopenharmony_cistatic PyObject *
63787db96d56Sopenharmony_cifunction_get_code(PyObject *self, PyObject *func)
63797db96d56Sopenharmony_ci{
63807db96d56Sopenharmony_ci    PyObject *code = PyFunction_GetCode(func);
63817db96d56Sopenharmony_ci    if (code != NULL) {
63827db96d56Sopenharmony_ci        Py_INCREF(code);
63837db96d56Sopenharmony_ci        return code;
63847db96d56Sopenharmony_ci    } else {
63857db96d56Sopenharmony_ci        return NULL;
63867db96d56Sopenharmony_ci    }
63877db96d56Sopenharmony_ci}
63887db96d56Sopenharmony_ci
63897db96d56Sopenharmony_cistatic PyObject *
63907db96d56Sopenharmony_cifunction_get_globals(PyObject *self, PyObject *func)
63917db96d56Sopenharmony_ci{
63927db96d56Sopenharmony_ci    PyObject *globals = PyFunction_GetGlobals(func);
63937db96d56Sopenharmony_ci    if (globals != NULL) {
63947db96d56Sopenharmony_ci        Py_INCREF(globals);
63957db96d56Sopenharmony_ci        return globals;
63967db96d56Sopenharmony_ci    } else {
63977db96d56Sopenharmony_ci        return NULL;
63987db96d56Sopenharmony_ci    }
63997db96d56Sopenharmony_ci}
64007db96d56Sopenharmony_ci
64017db96d56Sopenharmony_cistatic PyObject *
64027db96d56Sopenharmony_cifunction_get_module(PyObject *self, PyObject *func)
64037db96d56Sopenharmony_ci{
64047db96d56Sopenharmony_ci    PyObject *module = PyFunction_GetModule(func);
64057db96d56Sopenharmony_ci    if (module != NULL) {
64067db96d56Sopenharmony_ci        Py_INCREF(module);
64077db96d56Sopenharmony_ci        return module;
64087db96d56Sopenharmony_ci    } else {
64097db96d56Sopenharmony_ci        return NULL;
64107db96d56Sopenharmony_ci    }
64117db96d56Sopenharmony_ci}
64127db96d56Sopenharmony_ci
64137db96d56Sopenharmony_cistatic PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
64147db96d56Sopenharmony_cistatic PyObject *getargs_s_hash_int(PyObject *, PyObject *, PyObject*);
64157db96d56Sopenharmony_cistatic PyObject *getargs_s_hash_int2(PyObject *, PyObject *, PyObject*);
64167db96d56Sopenharmony_cistatic PyObject *gh_99240_clear_args(PyObject *, PyObject *);
64177db96d56Sopenharmony_ci
64187db96d56Sopenharmony_cistatic PyMethodDef TestMethods[] = {
64197db96d56Sopenharmony_ci    {"exc_set_object",          exc_set_object,                  METH_VARARGS},
64207db96d56Sopenharmony_ci    {"raise_exception",         raise_exception,                 METH_VARARGS},
64217db96d56Sopenharmony_ci    {"raise_memoryerror",       raise_memoryerror,               METH_NOARGS},
64227db96d56Sopenharmony_ci    {"set_errno",               set_errno,                       METH_VARARGS},
64237db96d56Sopenharmony_ci    {"test_config",             test_config,                     METH_NOARGS},
64247db96d56Sopenharmony_ci    {"test_sizeof_c_types",     test_sizeof_c_types,             METH_NOARGS},
64257db96d56Sopenharmony_ci    {"test_datetime_capi",      test_datetime_capi,              METH_NOARGS},
64267db96d56Sopenharmony_ci    {"datetime_check_date",     datetime_check_date,             METH_VARARGS},
64277db96d56Sopenharmony_ci    {"datetime_check_time",     datetime_check_time,             METH_VARARGS},
64287db96d56Sopenharmony_ci    {"datetime_check_datetime",     datetime_check_datetime,     METH_VARARGS},
64297db96d56Sopenharmony_ci    {"datetime_check_delta",     datetime_check_delta,           METH_VARARGS},
64307db96d56Sopenharmony_ci    {"datetime_check_tzinfo",     datetime_check_tzinfo,         METH_VARARGS},
64317db96d56Sopenharmony_ci    {"make_timezones_capi",     make_timezones_capi,             METH_NOARGS},
64327db96d56Sopenharmony_ci    {"get_timezones_offset_zero",   get_timezones_offset_zero,   METH_NOARGS},
64337db96d56Sopenharmony_ci    {"get_timezone_utc_capi",    get_timezone_utc_capi,          METH_VARARGS},
64347db96d56Sopenharmony_ci    {"get_date_fromdate",        get_date_fromdate,              METH_VARARGS},
64357db96d56Sopenharmony_ci    {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
64367db96d56Sopenharmony_ci    {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
64377db96d56Sopenharmony_ci    {"get_time_fromtime",        get_time_fromtime,              METH_VARARGS},
64387db96d56Sopenharmony_ci    {"get_time_fromtimeandfold", get_time_fromtimeandfold,       METH_VARARGS},
64397db96d56Sopenharmony_ci    {"get_delta_fromdsu",        get_delta_fromdsu,              METH_VARARGS},
64407db96d56Sopenharmony_ci    {"get_date_fromtimestamp",   get_date_fromtimestamp,         METH_VARARGS},
64417db96d56Sopenharmony_ci    {"get_datetime_fromtimestamp", get_datetime_fromtimestamp,   METH_VARARGS},
64427db96d56Sopenharmony_ci    {"PyDateTime_GET",             test_PyDateTime_GET,           METH_O},
64437db96d56Sopenharmony_ci    {"PyDateTime_DATE_GET",        test_PyDateTime_DATE_GET,      METH_O},
64447db96d56Sopenharmony_ci    {"PyDateTime_TIME_GET",        test_PyDateTime_TIME_GET,      METH_O},
64457db96d56Sopenharmony_ci    {"PyDateTime_DELTA_GET",       test_PyDateTime_DELTA_GET,     METH_O},
64467db96d56Sopenharmony_ci    {"test_gc_control",         test_gc_control,                 METH_NOARGS},
64477db96d56Sopenharmony_ci    {"test_list_api",           test_list_api,                   METH_NOARGS},
64487db96d56Sopenharmony_ci    {"test_dict_iteration",     test_dict_iteration,             METH_NOARGS},
64497db96d56Sopenharmony_ci    {"dict_getitem_knownhash",  dict_getitem_knownhash,          METH_VARARGS},
64507db96d56Sopenharmony_ci    {"test_lazy_hash_inheritance",      test_lazy_hash_inheritance,METH_NOARGS},
64517db96d56Sopenharmony_ci    {"test_long_api",           test_long_api,                   METH_NOARGS},
64527db96d56Sopenharmony_ci    {"test_xincref_doesnt_leak",test_xincref_doesnt_leak,        METH_NOARGS},
64537db96d56Sopenharmony_ci    {"test_incref_doesnt_leak", test_incref_doesnt_leak,         METH_NOARGS},
64547db96d56Sopenharmony_ci    {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak,        METH_NOARGS},
64557db96d56Sopenharmony_ci    {"test_decref_doesnt_leak", test_decref_doesnt_leak,         METH_NOARGS},
64567db96d56Sopenharmony_ci    {"test_structseq_newtype_doesnt_leak",
64577db96d56Sopenharmony_ci        test_structseq_newtype_doesnt_leak, METH_NOARGS},
64587db96d56Sopenharmony_ci    {"test_structseq_newtype_null_descr_doc",
64597db96d56Sopenharmony_ci        test_structseq_newtype_null_descr_doc, METH_NOARGS},
64607db96d56Sopenharmony_ci    {"test_incref_decref_API",  test_incref_decref_API,          METH_NOARGS},
64617db96d56Sopenharmony_ci    {"test_long_and_overflow",  test_long_and_overflow,          METH_NOARGS},
64627db96d56Sopenharmony_ci    {"test_long_as_double",     test_long_as_double,             METH_NOARGS},
64637db96d56Sopenharmony_ci    {"test_long_as_size_t",     test_long_as_size_t,             METH_NOARGS},
64647db96d56Sopenharmony_ci    {"test_long_as_unsigned_long_long_mask",
64657db96d56Sopenharmony_ci        test_long_as_unsigned_long_long_mask, METH_NOARGS},
64667db96d56Sopenharmony_ci    {"test_long_numbits",       test_long_numbits,               METH_NOARGS},
64677db96d56Sopenharmony_ci    {"test_k_code",             test_k_code,                     METH_NOARGS},
64687db96d56Sopenharmony_ci    {"test_empty_argparse",     test_empty_argparse,             METH_NOARGS},
64697db96d56Sopenharmony_ci    {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
64707db96d56Sopenharmony_ci    {"pyobject_repr_from_null", pyobject_repr_from_null, METH_NOARGS},
64717db96d56Sopenharmony_ci    {"pyobject_str_from_null",  pyobject_str_from_null, METH_NOARGS},
64727db96d56Sopenharmony_ci    {"pyobject_bytes_from_null", pyobject_bytes_from_null, METH_NOARGS},
64737db96d56Sopenharmony_ci    {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
64747db96d56Sopenharmony_ci    {"test_with_docstring",     test_with_docstring,             METH_NOARGS,
64757db96d56Sopenharmony_ci     PyDoc_STR("This is a pretty normal docstring.")},
64767db96d56Sopenharmony_ci    {"test_string_to_double",   test_string_to_double,           METH_NOARGS},
64777db96d56Sopenharmony_ci    {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
64787db96d56Sopenharmony_ci     METH_NOARGS},
64797db96d56Sopenharmony_ci    {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
64807db96d56Sopenharmony_ci    {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
64817db96d56Sopenharmony_ci#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
64827db96d56Sopenharmony_ci    {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
64837db96d56Sopenharmony_ci#endif
64847db96d56Sopenharmony_ci    {"getbuffer_with_null_view", getbuffer_with_null_view,       METH_O},
64857db96d56Sopenharmony_ci    {"PyBuffer_SizeFromFormat",  test_PyBuffer_SizeFromFormat,   METH_VARARGS},
64867db96d56Sopenharmony_ci    {"test_buildvalue_N",        test_buildvalue_N,              METH_NOARGS},
64877db96d56Sopenharmony_ci    {"negative_dictoffset",      negative_dictoffset,            METH_NOARGS},
64887db96d56Sopenharmony_ci    {"test_buildvalue_issue38913", test_buildvalue_issue38913,   METH_NOARGS},
64897db96d56Sopenharmony_ci    {"get_args",                  get_args,                      METH_VARARGS},
64907db96d56Sopenharmony_ci    {"test_get_statictype_slots", test_get_statictype_slots,     METH_NOARGS},
64917db96d56Sopenharmony_ci    {"test_get_type_name",        test_get_type_name,            METH_NOARGS},
64927db96d56Sopenharmony_ci    {"test_get_type_qualname",    test_get_type_qualname,        METH_NOARGS},
64937db96d56Sopenharmony_ci    {"test_type_from_ephemeral_spec", test_type_from_ephemeral_spec, METH_NOARGS},
64947db96d56Sopenharmony_ci    {"get_kwargs", _PyCFunction_CAST(get_kwargs),
64957db96d56Sopenharmony_ci      METH_VARARGS|METH_KEYWORDS},
64967db96d56Sopenharmony_ci    {"getargs_tuple",           getargs_tuple,                   METH_VARARGS},
64977db96d56Sopenharmony_ci    {"getargs_keywords", _PyCFunction_CAST(getargs_keywords),
64987db96d56Sopenharmony_ci      METH_VARARGS|METH_KEYWORDS},
64997db96d56Sopenharmony_ci    {"getargs_keyword_only", _PyCFunction_CAST(getargs_keyword_only),
65007db96d56Sopenharmony_ci      METH_VARARGS|METH_KEYWORDS},
65017db96d56Sopenharmony_ci    {"getargs_positional_only_and_keywords",
65027db96d56Sopenharmony_ci      _PyCFunction_CAST(getargs_positional_only_and_keywords),
65037db96d56Sopenharmony_ci      METH_VARARGS|METH_KEYWORDS},
65047db96d56Sopenharmony_ci    {"getargs_b",               getargs_b,                       METH_VARARGS},
65057db96d56Sopenharmony_ci    {"getargs_B",               getargs_B,                       METH_VARARGS},
65067db96d56Sopenharmony_ci    {"getargs_h",               getargs_h,                       METH_VARARGS},
65077db96d56Sopenharmony_ci    {"getargs_H",               getargs_H,                       METH_VARARGS},
65087db96d56Sopenharmony_ci    {"getargs_I",               getargs_I,                       METH_VARARGS},
65097db96d56Sopenharmony_ci    {"getargs_k",               getargs_k,                       METH_VARARGS},
65107db96d56Sopenharmony_ci    {"getargs_i",               getargs_i,                       METH_VARARGS},
65117db96d56Sopenharmony_ci    {"getargs_l",               getargs_l,                       METH_VARARGS},
65127db96d56Sopenharmony_ci    {"getargs_n",               getargs_n,                       METH_VARARGS},
65137db96d56Sopenharmony_ci    {"getargs_p",               getargs_p,                       METH_VARARGS},
65147db96d56Sopenharmony_ci    {"getargs_L",               getargs_L,                       METH_VARARGS},
65157db96d56Sopenharmony_ci    {"getargs_K",               getargs_K,                       METH_VARARGS},
65167db96d56Sopenharmony_ci    {"test_longlong_api",       test_longlong_api,               METH_NOARGS},
65177db96d56Sopenharmony_ci    {"test_long_long_and_overflow",test_long_long_and_overflow,  METH_NOARGS},
65187db96d56Sopenharmony_ci    {"test_L_code",             test_L_code,                     METH_NOARGS},
65197db96d56Sopenharmony_ci    {"getargs_f",               getargs_f,                       METH_VARARGS},
65207db96d56Sopenharmony_ci    {"getargs_d",               getargs_d,                       METH_VARARGS},
65217db96d56Sopenharmony_ci    {"getargs_D",               getargs_D,                       METH_VARARGS},
65227db96d56Sopenharmony_ci    {"getargs_S",               getargs_S,                       METH_VARARGS},
65237db96d56Sopenharmony_ci    {"getargs_Y",               getargs_Y,                       METH_VARARGS},
65247db96d56Sopenharmony_ci    {"getargs_U",               getargs_U,                       METH_VARARGS},
65257db96d56Sopenharmony_ci    {"getargs_c",               getargs_c,                       METH_VARARGS},
65267db96d56Sopenharmony_ci    {"getargs_C",               getargs_C,                       METH_VARARGS},
65277db96d56Sopenharmony_ci    {"getargs_s",               getargs_s,                       METH_VARARGS},
65287db96d56Sopenharmony_ci    {"getargs_s_star",          getargs_s_star,                  METH_VARARGS},
65297db96d56Sopenharmony_ci    {"getargs_s_hash",          getargs_s_hash,                  METH_VARARGS},
65307db96d56Sopenharmony_ci    {"getargs_s_hash_int",      _PyCFunction_CAST(getargs_s_hash_int),
65317db96d56Sopenharmony_ci      METH_VARARGS|METH_KEYWORDS},
65327db96d56Sopenharmony_ci    {"getargs_s_hash_int2",      _PyCFunction_CAST(getargs_s_hash_int2),
65337db96d56Sopenharmony_ci      METH_VARARGS|METH_KEYWORDS},
65347db96d56Sopenharmony_ci    {"gh_99240_clear_args",     gh_99240_clear_args,             METH_VARARGS},
65357db96d56Sopenharmony_ci    {"getargs_z",               getargs_z,                       METH_VARARGS},
65367db96d56Sopenharmony_ci    {"getargs_z_star",          getargs_z_star,                  METH_VARARGS},
65377db96d56Sopenharmony_ci    {"getargs_z_hash",          getargs_z_hash,                  METH_VARARGS},
65387db96d56Sopenharmony_ci    {"getargs_y",               getargs_y,                       METH_VARARGS},
65397db96d56Sopenharmony_ci    {"getargs_y_star",          getargs_y_star,                  METH_VARARGS},
65407db96d56Sopenharmony_ci    {"getargs_y_hash",          getargs_y_hash,                  METH_VARARGS},
65417db96d56Sopenharmony_ci    {"getargs_u",               getargs_u,                       METH_VARARGS},
65427db96d56Sopenharmony_ci    {"getargs_u_hash",          getargs_u_hash,                  METH_VARARGS},
65437db96d56Sopenharmony_ci    {"getargs_Z",               getargs_Z,                       METH_VARARGS},
65447db96d56Sopenharmony_ci    {"getargs_Z_hash",          getargs_Z_hash,                  METH_VARARGS},
65457db96d56Sopenharmony_ci    {"getargs_w_star",          getargs_w_star,                  METH_VARARGS},
65467db96d56Sopenharmony_ci    {"getargs_es",              getargs_es,                      METH_VARARGS},
65477db96d56Sopenharmony_ci    {"getargs_et",              getargs_et,                      METH_VARARGS},
65487db96d56Sopenharmony_ci    {"getargs_es_hash",         getargs_es_hash,                 METH_VARARGS},
65497db96d56Sopenharmony_ci    {"getargs_et_hash",         getargs_et_hash,                 METH_VARARGS},
65507db96d56Sopenharmony_ci    {"codec_incrementalencoder",
65517db96d56Sopenharmony_ci     (PyCFunction)codec_incrementalencoder,                      METH_VARARGS},
65527db96d56Sopenharmony_ci    {"codec_incrementaldecoder",
65537db96d56Sopenharmony_ci     (PyCFunction)codec_incrementaldecoder,                      METH_VARARGS},
65547db96d56Sopenharmony_ci    {"test_s_code",             test_s_code,                     METH_NOARGS},
65557db96d56Sopenharmony_ci#if USE_UNICODE_WCHAR_CACHE
65567db96d56Sopenharmony_ci    {"test_u_code",             test_u_code,                     METH_NOARGS},
65577db96d56Sopenharmony_ci    {"test_Z_code",             test_Z_code,                     METH_NOARGS},
65587db96d56Sopenharmony_ci#endif /* USE_UNICODE_WCHAR_CACHE */
65597db96d56Sopenharmony_ci    {"test_widechar",           test_widechar,                   METH_NOARGS},
65607db96d56Sopenharmony_ci    {"unicode_aswidechar",      unicode_aswidechar,              METH_VARARGS},
65617db96d56Sopenharmony_ci    {"unicode_aswidecharstring",unicode_aswidecharstring,        METH_VARARGS},
65627db96d56Sopenharmony_ci    {"unicode_asucs4",          unicode_asucs4,                  METH_VARARGS},
65637db96d56Sopenharmony_ci    {"unicode_asutf8",          unicode_asutf8,                  METH_VARARGS},
65647db96d56Sopenharmony_ci    {"unicode_asutf8andsize",   unicode_asutf8andsize,           METH_VARARGS},
65657db96d56Sopenharmony_ci    {"unicode_findchar",        unicode_findchar,                METH_VARARGS},
65667db96d56Sopenharmony_ci    {"unicode_copycharacters",  unicode_copycharacters,          METH_VARARGS},
65677db96d56Sopenharmony_ci#if USE_UNICODE_WCHAR_CACHE
65687db96d56Sopenharmony_ci    {"unicode_legacy_string",   unicode_legacy_string,           METH_VARARGS},
65697db96d56Sopenharmony_ci#endif /* USE_UNICODE_WCHAR_CACHE */
65707db96d56Sopenharmony_ci    {"_test_thread_state",      test_thread_state,               METH_VARARGS},
65717db96d56Sopenharmony_ci    {"_pending_threadfunc",     pending_threadfunc,              METH_VARARGS},
65727db96d56Sopenharmony_ci#ifdef HAVE_GETTIMEOFDAY
65737db96d56Sopenharmony_ci    {"profile_int",             profile_int,                     METH_NOARGS},
65747db96d56Sopenharmony_ci#endif
65757db96d56Sopenharmony_ci    {"traceback_print",         traceback_print,                 METH_VARARGS},
65767db96d56Sopenharmony_ci    {"exception_print",         exception_print,                 METH_VARARGS},
65777db96d56Sopenharmony_ci    {"set_exception",           test_set_exception,              METH_O},
65787db96d56Sopenharmony_ci    {"set_exc_info",            test_set_exc_info,               METH_VARARGS},
65797db96d56Sopenharmony_ci    {"argparsing",              argparsing,                      METH_VARARGS},
65807db96d56Sopenharmony_ci    {"code_newempty",           code_newempty,                   METH_VARARGS},
65817db96d56Sopenharmony_ci    {"eval_code_ex",            eval_eval_code_ex,               METH_VARARGS},
65827db96d56Sopenharmony_ci    {"make_exception_with_doc", _PyCFunction_CAST(make_exception_with_doc),
65837db96d56Sopenharmony_ci     METH_VARARGS | METH_KEYWORDS},
65847db96d56Sopenharmony_ci    {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
65857db96d56Sopenharmony_ci     METH_NOARGS},
65867db96d56Sopenharmony_ci    {"crash_no_current_thread", crash_no_current_thread,         METH_NOARGS},
65877db96d56Sopenharmony_ci    {"run_in_subinterp",        run_in_subinterp,                METH_VARARGS},
65887db96d56Sopenharmony_ci    {"pytime_object_to_time_t", test_pytime_object_to_time_t,  METH_VARARGS},
65897db96d56Sopenharmony_ci    {"pytime_object_to_timeval", test_pytime_object_to_timeval,  METH_VARARGS},
65907db96d56Sopenharmony_ci    {"pytime_object_to_timespec", test_pytime_object_to_timespec,  METH_VARARGS},
65917db96d56Sopenharmony_ci    {"with_tp_del",             with_tp_del,                     METH_VARARGS},
65927db96d56Sopenharmony_ci    {"create_cfunction",        create_cfunction,                METH_NOARGS},
65937db96d56Sopenharmony_ci    {"test_pymem_alloc0",       test_pymem_alloc0,               METH_NOARGS},
65947db96d56Sopenharmony_ci    {"test_pymem_setrawallocators",test_pymem_setrawallocators,  METH_NOARGS},
65957db96d56Sopenharmony_ci    {"test_pymem_setallocators",test_pymem_setallocators,        METH_NOARGS},
65967db96d56Sopenharmony_ci    {"test_pyobject_setallocators",test_pyobject_setallocators,  METH_NOARGS},
65977db96d56Sopenharmony_ci    {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
65987db96d56Sopenharmony_ci     PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
65997db96d56Sopenharmony_ci    {"remove_mem_hooks",        remove_mem_hooks,                METH_NOARGS,
66007db96d56Sopenharmony_ci     PyDoc_STR("Remove memory hooks.")},
66017db96d56Sopenharmony_ci    {"no_docstring",
66027db96d56Sopenharmony_ci        (PyCFunction)test_with_docstring, METH_NOARGS},
66037db96d56Sopenharmony_ci    {"docstring_empty",
66047db96d56Sopenharmony_ci        (PyCFunction)test_with_docstring, METH_NOARGS,
66057db96d56Sopenharmony_ci        docstring_empty},
66067db96d56Sopenharmony_ci    {"docstring_no_signature",
66077db96d56Sopenharmony_ci        (PyCFunction)test_with_docstring, METH_NOARGS,
66087db96d56Sopenharmony_ci        docstring_no_signature},
66097db96d56Sopenharmony_ci    {"docstring_with_invalid_signature",
66107db96d56Sopenharmony_ci        (PyCFunction)test_with_docstring, METH_NOARGS,
66117db96d56Sopenharmony_ci        docstring_with_invalid_signature},
66127db96d56Sopenharmony_ci    {"docstring_with_invalid_signature2",
66137db96d56Sopenharmony_ci        (PyCFunction)test_with_docstring, METH_NOARGS,
66147db96d56Sopenharmony_ci        docstring_with_invalid_signature2},
66157db96d56Sopenharmony_ci    {"docstring_with_signature",
66167db96d56Sopenharmony_ci        (PyCFunction)test_with_docstring, METH_NOARGS,
66177db96d56Sopenharmony_ci        docstring_with_signature},
66187db96d56Sopenharmony_ci    {"docstring_with_signature_but_no_doc",
66197db96d56Sopenharmony_ci        (PyCFunction)test_with_docstring, METH_NOARGS,
66207db96d56Sopenharmony_ci        docstring_with_signature_but_no_doc},
66217db96d56Sopenharmony_ci    {"docstring_with_signature_and_extra_newlines",
66227db96d56Sopenharmony_ci        (PyCFunction)test_with_docstring, METH_NOARGS,
66237db96d56Sopenharmony_ci        docstring_with_signature_and_extra_newlines},
66247db96d56Sopenharmony_ci    {"docstring_with_signature_with_defaults",
66257db96d56Sopenharmony_ci        (PyCFunction)test_with_docstring, METH_NOARGS,
66267db96d56Sopenharmony_ci        docstring_with_signature_with_defaults},
66277db96d56Sopenharmony_ci    {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_VARARGS,
66287db96d56Sopenharmony_ci     PyDoc_STR("set_error_class(error_class) -> None")},
66297db96d56Sopenharmony_ci    {"join_temporary_c_thread", join_temporary_c_thread, METH_NOARGS},
66307db96d56Sopenharmony_ci    {"pymarshal_write_long_to_file",
66317db96d56Sopenharmony_ci        pymarshal_write_long_to_file, METH_VARARGS},
66327db96d56Sopenharmony_ci    {"pymarshal_write_object_to_file",
66337db96d56Sopenharmony_ci        pymarshal_write_object_to_file, METH_VARARGS},
66347db96d56Sopenharmony_ci    {"pymarshal_read_short_from_file",
66357db96d56Sopenharmony_ci        pymarshal_read_short_from_file, METH_VARARGS},
66367db96d56Sopenharmony_ci    {"pymarshal_read_long_from_file",
66377db96d56Sopenharmony_ci        pymarshal_read_long_from_file, METH_VARARGS},
66387db96d56Sopenharmony_ci    {"pymarshal_read_last_object_from_file",
66397db96d56Sopenharmony_ci        pymarshal_read_last_object_from_file, METH_VARARGS},
66407db96d56Sopenharmony_ci    {"pymarshal_read_object_from_file",
66417db96d56Sopenharmony_ci        pymarshal_read_object_from_file, METH_VARARGS},
66427db96d56Sopenharmony_ci    {"return_null_without_error", return_null_without_error, METH_NOARGS},
66437db96d56Sopenharmony_ci    {"return_result_with_error", return_result_with_error, METH_NOARGS},
66447db96d56Sopenharmony_ci    {"getitem_with_error", getitem_with_error, METH_VARARGS},
66457db96d56Sopenharmony_ci    {"Py_CompileString",     pycompilestring, METH_O},
66467db96d56Sopenharmony_ci    {"PyTime_FromSeconds", test_pytime_fromseconds,  METH_VARARGS},
66477db96d56Sopenharmony_ci    {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject,  METH_VARARGS},
66487db96d56Sopenharmony_ci    {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
66497db96d56Sopenharmony_ci    {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
66507db96d56Sopenharmony_ci    {"PyTime_AsTimeval_clamp", test_PyTime_AsTimeval_clamp, METH_VARARGS},
66517db96d56Sopenharmony_ci#ifdef HAVE_CLOCK_GETTIME
66527db96d56Sopenharmony_ci    {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
66537db96d56Sopenharmony_ci    {"PyTime_AsTimespec_clamp", test_PyTime_AsTimespec_clamp, METH_VARARGS},
66547db96d56Sopenharmony_ci#endif
66557db96d56Sopenharmony_ci    {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
66567db96d56Sopenharmony_ci    {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
66577db96d56Sopenharmony_ci    {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
66587db96d56Sopenharmony_ci    {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
66597db96d56Sopenharmony_ci    {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
66607db96d56Sopenharmony_ci    {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
66617db96d56Sopenharmony_ci    {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
66627db96d56Sopenharmony_ci    {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
66637db96d56Sopenharmony_ci    {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
66647db96d56Sopenharmony_ci    {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
66657db96d56Sopenharmony_ci    {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
66667db96d56Sopenharmony_ci    {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
66677db96d56Sopenharmony_ci    {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
66687db96d56Sopenharmony_ci    {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
66697db96d56Sopenharmony_ci    {"dict_get_version", dict_get_version, METH_VARARGS},
66707db96d56Sopenharmony_ci    {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
66717db96d56Sopenharmony_ci    {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
66727db96d56Sopenharmony_ci    {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
66737db96d56Sopenharmony_ci    {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
66747db96d56Sopenharmony_ci    {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
66757db96d56Sopenharmony_ci    {"stack_pointer", stack_pointer, METH_NOARGS},
66767db96d56Sopenharmony_ci#ifdef W_STOPCODE
66777db96d56Sopenharmony_ci    {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
66787db96d56Sopenharmony_ci#endif
66797db96d56Sopenharmony_ci    {"get_mapping_keys", get_mapping_keys, METH_O},
66807db96d56Sopenharmony_ci    {"get_mapping_values", get_mapping_values, METH_O},
66817db96d56Sopenharmony_ci    {"get_mapping_items", get_mapping_items, METH_O},
66827db96d56Sopenharmony_ci    {"test_mapping_has_key_string", test_mapping_has_key_string, METH_NOARGS},
66837db96d56Sopenharmony_ci    {"mapping_has_key", mapping_has_key, METH_VARARGS},
66847db96d56Sopenharmony_ci    {"sequence_set_slice", sequence_set_slice, METH_VARARGS},
66857db96d56Sopenharmony_ci    {"sequence_del_slice", sequence_del_slice, METH_VARARGS},
66867db96d56Sopenharmony_ci    {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
66877db96d56Sopenharmony_ci    {"hamt", new_hamt, METH_NOARGS},
66887db96d56Sopenharmony_ci    {"bad_get", _PyCFunction_CAST(bad_get), METH_FASTCALL},
66897db96d56Sopenharmony_ci#ifdef Py_REF_DEBUG
66907db96d56Sopenharmony_ci    {"negative_refcount", negative_refcount, METH_NOARGS},
66917db96d56Sopenharmony_ci#endif
66927db96d56Sopenharmony_ci    {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
66937db96d56Sopenharmony_ci    {"sequence_getitem", sequence_getitem, METH_VARARGS},
66947db96d56Sopenharmony_ci    {"sequence_setitem", sequence_setitem, METH_VARARGS},
66957db96d56Sopenharmony_ci    {"meth_varargs", meth_varargs, METH_VARARGS},
66967db96d56Sopenharmony_ci    {"meth_varargs_keywords", _PyCFunction_CAST(meth_varargs_keywords), METH_VARARGS|METH_KEYWORDS},
66977db96d56Sopenharmony_ci    {"meth_o", meth_o, METH_O},
66987db96d56Sopenharmony_ci    {"meth_noargs", meth_noargs, METH_NOARGS},
66997db96d56Sopenharmony_ci    {"meth_fastcall", _PyCFunction_CAST(meth_fastcall), METH_FASTCALL},
67007db96d56Sopenharmony_ci    {"meth_fastcall_keywords", _PyCFunction_CAST(meth_fastcall_keywords), METH_FASTCALL|METH_KEYWORDS},
67017db96d56Sopenharmony_ci    {"pynumber_tobase", pynumber_tobase, METH_VARARGS},
67027db96d56Sopenharmony_ci    {"without_gc", without_gc, METH_O},
67037db96d56Sopenharmony_ci    {"test_set_type_size", test_set_type_size, METH_NOARGS},
67047db96d56Sopenharmony_ci    {"test_refcount_macros", test_refcount_macros, METH_NOARGS},
67057db96d56Sopenharmony_ci    {"test_refcount_funcs", test_refcount_funcs, METH_NOARGS},
67067db96d56Sopenharmony_ci    {"test_py_is_macros", test_py_is_macros, METH_NOARGS},
67077db96d56Sopenharmony_ci    {"test_py_is_funcs", test_py_is_funcs, METH_NOARGS},
67087db96d56Sopenharmony_ci    {"fatal_error", test_fatal_error, METH_VARARGS,
67097db96d56Sopenharmony_ci     PyDoc_STR("fatal_error(message, release_gil=False): call Py_FatalError(message)")},
67107db96d56Sopenharmony_ci    {"type_get_version", type_get_version, METH_O, PyDoc_STR("type->tp_version_tag")},
67117db96d56Sopenharmony_ci    {"test_tstate_capi", test_tstate_capi, METH_NOARGS, NULL},
67127db96d56Sopenharmony_ci    {"float_pack", test_float_pack, METH_VARARGS, NULL},
67137db96d56Sopenharmony_ci    {"float_unpack", test_float_unpack, METH_VARARGS, NULL},
67147db96d56Sopenharmony_ci    {"frame_getlocals", frame_getlocals, METH_O, NULL},
67157db96d56Sopenharmony_ci    {"frame_getglobals", frame_getglobals, METH_O, NULL},
67167db96d56Sopenharmony_ci    {"frame_getgenerator", frame_getgenerator, METH_O, NULL},
67177db96d56Sopenharmony_ci    {"frame_getbuiltins", frame_getbuiltins, METH_O, NULL},
67187db96d56Sopenharmony_ci    {"frame_getlasti", frame_getlasti, METH_O, NULL},
67197db96d56Sopenharmony_ci    {"frame_new", frame_new, METH_VARARGS, NULL},
67207db96d56Sopenharmony_ci    {"eval_get_func_name", eval_get_func_name, METH_O, NULL},
67217db96d56Sopenharmony_ci    {"eval_get_func_desc", eval_get_func_desc, METH_O, NULL},
67227db96d56Sopenharmony_ci    {"get_feature_macros", get_feature_macros, METH_NOARGS, NULL},
67237db96d56Sopenharmony_ci    {"test_code_api", test_code_api, METH_NOARGS, NULL},
67247db96d56Sopenharmony_ci    {"settrace_to_error", settrace_to_error, METH_O, NULL},
67257db96d56Sopenharmony_ci    {"settrace_to_record", settrace_to_record, METH_O, NULL},
67267db96d56Sopenharmony_ci    {"function_get_code", function_get_code, METH_O, NULL},
67277db96d56Sopenharmony_ci    {"function_get_globals", function_get_globals, METH_O, NULL},
67287db96d56Sopenharmony_ci    {"function_get_module", function_get_module, METH_O, NULL},
67297db96d56Sopenharmony_ci    {NULL, NULL} /* sentinel */
67307db96d56Sopenharmony_ci};
67317db96d56Sopenharmony_ci
67327db96d56Sopenharmony_citypedef struct {
67337db96d56Sopenharmony_ci    char bool_member;
67347db96d56Sopenharmony_ci    char byte_member;
67357db96d56Sopenharmony_ci    unsigned char ubyte_member;
67367db96d56Sopenharmony_ci    short short_member;
67377db96d56Sopenharmony_ci    unsigned short ushort_member;
67387db96d56Sopenharmony_ci    int int_member;
67397db96d56Sopenharmony_ci    unsigned int uint_member;
67407db96d56Sopenharmony_ci    long long_member;
67417db96d56Sopenharmony_ci    unsigned long ulong_member;
67427db96d56Sopenharmony_ci    Py_ssize_t pyssizet_member;
67437db96d56Sopenharmony_ci    float float_member;
67447db96d56Sopenharmony_ci    double double_member;
67457db96d56Sopenharmony_ci    char inplace_member[6];
67467db96d56Sopenharmony_ci    long long longlong_member;
67477db96d56Sopenharmony_ci    unsigned long long ulonglong_member;
67487db96d56Sopenharmony_ci} all_structmembers;
67497db96d56Sopenharmony_ci
67507db96d56Sopenharmony_citypedef struct {
67517db96d56Sopenharmony_ci    PyObject_HEAD
67527db96d56Sopenharmony_ci    all_structmembers structmembers;
67537db96d56Sopenharmony_ci} test_structmembers;
67547db96d56Sopenharmony_ci
67557db96d56Sopenharmony_cistatic struct PyMemberDef test_members[] = {
67567db96d56Sopenharmony_ci    {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
67577db96d56Sopenharmony_ci    {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
67587db96d56Sopenharmony_ci    {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
67597db96d56Sopenharmony_ci    {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
67607db96d56Sopenharmony_ci    {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
67617db96d56Sopenharmony_ci    {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
67627db96d56Sopenharmony_ci    {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
67637db96d56Sopenharmony_ci    {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
67647db96d56Sopenharmony_ci    {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
67657db96d56Sopenharmony_ci    {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
67667db96d56Sopenharmony_ci    {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
67677db96d56Sopenharmony_ci    {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
67687db96d56Sopenharmony_ci    {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
67697db96d56Sopenharmony_ci    {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
67707db96d56Sopenharmony_ci    {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
67717db96d56Sopenharmony_ci    {NULL}
67727db96d56Sopenharmony_ci};
67737db96d56Sopenharmony_ci
67747db96d56Sopenharmony_ci
67757db96d56Sopenharmony_cistatic PyObject *
67767db96d56Sopenharmony_citest_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
67777db96d56Sopenharmony_ci{
67787db96d56Sopenharmony_ci    static char *keywords[] = {
67797db96d56Sopenharmony_ci        "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
67807db96d56Sopenharmony_ci        "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
67817db96d56Sopenharmony_ci        "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
67827db96d56Sopenharmony_ci        "T_LONGLONG", "T_ULONGLONG",
67837db96d56Sopenharmony_ci        NULL};
67847db96d56Sopenharmony_ci    static const char fmt[] = "|bbBhHiIlknfds#LK";
67857db96d56Sopenharmony_ci    test_structmembers *ob;
67867db96d56Sopenharmony_ci    const char *s = NULL;
67877db96d56Sopenharmony_ci    Py_ssize_t string_len = 0;
67887db96d56Sopenharmony_ci    ob = PyObject_New(test_structmembers, type);
67897db96d56Sopenharmony_ci    if (ob == NULL)
67907db96d56Sopenharmony_ci        return NULL;
67917db96d56Sopenharmony_ci    memset(&ob->structmembers, 0, sizeof(all_structmembers));
67927db96d56Sopenharmony_ci    if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
67937db96d56Sopenharmony_ci                                     &ob->structmembers.bool_member,
67947db96d56Sopenharmony_ci                                     &ob->structmembers.byte_member,
67957db96d56Sopenharmony_ci                                     &ob->structmembers.ubyte_member,
67967db96d56Sopenharmony_ci                                     &ob->structmembers.short_member,
67977db96d56Sopenharmony_ci                                     &ob->structmembers.ushort_member,
67987db96d56Sopenharmony_ci                                     &ob->structmembers.int_member,
67997db96d56Sopenharmony_ci                                     &ob->structmembers.uint_member,
68007db96d56Sopenharmony_ci                                     &ob->structmembers.long_member,
68017db96d56Sopenharmony_ci                                     &ob->structmembers.ulong_member,
68027db96d56Sopenharmony_ci                                     &ob->structmembers.pyssizet_member,
68037db96d56Sopenharmony_ci                                     &ob->structmembers.float_member,
68047db96d56Sopenharmony_ci                                     &ob->structmembers.double_member,
68057db96d56Sopenharmony_ci                                     &s, &string_len
68067db96d56Sopenharmony_ci                                     , &ob->structmembers.longlong_member,
68077db96d56Sopenharmony_ci                                     &ob->structmembers.ulonglong_member
68087db96d56Sopenharmony_ci        )) {
68097db96d56Sopenharmony_ci        Py_DECREF(ob);
68107db96d56Sopenharmony_ci        return NULL;
68117db96d56Sopenharmony_ci    }
68127db96d56Sopenharmony_ci    if (s != NULL) {
68137db96d56Sopenharmony_ci        if (string_len > 5) {
68147db96d56Sopenharmony_ci            Py_DECREF(ob);
68157db96d56Sopenharmony_ci            PyErr_SetString(PyExc_ValueError, "string too long");
68167db96d56Sopenharmony_ci            return NULL;
68177db96d56Sopenharmony_ci        }
68187db96d56Sopenharmony_ci        strcpy(ob->structmembers.inplace_member, s);
68197db96d56Sopenharmony_ci    }
68207db96d56Sopenharmony_ci    else {
68217db96d56Sopenharmony_ci        strcpy(ob->structmembers.inplace_member, "");
68227db96d56Sopenharmony_ci    }
68237db96d56Sopenharmony_ci    return (PyObject *)ob;
68247db96d56Sopenharmony_ci}
68257db96d56Sopenharmony_ci
68267db96d56Sopenharmony_cistatic void
68277db96d56Sopenharmony_citest_structmembers_free(PyObject *ob)
68287db96d56Sopenharmony_ci{
68297db96d56Sopenharmony_ci    PyObject_Free(ob);
68307db96d56Sopenharmony_ci}
68317db96d56Sopenharmony_ci
68327db96d56Sopenharmony_cistatic PyTypeObject test_structmembersType = {
68337db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
68347db96d56Sopenharmony_ci    "test_structmembersType",
68357db96d56Sopenharmony_ci    sizeof(test_structmembers),         /* tp_basicsize */
68367db96d56Sopenharmony_ci    0,                                  /* tp_itemsize */
68377db96d56Sopenharmony_ci    test_structmembers_free,            /* destructor tp_dealloc */
68387db96d56Sopenharmony_ci    0,                                  /* tp_vectorcall_offset */
68397db96d56Sopenharmony_ci    0,                                  /* tp_getattr */
68407db96d56Sopenharmony_ci    0,                                  /* tp_setattr */
68417db96d56Sopenharmony_ci    0,                                  /* tp_as_async */
68427db96d56Sopenharmony_ci    0,                                  /* tp_repr */
68437db96d56Sopenharmony_ci    0,                                  /* tp_as_number */
68447db96d56Sopenharmony_ci    0,                                  /* tp_as_sequence */
68457db96d56Sopenharmony_ci    0,                                  /* tp_as_mapping */
68467db96d56Sopenharmony_ci    0,                                  /* tp_hash */
68477db96d56Sopenharmony_ci    0,                                  /* tp_call */
68487db96d56Sopenharmony_ci    0,                                  /* tp_str */
68497db96d56Sopenharmony_ci    PyObject_GenericGetAttr,            /* tp_getattro */
68507db96d56Sopenharmony_ci    PyObject_GenericSetAttr,            /* tp_setattro */
68517db96d56Sopenharmony_ci    0,                                  /* tp_as_buffer */
68527db96d56Sopenharmony_ci    0,                                  /* tp_flags */
68537db96d56Sopenharmony_ci    "Type containing all structmember types",
68547db96d56Sopenharmony_ci    0,                                  /* traverseproc tp_traverse */
68557db96d56Sopenharmony_ci    0,                                  /* tp_clear */
68567db96d56Sopenharmony_ci    0,                                  /* tp_richcompare */
68577db96d56Sopenharmony_ci    0,                                  /* tp_weaklistoffset */
68587db96d56Sopenharmony_ci    0,                                  /* tp_iter */
68597db96d56Sopenharmony_ci    0,                                  /* tp_iternext */
68607db96d56Sopenharmony_ci    0,                                  /* tp_methods */
68617db96d56Sopenharmony_ci    test_members,                       /* tp_members */
68627db96d56Sopenharmony_ci    0,
68637db96d56Sopenharmony_ci    0,
68647db96d56Sopenharmony_ci    0,
68657db96d56Sopenharmony_ci    0,
68667db96d56Sopenharmony_ci    0,
68677db96d56Sopenharmony_ci    0,
68687db96d56Sopenharmony_ci    0,
68697db96d56Sopenharmony_ci    0,
68707db96d56Sopenharmony_ci    test_structmembers_new,             /* tp_new */
68717db96d56Sopenharmony_ci};
68727db96d56Sopenharmony_ci
68737db96d56Sopenharmony_ci
68747db96d56Sopenharmony_citypedef struct {
68757db96d56Sopenharmony_ci    PyObject_HEAD
68767db96d56Sopenharmony_ci} matmulObject;
68777db96d56Sopenharmony_ci
68787db96d56Sopenharmony_cistatic PyObject *
68797db96d56Sopenharmony_cimatmulType_matmul(PyObject *self, PyObject *other)
68807db96d56Sopenharmony_ci{
68817db96d56Sopenharmony_ci    return Py_BuildValue("(sOO)", "matmul", self, other);
68827db96d56Sopenharmony_ci}
68837db96d56Sopenharmony_ci
68847db96d56Sopenharmony_cistatic PyObject *
68857db96d56Sopenharmony_cimatmulType_imatmul(PyObject *self, PyObject *other)
68867db96d56Sopenharmony_ci{
68877db96d56Sopenharmony_ci    return Py_BuildValue("(sOO)", "imatmul", self, other);
68887db96d56Sopenharmony_ci}
68897db96d56Sopenharmony_ci
68907db96d56Sopenharmony_cistatic void
68917db96d56Sopenharmony_cimatmulType_dealloc(PyObject *self)
68927db96d56Sopenharmony_ci{
68937db96d56Sopenharmony_ci    Py_TYPE(self)->tp_free(self);
68947db96d56Sopenharmony_ci}
68957db96d56Sopenharmony_ci
68967db96d56Sopenharmony_cistatic PyNumberMethods matmulType_as_number = {
68977db96d56Sopenharmony_ci    0,                          /* nb_add */
68987db96d56Sopenharmony_ci    0,                          /* nb_subtract */
68997db96d56Sopenharmony_ci    0,                          /* nb_multiply */
69007db96d56Sopenharmony_ci    0,                          /* nb_remainde r*/
69017db96d56Sopenharmony_ci    0,                          /* nb_divmod */
69027db96d56Sopenharmony_ci    0,                          /* nb_power */
69037db96d56Sopenharmony_ci    0,                          /* nb_negative */
69047db96d56Sopenharmony_ci    0,                          /* tp_positive */
69057db96d56Sopenharmony_ci    0,                          /* tp_absolute */
69067db96d56Sopenharmony_ci    0,                          /* tp_bool */
69077db96d56Sopenharmony_ci    0,                          /* nb_invert */
69087db96d56Sopenharmony_ci    0,                          /* nb_lshift */
69097db96d56Sopenharmony_ci    0,                          /* nb_rshift */
69107db96d56Sopenharmony_ci    0,                          /* nb_and */
69117db96d56Sopenharmony_ci    0,                          /* nb_xor */
69127db96d56Sopenharmony_ci    0,                          /* nb_or */
69137db96d56Sopenharmony_ci    0,                          /* nb_int */
69147db96d56Sopenharmony_ci    0,                          /* nb_reserved */
69157db96d56Sopenharmony_ci    0,                          /* nb_float */
69167db96d56Sopenharmony_ci    0,                          /* nb_inplace_add */
69177db96d56Sopenharmony_ci    0,                          /* nb_inplace_subtract */
69187db96d56Sopenharmony_ci    0,                          /* nb_inplace_multiply */
69197db96d56Sopenharmony_ci    0,                          /* nb_inplace_remainder */
69207db96d56Sopenharmony_ci    0,                          /* nb_inplace_power */
69217db96d56Sopenharmony_ci    0,                          /* nb_inplace_lshift */
69227db96d56Sopenharmony_ci    0,                          /* nb_inplace_rshift */
69237db96d56Sopenharmony_ci    0,                          /* nb_inplace_and */
69247db96d56Sopenharmony_ci    0,                          /* nb_inplace_xor */
69257db96d56Sopenharmony_ci    0,                          /* nb_inplace_or */
69267db96d56Sopenharmony_ci    0,                          /* nb_floor_divide */
69277db96d56Sopenharmony_ci    0,                          /* nb_true_divide */
69287db96d56Sopenharmony_ci    0,                          /* nb_inplace_floor_divide */
69297db96d56Sopenharmony_ci    0,                          /* nb_inplace_true_divide */
69307db96d56Sopenharmony_ci    0,                          /* nb_index */
69317db96d56Sopenharmony_ci    matmulType_matmul,        /* nb_matrix_multiply */
69327db96d56Sopenharmony_ci    matmulType_imatmul        /* nb_matrix_inplace_multiply */
69337db96d56Sopenharmony_ci};
69347db96d56Sopenharmony_ci
69357db96d56Sopenharmony_cistatic PyTypeObject matmulType = {
69367db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
69377db96d56Sopenharmony_ci    "matmulType",
69387db96d56Sopenharmony_ci    sizeof(matmulObject),               /* tp_basicsize */
69397db96d56Sopenharmony_ci    0,                                  /* tp_itemsize */
69407db96d56Sopenharmony_ci    matmulType_dealloc,                 /* destructor tp_dealloc */
69417db96d56Sopenharmony_ci    0,                                  /* tp_vectorcall_offset */
69427db96d56Sopenharmony_ci    0,                                  /* tp_getattr */
69437db96d56Sopenharmony_ci    0,                                  /* tp_setattr */
69447db96d56Sopenharmony_ci    0,                                  /* tp_as_async */
69457db96d56Sopenharmony_ci    0,                                  /* tp_repr */
69467db96d56Sopenharmony_ci    &matmulType_as_number,              /* tp_as_number */
69477db96d56Sopenharmony_ci    0,                                  /* tp_as_sequence */
69487db96d56Sopenharmony_ci    0,                                  /* tp_as_mapping */
69497db96d56Sopenharmony_ci    0,                                  /* tp_hash */
69507db96d56Sopenharmony_ci    0,                                  /* tp_call */
69517db96d56Sopenharmony_ci    0,                                  /* tp_str */
69527db96d56Sopenharmony_ci    PyObject_GenericGetAttr,            /* tp_getattro */
69537db96d56Sopenharmony_ci    PyObject_GenericSetAttr,            /* tp_setattro */
69547db96d56Sopenharmony_ci    0,                                  /* tp_as_buffer */
69557db96d56Sopenharmony_ci    0,                                  /* tp_flags */
69567db96d56Sopenharmony_ci    "C level type with matrix operations defined",
69577db96d56Sopenharmony_ci    0,                                  /* traverseproc tp_traverse */
69587db96d56Sopenharmony_ci    0,                                  /* tp_clear */
69597db96d56Sopenharmony_ci    0,                                  /* tp_richcompare */
69607db96d56Sopenharmony_ci    0,                                  /* tp_weaklistoffset */
69617db96d56Sopenharmony_ci    0,                                  /* tp_iter */
69627db96d56Sopenharmony_ci    0,                                  /* tp_iternext */
69637db96d56Sopenharmony_ci    0,                                  /* tp_methods */
69647db96d56Sopenharmony_ci    0,                                  /* tp_members */
69657db96d56Sopenharmony_ci    0,
69667db96d56Sopenharmony_ci    0,
69677db96d56Sopenharmony_ci    0,
69687db96d56Sopenharmony_ci    0,
69697db96d56Sopenharmony_ci    0,
69707db96d56Sopenharmony_ci    0,
69717db96d56Sopenharmony_ci    0,
69727db96d56Sopenharmony_ci    0,
69737db96d56Sopenharmony_ci    PyType_GenericNew,                  /* tp_new */
69747db96d56Sopenharmony_ci    PyObject_Del,                       /* tp_free */
69757db96d56Sopenharmony_ci};
69767db96d56Sopenharmony_ci
69777db96d56Sopenharmony_citypedef struct {
69787db96d56Sopenharmony_ci    PyObject_HEAD
69797db96d56Sopenharmony_ci} ipowObject;
69807db96d56Sopenharmony_ci
69817db96d56Sopenharmony_cistatic PyObject *
69827db96d56Sopenharmony_ciipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
69837db96d56Sopenharmony_ci{
69847db96d56Sopenharmony_ci    return Py_BuildValue("OO", other, mod);
69857db96d56Sopenharmony_ci}
69867db96d56Sopenharmony_ci
69877db96d56Sopenharmony_cistatic PyNumberMethods ipowType_as_number = {
69887db96d56Sopenharmony_ci    .nb_inplace_power = ipowType_ipow
69897db96d56Sopenharmony_ci};
69907db96d56Sopenharmony_ci
69917db96d56Sopenharmony_cistatic PyTypeObject ipowType = {
69927db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
69937db96d56Sopenharmony_ci    .tp_name = "ipowType",
69947db96d56Sopenharmony_ci    .tp_basicsize = sizeof(ipowObject),
69957db96d56Sopenharmony_ci    .tp_as_number = &ipowType_as_number,
69967db96d56Sopenharmony_ci    .tp_new = PyType_GenericNew
69977db96d56Sopenharmony_ci};
69987db96d56Sopenharmony_ci
69997db96d56Sopenharmony_citypedef struct {
70007db96d56Sopenharmony_ci    PyObject_HEAD
70017db96d56Sopenharmony_ci    PyObject *ao_iterator;
70027db96d56Sopenharmony_ci} awaitObject;
70037db96d56Sopenharmony_ci
70047db96d56Sopenharmony_ci
70057db96d56Sopenharmony_cistatic PyObject *
70067db96d56Sopenharmony_ciawaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
70077db96d56Sopenharmony_ci{
70087db96d56Sopenharmony_ci    PyObject *v;
70097db96d56Sopenharmony_ci    awaitObject *ao;
70107db96d56Sopenharmony_ci
70117db96d56Sopenharmony_ci    if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
70127db96d56Sopenharmony_ci        return NULL;
70137db96d56Sopenharmony_ci
70147db96d56Sopenharmony_ci    ao = (awaitObject *)type->tp_alloc(type, 0);
70157db96d56Sopenharmony_ci    if (ao == NULL) {
70167db96d56Sopenharmony_ci        return NULL;
70177db96d56Sopenharmony_ci    }
70187db96d56Sopenharmony_ci
70197db96d56Sopenharmony_ci    Py_INCREF(v);
70207db96d56Sopenharmony_ci    ao->ao_iterator = v;
70217db96d56Sopenharmony_ci
70227db96d56Sopenharmony_ci    return (PyObject *)ao;
70237db96d56Sopenharmony_ci}
70247db96d56Sopenharmony_ci
70257db96d56Sopenharmony_ci
70267db96d56Sopenharmony_cistatic void
70277db96d56Sopenharmony_ciawaitObject_dealloc(awaitObject *ao)
70287db96d56Sopenharmony_ci{
70297db96d56Sopenharmony_ci    Py_CLEAR(ao->ao_iterator);
70307db96d56Sopenharmony_ci    Py_TYPE(ao)->tp_free(ao);
70317db96d56Sopenharmony_ci}
70327db96d56Sopenharmony_ci
70337db96d56Sopenharmony_ci
70347db96d56Sopenharmony_cistatic PyObject *
70357db96d56Sopenharmony_ciawaitObject_await(awaitObject *ao)
70367db96d56Sopenharmony_ci{
70377db96d56Sopenharmony_ci    Py_INCREF(ao->ao_iterator);
70387db96d56Sopenharmony_ci    return ao->ao_iterator;
70397db96d56Sopenharmony_ci}
70407db96d56Sopenharmony_ci
70417db96d56Sopenharmony_cistatic PyAsyncMethods awaitType_as_async = {
70427db96d56Sopenharmony_ci    (unaryfunc)awaitObject_await,           /* am_await */
70437db96d56Sopenharmony_ci    0,                                      /* am_aiter */
70447db96d56Sopenharmony_ci    0,                                      /* am_anext */
70457db96d56Sopenharmony_ci    0,                                      /* am_send  */
70467db96d56Sopenharmony_ci};
70477db96d56Sopenharmony_ci
70487db96d56Sopenharmony_ci
70497db96d56Sopenharmony_cistatic PyTypeObject awaitType = {
70507db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
70517db96d56Sopenharmony_ci    "awaitType",
70527db96d56Sopenharmony_ci    sizeof(awaitObject),                /* tp_basicsize */
70537db96d56Sopenharmony_ci    0,                                  /* tp_itemsize */
70547db96d56Sopenharmony_ci    (destructor)awaitObject_dealloc,    /* destructor tp_dealloc */
70557db96d56Sopenharmony_ci    0,                                  /* tp_vectorcall_offset */
70567db96d56Sopenharmony_ci    0,                                  /* tp_getattr */
70577db96d56Sopenharmony_ci    0,                                  /* tp_setattr */
70587db96d56Sopenharmony_ci    &awaitType_as_async,                /* tp_as_async */
70597db96d56Sopenharmony_ci    0,                                  /* tp_repr */
70607db96d56Sopenharmony_ci    0,                                  /* tp_as_number */
70617db96d56Sopenharmony_ci    0,                                  /* tp_as_sequence */
70627db96d56Sopenharmony_ci    0,                                  /* tp_as_mapping */
70637db96d56Sopenharmony_ci    0,                                  /* tp_hash */
70647db96d56Sopenharmony_ci    0,                                  /* tp_call */
70657db96d56Sopenharmony_ci    0,                                  /* tp_str */
70667db96d56Sopenharmony_ci    PyObject_GenericGetAttr,            /* tp_getattro */
70677db96d56Sopenharmony_ci    PyObject_GenericSetAttr,            /* tp_setattro */
70687db96d56Sopenharmony_ci    0,                                  /* tp_as_buffer */
70697db96d56Sopenharmony_ci    0,                                  /* tp_flags */
70707db96d56Sopenharmony_ci    "C level type with tp_as_async",
70717db96d56Sopenharmony_ci    0,                                  /* traverseproc tp_traverse */
70727db96d56Sopenharmony_ci    0,                                  /* tp_clear */
70737db96d56Sopenharmony_ci    0,                                  /* tp_richcompare */
70747db96d56Sopenharmony_ci    0,                                  /* tp_weaklistoffset */
70757db96d56Sopenharmony_ci    0,                                  /* tp_iter */
70767db96d56Sopenharmony_ci    0,                                  /* tp_iternext */
70777db96d56Sopenharmony_ci    0,                                  /* tp_methods */
70787db96d56Sopenharmony_ci    0,                                  /* tp_members */
70797db96d56Sopenharmony_ci    0,
70807db96d56Sopenharmony_ci    0,
70817db96d56Sopenharmony_ci    0,
70827db96d56Sopenharmony_ci    0,
70837db96d56Sopenharmony_ci    0,
70847db96d56Sopenharmony_ci    0,
70857db96d56Sopenharmony_ci    0,
70867db96d56Sopenharmony_ci    0,
70877db96d56Sopenharmony_ci    awaitObject_new,                    /* tp_new */
70887db96d56Sopenharmony_ci    PyObject_Del,                       /* tp_free */
70897db96d56Sopenharmony_ci};
70907db96d56Sopenharmony_ci
70917db96d56Sopenharmony_ci
70927db96d56Sopenharmony_cistatic int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
70937db96d56Sopenharmony_ci
70947db96d56Sopenharmony_cistatic PyTypeObject PyRecursingInfinitelyError_Type = {
70957db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
70967db96d56Sopenharmony_ci    "RecursingInfinitelyError",   /* tp_name */
70977db96d56Sopenharmony_ci    sizeof(PyBaseExceptionObject), /* tp_basicsize */
70987db96d56Sopenharmony_ci    0,                          /* tp_itemsize */
70997db96d56Sopenharmony_ci    0,                          /* tp_dealloc */
71007db96d56Sopenharmony_ci    0,                          /* tp_vectorcall_offset */
71017db96d56Sopenharmony_ci    0,                          /* tp_getattr */
71027db96d56Sopenharmony_ci    0,                          /* tp_setattr */
71037db96d56Sopenharmony_ci    0,                          /* tp_as_async */
71047db96d56Sopenharmony_ci    0,                          /* tp_repr */
71057db96d56Sopenharmony_ci    0,                          /* tp_as_number */
71067db96d56Sopenharmony_ci    0,                          /* tp_as_sequence */
71077db96d56Sopenharmony_ci    0,                          /* tp_as_mapping */
71087db96d56Sopenharmony_ci    0,                          /* tp_hash */
71097db96d56Sopenharmony_ci    0,                          /* tp_call */
71107db96d56Sopenharmony_ci    0,                          /* tp_str */
71117db96d56Sopenharmony_ci    0,                          /* tp_getattro */
71127db96d56Sopenharmony_ci    0,                          /* tp_setattro */
71137db96d56Sopenharmony_ci    0,                          /* tp_as_buffer */
71147db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
71157db96d56Sopenharmony_ci    PyDoc_STR("Instantiating this exception starts infinite recursion."), /* tp_doc */
71167db96d56Sopenharmony_ci    0,                          /* tp_traverse */
71177db96d56Sopenharmony_ci    0,                          /* tp_clear */
71187db96d56Sopenharmony_ci    0,                          /* tp_richcompare */
71197db96d56Sopenharmony_ci    0,                          /* tp_weaklistoffset */
71207db96d56Sopenharmony_ci    0,                          /* tp_iter */
71217db96d56Sopenharmony_ci    0,                          /* tp_iternext */
71227db96d56Sopenharmony_ci    0,                          /* tp_methods */
71237db96d56Sopenharmony_ci    0,                          /* tp_members */
71247db96d56Sopenharmony_ci    0,                          /* tp_getset */
71257db96d56Sopenharmony_ci    0,                          /* tp_base */
71267db96d56Sopenharmony_ci    0,                          /* tp_dict */
71277db96d56Sopenharmony_ci    0,                          /* tp_descr_get */
71287db96d56Sopenharmony_ci    0,                          /* tp_descr_set */
71297db96d56Sopenharmony_ci    0,                          /* tp_dictoffset */
71307db96d56Sopenharmony_ci    (initproc)recurse_infinitely_error_init, /* tp_init */
71317db96d56Sopenharmony_ci    0,                          /* tp_alloc */
71327db96d56Sopenharmony_ci    0,                          /* tp_new */
71337db96d56Sopenharmony_ci};
71347db96d56Sopenharmony_ci
71357db96d56Sopenharmony_cistatic int
71367db96d56Sopenharmony_cirecurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
71377db96d56Sopenharmony_ci{
71387db96d56Sopenharmony_ci    PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
71397db96d56Sopenharmony_ci
71407db96d56Sopenharmony_ci    /* Instantiating this exception starts infinite recursion. */
71417db96d56Sopenharmony_ci    Py_INCREF(type);
71427db96d56Sopenharmony_ci    PyErr_SetObject(type, NULL);
71437db96d56Sopenharmony_ci    return -1;
71447db96d56Sopenharmony_ci}
71457db96d56Sopenharmony_ci
71467db96d56Sopenharmony_ci
71477db96d56Sopenharmony_ci/* Test bpo-35983: create a subclass of "list" which checks that instances
71487db96d56Sopenharmony_ci * are not deallocated twice */
71497db96d56Sopenharmony_ci
71507db96d56Sopenharmony_citypedef struct {
71517db96d56Sopenharmony_ci    PyListObject list;
71527db96d56Sopenharmony_ci    int deallocated;
71537db96d56Sopenharmony_ci} MyListObject;
71547db96d56Sopenharmony_ci
71557db96d56Sopenharmony_cistatic PyObject *
71567db96d56Sopenharmony_ciMyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
71577db96d56Sopenharmony_ci{
71587db96d56Sopenharmony_ci    PyObject* op = PyList_Type.tp_new(type, args, kwds);
71597db96d56Sopenharmony_ci    ((MyListObject*)op)->deallocated = 0;
71607db96d56Sopenharmony_ci    return op;
71617db96d56Sopenharmony_ci}
71627db96d56Sopenharmony_ci
71637db96d56Sopenharmony_civoid
71647db96d56Sopenharmony_ciMyList_dealloc(MyListObject* op)
71657db96d56Sopenharmony_ci{
71667db96d56Sopenharmony_ci    if (op->deallocated) {
71677db96d56Sopenharmony_ci        /* We cannot raise exceptions here but we still want the testsuite
71687db96d56Sopenharmony_ci         * to fail when we hit this */
71697db96d56Sopenharmony_ci        Py_FatalError("MyList instance deallocated twice");
71707db96d56Sopenharmony_ci    }
71717db96d56Sopenharmony_ci    op->deallocated = 1;
71727db96d56Sopenharmony_ci    PyList_Type.tp_dealloc((PyObject *)op);
71737db96d56Sopenharmony_ci}
71747db96d56Sopenharmony_ci
71757db96d56Sopenharmony_cistatic PyTypeObject MyList_Type = {
71767db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
71777db96d56Sopenharmony_ci    "MyList",
71787db96d56Sopenharmony_ci    sizeof(MyListObject),
71797db96d56Sopenharmony_ci    0,
71807db96d56Sopenharmony_ci    (destructor)MyList_dealloc,                 /* tp_dealloc */
71817db96d56Sopenharmony_ci    0,                                          /* tp_vectorcall_offset */
71827db96d56Sopenharmony_ci    0,                                          /* tp_getattr */
71837db96d56Sopenharmony_ci    0,                                          /* tp_setattr */
71847db96d56Sopenharmony_ci    0,                                          /* tp_as_async */
71857db96d56Sopenharmony_ci    0,                                          /* tp_repr */
71867db96d56Sopenharmony_ci    0,                                          /* tp_as_number */
71877db96d56Sopenharmony_ci    0,                                          /* tp_as_sequence */
71887db96d56Sopenharmony_ci    0,                                          /* tp_as_mapping */
71897db96d56Sopenharmony_ci    0,                                          /* tp_hash */
71907db96d56Sopenharmony_ci    0,                                          /* tp_call */
71917db96d56Sopenharmony_ci    0,                                          /* tp_str */
71927db96d56Sopenharmony_ci    0,                                          /* tp_getattro */
71937db96d56Sopenharmony_ci    0,                                          /* tp_setattro */
71947db96d56Sopenharmony_ci    0,                                          /* tp_as_buffer */
71957db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,   /* tp_flags */
71967db96d56Sopenharmony_ci    0,                                          /* tp_doc */
71977db96d56Sopenharmony_ci    0,                                          /* tp_traverse */
71987db96d56Sopenharmony_ci    0,                                          /* tp_clear */
71997db96d56Sopenharmony_ci    0,                                          /* tp_richcompare */
72007db96d56Sopenharmony_ci    0,                                          /* tp_weaklistoffset */
72017db96d56Sopenharmony_ci    0,                                          /* tp_iter */
72027db96d56Sopenharmony_ci    0,                                          /* tp_iternext */
72037db96d56Sopenharmony_ci    0,                                          /* tp_methods */
72047db96d56Sopenharmony_ci    0,                                          /* tp_members */
72057db96d56Sopenharmony_ci    0,                                          /* tp_getset */
72067db96d56Sopenharmony_ci    0,  /* &PyList_Type */                      /* tp_base */
72077db96d56Sopenharmony_ci    0,                                          /* tp_dict */
72087db96d56Sopenharmony_ci    0,                                          /* tp_descr_get */
72097db96d56Sopenharmony_ci    0,                                          /* tp_descr_set */
72107db96d56Sopenharmony_ci    0,                                          /* tp_dictoffset */
72117db96d56Sopenharmony_ci    0,                                          /* tp_init */
72127db96d56Sopenharmony_ci    0,                                          /* tp_alloc */
72137db96d56Sopenharmony_ci    MyList_new,                                 /* tp_new */
72147db96d56Sopenharmony_ci};
72157db96d56Sopenharmony_ci
72167db96d56Sopenharmony_ci
72177db96d56Sopenharmony_ci/* Test PEP 560 */
72187db96d56Sopenharmony_ci
72197db96d56Sopenharmony_citypedef struct {
72207db96d56Sopenharmony_ci    PyObject_HEAD
72217db96d56Sopenharmony_ci    PyObject *item;
72227db96d56Sopenharmony_ci} PyGenericAliasObject;
72237db96d56Sopenharmony_ci
72247db96d56Sopenharmony_cistatic void
72257db96d56Sopenharmony_cigeneric_alias_dealloc(PyGenericAliasObject *self)
72267db96d56Sopenharmony_ci{
72277db96d56Sopenharmony_ci    Py_CLEAR(self->item);
72287db96d56Sopenharmony_ci    Py_TYPE(self)->tp_free((PyObject *)self);
72297db96d56Sopenharmony_ci}
72307db96d56Sopenharmony_ci
72317db96d56Sopenharmony_cistatic PyObject *
72327db96d56Sopenharmony_cigeneric_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
72337db96d56Sopenharmony_ci{
72347db96d56Sopenharmony_ci    return PyTuple_Pack(1, self->item);
72357db96d56Sopenharmony_ci}
72367db96d56Sopenharmony_ci
72377db96d56Sopenharmony_cistatic PyMethodDef generic_alias_methods[] = {
72387db96d56Sopenharmony_ci    {"__mro_entries__", _PyCFunction_CAST(generic_alias_mro_entries), METH_O, NULL},
72397db96d56Sopenharmony_ci    {NULL}  /* sentinel */
72407db96d56Sopenharmony_ci};
72417db96d56Sopenharmony_ci
72427db96d56Sopenharmony_cistatic PyTypeObject GenericAlias_Type = {
72437db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
72447db96d56Sopenharmony_ci    "GenericAlias",
72457db96d56Sopenharmony_ci    sizeof(PyGenericAliasObject),
72467db96d56Sopenharmony_ci    0,
72477db96d56Sopenharmony_ci    .tp_dealloc = (destructor)generic_alias_dealloc,
72487db96d56Sopenharmony_ci    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
72497db96d56Sopenharmony_ci    .tp_methods = generic_alias_methods,
72507db96d56Sopenharmony_ci};
72517db96d56Sopenharmony_ci
72527db96d56Sopenharmony_cistatic PyObject *
72537db96d56Sopenharmony_cigeneric_alias_new(PyObject *item)
72547db96d56Sopenharmony_ci{
72557db96d56Sopenharmony_ci    PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
72567db96d56Sopenharmony_ci    if (o == NULL) {
72577db96d56Sopenharmony_ci        return NULL;
72587db96d56Sopenharmony_ci    }
72597db96d56Sopenharmony_ci    Py_INCREF(item);
72607db96d56Sopenharmony_ci    o->item = item;
72617db96d56Sopenharmony_ci    return (PyObject*) o;
72627db96d56Sopenharmony_ci}
72637db96d56Sopenharmony_ci
72647db96d56Sopenharmony_citypedef struct {
72657db96d56Sopenharmony_ci    PyObject_HEAD
72667db96d56Sopenharmony_ci} PyGenericObject;
72677db96d56Sopenharmony_ci
72687db96d56Sopenharmony_cistatic PyObject *
72697db96d56Sopenharmony_cigeneric_class_getitem(PyObject *type, PyObject *item)
72707db96d56Sopenharmony_ci{
72717db96d56Sopenharmony_ci    return generic_alias_new(item);
72727db96d56Sopenharmony_ci}
72737db96d56Sopenharmony_ci
72747db96d56Sopenharmony_cistatic PyMethodDef generic_methods[] = {
72757db96d56Sopenharmony_ci    {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
72767db96d56Sopenharmony_ci    {NULL}  /* sentinel */
72777db96d56Sopenharmony_ci};
72787db96d56Sopenharmony_ci
72797db96d56Sopenharmony_cistatic PyTypeObject Generic_Type = {
72807db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
72817db96d56Sopenharmony_ci    "Generic",
72827db96d56Sopenharmony_ci    sizeof(PyGenericObject),
72837db96d56Sopenharmony_ci    0,
72847db96d56Sopenharmony_ci    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
72857db96d56Sopenharmony_ci    .tp_methods = generic_methods,
72867db96d56Sopenharmony_ci};
72877db96d56Sopenharmony_ci
72887db96d56Sopenharmony_ci
72897db96d56Sopenharmony_ci/* Test PEP 590 */
72907db96d56Sopenharmony_ci
72917db96d56Sopenharmony_citypedef struct {
72927db96d56Sopenharmony_ci    PyObject_HEAD
72937db96d56Sopenharmony_ci    vectorcallfunc vectorcall;
72947db96d56Sopenharmony_ci} MethodDescriptorObject;
72957db96d56Sopenharmony_ci
72967db96d56Sopenharmony_cistatic PyObject *
72977db96d56Sopenharmony_ciMethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
72987db96d56Sopenharmony_ci                            size_t nargsf, PyObject *kwnames)
72997db96d56Sopenharmony_ci{
73007db96d56Sopenharmony_ci    /* True if using the vectorcall function in MethodDescriptorObject
73017db96d56Sopenharmony_ci     * but False for MethodDescriptor2Object */
73027db96d56Sopenharmony_ci    MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
73037db96d56Sopenharmony_ci    return PyBool_FromLong(md->vectorcall != NULL);
73047db96d56Sopenharmony_ci}
73057db96d56Sopenharmony_ci
73067db96d56Sopenharmony_cistatic PyObject *
73077db96d56Sopenharmony_ciMethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
73087db96d56Sopenharmony_ci{
73097db96d56Sopenharmony_ci    MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
73107db96d56Sopenharmony_ci    op->vectorcall = MethodDescriptor_vectorcall;
73117db96d56Sopenharmony_ci    return (PyObject *)op;
73127db96d56Sopenharmony_ci}
73137db96d56Sopenharmony_ci
73147db96d56Sopenharmony_cistatic PyObject *
73157db96d56Sopenharmony_cifunc_descr_get(PyObject *func, PyObject *obj, PyObject *type)
73167db96d56Sopenharmony_ci{
73177db96d56Sopenharmony_ci    if (obj == Py_None || obj == NULL) {
73187db96d56Sopenharmony_ci        Py_INCREF(func);
73197db96d56Sopenharmony_ci        return func;
73207db96d56Sopenharmony_ci    }
73217db96d56Sopenharmony_ci    return PyMethod_New(func, obj);
73227db96d56Sopenharmony_ci}
73237db96d56Sopenharmony_ci
73247db96d56Sopenharmony_cistatic PyObject *
73257db96d56Sopenharmony_cinop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
73267db96d56Sopenharmony_ci{
73277db96d56Sopenharmony_ci    Py_INCREF(func);
73287db96d56Sopenharmony_ci    return func;
73297db96d56Sopenharmony_ci}
73307db96d56Sopenharmony_ci
73317db96d56Sopenharmony_cistatic PyObject *
73327db96d56Sopenharmony_cicall_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
73337db96d56Sopenharmony_ci{
73347db96d56Sopenharmony_ci    Py_INCREF(args);
73357db96d56Sopenharmony_ci    return args;
73367db96d56Sopenharmony_ci}
73377db96d56Sopenharmony_ci
73387db96d56Sopenharmony_cistatic PyTypeObject MethodDescriptorBase_Type = {
73397db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
73407db96d56Sopenharmony_ci    "MethodDescriptorBase",
73417db96d56Sopenharmony_ci    sizeof(MethodDescriptorObject),
73427db96d56Sopenharmony_ci    .tp_new = MethodDescriptor_new,
73437db96d56Sopenharmony_ci    .tp_call = PyVectorcall_Call,
73447db96d56Sopenharmony_ci    .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
73457db96d56Sopenharmony_ci    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
73467db96d56Sopenharmony_ci                Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL,
73477db96d56Sopenharmony_ci    .tp_descr_get = func_descr_get,
73487db96d56Sopenharmony_ci};
73497db96d56Sopenharmony_ci
73507db96d56Sopenharmony_cistatic PyTypeObject MethodDescriptorDerived_Type = {
73517db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
73527db96d56Sopenharmony_ci    "MethodDescriptorDerived",
73537db96d56Sopenharmony_ci    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
73547db96d56Sopenharmony_ci};
73557db96d56Sopenharmony_ci
73567db96d56Sopenharmony_cistatic PyTypeObject MethodDescriptorNopGet_Type = {
73577db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
73587db96d56Sopenharmony_ci    "MethodDescriptorNopGet",
73597db96d56Sopenharmony_ci    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
73607db96d56Sopenharmony_ci    .tp_call = call_return_args,
73617db96d56Sopenharmony_ci    .tp_descr_get = nop_descr_get,
73627db96d56Sopenharmony_ci};
73637db96d56Sopenharmony_ci
73647db96d56Sopenharmony_citypedef struct {
73657db96d56Sopenharmony_ci    MethodDescriptorObject base;
73667db96d56Sopenharmony_ci    vectorcallfunc vectorcall;
73677db96d56Sopenharmony_ci} MethodDescriptor2Object;
73687db96d56Sopenharmony_ci
73697db96d56Sopenharmony_cistatic PyObject *
73707db96d56Sopenharmony_ciMethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
73717db96d56Sopenharmony_ci{
73727db96d56Sopenharmony_ci    MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
73737db96d56Sopenharmony_ci    op->base.vectorcall = NULL;
73747db96d56Sopenharmony_ci    op->vectorcall = MethodDescriptor_vectorcall;
73757db96d56Sopenharmony_ci    return (PyObject *)op;
73767db96d56Sopenharmony_ci}
73777db96d56Sopenharmony_ci
73787db96d56Sopenharmony_cistatic PyTypeObject MethodDescriptor2_Type = {
73797db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
73807db96d56Sopenharmony_ci    "MethodDescriptor2",
73817db96d56Sopenharmony_ci    sizeof(MethodDescriptor2Object),
73827db96d56Sopenharmony_ci    .tp_new = MethodDescriptor2_new,
73837db96d56Sopenharmony_ci    .tp_call = PyVectorcall_Call,
73847db96d56Sopenharmony_ci    .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
73857db96d56Sopenharmony_ci    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL,
73867db96d56Sopenharmony_ci};
73877db96d56Sopenharmony_ci
73887db96d56Sopenharmony_ciPyDoc_STRVAR(heapdocctype__doc__,
73897db96d56Sopenharmony_ci"HeapDocCType(arg1, arg2)\n"
73907db96d56Sopenharmony_ci"--\n"
73917db96d56Sopenharmony_ci"\n"
73927db96d56Sopenharmony_ci"somedoc");
73937db96d56Sopenharmony_ci
73947db96d56Sopenharmony_citypedef struct {
73957db96d56Sopenharmony_ci    PyObject_HEAD
73967db96d56Sopenharmony_ci} HeapDocCTypeObject;
73977db96d56Sopenharmony_ci
73987db96d56Sopenharmony_cistatic PyType_Slot HeapDocCType_slots[] = {
73997db96d56Sopenharmony_ci    {Py_tp_doc, (char*)heapdocctype__doc__},
74007db96d56Sopenharmony_ci    {0},
74017db96d56Sopenharmony_ci};
74027db96d56Sopenharmony_ci
74037db96d56Sopenharmony_cistatic PyType_Spec HeapDocCType_spec = {
74047db96d56Sopenharmony_ci    "_testcapi.HeapDocCType",
74057db96d56Sopenharmony_ci    sizeof(HeapDocCTypeObject),
74067db96d56Sopenharmony_ci    0,
74077db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT,
74087db96d56Sopenharmony_ci    HeapDocCType_slots
74097db96d56Sopenharmony_ci};
74107db96d56Sopenharmony_ci
74117db96d56Sopenharmony_citypedef struct {
74127db96d56Sopenharmony_ci    PyObject_HEAD
74137db96d56Sopenharmony_ci} HeapTypeNameObject;
74147db96d56Sopenharmony_ci
74157db96d56Sopenharmony_cistatic PyType_Slot HeapTypeNameType_slots[] = {
74167db96d56Sopenharmony_ci    {0},
74177db96d56Sopenharmony_ci};
74187db96d56Sopenharmony_ci
74197db96d56Sopenharmony_cistatic PyType_Spec HeapTypeNameType_Spec = {
74207db96d56Sopenharmony_ci    .name = "_testcapi.HeapTypeNameType",
74217db96d56Sopenharmony_ci    .basicsize = sizeof(HeapTypeNameObject),
74227db96d56Sopenharmony_ci    .flags = Py_TPFLAGS_DEFAULT,
74237db96d56Sopenharmony_ci    .slots = HeapTypeNameType_slots,
74247db96d56Sopenharmony_ci};
74257db96d56Sopenharmony_ci
74267db96d56Sopenharmony_citypedef struct {
74277db96d56Sopenharmony_ci    PyObject_HEAD
74287db96d56Sopenharmony_ci} NullTpDocTypeObject;
74297db96d56Sopenharmony_ci
74307db96d56Sopenharmony_cistatic PyType_Slot NullTpDocType_slots[] = {
74317db96d56Sopenharmony_ci    {Py_tp_doc, NULL},
74327db96d56Sopenharmony_ci    {0, 0},
74337db96d56Sopenharmony_ci};
74347db96d56Sopenharmony_ci
74357db96d56Sopenharmony_cistatic PyType_Spec NullTpDocType_spec = {
74367db96d56Sopenharmony_ci    "_testcapi.NullTpDocType",
74377db96d56Sopenharmony_ci    sizeof(NullTpDocTypeObject),
74387db96d56Sopenharmony_ci    0,
74397db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT,
74407db96d56Sopenharmony_ci    NullTpDocType_slots
74417db96d56Sopenharmony_ci};
74427db96d56Sopenharmony_ci
74437db96d56Sopenharmony_ci
74447db96d56Sopenharmony_ciPyDoc_STRVAR(heapgctype__doc__,
74457db96d56Sopenharmony_ci"A heap type with GC, and with overridden dealloc.\n\n"
74467db96d56Sopenharmony_ci"The 'value' attribute is set to 10 in __init__.");
74477db96d56Sopenharmony_ci
74487db96d56Sopenharmony_citypedef struct {
74497db96d56Sopenharmony_ci    PyObject_HEAD
74507db96d56Sopenharmony_ci    int value;
74517db96d56Sopenharmony_ci} HeapCTypeObject;
74527db96d56Sopenharmony_ci
74537db96d56Sopenharmony_cistatic struct PyMemberDef heapctype_members[] = {
74547db96d56Sopenharmony_ci    {"value", T_INT, offsetof(HeapCTypeObject, value)},
74557db96d56Sopenharmony_ci    {NULL} /* Sentinel */
74567db96d56Sopenharmony_ci};
74577db96d56Sopenharmony_ci
74587db96d56Sopenharmony_cistatic int
74597db96d56Sopenharmony_ciheapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
74607db96d56Sopenharmony_ci{
74617db96d56Sopenharmony_ci    ((HeapCTypeObject *)self)->value = 10;
74627db96d56Sopenharmony_ci    return 0;
74637db96d56Sopenharmony_ci}
74647db96d56Sopenharmony_ci
74657db96d56Sopenharmony_cistatic int
74667db96d56Sopenharmony_ciheapgcctype_traverse(HeapCTypeObject *self, visitproc visit, void *arg)
74677db96d56Sopenharmony_ci{
74687db96d56Sopenharmony_ci    Py_VISIT(Py_TYPE(self));
74697db96d56Sopenharmony_ci    return 0;
74707db96d56Sopenharmony_ci}
74717db96d56Sopenharmony_ci
74727db96d56Sopenharmony_cistatic void
74737db96d56Sopenharmony_ciheapgcctype_dealloc(HeapCTypeObject *self)
74747db96d56Sopenharmony_ci{
74757db96d56Sopenharmony_ci    PyTypeObject *tp = Py_TYPE(self);
74767db96d56Sopenharmony_ci    PyObject_GC_UnTrack(self);
74777db96d56Sopenharmony_ci    PyObject_GC_Del(self);
74787db96d56Sopenharmony_ci    Py_DECREF(tp);
74797db96d56Sopenharmony_ci}
74807db96d56Sopenharmony_ci
74817db96d56Sopenharmony_cistatic PyType_Slot HeapGcCType_slots[] = {
74827db96d56Sopenharmony_ci    {Py_tp_init, heapctype_init},
74837db96d56Sopenharmony_ci    {Py_tp_members, heapctype_members},
74847db96d56Sopenharmony_ci    {Py_tp_dealloc, heapgcctype_dealloc},
74857db96d56Sopenharmony_ci    {Py_tp_traverse, heapgcctype_traverse},
74867db96d56Sopenharmony_ci    {Py_tp_doc, (char*)heapgctype__doc__},
74877db96d56Sopenharmony_ci    {0, 0},
74887db96d56Sopenharmony_ci};
74897db96d56Sopenharmony_ci
74907db96d56Sopenharmony_cistatic PyType_Spec HeapGcCType_spec = {
74917db96d56Sopenharmony_ci    "_testcapi.HeapGcCType",
74927db96d56Sopenharmony_ci    sizeof(HeapCTypeObject),
74937db96d56Sopenharmony_ci    0,
74947db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
74957db96d56Sopenharmony_ci    HeapGcCType_slots
74967db96d56Sopenharmony_ci};
74977db96d56Sopenharmony_ci
74987db96d56Sopenharmony_ciPyDoc_STRVAR(heapctype__doc__,
74997db96d56Sopenharmony_ci"A heap type without GC, but with overridden dealloc.\n\n"
75007db96d56Sopenharmony_ci"The 'value' attribute is set to 10 in __init__.");
75017db96d56Sopenharmony_ci
75027db96d56Sopenharmony_cistatic void
75037db96d56Sopenharmony_ciheapctype_dealloc(HeapCTypeObject *self)
75047db96d56Sopenharmony_ci{
75057db96d56Sopenharmony_ci    PyTypeObject *tp = Py_TYPE(self);
75067db96d56Sopenharmony_ci    PyObject_Free(self);
75077db96d56Sopenharmony_ci    Py_DECREF(tp);
75087db96d56Sopenharmony_ci}
75097db96d56Sopenharmony_ci
75107db96d56Sopenharmony_cistatic PyType_Slot HeapCType_slots[] = {
75117db96d56Sopenharmony_ci    {Py_tp_init, heapctype_init},
75127db96d56Sopenharmony_ci    {Py_tp_members, heapctype_members},
75137db96d56Sopenharmony_ci    {Py_tp_dealloc, heapctype_dealloc},
75147db96d56Sopenharmony_ci    {Py_tp_doc, (char*)heapctype__doc__},
75157db96d56Sopenharmony_ci    {0, 0},
75167db96d56Sopenharmony_ci};
75177db96d56Sopenharmony_ci
75187db96d56Sopenharmony_cistatic PyType_Spec HeapCType_spec = {
75197db96d56Sopenharmony_ci    "_testcapi.HeapCType",
75207db96d56Sopenharmony_ci    sizeof(HeapCTypeObject),
75217db96d56Sopenharmony_ci    0,
75227db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
75237db96d56Sopenharmony_ci    HeapCType_slots
75247db96d56Sopenharmony_ci};
75257db96d56Sopenharmony_ci
75267db96d56Sopenharmony_ciPyDoc_STRVAR(heapctypesubclass__doc__,
75277db96d56Sopenharmony_ci"Subclass of HeapCType, without GC.\n\n"
75287db96d56Sopenharmony_ci"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
75297db96d56Sopenharmony_ci
75307db96d56Sopenharmony_citypedef struct {
75317db96d56Sopenharmony_ci    HeapCTypeObject base;
75327db96d56Sopenharmony_ci    int value2;
75337db96d56Sopenharmony_ci} HeapCTypeSubclassObject;
75347db96d56Sopenharmony_ci
75357db96d56Sopenharmony_cistatic int
75367db96d56Sopenharmony_ciheapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
75377db96d56Sopenharmony_ci{
75387db96d56Sopenharmony_ci    /* Call __init__ of the superclass */
75397db96d56Sopenharmony_ci    if (heapctype_init(self, args, kwargs) < 0) {
75407db96d56Sopenharmony_ci        return -1;
75417db96d56Sopenharmony_ci    }
75427db96d56Sopenharmony_ci    /* Initialize additional element */
75437db96d56Sopenharmony_ci    ((HeapCTypeSubclassObject *)self)->value2 = 20;
75447db96d56Sopenharmony_ci    return 0;
75457db96d56Sopenharmony_ci}
75467db96d56Sopenharmony_ci
75477db96d56Sopenharmony_cistatic struct PyMemberDef heapctypesubclass_members[] = {
75487db96d56Sopenharmony_ci    {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
75497db96d56Sopenharmony_ci    {NULL} /* Sentinel */
75507db96d56Sopenharmony_ci};
75517db96d56Sopenharmony_ci
75527db96d56Sopenharmony_cistatic PyType_Slot HeapCTypeSubclass_slots[] = {
75537db96d56Sopenharmony_ci    {Py_tp_init, heapctypesubclass_init},
75547db96d56Sopenharmony_ci    {Py_tp_members, heapctypesubclass_members},
75557db96d56Sopenharmony_ci    {Py_tp_doc, (char*)heapctypesubclass__doc__},
75567db96d56Sopenharmony_ci    {0, 0},
75577db96d56Sopenharmony_ci};
75587db96d56Sopenharmony_ci
75597db96d56Sopenharmony_cistatic PyType_Spec HeapCTypeSubclass_spec = {
75607db96d56Sopenharmony_ci    "_testcapi.HeapCTypeSubclass",
75617db96d56Sopenharmony_ci    sizeof(HeapCTypeSubclassObject),
75627db96d56Sopenharmony_ci    0,
75637db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
75647db96d56Sopenharmony_ci    HeapCTypeSubclass_slots
75657db96d56Sopenharmony_ci};
75667db96d56Sopenharmony_ci
75677db96d56Sopenharmony_ciPyDoc_STRVAR(heapctypewithbuffer__doc__,
75687db96d56Sopenharmony_ci"Heap type with buffer support.\n\n"
75697db96d56Sopenharmony_ci"The buffer is set to [b'1', b'2', b'3', b'4']");
75707db96d56Sopenharmony_ci
75717db96d56Sopenharmony_citypedef struct {
75727db96d56Sopenharmony_ci    HeapCTypeObject base;
75737db96d56Sopenharmony_ci    char buffer[4];
75747db96d56Sopenharmony_ci} HeapCTypeWithBufferObject;
75757db96d56Sopenharmony_ci
75767db96d56Sopenharmony_cistatic int
75777db96d56Sopenharmony_ciheapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags)
75787db96d56Sopenharmony_ci{
75797db96d56Sopenharmony_ci    self->buffer[0] = '1';
75807db96d56Sopenharmony_ci    self->buffer[1] = '2';
75817db96d56Sopenharmony_ci    self->buffer[2] = '3';
75827db96d56Sopenharmony_ci    self->buffer[3] = '4';
75837db96d56Sopenharmony_ci    return PyBuffer_FillInfo(
75847db96d56Sopenharmony_ci        view, (PyObject*)self, (void *)self->buffer, 4, 1, flags);
75857db96d56Sopenharmony_ci}
75867db96d56Sopenharmony_ci
75877db96d56Sopenharmony_cistatic void
75887db96d56Sopenharmony_ciheapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view)
75897db96d56Sopenharmony_ci{
75907db96d56Sopenharmony_ci    assert(view->obj == (void*) self);
75917db96d56Sopenharmony_ci}
75927db96d56Sopenharmony_ci
75937db96d56Sopenharmony_cistatic PyType_Slot HeapCTypeWithBuffer_slots[] = {
75947db96d56Sopenharmony_ci    {Py_bf_getbuffer, heapctypewithbuffer_getbuffer},
75957db96d56Sopenharmony_ci    {Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer},
75967db96d56Sopenharmony_ci    {Py_tp_doc, (char*)heapctypewithbuffer__doc__},
75977db96d56Sopenharmony_ci    {0, 0},
75987db96d56Sopenharmony_ci};
75997db96d56Sopenharmony_ci
76007db96d56Sopenharmony_cistatic PyType_Spec HeapCTypeWithBuffer_spec = {
76017db96d56Sopenharmony_ci    "_testcapi.HeapCTypeWithBuffer",
76027db96d56Sopenharmony_ci    sizeof(HeapCTypeWithBufferObject),
76037db96d56Sopenharmony_ci    0,
76047db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
76057db96d56Sopenharmony_ci    HeapCTypeWithBuffer_slots
76067db96d56Sopenharmony_ci};
76077db96d56Sopenharmony_ci
76087db96d56Sopenharmony_ciPyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
76097db96d56Sopenharmony_ci"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
76107db96d56Sopenharmony_ci"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
76117db96d56Sopenharmony_ci"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
76127db96d56Sopenharmony_ci
76137db96d56Sopenharmony_cistatic int
76147db96d56Sopenharmony_ciheapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
76157db96d56Sopenharmony_ci{
76167db96d56Sopenharmony_ci    PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
76177db96d56Sopenharmony_ci    initproc base_init = PyType_GetSlot(base, Py_tp_init);
76187db96d56Sopenharmony_ci    base_init(self, args, kwargs);
76197db96d56Sopenharmony_ci    return 0;
76207db96d56Sopenharmony_ci}
76217db96d56Sopenharmony_ci
76227db96d56Sopenharmony_cistatic void
76237db96d56Sopenharmony_ciheapctypesubclasswithfinalizer_finalize(PyObject *self)
76247db96d56Sopenharmony_ci{
76257db96d56Sopenharmony_ci    PyObject *error_type, *error_value, *error_traceback, *m;
76267db96d56Sopenharmony_ci    PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
76277db96d56Sopenharmony_ci
76287db96d56Sopenharmony_ci    /* Save the current exception, if any. */
76297db96d56Sopenharmony_ci    PyErr_Fetch(&error_type, &error_value, &error_traceback);
76307db96d56Sopenharmony_ci
76317db96d56Sopenharmony_ci    m = PyState_FindModule(&_testcapimodule);
76327db96d56Sopenharmony_ci    if (m == NULL) {
76337db96d56Sopenharmony_ci        goto cleanup_finalize;
76347db96d56Sopenharmony_ci    }
76357db96d56Sopenharmony_ci    oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
76367db96d56Sopenharmony_ci    newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
76377db96d56Sopenharmony_ci    if (oldtype == NULL || newtype == NULL) {
76387db96d56Sopenharmony_ci        goto cleanup_finalize;
76397db96d56Sopenharmony_ci    }
76407db96d56Sopenharmony_ci
76417db96d56Sopenharmony_ci    if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
76427db96d56Sopenharmony_ci        goto cleanup_finalize;
76437db96d56Sopenharmony_ci    }
76447db96d56Sopenharmony_ci    refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
76457db96d56Sopenharmony_ci    if (refcnt == NULL) {
76467db96d56Sopenharmony_ci        goto cleanup_finalize;
76477db96d56Sopenharmony_ci    }
76487db96d56Sopenharmony_ci    if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
76497db96d56Sopenharmony_ci        goto cleanup_finalize;
76507db96d56Sopenharmony_ci    }
76517db96d56Sopenharmony_ci    Py_DECREF(refcnt);
76527db96d56Sopenharmony_ci    refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
76537db96d56Sopenharmony_ci    if (refcnt == NULL) {
76547db96d56Sopenharmony_ci        goto cleanup_finalize;
76557db96d56Sopenharmony_ci    }
76567db96d56Sopenharmony_ci    if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
76577db96d56Sopenharmony_ci        goto cleanup_finalize;
76587db96d56Sopenharmony_ci    }
76597db96d56Sopenharmony_ci
76607db96d56Sopenharmony_cicleanup_finalize:
76617db96d56Sopenharmony_ci    Py_XDECREF(oldtype);
76627db96d56Sopenharmony_ci    Py_XDECREF(newtype);
76637db96d56Sopenharmony_ci    Py_XDECREF(refcnt);
76647db96d56Sopenharmony_ci
76657db96d56Sopenharmony_ci    /* Restore the saved exception. */
76667db96d56Sopenharmony_ci    PyErr_Restore(error_type, error_value, error_traceback);
76677db96d56Sopenharmony_ci}
76687db96d56Sopenharmony_ci
76697db96d56Sopenharmony_cistatic PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
76707db96d56Sopenharmony_ci    {Py_tp_init, heapctypesubclasswithfinalizer_init},
76717db96d56Sopenharmony_ci    {Py_tp_members, heapctypesubclass_members},
76727db96d56Sopenharmony_ci    {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
76737db96d56Sopenharmony_ci    {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
76747db96d56Sopenharmony_ci    {0, 0},
76757db96d56Sopenharmony_ci};
76767db96d56Sopenharmony_ci
76777db96d56Sopenharmony_cistatic PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
76787db96d56Sopenharmony_ci    "_testcapi.HeapCTypeSubclassWithFinalizer",
76797db96d56Sopenharmony_ci    sizeof(HeapCTypeSubclassObject),
76807db96d56Sopenharmony_ci    0,
76817db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
76827db96d56Sopenharmony_ci    HeapCTypeSubclassWithFinalizer_slots
76837db96d56Sopenharmony_ci};
76847db96d56Sopenharmony_ci
76857db96d56Sopenharmony_citypedef struct {
76867db96d56Sopenharmony_ci    PyObject_HEAD
76877db96d56Sopenharmony_ci    PyObject *dict;
76887db96d56Sopenharmony_ci} HeapCTypeWithDictObject;
76897db96d56Sopenharmony_ci
76907db96d56Sopenharmony_cistatic void
76917db96d56Sopenharmony_ciheapctypewithdict_dealloc(HeapCTypeWithDictObject* self)
76927db96d56Sopenharmony_ci{
76937db96d56Sopenharmony_ci
76947db96d56Sopenharmony_ci    PyTypeObject *tp = Py_TYPE(self);
76957db96d56Sopenharmony_ci    Py_XDECREF(self->dict);
76967db96d56Sopenharmony_ci    PyObject_Free(self);
76977db96d56Sopenharmony_ci    Py_DECREF(tp);
76987db96d56Sopenharmony_ci}
76997db96d56Sopenharmony_ci
77007db96d56Sopenharmony_cistatic PyGetSetDef heapctypewithdict_getsetlist[] = {
77017db96d56Sopenharmony_ci    {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
77027db96d56Sopenharmony_ci    {NULL} /* Sentinel */
77037db96d56Sopenharmony_ci};
77047db96d56Sopenharmony_ci
77057db96d56Sopenharmony_cistatic struct PyMemberDef heapctypewithdict_members[] = {
77067db96d56Sopenharmony_ci    {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
77077db96d56Sopenharmony_ci    {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY},
77087db96d56Sopenharmony_ci    {NULL} /* Sentinel */
77097db96d56Sopenharmony_ci};
77107db96d56Sopenharmony_ci
77117db96d56Sopenharmony_cistatic PyType_Slot HeapCTypeWithDict_slots[] = {
77127db96d56Sopenharmony_ci    {Py_tp_members, heapctypewithdict_members},
77137db96d56Sopenharmony_ci    {Py_tp_getset, heapctypewithdict_getsetlist},
77147db96d56Sopenharmony_ci    {Py_tp_dealloc, heapctypewithdict_dealloc},
77157db96d56Sopenharmony_ci    {0, 0},
77167db96d56Sopenharmony_ci};
77177db96d56Sopenharmony_ci
77187db96d56Sopenharmony_cistatic PyType_Spec HeapCTypeWithDict_spec = {
77197db96d56Sopenharmony_ci    "_testcapi.HeapCTypeWithDict",
77207db96d56Sopenharmony_ci    sizeof(HeapCTypeWithDictObject),
77217db96d56Sopenharmony_ci    0,
77227db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
77237db96d56Sopenharmony_ci    HeapCTypeWithDict_slots
77247db96d56Sopenharmony_ci};
77257db96d56Sopenharmony_ci
77267db96d56Sopenharmony_cistatic PyType_Spec HeapCTypeWithDict2_spec = {
77277db96d56Sopenharmony_ci    "_testcapi.HeapCTypeWithDict2",
77287db96d56Sopenharmony_ci    sizeof(HeapCTypeWithDictObject),
77297db96d56Sopenharmony_ci    0,
77307db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
77317db96d56Sopenharmony_ci    HeapCTypeWithDict_slots
77327db96d56Sopenharmony_ci};
77337db96d56Sopenharmony_ci
77347db96d56Sopenharmony_cistatic struct PyMemberDef heapctypewithnegativedict_members[] = {
77357db96d56Sopenharmony_ci    {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
77367db96d56Sopenharmony_ci    {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY},
77377db96d56Sopenharmony_ci    {NULL} /* Sentinel */
77387db96d56Sopenharmony_ci};
77397db96d56Sopenharmony_ci
77407db96d56Sopenharmony_cistatic PyType_Slot HeapCTypeWithNegativeDict_slots[] = {
77417db96d56Sopenharmony_ci    {Py_tp_members, heapctypewithnegativedict_members},
77427db96d56Sopenharmony_ci    {Py_tp_getset, heapctypewithdict_getsetlist},
77437db96d56Sopenharmony_ci    {Py_tp_dealloc, heapctypewithdict_dealloc},
77447db96d56Sopenharmony_ci    {0, 0},
77457db96d56Sopenharmony_ci};
77467db96d56Sopenharmony_ci
77477db96d56Sopenharmony_cistatic PyType_Spec HeapCTypeWithNegativeDict_spec = {
77487db96d56Sopenharmony_ci    "_testcapi.HeapCTypeWithNegativeDict",
77497db96d56Sopenharmony_ci    sizeof(HeapCTypeWithDictObject),
77507db96d56Sopenharmony_ci    0,
77517db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
77527db96d56Sopenharmony_ci    HeapCTypeWithNegativeDict_slots
77537db96d56Sopenharmony_ci};
77547db96d56Sopenharmony_ci
77557db96d56Sopenharmony_citypedef struct {
77567db96d56Sopenharmony_ci    PyObject_HEAD
77577db96d56Sopenharmony_ci    PyObject *weakreflist;
77587db96d56Sopenharmony_ci} HeapCTypeWithWeakrefObject;
77597db96d56Sopenharmony_ci
77607db96d56Sopenharmony_cistatic struct PyMemberDef heapctypewithweakref_members[] = {
77617db96d56Sopenharmony_ci    {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)},
77627db96d56Sopenharmony_ci    {"__weaklistoffset__", T_PYSSIZET,
77637db96d56Sopenharmony_ci      offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY},
77647db96d56Sopenharmony_ci    {NULL} /* Sentinel */
77657db96d56Sopenharmony_ci};
77667db96d56Sopenharmony_ci
77677db96d56Sopenharmony_cistatic void
77687db96d56Sopenharmony_ciheapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self)
77697db96d56Sopenharmony_ci{
77707db96d56Sopenharmony_ci
77717db96d56Sopenharmony_ci    PyTypeObject *tp = Py_TYPE(self);
77727db96d56Sopenharmony_ci    if (self->weakreflist != NULL)
77737db96d56Sopenharmony_ci        PyObject_ClearWeakRefs((PyObject *) self);
77747db96d56Sopenharmony_ci    Py_XDECREF(self->weakreflist);
77757db96d56Sopenharmony_ci    PyObject_Free(self);
77767db96d56Sopenharmony_ci    Py_DECREF(tp);
77777db96d56Sopenharmony_ci}
77787db96d56Sopenharmony_ci
77797db96d56Sopenharmony_cistatic PyType_Slot HeapCTypeWithWeakref_slots[] = {
77807db96d56Sopenharmony_ci    {Py_tp_members, heapctypewithweakref_members},
77817db96d56Sopenharmony_ci    {Py_tp_dealloc, heapctypewithweakref_dealloc},
77827db96d56Sopenharmony_ci    {0, 0},
77837db96d56Sopenharmony_ci};
77847db96d56Sopenharmony_ci
77857db96d56Sopenharmony_cistatic PyType_Spec HeapCTypeWithWeakref_spec = {
77867db96d56Sopenharmony_ci    "_testcapi.HeapCTypeWithWeakref",
77877db96d56Sopenharmony_ci    sizeof(HeapCTypeWithWeakrefObject),
77887db96d56Sopenharmony_ci    0,
77897db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
77907db96d56Sopenharmony_ci    HeapCTypeWithWeakref_slots
77917db96d56Sopenharmony_ci};
77927db96d56Sopenharmony_ci
77937db96d56Sopenharmony_cistatic PyType_Spec HeapCTypeWithWeakref2_spec = {
77947db96d56Sopenharmony_ci    "_testcapi.HeapCTypeWithWeakref2",
77957db96d56Sopenharmony_ci    sizeof(HeapCTypeWithWeakrefObject),
77967db96d56Sopenharmony_ci    0,
77977db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
77987db96d56Sopenharmony_ci    HeapCTypeWithWeakref_slots
77997db96d56Sopenharmony_ci};
78007db96d56Sopenharmony_ci
78017db96d56Sopenharmony_ciPyDoc_STRVAR(heapctypesetattr__doc__,
78027db96d56Sopenharmony_ci"A heap type without GC, but with overridden __setattr__.\n\n"
78037db96d56Sopenharmony_ci"The 'value' attribute is set to 10 in __init__ and updated via attribute setting.");
78047db96d56Sopenharmony_ci
78057db96d56Sopenharmony_citypedef struct {
78067db96d56Sopenharmony_ci    PyObject_HEAD
78077db96d56Sopenharmony_ci    long value;
78087db96d56Sopenharmony_ci} HeapCTypeSetattrObject;
78097db96d56Sopenharmony_ci
78107db96d56Sopenharmony_cistatic struct PyMemberDef heapctypesetattr_members[] = {
78117db96d56Sopenharmony_ci    {"pvalue", T_LONG, offsetof(HeapCTypeSetattrObject, value)},
78127db96d56Sopenharmony_ci    {NULL} /* Sentinel */
78137db96d56Sopenharmony_ci};
78147db96d56Sopenharmony_ci
78157db96d56Sopenharmony_cistatic int
78167db96d56Sopenharmony_ciheapctypesetattr_init(PyObject *self, PyObject *args, PyObject *kwargs)
78177db96d56Sopenharmony_ci{
78187db96d56Sopenharmony_ci    ((HeapCTypeSetattrObject *)self)->value = 10;
78197db96d56Sopenharmony_ci    return 0;
78207db96d56Sopenharmony_ci}
78217db96d56Sopenharmony_ci
78227db96d56Sopenharmony_cistatic void
78237db96d56Sopenharmony_ciheapctypesetattr_dealloc(HeapCTypeSetattrObject *self)
78247db96d56Sopenharmony_ci{
78257db96d56Sopenharmony_ci    PyTypeObject *tp = Py_TYPE(self);
78267db96d56Sopenharmony_ci    PyObject_Free(self);
78277db96d56Sopenharmony_ci    Py_DECREF(tp);
78287db96d56Sopenharmony_ci}
78297db96d56Sopenharmony_ci
78307db96d56Sopenharmony_cistatic int
78317db96d56Sopenharmony_ciheapctypesetattr_setattro(HeapCTypeSetattrObject *self, PyObject *attr, PyObject *value)
78327db96d56Sopenharmony_ci{
78337db96d56Sopenharmony_ci    PyObject *svalue = PyUnicode_FromString("value");
78347db96d56Sopenharmony_ci    if (svalue == NULL)
78357db96d56Sopenharmony_ci        return -1;
78367db96d56Sopenharmony_ci    int eq = PyObject_RichCompareBool(svalue, attr, Py_EQ);
78377db96d56Sopenharmony_ci    Py_DECREF(svalue);
78387db96d56Sopenharmony_ci    if (eq < 0)
78397db96d56Sopenharmony_ci        return -1;
78407db96d56Sopenharmony_ci    if (!eq) {
78417db96d56Sopenharmony_ci        return PyObject_GenericSetAttr((PyObject*) self, attr, value);
78427db96d56Sopenharmony_ci    }
78437db96d56Sopenharmony_ci    if (value == NULL) {
78447db96d56Sopenharmony_ci        self->value = 0;
78457db96d56Sopenharmony_ci        return 0;
78467db96d56Sopenharmony_ci    }
78477db96d56Sopenharmony_ci    PyObject *ivalue = PyNumber_Long(value);
78487db96d56Sopenharmony_ci    if (ivalue == NULL)
78497db96d56Sopenharmony_ci        return -1;
78507db96d56Sopenharmony_ci    long v = PyLong_AsLong(ivalue);
78517db96d56Sopenharmony_ci    Py_DECREF(ivalue);
78527db96d56Sopenharmony_ci    if (v == -1 && PyErr_Occurred())
78537db96d56Sopenharmony_ci        return -1;
78547db96d56Sopenharmony_ci    self->value = v;
78557db96d56Sopenharmony_ci    return 0;
78567db96d56Sopenharmony_ci}
78577db96d56Sopenharmony_ci
78587db96d56Sopenharmony_cistatic PyType_Slot HeapCTypeSetattr_slots[] = {
78597db96d56Sopenharmony_ci    {Py_tp_init, heapctypesetattr_init},
78607db96d56Sopenharmony_ci    {Py_tp_members, heapctypesetattr_members},
78617db96d56Sopenharmony_ci    {Py_tp_setattro, heapctypesetattr_setattro},
78627db96d56Sopenharmony_ci    {Py_tp_dealloc, heapctypesetattr_dealloc},
78637db96d56Sopenharmony_ci    {Py_tp_doc, (char*)heapctypesetattr__doc__},
78647db96d56Sopenharmony_ci    {0, 0},
78657db96d56Sopenharmony_ci};
78667db96d56Sopenharmony_ci
78677db96d56Sopenharmony_cistatic PyType_Spec HeapCTypeSetattr_spec = {
78687db96d56Sopenharmony_ci    "_testcapi.HeapCTypeSetattr",
78697db96d56Sopenharmony_ci    sizeof(HeapCTypeSetattrObject),
78707db96d56Sopenharmony_ci    0,
78717db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
78727db96d56Sopenharmony_ci    HeapCTypeSetattr_slots
78737db96d56Sopenharmony_ci};
78747db96d56Sopenharmony_ci
78757db96d56Sopenharmony_cistatic PyMethodDef meth_instance_methods[] = {
78767db96d56Sopenharmony_ci    {"meth_varargs", meth_varargs, METH_VARARGS},
78777db96d56Sopenharmony_ci    {"meth_varargs_keywords", _PyCFunction_CAST(meth_varargs_keywords), METH_VARARGS|METH_KEYWORDS},
78787db96d56Sopenharmony_ci    {"meth_o", meth_o, METH_O},
78797db96d56Sopenharmony_ci    {"meth_noargs", meth_noargs, METH_NOARGS},
78807db96d56Sopenharmony_ci    {"meth_fastcall", _PyCFunction_CAST(meth_fastcall), METH_FASTCALL},
78817db96d56Sopenharmony_ci    {"meth_fastcall_keywords", _PyCFunction_CAST(meth_fastcall_keywords), METH_FASTCALL|METH_KEYWORDS},
78827db96d56Sopenharmony_ci    {NULL, NULL} /* sentinel */
78837db96d56Sopenharmony_ci};
78847db96d56Sopenharmony_ci
78857db96d56Sopenharmony_ci
78867db96d56Sopenharmony_cistatic PyTypeObject MethInstance_Type = {
78877db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
78887db96d56Sopenharmony_ci    "MethInstance",
78897db96d56Sopenharmony_ci    sizeof(PyObject),
78907db96d56Sopenharmony_ci    .tp_new = PyType_GenericNew,
78917db96d56Sopenharmony_ci    .tp_flags = Py_TPFLAGS_DEFAULT,
78927db96d56Sopenharmony_ci    .tp_methods = meth_instance_methods,
78937db96d56Sopenharmony_ci    .tp_doc = (char*)PyDoc_STR(
78947db96d56Sopenharmony_ci        "Class with normal (instance) methods to test calling conventions"),
78957db96d56Sopenharmony_ci};
78967db96d56Sopenharmony_ci
78977db96d56Sopenharmony_cistatic PyMethodDef meth_class_methods[] = {
78987db96d56Sopenharmony_ci    {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS},
78997db96d56Sopenharmony_ci    {"meth_varargs_keywords", _PyCFunction_CAST(meth_varargs_keywords), METH_VARARGS|METH_KEYWORDS|METH_CLASS},
79007db96d56Sopenharmony_ci    {"meth_o", meth_o, METH_O|METH_CLASS},
79017db96d56Sopenharmony_ci    {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS},
79027db96d56Sopenharmony_ci    {"meth_fastcall", _PyCFunction_CAST(meth_fastcall), METH_FASTCALL|METH_CLASS},
79037db96d56Sopenharmony_ci    {"meth_fastcall_keywords", _PyCFunction_CAST(meth_fastcall_keywords), METH_FASTCALL|METH_KEYWORDS|METH_CLASS},
79047db96d56Sopenharmony_ci    {NULL, NULL} /* sentinel */
79057db96d56Sopenharmony_ci};
79067db96d56Sopenharmony_ci
79077db96d56Sopenharmony_ci
79087db96d56Sopenharmony_cistatic PyTypeObject MethClass_Type = {
79097db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
79107db96d56Sopenharmony_ci    "MethClass",
79117db96d56Sopenharmony_ci    sizeof(PyObject),
79127db96d56Sopenharmony_ci    .tp_new = PyType_GenericNew,
79137db96d56Sopenharmony_ci    .tp_flags = Py_TPFLAGS_DEFAULT,
79147db96d56Sopenharmony_ci    .tp_methods = meth_class_methods,
79157db96d56Sopenharmony_ci    .tp_doc = PyDoc_STR(
79167db96d56Sopenharmony_ci        "Class with class methods to test calling conventions"),
79177db96d56Sopenharmony_ci};
79187db96d56Sopenharmony_ci
79197db96d56Sopenharmony_cistatic PyMethodDef meth_static_methods[] = {
79207db96d56Sopenharmony_ci    {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC},
79217db96d56Sopenharmony_ci    {"meth_varargs_keywords", _PyCFunction_CAST(meth_varargs_keywords), METH_VARARGS|METH_KEYWORDS|METH_STATIC},
79227db96d56Sopenharmony_ci    {"meth_o", meth_o, METH_O|METH_STATIC},
79237db96d56Sopenharmony_ci    {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC},
79247db96d56Sopenharmony_ci    {"meth_fastcall", _PyCFunction_CAST(meth_fastcall), METH_FASTCALL|METH_STATIC},
79257db96d56Sopenharmony_ci    {"meth_fastcall_keywords", _PyCFunction_CAST(meth_fastcall_keywords), METH_FASTCALL|METH_KEYWORDS|METH_STATIC},
79267db96d56Sopenharmony_ci    {NULL, NULL} /* sentinel */
79277db96d56Sopenharmony_ci};
79287db96d56Sopenharmony_ci
79297db96d56Sopenharmony_ci
79307db96d56Sopenharmony_cistatic PyTypeObject MethStatic_Type = {
79317db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
79327db96d56Sopenharmony_ci    "MethStatic",
79337db96d56Sopenharmony_ci    sizeof(PyObject),
79347db96d56Sopenharmony_ci    .tp_new = PyType_GenericNew,
79357db96d56Sopenharmony_ci    .tp_flags = Py_TPFLAGS_DEFAULT,
79367db96d56Sopenharmony_ci    .tp_methods = meth_static_methods,
79377db96d56Sopenharmony_ci    .tp_doc = PyDoc_STR(
79387db96d56Sopenharmony_ci        "Class with static methods to test calling conventions"),
79397db96d56Sopenharmony_ci};
79407db96d56Sopenharmony_ci
79417db96d56Sopenharmony_ci/* ContainerNoGC -- a simple container without GC methods */
79427db96d56Sopenharmony_ci
79437db96d56Sopenharmony_citypedef struct {
79447db96d56Sopenharmony_ci    PyObject_HEAD
79457db96d56Sopenharmony_ci    PyObject *value;
79467db96d56Sopenharmony_ci} ContainerNoGCobject;
79477db96d56Sopenharmony_ci
79487db96d56Sopenharmony_cistatic PyObject *
79497db96d56Sopenharmony_ciContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
79507db96d56Sopenharmony_ci{
79517db96d56Sopenharmony_ci    PyObject *value;
79527db96d56Sopenharmony_ci    char *names[] = {"value", NULL};
79537db96d56Sopenharmony_ci    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) {
79547db96d56Sopenharmony_ci        return NULL;
79557db96d56Sopenharmony_ci    }
79567db96d56Sopenharmony_ci    PyObject *self = type->tp_alloc(type, 0);
79577db96d56Sopenharmony_ci    if (self == NULL) {
79587db96d56Sopenharmony_ci        return NULL;
79597db96d56Sopenharmony_ci    }
79607db96d56Sopenharmony_ci    Py_INCREF(value);
79617db96d56Sopenharmony_ci    ((ContainerNoGCobject *)self)->value = value;
79627db96d56Sopenharmony_ci    return self;
79637db96d56Sopenharmony_ci}
79647db96d56Sopenharmony_ci
79657db96d56Sopenharmony_cistatic void
79667db96d56Sopenharmony_ciContainerNoGC_dealloc(ContainerNoGCobject *self)
79677db96d56Sopenharmony_ci{
79687db96d56Sopenharmony_ci    Py_DECREF(self->value);
79697db96d56Sopenharmony_ci    Py_TYPE(self)->tp_free((PyObject *)self);
79707db96d56Sopenharmony_ci}
79717db96d56Sopenharmony_ci
79727db96d56Sopenharmony_cistatic PyMemberDef ContainerNoGC_members[] = {
79737db96d56Sopenharmony_ci    {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY,
79747db96d56Sopenharmony_ci     PyDoc_STR("a container value for test purposes")},
79757db96d56Sopenharmony_ci    {0}
79767db96d56Sopenharmony_ci};
79777db96d56Sopenharmony_ci
79787db96d56Sopenharmony_cistatic PyTypeObject ContainerNoGC_type = {
79797db96d56Sopenharmony_ci    PyVarObject_HEAD_INIT(NULL, 0)
79807db96d56Sopenharmony_ci    "_testcapi.ContainerNoGC",
79817db96d56Sopenharmony_ci    sizeof(ContainerNoGCobject),
79827db96d56Sopenharmony_ci    .tp_dealloc = (destructor)ContainerNoGC_dealloc,
79837db96d56Sopenharmony_ci    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
79847db96d56Sopenharmony_ci    .tp_members = ContainerNoGC_members,
79857db96d56Sopenharmony_ci    .tp_new = ContainerNoGC_new,
79867db96d56Sopenharmony_ci};
79877db96d56Sopenharmony_ci
79887db96d56Sopenharmony_ci
79897db96d56Sopenharmony_cistatic struct PyModuleDef _testcapimodule = {
79907db96d56Sopenharmony_ci    PyModuleDef_HEAD_INIT,
79917db96d56Sopenharmony_ci    "_testcapi",
79927db96d56Sopenharmony_ci    NULL,
79937db96d56Sopenharmony_ci    -1,
79947db96d56Sopenharmony_ci    TestMethods,
79957db96d56Sopenharmony_ci    NULL,
79967db96d56Sopenharmony_ci    NULL,
79977db96d56Sopenharmony_ci    NULL,
79987db96d56Sopenharmony_ci    NULL
79997db96d56Sopenharmony_ci};
80007db96d56Sopenharmony_ci
80017db96d56Sopenharmony_ci/* Per PEP 489, this module will not be converted to multi-phase initialization
80027db96d56Sopenharmony_ci */
80037db96d56Sopenharmony_ci
80047db96d56Sopenharmony_ciPyMODINIT_FUNC
80057db96d56Sopenharmony_ciPyInit__testcapi(void)
80067db96d56Sopenharmony_ci{
80077db96d56Sopenharmony_ci    PyObject *m;
80087db96d56Sopenharmony_ci
80097db96d56Sopenharmony_ci    m = PyModule_Create(&_testcapimodule);
80107db96d56Sopenharmony_ci    if (m == NULL)
80117db96d56Sopenharmony_ci        return NULL;
80127db96d56Sopenharmony_ci
80137db96d56Sopenharmony_ci    Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type);
80147db96d56Sopenharmony_ci
80157db96d56Sopenharmony_ci    Py_SET_TYPE(&test_structmembersType, &PyType_Type);
80167db96d56Sopenharmony_ci    Py_INCREF(&test_structmembersType);
80177db96d56Sopenharmony_ci    /* don't use a name starting with "test", since we don't want
80187db96d56Sopenharmony_ci       test_capi to automatically call this */
80197db96d56Sopenharmony_ci    PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
80207db96d56Sopenharmony_ci    if (PyType_Ready(&matmulType) < 0)
80217db96d56Sopenharmony_ci        return NULL;
80227db96d56Sopenharmony_ci    Py_INCREF(&matmulType);
80237db96d56Sopenharmony_ci    PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
80247db96d56Sopenharmony_ci    if (PyType_Ready(&ipowType) < 0) {
80257db96d56Sopenharmony_ci        return NULL;
80267db96d56Sopenharmony_ci    }
80277db96d56Sopenharmony_ci    Py_INCREF(&ipowType);
80287db96d56Sopenharmony_ci    PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
80297db96d56Sopenharmony_ci
80307db96d56Sopenharmony_ci    if (PyType_Ready(&awaitType) < 0)
80317db96d56Sopenharmony_ci        return NULL;
80327db96d56Sopenharmony_ci    Py_INCREF(&awaitType);
80337db96d56Sopenharmony_ci    PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
80347db96d56Sopenharmony_ci
80357db96d56Sopenharmony_ci    MyList_Type.tp_base = &PyList_Type;
80367db96d56Sopenharmony_ci    if (PyType_Ready(&MyList_Type) < 0)
80377db96d56Sopenharmony_ci        return NULL;
80387db96d56Sopenharmony_ci    Py_INCREF(&MyList_Type);
80397db96d56Sopenharmony_ci    PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
80407db96d56Sopenharmony_ci
80417db96d56Sopenharmony_ci    if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
80427db96d56Sopenharmony_ci        return NULL;
80437db96d56Sopenharmony_ci    Py_INCREF(&MethodDescriptorBase_Type);
80447db96d56Sopenharmony_ci    PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
80457db96d56Sopenharmony_ci
80467db96d56Sopenharmony_ci    MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
80477db96d56Sopenharmony_ci    if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
80487db96d56Sopenharmony_ci        return NULL;
80497db96d56Sopenharmony_ci    Py_INCREF(&MethodDescriptorDerived_Type);
80507db96d56Sopenharmony_ci    PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
80517db96d56Sopenharmony_ci
80527db96d56Sopenharmony_ci    MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
80537db96d56Sopenharmony_ci    if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
80547db96d56Sopenharmony_ci        return NULL;
80557db96d56Sopenharmony_ci    Py_INCREF(&MethodDescriptorNopGet_Type);
80567db96d56Sopenharmony_ci    PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
80577db96d56Sopenharmony_ci
80587db96d56Sopenharmony_ci    MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
80597db96d56Sopenharmony_ci    if (PyType_Ready(&MethodDescriptor2_Type) < 0)
80607db96d56Sopenharmony_ci        return NULL;
80617db96d56Sopenharmony_ci    Py_INCREF(&MethodDescriptor2_Type);
80627db96d56Sopenharmony_ci    PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
80637db96d56Sopenharmony_ci
80647db96d56Sopenharmony_ci    if (PyType_Ready(&GenericAlias_Type) < 0)
80657db96d56Sopenharmony_ci        return NULL;
80667db96d56Sopenharmony_ci    Py_INCREF(&GenericAlias_Type);
80677db96d56Sopenharmony_ci    PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
80687db96d56Sopenharmony_ci
80697db96d56Sopenharmony_ci    if (PyType_Ready(&Generic_Type) < 0)
80707db96d56Sopenharmony_ci        return NULL;
80717db96d56Sopenharmony_ci    Py_INCREF(&Generic_Type);
80727db96d56Sopenharmony_ci    PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
80737db96d56Sopenharmony_ci
80747db96d56Sopenharmony_ci    if (PyType_Ready(&MethInstance_Type) < 0)
80757db96d56Sopenharmony_ci        return NULL;
80767db96d56Sopenharmony_ci    Py_INCREF(&MethInstance_Type);
80777db96d56Sopenharmony_ci    PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type);
80787db96d56Sopenharmony_ci
80797db96d56Sopenharmony_ci    if (PyType_Ready(&MethClass_Type) < 0)
80807db96d56Sopenharmony_ci        return NULL;
80817db96d56Sopenharmony_ci    Py_INCREF(&MethClass_Type);
80827db96d56Sopenharmony_ci    PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type);
80837db96d56Sopenharmony_ci
80847db96d56Sopenharmony_ci    if (PyType_Ready(&MethStatic_Type) < 0)
80857db96d56Sopenharmony_ci        return NULL;
80867db96d56Sopenharmony_ci    Py_INCREF(&MethStatic_Type);
80877db96d56Sopenharmony_ci    PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type);
80887db96d56Sopenharmony_ci
80897db96d56Sopenharmony_ci    PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
80907db96d56Sopenharmony_ci    if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
80917db96d56Sopenharmony_ci        return NULL;
80927db96d56Sopenharmony_ci    }
80937db96d56Sopenharmony_ci    Py_INCREF(&PyRecursingInfinitelyError_Type);
80947db96d56Sopenharmony_ci    PyModule_AddObject(m, "RecursingInfinitelyError",
80957db96d56Sopenharmony_ci                       (PyObject *)&PyRecursingInfinitelyError_Type);
80967db96d56Sopenharmony_ci
80977db96d56Sopenharmony_ci    PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
80987db96d56Sopenharmony_ci    PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
80997db96d56Sopenharmony_ci    PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
81007db96d56Sopenharmony_ci    PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
81017db96d56Sopenharmony_ci    PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
81027db96d56Sopenharmony_ci    PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
81037db96d56Sopenharmony_ci    PyModule_AddObject(m, "INT_MAX",  PyLong_FromLong(INT_MAX));
81047db96d56Sopenharmony_ci    PyModule_AddObject(m, "INT_MIN",  PyLong_FromLong(INT_MIN));
81057db96d56Sopenharmony_ci    PyModule_AddObject(m, "UINT_MAX",  PyLong_FromUnsignedLong(UINT_MAX));
81067db96d56Sopenharmony_ci    PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
81077db96d56Sopenharmony_ci    PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
81087db96d56Sopenharmony_ci    PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
81097db96d56Sopenharmony_ci    PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
81107db96d56Sopenharmony_ci    PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
81117db96d56Sopenharmony_ci    PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
81127db96d56Sopenharmony_ci    PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
81137db96d56Sopenharmony_ci    PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX));
81147db96d56Sopenharmony_ci    PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN));
81157db96d56Sopenharmony_ci    PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX));
81167db96d56Sopenharmony_ci    PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
81177db96d56Sopenharmony_ci    PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
81187db96d56Sopenharmony_ci    PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
81197db96d56Sopenharmony_ci    PyModule_AddObject(m, "Py_Version", PyLong_FromUnsignedLong(Py_Version));
81207db96d56Sopenharmony_ci    Py_INCREF(&PyInstanceMethod_Type);
81217db96d56Sopenharmony_ci    PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
81227db96d56Sopenharmony_ci
81237db96d56Sopenharmony_ci    PyModule_AddIntConstant(m, "the_number_three", 3);
81247db96d56Sopenharmony_ci    PyObject *v;
81257db96d56Sopenharmony_ci#ifdef WITH_PYMALLOC
81267db96d56Sopenharmony_ci    v = Py_True;
81277db96d56Sopenharmony_ci#else
81287db96d56Sopenharmony_ci    v = Py_False;
81297db96d56Sopenharmony_ci#endif
81307db96d56Sopenharmony_ci    Py_INCREF(v);
81317db96d56Sopenharmony_ci    PyModule_AddObject(m, "WITH_PYMALLOC", v);
81327db96d56Sopenharmony_ci
81337db96d56Sopenharmony_ci    TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
81347db96d56Sopenharmony_ci    Py_INCREF(TestError);
81357db96d56Sopenharmony_ci    PyModule_AddObject(m, "error", TestError);
81367db96d56Sopenharmony_ci
81377db96d56Sopenharmony_ci    PyObject *HeapDocCType = PyType_FromSpec(&HeapDocCType_spec);
81387db96d56Sopenharmony_ci    if (HeapDocCType == NULL) {
81397db96d56Sopenharmony_ci        return NULL;
81407db96d56Sopenharmony_ci    }
81417db96d56Sopenharmony_ci    PyModule_AddObject(m, "HeapDocCType", HeapDocCType);
81427db96d56Sopenharmony_ci
81437db96d56Sopenharmony_ci    /* bpo-41832: Add a new type to test PyType_FromSpec()
81447db96d56Sopenharmony_ci       now can accept a NULL tp_doc slot. */
81457db96d56Sopenharmony_ci    PyObject *NullTpDocType = PyType_FromSpec(&NullTpDocType_spec);
81467db96d56Sopenharmony_ci    if (NullTpDocType == NULL) {
81477db96d56Sopenharmony_ci        return NULL;
81487db96d56Sopenharmony_ci    }
81497db96d56Sopenharmony_ci    PyModule_AddObject(m, "NullTpDocType", NullTpDocType);
81507db96d56Sopenharmony_ci
81517db96d56Sopenharmony_ci    PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
81527db96d56Sopenharmony_ci    if (HeapGcCType == NULL) {
81537db96d56Sopenharmony_ci        return NULL;
81547db96d56Sopenharmony_ci    }
81557db96d56Sopenharmony_ci    PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
81567db96d56Sopenharmony_ci
81577db96d56Sopenharmony_ci    PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
81587db96d56Sopenharmony_ci    if (HeapCType == NULL) {
81597db96d56Sopenharmony_ci        return NULL;
81607db96d56Sopenharmony_ci    }
81617db96d56Sopenharmony_ci    PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
81627db96d56Sopenharmony_ci    if (subclass_bases == NULL) {
81637db96d56Sopenharmony_ci        return NULL;
81647db96d56Sopenharmony_ci    }
81657db96d56Sopenharmony_ci    PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
81667db96d56Sopenharmony_ci    if (HeapCTypeSubclass == NULL) {
81677db96d56Sopenharmony_ci        return NULL;
81687db96d56Sopenharmony_ci    }
81697db96d56Sopenharmony_ci    Py_DECREF(subclass_bases);
81707db96d56Sopenharmony_ci    PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
81717db96d56Sopenharmony_ci
81727db96d56Sopenharmony_ci    PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec);
81737db96d56Sopenharmony_ci    if (HeapCTypeWithDict == NULL) {
81747db96d56Sopenharmony_ci        return NULL;
81757db96d56Sopenharmony_ci    }
81767db96d56Sopenharmony_ci    PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict);
81777db96d56Sopenharmony_ci
81787db96d56Sopenharmony_ci    PyObject *HeapCTypeWithDict2 = PyType_FromSpec(&HeapCTypeWithDict2_spec);
81797db96d56Sopenharmony_ci    if (HeapCTypeWithDict2 == NULL) {
81807db96d56Sopenharmony_ci        return NULL;
81817db96d56Sopenharmony_ci    }
81827db96d56Sopenharmony_ci    PyModule_AddObject(m, "HeapCTypeWithDict2", HeapCTypeWithDict2);
81837db96d56Sopenharmony_ci
81847db96d56Sopenharmony_ci    PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
81857db96d56Sopenharmony_ci    if (HeapCTypeWithNegativeDict == NULL) {
81867db96d56Sopenharmony_ci        return NULL;
81877db96d56Sopenharmony_ci    }
81887db96d56Sopenharmony_ci    PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict);
81897db96d56Sopenharmony_ci
81907db96d56Sopenharmony_ci    PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec);
81917db96d56Sopenharmony_ci    if (HeapCTypeWithWeakref == NULL) {
81927db96d56Sopenharmony_ci        return NULL;
81937db96d56Sopenharmony_ci    }
81947db96d56Sopenharmony_ci    PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref);
81957db96d56Sopenharmony_ci
81967db96d56Sopenharmony_ci    PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec);
81977db96d56Sopenharmony_ci    if (HeapCTypeWithBuffer == NULL) {
81987db96d56Sopenharmony_ci        return NULL;
81997db96d56Sopenharmony_ci    }
82007db96d56Sopenharmony_ci    PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer);
82017db96d56Sopenharmony_ci
82027db96d56Sopenharmony_ci    PyObject *HeapCTypeWithWeakref2 = PyType_FromSpec(&HeapCTypeWithWeakref2_spec);
82037db96d56Sopenharmony_ci    if (HeapCTypeWithWeakref2 == NULL) {
82047db96d56Sopenharmony_ci        return NULL;
82057db96d56Sopenharmony_ci    }
82067db96d56Sopenharmony_ci    PyModule_AddObject(m, "HeapCTypeWithWeakref2", HeapCTypeWithWeakref2);
82077db96d56Sopenharmony_ci
82087db96d56Sopenharmony_ci    PyObject *HeapCTypeSetattr = PyType_FromSpec(&HeapCTypeSetattr_spec);
82097db96d56Sopenharmony_ci    if (HeapCTypeSetattr == NULL) {
82107db96d56Sopenharmony_ci        return NULL;
82117db96d56Sopenharmony_ci    }
82127db96d56Sopenharmony_ci    PyModule_AddObject(m, "HeapCTypeSetattr", HeapCTypeSetattr);
82137db96d56Sopenharmony_ci
82147db96d56Sopenharmony_ci    PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
82157db96d56Sopenharmony_ci    if (subclass_with_finalizer_bases == NULL) {
82167db96d56Sopenharmony_ci        return NULL;
82177db96d56Sopenharmony_ci    }
82187db96d56Sopenharmony_ci    PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
82197db96d56Sopenharmony_ci        &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
82207db96d56Sopenharmony_ci    if (HeapCTypeSubclassWithFinalizer == NULL) {
82217db96d56Sopenharmony_ci        return NULL;
82227db96d56Sopenharmony_ci    }
82237db96d56Sopenharmony_ci    Py_DECREF(subclass_with_finalizer_bases);
82247db96d56Sopenharmony_ci    PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
82257db96d56Sopenharmony_ci
82267db96d56Sopenharmony_ci    if (PyType_Ready(&ContainerNoGC_type) < 0) {
82277db96d56Sopenharmony_ci        return NULL;
82287db96d56Sopenharmony_ci    }
82297db96d56Sopenharmony_ci    Py_INCREF(&ContainerNoGC_type);
82307db96d56Sopenharmony_ci    if (PyModule_AddObject(m, "ContainerNoGC",
82317db96d56Sopenharmony_ci                           (PyObject *) &ContainerNoGC_type) < 0)
82327db96d56Sopenharmony_ci        return NULL;
82337db96d56Sopenharmony_ci
82347db96d56Sopenharmony_ci    PyState_AddModule(m, &_testcapimodule);
82357db96d56Sopenharmony_ci    return m;
82367db96d56Sopenharmony_ci}
82377db96d56Sopenharmony_ci
82387db96d56Sopenharmony_cistatic PyObject *
82397db96d56Sopenharmony_cinegative_dictoffset(PyObject *self, PyObject *Py_UNUSED(ignored))
82407db96d56Sopenharmony_ci{
82417db96d56Sopenharmony_ci    return PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
82427db96d56Sopenharmony_ci}
82437db96d56Sopenharmony_ci
82447db96d56Sopenharmony_ci/* Test the C API exposed when PY_SSIZE_T_CLEAN is not defined */
82457db96d56Sopenharmony_ci
82467db96d56Sopenharmony_ci#undef Py_BuildValue
82477db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
82487db96d56Sopenharmony_ci
82497db96d56Sopenharmony_cistatic PyObject *
82507db96d56Sopenharmony_citest_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
82517db96d56Sopenharmony_ci{
82527db96d56Sopenharmony_ci    PyObject *res;
82537db96d56Sopenharmony_ci    const char str[] = "string";
82547db96d56Sopenharmony_ci    const Py_UNICODE unicode[] = L"unicode";
82557db96d56Sopenharmony_ci    assert(!PyErr_Occurred());
82567db96d56Sopenharmony_ci
82577db96d56Sopenharmony_ci    res = Py_BuildValue("(s#O)", str, 1, Py_None);
82587db96d56Sopenharmony_ci    assert(res == NULL);
82597db96d56Sopenharmony_ci    if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
82607db96d56Sopenharmony_ci        return NULL;
82617db96d56Sopenharmony_ci    }
82627db96d56Sopenharmony_ci    PyErr_Clear();
82637db96d56Sopenharmony_ci
82647db96d56Sopenharmony_ci    res = Py_BuildValue("(z#O)", str, 1, Py_None);
82657db96d56Sopenharmony_ci    assert(res == NULL);
82667db96d56Sopenharmony_ci    if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
82677db96d56Sopenharmony_ci        return NULL;
82687db96d56Sopenharmony_ci    }
82697db96d56Sopenharmony_ci    PyErr_Clear();
82707db96d56Sopenharmony_ci
82717db96d56Sopenharmony_ci    res = Py_BuildValue("(y#O)", str, 1, Py_None);
82727db96d56Sopenharmony_ci    assert(res == NULL);
82737db96d56Sopenharmony_ci    if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
82747db96d56Sopenharmony_ci        return NULL;
82757db96d56Sopenharmony_ci    }
82767db96d56Sopenharmony_ci    PyErr_Clear();
82777db96d56Sopenharmony_ci
82787db96d56Sopenharmony_ci    res = Py_BuildValue("(u#O)", unicode, 1, Py_None);
82797db96d56Sopenharmony_ci    assert(res == NULL);
82807db96d56Sopenharmony_ci    if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
82817db96d56Sopenharmony_ci        return NULL;
82827db96d56Sopenharmony_ci    }
82837db96d56Sopenharmony_ci    PyErr_Clear();
82847db96d56Sopenharmony_ci
82857db96d56Sopenharmony_ci
82867db96d56Sopenharmony_ci    Py_RETURN_NONE;
82877db96d56Sopenharmony_ci}
82887db96d56Sopenharmony_ci
82897db96d56Sopenharmony_ci#undef PyArg_ParseTupleAndKeywords
82907db96d56Sopenharmony_ciPyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
82917db96d56Sopenharmony_ci                                            const char *, char **, ...);
82927db96d56Sopenharmony_ci
82937db96d56Sopenharmony_cistatic PyObject *
82947db96d56Sopenharmony_cigetargs_s_hash_int(PyObject *self, PyObject *args, PyObject *kwargs)
82957db96d56Sopenharmony_ci{
82967db96d56Sopenharmony_ci    static char *keywords[] = {"", "", "x", NULL};
82977db96d56Sopenharmony_ci    Py_buffer buf = {NULL};
82987db96d56Sopenharmony_ci    const char *s;
82997db96d56Sopenharmony_ci    int len;
83007db96d56Sopenharmony_ci    int i = 0;
83017db96d56Sopenharmony_ci    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "w*|s#i", keywords, &buf, &s, &len, &i))
83027db96d56Sopenharmony_ci        return NULL;
83037db96d56Sopenharmony_ci    PyBuffer_Release(&buf);
83047db96d56Sopenharmony_ci    Py_RETURN_NONE;
83057db96d56Sopenharmony_ci}
83067db96d56Sopenharmony_ci
83077db96d56Sopenharmony_cistatic PyObject *
83087db96d56Sopenharmony_cigetargs_s_hash_int2(PyObject *self, PyObject *args, PyObject *kwargs)
83097db96d56Sopenharmony_ci{
83107db96d56Sopenharmony_ci    static char *keywords[] = {"", "", "x", NULL};
83117db96d56Sopenharmony_ci    Py_buffer buf = {NULL};
83127db96d56Sopenharmony_ci    const char *s;
83137db96d56Sopenharmony_ci    int len;
83147db96d56Sopenharmony_ci    int i = 0;
83157db96d56Sopenharmony_ci    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "w*|(s#)i", keywords, &buf, &s, &len, &i))
83167db96d56Sopenharmony_ci        return NULL;
83177db96d56Sopenharmony_ci    PyBuffer_Release(&buf);
83187db96d56Sopenharmony_ci    Py_RETURN_NONE;
83197db96d56Sopenharmony_ci}
83207db96d56Sopenharmony_ci
83217db96d56Sopenharmony_cistatic PyObject *
83227db96d56Sopenharmony_cigh_99240_clear_args(PyObject *self, PyObject *args)
83237db96d56Sopenharmony_ci{
83247db96d56Sopenharmony_ci    char *a = NULL;
83257db96d56Sopenharmony_ci    char *b = NULL;
83267db96d56Sopenharmony_ci
83277db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "eses", "idna", &a, "idna", &b)) {
83287db96d56Sopenharmony_ci        if (a || b) {
83297db96d56Sopenharmony_ci            PyErr_Clear();
83307db96d56Sopenharmony_ci            PyErr_SetString(PyExc_AssertionError, "Arguments are not cleared.");
83317db96d56Sopenharmony_ci        }
83327db96d56Sopenharmony_ci        return NULL;
83337db96d56Sopenharmony_ci    }
83347db96d56Sopenharmony_ci    PyMem_Free(a);
83357db96d56Sopenharmony_ci    PyMem_Free(b);
83367db96d56Sopenharmony_ci    Py_RETURN_NONE;
83377db96d56Sopenharmony_ci}
8338