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