blob: 7536d29535038c7ca7a1785918e87f36cfbe8552 [file] [log] [blame]
Tim Peters9ea17ac2001-02-02 05:57:15 +00001/*
2 * C Extension module to test Python interpreter C APIs.
3 *
4 * The 'test_*' functions exported by this module are run as part of the
5 * standard Python regression test, via Lib/test/test_capi.py.
6 */
7
Victor Stinner3f2f4fe2020-03-13 13:07:31 +01008/* This module tests the public (Include/ and Include/cpython/) C API.
9 The internal C API must not be used here: use _testinternalcapi for that.
10
11 The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE
12 macro defined, but only the public C API must be tested here. */
Hai Shi5dd21f52020-04-21 00:49:13 +080013
Victor Stinner5c75f372019-04-17 23:02:26 +020014#undef Py_BUILD_CORE_MODULE
Hai Shi5dd21f52020-04-21 00:49:13 +080015/* Always enable assertions */
16#undef NDEBUG
Victor Stinner5c75f372019-04-17 23:02:26 +020017
Neal Norwitz8866e0a2007-10-27 04:01:17 +000018#define PY_SSIZE_T_CLEAN
19
Tim Peters9ea17ac2001-02-02 05:57:15 +000020#include "Python.h"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000021#include "datetime.h"
Stefan Krah39042e02020-08-10 16:32:21 +020022#include "pydecimal.h"
Serhiy Storchakab5181342015-02-06 08:58:56 +020023#include "marshal.h"
Victor Stinner4a21e572020-04-15 02:35:41 +020024#include "structmember.h" // PyMemberDef
Victor Stinnera1c249c2018-11-01 03:15:58 +010025#include <float.h>
Victor Stinner56e8c292014-07-21 12:30:22 +020026#include <signal.h>
Tim Peters9ea17ac2001-02-02 05:57:15 +000027
Victor Stinner95e9cef2015-03-28 01:26:47 +010028#ifdef MS_WINDOWS
Victor Stinner09e5cf22015-03-30 00:09:18 +020029# include <winsock2.h> /* struct timeval */
Victor Stinner95e9cef2015-03-28 01:26:47 +010030#endif
31
Victor Stinner7b7c6dc2017-08-10 12:37:39 +020032#ifdef HAVE_SYS_WAIT_H
33#include <sys/wait.h> /* For W_STOPCODE */
34#endif
35
Victor Stinner5ed69952018-11-06 15:59:52 +010036#ifdef Py_BUILD_CORE
37# error "_testcapi must test the public Python C API, not CPython internal C API"
38#endif
39
Eddie Elizondoff023ed2019-09-11 05:17:13 -040040static struct PyModuleDef _testcapimodule;
41
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000043
Tim Peters91621db2001-06-12 20:10:01 +000044/* Raise TestError with test_name + ": " + msg, and return NULL. */
45
46static PyObject *
47raiseTestError(const char* test_name, const char* msg)
48{
Victor Stinner6ced7c42011-03-21 18:15:42 +010049 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000051}
52
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000053/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000054
55 The ones derived from autoconf on the UNIX-like OSes can be relied
56 upon (in the absence of sloppy cross-compiling), but the Windows
57 platforms have these hardcoded. Better safe than sorry.
58*/
59static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000060sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000062{
Victor Stinner499dfcf2011-03-21 13:26:24 +010063 PyErr_Format(TestError,
64 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000067}
68
69static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053070test_config(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters9ea17ac2001-02-02 05:57:15 +000071{
Tim Peters9ea17ac2001-02-02 05:57:15 +000072#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 if (FATNAME != sizeof(TYPE)) \
74 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000076 CHECK_SIZEOF(SIZEOF_SHORT, short);
77 CHECK_SIZEOF(SIZEOF_INT, int);
78 CHECK_SIZEOF(SIZEOF_LONG, long);
79 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
80 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Benjamin Petersonaf580df2016-09-06 10:46:49 -070081 CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
Tim Peters9ea17ac2001-02-02 05:57:15 +000082
83#undef CHECK_SIZEOF
84
Serhiy Storchaka228b12e2017-01-23 09:47:21 +020085 Py_RETURN_NONE;
Tim Peters9ea17ac2001-02-02 05:57:15 +000086}
87
Tim Peters5c4d5bf2001-02-12 22:13:26 +000088static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053089test_sizeof_c_types(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner01076552013-10-29 19:39:52 +010090{
Ned Deilye37a1942015-03-05 15:47:10 -080091#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020092#pragma GCC diagnostic push
93#pragma GCC diagnostic ignored "-Wtype-limits"
94#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010095#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010096 if (EXPECTED != sizeof(TYPE)) { \
97 PyErr_Format(TestError, \
98 "sizeof(%s) = %u instead of %u", \
99 #TYPE, sizeof(TYPE), EXPECTED); \
100 return (PyObject*)NULL; \
101 }
Victor Stinnerf866f972013-10-29 19:59:31 +0100102#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
103#define CHECK_SIGNNESS(TYPE, SIGNED) \
104 if (IS_SIGNED(TYPE) != SIGNED) { \
105 PyErr_Format(TestError, \
106 "%s signness is, instead of %i", \
107 #TYPE, IS_SIGNED(TYPE), SIGNED); \
108 return (PyObject*)NULL; \
109 }
Victor Stinner01076552013-10-29 19:39:52 +0100110
111 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100112 CHECK_SIZEOF(Py_UCS1, 1);
113 CHECK_SIZEOF(Py_UCS2, 2);
114 CHECK_SIZEOF(Py_UCS4, 4);
115 CHECK_SIGNNESS(Py_UCS1, 0);
116 CHECK_SIGNNESS(Py_UCS2, 0);
117 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700118 CHECK_SIZEOF(int32_t, 4);
119 CHECK_SIGNNESS(int32_t, 1);
120 CHECK_SIZEOF(uint32_t, 4);
121 CHECK_SIGNNESS(uint32_t, 0);
122 CHECK_SIZEOF(int64_t, 8);
123 CHECK_SIGNNESS(int64_t, 1);
124 CHECK_SIZEOF(uint64_t, 8);
125 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100126
127 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100128 CHECK_SIZEOF(size_t, sizeof(void *));
129 CHECK_SIGNNESS(size_t, 0);
130 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
131 CHECK_SIGNNESS(Py_ssize_t, 1);
132
Benjamin Petersonca470632016-09-06 13:47:26 -0700133 CHECK_SIZEOF(uintptr_t, sizeof(void *));
134 CHECK_SIGNNESS(uintptr_t, 0);
135 CHECK_SIZEOF(intptr_t, sizeof(void *));
136 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100137
Serhiy Storchakad1302c02017-01-23 10:23:58 +0200138 Py_RETURN_NONE;
Victor Stinner01076552013-10-29 19:39:52 +0100139
Victor Stinnerf866f972013-10-29 19:59:31 +0100140#undef IS_SIGNED
141#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100142#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800143#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200144#pragma GCC diagnostic pop
145#endif
Victor Stinner01076552013-10-29 19:39:52 +0100146}
147
148
149static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530150test_list_api(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 PyObject* list;
153 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000156#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 list = PyList_New(NLIST);
158 if (list == (PyObject*)NULL)
159 return (PyObject*)NULL;
160 /* list = range(NLIST) */
161 for (i = 0; i < NLIST; ++i) {
162 PyObject* anint = PyLong_FromLong(i);
163 if (anint == (PyObject*)NULL) {
164 Py_DECREF(list);
165 return (PyObject*)NULL;
166 }
167 PyList_SET_ITEM(list, i, anint);
168 }
169 /* list.reverse(), via PyList_Reverse() */
170 i = PyList_Reverse(list); /* should not blow up! */
171 if (i != 0) {
172 Py_DECREF(list);
173 return (PyObject*)NULL;
174 }
175 /* Check that list == range(29, -1, -1) now */
176 for (i = 0; i < NLIST; ++i) {
177 PyObject* anint = PyList_GET_ITEM(list, i);
178 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
179 PyErr_SetString(TestError,
180 "test_list_api: reverse screwed up");
181 Py_DECREF(list);
182 return (PyObject*)NULL;
183 }
184 }
185 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000186#undef NLIST
187
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200188 Py_RETURN_NONE;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000189}
190
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000191static int
192test_dict_inner(int count)
193{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 Py_ssize_t pos = 0, iterations = 0;
195 int i;
196 PyObject *dict = PyDict_New();
197 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 if (dict == NULL)
200 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 for (i = 0; i < count; i++) {
203 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200204 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200205 return -1;
206 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200207 if (PyDict_SetItem(dict, v, v) < 0) {
208 Py_DECREF(v);
209 return -1;
210 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 Py_DECREF(v);
212 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 while (PyDict_Next(dict, &pos, &k, &v)) {
215 PyObject *o;
216 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 i = PyLong_AS_LONG(v) + 1;
219 o = PyLong_FromLong(i);
220 if (o == NULL)
221 return -1;
222 if (PyDict_SetItem(dict, k, o) < 0) {
223 Py_DECREF(o);
224 return -1;
225 }
226 Py_DECREF(o);
227 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 if (iterations != count) {
232 PyErr_SetString(
233 TestError,
234 "test_dict_iteration: dict iteration went wrong ");
235 return -1;
236 } else {
237 return 0;
238 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000239}
240
241static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530242test_dict_iteration(PyObject* self, PyObject *Py_UNUSED(ignored))
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 for (i = 0; i < 200; i++) {
247 if (test_dict_inner(i) < 0) {
248 return NULL;
249 }
250 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000251
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200252 Py_RETURN_NONE;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000253}
254
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200255static PyObject*
256dict_getitem_knownhash(PyObject *self, PyObject *args)
257{
258 PyObject *mp, *key, *result;
259 Py_ssize_t hash;
260
261 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
262 &mp, &key, &hash)) {
263 return NULL;
264 }
265
266 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
267 if (result == NULL && !PyErr_Occurred()) {
268 _PyErr_SetKeyError(key);
269 return NULL;
270 }
271
272 Py_XINCREF(result);
273 return result;
274}
Tim Peters91621db2001-06-12 20:10:01 +0000275
Victor Stinner3d3f2642016-12-15 17:21:23 +0100276static PyObject*
277dict_hassplittable(PyObject *self, PyObject *arg)
278{
279 if (!PyDict_Check(arg)) {
280 PyErr_Format(PyExc_TypeError,
281 "dict_hassplittable() argument must be dict, not '%s'",
Victor Stinnerdaa97562020-02-07 03:37:06 +0100282 Py_TYPE(arg)->tp_name);
Victor Stinner3d3f2642016-12-15 17:21:23 +0100283 return NULL;
284 }
285
286 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
287}
288
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000289/* Issue #4701: Check that PyObject_Hash implicitly calls
290 * PyType_Ready if it hasn't already been called
291 */
292static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 PyVarObject_HEAD_INIT(NULL, 0)
294 "hashinheritancetester", /* Name of this type */
295 sizeof(PyObject), /* Basic object size */
296 0, /* Item size for varobject */
297 (destructor)PyObject_Del, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200298 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 0, /* tp_getattr */
300 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200301 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 0, /* tp_repr */
303 0, /* tp_as_number */
304 0, /* tp_as_sequence */
305 0, /* tp_as_mapping */
306 0, /* tp_hash */
307 0, /* tp_call */
308 0, /* tp_str */
309 PyObject_GenericGetAttr, /* tp_getattro */
310 0, /* tp_setattro */
311 0, /* tp_as_buffer */
312 Py_TPFLAGS_DEFAULT, /* tp_flags */
313 0, /* tp_doc */
314 0, /* tp_traverse */
315 0, /* tp_clear */
316 0, /* tp_richcompare */
317 0, /* tp_weaklistoffset */
318 0, /* tp_iter */
319 0, /* tp_iternext */
320 0, /* tp_methods */
321 0, /* tp_members */
322 0, /* tp_getset */
323 0, /* tp_base */
324 0, /* tp_dict */
325 0, /* tp_descr_get */
326 0, /* tp_descr_set */
327 0, /* tp_dictoffset */
328 0, /* tp_init */
329 0, /* tp_alloc */
330 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000331};
332
333static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530334test_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000335{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 PyTypeObject *type;
337 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000338 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 if (type->tp_dict != NULL)
343 /* The type has already been initialized. This probably means
344 -R is being used. */
345 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000346
347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 obj = PyObject_New(PyObject, type);
349 if (obj == NULL) {
350 PyErr_Clear();
351 PyErr_SetString(
352 TestError,
353 "test_lazy_hash_inheritance: failed to create object");
354 return NULL;
355 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 if (type->tp_dict != NULL) {
358 PyErr_SetString(
359 TestError,
360 "test_lazy_hash_inheritance: type initialised too soon");
361 Py_DECREF(obj);
362 return NULL;
363 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 hash = PyObject_Hash(obj);
366 if ((hash == -1) && PyErr_Occurred()) {
367 PyErr_Clear();
368 PyErr_SetString(
369 TestError,
370 "test_lazy_hash_inheritance: could not hash object");
371 Py_DECREF(obj);
372 return NULL;
373 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 if (type->tp_dict == NULL) {
376 PyErr_SetString(
377 TestError,
378 "test_lazy_hash_inheritance: type not initialised by hash()");
379 Py_DECREF(obj);
380 return NULL;
381 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 if (type->tp_hash != PyType_Type.tp_hash) {
384 PyErr_SetString(
385 TestError,
386 "test_lazy_hash_inheritance: unexpected hash function");
387 Py_DECREF(obj);
388 return NULL;
389 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000394}
395
396
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700397/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000398 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000399
400 Note that the meat of the test is contained in testcapi_long.h.
401 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700402 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000403 dependence on type names makes it impossible to use a parameterized
404 function. A giant macro would be even worse than this. A C++ template
405 would be perfect.
406
407 The "report an error" functions are deliberately not part of the #include
408 file: if the test fails, you can set a breakpoint in the appropriate
409 error function directly, and crawl back from there in the debugger.
410*/
411
412#define UNBIND(X) Py_DECREF(X); (X) = NULL
413
414static PyObject *
415raise_test_long_error(const char* msg)
416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000418}
419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420#define TESTNAME test_long_api_inner
421#define TYPENAME long
422#define F_S_TO_PY PyLong_FromLong
423#define F_PY_TO_S PyLong_AsLong
424#define F_U_TO_PY PyLong_FromUnsignedLong
425#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000426
427#include "testcapi_long.h"
428
429static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530430test_long_api(PyObject* self, PyObject *Py_UNUSED(ignored))
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000433}
434
435#undef TESTNAME
436#undef TYPENAME
437#undef F_S_TO_PY
438#undef F_PY_TO_S
439#undef F_U_TO_PY
440#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000441
Tim Peters91621db2001-06-12 20:10:01 +0000442static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000443raise_test_longlong_error(const char* msg)
444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000446}
447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700449#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450#define F_S_TO_PY PyLong_FromLongLong
451#define F_PY_TO_S PyLong_AsLongLong
452#define F_U_TO_PY PyLong_FromUnsignedLongLong
453#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000454
455#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000456
457static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000458test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000461}
462
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000463#undef TESTNAME
464#undef TYPENAME
465#undef F_S_TO_PY
466#undef F_PY_TO_S
467#undef F_U_TO_PY
468#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000469
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000470/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
471 is tested by test_long_api_inner. This test will concentrate on proper
472 handling of overflow.
473*/
474
475static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530476test_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 PyObject *num, *one, *temp;
479 long value;
480 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 /* Test that overflow is set properly for a large value. */
483 /* num is a number larger than LONG_MAX even on 64-bit platforms */
484 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
485 if (num == NULL)
486 return NULL;
487 overflow = 1234;
488 value = PyLong_AsLongAndOverflow(num, &overflow);
489 Py_DECREF(num);
490 if (value == -1 && PyErr_Occurred())
491 return NULL;
492 if (value != -1)
493 return raiseTestError("test_long_and_overflow",
494 "return value was not set to -1");
495 if (overflow != 1)
496 return raiseTestError("test_long_and_overflow",
497 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 /* Same again, with num = LONG_MAX + 1 */
500 num = PyLong_FromLong(LONG_MAX);
501 if (num == NULL)
502 return NULL;
503 one = PyLong_FromLong(1L);
504 if (one == NULL) {
505 Py_DECREF(num);
506 return NULL;
507 }
508 temp = PyNumber_Add(num, one);
509 Py_DECREF(one);
510 Py_DECREF(num);
511 num = temp;
512 if (num == NULL)
513 return NULL;
514 overflow = 0;
515 value = PyLong_AsLongAndOverflow(num, &overflow);
516 Py_DECREF(num);
517 if (value == -1 && PyErr_Occurred())
518 return NULL;
519 if (value != -1)
520 return raiseTestError("test_long_and_overflow",
521 "return value was not set to -1");
522 if (overflow != 1)
523 return raiseTestError("test_long_and_overflow",
524 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 /* Test that overflow is set properly for a large negative value. */
527 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
528 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
529 if (num == NULL)
530 return NULL;
531 overflow = 1234;
532 value = PyLong_AsLongAndOverflow(num, &overflow);
533 Py_DECREF(num);
534 if (value == -1 && PyErr_Occurred())
535 return NULL;
536 if (value != -1)
537 return raiseTestError("test_long_and_overflow",
538 "return value was not set to -1");
539 if (overflow != -1)
540 return raiseTestError("test_long_and_overflow",
541 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 /* Same again, with num = LONG_MIN - 1 */
544 num = PyLong_FromLong(LONG_MIN);
545 if (num == NULL)
546 return NULL;
547 one = PyLong_FromLong(1L);
548 if (one == NULL) {
549 Py_DECREF(num);
550 return NULL;
551 }
552 temp = PyNumber_Subtract(num, one);
553 Py_DECREF(one);
554 Py_DECREF(num);
555 num = temp;
556 if (num == NULL)
557 return NULL;
558 overflow = 0;
559 value = PyLong_AsLongAndOverflow(num, &overflow);
560 Py_DECREF(num);
561 if (value == -1 && PyErr_Occurred())
562 return NULL;
563 if (value != -1)
564 return raiseTestError("test_long_and_overflow",
565 "return value was not set to -1");
566 if (overflow != -1)
567 return raiseTestError("test_long_and_overflow",
568 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 /* Test that overflow is cleared properly for small values. */
571 num = PyLong_FromString("FF", NULL, 16);
572 if (num == NULL)
573 return NULL;
574 overflow = 1234;
575 value = PyLong_AsLongAndOverflow(num, &overflow);
576 Py_DECREF(num);
577 if (value == -1 && PyErr_Occurred())
578 return NULL;
579 if (value != 0xFF)
580 return raiseTestError("test_long_and_overflow",
581 "expected return value 0xFF");
582 if (overflow != 0)
583 return raiseTestError("test_long_and_overflow",
584 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 num = PyLong_FromString("-FF", NULL, 16);
587 if (num == NULL)
588 return NULL;
589 overflow = 0;
590 value = PyLong_AsLongAndOverflow(num, &overflow);
591 Py_DECREF(num);
592 if (value == -1 && PyErr_Occurred())
593 return NULL;
594 if (value != -0xFF)
595 return raiseTestError("test_long_and_overflow",
596 "expected return value 0xFF");
597 if (overflow != 0)
598 return raiseTestError("test_long_and_overflow",
599 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 num = PyLong_FromLong(LONG_MAX);
602 if (num == NULL)
603 return NULL;
604 overflow = 1234;
605 value = PyLong_AsLongAndOverflow(num, &overflow);
606 Py_DECREF(num);
607 if (value == -1 && PyErr_Occurred())
608 return NULL;
609 if (value != LONG_MAX)
610 return raiseTestError("test_long_and_overflow",
611 "expected return value LONG_MAX");
612 if (overflow != 0)
613 return raiseTestError("test_long_and_overflow",
614 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 num = PyLong_FromLong(LONG_MIN);
617 if (num == NULL)
618 return NULL;
619 overflow = 0;
620 value = PyLong_AsLongAndOverflow(num, &overflow);
621 Py_DECREF(num);
622 if (value == -1 && PyErr_Occurred())
623 return NULL;
624 if (value != LONG_MIN)
625 return raiseTestError("test_long_and_overflow",
626 "expected return value LONG_MIN");
627 if (overflow != 0)
628 return raiseTestError("test_long_and_overflow",
629 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000630
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200631 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000632}
633
Mark Dickinson93f562c2010-01-30 10:30:15 +0000634/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700635 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000636 concentrate on proper handling of overflow.
637*/
638
639static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530640test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson93f562c2010-01-30 10:30:15 +0000641{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700643 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 /* Test that overflow is set properly for a large value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500647 /* num is a number larger than LLONG_MAX on a typical machine. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
649 if (num == NULL)
650 return NULL;
651 overflow = 1234;
652 value = PyLong_AsLongLongAndOverflow(num, &overflow);
653 Py_DECREF(num);
654 if (value == -1 && PyErr_Occurred())
655 return NULL;
656 if (value != -1)
657 return raiseTestError("test_long_long_and_overflow",
658 "return value was not set to -1");
659 if (overflow != 1)
660 return raiseTestError("test_long_long_and_overflow",
661 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000662
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500663 /* Same again, with num = LLONG_MAX + 1 */
664 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 if (num == NULL)
666 return NULL;
667 one = PyLong_FromLong(1L);
668 if (one == NULL) {
669 Py_DECREF(num);
670 return NULL;
671 }
672 temp = PyNumber_Add(num, one);
673 Py_DECREF(one);
674 Py_DECREF(num);
675 num = temp;
676 if (num == NULL)
677 return NULL;
678 overflow = 0;
679 value = PyLong_AsLongLongAndOverflow(num, &overflow);
680 Py_DECREF(num);
681 if (value == -1 && PyErr_Occurred())
682 return NULL;
683 if (value != -1)
684 return raiseTestError("test_long_long_and_overflow",
685 "return value was not set to -1");
686 if (overflow != 1)
687 return raiseTestError("test_long_long_and_overflow",
688 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 /* Test that overflow is set properly for a large negative value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500691 /* num is a number smaller than LLONG_MIN on a typical platform */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
693 if (num == NULL)
694 return NULL;
695 overflow = 1234;
696 value = PyLong_AsLongLongAndOverflow(num, &overflow);
697 Py_DECREF(num);
698 if (value == -1 && PyErr_Occurred())
699 return NULL;
700 if (value != -1)
701 return raiseTestError("test_long_long_and_overflow",
702 "return value was not set to -1");
703 if (overflow != -1)
704 return raiseTestError("test_long_long_and_overflow",
705 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000706
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500707 /* Same again, with num = LLONG_MIN - 1 */
708 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 if (num == NULL)
710 return NULL;
711 one = PyLong_FromLong(1L);
712 if (one == NULL) {
713 Py_DECREF(num);
714 return NULL;
715 }
716 temp = PyNumber_Subtract(num, one);
717 Py_DECREF(one);
718 Py_DECREF(num);
719 num = temp;
720 if (num == NULL)
721 return NULL;
722 overflow = 0;
723 value = PyLong_AsLongLongAndOverflow(num, &overflow);
724 Py_DECREF(num);
725 if (value == -1 && PyErr_Occurred())
726 return NULL;
727 if (value != -1)
728 return raiseTestError("test_long_long_and_overflow",
729 "return value was not set to -1");
730 if (overflow != -1)
731 return raiseTestError("test_long_long_and_overflow",
732 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 /* Test that overflow is cleared properly for small values. */
735 num = PyLong_FromString("FF", NULL, 16);
736 if (num == NULL)
737 return NULL;
738 overflow = 1234;
739 value = PyLong_AsLongLongAndOverflow(num, &overflow);
740 Py_DECREF(num);
741 if (value == -1 && PyErr_Occurred())
742 return NULL;
743 if (value != 0xFF)
744 return raiseTestError("test_long_long_and_overflow",
745 "expected return value 0xFF");
746 if (overflow != 0)
747 return raiseTestError("test_long_long_and_overflow",
748 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 num = PyLong_FromString("-FF", NULL, 16);
751 if (num == NULL)
752 return NULL;
753 overflow = 0;
754 value = PyLong_AsLongLongAndOverflow(num, &overflow);
755 Py_DECREF(num);
756 if (value == -1 && PyErr_Occurred())
757 return NULL;
758 if (value != -0xFF)
759 return raiseTestError("test_long_long_and_overflow",
760 "expected return value 0xFF");
761 if (overflow != 0)
762 return raiseTestError("test_long_long_and_overflow",
763 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000764
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500765 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 if (num == NULL)
767 return NULL;
768 overflow = 1234;
769 value = PyLong_AsLongLongAndOverflow(num, &overflow);
770 Py_DECREF(num);
771 if (value == -1 && PyErr_Occurred())
772 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500773 if (value != LLONG_MAX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500775 "expected return value LLONG_MAX");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 if (overflow != 0)
777 return raiseTestError("test_long_long_and_overflow",
778 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000779
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500780 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 if (num == NULL)
782 return NULL;
783 overflow = 0;
784 value = PyLong_AsLongLongAndOverflow(num, &overflow);
785 Py_DECREF(num);
786 if (value == -1 && PyErr_Occurred())
787 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500788 if (value != LLONG_MIN)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500790 "expected return value LLONG_MIN");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 if (overflow != 0)
792 return raiseTestError("test_long_long_and_overflow",
793 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000794
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200795 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000796}
797
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200798/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
799 non-integer arguments are handled correctly. It should be extended to
800 test overflow handling.
801 */
802
803static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530804test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200805{
806 size_t out_u;
807 Py_ssize_t out_s;
808
809 Py_INCREF(Py_None);
810
811 out_u = PyLong_AsSize_t(Py_None);
812 if (out_u != (size_t)-1 || !PyErr_Occurred())
813 return raiseTestError("test_long_as_size_t",
814 "PyLong_AsSize_t(None) didn't complain");
815 if (!PyErr_ExceptionMatches(PyExc_TypeError))
816 return raiseTestError("test_long_as_size_t",
817 "PyLong_AsSize_t(None) raised "
818 "something other than TypeError");
819 PyErr_Clear();
820
821 out_s = PyLong_AsSsize_t(Py_None);
822 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
823 return raiseTestError("test_long_as_size_t",
824 "PyLong_AsSsize_t(None) didn't complain");
825 if (!PyErr_ExceptionMatches(PyExc_TypeError))
826 return raiseTestError("test_long_as_size_t",
827 "PyLong_AsSsize_t(None) raised "
828 "something other than TypeError");
829 PyErr_Clear();
830
831 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
832 return Py_None;
833}
834
Zackery Spytzdc247652019-06-06 14:39:23 -0600835static PyObject *
836test_long_as_unsigned_long_long_mask(PyObject *self,
837 PyObject *Py_UNUSED(ignored))
838{
839 unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL);
840
841 if (res != (unsigned long long)-1 || !PyErr_Occurred()) {
842 return raiseTestError("test_long_as_unsigned_long_long_mask",
843 "PyLong_AsUnsignedLongLongMask(NULL) didn't "
844 "complain");
845 }
846 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
847 return raiseTestError("test_long_as_unsigned_long_long_mask",
848 "PyLong_AsUnsignedLongLongMask(NULL) raised "
849 "something other than SystemError");
850 }
851 PyErr_Clear();
852 Py_RETURN_NONE;
853}
854
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200855/* Test the PyLong_AsDouble API. At present this just tests that
856 non-integer arguments are handled correctly.
857 */
858
859static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530860test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200861{
862 double out;
863
864 Py_INCREF(Py_None);
865
866 out = PyLong_AsDouble(Py_None);
867 if (out != -1.0 || !PyErr_Occurred())
868 return raiseTestError("test_long_as_double",
869 "PyLong_AsDouble(None) didn't complain");
870 if (!PyErr_ExceptionMatches(PyExc_TypeError))
871 return raiseTestError("test_long_as_double",
872 "PyLong_AsDouble(None) raised "
873 "something other than TypeError");
874 PyErr_Clear();
875
876 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
877 return Py_None;
878}
879
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700880/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000881 for both long and int arguments. The test may leak a little memory if
882 it fails.
883*/
884static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530885test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersd38b1c72001-09-30 05:09:37 +0000886{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700888 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 tuple = PyTuple_New(1);
891 if (tuple == NULL)
892 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 num = PyLong_FromLong(42);
895 if (num == NULL)
896 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300901 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300903 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 if (value != 42)
905 return raiseTestError("test_L_code",
906 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 Py_DECREF(num);
909 num = PyLong_FromLong(42);
910 if (num == NULL)
911 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300916 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300918 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 if (value != 42)
920 return raiseTestError("test_L_code",
921 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200924 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000925}
926
Serhiy Storchakace412872016-05-08 23:36:44 +0300927static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300928return_none(void *unused)
929{
930 Py_RETURN_NONE;
931}
932
933static PyObject *
934raise_error(void *unused)
935{
936 PyErr_SetNone(PyExc_ValueError);
937 return NULL;
938}
939
940static int
941test_buildvalue_N_error(const char *fmt)
942{
943 PyObject *arg, *res;
944
945 arg = PyList_New(0);
946 if (arg == NULL) {
947 return -1;
948 }
949
950 Py_INCREF(arg);
951 res = Py_BuildValue(fmt, return_none, NULL, arg);
952 if (res == NULL) {
953 return -1;
954 }
955 Py_DECREF(res);
956 if (Py_REFCNT(arg) != 1) {
957 PyErr_Format(TestError, "test_buildvalue_N: "
958 "arg was not decrefed in successful "
959 "Py_BuildValue(\"%s\")", fmt);
960 return -1;
961 }
962
963 Py_INCREF(arg);
964 res = Py_BuildValue(fmt, raise_error, NULL, arg);
965 if (res != NULL || !PyErr_Occurred()) {
966 PyErr_Format(TestError, "test_buildvalue_N: "
967 "Py_BuildValue(\"%s\") didn't complain", fmt);
968 return -1;
969 }
970 PyErr_Clear();
971 if (Py_REFCNT(arg) != 1) {
972 PyErr_Format(TestError, "test_buildvalue_N: "
973 "arg was not decrefed in failed "
974 "Py_BuildValue(\"%s\")", fmt);
975 return -1;
976 }
977 Py_DECREF(arg);
978 return 0;
979}
980
981static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +0200982test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300983{
984 PyObject *arg, *res;
985
986 arg = PyList_New(0);
987 if (arg == NULL) {
988 return NULL;
989 }
990 Py_INCREF(arg);
991 res = Py_BuildValue("N", arg);
992 if (res == NULL) {
993 return NULL;
994 }
995 if (res != arg) {
996 return raiseTestError("test_buildvalue_N",
997 "Py_BuildValue(\"N\") returned wrong result");
998 }
999 if (Py_REFCNT(arg) != 2) {
1000 return raiseTestError("test_buildvalue_N",
1001 "arg was not decrefed in Py_BuildValue(\"N\")");
1002 }
1003 Py_DECREF(res);
1004 Py_DECREF(arg);
1005
1006 if (test_buildvalue_N_error("O&N") < 0)
1007 return NULL;
1008 if (test_buildvalue_N_error("(O&N)") < 0)
1009 return NULL;
1010 if (test_buildvalue_N_error("[O&N]") < 0)
1011 return NULL;
1012 if (test_buildvalue_N_error("{O&N}") < 0)
1013 return NULL;
1014 if (test_buildvalue_N_error("{()O&(())N}") < 0)
1015 return NULL;
1016
1017 Py_RETURN_NONE;
1018}
1019
1020
1021static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +03001022get_args(PyObject *self, PyObject *args)
1023{
1024 if (args == NULL) {
1025 args = Py_None;
1026 }
1027 Py_INCREF(args);
1028 return args;
1029}
1030
1031static PyObject *
1032get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1033{
1034 if (kwargs == NULL) {
1035 kwargs = Py_None;
1036 }
1037 Py_INCREF(kwargs);
1038 return kwargs;
1039}
1040
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001041/* Test tuple argument processing */
1042static PyObject *
1043getargs_tuple(PyObject *self, PyObject *args)
1044{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 int a, b, c;
1046 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1047 return NULL;
1048 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001049}
1050
Christian Heimes380f7f22008-02-28 11:19:05 +00001051/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001052static PyObject *
1053getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001056 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1060 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1061 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1062 return NULL;
1063 return Py_BuildValue("iiiiiiiiii",
1064 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1065 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001066}
1067
Larry Hastings83a9f482012-03-20 20:06:16 +00001068/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1069static PyObject *
1070getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1071{
1072 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1073 int required = -1;
1074 int optional = -1;
1075 int keyword_only = -1;
1076
1077 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1078 &required, &optional, &keyword_only))
1079 return NULL;
1080 return Py_BuildValue("iii", required, optional, keyword_only);
1081}
1082
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001083/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1084static PyObject *
1085getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1086{
1087 static char *keywords[] = {"", "", "keyword", NULL};
1088 int required = -1;
1089 int optional = -1;
1090 int keyword = -1;
1091
1092 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1093 &required, &optional, &keyword))
1094 return NULL;
1095 return Py_BuildValue("iii", required, optional, keyword);
1096}
1097
Thomas Heller3457e4b2003-04-24 16:14:27 +00001098/* Functions to call PyArg_ParseTuple with integer format codes,
1099 and return the result.
1100*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001101static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001102getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 unsigned char value;
1105 if (!PyArg_ParseTuple(args, "b", &value))
1106 return NULL;
1107 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001108}
1109
Thomas Heller3457e4b2003-04-24 16:14:27 +00001110static PyObject *
1111getargs_B(PyObject *self, PyObject *args)
1112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 unsigned char value;
1114 if (!PyArg_ParseTuple(args, "B", &value))
1115 return NULL;
1116 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001117}
1118
1119static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001120getargs_h(PyObject *self, PyObject *args)
1121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 short value;
1123 if (!PyArg_ParseTuple(args, "h", &value))
1124 return NULL;
1125 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001126}
1127
1128static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001129getargs_H(PyObject *self, PyObject *args)
1130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 unsigned short value;
1132 if (!PyArg_ParseTuple(args, "H", &value))
1133 return NULL;
1134 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001135}
1136
1137static PyObject *
1138getargs_I(PyObject *self, PyObject *args)
1139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 unsigned int value;
1141 if (!PyArg_ParseTuple(args, "I", &value))
1142 return NULL;
1143 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001144}
1145
1146static PyObject *
1147getargs_k(PyObject *self, PyObject *args)
1148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 unsigned long value;
1150 if (!PyArg_ParseTuple(args, "k", &value))
1151 return NULL;
1152 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001153}
1154
1155static PyObject *
1156getargs_i(PyObject *self, PyObject *args)
1157{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 int value;
1159 if (!PyArg_ParseTuple(args, "i", &value))
1160 return NULL;
1161 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001162}
1163
Thomas Hellera4ea6032003-04-17 18:55:45 +00001164static PyObject *
1165getargs_l(PyObject *self, PyObject *args)
1166{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 long value;
1168 if (!PyArg_ParseTuple(args, "l", &value))
1169 return NULL;
1170 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001171}
1172
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001173static PyObject *
1174getargs_n(PyObject *self, PyObject *args)
1175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 Py_ssize_t value;
1177 if (!PyArg_ParseTuple(args, "n", &value))
1178 return NULL;
1179 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001180}
1181
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001182static PyObject *
1183getargs_p(PyObject *self, PyObject *args)
1184{
1185 int value;
1186 if (!PyArg_ParseTuple(args, "p", &value))
1187 return NULL;
1188 return PyLong_FromLong(value);
1189}
1190
Thomas Hellera4ea6032003-04-17 18:55:45 +00001191static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001192getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001193{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001194 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 if (!PyArg_ParseTuple(args, "L", &value))
1196 return NULL;
1197 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001198}
1199
Thomas Hellera4ea6032003-04-17 18:55:45 +00001200static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001201getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001202{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001203 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 if (!PyArg_ParseTuple(args, "K", &value))
1205 return NULL;
1206 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001207}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001208
1209/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001210 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001211static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301212test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 PyObject *tuple, *num;
1215 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 tuple = PyTuple_New(1);
1218 if (tuple == NULL)
1219 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 /* a number larger than ULONG_MAX even on 64-bit platforms */
1222 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1223 if (num == NULL)
1224 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 value = PyLong_AsUnsignedLongMask(num);
1227 if (value != ULONG_MAX)
1228 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001229 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001234 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001236 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 if (value != ULONG_MAX)
1238 return raiseTestError("test_k_code",
1239 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 Py_DECREF(num);
1242 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1243 if (num == NULL)
1244 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 value = PyLong_AsUnsignedLongMask(num);
1247 if (value != (unsigned long)-0x42)
1248 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001249 "PyLong_AsUnsignedLongMask() returned wrong "
1250 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001255 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001257 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 if (value != (unsigned long)-0x42)
1259 return raiseTestError("test_k_code",
1260 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001263 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001264}
1265
Victor Stinner06e49dd2010-06-13 18:21:50 +00001266static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001267getargs_f(PyObject *self, PyObject *args)
1268{
1269 float f;
1270 if (!PyArg_ParseTuple(args, "f", &f))
1271 return NULL;
1272 return PyFloat_FromDouble(f);
1273}
1274
1275static PyObject *
1276getargs_d(PyObject *self, PyObject *args)
1277{
1278 double d;
1279 if (!PyArg_ParseTuple(args, "d", &d))
1280 return NULL;
1281 return PyFloat_FromDouble(d);
1282}
1283
1284static PyObject *
1285getargs_D(PyObject *self, PyObject *args)
1286{
1287 Py_complex cval;
1288 if (!PyArg_ParseTuple(args, "D", &cval))
1289 return NULL;
1290 return PyComplex_FromCComplex(cval);
1291}
1292
1293static PyObject *
1294getargs_S(PyObject *self, PyObject *args)
1295{
1296 PyObject *obj;
1297 if (!PyArg_ParseTuple(args, "S", &obj))
1298 return NULL;
1299 Py_INCREF(obj);
1300 return obj;
1301}
1302
1303static PyObject *
1304getargs_Y(PyObject *self, PyObject *args)
1305{
1306 PyObject *obj;
1307 if (!PyArg_ParseTuple(args, "Y", &obj))
1308 return NULL;
1309 Py_INCREF(obj);
1310 return obj;
1311}
1312
1313static PyObject *
1314getargs_U(PyObject *self, PyObject *args)
1315{
1316 PyObject *obj;
1317 if (!PyArg_ParseTuple(args, "U", &obj))
1318 return NULL;
1319 Py_INCREF(obj);
1320 return obj;
1321}
1322
1323static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001324getargs_c(PyObject *self, PyObject *args)
1325{
1326 char c;
1327 if (!PyArg_ParseTuple(args, "c", &c))
1328 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001329 return PyLong_FromLong((unsigned char)c);
1330}
1331
1332static PyObject *
1333getargs_C(PyObject *self, PyObject *args)
1334{
1335 int c;
1336 if (!PyArg_ParseTuple(args, "C", &c))
1337 return NULL;
1338 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001339}
1340
1341static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001342getargs_s(PyObject *self, PyObject *args)
1343{
1344 char *str;
1345 if (!PyArg_ParseTuple(args, "s", &str))
1346 return NULL;
1347 return PyBytes_FromString(str);
1348}
1349
1350static PyObject *
1351getargs_s_star(PyObject *self, PyObject *args)
1352{
1353 Py_buffer buffer;
1354 PyObject *bytes;
1355 if (!PyArg_ParseTuple(args, "s*", &buffer))
1356 return NULL;
1357 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1358 PyBuffer_Release(&buffer);
1359 return bytes;
1360}
1361
1362static PyObject *
1363getargs_s_hash(PyObject *self, PyObject *args)
1364{
1365 char *str;
1366 Py_ssize_t size;
1367 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1368 return NULL;
1369 return PyBytes_FromStringAndSize(str, size);
1370}
1371
1372static PyObject *
1373getargs_z(PyObject *self, PyObject *args)
1374{
1375 char *str;
1376 if (!PyArg_ParseTuple(args, "z", &str))
1377 return NULL;
1378 if (str != NULL)
1379 return PyBytes_FromString(str);
1380 else
1381 Py_RETURN_NONE;
1382}
1383
1384static PyObject *
1385getargs_z_star(PyObject *self, PyObject *args)
1386{
1387 Py_buffer buffer;
1388 PyObject *bytes;
1389 if (!PyArg_ParseTuple(args, "z*", &buffer))
1390 return NULL;
1391 if (buffer.buf != NULL)
1392 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1393 else {
1394 Py_INCREF(Py_None);
1395 bytes = Py_None;
1396 }
1397 PyBuffer_Release(&buffer);
1398 return bytes;
1399}
1400
1401static PyObject *
1402getargs_z_hash(PyObject *self, PyObject *args)
1403{
1404 char *str;
1405 Py_ssize_t size;
1406 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1407 return NULL;
1408 if (str != NULL)
1409 return PyBytes_FromStringAndSize(str, size);
1410 else
1411 Py_RETURN_NONE;
1412}
1413
1414static PyObject *
1415getargs_y(PyObject *self, PyObject *args)
1416{
1417 char *str;
1418 if (!PyArg_ParseTuple(args, "y", &str))
1419 return NULL;
1420 return PyBytes_FromString(str);
1421}
1422
1423static PyObject *
1424getargs_y_star(PyObject *self, PyObject *args)
1425{
1426 Py_buffer buffer;
1427 PyObject *bytes;
1428 if (!PyArg_ParseTuple(args, "y*", &buffer))
1429 return NULL;
1430 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1431 PyBuffer_Release(&buffer);
1432 return bytes;
1433}
1434
1435static PyObject *
1436getargs_y_hash(PyObject *self, PyObject *args)
1437{
1438 char *str;
1439 Py_ssize_t size;
1440 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1441 return NULL;
1442 return PyBytes_FromStringAndSize(str, size);
1443}
1444
1445static PyObject *
1446getargs_u(PyObject *self, PyObject *args)
1447{
1448 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001449 if (!PyArg_ParseTuple(args, "u", &str))
1450 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001451 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001452}
1453
1454static PyObject *
1455getargs_u_hash(PyObject *self, PyObject *args)
1456{
1457 Py_UNICODE *str;
1458 Py_ssize_t size;
1459 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1460 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001461 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001462}
1463
1464static PyObject *
1465getargs_Z(PyObject *self, PyObject *args)
1466{
1467 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001468 if (!PyArg_ParseTuple(args, "Z", &str))
1469 return NULL;
1470 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001471 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001472 } else
1473 Py_RETURN_NONE;
1474}
1475
1476static PyObject *
1477getargs_Z_hash(PyObject *self, PyObject *args)
1478{
1479 Py_UNICODE *str;
1480 Py_ssize_t size;
1481 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1482 return NULL;
1483 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001484 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001485 else
1486 Py_RETURN_NONE;
1487}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001488
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001489static PyObject *
1490getargs_es(PyObject *self, PyObject *args)
1491{
1492 PyObject *arg, *result;
1493 const char *encoding = NULL;
1494 char *str;
1495
1496 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1497 return NULL;
1498 if (!PyArg_Parse(arg, "es", encoding, &str))
1499 return NULL;
1500 result = PyBytes_FromString(str);
1501 PyMem_Free(str);
1502 return result;
1503}
1504
1505static PyObject *
1506getargs_et(PyObject *self, PyObject *args)
1507{
1508 PyObject *arg, *result;
1509 const char *encoding = NULL;
1510 char *str;
1511
1512 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1513 return NULL;
1514 if (!PyArg_Parse(arg, "et", encoding, &str))
1515 return NULL;
1516 result = PyBytes_FromString(str);
1517 PyMem_Free(str);
1518 return result;
1519}
1520
1521static PyObject *
1522getargs_es_hash(PyObject *self, PyObject *args)
1523{
1524 PyObject *arg, *result;
1525 const char *encoding = NULL;
1526 PyByteArrayObject *buffer = NULL;
1527 char *str = NULL;
1528 Py_ssize_t size;
1529
1530 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1531 return NULL;
1532 if (buffer != NULL) {
1533 str = PyByteArray_AS_STRING(buffer);
1534 size = PyByteArray_GET_SIZE(buffer);
1535 }
1536 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1537 return NULL;
1538 result = PyBytes_FromStringAndSize(str, size);
1539 if (buffer == NULL)
1540 PyMem_Free(str);
1541 return result;
1542}
1543
1544static PyObject *
1545getargs_et_hash(PyObject *self, PyObject *args)
1546{
1547 PyObject *arg, *result;
1548 const char *encoding = NULL;
1549 PyByteArrayObject *buffer = NULL;
1550 char *str = NULL;
1551 Py_ssize_t size;
1552
1553 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1554 return NULL;
1555 if (buffer != NULL) {
1556 str = PyByteArray_AS_STRING(buffer);
1557 size = PyByteArray_GET_SIZE(buffer);
1558 }
1559 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1560 return NULL;
1561 result = PyBytes_FromStringAndSize(str, size);
1562 if (buffer == NULL)
1563 PyMem_Free(str);
1564 return result;
1565}
1566
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001567/* Test the s and z codes for PyArg_ParseTuple.
1568*/
1569static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301570test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001571{
1572 /* Unicode strings should be accepted */
1573 PyObject *tuple, *obj;
1574 char *value;
1575
1576 tuple = PyTuple_New(1);
1577 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001579
1580 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001582 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001584
1585 PyTuple_SET_ITEM(tuple, 0, obj);
1586
1587 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001589 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001590 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1591 return NULL;
1592 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001593
Oren Milmanba7d7362017-08-29 11:58:27 +03001594 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1595 return NULL;
1596 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001597
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001598 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001599 Py_RETURN_NONE;
1600}
1601
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001602static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001603parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001604{
Larry Hastings8f904da2012-06-22 03:56:29 -07001605 PyObject *sub_args;
1606 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001607 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001608 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001609
Larry Hastings8f904da2012-06-22 03:56:29 -07001610 Py_ssize_t i, size;
1611 char *keywords[8 + 1]; /* space for NULL at end */
1612 PyObject *o;
1613 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001614
Larry Hastings8f904da2012-06-22 03:56:29 -07001615 int result;
1616 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001617
Larry Hastings22701e82012-08-08 14:52:22 -07001618 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001619
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001620 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001621 &sub_args, &sub_kwargs,
1622 &sub_format, &sub_keywords))
1623 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001624
Larry Hastings8f904da2012-06-22 03:56:29 -07001625 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1626 PyErr_SetString(PyExc_ValueError,
1627 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1628 return NULL;
1629 }
1630
1631 memset(buffers, 0, sizeof(buffers));
1632 memset(converted, 0, sizeof(converted));
1633 memset(keywords, 0, sizeof(keywords));
1634
1635 size = PySequence_Fast_GET_SIZE(sub_keywords);
1636 if (size > 8) {
1637 PyErr_SetString(PyExc_ValueError,
1638 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1639 goto exit;
1640 }
1641
1642 for (i = 0; i < size; i++) {
1643 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1644 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1645 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001646 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001647 goto exit;
1648 }
1649 keywords[i] = PyBytes_AS_STRING(converted[i]);
1650 }
1651
1652 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1653 sub_format, keywords,
1654 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1655 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1656
1657 if (result) {
1658 return_value = Py_None;
1659 Py_INCREF(Py_None);
1660 }
1661
1662exit:
1663 size = sizeof(converted) / sizeof(converted[0]);
1664 for (i = 0; i < size; i++) {
1665 Py_XDECREF(converted[i]);
1666 }
1667 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001668}
1669
Benjamin Peterson92035012008-12-27 16:00:54 +00001670static volatile int x;
1671
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001672#if USE_UNICODE_WCHAR_CACHE
Inada Naoki2c4928d2020-06-17 20:09:44 +09001673/* Ignore use of deprecated APIs */
1674_Py_COMP_DIAG_PUSH
1675_Py_COMP_DIAG_IGNORE_DEPR_DECLS
1676
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001677/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1678 of an error.
1679*/
1680static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301681test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001682{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 PyObject *tuple, *obj;
1684 Py_UNICODE *value;
1685 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1688 /* Just use the macro and check that it compiles */
1689 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 tuple = PyTuple_New(1);
1692 if (tuple == NULL)
1693 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 obj = PyUnicode_Decode("test", strlen("test"),
1696 "ascii", NULL);
1697 if (obj == NULL)
1698 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001703 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001705 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 if (value != PyUnicode_AS_UNICODE(obj))
1707 return raiseTestError("test_u_code",
1708 "u code returned wrong value for u'test'");
1709 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001710 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001712 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 if (value != PyUnicode_AS_UNICODE(obj) ||
1714 len != PyUnicode_GET_SIZE(obj))
1715 return raiseTestError("test_u_code",
1716 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001719 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001720}
1721
Guido van Rossumfb67be22007-08-29 18:38:11 +00001722/* Test Z and Z# codes for PyArg_ParseTuple */
1723static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301724test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001725{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001727 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 tuple = PyTuple_New(2);
1731 if (tuple == NULL)
1732 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 obj = PyUnicode_FromString("test");
1735 PyTuple_SET_ITEM(tuple, 0, obj);
1736 Py_INCREF(Py_None);
1737 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 /* swap values on purpose */
1740 value1 = NULL;
1741 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001744 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001746 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 if (value1 != PyUnicode_AS_UNICODE(obj))
1748 return raiseTestError("test_Z_code",
1749 "Z code returned wrong value for 'test'");
1750 if (value2 != NULL)
1751 return raiseTestError("test_Z_code",
1752 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 value1 = NULL;
1755 value2 = PyUnicode_AS_UNICODE(obj);
1756 len1 = -1;
1757 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001760 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1761 &value2, &len2))
1762 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001764 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1766 len1 != PyUnicode_GET_SIZE(obj))
1767 return raiseTestError("test_Z_code",
1768 "Z# code returned wrong values for 'test'");
1769 if (value2 != NULL ||
1770 len2 != 0)
1771 return raiseTestError("test_Z_code",
1772 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 Py_DECREF(tuple);
1775 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001776}
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001777_Py_COMP_DIAG_POP
1778#endif /* USE_UNICODE_WCHAR_CACHE */
Guido van Rossumfb67be22007-08-29 18:38:11 +00001779
Thomas Wouters477c8d52006-05-27 19:21:47 +00001780static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301781test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001782{
1783#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1785 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001786 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001787#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1789 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001790#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1794 if (wide == NULL)
1795 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1798 if (utf8 == NULL) {
1799 Py_DECREF(wide);
1800 return NULL;
1801 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001802
Victor Stinner8ef18872011-11-21 02:06:57 +01001803 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 Py_DECREF(wide);
1805 Py_DECREF(utf8);
1806 return raiseTestError("test_widechar",
1807 "wide string and utf8 string "
1808 "have different length");
1809 }
1810 if (PyUnicode_Compare(wide, utf8)) {
1811 Py_DECREF(wide);
1812 Py_DECREF(utf8);
1813 if (PyErr_Occurred())
1814 return NULL;
1815 return raiseTestError("test_widechar",
1816 "wide string and utf8 string "
1817 "are different");
1818 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 Py_DECREF(wide);
1821 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001822
1823#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1824 wide = PyUnicode_FromWideChar(invalid, 1);
1825 if (wide == NULL)
1826 PyErr_Clear();
1827 else
1828 return raiseTestError("test_widechar",
1829 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1830
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001831#if USE_UNICODE_WCHAR_CACHE
1832/* Ignore use of deprecated APIs */
1833_Py_COMP_DIAG_PUSH
1834_Py_COMP_DIAG_IGNORE_DEPR_DECLS
Victor Stinnere3b47152011-12-09 20:49:49 +01001835 wide = PyUnicode_FromUnicode(invalid, 1);
1836 if (wide == NULL)
1837 PyErr_Clear();
1838 else
1839 return raiseTestError("test_widechar",
1840 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001841
1842 wide = PyUnicode_FromUnicode(NULL, 1);
1843 if (wide == NULL)
1844 return NULL;
1845 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001846 if (_PyUnicode_Ready(wide) < 0) {
1847 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001848 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001849 }
1850 else {
1851 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001852 return raiseTestError("test_widechar",
1853 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001854 }
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001855_Py_COMP_DIAG_POP
1856#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinnere3b47152011-12-09 20:49:49 +01001857#endif
1858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001860}
1861
1862static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001863unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001864{
1865 PyObject *unicode, *result;
1866 Py_ssize_t buflen, size;
1867 wchar_t *buffer;
1868
1869 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1870 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001871 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001872 if (buffer == NULL)
1873 return PyErr_NoMemory();
1874
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001875 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001876 if (size == -1) {
1877 PyMem_Free(buffer);
1878 return NULL;
1879 }
1880
1881 if (size < buflen)
1882 buflen = size + 1;
1883 else
1884 buflen = size;
1885 result = PyUnicode_FromWideChar(buffer, buflen);
1886 PyMem_Free(buffer);
1887 if (result == NULL)
1888 return NULL;
1889
1890 return Py_BuildValue("(Nn)", result, size);
1891}
1892
1893static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001894unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001895{
1896 PyObject *unicode, *result;
1897 Py_ssize_t size;
1898 wchar_t *buffer;
1899
1900 if (!PyArg_ParseTuple(args, "U", &unicode))
1901 return NULL;
1902
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001903 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001904 if (buffer == NULL)
1905 return NULL;
1906
1907 result = PyUnicode_FromWideChar(buffer, size + 1);
1908 PyMem_Free(buffer);
1909 if (result == NULL)
1910 return NULL;
1911 return Py_BuildValue("(Nn)", result, size);
1912}
1913
1914static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001915unicode_asucs4(PyObject *self, PyObject *args)
1916{
1917 PyObject *unicode, *result;
1918 Py_UCS4 *buffer;
1919 int copy_null;
1920 Py_ssize_t str_len, buf_len;
1921
1922 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1923 return NULL;
1924 }
1925
1926 buf_len = str_len + 1;
1927 buffer = PyMem_NEW(Py_UCS4, buf_len);
1928 if (buffer == NULL) {
1929 return PyErr_NoMemory();
1930 }
1931 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1932 buffer[str_len] = 0xffffU;
1933
1934 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1935 PyMem_FREE(buffer);
1936 return NULL;
1937 }
1938
1939 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1940 PyMem_FREE(buffer);
1941 return result;
1942}
1943
1944static PyObject *
Hai Shi5623ac82019-07-20 02:56:23 -05001945unicode_asutf8(PyObject *self, PyObject *args)
1946{
1947 PyObject *unicode;
1948 const char *buffer;
1949
1950 if (!PyArg_ParseTuple(args, "U", &unicode)) {
1951 return NULL;
1952 }
1953
1954 buffer = PyUnicode_AsUTF8(unicode);
1955 if (buffer == NULL) {
1956 return NULL;
1957 }
1958
1959 return PyBytes_FromString(buffer);
1960}
1961
1962static PyObject *
1963unicode_asutf8andsize(PyObject *self, PyObject *args)
1964{
1965 PyObject *unicode, *result;
1966 const char *buffer;
1967 Py_ssize_t utf8_len;
1968
1969 if(!PyArg_ParseTuple(args, "U", &unicode)) {
1970 return NULL;
1971 }
1972
Victor Stinneraca8c402019-09-30 21:14:26 +02001973 buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len);
Hai Shi5623ac82019-07-20 02:56:23 -05001974 if (buffer == NULL) {
1975 return NULL;
1976 }
1977
1978 result = PyBytes_FromString(buffer);
1979 if (result == NULL) {
1980 return NULL;
1981 }
1982
1983 return Py_BuildValue("(Nn)", result, utf8_len);
1984}
1985
1986static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001987unicode_findchar(PyObject *self, PyObject *args)
1988{
1989 PyObject *str;
1990 int direction;
1991 unsigned int ch;
1992 Py_ssize_t result;
1993 Py_ssize_t start, end;
1994
1995 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1996 &start, &end, &direction)) {
1997 return NULL;
1998 }
1999
2000 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
2001 if (result == -2)
2002 return NULL;
2003 else
2004 return PyLong_FromSsize_t(result);
2005}
2006
2007static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002008unicode_copycharacters(PyObject *self, PyObject *args)
2009{
2010 PyObject *from, *to, *to_copy;
2011 Py_ssize_t from_start, to_start, how_many, copied;
2012
2013 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
2014 &from, &from_start, &how_many)) {
2015 return NULL;
2016 }
2017
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002018 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
2019 PyUnicode_MAX_CHAR_VALUE(to)))) {
2020 return NULL;
2021 }
2022 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
2023 Py_DECREF(to_copy);
2024 return NULL;
2025 }
2026
2027 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
2028 from_start, how_many)) < 0) {
2029 Py_DECREF(to_copy);
2030 return NULL;
2031 }
2032
2033 return Py_BuildValue("(Nn)", to_copy, copied);
2034}
2035
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002036#if USE_UNICODE_WCHAR_CACHE
Inada Naoki13c90e82020-07-05 11:01:54 +09002037/* Ignore use of deprecated APIs */
2038_Py_COMP_DIAG_PUSH
2039_Py_COMP_DIAG_IGNORE_DEPR_DECLS
2040
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002041static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01002042unicode_encodedecimal(PyObject *self, PyObject *args)
2043{
2044 Py_UNICODE *unicode;
2045 Py_ssize_t length;
2046 char *errors = NULL;
2047 PyObject *decimal;
2048 Py_ssize_t decimal_length, new_length;
2049 int res;
2050
2051 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
2052 return NULL;
2053
2054 decimal_length = length * 7; /* len('&#8364;') */
2055 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
2056 if (decimal == NULL)
2057 return NULL;
2058
2059 res = PyUnicode_EncodeDecimal(unicode, length,
2060 PyBytes_AS_STRING(decimal),
2061 errors);
2062 if (res < 0) {
2063 Py_DECREF(decimal);
2064 return NULL;
2065 }
2066
2067 new_length = strlen(PyBytes_AS_STRING(decimal));
2068 assert(new_length <= decimal_length);
2069 res = _PyBytes_Resize(&decimal, new_length);
2070 if (res < 0)
2071 return NULL;
2072
2073 return decimal;
2074}
2075
2076static PyObject *
2077unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
2078{
2079 Py_UNICODE *unicode;
2080 Py_ssize_t length;
2081 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
2082 return NULL;
2083 return PyUnicode_TransformDecimalToASCII(unicode, length);
2084}
2085
2086static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002087unicode_legacy_string(PyObject *self, PyObject *args)
2088{
2089 Py_UNICODE *data;
2090 Py_ssize_t len;
2091 PyObject *u;
2092
2093 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2094 return NULL;
2095
2096 u = PyUnicode_FromUnicode(NULL, len);
2097 if (u == NULL)
2098 return NULL;
2099
2100 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2101
2102 if (len > 0) { /* The empty string is always ready. */
2103 assert(!PyUnicode_IS_READY(u));
2104 }
2105
2106 return u;
2107}
Inada Naoki2c4928d2020-06-17 20:09:44 +09002108_Py_COMP_DIAG_POP
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002109#endif /* USE_UNICODE_WCHAR_CACHE */
Stefan Krahe6996ed2012-11-02 14:44:20 +01002110
2111static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002112getargs_w_star(PyObject *self, PyObject *args)
2113{
2114 Py_buffer buffer;
2115 PyObject *result;
2116 char *str;
2117
2118 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2119 return NULL;
2120
2121 if (2 <= buffer.len) {
2122 str = buffer.buf;
2123 str[0] = '[';
2124 str[buffer.len-1] = ']';
2125 }
2126
2127 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2128 PyBuffer_Release(&buffer);
2129 return result;
2130}
2131
2132
2133static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302134test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 /* Test that formats can begin with '|'. See issue #4720. */
2137 PyObject *tuple, *dict = NULL;
2138 static char *kwlist[] = {NULL};
2139 int result;
2140 tuple = PyTuple_New(0);
2141 if (!tuple)
2142 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002143 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002145 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 dict = PyDict_New();
2147 if (!dict)
2148 goto done;
2149 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002150 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 Py_DECREF(tuple);
2152 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002153 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002155 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 else {
2157 Py_RETURN_NONE;
2158 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002159}
2160
2161static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002162codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002164 const char *encoding, *errors = NULL;
2165 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2166 &encoding, &errors))
2167 return NULL;
2168 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002169}
2170
Thomas Wouters477c8d52006-05-27 19:21:47 +00002171static PyObject *
2172codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 const char *encoding, *errors = NULL;
2175 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2176 &encoding, &errors))
2177 return NULL;
2178 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002179}
2180
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002181
Tim Peters5b8132f2003-01-31 15:52:05 +00002182/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002183static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302184test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002185{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 struct triple {
2187 long input;
2188 size_t nbits;
2189 int sign;
2190 } testcases[] = {{0, 0, 0},
2191 {1L, 1, 1},
2192 {-1L, 1, -1},
2193 {2L, 2, 1},
2194 {-2L, 2, -1},
2195 {3L, 2, 1},
2196 {-3L, 2, -1},
2197 {4L, 3, 1},
2198 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002199 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200 {-0x7fffL, 15, -1},
2201 {0xffffL, 16, 1},
2202 {-0xffffL, 16, -1},
2203 {0xfffffffL, 28, 1},
2204 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002205 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002206
Victor Stinner63941882011-09-29 00:42:28 +02002207 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002208 size_t nbits;
2209 int sign;
2210 PyObject *plong;
2211
2212 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002213 if (plong == NULL)
2214 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002215 nbits = _PyLong_NumBits(plong);
2216 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 Py_DECREF(plong);
2219 if (nbits != testcases[i].nbits)
2220 return raiseTestError("test_long_numbits",
2221 "wrong result for _PyLong_NumBits");
2222 if (sign != testcases[i].sign)
2223 return raiseTestError("test_long_numbits",
2224 "wrong result for _PyLong_Sign");
2225 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002226 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002227}
2228
Thomas Heller519a0422007-11-15 20:48:54 +00002229/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002230
2231static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302232test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2235 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2236 Py_XDECREF(o1);
2237 Py_XDECREF(o2);
2238 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002239}
2240
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002241static PyObject *
2242raise_exception(PyObject *self, PyObject *args)
2243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 PyObject *exc;
2245 PyObject *exc_args, *v;
2246 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2249 &exc, &num_args))
2250 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 exc_args = PyTuple_New(num_args);
2253 if (exc_args == NULL)
2254 return NULL;
2255 for (i = 0; i < num_args; ++i) {
2256 v = PyLong_FromLong(i);
2257 if (v == NULL) {
2258 Py_DECREF(exc_args);
2259 return NULL;
2260 }
2261 PyTuple_SET_ITEM(exc_args, i, v);
2262 }
2263 PyErr_SetObject(exc, exc_args);
2264 Py_DECREF(exc_args);
2265 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002266}
Tim Peters91621db2001-06-12 20:10:01 +00002267
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002268static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002269set_errno(PyObject *self, PyObject *args)
2270{
2271 int new_errno;
2272
2273 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2274 return NULL;
2275
2276 errno = new_errno;
2277 Py_RETURN_NONE;
2278}
2279
2280static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002281test_set_exc_info(PyObject *self, PyObject *args)
2282{
2283 PyObject *orig_exc;
2284 PyObject *new_type, *new_value, *new_tb;
2285 PyObject *type, *value, *tb;
2286 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2287 &new_type, &new_value, &new_tb))
2288 return NULL;
2289
2290 PyErr_GetExcInfo(&type, &value, &tb);
2291
2292 Py_INCREF(new_type);
2293 Py_INCREF(new_value);
2294 Py_INCREF(new_tb);
2295 PyErr_SetExcInfo(new_type, new_value, new_tb);
2296
2297 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2298 Py_XDECREF(type);
2299 Py_XDECREF(value);
2300 Py_XDECREF(tb);
2301 return orig_exc;
2302}
Benjamin Peterson16323982010-02-03 01:13:41 +00002303
2304static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002305
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002306static PyObject *
2307test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 if (PyDateTimeAPI) {
2309 if (test_run_counter) {
2310 /* Probably regrtest.py -R */
2311 Py_RETURN_NONE;
2312 }
2313 else {
2314 PyErr_SetString(PyExc_AssertionError,
2315 "PyDateTime_CAPI somehow initialized");
2316 return NULL;
2317 }
2318 }
2319 test_run_counter++;
2320 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 if (PyDateTimeAPI)
2323 Py_RETURN_NONE;
2324 else
2325 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002326}
2327
Paul Ganssle04af5b12018-01-24 17:29:30 -05002328/* Functions exposing the C API type checking for testing */
2329#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2330 PyObject *obj; \
2331 int exact = 0; \
2332 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2333 return NULL; \
2334 } \
2335 int rv = exact?exact_method(obj):check_method(obj); \
2336 if (rv) { \
2337 Py_RETURN_TRUE; \
2338 } else { \
2339 Py_RETURN_FALSE; \
2340 }
2341
2342static PyObject *
2343datetime_check_date(PyObject *self, PyObject *args) {
2344 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2345}
2346
2347static PyObject *
2348datetime_check_time(PyObject *self, PyObject *args) {
2349 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2350}
2351
2352static PyObject *
2353datetime_check_datetime(PyObject *self, PyObject *args) {
2354 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2355}
2356
2357static PyObject *
2358datetime_check_delta(PyObject *self, PyObject *args) {
2359 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2360}
2361
2362static PyObject *
2363datetime_check_tzinfo(PyObject *self, PyObject *args) {
2364 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2365}
2366
2367
2368/* Makes three variations on timezone representing UTC-5:
2369 1. timezone with offset and name from PyDateTimeAPI
2370 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2371 3. timezone with offset (no name) from PyTimeZone_FromOffset
2372*/
2373static PyObject *
2374make_timezones_capi(PyObject *self, PyObject *args) {
2375 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2376 PyObject *name = PyUnicode_FromString("EST");
2377
2378 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2379 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2380 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2381
2382 Py_DecRef(offset);
2383 Py_DecRef(name);
2384
2385 PyObject *rv = PyTuple_New(3);
2386
2387 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2388 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2389 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2390
2391 return rv;
2392}
2393
2394static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002395get_timezones_offset_zero(PyObject *self, PyObject *args) {
2396 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2397 PyObject *name = PyUnicode_FromString("");
2398
2399 // These two should return the UTC singleton
2400 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2401 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2402
2403 // This one will return +00:00 zone, but not the UTC singleton
2404 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2405
2406 Py_DecRef(offset);
2407 Py_DecRef(name);
2408
2409 PyObject *rv = PyTuple_New(3);
2410 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2411 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2412 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2413
2414 return rv;
2415}
2416
2417static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002418get_timezone_utc_capi(PyObject* self, PyObject *args) {
2419 int macro = 0;
2420 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2421 return NULL;
2422 }
2423 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002424 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002425 return PyDateTime_TimeZone_UTC;
2426 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002427 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002428 return PyDateTimeAPI->TimeZone_UTC;
2429 }
2430}
2431
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002432static PyObject *
Edison A98ff4d52019-05-17 13:28:42 -07002433get_date_fromdate(PyObject *self, PyObject *args)
2434{
2435 PyObject *rv = NULL;
2436 int macro;
2437 int year, month, day;
2438
2439 if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2440 return NULL;
2441 }
2442
2443 if (macro) {
2444 rv = PyDate_FromDate(year, month, day);
2445 }
2446 else {
2447 rv = PyDateTimeAPI->Date_FromDate(
2448 year, month, day,
2449 PyDateTimeAPI->DateType);
2450 }
2451 return rv;
2452}
2453
2454static PyObject *
2455get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2456{
2457 PyObject *rv = NULL;
2458 int macro;
2459 int year, month, day;
2460 int hour, minute, second, microsecond;
2461
2462 if (!PyArg_ParseTuple(args, "piiiiiii",
2463 &macro,
2464 &year, &month, &day,
2465 &hour, &minute, &second, &microsecond)) {
2466 return NULL;
2467 }
2468
2469 if (macro) {
2470 rv = PyDateTime_FromDateAndTime(
2471 year, month, day,
2472 hour, minute, second, microsecond);
2473 }
2474 else {
2475 rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2476 year, month, day,
2477 hour, minute, second, microsecond,
2478 Py_None,
2479 PyDateTimeAPI->DateTimeType);
2480 }
2481 return rv;
2482}
2483
2484static PyObject *
2485get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2486{
2487 PyObject *rv = NULL;
2488 int macro;
2489 int year, month, day;
2490 int hour, minute, second, microsecond, fold;
2491
2492 if (!PyArg_ParseTuple(args, "piiiiiiii",
2493 &macro,
2494 &year, &month, &day,
2495 &hour, &minute, &second, &microsecond,
2496 &fold)) {
2497 return NULL;
2498 }
2499
2500 if (macro) {
2501 rv = PyDateTime_FromDateAndTimeAndFold(
2502 year, month, day,
2503 hour, minute, second, microsecond,
2504 fold);
2505 }
2506 else {
2507 rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2508 year, month, day,
2509 hour, minute, second, microsecond,
2510 Py_None,
2511 fold,
2512 PyDateTimeAPI->DateTimeType);
2513 }
2514 return rv;
2515}
2516
2517static PyObject *
2518get_time_fromtime(PyObject *self, PyObject *args)
2519{
2520 PyObject *rv = NULL;
2521 int macro;
2522 int hour, minute, second, microsecond;
2523
2524 if (!PyArg_ParseTuple(args, "piiii",
2525 &macro,
2526 &hour, &minute, &second, &microsecond)) {
2527 return NULL;
2528 }
2529
2530 if (macro) {
2531 rv = PyTime_FromTime(hour, minute, second, microsecond);
2532 }
2533 else {
2534 rv = PyDateTimeAPI->Time_FromTime(
2535 hour, minute, second, microsecond,
2536 Py_None,
2537 PyDateTimeAPI->TimeType);
2538 }
2539 return rv;
2540}
2541
2542static PyObject *
2543get_time_fromtimeandfold(PyObject *self, PyObject *args)
2544{
2545 PyObject *rv = NULL;
2546 int macro;
2547 int hour, minute, second, microsecond, fold;
2548
2549 if (!PyArg_ParseTuple(args, "piiiii",
2550 &macro,
2551 &hour, &minute, &second, &microsecond,
2552 &fold)) {
2553 return NULL;
2554 }
2555
2556 if (macro) {
2557 rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2558 }
2559 else {
2560 rv = PyDateTimeAPI->Time_FromTimeAndFold(
2561 hour, minute, second, microsecond,
2562 Py_None,
2563 fold,
2564 PyDateTimeAPI->TimeType);
2565 }
2566 return rv;
2567}
2568
2569static PyObject *
2570get_delta_fromdsu(PyObject *self, PyObject *args)
2571{
2572 PyObject *rv = NULL;
2573 int macro;
2574 int days, seconds, microseconds;
2575
2576 if (!PyArg_ParseTuple(args, "piii",
2577 &macro,
2578 &days, &seconds, &microseconds)) {
2579 return NULL;
2580 }
2581
2582 if (macro) {
2583 rv = PyDelta_FromDSU(days, seconds, microseconds);
2584 }
2585 else {
2586 rv = PyDateTimeAPI->Delta_FromDelta(
2587 days, seconds, microseconds, 1,
2588 PyDateTimeAPI->DeltaType);
2589 }
2590
2591 return rv;
2592}
2593
2594static PyObject *
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002595get_date_fromtimestamp(PyObject* self, PyObject *args)
2596{
2597 PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2598 int macro = 0;
2599
2600 if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2601 return NULL;
2602 }
2603
2604 // Construct the argument tuple
2605 if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2606 return NULL;
2607 }
2608
2609 // Pass along to the API function
2610 if (macro) {
2611 rv = PyDate_FromTimestamp(tsargs);
2612 }
2613 else {
2614 rv = PyDateTimeAPI->Date_FromTimestamp(
2615 (PyObject *)PyDateTimeAPI->DateType, tsargs
2616 );
2617 }
2618
2619 Py_DECREF(tsargs);
2620 return rv;
2621}
2622
2623static PyObject *
2624get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2625{
2626 int macro = 0;
2627 int usetz = 0;
2628 PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2629 if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2630 return NULL;
2631 }
2632
2633 // Construct the argument tuple
2634 if (usetz) {
2635 tsargs = PyTuple_Pack(2, ts, tzinfo);
2636 }
2637 else {
2638 tsargs = PyTuple_Pack(1, ts);
2639 }
2640
2641 if (tsargs == NULL) {
2642 return NULL;
2643 }
2644
2645 // Pass along to the API function
2646 if (macro) {
2647 rv = PyDateTime_FromTimestamp(tsargs);
2648 }
2649 else {
2650 rv = PyDateTimeAPI->DateTime_FromTimestamp(
2651 (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2652 );
2653 }
2654
2655 Py_DECREF(tsargs);
2656 return rv;
2657}
2658
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002659static PyObject *
2660test_PyDateTime_GET(PyObject *self, PyObject *obj)
2661{
2662 int year, month, day;
2663
2664 year = PyDateTime_GET_YEAR(obj);
2665 month = PyDateTime_GET_MONTH(obj);
2666 day = PyDateTime_GET_DAY(obj);
2667
2668 return Py_BuildValue("(lll)", year, month, day);
2669}
2670
2671static PyObject *
2672test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
2673{
2674 int hour, minute, second, microsecond;
2675
2676 hour = PyDateTime_DATE_GET_HOUR(obj);
2677 minute = PyDateTime_DATE_GET_MINUTE(obj);
2678 second = PyDateTime_DATE_GET_SECOND(obj);
2679 microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
2680
2681 return Py_BuildValue("(llll)", hour, minute, second, microsecond);
2682}
2683
2684static PyObject *
2685test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
2686{
2687 int hour, minute, second, microsecond;
2688
2689 hour = PyDateTime_TIME_GET_HOUR(obj);
2690 minute = PyDateTime_TIME_GET_MINUTE(obj);
2691 second = PyDateTime_TIME_GET_SECOND(obj);
2692 microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
2693
2694 return Py_BuildValue("(llll)", hour, minute, second, microsecond);
2695}
2696
2697static PyObject *
2698test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
2699{
2700 int days, seconds, microseconds;
2701
2702 days = PyDateTime_DELTA_GET_DAYS(obj);
2703 seconds = PyDateTime_DELTA_GET_SECONDS(obj);
2704 microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
2705
2706 return Py_BuildValue("(lll)", days, seconds, microseconds);
2707}
Benjamin Peterson16323982010-02-03 01:13:41 +00002708
Stefan Krah39042e02020-08-10 16:32:21 +02002709/* Test decimal API */
2710static int decimal_initialized = 0;
2711static PyObject *
2712decimal_is_special(PyObject *module, PyObject *dec)
2713{
2714 int is_special;
2715
2716 (void)module;
2717 if (!decimal_initialized) {
2718 if (import_decimal() < 0) {
2719 return NULL;
2720 }
2721
2722 decimal_initialized = 1;
2723 }
2724
2725 is_special = PyDec_IsSpecial(dec);
2726 if (is_special < 0) {
2727 return NULL;
2728 }
2729
2730 return PyBool_FromLong(is_special);
2731}
2732
2733static PyObject *
2734decimal_is_nan(PyObject *module, PyObject *dec)
2735{
2736 int is_nan;
2737
2738 (void)module;
2739 if (!decimal_initialized) {
2740 if (import_decimal() < 0) {
2741 return NULL;
2742 }
2743
2744 decimal_initialized = 1;
2745 }
2746
2747 is_nan = PyDec_IsNaN(dec);
2748 if (is_nan < 0) {
2749 return NULL;
2750 }
2751
2752 return PyBool_FromLong(is_nan);
2753}
2754
2755static PyObject *
2756decimal_is_infinite(PyObject *module, PyObject *dec)
2757{
2758 int is_infinite;
2759
2760 (void)module;
2761 if (!decimal_initialized) {
2762 if (import_decimal() < 0) {
2763 return NULL;
2764 }
2765
2766 decimal_initialized = 1;
2767 }
2768
2769 is_infinite = PyDec_IsInfinite(dec);
2770 if (is_infinite < 0) {
2771 return NULL;
2772 }
2773
2774 return PyBool_FromLong(is_infinite);
2775}
2776
2777static PyObject *
2778decimal_get_digits(PyObject *module, PyObject *dec)
2779{
2780 int64_t digits;
2781
2782 (void)module;
2783 if (!decimal_initialized) {
2784 if (import_decimal() < 0) {
2785 return NULL;
2786 }
2787
2788 decimal_initialized = 1;
2789 }
2790
2791 digits = PyDec_GetDigits(dec);
2792 if (digits < 0) {
2793 return NULL;
2794 }
2795
2796 return PyLong_FromLongLong(digits);
2797}
2798
2799static PyObject *
2800decimal_as_triple(PyObject *module, PyObject *dec)
2801{
2802 PyObject *tuple = NULL;
2803 PyObject *sign, *hi, *lo;
2804 mpd_uint128_triple_t triple;
2805
2806 (void)module;
2807 if (!decimal_initialized) {
2808 if (import_decimal() < 0) {
2809 return NULL;
2810 }
2811
2812 decimal_initialized = 1;
2813 }
2814
2815 triple = PyDec_AsUint128Triple(dec);
2816 if (triple.tag == MPD_TRIPLE_ERROR && PyErr_Occurred()) {
2817 return NULL;
2818 }
2819
2820 sign = PyLong_FromUnsignedLong(triple.sign);
2821 if (sign == NULL) {
2822 return NULL;
2823 }
2824
2825 hi = PyLong_FromUnsignedLongLong(triple.hi);
2826 if (hi == NULL) {
2827 Py_DECREF(sign);
2828 return NULL;
2829 }
2830
2831 lo = PyLong_FromUnsignedLongLong(triple.lo);
2832 if (lo == NULL) {
2833 Py_DECREF(hi);
2834 Py_DECREF(sign);
2835 return NULL;
2836 }
2837
2838 switch (triple.tag) {
2839 case MPD_TRIPLE_QNAN:
2840 assert(triple.exp == 0);
2841 tuple = Py_BuildValue("(OOOs)", sign, hi, lo, "n");
2842 break;
2843
2844 case MPD_TRIPLE_SNAN:
2845 assert(triple.exp == 0);
2846 tuple = Py_BuildValue("(OOOs)", sign, hi, lo, "N");
2847 break;
2848
2849 case MPD_TRIPLE_INF:
2850 assert(triple.hi == 0);
2851 assert(triple.lo == 0);
2852 assert(triple.exp == 0);
2853 tuple = Py_BuildValue("(OOOs)", sign, hi, lo, "F");
2854 break;
2855
2856 case MPD_TRIPLE_NORMAL:
2857 tuple = Py_BuildValue("(OOOL)", sign, hi, lo, triple.exp);
2858 break;
2859
2860 case MPD_TRIPLE_ERROR:
2861 PyErr_SetString(PyExc_ValueError,
2862 "value out of bounds for a uint128 triple");
2863 break;
2864
2865 default:
2866 PyErr_SetString(PyExc_RuntimeError,
2867 "decimal_as_triple: internal error: unexpected tag");
2868 break;
2869 }
2870
2871 Py_DECREF(lo);
2872 Py_DECREF(hi);
2873 Py_DECREF(sign);
2874
2875 return tuple;
2876}
2877
2878static PyObject *
2879decimal_from_triple(PyObject *module, PyObject *tuple)
2880{
2881 mpd_uint128_triple_t triple = { MPD_TRIPLE_ERROR, 0, 0, 0, 0 };
2882 PyObject *exp;
2883 unsigned long sign;
2884
2885 (void)module;
2886 if (!decimal_initialized) {
2887 if (import_decimal() < 0) {
2888 return NULL;
2889 }
2890
2891 decimal_initialized = 1;
2892 }
2893
2894 if (!PyTuple_Check(tuple)) {
2895 PyErr_SetString(PyExc_TypeError, "argument must be a tuple");
2896 return NULL;
2897 }
2898
2899 if (PyTuple_GET_SIZE(tuple) != 4) {
2900 PyErr_SetString(PyExc_ValueError, "tuple size must be 4");
2901 return NULL;
2902 }
2903
2904 sign = PyLong_AsUnsignedLong(PyTuple_GET_ITEM(tuple, 0));
2905 if (sign == (unsigned long)-1 && PyErr_Occurred()) {
2906 return NULL;
2907 }
2908 if (sign > UINT8_MAX) {
2909 PyErr_SetString(PyExc_ValueError, "sign must be 0 or 1");
2910 return NULL;
2911 }
2912 triple.sign = (uint8_t)sign;
2913
2914 triple.hi = PyLong_AsUnsignedLongLong(PyTuple_GET_ITEM(tuple, 1));
2915 if (triple.hi == (unsigned long long)-1 && PyErr_Occurred()) {
2916 return NULL;
2917 }
2918
2919 triple.lo = PyLong_AsUnsignedLongLong(PyTuple_GET_ITEM(tuple, 2));
2920 if (triple.lo == (unsigned long long)-1 && PyErr_Occurred()) {
2921 return NULL;
2922 }
2923
2924 exp = PyTuple_GET_ITEM(tuple, 3);
2925 if (PyLong_Check(exp)) {
2926 triple.tag = MPD_TRIPLE_NORMAL;
2927 triple.exp = PyLong_AsLongLong(exp);
2928 if (triple.exp == -1 && PyErr_Occurred()) {
2929 return NULL;
2930 }
2931 }
2932 else if (PyUnicode_Check(exp)) {
2933 if (PyUnicode_CompareWithASCIIString(exp, "F") == 0) {
2934 triple.tag = MPD_TRIPLE_INF;
2935 }
2936 else if (PyUnicode_CompareWithASCIIString(exp, "n") == 0) {
2937 triple.tag = MPD_TRIPLE_QNAN;
2938 }
2939 else if (PyUnicode_CompareWithASCIIString(exp, "N") == 0) {
2940 triple.tag = MPD_TRIPLE_SNAN;
2941 }
2942 else {
2943 PyErr_SetString(PyExc_ValueError, "not a valid exponent");
2944 return NULL;
2945 }
2946 }
2947 else {
2948 PyErr_SetString(PyExc_TypeError, "exponent must be int or string");
2949 return NULL;
2950 }
2951
2952 return PyDec_FromUint128Triple(&triple);
2953}
2954
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002955/* test_thread_state spawns a thread of its own, and that thread releases
2956 * `thread_done` when it's finished. The driver code has to know when the
2957 * thread finishes, because the thread uses a PyObject (the callable) that
2958 * may go away when the driver finishes. The former lack of this explicit
2959 * synchronization caused rare segfaults, so rare that they were seen only
2960 * on a Mac buildbot (although they were possible on any box).
2961 */
2962static PyThread_type_lock thread_done = NULL;
2963
Benjamin Petersona786b022008-08-25 21:05:21 +00002964static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002965_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002966{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 PyObject *rc;
2968 int success;
2969 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002970 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971 success = (rc != NULL);
2972 Py_XDECREF(rc);
2973 PyGILState_Release(s);
2974 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002975}
2976
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002977/* Same thing, but releases `thread_done` when it returns. This variant
2978 * should be called only from threads spawned by test_thread_state().
2979 */
2980static void
2981_make_call_from_thread(void *callable)
2982{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002983 _make_call(callable);
2984 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002985}
2986
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002987static PyObject *
2988test_thread_state(PyObject *self, PyObject *args)
2989{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002990 PyObject *fn;
2991 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002993 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2994 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002996 if (!PyCallable_Check(fn)) {
2997 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
Victor Stinnerdaa97562020-02-07 03:37:06 +01002998 Py_TYPE(fn)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002999 return NULL;
3000 }
Benjamin Petersona786b022008-08-25 21:05:21 +00003001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003002 thread_done = PyThread_allocate_lock();
3003 if (thread_done == NULL)
3004 return PyErr_NoMemory();
3005 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003007 /* Start a new thread with our callback. */
3008 PyThread_start_new_thread(_make_call_from_thread, fn);
3009 /* Make the callback with the thread lock held by this thread */
3010 success &= _make_call(fn);
3011 /* Do it all again, but this time with the thread-lock released */
3012 Py_BEGIN_ALLOW_THREADS
3013 success &= _make_call(fn);
3014 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
3015 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 /* And once more with and without a thread
3018 XXX - should use a lock and work out exactly what we are trying
3019 to test <wink>
3020 */
3021 Py_BEGIN_ALLOW_THREADS
3022 PyThread_start_new_thread(_make_call_from_thread, fn);
3023 success &= _make_call(fn);
3024 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
3025 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003027 /* Release lock we acquired above. This is required on HP-UX. */
3028 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003030 PyThread_free_lock(thread_done);
3031 if (!success)
3032 return NULL;
3033 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003034}
Benjamin Petersona54c9092009-01-13 02:11:23 +00003035
3036/* test Py_AddPendingCalls using threads */
3037static int _pending_callback(void *arg)
3038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 /* we assume the argument is callable object to which we own a reference */
3040 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01003041 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042 Py_DECREF(callable);
3043 Py_XDECREF(r);
3044 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00003045}
3046
3047/* The following requests n callbacks to _pending_callback. It can be
3048 * run from any python thread.
3049 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07003050static PyObject *
3051pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00003052{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003053 PyObject *callable;
3054 int r;
3055 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
3056 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00003057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003058 /* create the reference for the callbackwhile we hold the lock */
3059 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00003060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 Py_BEGIN_ALLOW_THREADS
3062 r = Py_AddPendingCall(&_pending_callback, callable);
3063 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00003064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003065 if (r<0) {
3066 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003067 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003068 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003069 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00003070}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003071
Neal Norwitzb0d26332007-08-25 00:49:05 +00003072/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003073static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003074test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00003075{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 PyObject *result;
3077 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003078
Alexander Belopolskye239d232010-12-08 23:31:48 +00003079#define CHECK_1_FORMAT(FORMAT, TYPE) \
3080 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
3081 if (result == NULL) \
3082 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003083 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00003084 msg = FORMAT " failed at 1"; \
3085 goto Fail; \
3086 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 CHECK_1_FORMAT("%d", int);
3090 CHECK_1_FORMAT("%ld", long);
3091 /* The z width modifier was added in Python 2.5. */
3092 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003094 /* The u type code was added in Python 2.5. */
3095 CHECK_1_FORMAT("%u", unsigned int);
3096 CHECK_1_FORMAT("%lu", unsigned long);
3097 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003100 CHECK_1_FORMAT("%llu", unsigned long long);
3101 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00003102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003104
3105 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003106 Py_XDECREF(result);
3107 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003108
3109#undef CHECK_1_FORMAT
3110}
3111
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00003112
3113static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303114test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003115 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
3116 int result;
3117 if (py_s == NULL)
3118 return NULL;
3119 result = PyUnicode_CompareWithASCIIString(py_s, "str");
3120 Py_DECREF(py_s);
3121 if (!result) {
3122 PyErr_SetString(TestError, "Python string ending in NULL "
3123 "should not compare equal to c string.");
3124 return NULL;
3125 }
3126 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00003127}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00003128
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003129/* This is here to provide a docstring for test_descr. */
3130static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303131test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003132{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003133 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003134}
3135
Mark Dickinson725bfd82009-05-03 20:33:40 +00003136/* Test PyOS_string_to_double. */
3137static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303138test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02003140 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003142#define CHECK_STRING(STR, expected) \
3143 result = PyOS_string_to_double(STR, NULL, NULL); \
3144 if (result == -1.0 && PyErr_Occurred()) \
3145 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07003146 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 msg = "conversion of " STR " to float failed"; \
3148 goto fail; \
3149 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00003150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151#define CHECK_INVALID(STR) \
3152 result = PyOS_string_to_double(STR, NULL, NULL); \
3153 if (result == -1.0 && PyErr_Occurred()) { \
3154 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
3155 PyErr_Clear(); \
3156 else \
3157 return NULL; \
3158 } \
3159 else { \
3160 msg = "conversion of " STR " didn't raise ValueError"; \
3161 goto fail; \
3162 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00003163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003164 CHECK_STRING("0.1", 0.1);
3165 CHECK_STRING("1.234", 1.234);
3166 CHECK_STRING("-1.35", -1.35);
3167 CHECK_STRING(".1e01", 1.0);
3168 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00003169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003170 CHECK_INVALID(" 0.1");
3171 CHECK_INVALID("\t\n-3");
3172 CHECK_INVALID(".123 ");
3173 CHECK_INVALID("3\n");
3174 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00003175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003176 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003177 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00003179#undef CHECK_STRING
3180#undef CHECK_INVALID
3181}
3182
3183
Benjamin Petersonb173f782009-05-05 22:31:58 +00003184/* Coverage testing of capsule objects. */
3185
3186static const char *capsule_name = "capsule name";
3187static char *capsule_pointer = "capsule pointer";
3188static char *capsule_context = "capsule context";
3189static const char *capsule_error = NULL;
3190static int
3191capsule_destructor_call_count = 0;
3192
3193static void
3194capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 capsule_destructor_call_count++;
3196 if (PyCapsule_GetContext(o) != capsule_context) {
3197 capsule_error = "context did not match in destructor!";
3198 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
3199 capsule_error = "destructor did not match in destructor! (woah!)";
3200 } else if (PyCapsule_GetName(o) != capsule_name) {
3201 capsule_error = "name did not match in destructor!";
3202 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
3203 capsule_error = "pointer did not match in destructor!";
3204 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003205}
3206
3207typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003208 char *name;
3209 char *module;
3210 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003211} known_capsule;
3212
3213static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003214test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00003215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 PyObject *object;
3217 const char *error = NULL;
3218 void *pointer;
3219 void *pointer2;
3220 known_capsule known_capsules[] = {
3221 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
3222 KNOWN_CAPSULE("_socket", "CAPI"),
3223 KNOWN_CAPSULE("_curses", "_C_API"),
3224 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
3225 { NULL, NULL },
3226 };
3227 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003228
3229#define FAIL(x) { error = (x); goto exit; }
3230
3231#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003232 if (capsule_error) { \
3233 FAIL(capsule_error); \
3234 } \
3235 else if (!capsule_destructor_call_count) { \
3236 FAIL("destructor not called!"); \
3237 } \
3238 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
3241 PyCapsule_SetContext(object, capsule_context);
3242 capsule_destructor(object);
3243 CHECK_DESTRUCTOR;
3244 Py_DECREF(object);
3245 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 object = PyCapsule_New(known, "ignored", NULL);
3248 PyCapsule_SetPointer(object, capsule_pointer);
3249 PyCapsule_SetName(object, capsule_name);
3250 PyCapsule_SetDestructor(object, capsule_destructor);
3251 PyCapsule_SetContext(object, capsule_context);
3252 capsule_destructor(object);
3253 CHECK_DESTRUCTOR;
3254 /* intentionally access using the wrong name */
3255 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
3256 if (!PyErr_Occurred()) {
3257 FAIL("PyCapsule_GetPointer should have failed but did not!");
3258 }
3259 PyErr_Clear();
3260 if (pointer2) {
3261 if (pointer2 == capsule_pointer) {
3262 FAIL("PyCapsule_GetPointer should not have"
3263 " returned the internal pointer!");
3264 } else {
3265 FAIL("PyCapsule_GetPointer should have "
3266 "returned NULL pointer but did not!");
3267 }
3268 }
3269 PyCapsule_SetDestructor(object, NULL);
3270 Py_DECREF(object);
3271 if (capsule_destructor_call_count) {
3272 FAIL("destructor called when it should not have been!");
3273 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 for (known = &known_capsules[0]; known->module != NULL; known++) {
3276 /* yeah, ordinarily I wouldn't do this either,
3277 but it's fine for this test harness.
3278 */
3279 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003280#undef FAIL
3281#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003282 { \
3283 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
3284 x, known->module, known->attribute); \
3285 error = buffer; \
3286 goto exit; \
3287 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 PyObject *module = PyImport_ImportModule(known->module);
3290 if (module) {
3291 pointer = PyCapsule_Import(known->name, 0);
3292 if (!pointer) {
3293 Py_DECREF(module);
3294 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
3295 }
3296 object = PyObject_GetAttrString(module, known->attribute);
3297 if (!object) {
3298 Py_DECREF(module);
3299 return NULL;
3300 }
3301 pointer2 = PyCapsule_GetPointer(object,
3302 "weebles wobble but they don't fall down");
3303 if (!PyErr_Occurred()) {
3304 Py_DECREF(object);
3305 Py_DECREF(module);
3306 FAIL("PyCapsule_GetPointer should have failed but did not!");
3307 }
3308 PyErr_Clear();
3309 if (pointer2) {
3310 Py_DECREF(module);
3311 Py_DECREF(object);
3312 if (pointer2 == pointer) {
3313 FAIL("PyCapsule_GetPointer should not have"
3314 " returned its internal pointer!");
3315 } else {
3316 FAIL("PyCapsule_GetPointer should have"
3317 " returned NULL pointer but did not!");
3318 }
3319 }
3320 Py_DECREF(object);
3321 Py_DECREF(module);
3322 }
3323 else
3324 PyErr_Clear();
3325 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003326
3327 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 if (error) {
3329 return raiseTestError("test_capsule", error);
3330 }
3331 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003332#undef FAIL
3333}
3334
Guido van Rossumddefaf32007-01-14 03:31:43 +00003335#ifdef HAVE_GETTIMEOFDAY
3336/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00003337static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003338{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 e->tv_sec -= s->tv_sec;
3340 e->tv_usec -= s->tv_usec;
3341 if (e->tv_usec < 0) {
3342 e->tv_sec -=1;
3343 e->tv_usec += 1000000;
3344 }
3345 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003346}
3347
3348static PyObject *
3349profile_int(PyObject *self, PyObject* args)
3350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 int i, k;
3352 struct timeval start, stop;
3353 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 /* Test 1: Allocate and immediately deallocate
3356 many small integers */
3357 gettimeofday(&start, NULL);
3358 for(k=0; k < 20000; k++)
3359 for(i=0; i < 1000; i++) {
3360 single = PyLong_FromLong(i);
3361 Py_DECREF(single);
3362 }
3363 gettimeofday(&stop, NULL);
3364 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003366 /* Test 2: Allocate and immediately deallocate
3367 many large integers */
3368 gettimeofday(&start, NULL);
3369 for(k=0; k < 20000; k++)
3370 for(i=0; i < 1000; i++) {
3371 single = PyLong_FromLong(i+1000000);
3372 Py_DECREF(single);
3373 }
3374 gettimeofday(&stop, NULL);
3375 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003377 /* Test 3: Allocate a few integers, then release
3378 them all simultaneously. */
3379 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02003380 if (multiple == NULL)
3381 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003382 gettimeofday(&start, NULL);
3383 for(k=0; k < 20000; k++) {
3384 for(i=0; i < 1000; i++) {
3385 multiple[i] = PyLong_FromLong(i+1000000);
3386 }
3387 for(i=0; i < 1000; i++) {
3388 Py_DECREF(multiple[i]);
3389 }
3390 }
3391 gettimeofday(&stop, NULL);
3392 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003393 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003395 /* Test 4: Allocate many integers, then release
3396 them all simultaneously. */
3397 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003398 if (multiple == NULL)
3399 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003400 gettimeofday(&start, NULL);
3401 for(k=0; k < 20; k++) {
3402 for(i=0; i < 1000000; i++) {
3403 multiple[i] = PyLong_FromLong(i+1000000);
3404 }
3405 for(i=0; i < 1000000; i++) {
3406 Py_DECREF(multiple[i]);
3407 }
3408 }
3409 gettimeofday(&stop, NULL);
3410 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003411 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 /* Test 5: Allocate many integers < 32000 */
3414 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003415 if (multiple == NULL)
3416 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 gettimeofday(&start, NULL);
3418 for(k=0; k < 10; k++) {
3419 for(i=0; i < 1000000; i++) {
3420 multiple[i] = PyLong_FromLong(i+1000);
3421 }
3422 for(i=0; i < 1000000; i++) {
3423 Py_DECREF(multiple[i]);
3424 }
3425 }
3426 gettimeofday(&stop, NULL);
3427 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003428 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003430 /* Test 6: Perform small int addition */
3431 op1 = PyLong_FromLong(1);
3432 gettimeofday(&start, NULL);
3433 for(i=0; i < 10000000; i++) {
3434 result = PyNumber_Add(op1, op1);
3435 Py_DECREF(result);
3436 }
3437 gettimeofday(&stop, NULL);
3438 Py_DECREF(op1);
3439 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003441 /* Test 7: Perform medium int addition */
3442 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003443 if (op1 == NULL)
3444 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003445 gettimeofday(&start, NULL);
3446 for(i=0; i < 10000000; i++) {
3447 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003448 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 }
3450 gettimeofday(&stop, NULL);
3451 Py_DECREF(op1);
3452 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003453
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003454 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003455}
3456#endif
3457
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003458/* To test the format of tracebacks as printed out. */
3459static PyObject *
3460traceback_print(PyObject *self, PyObject *args)
3461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003462 PyObject *file;
3463 PyObject *traceback;
3464 int result;
3465
3466 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3467 &traceback, &file))
3468 return NULL;
3469
3470 result = PyTraceBack_Print(traceback, file);
3471 if (result < 0)
3472 return NULL;
3473 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003474}
3475
Benjamin Petersone6528212008-07-15 15:32:09 +00003476/* To test the format of exceptions as printed out. */
3477static PyObject *
3478exception_print(PyObject *self, PyObject *args)
3479{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003480 PyObject *value;
3481 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003483 if (!PyArg_ParseTuple(args, "O:exception_print",
3484 &value))
3485 return NULL;
3486 if (!PyExceptionInstance_Check(value)) {
3487 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3488 return NULL;
3489 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003491 tb = PyException_GetTraceback(value);
3492 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3493 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003495 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003496}
3497
3498
3499
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003500
3501/* reliably raise a MemoryError */
3502static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303503raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003505 PyErr_NoMemory();
3506 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003507}
3508
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003509/* Issue 6012 */
3510static PyObject *str1, *str2;
3511static int
3512failing_converter(PyObject *obj, void *arg)
3513{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003514 /* Clone str1, then let the conversion fail. */
3515 assert(str1);
3516 str2 = str1;
3517 Py_INCREF(str2);
3518 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003519}
3520static PyObject*
3521argparsing(PyObject *o, PyObject *args)
3522{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003523 PyObject *res;
3524 str1 = str2 = NULL;
3525 if (!PyArg_ParseTuple(args, "O&O&",
3526 PyUnicode_FSConverter, &str1,
3527 failing_converter, &str2)) {
3528 if (!str2)
3529 /* argument converter not called? */
3530 return NULL;
3531 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003532 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003533 Py_DECREF(str2);
3534 PyErr_Clear();
3535 return res;
3536 }
3537 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003538}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003539
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003540/* To test that the result of PyCode_NewEmpty has the right members. */
3541static PyObject *
3542code_newempty(PyObject *self, PyObject *args)
3543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003544 const char *filename;
3545 const char *funcname;
3546 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003548 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3549 &filename, &funcname, &firstlineno))
3550 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003552 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003553}
3554
Georg Brandl1e28a272009-12-28 08:41:01 +00003555/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3556 Run via Lib/test/test_exceptions.py */
3557static PyObject *
3558make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3559{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 const char *name;
3561 const char *doc = NULL;
3562 PyObject *base = NULL;
3563 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003565 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003567 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3568 "s|sOO:make_exception_with_doc", kwlist,
3569 &name, &doc, &base, &dict))
3570 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003572 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003573}
3574
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003575static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303576make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003577{
3578 Py_buffer info;
3579 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3580 return NULL;
3581 return PyMemoryView_FromBuffer(&info);
3582}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003583
Stefan Krah7213fcc2015-02-01 16:19:23 +01003584static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003585test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003586{
3587 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3588 int init[5] = {0, 1, 2, 3, 4};
3589 Py_ssize_t itemsize = sizeof(int);
3590 Py_ssize_t shape = 5;
3591 Py_ssize_t strides = 2 * itemsize;
3592 Py_buffer view = {
3593 data,
3594 NULL,
3595 5 * itemsize,
3596 itemsize,
3597 1,
3598 1,
3599 NULL,
3600 &shape,
3601 &strides,
3602 NULL,
3603 NULL
3604 };
3605 int *ptr;
3606 int i;
3607
3608 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3609 ptr = view.buf;
3610 for (i = 0; i < 5; i++) {
3611 if (ptr[2*i] != i) {
3612 PyErr_SetString(TestError,
3613 "test_from_contiguous: incorrect result");
3614 return NULL;
3615 }
3616 }
3617
3618 view.buf = &data[8];
3619 view.strides[0] = -2 * itemsize;
3620
3621 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3622 ptr = view.buf;
3623 for (i = 0; i < 5; i++) {
3624 if (*(ptr-2*i) != i) {
3625 PyErr_SetString(TestError,
3626 "test_from_contiguous: incorrect result");
3627 return NULL;
3628 }
3629 }
3630
3631 Py_RETURN_NONE;
3632}
Stefan Krah650c1e82015-02-03 21:43:23 +01003633
Stefan Kraha7559c02015-02-03 22:27:21 +01003634#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003635extern PyTypeObject _PyBytesIOBuffer_Type;
3636
Stefan Krah5178d912015-02-03 16:57:21 +01003637static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003638test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003639{
Stefan Krah650c1e82015-02-03 21:43:23 +01003640 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003641 PyObject *b;
3642 char *dummy[1];
3643 int ret, match;
3644
Stefan Krah650c1e82015-02-03 21:43:23 +01003645 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003646 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3647 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3648 PyErr_Clear();
3649 if (ret != -1 || match == 0)
3650 goto error;
3651
Stefan Krah650c1e82015-02-03 21:43:23 +01003652 /* bytesiobuf_getbuffer() */
3653 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003654 if (b == NULL) {
3655 return NULL;
3656 }
3657
3658 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3659 Py_DECREF(b);
3660 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3661 PyErr_Clear();
3662 if (ret != -1 || match == 0)
3663 goto error;
3664
3665 Py_RETURN_NONE;
3666
3667error:
3668 PyErr_SetString(TestError,
3669 "test_pep3118_obsolete_write_locks: failure");
3670 return NULL;
3671}
Stefan Kraha7559c02015-02-03 22:27:21 +01003672#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003673
Stefan Krah650c1e82015-02-03 21:43:23 +01003674/* This tests functions that historically supported write locks. It is
3675 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3676 is entitled to segfault in that case. */
3677static PyObject *
3678getbuffer_with_null_view(PyObject* self, PyObject *obj)
3679{
3680 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3681 return NULL;
3682
3683 Py_RETURN_NONE;
3684}
3685
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03003686/* PyBuffer_SizeFromFormat() */
3687static PyObject *
3688test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
3689{
3690 const char *format;
3691 Py_ssize_t result;
3692
3693 if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
3694 &format)) {
3695 return NULL;
3696 }
3697
3698 result = PyBuffer_SizeFromFormat(format);
3699 if (result == -1) {
3700 return NULL;
3701 }
3702
3703 return PyLong_FromSsize_t(result);
3704}
3705
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003706/* Test that the fatal error from not having a current thread doesn't
3707 cause an infinite loop. Run via Lib/test/test_capi.py */
3708static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303709crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003710{
3711 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003712 /* Using PyThreadState_Get() directly allows the test to pass in
3713 !pydebug mode. However, the test only actually tests anything
3714 in pydebug mode, since that's where the infinite loop was in
3715 the first place. */
3716 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003717 Py_END_ALLOW_THREADS
3718 return NULL;
3719}
3720
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003721/* To run some code in a sub-interpreter. */
3722static PyObject *
3723run_in_subinterp(PyObject *self, PyObject *args)
3724{
3725 const char *code;
3726 int r;
3727 PyThreadState *substate, *mainstate;
Guido van Rossum9d197c72020-06-27 17:33:49 -07003728 /* only initialise 'cflags.cf_flags' to test backwards compatibility */
3729 PyCompilerFlags cflags = {0};
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003730
3731 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3732 &code))
3733 return NULL;
3734
3735 mainstate = PyThreadState_Get();
3736
3737 PyThreadState_Swap(NULL);
3738
3739 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003740 if (substate == NULL) {
3741 /* Since no new thread state was created, there is no exception to
3742 propagate; raise a fresh one after swapping in the old thread
3743 state. */
3744 PyThreadState_Swap(mainstate);
3745 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3746 return NULL;
3747 }
Guido van Rossum9d197c72020-06-27 17:33:49 -07003748 r = PyRun_SimpleStringFlags(code, &cflags);
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003749 Py_EndInterpreter(substate);
3750
3751 PyThreadState_Swap(mainstate);
3752
3753 return PyLong_FromLong(r);
3754}
3755
Victor Stinner3c1b3792014-02-17 00:02:43 +01003756static int
3757check_time_rounding(int round)
3758{
Victor Stinner74474232015-09-02 01:43:56 +02003759 if (round != _PyTime_ROUND_FLOOR
3760 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003761 && round != _PyTime_ROUND_HALF_EVEN
3762 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003763 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3764 return -1;
3765 }
3766 return 0;
3767}
3768
Victor Stinner5d272cc2012-03-13 13:35:55 +01003769static PyObject *
3770test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3771{
3772 PyObject *obj;
3773 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003774 int round;
3775 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003776 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003777 if (check_time_rounding(round) < 0)
3778 return NULL;
3779 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003780 return NULL;
3781 return _PyLong_FromTime_t(sec);
3782}
3783
3784static PyObject *
3785test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3786{
3787 PyObject *obj;
3788 time_t sec;
3789 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003790 int round;
3791 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003792 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003793 if (check_time_rounding(round) < 0)
3794 return NULL;
3795 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003796 return NULL;
3797 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3798}
3799
Victor Stinner643cd682012-03-02 22:54:03 +01003800static PyObject *
3801test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3802{
3803 PyObject *obj;
3804 time_t sec;
3805 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003806 int round;
3807 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003808 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003809 if (check_time_rounding(round) < 0)
3810 return NULL;
3811 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003812 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003813 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003814}
3815
Antoine Pitrou796564c2013-07-30 19:59:21 +02003816static void
3817slot_tp_del(PyObject *self)
3818{
3819 _Py_IDENTIFIER(__tp_del__);
3820 PyObject *del, *res;
3821 PyObject *error_type, *error_value, *error_traceback;
3822
3823 /* Temporarily resurrect the object. */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003824 assert(Py_REFCNT(self) == 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003825 Py_SET_REFCNT(self, 1);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003826
3827 /* Save the current exception, if any. */
3828 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3829
3830 /* Execute __del__ method, if any. */
3831 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3832 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003833 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003834 if (res == NULL)
3835 PyErr_WriteUnraisable(del);
3836 else
3837 Py_DECREF(res);
3838 Py_DECREF(del);
3839 }
3840
3841 /* Restore the saved exception. */
3842 PyErr_Restore(error_type, error_value, error_traceback);
3843
3844 /* Undo the temporary resurrection; can't use DECREF here, it would
3845 * cause a recursive call.
3846 */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003847 assert(Py_REFCNT(self) > 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003848 Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
3849 if (Py_REFCNT(self) == 0) {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003850 /* this is the normal path out */
3851 return;
3852 }
Antoine Pitrou796564c2013-07-30 19:59:21 +02003853
3854 /* __del__ resurrected it! Make it look like the original Py_DECREF
3855 * never happened.
3856 */
3857 {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003858 Py_ssize_t refcnt = Py_REFCNT(self);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003859 _Py_NewReference(self);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003860 Py_SET_REFCNT(self, refcnt);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003861 }
Pablo Galindof13072b2020-04-11 01:21:54 +01003862 assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self));
Victor Stinner49932fe2020-02-03 17:55:05 +01003863 /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
3864 _Py_RefTotal, so we need to undo that. */
3865#ifdef Py_REF_DEBUG
3866 _Py_RefTotal--;
3867#endif
Antoine Pitrou796564c2013-07-30 19:59:21 +02003868}
3869
3870static PyObject *
3871with_tp_del(PyObject *self, PyObject *args)
3872{
3873 PyObject *obj;
3874 PyTypeObject *tp;
3875
3876 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3877 return NULL;
3878 tp = (PyTypeObject *) obj;
3879 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3880 PyErr_Format(PyExc_TypeError,
3881 "heap type expected, got %R", obj);
3882 return NULL;
3883 }
3884 tp->tp_del = slot_tp_del;
3885 Py_INCREF(obj);
3886 return obj;
3887}
3888
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003889static PyMethodDef ml;
3890
3891static PyObject *
3892create_cfunction(PyObject *self, PyObject *args)
3893{
3894 return PyCFunction_NewEx(&ml, self, NULL);
3895}
3896
3897static PyMethodDef ml = {
3898 "create_cfunction",
3899 create_cfunction,
3900 METH_NOARGS,
3901 NULL
3902};
3903
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003904static PyObject *
3905_test_incref(PyObject *ob)
3906{
3907 Py_INCREF(ob);
3908 return ob;
3909}
3910
3911static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303912test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003913{
3914 PyObject *obj = PyLong_FromLong(0);
3915 Py_XINCREF(_test_incref(obj));
3916 Py_DECREF(obj);
3917 Py_DECREF(obj);
3918 Py_DECREF(obj);
3919 Py_RETURN_NONE;
3920}
3921
3922static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303923test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003924{
3925 PyObject *obj = PyLong_FromLong(0);
3926 Py_INCREF(_test_incref(obj));
3927 Py_DECREF(obj);
3928 Py_DECREF(obj);
3929 Py_DECREF(obj);
3930 Py_RETURN_NONE;
3931}
3932
3933static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303934test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003935{
3936 Py_XDECREF(PyLong_FromLong(0));
3937 Py_RETURN_NONE;
3938}
3939
3940static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303941test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003942{
3943 Py_DECREF(PyLong_FromLong(0));
3944 Py_RETURN_NONE;
3945}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003946
Victor Stinner0507bf52013-07-07 02:05:46 +02003947static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003948test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3949 PyObject *Py_UNUSED(args))
3950{
3951 PyStructSequence_Desc descr;
3952 PyStructSequence_Field descr_fields[3];
3953
3954 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3955 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3956 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3957
3958 descr.name = "_testcapi.test_descr";
3959 descr.doc = "This is used to test for memory leaks in NewType";
3960 descr.fields = descr_fields;
3961 descr.n_in_sequence = 1;
3962
3963 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3964 assert(structseq_type != NULL);
3965 assert(PyType_Check(structseq_type));
3966 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3967 Py_DECREF(structseq_type);
3968
3969 Py_RETURN_NONE;
3970}
3971
3972static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303973test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003974{
3975 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003976 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003977 Py_DecRef(obj);
3978 Py_DecRef(obj);
3979 Py_RETURN_NONE;
3980}
3981
3982static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303983test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003984{
3985 void *ptr;
3986
Victor Stinnerdb067af2014-05-02 22:31:14 +02003987 ptr = PyMem_RawMalloc(0);
3988 if (ptr == NULL) {
3989 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3990 return NULL;
3991 }
3992 PyMem_RawFree(ptr);
3993
3994 ptr = PyMem_RawCalloc(0, 0);
3995 if (ptr == NULL) {
3996 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3997 return NULL;
3998 }
3999 PyMem_RawFree(ptr);
4000
Victor Stinner0507bf52013-07-07 02:05:46 +02004001 ptr = PyMem_Malloc(0);
4002 if (ptr == NULL) {
4003 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
4004 return NULL;
4005 }
4006 PyMem_Free(ptr);
4007
Victor Stinnerdb067af2014-05-02 22:31:14 +02004008 ptr = PyMem_Calloc(0, 0);
4009 if (ptr == NULL) {
4010 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
4011 return NULL;
4012 }
4013 PyMem_Free(ptr);
4014
Victor Stinner0507bf52013-07-07 02:05:46 +02004015 ptr = PyObject_Malloc(0);
4016 if (ptr == NULL) {
4017 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
4018 return NULL;
4019 }
4020 PyObject_Free(ptr);
4021
Victor Stinnerdb067af2014-05-02 22:31:14 +02004022 ptr = PyObject_Calloc(0, 0);
4023 if (ptr == NULL) {
4024 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
4025 return NULL;
4026 }
4027 PyObject_Free(ptr);
4028
Victor Stinner0507bf52013-07-07 02:05:46 +02004029 Py_RETURN_NONE;
4030}
4031
4032typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02004033 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02004034
4035 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004036 size_t calloc_nelem;
4037 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02004038 void *realloc_ptr;
4039 size_t realloc_new_size;
4040 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004041 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004042} alloc_hook_t;
4043
Victor Stinner9ed83c42017-10-31 12:18:10 -07004044static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02004045{
4046 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004047 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004048 hook->malloc_size = size;
4049 return hook->alloc.malloc(hook->alloc.ctx, size);
4050}
4051
Victor Stinner9ed83c42017-10-31 12:18:10 -07004052static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02004053{
4054 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004055 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004056 hook->calloc_nelem = nelem;
4057 hook->calloc_elsize = elsize;
4058 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
4059}
4060
Victor Stinner9ed83c42017-10-31 12:18:10 -07004061static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02004062{
4063 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004064 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004065 hook->realloc_ptr = ptr;
4066 hook->realloc_new_size = new_size;
4067 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
4068}
4069
Victor Stinner9ed83c42017-10-31 12:18:10 -07004070static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02004071{
4072 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004073 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004074 hook->free_ptr = ptr;
4075 hook->alloc.free(hook->alloc.ctx, ptr);
4076}
4077
4078static PyObject *
4079test_setallocators(PyMemAllocatorDomain domain)
4080{
4081 PyObject *res = NULL;
4082 const char *error_msg;
4083 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02004084 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004085 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02004086 void *ptr, *ptr2;
4087
Victor Stinnerdb067af2014-05-02 22:31:14 +02004088 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02004089
4090 alloc.ctx = &hook;
4091 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004092 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02004093 alloc.realloc = &hook_realloc;
4094 alloc.free = &hook_free;
4095 PyMem_GetAllocator(domain, &hook.alloc);
4096 PyMem_SetAllocator(domain, &alloc);
4097
Victor Stinner9ed83c42017-10-31 12:18:10 -07004098 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02004099 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004100 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02004101 switch(domain)
4102 {
4103 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
4104 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
4105 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
4106 default: ptr = NULL; break;
4107 }
4108
Victor Stinner9ed83c42017-10-31 12:18:10 -07004109#define CHECK_CTX(FUNC) \
4110 if (hook.ctx != &hook) { \
4111 error_msg = FUNC " wrong context"; \
4112 goto fail; \
4113 } \
4114 hook.ctx = NULL; /* reset for next check */
4115
Victor Stinner0507bf52013-07-07 02:05:46 +02004116 if (ptr == NULL) {
4117 error_msg = "malloc failed";
4118 goto fail;
4119 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004120 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02004121 if (hook.malloc_size != size) {
4122 error_msg = "malloc invalid size";
4123 goto fail;
4124 }
4125
4126 size2 = 200;
4127 switch(domain)
4128 {
4129 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
4130 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
4131 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02004132 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02004133 }
4134
4135 if (ptr2 == NULL) {
4136 error_msg = "realloc failed";
4137 goto fail;
4138 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004139 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02004140 if (hook.realloc_ptr != ptr
4141 || hook.realloc_new_size != size2) {
4142 error_msg = "realloc invalid parameters";
4143 goto fail;
4144 }
4145
4146 switch(domain)
4147 {
4148 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
4149 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
4150 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
4151 }
4152
Victor Stinner9ed83c42017-10-31 12:18:10 -07004153 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02004154 if (hook.free_ptr != ptr2) {
4155 error_msg = "free invalid pointer";
4156 goto fail;
4157 }
4158
Victor Stinner9ed83c42017-10-31 12:18:10 -07004159 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02004160 nelem = 2;
4161 elsize = 5;
4162 switch(domain)
4163 {
4164 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
4165 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
4166 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
4167 default: ptr = NULL; break;
4168 }
4169
4170 if (ptr == NULL) {
4171 error_msg = "calloc failed";
4172 goto fail;
4173 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004174 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02004175 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
4176 error_msg = "calloc invalid nelem or elsize";
4177 goto fail;
4178 }
4179
Victor Stinner9ed83c42017-10-31 12:18:10 -07004180 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004181 switch(domain)
4182 {
4183 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
4184 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
4185 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
4186 }
4187
Victor Stinner9ed83c42017-10-31 12:18:10 -07004188 CHECK_CTX("calloc free");
4189 if (hook.free_ptr != ptr) {
4190 error_msg = "calloc free invalid pointer";
4191 goto fail;
4192 }
4193
Victor Stinner0507bf52013-07-07 02:05:46 +02004194 Py_INCREF(Py_None);
4195 res = Py_None;
4196 goto finally;
4197
4198fail:
4199 PyErr_SetString(PyExc_RuntimeError, error_msg);
4200
4201finally:
4202 PyMem_SetAllocator(domain, &hook.alloc);
4203 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004204
4205#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02004206}
4207
4208static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304209test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004210{
4211 return test_setallocators(PYMEM_DOMAIN_RAW);
4212}
4213
4214static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304215test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004216{
4217 return test_setallocators(PYMEM_DOMAIN_MEM);
4218}
4219
4220static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304221test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004222{
4223 return test_setallocators(PYMEM_DOMAIN_OBJ);
4224}
4225
xdegaye85f64302017-07-01 14:14:45 +02004226/* Most part of the following code is inherited from the pyfailmalloc project
4227 * written by Victor Stinner. */
4228static struct {
4229 int installed;
4230 PyMemAllocatorEx raw;
4231 PyMemAllocatorEx mem;
4232 PyMemAllocatorEx obj;
4233} FmHook;
4234
4235static struct {
4236 int start;
4237 int stop;
4238 Py_ssize_t count;
4239} FmData;
4240
4241static int
4242fm_nomemory(void)
4243{
4244 FmData.count++;
4245 if (FmData.count > FmData.start &&
4246 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
4247 return 1;
4248 }
4249 return 0;
4250}
4251
4252static void *
4253hook_fmalloc(void *ctx, size_t size)
4254{
4255 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4256 if (fm_nomemory()) {
4257 return NULL;
4258 }
4259 return alloc->malloc(alloc->ctx, size);
4260}
4261
4262static void *
4263hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
4264{
4265 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4266 if (fm_nomemory()) {
4267 return NULL;
4268 }
4269 return alloc->calloc(alloc->ctx, nelem, elsize);
4270}
4271
4272static void *
4273hook_frealloc(void *ctx, void *ptr, size_t new_size)
4274{
4275 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4276 if (fm_nomemory()) {
4277 return NULL;
4278 }
4279 return alloc->realloc(alloc->ctx, ptr, new_size);
4280}
4281
4282static void
4283hook_ffree(void *ctx, void *ptr)
4284{
4285 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4286 alloc->free(alloc->ctx, ptr);
4287}
4288
4289static void
4290fm_setup_hooks(void)
4291{
4292 PyMemAllocatorEx alloc;
4293
4294 if (FmHook.installed) {
4295 return;
4296 }
4297 FmHook.installed = 1;
4298
4299 alloc.malloc = hook_fmalloc;
4300 alloc.calloc = hook_fcalloc;
4301 alloc.realloc = hook_frealloc;
4302 alloc.free = hook_ffree;
4303 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4304 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4305 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4306
4307 alloc.ctx = &FmHook.raw;
4308 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
4309
4310 alloc.ctx = &FmHook.mem;
4311 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
4312
4313 alloc.ctx = &FmHook.obj;
4314 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
4315}
4316
4317static void
4318fm_remove_hooks(void)
4319{
4320 if (FmHook.installed) {
4321 FmHook.installed = 0;
4322 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4323 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4324 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4325 }
4326}
4327
4328static PyObject*
4329set_nomemory(PyObject *self, PyObject *args)
4330{
4331 /* Memory allocation fails after 'start' allocation requests, and until
4332 * 'stop' allocation requests except when 'stop' is negative or equal
4333 * to 0 (default) in which case allocation failures never stop. */
4334 FmData.count = 0;
4335 FmData.stop = 0;
4336 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
4337 return NULL;
4338 }
4339 fm_setup_hooks();
4340 Py_RETURN_NONE;
4341}
4342
4343static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304344remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02004345{
4346 fm_remove_hooks();
4347 Py_RETURN_NONE;
4348}
4349
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004350PyDoc_STRVAR(docstring_empty,
4351""
4352);
4353
4354PyDoc_STRVAR(docstring_no_signature,
4355"This docstring has no signature."
4356);
4357
4358PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004359"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004360"\n"
4361"This docstring has an invalid signature."
4362);
4363
Larry Hastings2623c8c2014-02-08 22:15:29 -08004364PyDoc_STRVAR(docstring_with_invalid_signature2,
4365"docstring_with_invalid_signature2($module, /, boo)\n"
4366"\n"
4367"--\n"
4368"\n"
4369"This docstring also has an invalid signature."
4370);
4371
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004372PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004373"docstring_with_signature($module, /, sig)\n"
4374"--\n"
4375"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004376"This docstring has a valid signature."
4377);
4378
Zachary Ware8ef887c2015-04-13 18:22:35 -05004379PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4380"docstring_with_signature_but_no_doc($module, /, sig)\n"
4381"--\n"
4382"\n"
4383);
4384
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004385PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004386"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4387"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004388"\n"
4389"\n"
4390"This docstring has a valid signature and some extra newlines."
4391);
4392
Larry Hastings16c51912014-01-07 11:53:01 -08004393PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004394"docstring_with_signature_with_defaults(module, s='avocado',\n"
4395" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4396" local=the_number_three, sys=sys.maxsize,\n"
4397" exp=sys.maxsize - 1)\n"
4398"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004399"\n"
4400"\n"
4401"\n"
4402"This docstring has a valid signature with parameters,\n"
4403"and the parameters take defaults of varying types."
4404);
4405
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004406typedef struct {
4407 PyThread_type_lock start_event;
4408 PyThread_type_lock exit_event;
4409 PyObject *callback;
4410} test_c_thread_t;
4411
4412static void
4413temporary_c_thread(void *data)
4414{
4415 test_c_thread_t *test_c_thread = data;
4416 PyGILState_STATE state;
4417 PyObject *res;
4418
4419 PyThread_release_lock(test_c_thread->start_event);
4420
4421 /* Allocate a Python thread state for this thread */
4422 state = PyGILState_Ensure();
4423
Victor Stinner3466bde2016-09-05 18:16:01 -07004424 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004425 Py_CLEAR(test_c_thread->callback);
4426
4427 if (res == NULL) {
4428 PyErr_Print();
4429 }
4430 else {
4431 Py_DECREF(res);
4432 }
4433
4434 /* Destroy the Python thread state for this thread */
4435 PyGILState_Release(state);
4436
4437 PyThread_release_lock(test_c_thread->exit_event);
4438
4439 PyThread_exit_thread();
4440}
4441
4442static PyObject *
4443call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4444{
4445 PyObject *res = NULL;
4446 test_c_thread_t test_c_thread;
4447 long thread;
4448
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004449 test_c_thread.start_event = PyThread_allocate_lock();
4450 test_c_thread.exit_event = PyThread_allocate_lock();
4451 test_c_thread.callback = NULL;
4452 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4453 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4454 goto exit;
4455 }
4456
4457 Py_INCREF(callback);
4458 test_c_thread.callback = callback;
4459
4460 PyThread_acquire_lock(test_c_thread.start_event, 1);
4461 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4462
4463 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4464 if (thread == -1) {
4465 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4466 PyThread_release_lock(test_c_thread.start_event);
4467 PyThread_release_lock(test_c_thread.exit_event);
4468 goto exit;
4469 }
4470
4471 PyThread_acquire_lock(test_c_thread.start_event, 1);
4472 PyThread_release_lock(test_c_thread.start_event);
4473
4474 Py_BEGIN_ALLOW_THREADS
4475 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4476 PyThread_release_lock(test_c_thread.exit_event);
4477 Py_END_ALLOW_THREADS
4478
4479 Py_INCREF(Py_None);
4480 res = Py_None;
4481
4482exit:
4483 Py_CLEAR(test_c_thread.callback);
4484 if (test_c_thread.start_event)
4485 PyThread_free_lock(test_c_thread.start_event);
4486 if (test_c_thread.exit_event)
4487 PyThread_free_lock(test_c_thread.exit_event);
4488 return res;
4489}
Victor Stinner13105102013-12-13 02:17:29 +01004490
Serhiy Storchakab5181342015-02-06 08:58:56 +02004491/* marshal */
4492
4493static PyObject*
4494pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4495{
4496 long value;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004497 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004498 int version;
4499 FILE *fp;
4500
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004501 if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004502 &value, &filename, &version))
4503 return NULL;
4504
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004505 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004506 if (fp == NULL) {
4507 PyErr_SetFromErrno(PyExc_OSError);
4508 return NULL;
4509 }
4510
4511 PyMarshal_WriteLongToFile(value, fp, version);
4512
4513 fclose(fp);
4514 if (PyErr_Occurred())
4515 return NULL;
4516 Py_RETURN_NONE;
4517}
4518
4519static PyObject*
4520pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4521{
4522 PyObject *obj;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004523 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004524 int version;
4525 FILE *fp;
4526
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004527 if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004528 &obj, &filename, &version))
4529 return NULL;
4530
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004531 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004532 if (fp == NULL) {
4533 PyErr_SetFromErrno(PyExc_OSError);
4534 return NULL;
4535 }
4536
4537 PyMarshal_WriteObjectToFile(obj, fp, version);
4538
4539 fclose(fp);
4540 if (PyErr_Occurred())
4541 return NULL;
4542 Py_RETURN_NONE;
4543}
4544
4545static PyObject*
4546pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4547{
4548 int value;
4549 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004550 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004551 FILE *fp;
4552
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004553 if (!PyArg_ParseTuple(args, "O:pymarshal_read_short_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004554 return NULL;
4555
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004556 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004557 if (fp == NULL) {
4558 PyErr_SetFromErrno(PyExc_OSError);
4559 return NULL;
4560 }
4561
4562 value = PyMarshal_ReadShortFromFile(fp);
4563 pos = ftell(fp);
4564
4565 fclose(fp);
4566 if (PyErr_Occurred())
4567 return NULL;
4568 return Py_BuildValue("il", value, pos);
4569}
4570
4571static PyObject*
4572pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4573{
4574 long value, pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004575 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004576 FILE *fp;
4577
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004578 if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004579 return NULL;
4580
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004581 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004582 if (fp == NULL) {
4583 PyErr_SetFromErrno(PyExc_OSError);
4584 return NULL;
4585 }
4586
4587 value = PyMarshal_ReadLongFromFile(fp);
4588 pos = ftell(fp);
4589
4590 fclose(fp);
4591 if (PyErr_Occurred())
4592 return NULL;
4593 return Py_BuildValue("ll", value, pos);
4594}
4595
4596static PyObject*
4597pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4598{
4599 PyObject *obj;
4600 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004601 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004602 FILE *fp;
4603
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004604 if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004605 return NULL;
4606
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004607 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004608 if (fp == NULL) {
4609 PyErr_SetFromErrno(PyExc_OSError);
4610 return NULL;
4611 }
4612
4613 obj = PyMarshal_ReadLastObjectFromFile(fp);
4614 pos = ftell(fp);
4615
4616 fclose(fp);
4617 return Py_BuildValue("Nl", obj, pos);
4618}
4619
4620static PyObject*
4621pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4622{
4623 PyObject *obj;
4624 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004625 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004626 FILE *fp;
4627
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004628 if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004629 return NULL;
4630
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004631 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004632 if (fp == NULL) {
4633 PyErr_SetFromErrno(PyExc_OSError);
4634 return NULL;
4635 }
4636
4637 obj = PyMarshal_ReadObjectFromFile(fp);
4638 pos = ftell(fp);
4639
4640 fclose(fp);
4641 return Py_BuildValue("Nl", obj, pos);
4642}
4643
Victor Stinnerefde1462015-03-21 15:04:43 +01004644static PyObject*
4645return_null_without_error(PyObject *self, PyObject *args)
4646{
4647 /* invalid call: return NULL without setting an error,
4648 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4649 PyErr_Clear();
4650 return NULL;
4651}
4652
4653static PyObject*
4654return_result_with_error(PyObject *self, PyObject *args)
4655{
4656 /* invalid call: return a result with an error set,
4657 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4658 PyErr_SetNone(PyExc_ValueError);
4659 Py_RETURN_NONE;
4660}
4661
Victor Stinner992c43f2015-03-27 17:12:45 +01004662static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004663test_pytime_fromseconds(PyObject *self, PyObject *args)
4664{
4665 int seconds;
4666 _PyTime_t ts;
4667
4668 if (!PyArg_ParseTuple(args, "i", &seconds))
4669 return NULL;
4670 ts = _PyTime_FromSeconds(seconds);
4671 return _PyTime_AsNanosecondsObject(ts);
4672}
4673
4674static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004675test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4676{
4677 PyObject *obj;
4678 int round;
4679 _PyTime_t ts;
4680
4681 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4682 return NULL;
4683 if (check_time_rounding(round) < 0)
4684 return NULL;
4685 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4686 return NULL;
4687 return _PyTime_AsNanosecondsObject(ts);
4688}
4689
Victor Stinner4bfb4602015-03-27 22:27:24 +01004690static PyObject *
4691test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4692{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004693 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004694 _PyTime_t ts;
4695 double d;
4696
Victor Stinnerc29b5852017-11-02 07:28:27 -07004697 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004698 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004699 }
4700 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4701 return NULL;
4702 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004703 d = _PyTime_AsSecondsDouble(ts);
4704 return PyFloat_FromDouble(d);
4705}
4706
Victor Stinner95e9cef2015-03-28 01:26:47 +01004707static PyObject *
4708test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4709{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004710 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004711 int round;
4712 _PyTime_t t;
4713 struct timeval tv;
4714 PyObject *seconds;
4715
Victor Stinnerc29b5852017-11-02 07:28:27 -07004716 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004717 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004718 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004719 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004720 }
4721 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004722 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004723 }
4724 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4725 return NULL;
4726 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004727
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004728 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004729 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004730 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004731 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004732 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4733}
4734
Victor Stinner34dc0f42015-03-27 18:19:03 +01004735#ifdef HAVE_CLOCK_GETTIME
4736static PyObject *
4737test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4738{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004739 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004740 _PyTime_t t;
4741 struct timespec ts;
4742
Victor Stinnerc29b5852017-11-02 07:28:27 -07004743 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004744 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004745 }
4746 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004747 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004748 }
4749 if (_PyTime_AsTimespec(t, &ts) == -1) {
4750 return NULL;
4751 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004752 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4753}
4754#endif
4755
Victor Stinner62d1c702015-04-01 17:47:07 +02004756static PyObject *
4757test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4758{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004759 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004760 int round;
4761 _PyTime_t t, ms;
4762
Victor Stinnerc29b5852017-11-02 07:28:27 -07004763 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004764 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004765 }
4766 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004767 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004768 }
4769 if (check_time_rounding(round) < 0) {
4770 return NULL;
4771 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004772 ms = _PyTime_AsMilliseconds(t, round);
4773 /* This conversion rely on the fact that _PyTime_t is a number of
4774 nanoseconds */
4775 return _PyTime_AsNanosecondsObject(ms);
4776}
4777
4778static PyObject *
4779test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4780{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004781 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004782 int round;
4783 _PyTime_t t, ms;
4784
Victor Stinnerc29b5852017-11-02 07:28:27 -07004785 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004786 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004787 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004788 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004789 }
4790 if (check_time_rounding(round) < 0) {
4791 return NULL;
4792 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004793 ms = _PyTime_AsMicroseconds(t, round);
4794 /* This conversion rely on the fact that _PyTime_t is a number of
4795 nanoseconds */
4796 return _PyTime_AsNanosecondsObject(ms);
4797}
4798
Victor Stinner50856d52015-10-13 00:11:21 +02004799static PyObject*
Victor Stinner34be807c2016-03-14 12:04:26 +01004800pymem_buffer_overflow(PyObject *self, PyObject *args)
4801{
4802 char *buffer;
4803
4804 /* Deliberate buffer overflow to check that PyMem_Free() detects
4805 the overflow when debug hooks are installed. */
4806 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004807 if (buffer == NULL) {
4808 PyErr_NoMemory();
4809 return NULL;
4810 }
Victor Stinner34be807c2016-03-14 12:04:26 +01004811 buffer[16] = 'x';
4812 PyMem_Free(buffer);
4813
4814 Py_RETURN_NONE;
4815}
4816
4817static PyObject*
4818pymem_api_misuse(PyObject *self, PyObject *args)
4819{
4820 char *buffer;
4821
4822 /* Deliberate misusage of Python allocators:
4823 allococate with PyMem but release with PyMem_Raw. */
4824 buffer = PyMem_Malloc(16);
4825 PyMem_RawFree(buffer);
4826
4827 Py_RETURN_NONE;
4828}
4829
Victor Stinnerc4aec362016-03-14 22:26:53 +01004830static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004831pymem_malloc_without_gil(PyObject *self, PyObject *args)
4832{
4833 char *buffer;
4834
4835 /* Deliberate bug to test debug hooks on Python memory allocators:
4836 call PyMem_Malloc() without holding the GIL */
4837 Py_BEGIN_ALLOW_THREADS
4838 buffer = PyMem_Malloc(10);
4839 Py_END_ALLOW_THREADS
4840
4841 PyMem_Free(buffer);
4842
4843 Py_RETURN_NONE;
4844}
4845
Victor Stinner5d39e042017-11-29 17:20:38 +01004846
4847static PyObject*
4848test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4849{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004850 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004851 if (name == NULL) {
4852 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4853 return NULL;
4854 }
4855 return PyUnicode_FromString(name);
4856}
4857
4858
Victor Stinnerad524372016-03-16 12:12:53 +01004859static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004860test_pyobject_is_freed(const char *test_name, PyObject *op)
Victor Stinner2b00db62019-04-11 11:33:27 +02004861{
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004862 if (!_PyObject_IsFreed(op)) {
4863 return raiseTestError(test_name, "object is not seen as freed");
4864 }
4865 Py_RETURN_NONE;
Victor Stinner2b00db62019-04-11 11:33:27 +02004866}
4867
4868
4869static PyObject*
Victor Stinner68762572019-10-07 18:42:01 +02004870check_pyobject_null_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
4871{
4872 PyObject *op = NULL;
4873 return test_pyobject_is_freed("check_pyobject_null_is_freed", op);
4874}
4875
4876
4877static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004878check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004879{
4880 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4881 if (op == NULL) {
4882 return NULL;
4883 }
4884 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004885 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004886 /* object fields like ob_type are uninitialized! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004887 return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004888}
4889
4890
4891static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004892check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004893{
4894 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4895 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4896 if (op == NULL) {
4897 return NULL;
4898 }
4899 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004900 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004901 /* ob_type field is after the memory block: part of "forbidden bytes"
Min ho Kim39d87b52019-08-31 06:21:19 +10004902 when using debug hooks on memory allocators! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004903 return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004904}
4905
4906
4907static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004908check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004909{
4910 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4911 if (op == NULL) {
4912 return NULL;
4913 }
4914 Py_TYPE(op)->tp_dealloc(op);
4915 /* Reset reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004916 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004917 /* object memory is freed! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004918 return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004919}
4920
4921
4922static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004923pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4924{
4925 char *buffer;
4926
Victor Stinnerad524372016-03-16 12:12:53 +01004927 /* Deliberate bug to test debug hooks on Python memory allocators:
4928 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004929 Py_BEGIN_ALLOW_THREADS
4930 buffer = PyObject_Malloc(10);
4931 Py_END_ALLOW_THREADS
4932
4933 PyObject_Free(buffer);
4934
4935 Py_RETURN_NONE;
4936}
4937
Victor Stinner10b73e12016-03-22 13:39:05 +01004938static PyObject *
4939tracemalloc_track(PyObject *self, PyObject *args)
4940{
4941 unsigned int domain;
4942 PyObject *ptr_obj;
4943 void *ptr;
4944 Py_ssize_t size;
4945 int release_gil = 0;
4946 int res;
4947
4948 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4949 return NULL;
4950 ptr = PyLong_AsVoidPtr(ptr_obj);
4951 if (PyErr_Occurred())
4952 return NULL;
4953
4954 if (release_gil) {
4955 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004956 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004957 Py_END_ALLOW_THREADS
4958 }
4959 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004960 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004961 }
4962
4963 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004964 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004965 return NULL;
4966 }
4967
4968 Py_RETURN_NONE;
4969}
4970
4971static PyObject *
4972tracemalloc_untrack(PyObject *self, PyObject *args)
4973{
4974 unsigned int domain;
4975 PyObject *ptr_obj;
4976 void *ptr;
4977 int res;
4978
4979 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4980 return NULL;
4981 ptr = PyLong_AsVoidPtr(ptr_obj);
4982 if (PyErr_Occurred())
4983 return NULL;
4984
Victor Stinner5ea4c062017-06-20 17:46:36 +02004985 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004986 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004987 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004988 return NULL;
4989 }
4990
4991 Py_RETURN_NONE;
4992}
4993
4994static PyObject *
4995tracemalloc_get_traceback(PyObject *self, PyObject *args)
4996{
4997 unsigned int domain;
4998 PyObject *ptr_obj;
4999 void *ptr;
5000
5001 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
5002 return NULL;
5003 ptr = PyLong_AsVoidPtr(ptr_obj);
5004 if (PyErr_Occurred())
5005 return NULL;
5006
Benjamin Petersonca470632016-09-06 13:47:26 -07005007 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01005008}
5009
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005010static PyObject *
5011dict_get_version(PyObject *self, PyObject *args)
5012{
5013 PyDictObject *dict;
5014 uint64_t version;
5015
5016 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
5017 return NULL;
5018
5019 version = dict->ma_version_tag;
5020
Sergey Fedoseeva9ed91e2019-10-21 11:49:48 +05005021 Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(version));
5022 return PyLong_FromUnsignedLongLong((unsigned long long)version);
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005023}
5024
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005025
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005026static PyObject *
5027raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
5028{
5029 PyGenObject *gen;
5030
5031 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
5032 return NULL;
5033
5034 /* This is used in a test to check what happens if a signal arrives just
5035 as we're in the process of entering a yield from chain (see
5036 bpo-30039).
5037
5038 Needs to be done in C, because:
5039 - we don't have a Python wrapper for raise()
5040 - we need to make sure that the Python-level signal handler doesn't run
5041 *before* we enter the generator frame, which is impossible in Python
5042 because we check for signals before every bytecode operation.
5043 */
5044 raise(SIGINT);
5045 return _PyGen_Send(gen, Py_None);
5046}
5047
5048
Victor Stinner3b5cf852017-06-09 16:48:45 +02005049static int
5050fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
5051{
5052 if (args == Py_None) {
5053 *stack = NULL;
5054 *nargs = 0;
5055 }
5056 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01005057 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02005058 *nargs = PyTuple_GET_SIZE(args);
5059 }
5060 else {
5061 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
5062 return -1;
5063 }
5064 return 0;
5065}
5066
5067
5068static PyObject *
5069test_pyobject_fastcall(PyObject *self, PyObject *args)
5070{
5071 PyObject *func, *func_args;
5072 PyObject **stack;
5073 Py_ssize_t nargs;
5074
5075 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
5076 return NULL;
5077 }
5078
5079 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5080 return NULL;
5081 }
5082 return _PyObject_FastCall(func, stack, nargs);
5083}
5084
5085
5086static PyObject *
5087test_pyobject_fastcalldict(PyObject *self, PyObject *args)
5088{
5089 PyObject *func, *func_args, *kwargs;
5090 PyObject **stack;
5091 Py_ssize_t nargs;
5092
5093 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
5094 return NULL;
5095 }
5096
5097 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5098 return NULL;
5099 }
5100
5101 if (kwargs == Py_None) {
5102 kwargs = NULL;
5103 }
5104 else if (!PyDict_Check(kwargs)) {
5105 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
5106 return NULL;
5107 }
5108
Petr Viktorinffd97532020-02-11 17:46:57 +01005109 return PyObject_VectorcallDict(func, stack, nargs, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005110}
5111
5112
5113static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005114test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02005115{
5116 PyObject *func, *func_args, *kwnames = NULL;
5117 PyObject **stack;
5118 Py_ssize_t nargs, nkw;
5119
5120 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
5121 return NULL;
5122 }
5123
5124 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5125 return NULL;
5126 }
5127
5128 if (kwnames == Py_None) {
5129 kwnames = NULL;
5130 }
5131 else if (PyTuple_Check(kwnames)) {
5132 nkw = PyTuple_GET_SIZE(kwnames);
5133 if (nargs < nkw) {
5134 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
5135 return NULL;
5136 }
5137 nargs -= nkw;
5138 }
5139 else {
5140 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
5141 return NULL;
5142 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005143 return PyObject_Vectorcall(func, stack, nargs, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005144}
5145
5146
5147static PyObject *
5148test_pyvectorcall_call(PyObject *self, PyObject *args)
5149{
5150 PyObject *func;
5151 PyObject *argstuple;
5152 PyObject *kwargs = NULL;
5153
5154 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
5155 return NULL;
5156 }
5157
5158 if (!PyTuple_Check(argstuple)) {
5159 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
5160 return NULL;
5161 }
5162 if (kwargs != NULL && !PyDict_Check(kwargs)) {
5163 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
5164 return NULL;
5165 }
5166
5167 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005168}
5169
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005170
Victor Stinner64fa4492017-07-10 14:37:49 +02005171static PyObject*
5172stack_pointer(PyObject *self, PyObject *args)
5173{
5174 int v = 5;
5175 return PyLong_FromVoidPtr(&v);
5176}
5177
Victor Stinner3b5cf852017-06-09 16:48:45 +02005178
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005179#ifdef W_STOPCODE
5180static PyObject*
5181py_w_stopcode(PyObject *self, PyObject *args)
5182{
5183 int sig, status;
5184 if (!PyArg_ParseTuple(args, "i", &sig)) {
5185 return NULL;
5186 }
5187 status = W_STOPCODE(sig);
5188 return PyLong_FromLong(status);
5189}
5190#endif
5191
5192
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005193static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03005194get_mapping_keys(PyObject* self, PyObject *obj)
5195{
5196 return PyMapping_Keys(obj);
5197}
5198
5199static PyObject *
5200get_mapping_values(PyObject* self, PyObject *obj)
5201{
5202 return PyMapping_Values(obj);
5203}
5204
5205static PyObject *
5206get_mapping_items(PyObject* self, PyObject *obj)
5207{
5208 return PyMapping_Items(obj);
5209}
5210
5211
5212static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005213test_pythread_tss_key_state(PyObject *self, PyObject *args)
5214{
5215 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
5216 if (PyThread_tss_is_created(&tss_key)) {
5217 return raiseTestError("test_pythread_tss_key_state",
5218 "TSS key not in an uninitialized state at "
5219 "creation time");
5220 }
5221 if (PyThread_tss_create(&tss_key) != 0) {
5222 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
5223 return NULL;
5224 }
5225 if (!PyThread_tss_is_created(&tss_key)) {
5226 return raiseTestError("test_pythread_tss_key_state",
5227 "PyThread_tss_create succeeded, "
5228 "but with TSS key in an uninitialized state");
5229 }
5230 if (PyThread_tss_create(&tss_key) != 0) {
5231 return raiseTestError("test_pythread_tss_key_state",
5232 "PyThread_tss_create unsuccessful with "
5233 "an already initialized key");
5234 }
5235#define CHECK_TSS_API(expr) \
5236 (void)(expr); \
5237 if (!PyThread_tss_is_created(&tss_key)) { \
5238 return raiseTestError("test_pythread_tss_key_state", \
5239 "TSS key initialization state was not " \
5240 "preserved after calling " #expr); }
5241 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
5242 CHECK_TSS_API(PyThread_tss_get(&tss_key));
5243#undef CHECK_TSS_API
5244 PyThread_tss_delete(&tss_key);
5245 if (PyThread_tss_is_created(&tss_key)) {
5246 return raiseTestError("test_pythread_tss_key_state",
5247 "PyThread_tss_delete called, but did not "
5248 "set the key state to uninitialized");
5249 }
5250
5251 Py_tss_t *ptr_key = PyThread_tss_alloc();
5252 if (ptr_key == NULL) {
5253 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
5254 return NULL;
5255 }
5256 if (PyThread_tss_is_created(ptr_key)) {
5257 return raiseTestError("test_pythread_tss_key_state",
5258 "TSS key not in an uninitialized state at "
5259 "allocation time");
5260 }
5261 PyThread_tss_free(ptr_key);
5262 ptr_key = NULL;
5263 Py_RETURN_NONE;
5264}
5265
5266
Yury Selivanovf23746a2018-01-22 19:11:18 -05005267static PyObject*
5268new_hamt(PyObject *self, PyObject *args)
5269{
5270 return _PyContext_NewHamtForTests();
5271}
5272
5273
jdemeyer5a306202018-10-19 23:50:06 +02005274/* def bad_get(self, obj, cls):
5275 cls()
5276 return repr(self)
5277*/
5278static PyObject*
5279bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5280{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005281 PyObject *self, *obj, *cls;
5282 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02005283 return NULL;
5284 }
5285
Jeroen Demeyer7f41c8e2019-07-04 12:35:31 +02005286 PyObject *res = _PyObject_CallNoArg(cls);
jdemeyer5a306202018-10-19 23:50:06 +02005287 if (res == NULL) {
5288 return NULL;
5289 }
5290 Py_DECREF(res);
5291
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005292 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02005293}
5294
5295
Victor Stinner3d4226a2018-08-29 22:21:32 +02005296static PyObject *
5297encode_locale_ex(PyObject *self, PyObject *args)
5298{
5299 PyObject *unicode;
5300 int current_locale = 0;
5301 wchar_t *wstr;
5302 PyObject *res = NULL;
5303 const char *errors = NULL;
5304
5305 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
5306 return NULL;
5307 }
5308 wstr = PyUnicode_AsWideCharString(unicode, NULL);
5309 if (wstr == NULL) {
5310 return NULL;
5311 }
5312 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5313
5314 char *str = NULL;
5315 size_t error_pos;
5316 const char *reason = NULL;
5317 int ret = _Py_EncodeLocaleEx(wstr,
5318 &str, &error_pos, &reason,
5319 current_locale, error_handler);
5320 PyMem_Free(wstr);
5321
5322 switch(ret) {
5323 case 0:
5324 res = PyBytes_FromString(str);
5325 PyMem_RawFree(str);
5326 break;
5327 case -1:
5328 PyErr_NoMemory();
5329 break;
5330 case -2:
5331 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
5332 error_pos, reason);
5333 break;
5334 case -3:
5335 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5336 break;
5337 default:
5338 PyErr_SetString(PyExc_ValueError, "unknow error code");
5339 break;
5340 }
5341 return res;
5342}
5343
5344
5345static PyObject *
5346decode_locale_ex(PyObject *self, PyObject *args)
5347{
5348 char *str;
5349 int current_locale = 0;
5350 PyObject *res = NULL;
5351 const char *errors = NULL;
5352
5353 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
5354 return NULL;
5355 }
5356 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5357
5358 wchar_t *wstr = NULL;
5359 size_t wlen = 0;
5360 const char *reason = NULL;
5361 int ret = _Py_DecodeLocaleEx(str,
5362 &wstr, &wlen, &reason,
5363 current_locale, error_handler);
5364
5365 switch(ret) {
5366 case 0:
5367 res = PyUnicode_FromWideChar(wstr, wlen);
5368 PyMem_RawFree(wstr);
5369 break;
5370 case -1:
5371 PyErr_NoMemory();
5372 break;
5373 case -2:
5374 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
5375 wlen, reason);
5376 break;
5377 case -3:
5378 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5379 break;
5380 default:
5381 PyErr_SetString(PyExc_ValueError, "unknow error code");
5382 break;
5383 }
5384 return res;
5385}
5386
5387
Victor Stinner18618e652018-10-25 17:28:11 +02005388#ifdef Py_REF_DEBUG
5389static PyObject *
5390negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5391{
5392 PyObject *obj = PyUnicode_FromString("negative_refcount");
5393 if (obj == NULL) {
5394 return NULL;
5395 }
5396 assert(Py_REFCNT(obj) == 1);
5397
Victor Stinnerc86a1122020-02-07 01:24:29 +01005398 Py_SET_REFCNT(obj, 0);
Victor Stinner18618e652018-10-25 17:28:11 +02005399 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5400 Py_DECREF(obj);
5401
5402 Py_RETURN_NONE;
5403}
5404#endif
5405
5406
Victor Stinneref9d9b62019-05-22 11:28:22 +02005407static PyObject*
5408test_write_unraisable_exc(PyObject *self, PyObject *args)
5409{
Victor Stinner71c52e32019-05-27 08:57:14 +02005410 PyObject *exc, *err_msg, *obj;
5411 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005412 return NULL;
5413 }
5414
Victor Stinner71c52e32019-05-27 08:57:14 +02005415 const char *err_msg_utf8;
5416 if (err_msg != Py_None) {
5417 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5418 if (err_msg_utf8 == NULL) {
5419 return NULL;
5420 }
5421 }
5422 else {
5423 err_msg_utf8 = NULL;
5424 }
5425
Victor Stinneref9d9b62019-05-22 11:28:22 +02005426 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005427 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005428 Py_RETURN_NONE;
5429}
5430
5431
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005432static PyObject *
5433sequence_getitem(PyObject *self, PyObject *args)
5434{
5435 PyObject *seq;
5436 Py_ssize_t i;
5437 if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
5438 return NULL;
5439 }
5440 return PySequence_GetItem(seq, i);
5441}
5442
5443
Petr Viktorinf9583772019-09-10 12:21:09 +01005444/* Functions for testing C calling conventions (METH_*) are named meth_*,
5445 * e.g. "meth_varargs" for METH_VARARGS.
5446 *
5447 * They all return a tuple of their C-level arguments, with None instead
5448 * of NULL and Python tuples instead of C arrays.
5449 */
5450
5451
5452static PyObject*
5453_null_to_none(PyObject* obj)
5454{
5455 if (obj == NULL) {
5456 Py_RETURN_NONE;
5457 }
5458 Py_INCREF(obj);
5459 return obj;
5460}
5461
5462static PyObject*
5463meth_varargs(PyObject* self, PyObject* args)
5464{
5465 return Py_BuildValue("NO", _null_to_none(self), args);
5466}
5467
5468static PyObject*
5469meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs)
5470{
5471 return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs));
5472}
5473
5474static PyObject*
5475meth_o(PyObject* self, PyObject* obj)
5476{
5477 return Py_BuildValue("NO", _null_to_none(self), obj);
5478}
5479
5480static PyObject*
5481meth_noargs(PyObject* self, PyObject* ignored)
5482{
5483 return _null_to_none(self);
5484}
5485
5486static PyObject*
5487_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs)
5488{
5489 PyObject *tuple = PyTuple_New(nargs);
5490 if (tuple == NULL) {
5491 return NULL;
5492 }
5493 for (Py_ssize_t i=0; i < nargs; i++) {
5494 Py_INCREF(args[i]);
5495 PyTuple_SET_ITEM(tuple, i, args[i]);
5496 }
5497 return tuple;
5498}
5499
5500static PyObject*
5501meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
5502{
5503 return Py_BuildValue(
5504 "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs)
5505 );
5506}
5507
5508static PyObject*
5509meth_fastcall_keywords(PyObject* self, PyObject* const* args,
5510 Py_ssize_t nargs, PyObject* kwargs)
5511{
5512 PyObject *pyargs = _fastcall_to_tuple(args, nargs);
5513 if (pyargs == NULL) {
5514 return NULL;
5515 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005516 PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type,
Petr Viktorinf9583772019-09-10 12:21:09 +01005517 args + nargs, 0, kwargs);
5518 return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
5519}
5520
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005521
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005522static PyObject*
5523pynumber_tobase(PyObject *module, PyObject *args)
5524{
5525 PyObject *obj;
5526 int base;
5527 if (!PyArg_ParseTuple(args, "Oi:pynumber_tobase",
5528 &obj, &base)) {
5529 return NULL;
5530 }
5531 return PyNumber_ToBase(obj, base);
5532}
5533
5534
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005535static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
5536
Tim Peters9ea17ac2001-02-02 05:57:15 +00005537static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305539 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005540 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305541 {"test_config", test_config, METH_NOARGS},
5542 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005543 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005544 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5545 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5546 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5547 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5548 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5549 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005550 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005551 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005552 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5553 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5554 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5555 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5556 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5557 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005558 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5559 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03005560 {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
5561 {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
5562 {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
5563 {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
Stefan Krah39042e02020-08-10 16:32:21 +02005564 {"decimal_is_special", decimal_is_special, METH_O},
5565 {"decimal_is_nan", decimal_is_nan, METH_O},
5566 {"decimal_is_infinite", decimal_is_infinite, METH_O},
5567 {"decimal_get_digits", decimal_get_digits, METH_O},
5568 {"decimal_as_triple", decimal_as_triple, METH_O},
5569 {"decimal_from_triple", decimal_from_triple, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305570 {"test_list_api", test_list_api, METH_NOARGS},
5571 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005572 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005573 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305574 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5575 {"test_long_api", test_long_api, METH_NOARGS},
5576 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5577 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5578 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5579 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005580 {"test_structseq_newtype_doesnt_leak",
5581 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305582 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5583 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5584 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5585 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
Zackery Spytzdc247652019-06-06 14:39:23 -06005586 {"test_long_as_unsigned_long_long_mask",
5587 test_long_as_unsigned_long_long_mask, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305588 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5589 {"test_k_code", test_k_code, METH_NOARGS},
5590 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005591 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305592 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305594 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305596 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5597 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5598 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005599 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005600 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005601#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005602 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005603#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005604 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03005605 {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005606 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005607 {"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03005608 {"get_args", get_args, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005609 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005611 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005613 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005614 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005615 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005616 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005617 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005618 {"getargs_b", getargs_b, METH_VARARGS},
5619 {"getargs_B", getargs_B, METH_VARARGS},
5620 {"getargs_h", getargs_h, METH_VARARGS},
5621 {"getargs_H", getargs_H, METH_VARARGS},
5622 {"getargs_I", getargs_I, METH_VARARGS},
5623 {"getargs_k", getargs_k, METH_VARARGS},
5624 {"getargs_i", getargs_i, METH_VARARGS},
5625 {"getargs_l", getargs_l, METH_VARARGS},
5626 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005627 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005628 {"getargs_L", getargs_L, METH_VARARGS},
5629 {"getargs_K", getargs_K, METH_VARARGS},
5630 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305631 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5632 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005633 {"getargs_f", getargs_f, METH_VARARGS},
5634 {"getargs_d", getargs_d, METH_VARARGS},
5635 {"getargs_D", getargs_D, METH_VARARGS},
5636 {"getargs_S", getargs_S, METH_VARARGS},
5637 {"getargs_Y", getargs_Y, METH_VARARGS},
5638 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005639 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005640 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005641 {"getargs_s", getargs_s, METH_VARARGS},
5642 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5643 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
5644 {"getargs_z", getargs_z, METH_VARARGS},
5645 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5646 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5647 {"getargs_y", getargs_y, METH_VARARGS},
5648 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5649 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5650 {"getargs_u", getargs_u, METH_VARARGS},
5651 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5652 {"getargs_Z", getargs_Z, METH_VARARGS},
5653 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005654 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005655 {"getargs_es", getargs_es, METH_VARARGS},
5656 {"getargs_et", getargs_et, METH_VARARGS},
5657 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5658 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005660 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005662 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305663 {"test_s_code", test_s_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005664#if USE_UNICODE_WCHAR_CACHE
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305665 {"test_u_code", test_u_code, METH_NOARGS},
5666 {"test_Z_code", test_Z_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005667#endif /* USE_UNICODE_WCHAR_CACHE */
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305668 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005669 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5670 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005671 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Hai Shi5623ac82019-07-20 02:56:23 -05005672 {"unicode_asutf8", unicode_asutf8, METH_VARARGS},
5673 {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005674 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005675 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005676#if USE_UNICODE_WCHAR_CACHE
Victor Stinner42bf7752011-11-21 22:52:58 +01005677 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5678 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005679 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005680#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinner1c24bd02010-10-02 11:03:13 +00005681 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005682 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005683#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005684 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005685#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005686 {"traceback_print", traceback_print, METH_VARARGS},
5687 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005688 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005689 {"argparsing", argparsing, METH_VARARGS},
5690 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005691 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005692 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305693 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005694 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305695 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005696 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005697 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5698 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005699 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005700 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005701 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305702 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5703 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5704 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5705 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005706 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5707 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305708 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005709 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005710 {"no_docstring",
5711 (PyCFunction)test_with_docstring, METH_NOARGS},
5712 {"docstring_empty",
5713 (PyCFunction)test_with_docstring, METH_NOARGS,
5714 docstring_empty},
5715 {"docstring_no_signature",
5716 (PyCFunction)test_with_docstring, METH_NOARGS,
5717 docstring_no_signature},
5718 {"docstring_with_invalid_signature",
5719 (PyCFunction)test_with_docstring, METH_NOARGS,
5720 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005721 {"docstring_with_invalid_signature2",
5722 (PyCFunction)test_with_docstring, METH_NOARGS,
5723 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005724 {"docstring_with_signature",
5725 (PyCFunction)test_with_docstring, METH_NOARGS,
5726 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005727 {"docstring_with_signature_but_no_doc",
5728 (PyCFunction)test_with_docstring, METH_NOARGS,
5729 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005730 {"docstring_with_signature_and_extra_newlines",
5731 (PyCFunction)test_with_docstring, METH_NOARGS,
5732 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005733 {"docstring_with_signature_with_defaults",
5734 (PyCFunction)test_with_docstring, METH_NOARGS,
5735 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005736 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5737 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005738 {"pymarshal_write_long_to_file",
5739 pymarshal_write_long_to_file, METH_VARARGS},
5740 {"pymarshal_write_object_to_file",
5741 pymarshal_write_object_to_file, METH_VARARGS},
5742 {"pymarshal_read_short_from_file",
5743 pymarshal_read_short_from_file, METH_VARARGS},
5744 {"pymarshal_read_long_from_file",
5745 pymarshal_read_long_from_file, METH_VARARGS},
5746 {"pymarshal_read_last_object_from_file",
5747 pymarshal_read_last_object_from_file, METH_VARARGS},
5748 {"pymarshal_read_object_from_file",
5749 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01005750 {"return_null_without_error",
5751 return_null_without_error, METH_NOARGS},
5752 {"return_result_with_error",
5753 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02005754 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005755 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5756 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005757 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005758#ifdef HAVE_CLOCK_GETTIME
5759 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5760#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005761 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5762 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01005763 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5764 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005765 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005766 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner68762572019-10-07 18:42:01 +02005767 {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02005768 {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
5769 {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
5770 {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005771 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005772 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5773 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5774 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005775 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005776 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005777 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5778 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005779 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5780 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005781 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005782#ifdef W_STOPCODE
5783 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5784#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005785 {"get_mapping_keys", get_mapping_keys, METH_O},
5786 {"get_mapping_values", get_mapping_values, METH_O},
5787 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005788 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005789 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005790 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005791 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5792 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005793#ifdef Py_REF_DEBUG
5794 {"negative_refcount", negative_refcount, METH_NOARGS},
5795#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005796 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005797 {"sequence_getitem", sequence_getitem, METH_VARARGS},
Petr Viktorinf9583772019-09-10 12:21:09 +01005798 {"meth_varargs", meth_varargs, METH_VARARGS},
5799 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
5800 {"meth_o", meth_o, METH_O},
5801 {"meth_noargs", meth_noargs, METH_NOARGS},
5802 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
5803 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005804 {"pynumber_tobase", pynumber_tobase, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005806};
5807
Thomas Hellera4ea6032003-04-17 18:55:45 +00005808#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5809
Thomas Wouters89f507f2006-12-13 04:49:30 +00005810typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005811 char bool_member;
5812 char byte_member;
5813 unsigned char ubyte_member;
5814 short short_member;
5815 unsigned short ushort_member;
5816 int int_member;
5817 unsigned int uint_member;
5818 long long_member;
5819 unsigned long ulong_member;
5820 Py_ssize_t pyssizet_member;
5821 float float_member;
5822 double double_member;
5823 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005824 long long longlong_member;
5825 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005826} all_structmembers;
5827
5828typedef struct {
5829 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005830 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005831} test_structmembers;
5832
5833static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5835 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5836 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5837 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5838 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5839 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5840 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5841 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5842 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5843 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5844 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5845 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5846 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005847 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5848 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005849 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005850};
5851
5852
Christian Heimes1af737c2008-01-23 08:24:23 +00005853static PyObject *
5854test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 static char *keywords[] = {
5857 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5858 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5859 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005861 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005862 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 test_structmembers *ob;
5864 const char *s = NULL;
5865 Py_ssize_t string_len = 0;
5866 ob = PyObject_New(test_structmembers, type);
5867 if (ob == NULL)
5868 return NULL;
5869 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5870 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5871 &ob->structmembers.bool_member,
5872 &ob->structmembers.byte_member,
5873 &ob->structmembers.ubyte_member,
5874 &ob->structmembers.short_member,
5875 &ob->structmembers.ushort_member,
5876 &ob->structmembers.int_member,
5877 &ob->structmembers.uint_member,
5878 &ob->structmembers.long_member,
5879 &ob->structmembers.ulong_member,
5880 &ob->structmembers.pyssizet_member,
5881 &ob->structmembers.float_member,
5882 &ob->structmembers.double_member,
5883 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005884 , &ob->structmembers.longlong_member,
5885 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005886 )) {
5887 Py_DECREF(ob);
5888 return NULL;
5889 }
5890 if (s != NULL) {
5891 if (string_len > 5) {
5892 Py_DECREF(ob);
5893 PyErr_SetString(PyExc_ValueError, "string too long");
5894 return NULL;
5895 }
5896 strcpy(ob->structmembers.inplace_member, s);
5897 }
5898 else {
5899 strcpy(ob->structmembers.inplace_member, "");
5900 }
5901 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005902}
5903
Christian Heimes1af737c2008-01-23 08:24:23 +00005904static void
5905test_structmembers_free(PyObject *ob)
5906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005907 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005908}
5909
5910static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005911 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912 "test_structmembersType",
5913 sizeof(test_structmembers), /* tp_basicsize */
5914 0, /* tp_itemsize */
5915 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005916 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005917 0, /* tp_getattr */
5918 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005919 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005920 0, /* tp_repr */
5921 0, /* tp_as_number */
5922 0, /* tp_as_sequence */
5923 0, /* tp_as_mapping */
5924 0, /* tp_hash */
5925 0, /* tp_call */
5926 0, /* tp_str */
5927 PyObject_GenericGetAttr, /* tp_getattro */
5928 PyObject_GenericSetAttr, /* tp_setattro */
5929 0, /* tp_as_buffer */
5930 0, /* tp_flags */
5931 "Type containing all structmember types",
5932 0, /* traverseproc tp_traverse */
5933 0, /* tp_clear */
5934 0, /* tp_richcompare */
5935 0, /* tp_weaklistoffset */
5936 0, /* tp_iter */
5937 0, /* tp_iternext */
5938 0, /* tp_methods */
5939 test_members, /* tp_members */
5940 0,
5941 0,
5942 0,
5943 0,
5944 0,
5945 0,
5946 0,
5947 0,
5948 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005949};
5950
5951
Benjamin Petersond51374e2014-04-09 23:55:56 -04005952typedef struct {
5953 PyObject_HEAD
5954} matmulObject;
5955
5956static PyObject *
5957matmulType_matmul(PyObject *self, PyObject *other)
5958{
5959 return Py_BuildValue("(sOO)", "matmul", self, other);
5960}
5961
5962static PyObject *
5963matmulType_imatmul(PyObject *self, PyObject *other)
5964{
5965 return Py_BuildValue("(sOO)", "imatmul", self, other);
5966}
5967
5968static void
5969matmulType_dealloc(PyObject *self)
5970{
Zachary Ware420dc562014-04-23 13:51:27 -05005971 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005972}
5973
5974static PyNumberMethods matmulType_as_number = {
5975 0, /* nb_add */
5976 0, /* nb_subtract */
5977 0, /* nb_multiply */
5978 0, /* nb_remainde r*/
5979 0, /* nb_divmod */
5980 0, /* nb_power */
5981 0, /* nb_negative */
5982 0, /* tp_positive */
5983 0, /* tp_absolute */
5984 0, /* tp_bool */
5985 0, /* nb_invert */
5986 0, /* nb_lshift */
5987 0, /* nb_rshift */
5988 0, /* nb_and */
5989 0, /* nb_xor */
5990 0, /* nb_or */
5991 0, /* nb_int */
5992 0, /* nb_reserved */
5993 0, /* nb_float */
5994 0, /* nb_inplace_add */
5995 0, /* nb_inplace_subtract */
5996 0, /* nb_inplace_multiply */
5997 0, /* nb_inplace_remainder */
5998 0, /* nb_inplace_power */
5999 0, /* nb_inplace_lshift */
6000 0, /* nb_inplace_rshift */
6001 0, /* nb_inplace_and */
6002 0, /* nb_inplace_xor */
6003 0, /* nb_inplace_or */
6004 0, /* nb_floor_divide */
6005 0, /* nb_true_divide */
6006 0, /* nb_inplace_floor_divide */
6007 0, /* nb_inplace_true_divide */
6008 0, /* nb_index */
6009 matmulType_matmul, /* nb_matrix_multiply */
6010 matmulType_imatmul /* nb_matrix_inplace_multiply */
6011};
6012
6013static PyTypeObject matmulType = {
6014 PyVarObject_HEAD_INIT(NULL, 0)
6015 "matmulType",
6016 sizeof(matmulObject), /* tp_basicsize */
6017 0, /* tp_itemsize */
6018 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006019 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04006020 0, /* tp_getattr */
6021 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006022 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04006023 0, /* tp_repr */
6024 &matmulType_as_number, /* tp_as_number */
6025 0, /* tp_as_sequence */
6026 0, /* tp_as_mapping */
6027 0, /* tp_hash */
6028 0, /* tp_call */
6029 0, /* tp_str */
6030 PyObject_GenericGetAttr, /* tp_getattro */
6031 PyObject_GenericSetAttr, /* tp_setattro */
6032 0, /* tp_as_buffer */
6033 0, /* tp_flags */
6034 "C level type with matrix operations defined",
6035 0, /* traverseproc tp_traverse */
6036 0, /* tp_clear */
6037 0, /* tp_richcompare */
6038 0, /* tp_weaklistoffset */
6039 0, /* tp_iter */
6040 0, /* tp_iternext */
6041 0, /* tp_methods */
6042 0, /* tp_members */
6043 0,
6044 0,
6045 0,
6046 0,
6047 0,
6048 0,
6049 0,
6050 0,
6051 PyType_GenericNew, /* tp_new */
6052 PyObject_Del, /* tp_free */
6053};
6054
Zackery Spytzc7f803b2019-05-31 03:46:36 -06006055typedef struct {
6056 PyObject_HEAD
6057} ipowObject;
6058
6059static PyObject *
6060ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
6061{
6062 return Py_BuildValue("OO", other, mod);
6063}
6064
6065static PyNumberMethods ipowType_as_number = {
6066 .nb_inplace_power = ipowType_ipow
6067};
6068
6069static PyTypeObject ipowType = {
6070 PyVarObject_HEAD_INIT(NULL, 0)
6071 .tp_name = "ipowType",
6072 .tp_basicsize = sizeof(ipowObject),
6073 .tp_as_number = &ipowType_as_number,
6074 .tp_new = PyType_GenericNew
6075};
Martin v. Löwis1a214512008-06-11 05:26:20 +00006076
Yury Selivanov75445082015-05-11 22:57:16 -04006077typedef struct {
6078 PyObject_HEAD
6079 PyObject *ao_iterator;
6080} awaitObject;
6081
6082
6083static PyObject *
6084awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6085{
6086 PyObject *v;
6087 awaitObject *ao;
6088
6089 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
6090 return NULL;
6091
6092 ao = (awaitObject *)type->tp_alloc(type, 0);
6093 if (ao == NULL) {
6094 return NULL;
6095 }
6096
6097 Py_INCREF(v);
6098 ao->ao_iterator = v;
6099
6100 return (PyObject *)ao;
6101}
6102
6103
6104static void
6105awaitObject_dealloc(awaitObject *ao)
6106{
6107 Py_CLEAR(ao->ao_iterator);
6108 Py_TYPE(ao)->tp_free(ao);
6109}
6110
6111
6112static PyObject *
6113awaitObject_await(awaitObject *ao)
6114{
6115 Py_INCREF(ao->ao_iterator);
6116 return ao->ao_iterator;
6117}
6118
6119static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04006120 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04006121 0, /* am_aiter */
6122 0 /* am_anext */
6123};
6124
6125
6126static PyTypeObject awaitType = {
6127 PyVarObject_HEAD_INIT(NULL, 0)
6128 "awaitType",
6129 sizeof(awaitObject), /* tp_basicsize */
6130 0, /* tp_itemsize */
6131 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006132 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04006133 0, /* tp_getattr */
6134 0, /* tp_setattr */
6135 &awaitType_as_async, /* tp_as_async */
6136 0, /* tp_repr */
6137 0, /* tp_as_number */
6138 0, /* tp_as_sequence */
6139 0, /* tp_as_mapping */
6140 0, /* tp_hash */
6141 0, /* tp_call */
6142 0, /* tp_str */
6143 PyObject_GenericGetAttr, /* tp_getattro */
6144 PyObject_GenericSetAttr, /* tp_setattro */
6145 0, /* tp_as_buffer */
6146 0, /* tp_flags */
6147 "C level type with tp_as_async",
6148 0, /* traverseproc tp_traverse */
6149 0, /* tp_clear */
6150 0, /* tp_richcompare */
6151 0, /* tp_weaklistoffset */
6152 0, /* tp_iter */
6153 0, /* tp_iternext */
6154 0, /* tp_methods */
6155 0, /* tp_members */
6156 0,
6157 0,
6158 0,
6159 0,
6160 0,
6161 0,
6162 0,
6163 0,
6164 awaitObject_new, /* tp_new */
6165 PyObject_Del, /* tp_free */
6166};
6167
6168
xdegaye56d1f5c2017-10-26 15:09:06 +02006169static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
6170
6171static PyTypeObject PyRecursingInfinitelyError_Type = {
6172 PyVarObject_HEAD_INIT(NULL, 0)
6173 "RecursingInfinitelyError", /* tp_name */
6174 sizeof(PyBaseExceptionObject), /* tp_basicsize */
6175 0, /* tp_itemsize */
6176 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006177 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02006178 0, /* tp_getattr */
6179 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006180 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02006181 0, /* tp_repr */
6182 0, /* tp_as_number */
6183 0, /* tp_as_sequence */
6184 0, /* tp_as_mapping */
6185 0, /* tp_hash */
6186 0, /* tp_call */
6187 0, /* tp_str */
6188 0, /* tp_getattro */
6189 0, /* tp_setattro */
6190 0, /* tp_as_buffer */
6191 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6192 "Instantiating this exception starts infinite recursion.", /* tp_doc */
6193 0, /* tp_traverse */
6194 0, /* tp_clear */
6195 0, /* tp_richcompare */
6196 0, /* tp_weaklistoffset */
6197 0, /* tp_iter */
6198 0, /* tp_iternext */
6199 0, /* tp_methods */
6200 0, /* tp_members */
6201 0, /* tp_getset */
6202 0, /* tp_base */
6203 0, /* tp_dict */
6204 0, /* tp_descr_get */
6205 0, /* tp_descr_set */
6206 0, /* tp_dictoffset */
6207 (initproc)recurse_infinitely_error_init, /* tp_init */
6208 0, /* tp_alloc */
6209 0, /* tp_new */
6210};
6211
6212static int
6213recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
6214{
6215 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
6216
6217 /* Instantiating this exception starts infinite recursion. */
6218 Py_INCREF(type);
6219 PyErr_SetObject(type, NULL);
6220 return -1;
6221}
6222
6223
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006224/* Test bpo-35983: create a subclass of "list" which checks that instances
6225 * are not deallocated twice */
6226
6227typedef struct {
6228 PyListObject list;
6229 int deallocated;
6230} MyListObject;
6231
6232static PyObject *
6233MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6234{
6235 PyObject* op = PyList_Type.tp_new(type, args, kwds);
6236 ((MyListObject*)op)->deallocated = 0;
6237 return op;
6238}
6239
6240void
6241MyList_dealloc(MyListObject* op)
6242{
6243 if (op->deallocated) {
6244 /* We cannot raise exceptions here but we still want the testsuite
6245 * to fail when we hit this */
6246 Py_FatalError("MyList instance deallocated twice");
6247 }
6248 op->deallocated = 1;
6249 PyList_Type.tp_dealloc((PyObject *)op);
6250}
6251
6252static PyTypeObject MyList_Type = {
6253 PyVarObject_HEAD_INIT(NULL, 0)
6254 "MyList",
6255 sizeof(MyListObject),
6256 0,
6257 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006258 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006259 0, /* tp_getattr */
6260 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006261 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006262 0, /* tp_repr */
6263 0, /* tp_as_number */
6264 0, /* tp_as_sequence */
6265 0, /* tp_as_mapping */
6266 0, /* tp_hash */
6267 0, /* tp_call */
6268 0, /* tp_str */
6269 0, /* tp_getattro */
6270 0, /* tp_setattro */
6271 0, /* tp_as_buffer */
6272 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6273 0, /* tp_doc */
6274 0, /* tp_traverse */
6275 0, /* tp_clear */
6276 0, /* tp_richcompare */
6277 0, /* tp_weaklistoffset */
6278 0, /* tp_iter */
6279 0, /* tp_iternext */
6280 0, /* tp_methods */
6281 0, /* tp_members */
6282 0, /* tp_getset */
6283 0, /* &PyList_Type */ /* tp_base */
6284 0, /* tp_dict */
6285 0, /* tp_descr_get */
6286 0, /* tp_descr_set */
6287 0, /* tp_dictoffset */
6288 0, /* tp_init */
6289 0, /* tp_alloc */
6290 MyList_new, /* tp_new */
6291};
6292
6293
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006294/* Test PEP 560 */
6295
6296typedef struct {
6297 PyObject_HEAD
6298 PyObject *item;
6299} PyGenericAliasObject;
6300
6301static void
6302generic_alias_dealloc(PyGenericAliasObject *self)
6303{
6304 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01006305 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006306}
6307
6308static PyObject *
6309generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
6310{
6311 return PyTuple_Pack(1, self->item);
6312}
6313
6314static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006315 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006316 {NULL} /* sentinel */
6317};
6318
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006319static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006320 PyVarObject_HEAD_INIT(NULL, 0)
6321 "GenericAlias",
6322 sizeof(PyGenericAliasObject),
6323 0,
6324 .tp_dealloc = (destructor)generic_alias_dealloc,
6325 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6326 .tp_methods = generic_alias_methods,
6327};
6328
6329static PyObject *
6330generic_alias_new(PyObject *item)
6331{
6332 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
6333 if (o == NULL) {
6334 return NULL;
6335 }
6336 Py_INCREF(item);
6337 o->item = item;
6338 return (PyObject*) o;
6339}
6340
6341typedef struct {
6342 PyObject_HEAD
6343} PyGenericObject;
6344
6345static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006346generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006347{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006348 return generic_alias_new(item);
6349}
6350
6351static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006352 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006353 {NULL} /* sentinel */
6354};
6355
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006356static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006357 PyVarObject_HEAD_INIT(NULL, 0)
6358 "Generic",
6359 sizeof(PyGenericObject),
6360 0,
6361 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6362 .tp_methods = generic_methods,
6363};
6364
6365
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006366/* Test PEP 590 */
6367
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006368typedef struct {
6369 PyObject_HEAD
6370 vectorcallfunc vectorcall;
6371} MethodDescriptorObject;
6372
6373static PyObject *
6374MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
6375 size_t nargsf, PyObject *kwnames)
6376{
6377 /* True if using the vectorcall function in MethodDescriptorObject
6378 * but False for MethodDescriptor2Object */
6379 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
6380 return PyBool_FromLong(md->vectorcall != NULL);
6381}
6382
6383static PyObject *
6384MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6385{
Petr Viktorine584cbf2019-06-03 01:08:14 +02006386 MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006387 op->vectorcall = MethodDescriptor_vectorcall;
6388 return (PyObject *)op;
6389}
6390
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006391static PyObject *
6392func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6393{
6394 if (obj == Py_None || obj == NULL) {
6395 Py_INCREF(func);
6396 return func;
6397 }
6398 return PyMethod_New(func, obj);
6399}
6400
6401static PyObject *
6402nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6403{
6404 Py_INCREF(func);
6405 return func;
6406}
6407
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006408static PyObject *
6409call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
6410{
6411 Py_INCREF(args);
6412 return args;
6413}
6414
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006415static PyTypeObject MethodDescriptorBase_Type = {
6416 PyVarObject_HEAD_INIT(NULL, 0)
6417 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006418 sizeof(MethodDescriptorObject),
6419 .tp_new = MethodDescriptor_new,
6420 .tp_call = PyVectorcall_Call,
6421 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
6422 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Petr Viktorinffd97532020-02-11 17:46:57 +01006423 Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006424 .tp_descr_get = func_descr_get,
6425};
6426
6427static PyTypeObject MethodDescriptorDerived_Type = {
6428 PyVarObject_HEAD_INIT(NULL, 0)
6429 "MethodDescriptorDerived",
6430 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6431};
6432
6433static PyTypeObject MethodDescriptorNopGet_Type = {
6434 PyVarObject_HEAD_INIT(NULL, 0)
6435 "MethodDescriptorNopGet",
6436 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006437 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006438 .tp_descr_get = nop_descr_get,
6439};
6440
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006441typedef struct {
6442 MethodDescriptorObject base;
6443 vectorcallfunc vectorcall;
6444} MethodDescriptor2Object;
6445
6446static PyObject *
6447MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6448{
6449 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
6450 op->base.vectorcall = NULL;
6451 op->vectorcall = MethodDescriptor_vectorcall;
6452 return (PyObject *)op;
6453}
6454
6455static PyTypeObject MethodDescriptor2_Type = {
6456 PyVarObject_HEAD_INIT(NULL, 0)
6457 "MethodDescriptor2",
6458 sizeof(MethodDescriptor2Object),
6459 .tp_new = MethodDescriptor2_new,
6460 .tp_call = PyVectorcall_Call,
6461 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
Petr Viktorinffd97532020-02-11 17:46:57 +01006462 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006463};
6464
Benjamin Peterson39403332020-09-02 11:29:06 -05006465PyDoc_STRVAR(heapdocctype__doc__,
6466"HeapDocCType(arg1, arg2)\n"
6467"--\n"
6468"\n"
6469"somedoc");
6470
6471typedef struct {
6472 PyObject_HEAD
6473} HeapDocCTypeObject;
6474
6475static PyType_Slot HeapDocCType_slots[] = {
6476 {Py_tp_doc, (char*)heapdocctype__doc__},
6477 {0},
6478};
6479
6480static PyType_Spec HeapDocCType_spec = {
6481 "_testcapi.HeapDocCType",
6482 sizeof(HeapDocCTypeObject),
6483 0,
6484 Py_TPFLAGS_DEFAULT,
6485 HeapDocCType_slots
6486};
6487
6488
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006489PyDoc_STRVAR(heapgctype__doc__,
6490"A heap type with GC, and with overridden dealloc.\n\n"
6491"The 'value' attribute is set to 10 in __init__.");
6492
6493typedef struct {
6494 PyObject_HEAD
6495 int value;
6496} HeapCTypeObject;
6497
6498static struct PyMemberDef heapctype_members[] = {
6499 {"value", T_INT, offsetof(HeapCTypeObject, value)},
6500 {NULL} /* Sentinel */
6501};
6502
6503static int
6504heapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
6505{
6506 ((HeapCTypeObject *)self)->value = 10;
6507 return 0;
6508}
6509
6510static void
6511heapgcctype_dealloc(HeapCTypeObject *self)
6512{
6513 PyTypeObject *tp = Py_TYPE(self);
6514 PyObject_GC_UnTrack(self);
6515 PyObject_GC_Del(self);
6516 Py_DECREF(tp);
6517}
6518
6519static PyType_Slot HeapGcCType_slots[] = {
6520 {Py_tp_init, heapctype_init},
6521 {Py_tp_members, heapctype_members},
6522 {Py_tp_dealloc, heapgcctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006523 {Py_tp_doc, (char*)heapgctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006524 {0, 0},
6525};
6526
6527static PyType_Spec HeapGcCType_spec = {
6528 "_testcapi.HeapGcCType",
6529 sizeof(HeapCTypeObject),
6530 0,
6531 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6532 HeapGcCType_slots
6533};
6534
6535PyDoc_STRVAR(heapctype__doc__,
6536"A heap type without GC, but with overridden dealloc.\n\n"
6537"The 'value' attribute is set to 10 in __init__.");
6538
6539static void
6540heapctype_dealloc(HeapCTypeObject *self)
6541{
6542 PyTypeObject *tp = Py_TYPE(self);
6543 PyObject_Del(self);
6544 Py_DECREF(tp);
6545}
6546
6547static PyType_Slot HeapCType_slots[] = {
6548 {Py_tp_init, heapctype_init},
6549 {Py_tp_members, heapctype_members},
6550 {Py_tp_dealloc, heapctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006551 {Py_tp_doc, (char*)heapctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006552 {0, 0},
6553};
6554
6555static PyType_Spec HeapCType_spec = {
6556 "_testcapi.HeapCType",
6557 sizeof(HeapCTypeObject),
6558 0,
6559 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6560 HeapCType_slots
6561};
6562
6563PyDoc_STRVAR(heapctypesubclass__doc__,
6564"Subclass of HeapCType, without GC.\n\n"
6565"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6566
6567typedef struct {
6568 HeapCTypeObject base;
6569 int value2;
6570} HeapCTypeSubclassObject;
6571
6572static int
6573heapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
6574{
6575 /* Call __init__ of the superclass */
6576 if (heapctype_init(self, args, kwargs) < 0) {
6577 return -1;
6578 }
6579 /* Initialize additional element */
6580 ((HeapCTypeSubclassObject *)self)->value2 = 20;
6581 return 0;
6582}
6583
6584static struct PyMemberDef heapctypesubclass_members[] = {
6585 {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
6586 {NULL} /* Sentinel */
6587};
6588
6589static PyType_Slot HeapCTypeSubclass_slots[] = {
6590 {Py_tp_init, heapctypesubclass_init},
6591 {Py_tp_members, heapctypesubclass_members},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006592 {Py_tp_doc, (char*)heapctypesubclass__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006593 {0, 0},
6594};
6595
6596static PyType_Spec HeapCTypeSubclass_spec = {
6597 "_testcapi.HeapCTypeSubclass",
6598 sizeof(HeapCTypeSubclassObject),
6599 0,
6600 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6601 HeapCTypeSubclass_slots
6602};
6603
scoderf7c4e232020-06-06 21:35:10 +02006604PyDoc_STRVAR(heapctypewithbuffer__doc__,
6605"Heap type with buffer support.\n\n"
6606"The buffer is set to [b'1', b'2', b'3', b'4']");
6607
6608typedef struct {
6609 HeapCTypeObject base;
6610 char buffer[4];
6611} HeapCTypeWithBufferObject;
6612
6613static int
6614heapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags)
6615{
6616 self->buffer[0] = '1';
6617 self->buffer[1] = '2';
6618 self->buffer[2] = '3';
6619 self->buffer[3] = '4';
6620 return PyBuffer_FillInfo(
6621 view, (PyObject*)self, (void *)self->buffer, 4, 1, flags);
6622}
6623
Rémi Lapeyreb8867e52020-06-07 09:05:33 +02006624static void
scoderf7c4e232020-06-06 21:35:10 +02006625heapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view)
6626{
6627 assert(view->obj == (void*) self);
6628}
6629
6630static PyType_Slot HeapCTypeWithBuffer_slots[] = {
6631 {Py_bf_getbuffer, heapctypewithbuffer_getbuffer},
6632 {Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer},
6633 {Py_tp_doc, (char*)heapctypewithbuffer__doc__},
6634 {0, 0},
6635};
6636
6637static PyType_Spec HeapCTypeWithBuffer_spec = {
6638 "_testcapi.HeapCTypeWithBuffer",
6639 sizeof(HeapCTypeWithBufferObject),
6640 0,
6641 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6642 HeapCTypeWithBuffer_slots
6643};
6644
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006645PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
6646"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
6647"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
6648"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6649
6650static int
6651heapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
6652{
6653 PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
6654 initproc base_init = PyType_GetSlot(base, Py_tp_init);
6655 base_init(self, args, kwargs);
6656 return 0;
6657}
6658
6659static void
6660heapctypesubclasswithfinalizer_finalize(PyObject *self)
6661{
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006662 PyObject *error_type, *error_value, *error_traceback, *m;
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006663 PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006664
6665 /* Save the current exception, if any. */
6666 PyErr_Fetch(&error_type, &error_value, &error_traceback);
6667
6668 m = PyState_FindModule(&_testcapimodule);
6669 if (m == NULL) {
6670 goto cleanup_finalize;
6671 }
6672 oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
6673 newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
6674 if (oldtype == NULL || newtype == NULL) {
6675 goto cleanup_finalize;
6676 }
6677
6678 if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
6679 goto cleanup_finalize;
6680 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006681 refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
6682 if (refcnt == NULL) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006683 goto cleanup_finalize;
6684 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006685 if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
6686 goto cleanup_finalize;
6687 }
6688 Py_DECREF(refcnt);
6689 refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
6690 if (refcnt == NULL) {
6691 goto cleanup_finalize;
6692 }
6693 if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006694 goto cleanup_finalize;
6695 }
6696
6697cleanup_finalize:
6698 Py_XDECREF(oldtype);
6699 Py_XDECREF(newtype);
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006700 Py_XDECREF(refcnt);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006701
6702 /* Restore the saved exception. */
6703 PyErr_Restore(error_type, error_value, error_traceback);
6704}
6705
6706static PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
6707 {Py_tp_init, heapctypesubclasswithfinalizer_init},
6708 {Py_tp_members, heapctypesubclass_members},
6709 {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006710 {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006711 {0, 0},
6712};
6713
6714static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
6715 "_testcapi.HeapCTypeSubclassWithFinalizer",
6716 sizeof(HeapCTypeSubclassObject),
6717 0,
6718 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
6719 HeapCTypeSubclassWithFinalizer_slots
6720};
6721
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006722typedef struct {
6723 PyObject_HEAD
6724 PyObject *dict;
6725} HeapCTypeWithDictObject;
6726
6727static void
6728heapctypewithdict_dealloc(HeapCTypeWithDictObject* self)
6729{
6730
6731 PyTypeObject *tp = Py_TYPE(self);
6732 Py_XDECREF(self->dict);
6733 PyObject_DEL(self);
6734 Py_DECREF(tp);
6735}
6736
6737static PyGetSetDef heapctypewithdict_getsetlist[] = {
6738 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
6739 {NULL} /* Sentinel */
6740};
6741
6742static struct PyMemberDef heapctypewithdict_members[] = {
6743 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
6744 {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY},
6745 {NULL} /* Sentinel */
6746};
6747
6748static PyType_Slot HeapCTypeWithDict_slots[] = {
6749 {Py_tp_members, heapctypewithdict_members},
6750 {Py_tp_getset, heapctypewithdict_getsetlist},
6751 {Py_tp_dealloc, heapctypewithdict_dealloc},
6752 {0, 0},
6753};
6754
6755static PyType_Spec HeapCTypeWithDict_spec = {
6756 "_testcapi.HeapCTypeWithDict",
6757 sizeof(HeapCTypeWithDictObject),
6758 0,
6759 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6760 HeapCTypeWithDict_slots
6761};
6762
6763static struct PyMemberDef heapctypewithnegativedict_members[] = {
6764 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
Victor Stinneraca8c402019-09-30 21:14:26 +02006765 {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006766 {NULL} /* Sentinel */
6767};
6768
6769static PyType_Slot HeapCTypeWithNegativeDict_slots[] = {
6770 {Py_tp_members, heapctypewithnegativedict_members},
6771 {Py_tp_getset, heapctypewithdict_getsetlist},
6772 {Py_tp_dealloc, heapctypewithdict_dealloc},
6773 {0, 0},
6774};
6775
6776static PyType_Spec HeapCTypeWithNegativeDict_spec = {
6777 "_testcapi.HeapCTypeWithNegativeDict",
6778 sizeof(HeapCTypeWithDictObject),
6779 0,
6780 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6781 HeapCTypeWithNegativeDict_slots
6782};
6783
6784typedef struct {
6785 PyObject_HEAD
6786 PyObject *weakreflist;
6787} HeapCTypeWithWeakrefObject;
6788
6789static struct PyMemberDef heapctypewithweakref_members[] = {
6790 {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)},
6791 {"__weaklistoffset__", T_PYSSIZET,
6792 offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY},
6793 {NULL} /* Sentinel */
6794};
6795
6796static void
6797heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self)
6798{
6799
6800 PyTypeObject *tp = Py_TYPE(self);
6801 if (self->weakreflist != NULL)
6802 PyObject_ClearWeakRefs((PyObject *) self);
6803 Py_XDECREF(self->weakreflist);
6804 PyObject_DEL(self);
6805 Py_DECREF(tp);
6806}
6807
6808static PyType_Slot HeapCTypeWithWeakref_slots[] = {
6809 {Py_tp_members, heapctypewithweakref_members},
6810 {Py_tp_dealloc, heapctypewithweakref_dealloc},
6811 {0, 0},
6812};
6813
6814static PyType_Spec HeapCTypeWithWeakref_spec = {
6815 "_testcapi.HeapCTypeWithWeakref",
6816 sizeof(HeapCTypeWithWeakrefObject),
6817 0,
6818 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6819 HeapCTypeWithWeakref_slots
6820};
6821
scoder148f3292020-07-03 02:09:28 +02006822PyDoc_STRVAR(heapctypesetattr__doc__,
6823"A heap type without GC, but with overridden __setattr__.\n\n"
6824"The 'value' attribute is set to 10 in __init__ and updated via attribute setting.");
6825
6826typedef struct {
6827 PyObject_HEAD
6828 long value;
6829} HeapCTypeSetattrObject;
6830
6831static struct PyMemberDef heapctypesetattr_members[] = {
6832 {"pvalue", T_LONG, offsetof(HeapCTypeSetattrObject, value)},
6833 {NULL} /* Sentinel */
6834};
6835
6836static int
6837heapctypesetattr_init(PyObject *self, PyObject *args, PyObject *kwargs)
6838{
6839 ((HeapCTypeSetattrObject *)self)->value = 10;
6840 return 0;
6841}
6842
6843static void
6844heapctypesetattr_dealloc(HeapCTypeSetattrObject *self)
6845{
6846 PyTypeObject *tp = Py_TYPE(self);
6847 PyObject_Del(self);
6848 Py_DECREF(tp);
6849}
6850
6851static int
6852heapctypesetattr_setattro(HeapCTypeSetattrObject *self, PyObject *attr, PyObject *value)
6853{
6854 PyObject *svalue = PyUnicode_FromString("value");
6855 if (svalue == NULL)
6856 return -1;
6857 int eq = PyObject_RichCompareBool(svalue, attr, Py_EQ);
6858 Py_DECREF(svalue);
6859 if (eq < 0)
6860 return -1;
6861 if (!eq) {
6862 return PyObject_GenericSetAttr((PyObject*) self, attr, value);
6863 }
6864 if (value == NULL) {
6865 self->value = 0;
6866 return 0;
6867 }
6868 PyObject *ivalue = PyNumber_Long(value);
6869 if (ivalue == NULL)
6870 return -1;
6871 long v = PyLong_AsLong(ivalue);
6872 Py_DECREF(ivalue);
6873 if (v == -1 && PyErr_Occurred())
6874 return -1;
6875 self->value = v;
6876 return 0;
6877}
6878
6879static PyType_Slot HeapCTypeSetattr_slots[] = {
6880 {Py_tp_init, heapctypesetattr_init},
6881 {Py_tp_members, heapctypesetattr_members},
6882 {Py_tp_setattro, heapctypesetattr_setattro},
6883 {Py_tp_dealloc, heapctypesetattr_dealloc},
6884 {Py_tp_doc, (char*)heapctypesetattr__doc__},
6885 {0, 0},
6886};
6887
6888static PyType_Spec HeapCTypeSetattr_spec = {
6889 "_testcapi.HeapCTypeSetattr",
6890 sizeof(HeapCTypeSetattrObject),
6891 0,
6892 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6893 HeapCTypeSetattr_slots
6894};
6895
Petr Viktorinf9583772019-09-10 12:21:09 +01006896static PyMethodDef meth_instance_methods[] = {
6897 {"meth_varargs", meth_varargs, METH_VARARGS},
6898 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
6899 {"meth_o", meth_o, METH_O},
6900 {"meth_noargs", meth_noargs, METH_NOARGS},
6901 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
6902 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
6903 {NULL, NULL} /* sentinel */
6904};
6905
6906
6907static PyTypeObject MethInstance_Type = {
6908 PyVarObject_HEAD_INIT(NULL, 0)
6909 "MethInstance",
6910 sizeof(PyObject),
6911 .tp_new = PyType_GenericNew,
6912 .tp_flags = Py_TPFLAGS_DEFAULT,
6913 .tp_methods = meth_instance_methods,
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006914 .tp_doc = (char*)PyDoc_STR(
Petr Viktorinf9583772019-09-10 12:21:09 +01006915 "Class with normal (instance) methods to test calling conventions"),
6916};
6917
6918static PyMethodDef meth_class_methods[] = {
6919 {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS},
6920 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS},
6921 {"meth_o", meth_o, METH_O|METH_CLASS},
6922 {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS},
6923 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS},
6924 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS},
6925 {NULL, NULL} /* sentinel */
6926};
6927
6928
6929static PyTypeObject MethClass_Type = {
6930 PyVarObject_HEAD_INIT(NULL, 0)
6931 "MethClass",
6932 sizeof(PyObject),
6933 .tp_new = PyType_GenericNew,
6934 .tp_flags = Py_TPFLAGS_DEFAULT,
6935 .tp_methods = meth_class_methods,
6936 .tp_doc = PyDoc_STR(
6937 "Class with class methods to test calling conventions"),
6938};
6939
6940static PyMethodDef meth_static_methods[] = {
6941 {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC},
6942 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC},
6943 {"meth_o", meth_o, METH_O|METH_STATIC},
6944 {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC},
6945 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC},
6946 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC},
6947 {NULL, NULL} /* sentinel */
6948};
6949
6950
6951static PyTypeObject MethStatic_Type = {
6952 PyVarObject_HEAD_INIT(NULL, 0)
6953 "MethStatic",
6954 sizeof(PyObject),
6955 .tp_new = PyType_GenericNew,
6956 .tp_flags = Py_TPFLAGS_DEFAULT,
6957 .tp_methods = meth_static_methods,
6958 .tp_doc = PyDoc_STR(
6959 "Class with static methods to test calling conventions"),
6960};
6961
Neil Schemenauer392a13b2019-10-15 20:56:48 -07006962/* ContainerNoGC -- a simple container without GC methods */
6963
6964typedef struct {
6965 PyObject_HEAD
6966 PyObject *value;
6967} ContainerNoGCobject;
6968
6969static PyObject *
6970ContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
6971{
6972 PyObject *value;
6973 char *names[] = {"value", NULL};
6974 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) {
6975 return NULL;
6976 }
6977 PyObject *self = type->tp_alloc(type, 0);
6978 if (self == NULL) {
6979 return NULL;
6980 }
6981 Py_INCREF(value);
6982 ((ContainerNoGCobject *)self)->value = value;
6983 return self;
6984}
6985
6986static void
6987ContainerNoGC_dealloc(ContainerNoGCobject *self)
6988{
6989 Py_DECREF(self->value);
6990 Py_TYPE(self)->tp_free((PyObject *)self);
6991}
6992
6993static PyMemberDef ContainerNoGC_members[] = {
6994 {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY,
6995 PyDoc_STR("a container value for test purposes")},
6996 {0}
6997};
6998
6999static PyTypeObject ContainerNoGC_type = {
7000 PyVarObject_HEAD_INIT(NULL, 0)
7001 "_testcapi.ContainerNoGC",
7002 sizeof(ContainerNoGCobject),
7003 .tp_dealloc = (destructor)ContainerNoGC_dealloc,
7004 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7005 .tp_members = ContainerNoGC_members,
7006 .tp_new = ContainerNoGC_new,
7007};
7008
Jeroen Demeyereb65e242019-05-28 14:42:53 +02007009
Martin v. Löwis1a214512008-06-11 05:26:20 +00007010static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007011 PyModuleDef_HEAD_INIT,
7012 "_testcapi",
7013 NULL,
7014 -1,
7015 TestMethods,
7016 NULL,
7017 NULL,
7018 NULL,
7019 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007020};
7021
Nick Coghland5cacbb2015-05-23 22:24:10 +10007022/* Per PEP 489, this module will not be converted to multi-phase initialization
7023 */
7024
Mark Hammond62b1ab12002-07-23 06:31:15 +00007025PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007026PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00007027{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007028 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007030 m = PyModule_Create(&_testcapimodule);
7031 if (m == NULL)
7032 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007033
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007034 Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type);
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00007035
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007036 Py_SET_TYPE(&test_structmembersType, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007037 Py_INCREF(&test_structmembersType);
7038 /* don't use a name starting with "test", since we don't want
7039 test_capi to automatically call this */
7040 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04007041 if (PyType_Ready(&matmulType) < 0)
7042 return NULL;
7043 Py_INCREF(&matmulType);
7044 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06007045 if (PyType_Ready(&ipowType) < 0) {
7046 return NULL;
7047 }
7048 Py_INCREF(&ipowType);
7049 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00007050
Yury Selivanov75445082015-05-11 22:57:16 -04007051 if (PyType_Ready(&awaitType) < 0)
7052 return NULL;
7053 Py_INCREF(&awaitType);
7054 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
7055
Jeroen Demeyer351c6742019-05-10 19:21:11 +02007056 MyList_Type.tp_base = &PyList_Type;
7057 if (PyType_Ready(&MyList_Type) < 0)
7058 return NULL;
7059 Py_INCREF(&MyList_Type);
7060 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
7061
Jeroen Demeyereb65e242019-05-28 14:42:53 +02007062 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
7063 return NULL;
7064 Py_INCREF(&MethodDescriptorBase_Type);
7065 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
7066
7067 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
7068 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
7069 return NULL;
7070 Py_INCREF(&MethodDescriptorDerived_Type);
7071 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
7072
7073 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
7074 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
7075 return NULL;
7076 Py_INCREF(&MethodDescriptorNopGet_Type);
7077 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
7078
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02007079 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
7080 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
7081 return NULL;
7082 Py_INCREF(&MethodDescriptor2_Type);
7083 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
7084
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02007085 if (PyType_Ready(&GenericAlias_Type) < 0)
7086 return NULL;
7087 Py_INCREF(&GenericAlias_Type);
7088 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
7089
7090 if (PyType_Ready(&Generic_Type) < 0)
7091 return NULL;
7092 Py_INCREF(&Generic_Type);
7093 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
7094
Petr Viktorinf9583772019-09-10 12:21:09 +01007095 if (PyType_Ready(&MethInstance_Type) < 0)
7096 return NULL;
7097 Py_INCREF(&MethInstance_Type);
7098 PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type);
7099
7100 if (PyType_Ready(&MethClass_Type) < 0)
7101 return NULL;
7102 Py_INCREF(&MethClass_Type);
7103 PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type);
7104
7105 if (PyType_Ready(&MethStatic_Type) < 0)
7106 return NULL;
7107 Py_INCREF(&MethStatic_Type);
7108 PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type);
7109
xdegaye56d1f5c2017-10-26 15:09:06 +02007110 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
7111 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
7112 return NULL;
7113 }
7114 Py_INCREF(&PyRecursingInfinitelyError_Type);
7115 PyModule_AddObject(m, "RecursingInfinitelyError",
7116 (PyObject *)&PyRecursingInfinitelyError_Type);
7117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007118 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
7119 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
7120 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
7121 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
7122 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
7123 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
7124 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
7125 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
7126 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
7127 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
7128 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
7129 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
7130 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
7131 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
7132 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
7133 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05007134 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX));
7135 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN));
7136 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007137 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
7138 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
Victor Stinner4237d342015-09-10 10:10:39 +02007139 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007140 Py_INCREF(&PyInstanceMethod_Type);
7141 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00007142
Larry Hastings2a727912014-01-16 11:32:01 -08007143 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner310e2d22019-11-22 10:58:00 +01007144 PyObject *v;
Victor Stinner5d39e042017-11-29 17:20:38 +01007145#ifdef WITH_PYMALLOC
Victor Stinner310e2d22019-11-22 10:58:00 +01007146 v = Py_True;
Victor Stinner5d39e042017-11-29 17:20:38 +01007147#else
Victor Stinner310e2d22019-11-22 10:58:00 +01007148 v = Py_False;
Victor Stinner5d39e042017-11-29 17:20:38 +01007149#endif
Victor Stinner310e2d22019-11-22 10:58:00 +01007150 Py_INCREF(v);
7151 PyModule_AddObject(m, "WITH_PYMALLOC", v);
Larry Hastings2a727912014-01-16 11:32:01 -08007152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007153 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
7154 Py_INCREF(TestError);
7155 PyModule_AddObject(m, "error", TestError);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007156
Benjamin Peterson39403332020-09-02 11:29:06 -05007157 PyObject *HeapDocCType = PyType_FromSpec(&HeapDocCType_spec);
7158 if (HeapDocCType == NULL) {
7159 return NULL;
7160 }
7161 PyModule_AddObject(m, "HeapDocCType", HeapDocCType);
7162
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007163 PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
7164 if (HeapGcCType == NULL) {
7165 return NULL;
7166 }
7167 PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
7168
7169 PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
7170 if (HeapCType == NULL) {
7171 return NULL;
7172 }
7173 PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
7174 if (subclass_bases == NULL) {
7175 return NULL;
7176 }
7177 PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
7178 if (HeapCTypeSubclass == NULL) {
7179 return NULL;
7180 }
7181 Py_DECREF(subclass_bases);
7182 PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
7183
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07007184 PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec);
7185 if (HeapCTypeWithDict == NULL) {
7186 return NULL;
7187 }
7188 PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict);
7189
7190 PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
7191 if (HeapCTypeWithNegativeDict == NULL) {
7192 return NULL;
7193 }
7194 PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict);
7195
7196 PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec);
7197 if (HeapCTypeWithWeakref == NULL) {
7198 return NULL;
7199 }
7200 PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref);
7201
scoderf7c4e232020-06-06 21:35:10 +02007202 PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec);
7203 if (HeapCTypeWithBuffer == NULL) {
7204 return NULL;
7205 }
7206 PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer);
7207
scoder148f3292020-07-03 02:09:28 +02007208 PyObject *HeapCTypeSetattr = PyType_FromSpec(&HeapCTypeSetattr_spec);
7209 if (HeapCTypeSetattr == NULL) {
7210 return NULL;
7211 }
7212 PyModule_AddObject(m, "HeapCTypeSetattr", HeapCTypeSetattr);
7213
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007214 PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
7215 if (subclass_with_finalizer_bases == NULL) {
7216 return NULL;
7217 }
7218 PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
7219 &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
7220 if (HeapCTypeSubclassWithFinalizer == NULL) {
7221 return NULL;
7222 }
7223 Py_DECREF(subclass_with_finalizer_bases);
7224 PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
7225
Neil Schemenauer392a13b2019-10-15 20:56:48 -07007226 if (PyType_Ready(&ContainerNoGC_type) < 0) {
7227 return NULL;
7228 }
7229 Py_INCREF(&ContainerNoGC_type);
7230 if (PyModule_AddObject(m, "ContainerNoGC",
7231 (PyObject *) &ContainerNoGC_type) < 0)
7232 return NULL;
7233
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007234 PyState_AddModule(m, &_testcapimodule);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007236}
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007237
7238
7239/* Test the C API exposed when PY_SSIZE_T_CLEAN is not defined */
7240
7241#undef Py_BuildValue
7242PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
7243
7244static PyObject *
7245test_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
7246{
7247 PyObject *res;
7248 const char str[] = "string";
7249 const Py_UNICODE unicode[] = L"unicode";
Victor Stinner37bb2892020-06-19 11:45:31 +02007250 assert(!PyErr_Occurred());
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007251
7252 res = Py_BuildValue("(s#O)", str, 1, Py_None);
7253 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007254 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007255 return NULL;
7256 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007257 PyErr_Clear();
7258
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007259 res = Py_BuildValue("(z#O)", str, 1, Py_None);
7260 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007261 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007262 return NULL;
7263 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007264 PyErr_Clear();
7265
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007266 res = Py_BuildValue("(y#O)", str, 1, Py_None);
7267 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007268 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007269 return NULL;
7270 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007271 PyErr_Clear();
7272
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007273 res = Py_BuildValue("(u#O)", unicode, 1, Py_None);
7274 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007275 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007276 return NULL;
7277 }
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007278 PyErr_Clear();
Victor Stinner37bb2892020-06-19 11:45:31 +02007279
7280
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007281 Py_RETURN_NONE;
7282}