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