14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * C Extension module to test Python interpreter C APIs.
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * The 'test_*' functions exported by this module are run as part of the
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * standard Python regression test, via Lib/test/test_capi.py.
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python.h"
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <float.h>
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "structmember.h"
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "datetime.h"
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "pythread.h"
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* WITH_THREAD */
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *TestError;     /* set to exception object in init */
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Raise TestError with test_name + ": " + msg, and return NULL. */
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmraiseTestError(const char* test_name, const char* msg)
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char buf[2048];
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (strlen(test_name) + strlen(msg) > sizeof(buf) - 50)
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(TestError, "internal error msg too large");
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyOS_snprintf(buf, sizeof(buf), "%s: %s", test_name, msg);
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(TestError, buf);
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   The ones derived from autoconf on the UNIX-like OSes can be relied
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   upon (in the absence of sloppy cross-compiling), but the Windows
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   platforms have these hardcoded.  Better safe than sorry.
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsizeof_error(const char* fatname, const char* typname,
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int expected, int got)
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char buf[1024];
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyOS_snprintf(buf, sizeof(buf),
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        "%.200s #define == %d but sizeof(%.200s) == %d",
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fatname, expected, typname, got);
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(TestError, buf);
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject*)NULL;
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_config(PyObject *self)
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define CHECK_SIZEOF(FATNAME, TYPE) \
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (FATNAME != sizeof(TYPE)) \
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_SIZEOF(SIZEOF_SHORT, short);
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_SIZEOF(SIZEOF_INT, int);
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_SIZEOF(SIZEOF_LONG, long);
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_SIZEOF(SIZEOF_VOID_P, void*);
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef CHECK_SIZEOF
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_list_api(PyObject *self)
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject* list;
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* SF bug 132008:  PyList_Reverse segfaults */
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define NLIST 30
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    list = PyList_New(NLIST);
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (list == (PyObject*)NULL)
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject*)NULL;
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* list = range(NLIST) */
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < NLIST; ++i) {
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject* anint = PyInt_FromLong(i);
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (anint == (PyObject*)NULL) {
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(list);
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return (PyObject*)NULL;
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyList_SET_ITEM(list, i, anint);
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* list.reverse(), via PyList_Reverse() */
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    i = PyList_Reverse(list);   /* should not blow up! */
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (i != 0) {
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(list);
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return (PyObject*)NULL;
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Check that list == range(29, -1, -1) now */
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < NLIST; ++i) {
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject* anint = PyList_GET_ITEM(list, i);
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyInt_AS_LONG(anint) != NLIST-1-i) {
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(TestError,
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "test_list_api: reverse screwed up");
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(list);
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return (PyObject*)NULL;
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(list);
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef NLIST
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_dict_inner(int count)
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t pos = 0, iterations = 0;
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *dict = PyDict_New();
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v, *k;
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (dict == NULL)
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < count; i++) {
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v = PyInt_FromLong(i);
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyDict_SetItem(dict, v, v);
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(v);
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (PyDict_Next(dict, &pos, &k, &v)) {
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *o;
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        iterations++;
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        i = PyInt_AS_LONG(v) + 1;
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        o = PyInt_FromLong(i);
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (o == NULL)
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyDict_SetItem(dict, k, o) < 0) {
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(o);
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return -1;
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(o);
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(dict);
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (iterations != count) {
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            TestError,
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "test_dict_iteration: dict iteration went wrong ");
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 0;
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_dict_iteration(PyObject* self)
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < 200; i++) {
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (test_dict_inner(i) < 0) {
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Issue #4701: Check that PyObject_Hash implicitly calls
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *   PyType_Ready if it hasn't already been called
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject _HashInheritanceTester_Type = {
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_HEAD_INIT(NULL)
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* Number of items for varobject */
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "hashinheritancetester",            /* Name of this type */
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sizeof(PyObject),           /* Basic object size */
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* Item size for varobject */
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (destructor)PyObject_Del, /* tp_dealloc */
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_print */
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_getattr */
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_setattr */
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_compare */
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_repr */
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_as_number */
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_as_sequence */
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_as_mapping */
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_hash */
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_call */
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_str */
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_GenericGetAttr,  /* tp_getattro */
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_setattro */
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_as_buffer */
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_TPFLAGS_DEFAULT,         /* tp_flags */
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_doc */
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_traverse */
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_clear */
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_richcompare */
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_weaklistoffset */
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_iter */
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_iternext */
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_methods */
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_members */
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_getset */
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_base */
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_dict */
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_descr_get */
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_descr_set */
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_dictoffset */
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_init */
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_alloc */
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyType_GenericNew,                  /* tp_new */
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_lazy_hash_inheritance(PyObject* self)
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyTypeObject *type;
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *obj;
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    long hash;
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    type = &_HashInheritanceTester_Type;
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (type->tp_dict != NULL)
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* The type has already been initialized. This probably means
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           -R is being used. */
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_RETURN_NONE;
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    obj = PyObject_New(PyObject, type);
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (obj == NULL) {
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Clear();
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            TestError,
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "test_lazy_hash_inheritance: failed to create object");
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (type->tp_dict != NULL) {
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            TestError,
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "test_lazy_hash_inheritance: type initialised too soon");
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(obj);
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    hash = PyObject_Hash(obj);
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((hash == -1) && PyErr_Occurred()) {
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Clear();
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            TestError,
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "test_lazy_hash_inheritance: could not hash object");
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(obj);
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (type->tp_dict == NULL) {
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            TestError,
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "test_lazy_hash_inheritance: type not initialised by hash()");
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(obj);
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (type->tp_hash != PyType_Type.tp_hash) {
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            TestError,
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "test_lazy_hash_inheritance: unexpected hash function");
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(obj);
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(obj);
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Issue #7385: Check that memoryview() does not crash
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *   when bf_getbuffer returns an error
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbroken_buffer_getbuffer(PyObject *self, Py_buffer *view, int flags)
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        TestError,
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        "test_broken_memoryview: expected error in bf_getbuffer");
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return -1;
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyBufferProcs memoryviewtester_as_buffer = {
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,          /* bf_getreadbuffer */
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,          /* bf_getwritebuffer */
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,          /* bf_getsegcount */
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,          /* bf_getcharbuffer */
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (getbufferproc)broken_buffer_getbuffer,     /* bf_getbuffer */
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,          /* bf_releasebuffer */
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject _MemoryViewTester_Type = {
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_HEAD_INIT(NULL)
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* Number of items for varobject */
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "memoryviewtester",         /* Name of this type */
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sizeof(PyObject),           /* Basic object size */
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* Item size for varobject */
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    (destructor)PyObject_Del, /* tp_dealloc */
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_print */
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_getattr */
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_setattr */
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_compare */
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_repr */
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_as_number */
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_as_sequence */
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_as_mapping */
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_hash */
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_call */
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_str */
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_GenericGetAttr,  /* tp_getattro */
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_setattro */
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    &memoryviewtester_as_buffer,                        /* tp_as_buffer */
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_NEWBUFFER,     /* tp_flags */
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_doc */
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_traverse */
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_clear */
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_richcompare */
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_weaklistoffset */
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_iter */
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_iternext */
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_methods */
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_members */
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_getset */
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_base */
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_dict */
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_descr_get */
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_descr_set */
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_dictoffset */
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_init */
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                          /* tp_alloc */
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyType_GenericNew,                  /* tp_new */
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_broken_memoryview(PyObject* self)
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *obj = PyObject_New(PyObject, &_MemoryViewTester_Type);
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *res;
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (obj == NULL) {
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Clear();
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            TestError,
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "test_broken_memoryview: failed to create object");
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    res = PyMemoryView_FromObject(obj);
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (res || !PyErr_Occurred()){
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            TestError,
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "test_broken_memoryview: memoryview() didn't raise an Exception");
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_XDECREF(res);
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(obj);
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_Clear();
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(obj);
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   PyLong_{As, From}{Unsigned,}LongLong().
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Note that the meat of the test is contained in testcapi_long.h.
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   This is revolting, but delicate code duplication is worse:  "almost
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   dependence on type names makes it impossible to use a parameterized
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   function.  A giant macro would be even worse than this.  A C++ template
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   would be perfect.
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   The "report an error" functions are deliberately not part of the #include
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   file:  if the test fails, you can set a breakpoint in the appropriate
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   error function directly, and crawl back from there in the debugger.
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define UNBIND(X)  Py_DECREF(X); (X) = NULL
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmraise_test_long_error(const char* msg)
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return raiseTestError("test_long_api", msg);
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define TESTNAME        test_long_api_inner
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define TYPENAME        long
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_S_TO_PY       PyLong_FromLong
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_PY_TO_S       PyLong_AsLong
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_U_TO_PY       PyLong_FromUnsignedLong
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_PY_TO_U       PyLong_AsUnsignedLong
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "testcapi_long.h"
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_long_api(PyObject* self)
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return TESTNAME(raise_test_long_error);
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef TESTNAME
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef TYPENAME
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef F_S_TO_PY
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef F_PY_TO_S
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef F_U_TO_PY
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef F_PY_TO_U
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmraise_test_longlong_error(const char* msg)
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return raiseTestError("test_longlong_api", msg);
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define TESTNAME        test_longlong_api_inner
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define TYPENAME        PY_LONG_LONG
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_S_TO_PY       PyLong_FromLongLong
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_PY_TO_S       PyLong_AsLongLong
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_U_TO_PY       PyLong_FromUnsignedLongLong
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define F_PY_TO_U       PyLong_AsUnsignedLongLong
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "testcapi_long.h"
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_longlong_api(PyObject* self, PyObject *args)
4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return TESTNAME(raise_test_longlong_error);
4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef TESTNAME
4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef TYPENAME
4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef F_S_TO_PY
4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef F_PY_TO_S
4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef F_U_TO_PY
4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef F_PY_TO_U
4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   is tested by test_long_api_inner. This test will concentrate on proper
4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   handling of overflow.
4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_long_and_overflow(PyObject *self)
4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *num, *one, *temp;
4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    long value;
4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int overflow;
4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Test that overflow is set properly for a large value. */
4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* num is a number larger than LONG_MAX even on 64-bit platforms */
4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 1234;
4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongAndOverflow(num, &overflow);
4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != -1)
4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "return value was not set to -1");
4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != 1)
4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was not set to 1");
4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Same again, with num = LONG_MAX + 1 */
4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromLong(LONG_MAX);
4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    one = PyLong_FromLong(1L);
4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (one == NULL) {
4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(num);
4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    temp = PyNumber_Add(num, one);
4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(one);
4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = temp;
4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 0;
5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongAndOverflow(num, &overflow);
5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != -1)
5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "return value was not set to -1");
5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != 1)
5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was not set to 1");
5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Test that overflow is set properly for a large negative value. */
5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* num is a number smaller than LONG_MIN even on 64-bit platforms */
5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 1234;
5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongAndOverflow(num, &overflow);
5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != -1)
5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "return value was not set to -1");
5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != -1)
5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was not set to -1");
5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Same again, with num = LONG_MIN - 1 */
5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromLong(LONG_MIN);
5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    one = PyLong_FromLong(1L);
5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (one == NULL) {
5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(num);
5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    temp = PyNumber_Subtract(num, one);
5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(one);
5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = temp;
5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 0;
5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongAndOverflow(num, &overflow);
5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != -1)
5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "return value was not set to -1");
5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != -1)
5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was not set to -1");
5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Test that overflow is cleared properly for small values. */
5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromString("FF", NULL, 16);
5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 1234;
5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongAndOverflow(num, &overflow);
5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != 0xFF)
5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "expected return value 0xFF");
5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != 0)
5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was not cleared");
5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromString("-FF", NULL, 16);
5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 0;
5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongAndOverflow(num, &overflow);
5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != -0xFF)
5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "expected return value 0xFF");
5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != 0)
5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was set incorrectly");
5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromLong(LONG_MAX);
5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 1234;
5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongAndOverflow(num, &overflow);
5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != LONG_MAX)
5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "expected return value LONG_MAX");
5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != 0)
5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was not cleared");
6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromLong(LONG_MIN);
6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 0;
6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongAndOverflow(num, &overflow);
6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != LONG_MIN)
6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "expected return value LONG_MIN");
6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != 0)
6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_and_overflow",
6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was not cleared");
6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   PY_LONG_LONG is tested by test_long_api_inner. This test will
6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   concentrate on proper handling of overflow.
6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_long_long_and_overflow(PyObject *self)
6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *num, *one, *temp;
6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PY_LONG_LONG value;
6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int overflow;
6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Test that overflow is set properly for a large value. */
6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* num is a number larger than PY_LLONG_MAX on a typical machine. */
6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 1234;
6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongLongAndOverflow(num, &overflow);
6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != -1)
6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "return value was not set to -1");
6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != 1)
6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was not set to 1");
6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Same again, with num = PY_LLONG_MAX + 1 */
6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromLongLong(PY_LLONG_MAX);
6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    one = PyLong_FromLong(1L);
6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (one == NULL) {
6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(num);
6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    temp = PyNumber_Add(num, one);
6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(one);
6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = temp;
6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 0;
6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongLongAndOverflow(num, &overflow);
6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != -1)
6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "return value was not set to -1");
6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != 1)
6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was not set to 1");
6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Test that overflow is set properly for a large negative value. */
6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* num is a number smaller than PY_LLONG_MIN on a typical platform */
6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 1234;
6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongLongAndOverflow(num, &overflow);
6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != -1)
6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "return value was not set to -1");
6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != -1)
6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was not set to -1");
6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Same again, with num = PY_LLONG_MIN - 1 */
6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromLongLong(PY_LLONG_MIN);
6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    one = PyLong_FromLong(1L);
6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (one == NULL) {
6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(num);
7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    temp = PyNumber_Subtract(num, one);
7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(one);
7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = temp;
7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 0;
7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongLongAndOverflow(num, &overflow);
7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != -1)
7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "return value was not set to -1");
7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != -1)
7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was not set to -1");
7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Test that overflow is cleared properly for small values. */
7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromString("FF", NULL, 16);
7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 1234;
7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongLongAndOverflow(num, &overflow);
7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != 0xFF)
7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "expected return value 0xFF");
7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != 0)
7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was not cleared");
7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromString("-FF", NULL, 16);
7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 0;
7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongLongAndOverflow(num, &overflow);
7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != -0xFF)
7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "expected return value 0xFF");
7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != 0)
7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was set incorrectly");
7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromLongLong(PY_LLONG_MAX);
7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 1234;
7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongLongAndOverflow(num, &overflow);
7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != PY_LLONG_MAX)
7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "expected return value PY_LLONG_MAX");
7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != 0)
7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was not cleared");
7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromLongLong(PY_LLONG_MIN);
7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    overflow = 0;
7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyLong_AsLongLongAndOverflow(num, &overflow);
7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value == -1 && PyErr_Occurred())
7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != PY_LLONG_MIN)
7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "expected return value PY_LLONG_MIN");
7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (overflow != 0)
7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_long_long_and_overflow",
7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "overflow was not cleared");
7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Test the L code for PyArg_ParseTuple.  This should deliver a PY_LONG_LONG
7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   for both long and int arguments.  The test may leak a little memory if
7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   it fails.
7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_L_code(PyObject *self)
7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *tuple, *num;
7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PY_LONG_LONG value;
7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tuple = PyTuple_New(1);
7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (tuple == NULL)
7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromLong(42);
8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyTuple_SET_ITEM(tuple, 0, num);
8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = -1;
8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != 42)
8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_L_code",
8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "L code returned wrong value for long 42");
8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyInt_FromLong(42);
8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyTuple_SET_ITEM(tuple, 0, num);
8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = -1;
8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != 42)
8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_L_code",
8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "L code returned wrong value for int 42");
8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(tuple);
8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif  /* ifdef HAVE_LONG_LONG */
8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Test tuple argument processing */
8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetargs_tuple(PyObject *self, PyObject *args)
8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int a, b, c;
8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_BuildValue("iii", a, b, c);
8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* test PyArg_ParseTupleAndKeywords */
8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static char *fmt="(ii)i|(i(ii))(iii)i";
8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_BuildValue("iiiiiiiiii",
8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Functions to call PyArg_ParseTuple with integer format codes,
8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   and return the result.
8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetargs_b(PyObject *self, PyObject *args)
8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned char value;
8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "b", &value))
8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromUnsignedLong((unsigned long)value);
8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetargs_B(PyObject *self, PyObject *args)
8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned char value;
8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "B", &value))
8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromUnsignedLong((unsigned long)value);
8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetargs_h(PyObject *self, PyObject *args)
8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    short value;
8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "h", &value))
8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromLong((long)value);
8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetargs_H(PyObject *self, PyObject *args)
8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned short value;
8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "H", &value))
8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromUnsignedLong((unsigned long)value);
8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetargs_I(PyObject *self, PyObject *args)
9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned int value;
9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "I", &value))
9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromUnsignedLong((unsigned long)value);
9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetargs_k(PyObject *self, PyObject *args)
9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned long value;
9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "k", &value))
9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromUnsignedLong(value);
9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetargs_i(PyObject *self, PyObject *args)
9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int value;
9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i", &value))
9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromLong((long)value);
9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetargs_l(PyObject *self, PyObject *args)
9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    long value;
9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "l", &value))
9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromLong(value);
9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetargs_n(PyObject *self, PyObject *args)
9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t value;
9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "n", &value))
9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromSsize_t(value);
9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetargs_L(PyObject *self, PyObject *args)
9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PY_LONG_LONG value;
9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "L", &value))
9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromLongLong(value);
9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetargs_K(PyObject *self, PyObject *args)
9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned PY_LONG_LONG value;
9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "K", &value))
9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyLong_FromUnsignedLongLong(value);
9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* This function not only tests the 'k' getargs code, but also the
9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   PyInt_AsUnsignedLongMask() and PyInt_AsUnsignedLongMask() functions. */
9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_k_code(PyObject *self)
9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *tuple, *num;
9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned long value;
9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tuple = PyTuple_New(1);
9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (tuple == NULL)
9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* a number larger than ULONG_MAX even on 64-bit platforms */
9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyInt_AsUnsignedLongMask(num);
9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != ULONG_MAX)
9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_k_code",
9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        "PyInt_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyTuple_SET_ITEM(tuple, 0, num);
9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = 0;
9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != ULONG_MAX)
9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_k_code",
9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "k code returned wrong value for long 0xFFF...FFF");
9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(num);
9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (num == NULL)
9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyInt_AsUnsignedLongMask(num);
10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != (unsigned long)-0x42)
10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_k_code",
10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        "PyInt_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyTuple_SET_ITEM(tuple, 0, num);
10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = 0;
10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != (unsigned long)-0x42)
10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_k_code",
10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "k code returned wrong value for long -0xFFF..000042");
10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(tuple);
10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic volatile int x;
10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   of an error.
10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_u_code(PyObject *self)
10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *tuple, *obj;
10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_UNICODE *value;
10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int len;
10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Just use the macro and check that it compiles */
10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    x = Py_UNICODE_ISSPACE(25);
10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tuple = PyTuple_New(1);
10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (tuple == NULL)
10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    obj = PyUnicode_Decode("test", strlen("test"),
10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           "ascii", NULL);
10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (obj == NULL)
10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyTuple_SET_ITEM(tuple, 0, obj);
10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = 0;
10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != PyUnicode_AS_UNICODE(obj))
10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_u_code",
10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "u code returned wrong value for u'test'");
10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = 0;
10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (value != PyUnicode_AS_UNICODE(obj) ||
10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        len != PyUnicode_GET_SIZE(obj))
10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_u_code",
10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "u# code returned wrong values for u'test'");
10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(tuple);
10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_widechar(PyObject *self)
10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
10714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    size_t wtextlen = 1;
10724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
10734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
10744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    size_t wtextlen = 2;
10754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
10764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *wide, *utf8;
10774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    wide = PyUnicode_FromWideChar(wtext, wtextlen);
10794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (wide == NULL)
10804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
10834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (utf8 == NULL) {
10844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(wide);
10854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyUnicode_GET_SIZE(wide) != PyUnicode_GET_SIZE(utf8)) {
10894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(wide);
10904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(utf8);
10914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_widechar",
10924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "wide string and utf8 string have different length");
10934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyUnicode_Compare(wide, utf8)) {
10954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(wide);
10964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(utf8);
10974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyErr_Occurred())
10984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
10994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_widechar",
11004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "wide string and utf8 string are differents");
11014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(wide);
11044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(utf8);
11054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
11064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
11094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_empty_argparse(PyObject *self)
11104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Test that formats can begin with '|'. See issue #4720. */
11124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *tuple, *dict = NULL;
11134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static char *kwlist[] = {NULL};
11144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int result;
11154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tuple = PyTuple_New(0);
11164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!tuple)
11174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
11184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
11194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto done;
11204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    dict = PyDict_New();
11214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!dict)
11224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto done;
11234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
11244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  done:
11254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(tuple);
11264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(dict);
11274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result < 0)
11284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
11294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
11304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_RETURN_NONE;
11314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
11354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcodec_incrementalencoder(PyObject *self, PyObject *args)
11364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *encoding, *errors = NULL;
11384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
11394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          &encoding, &errors))
11404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
11414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyCodec_IncrementalEncoder(encoding, errors);
11424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
11454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcodec_incrementaldecoder(PyObject *self, PyObject *args)
11464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *encoding, *errors = NULL;
11484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
11494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          &encoding, &errors))
11504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
11514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyCodec_IncrementalDecoder(encoding, errors);
11524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
11554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
11574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
11584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_long_numbits(PyObject *self)
11594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct triple {
11614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        long input;
11624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        size_t nbits;
11634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int sign;
11644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } testcases[] = {{0, 0, 0},
11654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     {1L, 1, 1},
11664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     {-1L, 1, -1},
11674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     {2L, 2, 1},
11684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     {-2L, 2, -1},
11694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     {3L, 2, 1},
11704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     {-3L, 2, -1},
11714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     {4L, 3, 1},
11724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     {-4L, 3, -1},
11734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     {0x7fffL, 15, 1},          /* one Python long digit */
11744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             {-0x7fffL, 15, -1},
11754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             {0xffffL, 16, 1},
11764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             {-0xffffL, 16, -1},
11774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             {0xfffffffL, 28, 1},
11784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm             {-0xfffffffL, 28, -1}};
11794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
11804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < sizeof(testcases) / sizeof(struct triple); ++i) {
11824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *plong = PyLong_FromLong(testcases[i].input);
11834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        size_t nbits = _PyLong_NumBits(plong);
11844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int sign = _PyLong_Sign(plong);
11854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(plong);
11874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (nbits != testcases[i].nbits)
11884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return raiseTestError("test_long_numbits",
11894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "wrong result for _PyLong_NumBits");
11904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (sign != testcases[i].sign)
11914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return raiseTestError("test_long_numbits",
11924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "wrong result for _PyLong_Sign");
11934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
11954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
11964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Example passing NULLs to PyObject_Str(NULL) and PyObject_Unicode(NULL). */
11994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
12014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_null_strings(PyObject *self)
12024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Unicode(NULL);
12044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *tuple = PyTuple_Pack(2, o1, o2);
12054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(o1);
12064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(o2);
12074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return tuple;
12084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
12094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
12114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmraise_exception(PyObject *self, PyObject *args)
12124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *exc;
12144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *exc_args, *v;
12154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int num_args, i;
12164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "Oi:raise_exception",
12184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          &exc, &num_args))
12194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
12204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyExceptionClass_Check(exc)) {
12214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError, "an exception class is required");
12224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
12234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    exc_args = PyTuple_New(num_args);
12264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (exc_args == NULL)
12274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
12284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < num_args; ++i) {
12294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v = PyInt_FromLong(i);
12304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (v == NULL) {
12314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(exc_args);
12324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
12334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyTuple_SET_ITEM(exc_args, i, v);
12354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetObject(exc, exc_args);
12374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(exc_args);
12384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
12394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
12404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int test_run_counter = 0;
12434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
12454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_datetime_capi(PyObject *self, PyObject *args) {
12464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyDateTimeAPI) {
12474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (test_run_counter) {
12484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Probably regrtest.py -R */
12494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_RETURN_NONE;
12504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else {
12524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_AssertionError,
12534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "PyDateTime_CAPI somehow initialized");
12544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
12554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_run_counter++;
12584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDateTime_IMPORT;
12594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyDateTimeAPI)
12604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_RETURN_NONE;
12614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
12624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
12634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
12644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD
12674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* test_thread_state spawns a thread of its own, and that thread releases
12694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * `thread_done` when it's finished.  The driver code has to know when the
12704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * thread finishes, because the thread uses a PyObject (the callable) that
12714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * may go away when the driver finishes.  The former lack of this explicit
12724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * synchronization caused rare segfaults, so rare that they were seen only
12734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * on a Mac buildbot (although they were possible on any box).
12744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
12754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyThread_type_lock thread_done = NULL;
12764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
12784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_make_call(void *callable)
12794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *rc;
12814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int success;
12824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyGILState_STATE s = PyGILState_Ensure();
12834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    rc = PyObject_CallFunction((PyObject *)callable, "");
12844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    success = (rc != NULL);
12854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(rc);
12864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyGILState_Release(s);
12874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return success;
12884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
12894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Same thing, but releases `thread_done` when it returns.  This variant
12914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * should be called only from threads spawned by test_thread_state().
12924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
12934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
12944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_make_call_from_thread(void *callable)
12954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _make_call(callable);
12974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThread_release_lock(thread_done);
12984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
12994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
13014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_thread_state(PyObject *self, PyObject *args)
13024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *fn;
13044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int success = 1;
13054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
13074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyCallable_Check(fn)) {
13104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
13114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fn->ob_type->tp_name);
13124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Ensure Python is set up for threading */
13164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyEval_InitThreads();
13174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    thread_done = PyThread_allocate_lock();
13184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (thread_done == NULL)
13194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_NoMemory();
13204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThread_acquire_lock(thread_done, 1);
13214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Start a new thread with our callback. */
13234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThread_start_new_thread(_make_call_from_thread, fn);
13244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Make the callback with the thread lock held by this thread */
13254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    success &= _make_call(fn);
13264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Do it all again, but this time with the thread-lock released */
13274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
13284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    success &= _make_call(fn);
13294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThread_acquire_lock(thread_done, 1);  /* wait for thread to finish */
13304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
13314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* And once more with and without a thread
13334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       XXX - should use a lock and work out exactly what we are trying
13344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       to test <wink>
13354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
13364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
13374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThread_start_new_thread(_make_call_from_thread, fn);
13384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    success &= _make_call(fn);
13394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThread_acquire_lock(thread_done, 1);  /* wait for thread to finish */
13404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
13414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Release lock we acquired above.  This is required on HP-UX. */
13434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThread_release_lock(thread_done);
13444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThread_free_lock(thread_done);
13464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!success)
13474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
13494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* test Py_AddPendingCalls using threads */
13524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int _pending_callback(void *arg)
13534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* we assume the argument is callable object to which we own a reference */
13554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *callable = (PyObject *)arg;
13564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *r = PyObject_CallObject(callable, NULL);
13574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(callable);
13584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(r);
13594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return r != NULL ? 0 : -1;
13604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* The following requests n callbacks to _pending_callback.  It can be
13634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * run from any python thread.
13644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
13654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *pending_threadfunc(PyObject *self, PyObject *arg)
13664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *callable;
13684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int r;
13694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyArg_ParseTuple(arg, "O", &callable) == 0)
13704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* create the reference for the callbackwhile we hold the lock */
13734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(callable);
13744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_BEGIN_ALLOW_THREADS
13764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    r = Py_AddPendingCall(&_pending_callback, callable);
13774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_END_ALLOW_THREADS
13784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (r<0) {
13804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
13814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(Py_False);
13824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Py_False;
13834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_True);
13854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_True;
13864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
13884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Some tests of PyString_FromFormat().  This needs more tests. */
13904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
13914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_string_from_format(PyObject *self, PyObject *args)
13924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *result;
13944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *msg;
13954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define CHECK_1_FORMAT(FORMAT, TYPE)                    \
13974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = PyString_FromFormat(FORMAT, (TYPE)1);      \
13984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == NULL)                                 \
13994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;                                    \
14004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (strcmp(PyString_AsString(result), "1")) {       \
14014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        msg = FORMAT " failed at 1";                    \
14024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto Fail;                                      \
14034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }                                                   \
14044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(result)
14054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_1_FORMAT("%d", int);
14074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_1_FORMAT("%ld", long);
14084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* The z width modifier was added in Python 2.5. */
14094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_1_FORMAT("%zd", Py_ssize_t);
14104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* The u type code was added in Python 2.5. */
14124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_1_FORMAT("%u", unsigned int);
14134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_1_FORMAT("%lu", unsigned long);
14144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_1_FORMAT("%zu", size_t);
14154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* "%lld" and "%llu" support added in Python 2.7. */
14174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
14184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
14194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_1_FORMAT("%lld", PY_LONG_LONG);
14204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
14214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
14234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Fail:
14254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(result);
14264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return raiseTestError("test_string_from_format", msg);
14274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef CHECK_1_FORMAT
14294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
14304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Coverage testing of capsule objects. */
14324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic const char *capsule_name = "capsule name";
14344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic       char *capsule_pointer = "capsule pointer";
14354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic       char *capsule_context = "capsule context";
14364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic const char *capsule_error = NULL;
14374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
14384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcapsule_destructor_call_count = 0;
14394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
14414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcapsule_destructor(PyObject *o) {
14424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    capsule_destructor_call_count++;
14434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyCapsule_GetContext(o) != capsule_context) {
14444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        capsule_error = "context did not match in destructor!";
14454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
14464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        capsule_error = "destructor did not match in destructor!  (woah!)";
14474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (PyCapsule_GetName(o) != capsule_name) {
14484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        capsule_error = "name did not match in destructor!";
14494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
14504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        capsule_error = "pointer did not match in destructor!";
14514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
14534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct {
14554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *name;
14564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *module;
14574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *attribute;
14584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} known_capsule;
14594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
14614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_capsule(PyObject *self, PyObject *args)
14624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
14634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *object;
14644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *error = NULL;
14654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    void *pointer;
14664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    void *pointer2;
14674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    known_capsule known_capsules[] = {
14684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        #define KNOWN_CAPSULE(module, name)             { module "." name, module, name }
14694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        KNOWN_CAPSULE("_socket", "CAPI"),
14704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        KNOWN_CAPSULE("_curses", "_C_API"),
14714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        KNOWN_CAPSULE("datetime", "datetime_CAPI"),
14724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        { NULL, NULL },
14734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    };
14744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    known_capsule *known = &known_capsules[0];
14754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define FAIL(x) { error = (x); goto exit; }
14774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define CHECK_DESTRUCTOR \
14794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (capsule_error) { \
14804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        FAIL(capsule_error); \
14814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } \
14824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (!capsule_destructor_call_count) {          \
14834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        FAIL("destructor not called!"); \
14844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } \
14854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    capsule_destructor_call_count = 0; \
14864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
14884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyCapsule_SetContext(object, capsule_context);
14894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    capsule_destructor(object);
14904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_DESTRUCTOR;
14914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(object);
14924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_DESTRUCTOR;
14934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    object = PyCapsule_New(known, "ignored", NULL);
14954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyCapsule_SetPointer(object, capsule_pointer);
14964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyCapsule_SetName(object, capsule_name);
14974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyCapsule_SetDestructor(object, capsule_destructor);
14984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyCapsule_SetContext(object, capsule_context);
14994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    capsule_destructor(object);
15004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    CHECK_DESTRUCTOR;
15014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* intentionally access using the wrong name */
15024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    pointer2 = PyCapsule_GetPointer(object, "the wrong name");
15034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyErr_Occurred()) {
15044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        FAIL("PyCapsule_GetPointer should have failed but did not!");
15054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_Clear();
15074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (pointer2) {
15084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (pointer2 == capsule_pointer) {
15094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            FAIL("PyCapsule_GetPointer should not have"
15104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     " returned the internal pointer!");
15114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else {
15124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            FAIL("PyCapsule_GetPointer should have "
15134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "returned NULL pointer but did not!");
15144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
15154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyCapsule_SetDestructor(object, NULL);
15174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(object);
15184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (capsule_destructor_call_count) {
15194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        FAIL("destructor called when it should not have been!");
15204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (known = &known_capsules[0]; known->module != NULL; known++) {
15234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* yeah, ordinarily I wouldn't do this either,
15244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           but it's fine for this test harness.
15254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        */
15264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        static char buffer[256];
15274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef FAIL
15284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define FAIL(x) \
15294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        { \
15304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
15314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            x, known->module, known->attribute); \
15324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        error = buffer; \
15334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto exit; \
15344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } \
15354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *module = PyImport_ImportModule(known->module);
15374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (module) {
15384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pointer = PyCapsule_Import(known->name, 0);
15394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!pointer) {
15404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(module);
15414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
15424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
15434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            object = PyObject_GetAttrString(module, known->attribute);
15444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!object) {
15454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(module);
15464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
15474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
15484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pointer2 = PyCapsule_GetPointer(object,
15494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                    "weebles wobble but they don't fall down");
15504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!PyErr_Occurred()) {
15514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(object);
15524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(module);
15534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                FAIL("PyCapsule_GetPointer should have failed but did not!");
15544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
15554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Clear();
15564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (pointer2) {
15574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(module);
15584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(object);
15594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (pointer2 == pointer) {
15604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    FAIL("PyCapsule_GetPointer should not have"
15614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             " returned its internal pointer!");
15624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                } else {
15634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    FAIL("PyCapsule_GetPointer should have"
15644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             " returned NULL pointer but did not!");
15654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
15664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
15674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(object);
15684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(module);
15694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
15704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
15714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Clear();
15724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  exit:
15754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (error) {
15764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return raiseTestError("test_capsule", error);
15774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
15794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef FAIL
15804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
15814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* This is here to provide a docstring for test_descr. */
15834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
15844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_with_docstring(PyObject *self)
15854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
15864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
15874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
15884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* To test the format of tracebacks as printed out. */
15904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
15914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtraceback_print(PyObject *self, PyObject *args)
15924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
15934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *file;
15944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *traceback;
15954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int result;
15964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "OO:traceback_print",
15984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            &traceback, &file))
15994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
16004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = PyTraceBack_Print(traceback, file);
16024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result < 0)
16034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
16044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
16054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
16064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* To test that the result of PyCode_NewEmpty has the right members. */
16084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
16094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcode_newempty(PyObject *self, PyObject *args)
16104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
16114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *filename;
16124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *funcname;
16134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int firstlineno;
16144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "ssi:code_newempty",
16164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          &filename, &funcname, &firstlineno))
16174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
16184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
16204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
16214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
16234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Run via Lib/test/test_exceptions.py */
16244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
16254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmake_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
16264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
16274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *name;
16284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *doc = NULL;
16294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *base = NULL;
16304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *dict = NULL;
16314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
16334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTupleAndKeywords(args, kwargs,
16354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "s|sOO:make_exception_with_doc", kwlist,
16364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &name, &doc, &base, &dict))
16374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
16384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyErr_NewExceptionWithDoc(name, doc, base, dict);
16404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
16414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMethodDef TestMethods[] = {
16434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"raise_exception",         raise_exception,                 METH_VARARGS},
16444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_config",             (PyCFunction)test_config,        METH_NOARGS},
16454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_datetime_capi",  test_datetime_capi,              METH_NOARGS},
16464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_list_api",           (PyCFunction)test_list_api,      METH_NOARGS},
16474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_dict_iteration",     (PyCFunction)test_dict_iteration,METH_NOARGS},
16484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_lazy_hash_inheritance",      (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
16494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_broken_memoryview",          (PyCFunction)test_broken_memoryview,METH_NOARGS},
16504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_long_api",           (PyCFunction)test_long_api,      METH_NOARGS},
16514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
16524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_NOARGS},
16534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_long_numbits",       (PyCFunction)test_long_numbits,  METH_NOARGS},
16544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_k_code",             (PyCFunction)test_k_code,        METH_NOARGS},
16554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
16564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_null_strings",       (PyCFunction)test_null_strings,  METH_NOARGS},
16574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
16584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
16594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     PyDoc_STR("This is a pretty normal docstring.")},
16604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getargs_tuple",           getargs_tuple,                   METH_VARARGS},
16624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getargs_keywords", (PyCFunction)getargs_keywords,
16634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      METH_VARARGS|METH_KEYWORDS},
16644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getargs_b",               getargs_b,                       METH_VARARGS},
16654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getargs_B",               getargs_B,                       METH_VARARGS},
16664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getargs_h",               getargs_h,                       METH_VARARGS},
16674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getargs_H",               getargs_H,                       METH_VARARGS},
16684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getargs_I",               getargs_I,                       METH_VARARGS},
16694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getargs_k",               getargs_k,                       METH_VARARGS},
16704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getargs_i",               getargs_i,                       METH_VARARGS},
16714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getargs_l",               getargs_l,                       METH_VARARGS},
16724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getargs_n",               getargs_n,                       METH_VARARGS},
16734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
16744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getargs_L",               getargs_L,                       METH_VARARGS},
16754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getargs_K",               getargs_K,                       METH_VARARGS},
16764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_longlong_api",       test_longlong_api,               METH_NOARGS},
16774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_long_long_and_overflow",
16784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
16794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_L_code",             (PyCFunction)test_L_code,        METH_NOARGS},
16804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"codec_incrementalencoder",
16814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     (PyCFunction)codec_incrementalencoder,      METH_VARARGS},
16824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"codec_incrementaldecoder",
16834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     (PyCFunction)codec_incrementaldecoder,      METH_VARARGS},
16844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
16854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
16864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_u_code",             (PyCFunction)test_u_code,        METH_NOARGS},
16874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_widechar",           (PyCFunction)test_widechar,      METH_NOARGS},
16884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
16894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD
16904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"_test_thread_state",  test_thread_state,                   METH_VARARGS},
16914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"_pending_threadfunc",     pending_threadfunc,              METH_VARARGS},
16924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
16934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
16944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"traceback_print", traceback_print,                 METH_VARARGS},
16954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"code_newempty", code_newempty,                     METH_VARARGS},
16964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
16974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS | METH_KEYWORDS},
16984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {NULL, NULL} /* sentinel */
16994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
17004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
17024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct {
17044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char bool_member;
17054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char byte_member;
17064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned char ubyte_member;
17074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    short short_member;
17084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned short ushort_member;
17094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int int_member;
17104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned int uint_member;
17114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    long long_member;
17124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned long ulong_member;
17134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    float float_member;
17144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    double double_member;
17154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char inplace_member[6];
17164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
17174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PY_LONG_LONG longlong_member;
17184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unsigned PY_LONG_LONG ulonglong_member;
17194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
17204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} all_structmembers;
17214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct {
17234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_HEAD
17244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    all_structmembers structmembers;
17254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} test_structmembers;
17264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic struct PyMemberDef test_members[] = {
17284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
17294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
17304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
17314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
17324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
17334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
17344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
17354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
17364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
17374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
17384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
17394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
17404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
17414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
17424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
17434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
17444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {NULL}
17454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
17464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
17494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
17504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static char *keywords[] = {
17524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
17534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        "T_INT", "T_UINT", "T_LONG", "T_ULONG",
17544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
17554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
17564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        "T_LONGLONG", "T_ULONGLONG",
17574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
17584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        NULL};
17594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static char *fmt = "|bbBhHiIlkfds#"
17604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
17614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        "LK"
17624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
17634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ;
17644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_structmembers *ob;
17654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *s = NULL;
17664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_ssize_t string_len = 0;
17674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ob = PyObject_New(test_structmembers, type);
17684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (ob == NULL)
17694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
17704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    memset(&ob->structmembers, 0, sizeof(all_structmembers));
17714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
17724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &ob->structmembers.bool_member,
17734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &ob->structmembers.byte_member,
17744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &ob->structmembers.ubyte_member,
17754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &ob->structmembers.short_member,
17764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &ob->structmembers.ushort_member,
17774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &ob->structmembers.int_member,
17784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &ob->structmembers.uint_member,
17794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &ob->structmembers.long_member,
17804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &ob->structmembers.ulong_member,
17814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &ob->structmembers.float_member,
17824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &ob->structmembers.double_member,
17834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &s, &string_len
17844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG
17854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     , &ob->structmembers.longlong_member,
17864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     &ob->structmembers.ulonglong_member
17874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
17884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        )) {
17894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(ob);
17904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
17914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s != NULL) {
17934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (string_len > 5) {
17944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(ob);
17954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_SetString(PyExc_ValueError, "string too long");
17964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
17974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
17984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        strcpy(ob->structmembers.inplace_member, s);
17994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
18014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        strcpy(ob->structmembers.inplace_member, "");
18024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject *)ob;
18044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
18054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
18074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtest_structmembers_free(PyObject *ob)
18084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
18094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_FREE(ob);
18104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
18114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject test_structmembersType = {
18134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyVarObject_HEAD_INIT(NULL, 0)
18144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "test_structmembersType",
18154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sizeof(test_structmembers),         /* tp_basicsize */
18164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_itemsize */
18174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_structmembers_free,            /* destructor tp_dealloc */
18184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_print */
18194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_getattr */
18204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_setattr */
18214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_compare */
18224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_repr */
18234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_as_number */
18244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_as_sequence */
18254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_as_mapping */
18264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_hash */
18274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_call */
18284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_str */
18294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_GenericGetAttr,            /* tp_getattro */
18304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject_GenericSetAttr,            /* tp_setattro */
18314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_as_buffer */
18324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_flags */
18334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "Type containing all structmember types",
18344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* traverseproc tp_traverse */
18354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_clear */
18364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_richcompare */
18374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_weaklistoffset */
18384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_iter */
18394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_iternext */
18404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,                                  /* tp_methods */
18414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_members,                       /* tp_members */
18424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,
18434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,
18444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,
18454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,
18464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,
18474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,
18484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,
18494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    0,
18504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_structmembers_new,             /* tp_new */
18514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
18524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyMODINIT_FUNC
18554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminit_testcapi(void)
18564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
18574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *m;
18584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    m = Py_InitModule("_testcapi", TestMethods);
18604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (m == NULL)
18614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
18624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
18644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_TYPE(&test_structmembersType)=&PyType_Type;
18664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(&test_structmembersType);
18674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* don't use a name starting with "test", since we don't want
18684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       test_capi to automatically call this */
18694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
18704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "CHAR_MAX", PyInt_FromLong(CHAR_MAX));
18724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "CHAR_MIN", PyInt_FromLong(CHAR_MIN));
18734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "UCHAR_MAX", PyInt_FromLong(UCHAR_MAX));
18744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "SHRT_MAX", PyInt_FromLong(SHRT_MAX));
18754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "SHRT_MIN", PyInt_FromLong(SHRT_MIN));
18764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "USHRT_MAX", PyInt_FromLong(USHRT_MAX));
18774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "INT_MAX",  PyLong_FromLong(INT_MAX));
18784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "INT_MIN",  PyLong_FromLong(INT_MIN));
18794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "UINT_MAX",  PyLong_FromUnsignedLong(UINT_MAX));
18804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "LONG_MAX", PyInt_FromLong(LONG_MAX));
18814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "LONG_MIN", PyInt_FromLong(LONG_MIN));
18824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
18834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
18844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
18854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
18864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
18874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
18884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
18894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
18904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyInt_FromSsize_t(PY_SSIZE_T_MAX));
18914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyInt_FromSsize_t(PY_SSIZE_T_MIN));
18924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyInt_FromSsize_t(sizeof(PyGC_Head)));
18934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
18954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(TestError);
18964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyModule_AddObject(m, "error", TestError);
18974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1898