blob: 0e098779696b737dacc27615f23c6a0020347978 [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);
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002680 PyObject *tzinfo = PyDateTime_DATE_GET_TZINFO(obj);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002681
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002682 return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002683}
2684
2685static PyObject *
2686test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
2687{
2688 int hour, minute, second, microsecond;
2689
2690 hour = PyDateTime_TIME_GET_HOUR(obj);
2691 minute = PyDateTime_TIME_GET_MINUTE(obj);
2692 second = PyDateTime_TIME_GET_SECOND(obj);
2693 microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002694 PyObject *tzinfo = PyDateTime_TIME_GET_TZINFO(obj);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002695
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002696 return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002697}
2698
2699static PyObject *
2700test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
2701{
2702 int days, seconds, microseconds;
2703
2704 days = PyDateTime_DELTA_GET_DAYS(obj);
2705 seconds = PyDateTime_DELTA_GET_SECONDS(obj);
2706 microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
2707
2708 return Py_BuildValue("(lll)", days, seconds, microseconds);
2709}
Benjamin Peterson16323982010-02-03 01:13:41 +00002710
Stefan Krah39042e02020-08-10 16:32:21 +02002711/* Test decimal API */
2712static int decimal_initialized = 0;
2713static PyObject *
2714decimal_is_special(PyObject *module, PyObject *dec)
2715{
2716 int is_special;
2717
2718 (void)module;
2719 if (!decimal_initialized) {
2720 if (import_decimal() < 0) {
2721 return NULL;
2722 }
2723
2724 decimal_initialized = 1;
2725 }
2726
2727 is_special = PyDec_IsSpecial(dec);
2728 if (is_special < 0) {
2729 return NULL;
2730 }
2731
2732 return PyBool_FromLong(is_special);
2733}
2734
2735static PyObject *
2736decimal_is_nan(PyObject *module, PyObject *dec)
2737{
2738 int is_nan;
2739
2740 (void)module;
2741 if (!decimal_initialized) {
2742 if (import_decimal() < 0) {
2743 return NULL;
2744 }
2745
2746 decimal_initialized = 1;
2747 }
2748
2749 is_nan = PyDec_IsNaN(dec);
2750 if (is_nan < 0) {
2751 return NULL;
2752 }
2753
2754 return PyBool_FromLong(is_nan);
2755}
2756
2757static PyObject *
2758decimal_is_infinite(PyObject *module, PyObject *dec)
2759{
2760 int is_infinite;
2761
2762 (void)module;
2763 if (!decimal_initialized) {
2764 if (import_decimal() < 0) {
2765 return NULL;
2766 }
2767
2768 decimal_initialized = 1;
2769 }
2770
2771 is_infinite = PyDec_IsInfinite(dec);
2772 if (is_infinite < 0) {
2773 return NULL;
2774 }
2775
2776 return PyBool_FromLong(is_infinite);
2777}
2778
2779static PyObject *
2780decimal_get_digits(PyObject *module, PyObject *dec)
2781{
2782 int64_t digits;
2783
2784 (void)module;
2785 if (!decimal_initialized) {
2786 if (import_decimal() < 0) {
2787 return NULL;
2788 }
2789
2790 decimal_initialized = 1;
2791 }
2792
2793 digits = PyDec_GetDigits(dec);
2794 if (digits < 0) {
2795 return NULL;
2796 }
2797
2798 return PyLong_FromLongLong(digits);
2799}
2800
2801static PyObject *
2802decimal_as_triple(PyObject *module, PyObject *dec)
2803{
2804 PyObject *tuple = NULL;
2805 PyObject *sign, *hi, *lo;
2806 mpd_uint128_triple_t triple;
2807
2808 (void)module;
2809 if (!decimal_initialized) {
2810 if (import_decimal() < 0) {
2811 return NULL;
2812 }
2813
2814 decimal_initialized = 1;
2815 }
2816
2817 triple = PyDec_AsUint128Triple(dec);
2818 if (triple.tag == MPD_TRIPLE_ERROR && PyErr_Occurred()) {
2819 return NULL;
2820 }
2821
2822 sign = PyLong_FromUnsignedLong(triple.sign);
2823 if (sign == NULL) {
2824 return NULL;
2825 }
2826
2827 hi = PyLong_FromUnsignedLongLong(triple.hi);
2828 if (hi == NULL) {
2829 Py_DECREF(sign);
2830 return NULL;
2831 }
2832
2833 lo = PyLong_FromUnsignedLongLong(triple.lo);
2834 if (lo == NULL) {
2835 Py_DECREF(hi);
2836 Py_DECREF(sign);
2837 return NULL;
2838 }
2839
2840 switch (triple.tag) {
2841 case MPD_TRIPLE_QNAN:
2842 assert(triple.exp == 0);
2843 tuple = Py_BuildValue("(OOOs)", sign, hi, lo, "n");
2844 break;
2845
2846 case MPD_TRIPLE_SNAN:
2847 assert(triple.exp == 0);
2848 tuple = Py_BuildValue("(OOOs)", sign, hi, lo, "N");
2849 break;
2850
2851 case MPD_TRIPLE_INF:
2852 assert(triple.hi == 0);
2853 assert(triple.lo == 0);
2854 assert(triple.exp == 0);
2855 tuple = Py_BuildValue("(OOOs)", sign, hi, lo, "F");
2856 break;
2857
2858 case MPD_TRIPLE_NORMAL:
2859 tuple = Py_BuildValue("(OOOL)", sign, hi, lo, triple.exp);
2860 break;
2861
2862 case MPD_TRIPLE_ERROR:
2863 PyErr_SetString(PyExc_ValueError,
2864 "value out of bounds for a uint128 triple");
2865 break;
2866
2867 default:
2868 PyErr_SetString(PyExc_RuntimeError,
2869 "decimal_as_triple: internal error: unexpected tag");
2870 break;
2871 }
2872
2873 Py_DECREF(lo);
2874 Py_DECREF(hi);
2875 Py_DECREF(sign);
2876
2877 return tuple;
2878}
2879
2880static PyObject *
2881decimal_from_triple(PyObject *module, PyObject *tuple)
2882{
2883 mpd_uint128_triple_t triple = { MPD_TRIPLE_ERROR, 0, 0, 0, 0 };
2884 PyObject *exp;
2885 unsigned long sign;
2886
2887 (void)module;
2888 if (!decimal_initialized) {
2889 if (import_decimal() < 0) {
2890 return NULL;
2891 }
2892
2893 decimal_initialized = 1;
2894 }
2895
2896 if (!PyTuple_Check(tuple)) {
2897 PyErr_SetString(PyExc_TypeError, "argument must be a tuple");
2898 return NULL;
2899 }
2900
2901 if (PyTuple_GET_SIZE(tuple) != 4) {
2902 PyErr_SetString(PyExc_ValueError, "tuple size must be 4");
2903 return NULL;
2904 }
2905
2906 sign = PyLong_AsUnsignedLong(PyTuple_GET_ITEM(tuple, 0));
2907 if (sign == (unsigned long)-1 && PyErr_Occurred()) {
2908 return NULL;
2909 }
2910 if (sign > UINT8_MAX) {
2911 PyErr_SetString(PyExc_ValueError, "sign must be 0 or 1");
2912 return NULL;
2913 }
2914 triple.sign = (uint8_t)sign;
2915
2916 triple.hi = PyLong_AsUnsignedLongLong(PyTuple_GET_ITEM(tuple, 1));
2917 if (triple.hi == (unsigned long long)-1 && PyErr_Occurred()) {
2918 return NULL;
2919 }
2920
2921 triple.lo = PyLong_AsUnsignedLongLong(PyTuple_GET_ITEM(tuple, 2));
2922 if (triple.lo == (unsigned long long)-1 && PyErr_Occurred()) {
2923 return NULL;
2924 }
2925
2926 exp = PyTuple_GET_ITEM(tuple, 3);
2927 if (PyLong_Check(exp)) {
2928 triple.tag = MPD_TRIPLE_NORMAL;
2929 triple.exp = PyLong_AsLongLong(exp);
2930 if (triple.exp == -1 && PyErr_Occurred()) {
2931 return NULL;
2932 }
2933 }
2934 else if (PyUnicode_Check(exp)) {
2935 if (PyUnicode_CompareWithASCIIString(exp, "F") == 0) {
2936 triple.tag = MPD_TRIPLE_INF;
2937 }
2938 else if (PyUnicode_CompareWithASCIIString(exp, "n") == 0) {
2939 triple.tag = MPD_TRIPLE_QNAN;
2940 }
2941 else if (PyUnicode_CompareWithASCIIString(exp, "N") == 0) {
2942 triple.tag = MPD_TRIPLE_SNAN;
2943 }
2944 else {
2945 PyErr_SetString(PyExc_ValueError, "not a valid exponent");
2946 return NULL;
2947 }
2948 }
2949 else {
2950 PyErr_SetString(PyExc_TypeError, "exponent must be int or string");
2951 return NULL;
2952 }
2953
2954 return PyDec_FromUint128Triple(&triple);
2955}
2956
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002957/* test_thread_state spawns a thread of its own, and that thread releases
2958 * `thread_done` when it's finished. The driver code has to know when the
2959 * thread finishes, because the thread uses a PyObject (the callable) that
2960 * may go away when the driver finishes. The former lack of this explicit
2961 * synchronization caused rare segfaults, so rare that they were seen only
2962 * on a Mac buildbot (although they were possible on any box).
2963 */
2964static PyThread_type_lock thread_done = NULL;
2965
Benjamin Petersona786b022008-08-25 21:05:21 +00002966static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002967_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002968{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 PyObject *rc;
2970 int success;
2971 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002972 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002973 success = (rc != NULL);
2974 Py_XDECREF(rc);
2975 PyGILState_Release(s);
2976 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002977}
2978
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002979/* Same thing, but releases `thread_done` when it returns. This variant
2980 * should be called only from threads spawned by test_thread_state().
2981 */
2982static void
2983_make_call_from_thread(void *callable)
2984{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 _make_call(callable);
2986 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002987}
2988
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002989static PyObject *
2990test_thread_state(PyObject *self, PyObject *args)
2991{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002992 PyObject *fn;
2993 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002995 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2996 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002998 if (!PyCallable_Check(fn)) {
2999 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
Victor Stinnerdaa97562020-02-07 03:37:06 +01003000 Py_TYPE(fn)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003001 return NULL;
3002 }
Benjamin Petersona786b022008-08-25 21:05:21 +00003003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003004 thread_done = PyThread_allocate_lock();
3005 if (thread_done == NULL)
3006 return PyErr_NoMemory();
3007 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003009 /* Start a new thread with our callback. */
3010 PyThread_start_new_thread(_make_call_from_thread, fn);
3011 /* Make the callback with the thread lock held by this thread */
3012 success &= _make_call(fn);
3013 /* Do it all again, but this time with the thread-lock released */
3014 Py_BEGIN_ALLOW_THREADS
3015 success &= _make_call(fn);
3016 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
3017 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 /* And once more with and without a thread
3020 XXX - should use a lock and work out exactly what we are trying
3021 to test <wink>
3022 */
3023 Py_BEGIN_ALLOW_THREADS
3024 PyThread_start_new_thread(_make_call_from_thread, fn);
3025 success &= _make_call(fn);
3026 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
3027 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003029 /* Release lock we acquired above. This is required on HP-UX. */
3030 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 PyThread_free_lock(thread_done);
3033 if (!success)
3034 return NULL;
3035 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003036}
Benjamin Petersona54c9092009-01-13 02:11:23 +00003037
3038/* test Py_AddPendingCalls using threads */
3039static int _pending_callback(void *arg)
3040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003041 /* we assume the argument is callable object to which we own a reference */
3042 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01003043 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 Py_DECREF(callable);
3045 Py_XDECREF(r);
3046 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00003047}
3048
3049/* The following requests n callbacks to _pending_callback. It can be
3050 * run from any python thread.
3051 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07003052static PyObject *
3053pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00003054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 PyObject *callable;
3056 int r;
3057 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
3058 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00003059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003060 /* create the reference for the callbackwhile we hold the lock */
3061 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00003062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 Py_BEGIN_ALLOW_THREADS
3064 r = Py_AddPendingCall(&_pending_callback, callable);
3065 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00003066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 if (r<0) {
3068 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003069 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003071 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00003072}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003073
Neal Norwitzb0d26332007-08-25 00:49:05 +00003074/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003075static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003076test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00003077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003078 PyObject *result;
3079 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003080
Alexander Belopolskye239d232010-12-08 23:31:48 +00003081#define CHECK_1_FORMAT(FORMAT, TYPE) \
3082 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
3083 if (result == NULL) \
3084 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003085 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00003086 msg = FORMAT " failed at 1"; \
3087 goto Fail; \
3088 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003091 CHECK_1_FORMAT("%d", int);
3092 CHECK_1_FORMAT("%ld", long);
3093 /* The z width modifier was added in Python 2.5. */
3094 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 /* The u type code was added in Python 2.5. */
3097 CHECK_1_FORMAT("%u", unsigned int);
3098 CHECK_1_FORMAT("%lu", unsigned long);
3099 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003101 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003102 CHECK_1_FORMAT("%llu", unsigned long long);
3103 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00003104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003106
3107 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003108 Py_XDECREF(result);
3109 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003110
3111#undef CHECK_1_FORMAT
3112}
3113
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00003114
3115static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303116test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003117 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
3118 int result;
3119 if (py_s == NULL)
3120 return NULL;
3121 result = PyUnicode_CompareWithASCIIString(py_s, "str");
3122 Py_DECREF(py_s);
3123 if (!result) {
3124 PyErr_SetString(TestError, "Python string ending in NULL "
3125 "should not compare equal to c string.");
3126 return NULL;
3127 }
3128 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00003129}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00003130
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003131/* This is here to provide a docstring for test_descr. */
3132static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303133test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003135 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003136}
3137
Mark Dickinson725bfd82009-05-03 20:33:40 +00003138/* Test PyOS_string_to_double. */
3139static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303140test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02003142 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144#define CHECK_STRING(STR, expected) \
3145 result = PyOS_string_to_double(STR, NULL, NULL); \
3146 if (result == -1.0 && PyErr_Occurred()) \
3147 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07003148 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149 msg = "conversion of " STR " to float failed"; \
3150 goto fail; \
3151 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00003152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153#define CHECK_INVALID(STR) \
3154 result = PyOS_string_to_double(STR, NULL, NULL); \
3155 if (result == -1.0 && PyErr_Occurred()) { \
3156 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
3157 PyErr_Clear(); \
3158 else \
3159 return NULL; \
3160 } \
3161 else { \
3162 msg = "conversion of " STR " didn't raise ValueError"; \
3163 goto fail; \
3164 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00003165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003166 CHECK_STRING("0.1", 0.1);
3167 CHECK_STRING("1.234", 1.234);
3168 CHECK_STRING("-1.35", -1.35);
3169 CHECK_STRING(".1e01", 1.0);
3170 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00003171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003172 CHECK_INVALID(" 0.1");
3173 CHECK_INVALID("\t\n-3");
3174 CHECK_INVALID(".123 ");
3175 CHECK_INVALID("3\n");
3176 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00003177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003179 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00003181#undef CHECK_STRING
3182#undef CHECK_INVALID
3183}
3184
3185
Benjamin Petersonb173f782009-05-05 22:31:58 +00003186/* Coverage testing of capsule objects. */
3187
3188static const char *capsule_name = "capsule name";
3189static char *capsule_pointer = "capsule pointer";
3190static char *capsule_context = "capsule context";
3191static const char *capsule_error = NULL;
3192static int
3193capsule_destructor_call_count = 0;
3194
3195static void
3196capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003197 capsule_destructor_call_count++;
3198 if (PyCapsule_GetContext(o) != capsule_context) {
3199 capsule_error = "context did not match in destructor!";
3200 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
3201 capsule_error = "destructor did not match in destructor! (woah!)";
3202 } else if (PyCapsule_GetName(o) != capsule_name) {
3203 capsule_error = "name did not match in destructor!";
3204 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
3205 capsule_error = "pointer did not match in destructor!";
3206 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003207}
3208
3209typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003210 char *name;
3211 char *module;
3212 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003213} known_capsule;
3214
3215static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003216test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00003217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 PyObject *object;
3219 const char *error = NULL;
3220 void *pointer;
3221 void *pointer2;
3222 known_capsule known_capsules[] = {
3223 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
3224 KNOWN_CAPSULE("_socket", "CAPI"),
3225 KNOWN_CAPSULE("_curses", "_C_API"),
3226 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
3227 { NULL, NULL },
3228 };
3229 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003230
3231#define FAIL(x) { error = (x); goto exit; }
3232
3233#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003234 if (capsule_error) { \
3235 FAIL(capsule_error); \
3236 } \
3237 else if (!capsule_destructor_call_count) { \
3238 FAIL("destructor not called!"); \
3239 } \
3240 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
3243 PyCapsule_SetContext(object, capsule_context);
3244 capsule_destructor(object);
3245 CHECK_DESTRUCTOR;
3246 Py_DECREF(object);
3247 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 object = PyCapsule_New(known, "ignored", NULL);
3250 PyCapsule_SetPointer(object, capsule_pointer);
3251 PyCapsule_SetName(object, capsule_name);
3252 PyCapsule_SetDestructor(object, capsule_destructor);
3253 PyCapsule_SetContext(object, capsule_context);
3254 capsule_destructor(object);
3255 CHECK_DESTRUCTOR;
3256 /* intentionally access using the wrong name */
3257 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
3258 if (!PyErr_Occurred()) {
3259 FAIL("PyCapsule_GetPointer should have failed but did not!");
3260 }
3261 PyErr_Clear();
3262 if (pointer2) {
3263 if (pointer2 == capsule_pointer) {
3264 FAIL("PyCapsule_GetPointer should not have"
3265 " returned the internal pointer!");
3266 } else {
3267 FAIL("PyCapsule_GetPointer should have "
3268 "returned NULL pointer but did not!");
3269 }
3270 }
3271 PyCapsule_SetDestructor(object, NULL);
3272 Py_DECREF(object);
3273 if (capsule_destructor_call_count) {
3274 FAIL("destructor called when it should not have been!");
3275 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003277 for (known = &known_capsules[0]; known->module != NULL; known++) {
3278 /* yeah, ordinarily I wouldn't do this either,
3279 but it's fine for this test harness.
3280 */
3281 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003282#undef FAIL
3283#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003284 { \
3285 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
3286 x, known->module, known->attribute); \
3287 error = buffer; \
3288 goto exit; \
3289 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 PyObject *module = PyImport_ImportModule(known->module);
3292 if (module) {
3293 pointer = PyCapsule_Import(known->name, 0);
3294 if (!pointer) {
3295 Py_DECREF(module);
3296 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
3297 }
3298 object = PyObject_GetAttrString(module, known->attribute);
3299 if (!object) {
3300 Py_DECREF(module);
3301 return NULL;
3302 }
3303 pointer2 = PyCapsule_GetPointer(object,
3304 "weebles wobble but they don't fall down");
3305 if (!PyErr_Occurred()) {
3306 Py_DECREF(object);
3307 Py_DECREF(module);
3308 FAIL("PyCapsule_GetPointer should have failed but did not!");
3309 }
3310 PyErr_Clear();
3311 if (pointer2) {
3312 Py_DECREF(module);
3313 Py_DECREF(object);
3314 if (pointer2 == pointer) {
3315 FAIL("PyCapsule_GetPointer should not have"
3316 " returned its internal pointer!");
3317 } else {
3318 FAIL("PyCapsule_GetPointer should have"
3319 " returned NULL pointer but did not!");
3320 }
3321 }
3322 Py_DECREF(object);
3323 Py_DECREF(module);
3324 }
3325 else
3326 PyErr_Clear();
3327 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003328
3329 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 if (error) {
3331 return raiseTestError("test_capsule", error);
3332 }
3333 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003334#undef FAIL
3335}
3336
Guido van Rossumddefaf32007-01-14 03:31:43 +00003337#ifdef HAVE_GETTIMEOFDAY
3338/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00003339static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003340{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 e->tv_sec -= s->tv_sec;
3342 e->tv_usec -= s->tv_usec;
3343 if (e->tv_usec < 0) {
3344 e->tv_sec -=1;
3345 e->tv_usec += 1000000;
3346 }
3347 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003348}
3349
3350static PyObject *
3351profile_int(PyObject *self, PyObject* args)
3352{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 int i, k;
3354 struct timeval start, stop;
3355 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 /* Test 1: Allocate and immediately deallocate
3358 many small integers */
3359 gettimeofday(&start, NULL);
3360 for(k=0; k < 20000; k++)
3361 for(i=0; i < 1000; i++) {
3362 single = PyLong_FromLong(i);
3363 Py_DECREF(single);
3364 }
3365 gettimeofday(&stop, NULL);
3366 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003368 /* Test 2: Allocate and immediately deallocate
3369 many large integers */
3370 gettimeofday(&start, NULL);
3371 for(k=0; k < 20000; k++)
3372 for(i=0; i < 1000; i++) {
3373 single = PyLong_FromLong(i+1000000);
3374 Py_DECREF(single);
3375 }
3376 gettimeofday(&stop, NULL);
3377 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 /* Test 3: Allocate a few integers, then release
3380 them all simultaneously. */
3381 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02003382 if (multiple == NULL)
3383 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003384 gettimeofday(&start, NULL);
3385 for(k=0; k < 20000; k++) {
3386 for(i=0; i < 1000; i++) {
3387 multiple[i] = PyLong_FromLong(i+1000000);
3388 }
3389 for(i=0; i < 1000; i++) {
3390 Py_DECREF(multiple[i]);
3391 }
3392 }
3393 gettimeofday(&stop, NULL);
3394 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003395 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003397 /* Test 4: Allocate many integers, then release
3398 them all simultaneously. */
3399 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003400 if (multiple == NULL)
3401 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003402 gettimeofday(&start, NULL);
3403 for(k=0; k < 20; k++) {
3404 for(i=0; i < 1000000; i++) {
3405 multiple[i] = PyLong_FromLong(i+1000000);
3406 }
3407 for(i=0; i < 1000000; i++) {
3408 Py_DECREF(multiple[i]);
3409 }
3410 }
3411 gettimeofday(&stop, NULL);
3412 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003413 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003415 /* Test 5: Allocate many integers < 32000 */
3416 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003417 if (multiple == NULL)
3418 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 gettimeofday(&start, NULL);
3420 for(k=0; k < 10; k++) {
3421 for(i=0; i < 1000000; i++) {
3422 multiple[i] = PyLong_FromLong(i+1000);
3423 }
3424 for(i=0; i < 1000000; i++) {
3425 Py_DECREF(multiple[i]);
3426 }
3427 }
3428 gettimeofday(&stop, NULL);
3429 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003430 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003432 /* Test 6: Perform small int addition */
3433 op1 = PyLong_FromLong(1);
3434 gettimeofday(&start, NULL);
3435 for(i=0; i < 10000000; i++) {
3436 result = PyNumber_Add(op1, op1);
3437 Py_DECREF(result);
3438 }
3439 gettimeofday(&stop, NULL);
3440 Py_DECREF(op1);
3441 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 /* Test 7: Perform medium int addition */
3444 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003445 if (op1 == NULL)
3446 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003447 gettimeofday(&start, NULL);
3448 for(i=0; i < 10000000; i++) {
3449 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003450 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003451 }
3452 gettimeofday(&stop, NULL);
3453 Py_DECREF(op1);
3454 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003455
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003456 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003457}
3458#endif
3459
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003460/* To test the format of tracebacks as printed out. */
3461static PyObject *
3462traceback_print(PyObject *self, PyObject *args)
3463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003464 PyObject *file;
3465 PyObject *traceback;
3466 int result;
3467
3468 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3469 &traceback, &file))
3470 return NULL;
3471
3472 result = PyTraceBack_Print(traceback, file);
3473 if (result < 0)
3474 return NULL;
3475 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003476}
3477
Benjamin Petersone6528212008-07-15 15:32:09 +00003478/* To test the format of exceptions as printed out. */
3479static PyObject *
3480exception_print(PyObject *self, PyObject *args)
3481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003482 PyObject *value;
3483 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003485 if (!PyArg_ParseTuple(args, "O:exception_print",
3486 &value))
3487 return NULL;
3488 if (!PyExceptionInstance_Check(value)) {
3489 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3490 return NULL;
3491 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003493 tb = PyException_GetTraceback(value);
3494 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3495 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003497 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003498}
3499
3500
3501
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003502
3503/* reliably raise a MemoryError */
3504static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303505raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003506{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003507 PyErr_NoMemory();
3508 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003509}
3510
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003511/* Issue 6012 */
3512static PyObject *str1, *str2;
3513static int
3514failing_converter(PyObject *obj, void *arg)
3515{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 /* Clone str1, then let the conversion fail. */
3517 assert(str1);
3518 str2 = str1;
3519 Py_INCREF(str2);
3520 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003521}
3522static PyObject*
3523argparsing(PyObject *o, PyObject *args)
3524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003525 PyObject *res;
3526 str1 = str2 = NULL;
3527 if (!PyArg_ParseTuple(args, "O&O&",
3528 PyUnicode_FSConverter, &str1,
3529 failing_converter, &str2)) {
3530 if (!str2)
3531 /* argument converter not called? */
3532 return NULL;
3533 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003534 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003535 Py_DECREF(str2);
3536 PyErr_Clear();
3537 return res;
3538 }
3539 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003540}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003541
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003542/* To test that the result of PyCode_NewEmpty has the right members. */
3543static PyObject *
3544code_newempty(PyObject *self, PyObject *args)
3545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003546 const char *filename;
3547 const char *funcname;
3548 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003550 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3551 &filename, &funcname, &firstlineno))
3552 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003554 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003555}
3556
Georg Brandl1e28a272009-12-28 08:41:01 +00003557/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3558 Run via Lib/test/test_exceptions.py */
3559static PyObject *
3560make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3561{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003562 const char *name;
3563 const char *doc = NULL;
3564 PyObject *base = NULL;
3565 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003567 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003569 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3570 "s|sOO:make_exception_with_doc", kwlist,
3571 &name, &doc, &base, &dict))
3572 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003574 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003575}
3576
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003577static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303578make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003579{
3580 Py_buffer info;
3581 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3582 return NULL;
3583 return PyMemoryView_FromBuffer(&info);
3584}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003585
Stefan Krah7213fcc2015-02-01 16:19:23 +01003586static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003587test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003588{
3589 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3590 int init[5] = {0, 1, 2, 3, 4};
3591 Py_ssize_t itemsize = sizeof(int);
3592 Py_ssize_t shape = 5;
3593 Py_ssize_t strides = 2 * itemsize;
3594 Py_buffer view = {
3595 data,
3596 NULL,
3597 5 * itemsize,
3598 itemsize,
3599 1,
3600 1,
3601 NULL,
3602 &shape,
3603 &strides,
3604 NULL,
3605 NULL
3606 };
3607 int *ptr;
3608 int i;
3609
3610 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3611 ptr = view.buf;
3612 for (i = 0; i < 5; i++) {
3613 if (ptr[2*i] != i) {
3614 PyErr_SetString(TestError,
3615 "test_from_contiguous: incorrect result");
3616 return NULL;
3617 }
3618 }
3619
3620 view.buf = &data[8];
3621 view.strides[0] = -2 * itemsize;
3622
3623 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3624 ptr = view.buf;
3625 for (i = 0; i < 5; i++) {
3626 if (*(ptr-2*i) != i) {
3627 PyErr_SetString(TestError,
3628 "test_from_contiguous: incorrect result");
3629 return NULL;
3630 }
3631 }
3632
3633 Py_RETURN_NONE;
3634}
Stefan Krah650c1e82015-02-03 21:43:23 +01003635
Stefan Kraha7559c02015-02-03 22:27:21 +01003636#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003637extern PyTypeObject _PyBytesIOBuffer_Type;
3638
Stefan Krah5178d912015-02-03 16:57:21 +01003639static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003640test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003641{
Stefan Krah650c1e82015-02-03 21:43:23 +01003642 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003643 PyObject *b;
3644 char *dummy[1];
3645 int ret, match;
3646
Stefan Krah650c1e82015-02-03 21:43:23 +01003647 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003648 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3649 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3650 PyErr_Clear();
3651 if (ret != -1 || match == 0)
3652 goto error;
3653
Stefan Krah650c1e82015-02-03 21:43:23 +01003654 /* bytesiobuf_getbuffer() */
3655 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003656 if (b == NULL) {
3657 return NULL;
3658 }
3659
3660 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3661 Py_DECREF(b);
3662 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3663 PyErr_Clear();
3664 if (ret != -1 || match == 0)
3665 goto error;
3666
3667 Py_RETURN_NONE;
3668
3669error:
3670 PyErr_SetString(TestError,
3671 "test_pep3118_obsolete_write_locks: failure");
3672 return NULL;
3673}
Stefan Kraha7559c02015-02-03 22:27:21 +01003674#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003675
Stefan Krah650c1e82015-02-03 21:43:23 +01003676/* This tests functions that historically supported write locks. It is
3677 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3678 is entitled to segfault in that case. */
3679static PyObject *
3680getbuffer_with_null_view(PyObject* self, PyObject *obj)
3681{
3682 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3683 return NULL;
3684
3685 Py_RETURN_NONE;
3686}
3687
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03003688/* PyBuffer_SizeFromFormat() */
3689static PyObject *
3690test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
3691{
3692 const char *format;
3693 Py_ssize_t result;
3694
3695 if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
3696 &format)) {
3697 return NULL;
3698 }
3699
3700 result = PyBuffer_SizeFromFormat(format);
3701 if (result == -1) {
3702 return NULL;
3703 }
3704
3705 return PyLong_FromSsize_t(result);
3706}
3707
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003708/* Test that the fatal error from not having a current thread doesn't
3709 cause an infinite loop. Run via Lib/test/test_capi.py */
3710static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303711crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003712{
3713 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003714 /* Using PyThreadState_Get() directly allows the test to pass in
3715 !pydebug mode. However, the test only actually tests anything
3716 in pydebug mode, since that's where the infinite loop was in
3717 the first place. */
3718 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003719 Py_END_ALLOW_THREADS
3720 return NULL;
3721}
3722
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003723/* To run some code in a sub-interpreter. */
3724static PyObject *
3725run_in_subinterp(PyObject *self, PyObject *args)
3726{
3727 const char *code;
3728 int r;
3729 PyThreadState *substate, *mainstate;
Guido van Rossum9d197c72020-06-27 17:33:49 -07003730 /* only initialise 'cflags.cf_flags' to test backwards compatibility */
3731 PyCompilerFlags cflags = {0};
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003732
3733 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3734 &code))
3735 return NULL;
3736
3737 mainstate = PyThreadState_Get();
3738
3739 PyThreadState_Swap(NULL);
3740
3741 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003742 if (substate == NULL) {
3743 /* Since no new thread state was created, there is no exception to
3744 propagate; raise a fresh one after swapping in the old thread
3745 state. */
3746 PyThreadState_Swap(mainstate);
3747 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3748 return NULL;
3749 }
Guido van Rossum9d197c72020-06-27 17:33:49 -07003750 r = PyRun_SimpleStringFlags(code, &cflags);
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003751 Py_EndInterpreter(substate);
3752
3753 PyThreadState_Swap(mainstate);
3754
3755 return PyLong_FromLong(r);
3756}
3757
Victor Stinner3c1b3792014-02-17 00:02:43 +01003758static int
3759check_time_rounding(int round)
3760{
Victor Stinner74474232015-09-02 01:43:56 +02003761 if (round != _PyTime_ROUND_FLOOR
3762 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003763 && round != _PyTime_ROUND_HALF_EVEN
3764 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003765 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3766 return -1;
3767 }
3768 return 0;
3769}
3770
Victor Stinner5d272cc2012-03-13 13:35:55 +01003771static PyObject *
3772test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3773{
3774 PyObject *obj;
3775 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003776 int round;
3777 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003778 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003779 if (check_time_rounding(round) < 0)
3780 return NULL;
3781 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003782 return NULL;
3783 return _PyLong_FromTime_t(sec);
3784}
3785
3786static PyObject *
3787test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3788{
3789 PyObject *obj;
3790 time_t sec;
3791 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003792 int round;
3793 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003794 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003795 if (check_time_rounding(round) < 0)
3796 return NULL;
3797 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003798 return NULL;
3799 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3800}
3801
Victor Stinner643cd682012-03-02 22:54:03 +01003802static PyObject *
3803test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3804{
3805 PyObject *obj;
3806 time_t sec;
3807 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003808 int round;
3809 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003810 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003811 if (check_time_rounding(round) < 0)
3812 return NULL;
3813 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003814 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003815 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003816}
3817
Antoine Pitrou796564c2013-07-30 19:59:21 +02003818static void
3819slot_tp_del(PyObject *self)
3820{
3821 _Py_IDENTIFIER(__tp_del__);
3822 PyObject *del, *res;
3823 PyObject *error_type, *error_value, *error_traceback;
3824
3825 /* Temporarily resurrect the object. */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003826 assert(Py_REFCNT(self) == 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003827 Py_SET_REFCNT(self, 1);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003828
3829 /* Save the current exception, if any. */
3830 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3831
3832 /* Execute __del__ method, if any. */
3833 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3834 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003835 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003836 if (res == NULL)
3837 PyErr_WriteUnraisable(del);
3838 else
3839 Py_DECREF(res);
3840 Py_DECREF(del);
3841 }
3842
3843 /* Restore the saved exception. */
3844 PyErr_Restore(error_type, error_value, error_traceback);
3845
3846 /* Undo the temporary resurrection; can't use DECREF here, it would
3847 * cause a recursive call.
3848 */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003849 assert(Py_REFCNT(self) > 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003850 Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
3851 if (Py_REFCNT(self) == 0) {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003852 /* this is the normal path out */
3853 return;
3854 }
Antoine Pitrou796564c2013-07-30 19:59:21 +02003855
3856 /* __del__ resurrected it! Make it look like the original Py_DECREF
3857 * never happened.
3858 */
3859 {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003860 Py_ssize_t refcnt = Py_REFCNT(self);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003861 _Py_NewReference(self);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003862 Py_SET_REFCNT(self, refcnt);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003863 }
Pablo Galindof13072b2020-04-11 01:21:54 +01003864 assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self));
Victor Stinner49932fe2020-02-03 17:55:05 +01003865 /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
3866 _Py_RefTotal, so we need to undo that. */
3867#ifdef Py_REF_DEBUG
3868 _Py_RefTotal--;
3869#endif
Antoine Pitrou796564c2013-07-30 19:59:21 +02003870}
3871
3872static PyObject *
3873with_tp_del(PyObject *self, PyObject *args)
3874{
3875 PyObject *obj;
3876 PyTypeObject *tp;
3877
3878 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3879 return NULL;
3880 tp = (PyTypeObject *) obj;
3881 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3882 PyErr_Format(PyExc_TypeError,
3883 "heap type expected, got %R", obj);
3884 return NULL;
3885 }
3886 tp->tp_del = slot_tp_del;
3887 Py_INCREF(obj);
3888 return obj;
3889}
3890
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003891static PyMethodDef ml;
3892
3893static PyObject *
3894create_cfunction(PyObject *self, PyObject *args)
3895{
3896 return PyCFunction_NewEx(&ml, self, NULL);
3897}
3898
3899static PyMethodDef ml = {
3900 "create_cfunction",
3901 create_cfunction,
3902 METH_NOARGS,
3903 NULL
3904};
3905
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003906static PyObject *
3907_test_incref(PyObject *ob)
3908{
3909 Py_INCREF(ob);
3910 return ob;
3911}
3912
3913static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303914test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003915{
3916 PyObject *obj = PyLong_FromLong(0);
3917 Py_XINCREF(_test_incref(obj));
3918 Py_DECREF(obj);
3919 Py_DECREF(obj);
3920 Py_DECREF(obj);
3921 Py_RETURN_NONE;
3922}
3923
3924static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303925test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003926{
3927 PyObject *obj = PyLong_FromLong(0);
3928 Py_INCREF(_test_incref(obj));
3929 Py_DECREF(obj);
3930 Py_DECREF(obj);
3931 Py_DECREF(obj);
3932 Py_RETURN_NONE;
3933}
3934
3935static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303936test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003937{
3938 Py_XDECREF(PyLong_FromLong(0));
3939 Py_RETURN_NONE;
3940}
3941
3942static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303943test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003944{
3945 Py_DECREF(PyLong_FromLong(0));
3946 Py_RETURN_NONE;
3947}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003948
Victor Stinner0507bf52013-07-07 02:05:46 +02003949static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003950test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3951 PyObject *Py_UNUSED(args))
3952{
3953 PyStructSequence_Desc descr;
3954 PyStructSequence_Field descr_fields[3];
3955
3956 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3957 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3958 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3959
3960 descr.name = "_testcapi.test_descr";
3961 descr.doc = "This is used to test for memory leaks in NewType";
3962 descr.fields = descr_fields;
3963 descr.n_in_sequence = 1;
3964
3965 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3966 assert(structseq_type != NULL);
3967 assert(PyType_Check(structseq_type));
3968 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3969 Py_DECREF(structseq_type);
3970
3971 Py_RETURN_NONE;
3972}
3973
3974static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303975test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003976{
3977 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003978 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003979 Py_DecRef(obj);
3980 Py_DecRef(obj);
3981 Py_RETURN_NONE;
3982}
3983
3984static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303985test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003986{
3987 void *ptr;
3988
Victor Stinnerdb067af2014-05-02 22:31:14 +02003989 ptr = PyMem_RawMalloc(0);
3990 if (ptr == NULL) {
3991 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3992 return NULL;
3993 }
3994 PyMem_RawFree(ptr);
3995
3996 ptr = PyMem_RawCalloc(0, 0);
3997 if (ptr == NULL) {
3998 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3999 return NULL;
4000 }
4001 PyMem_RawFree(ptr);
4002
Victor Stinner0507bf52013-07-07 02:05:46 +02004003 ptr = PyMem_Malloc(0);
4004 if (ptr == NULL) {
4005 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
4006 return NULL;
4007 }
4008 PyMem_Free(ptr);
4009
Victor Stinnerdb067af2014-05-02 22:31:14 +02004010 ptr = PyMem_Calloc(0, 0);
4011 if (ptr == NULL) {
4012 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
4013 return NULL;
4014 }
4015 PyMem_Free(ptr);
4016
Victor Stinner0507bf52013-07-07 02:05:46 +02004017 ptr = PyObject_Malloc(0);
4018 if (ptr == NULL) {
4019 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
4020 return NULL;
4021 }
4022 PyObject_Free(ptr);
4023
Victor Stinnerdb067af2014-05-02 22:31:14 +02004024 ptr = PyObject_Calloc(0, 0);
4025 if (ptr == NULL) {
4026 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
4027 return NULL;
4028 }
4029 PyObject_Free(ptr);
4030
Victor Stinner0507bf52013-07-07 02:05:46 +02004031 Py_RETURN_NONE;
4032}
4033
4034typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02004035 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02004036
4037 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004038 size_t calloc_nelem;
4039 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02004040 void *realloc_ptr;
4041 size_t realloc_new_size;
4042 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004043 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004044} alloc_hook_t;
4045
Victor Stinner9ed83c42017-10-31 12:18:10 -07004046static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02004047{
4048 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004049 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004050 hook->malloc_size = size;
4051 return hook->alloc.malloc(hook->alloc.ctx, size);
4052}
4053
Victor Stinner9ed83c42017-10-31 12:18:10 -07004054static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02004055{
4056 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004057 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004058 hook->calloc_nelem = nelem;
4059 hook->calloc_elsize = elsize;
4060 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
4061}
4062
Victor Stinner9ed83c42017-10-31 12:18:10 -07004063static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02004064{
4065 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004066 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004067 hook->realloc_ptr = ptr;
4068 hook->realloc_new_size = new_size;
4069 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
4070}
4071
Victor Stinner9ed83c42017-10-31 12:18:10 -07004072static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02004073{
4074 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004075 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004076 hook->free_ptr = ptr;
4077 hook->alloc.free(hook->alloc.ctx, ptr);
4078}
4079
4080static PyObject *
4081test_setallocators(PyMemAllocatorDomain domain)
4082{
4083 PyObject *res = NULL;
4084 const char *error_msg;
4085 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02004086 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004087 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02004088 void *ptr, *ptr2;
4089
Victor Stinnerdb067af2014-05-02 22:31:14 +02004090 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02004091
4092 alloc.ctx = &hook;
4093 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004094 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02004095 alloc.realloc = &hook_realloc;
4096 alloc.free = &hook_free;
4097 PyMem_GetAllocator(domain, &hook.alloc);
4098 PyMem_SetAllocator(domain, &alloc);
4099
Victor Stinner9ed83c42017-10-31 12:18:10 -07004100 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02004101 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004102 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02004103 switch(domain)
4104 {
4105 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
4106 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
4107 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
4108 default: ptr = NULL; break;
4109 }
4110
Victor Stinner9ed83c42017-10-31 12:18:10 -07004111#define CHECK_CTX(FUNC) \
4112 if (hook.ctx != &hook) { \
4113 error_msg = FUNC " wrong context"; \
4114 goto fail; \
4115 } \
4116 hook.ctx = NULL; /* reset for next check */
4117
Victor Stinner0507bf52013-07-07 02:05:46 +02004118 if (ptr == NULL) {
4119 error_msg = "malloc failed";
4120 goto fail;
4121 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004122 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02004123 if (hook.malloc_size != size) {
4124 error_msg = "malloc invalid size";
4125 goto fail;
4126 }
4127
4128 size2 = 200;
4129 switch(domain)
4130 {
4131 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
4132 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
4133 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02004134 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02004135 }
4136
4137 if (ptr2 == NULL) {
4138 error_msg = "realloc failed";
4139 goto fail;
4140 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004141 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02004142 if (hook.realloc_ptr != ptr
4143 || hook.realloc_new_size != size2) {
4144 error_msg = "realloc invalid parameters";
4145 goto fail;
4146 }
4147
4148 switch(domain)
4149 {
4150 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
4151 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
4152 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
4153 }
4154
Victor Stinner9ed83c42017-10-31 12:18:10 -07004155 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02004156 if (hook.free_ptr != ptr2) {
4157 error_msg = "free invalid pointer";
4158 goto fail;
4159 }
4160
Victor Stinner9ed83c42017-10-31 12:18:10 -07004161 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02004162 nelem = 2;
4163 elsize = 5;
4164 switch(domain)
4165 {
4166 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
4167 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
4168 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
4169 default: ptr = NULL; break;
4170 }
4171
4172 if (ptr == NULL) {
4173 error_msg = "calloc failed";
4174 goto fail;
4175 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004176 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02004177 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
4178 error_msg = "calloc invalid nelem or elsize";
4179 goto fail;
4180 }
4181
Victor Stinner9ed83c42017-10-31 12:18:10 -07004182 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004183 switch(domain)
4184 {
4185 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
4186 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
4187 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
4188 }
4189
Victor Stinner9ed83c42017-10-31 12:18:10 -07004190 CHECK_CTX("calloc free");
4191 if (hook.free_ptr != ptr) {
4192 error_msg = "calloc free invalid pointer";
4193 goto fail;
4194 }
4195
Victor Stinner0507bf52013-07-07 02:05:46 +02004196 Py_INCREF(Py_None);
4197 res = Py_None;
4198 goto finally;
4199
4200fail:
4201 PyErr_SetString(PyExc_RuntimeError, error_msg);
4202
4203finally:
4204 PyMem_SetAllocator(domain, &hook.alloc);
4205 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004206
4207#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02004208}
4209
4210static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304211test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004212{
4213 return test_setallocators(PYMEM_DOMAIN_RAW);
4214}
4215
4216static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304217test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004218{
4219 return test_setallocators(PYMEM_DOMAIN_MEM);
4220}
4221
4222static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304223test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004224{
4225 return test_setallocators(PYMEM_DOMAIN_OBJ);
4226}
4227
xdegaye85f64302017-07-01 14:14:45 +02004228/* Most part of the following code is inherited from the pyfailmalloc project
4229 * written by Victor Stinner. */
4230static struct {
4231 int installed;
4232 PyMemAllocatorEx raw;
4233 PyMemAllocatorEx mem;
4234 PyMemAllocatorEx obj;
4235} FmHook;
4236
4237static struct {
4238 int start;
4239 int stop;
4240 Py_ssize_t count;
4241} FmData;
4242
4243static int
4244fm_nomemory(void)
4245{
4246 FmData.count++;
4247 if (FmData.count > FmData.start &&
4248 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
4249 return 1;
4250 }
4251 return 0;
4252}
4253
4254static void *
4255hook_fmalloc(void *ctx, size_t size)
4256{
4257 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4258 if (fm_nomemory()) {
4259 return NULL;
4260 }
4261 return alloc->malloc(alloc->ctx, size);
4262}
4263
4264static void *
4265hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
4266{
4267 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4268 if (fm_nomemory()) {
4269 return NULL;
4270 }
4271 return alloc->calloc(alloc->ctx, nelem, elsize);
4272}
4273
4274static void *
4275hook_frealloc(void *ctx, void *ptr, size_t new_size)
4276{
4277 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4278 if (fm_nomemory()) {
4279 return NULL;
4280 }
4281 return alloc->realloc(alloc->ctx, ptr, new_size);
4282}
4283
4284static void
4285hook_ffree(void *ctx, void *ptr)
4286{
4287 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4288 alloc->free(alloc->ctx, ptr);
4289}
4290
4291static void
4292fm_setup_hooks(void)
4293{
4294 PyMemAllocatorEx alloc;
4295
4296 if (FmHook.installed) {
4297 return;
4298 }
4299 FmHook.installed = 1;
4300
4301 alloc.malloc = hook_fmalloc;
4302 alloc.calloc = hook_fcalloc;
4303 alloc.realloc = hook_frealloc;
4304 alloc.free = hook_ffree;
4305 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4306 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4307 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4308
4309 alloc.ctx = &FmHook.raw;
4310 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
4311
4312 alloc.ctx = &FmHook.mem;
4313 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
4314
4315 alloc.ctx = &FmHook.obj;
4316 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
4317}
4318
4319static void
4320fm_remove_hooks(void)
4321{
4322 if (FmHook.installed) {
4323 FmHook.installed = 0;
4324 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4325 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4326 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4327 }
4328}
4329
4330static PyObject*
4331set_nomemory(PyObject *self, PyObject *args)
4332{
4333 /* Memory allocation fails after 'start' allocation requests, and until
4334 * 'stop' allocation requests except when 'stop' is negative or equal
4335 * to 0 (default) in which case allocation failures never stop. */
4336 FmData.count = 0;
4337 FmData.stop = 0;
4338 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
4339 return NULL;
4340 }
4341 fm_setup_hooks();
4342 Py_RETURN_NONE;
4343}
4344
4345static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304346remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02004347{
4348 fm_remove_hooks();
4349 Py_RETURN_NONE;
4350}
4351
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004352PyDoc_STRVAR(docstring_empty,
4353""
4354);
4355
4356PyDoc_STRVAR(docstring_no_signature,
4357"This docstring has no signature."
4358);
4359
4360PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004361"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004362"\n"
4363"This docstring has an invalid signature."
4364);
4365
Larry Hastings2623c8c2014-02-08 22:15:29 -08004366PyDoc_STRVAR(docstring_with_invalid_signature2,
4367"docstring_with_invalid_signature2($module, /, boo)\n"
4368"\n"
4369"--\n"
4370"\n"
4371"This docstring also has an invalid signature."
4372);
4373
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004374PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004375"docstring_with_signature($module, /, sig)\n"
4376"--\n"
4377"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004378"This docstring has a valid signature."
4379);
4380
Zachary Ware8ef887c2015-04-13 18:22:35 -05004381PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4382"docstring_with_signature_but_no_doc($module, /, sig)\n"
4383"--\n"
4384"\n"
4385);
4386
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004387PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004388"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4389"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004390"\n"
4391"\n"
4392"This docstring has a valid signature and some extra newlines."
4393);
4394
Larry Hastings16c51912014-01-07 11:53:01 -08004395PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004396"docstring_with_signature_with_defaults(module, s='avocado',\n"
4397" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4398" local=the_number_three, sys=sys.maxsize,\n"
4399" exp=sys.maxsize - 1)\n"
4400"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004401"\n"
4402"\n"
4403"\n"
4404"This docstring has a valid signature with parameters,\n"
4405"and the parameters take defaults of varying types."
4406);
4407
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004408typedef struct {
4409 PyThread_type_lock start_event;
4410 PyThread_type_lock exit_event;
4411 PyObject *callback;
4412} test_c_thread_t;
4413
4414static void
4415temporary_c_thread(void *data)
4416{
4417 test_c_thread_t *test_c_thread = data;
4418 PyGILState_STATE state;
4419 PyObject *res;
4420
4421 PyThread_release_lock(test_c_thread->start_event);
4422
4423 /* Allocate a Python thread state for this thread */
4424 state = PyGILState_Ensure();
4425
Victor Stinner3466bde2016-09-05 18:16:01 -07004426 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004427 Py_CLEAR(test_c_thread->callback);
4428
4429 if (res == NULL) {
4430 PyErr_Print();
4431 }
4432 else {
4433 Py_DECREF(res);
4434 }
4435
4436 /* Destroy the Python thread state for this thread */
4437 PyGILState_Release(state);
4438
4439 PyThread_release_lock(test_c_thread->exit_event);
4440
4441 PyThread_exit_thread();
4442}
4443
4444static PyObject *
4445call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4446{
4447 PyObject *res = NULL;
4448 test_c_thread_t test_c_thread;
4449 long thread;
4450
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004451 test_c_thread.start_event = PyThread_allocate_lock();
4452 test_c_thread.exit_event = PyThread_allocate_lock();
4453 test_c_thread.callback = NULL;
4454 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4455 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4456 goto exit;
4457 }
4458
4459 Py_INCREF(callback);
4460 test_c_thread.callback = callback;
4461
4462 PyThread_acquire_lock(test_c_thread.start_event, 1);
4463 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4464
4465 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4466 if (thread == -1) {
4467 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4468 PyThread_release_lock(test_c_thread.start_event);
4469 PyThread_release_lock(test_c_thread.exit_event);
4470 goto exit;
4471 }
4472
4473 PyThread_acquire_lock(test_c_thread.start_event, 1);
4474 PyThread_release_lock(test_c_thread.start_event);
4475
4476 Py_BEGIN_ALLOW_THREADS
4477 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4478 PyThread_release_lock(test_c_thread.exit_event);
4479 Py_END_ALLOW_THREADS
4480
4481 Py_INCREF(Py_None);
4482 res = Py_None;
4483
4484exit:
4485 Py_CLEAR(test_c_thread.callback);
4486 if (test_c_thread.start_event)
4487 PyThread_free_lock(test_c_thread.start_event);
4488 if (test_c_thread.exit_event)
4489 PyThread_free_lock(test_c_thread.exit_event);
4490 return res;
4491}
Victor Stinner13105102013-12-13 02:17:29 +01004492
Serhiy Storchakab5181342015-02-06 08:58:56 +02004493/* marshal */
4494
4495static PyObject*
4496pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4497{
4498 long value;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004499 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004500 int version;
4501 FILE *fp;
4502
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004503 if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004504 &value, &filename, &version))
4505 return NULL;
4506
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004507 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004508 if (fp == NULL) {
4509 PyErr_SetFromErrno(PyExc_OSError);
4510 return NULL;
4511 }
4512
4513 PyMarshal_WriteLongToFile(value, fp, version);
4514
4515 fclose(fp);
4516 if (PyErr_Occurred())
4517 return NULL;
4518 Py_RETURN_NONE;
4519}
4520
4521static PyObject*
4522pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4523{
4524 PyObject *obj;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004525 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004526 int version;
4527 FILE *fp;
4528
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004529 if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004530 &obj, &filename, &version))
4531 return NULL;
4532
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004533 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004534 if (fp == NULL) {
4535 PyErr_SetFromErrno(PyExc_OSError);
4536 return NULL;
4537 }
4538
4539 PyMarshal_WriteObjectToFile(obj, fp, version);
4540
4541 fclose(fp);
4542 if (PyErr_Occurred())
4543 return NULL;
4544 Py_RETURN_NONE;
4545}
4546
4547static PyObject*
4548pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4549{
4550 int value;
4551 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004552 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004553 FILE *fp;
4554
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004555 if (!PyArg_ParseTuple(args, "O:pymarshal_read_short_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004556 return NULL;
4557
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004558 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004559 if (fp == NULL) {
4560 PyErr_SetFromErrno(PyExc_OSError);
4561 return NULL;
4562 }
4563
4564 value = PyMarshal_ReadShortFromFile(fp);
4565 pos = ftell(fp);
4566
4567 fclose(fp);
4568 if (PyErr_Occurred())
4569 return NULL;
4570 return Py_BuildValue("il", value, pos);
4571}
4572
4573static PyObject*
4574pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4575{
4576 long value, pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004577 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004578 FILE *fp;
4579
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004580 if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004581 return NULL;
4582
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004583 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004584 if (fp == NULL) {
4585 PyErr_SetFromErrno(PyExc_OSError);
4586 return NULL;
4587 }
4588
4589 value = PyMarshal_ReadLongFromFile(fp);
4590 pos = ftell(fp);
4591
4592 fclose(fp);
4593 if (PyErr_Occurred())
4594 return NULL;
4595 return Py_BuildValue("ll", value, pos);
4596}
4597
4598static PyObject*
4599pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4600{
4601 PyObject *obj;
4602 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004603 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004604 FILE *fp;
4605
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004606 if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004607 return NULL;
4608
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004609 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004610 if (fp == NULL) {
4611 PyErr_SetFromErrno(PyExc_OSError);
4612 return NULL;
4613 }
4614
4615 obj = PyMarshal_ReadLastObjectFromFile(fp);
4616 pos = ftell(fp);
4617
4618 fclose(fp);
4619 return Py_BuildValue("Nl", obj, pos);
4620}
4621
4622static PyObject*
4623pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4624{
4625 PyObject *obj;
4626 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004627 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004628 FILE *fp;
4629
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004630 if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004631 return NULL;
4632
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004633 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004634 if (fp == NULL) {
4635 PyErr_SetFromErrno(PyExc_OSError);
4636 return NULL;
4637 }
4638
4639 obj = PyMarshal_ReadObjectFromFile(fp);
4640 pos = ftell(fp);
4641
4642 fclose(fp);
4643 return Py_BuildValue("Nl", obj, pos);
4644}
4645
Victor Stinnerefde1462015-03-21 15:04:43 +01004646static PyObject*
4647return_null_without_error(PyObject *self, PyObject *args)
4648{
4649 /* invalid call: return NULL without setting an error,
4650 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4651 PyErr_Clear();
4652 return NULL;
4653}
4654
4655static PyObject*
4656return_result_with_error(PyObject *self, PyObject *args)
4657{
4658 /* invalid call: return a result with an error set,
4659 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4660 PyErr_SetNone(PyExc_ValueError);
4661 Py_RETURN_NONE;
4662}
4663
Victor Stinner992c43f2015-03-27 17:12:45 +01004664static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004665test_pytime_fromseconds(PyObject *self, PyObject *args)
4666{
4667 int seconds;
4668 _PyTime_t ts;
4669
4670 if (!PyArg_ParseTuple(args, "i", &seconds))
4671 return NULL;
4672 ts = _PyTime_FromSeconds(seconds);
4673 return _PyTime_AsNanosecondsObject(ts);
4674}
4675
4676static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004677test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4678{
4679 PyObject *obj;
4680 int round;
4681 _PyTime_t ts;
4682
4683 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4684 return NULL;
4685 if (check_time_rounding(round) < 0)
4686 return NULL;
4687 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4688 return NULL;
4689 return _PyTime_AsNanosecondsObject(ts);
4690}
4691
Victor Stinner4bfb4602015-03-27 22:27:24 +01004692static PyObject *
4693test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4694{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004695 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004696 _PyTime_t ts;
4697 double d;
4698
Victor Stinnerc29b5852017-11-02 07:28:27 -07004699 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004700 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004701 }
4702 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4703 return NULL;
4704 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004705 d = _PyTime_AsSecondsDouble(ts);
4706 return PyFloat_FromDouble(d);
4707}
4708
Victor Stinner95e9cef2015-03-28 01:26:47 +01004709static PyObject *
4710test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4711{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004712 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004713 int round;
4714 _PyTime_t t;
4715 struct timeval tv;
4716 PyObject *seconds;
4717
Victor Stinnerc29b5852017-11-02 07:28:27 -07004718 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004719 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004720 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004721 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004722 }
4723 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004724 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004725 }
4726 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4727 return NULL;
4728 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004729
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004730 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004731 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004732 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004733 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004734 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4735}
4736
Victor Stinner34dc0f42015-03-27 18:19:03 +01004737#ifdef HAVE_CLOCK_GETTIME
4738static PyObject *
4739test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4740{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004741 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004742 _PyTime_t t;
4743 struct timespec ts;
4744
Victor Stinnerc29b5852017-11-02 07:28:27 -07004745 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004746 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004747 }
4748 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004749 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004750 }
4751 if (_PyTime_AsTimespec(t, &ts) == -1) {
4752 return NULL;
4753 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004754 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4755}
4756#endif
4757
Victor Stinner62d1c702015-04-01 17:47:07 +02004758static PyObject *
4759test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4760{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004761 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004762 int round;
4763 _PyTime_t t, ms;
4764
Victor Stinnerc29b5852017-11-02 07:28:27 -07004765 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004766 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004767 }
4768 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004769 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004770 }
4771 if (check_time_rounding(round) < 0) {
4772 return NULL;
4773 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004774 ms = _PyTime_AsMilliseconds(t, round);
4775 /* This conversion rely on the fact that _PyTime_t is a number of
4776 nanoseconds */
4777 return _PyTime_AsNanosecondsObject(ms);
4778}
4779
4780static PyObject *
4781test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4782{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004783 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004784 int round;
4785 _PyTime_t t, ms;
4786
Victor Stinnerc29b5852017-11-02 07:28:27 -07004787 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004788 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004789 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004790 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004791 }
4792 if (check_time_rounding(round) < 0) {
4793 return NULL;
4794 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004795 ms = _PyTime_AsMicroseconds(t, round);
4796 /* This conversion rely on the fact that _PyTime_t is a number of
4797 nanoseconds */
4798 return _PyTime_AsNanosecondsObject(ms);
4799}
4800
Victor Stinner50856d52015-10-13 00:11:21 +02004801static PyObject*
Victor Stinner34be807c2016-03-14 12:04:26 +01004802pymem_buffer_overflow(PyObject *self, PyObject *args)
4803{
4804 char *buffer;
4805
4806 /* Deliberate buffer overflow to check that PyMem_Free() detects
4807 the overflow when debug hooks are installed. */
4808 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004809 if (buffer == NULL) {
4810 PyErr_NoMemory();
4811 return NULL;
4812 }
Victor Stinner34be807c2016-03-14 12:04:26 +01004813 buffer[16] = 'x';
4814 PyMem_Free(buffer);
4815
4816 Py_RETURN_NONE;
4817}
4818
4819static PyObject*
4820pymem_api_misuse(PyObject *self, PyObject *args)
4821{
4822 char *buffer;
4823
4824 /* Deliberate misusage of Python allocators:
4825 allococate with PyMem but release with PyMem_Raw. */
4826 buffer = PyMem_Malloc(16);
4827 PyMem_RawFree(buffer);
4828
4829 Py_RETURN_NONE;
4830}
4831
Victor Stinnerc4aec362016-03-14 22:26:53 +01004832static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004833pymem_malloc_without_gil(PyObject *self, PyObject *args)
4834{
4835 char *buffer;
4836
4837 /* Deliberate bug to test debug hooks on Python memory allocators:
4838 call PyMem_Malloc() without holding the GIL */
4839 Py_BEGIN_ALLOW_THREADS
4840 buffer = PyMem_Malloc(10);
4841 Py_END_ALLOW_THREADS
4842
4843 PyMem_Free(buffer);
4844
4845 Py_RETURN_NONE;
4846}
4847
Victor Stinner5d39e042017-11-29 17:20:38 +01004848
4849static PyObject*
4850test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4851{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004852 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004853 if (name == NULL) {
4854 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4855 return NULL;
4856 }
4857 return PyUnicode_FromString(name);
4858}
4859
4860
Victor Stinnerad524372016-03-16 12:12:53 +01004861static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004862test_pyobject_is_freed(const char *test_name, PyObject *op)
Victor Stinner2b00db62019-04-11 11:33:27 +02004863{
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004864 if (!_PyObject_IsFreed(op)) {
4865 return raiseTestError(test_name, "object is not seen as freed");
4866 }
4867 Py_RETURN_NONE;
Victor Stinner2b00db62019-04-11 11:33:27 +02004868}
4869
4870
4871static PyObject*
Victor Stinner68762572019-10-07 18:42:01 +02004872check_pyobject_null_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
4873{
4874 PyObject *op = NULL;
4875 return test_pyobject_is_freed("check_pyobject_null_is_freed", op);
4876}
4877
4878
4879static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004880check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004881{
4882 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4883 if (op == NULL) {
4884 return NULL;
4885 }
4886 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004887 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004888 /* object fields like ob_type are uninitialized! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004889 return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004890}
4891
4892
4893static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004894check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004895{
4896 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4897 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4898 if (op == NULL) {
4899 return NULL;
4900 }
4901 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004902 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004903 /* ob_type field is after the memory block: part of "forbidden bytes"
Min ho Kim39d87b52019-08-31 06:21:19 +10004904 when using debug hooks on memory allocators! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004905 return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004906}
4907
4908
4909static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004910check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004911{
4912 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4913 if (op == NULL) {
4914 return NULL;
4915 }
4916 Py_TYPE(op)->tp_dealloc(op);
4917 /* Reset reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004918 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004919 /* object memory is freed! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004920 return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004921}
4922
4923
4924static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004925pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4926{
4927 char *buffer;
4928
Victor Stinnerad524372016-03-16 12:12:53 +01004929 /* Deliberate bug to test debug hooks on Python memory allocators:
4930 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004931 Py_BEGIN_ALLOW_THREADS
4932 buffer = PyObject_Malloc(10);
4933 Py_END_ALLOW_THREADS
4934
4935 PyObject_Free(buffer);
4936
4937 Py_RETURN_NONE;
4938}
4939
Victor Stinner10b73e12016-03-22 13:39:05 +01004940static PyObject *
4941tracemalloc_track(PyObject *self, PyObject *args)
4942{
4943 unsigned int domain;
4944 PyObject *ptr_obj;
4945 void *ptr;
4946 Py_ssize_t size;
4947 int release_gil = 0;
4948 int res;
4949
4950 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4951 return NULL;
4952 ptr = PyLong_AsVoidPtr(ptr_obj);
4953 if (PyErr_Occurred())
4954 return NULL;
4955
4956 if (release_gil) {
4957 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004958 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004959 Py_END_ALLOW_THREADS
4960 }
4961 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004962 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004963 }
4964
4965 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004966 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004967 return NULL;
4968 }
4969
4970 Py_RETURN_NONE;
4971}
4972
4973static PyObject *
4974tracemalloc_untrack(PyObject *self, PyObject *args)
4975{
4976 unsigned int domain;
4977 PyObject *ptr_obj;
4978 void *ptr;
4979 int res;
4980
4981 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4982 return NULL;
4983 ptr = PyLong_AsVoidPtr(ptr_obj);
4984 if (PyErr_Occurred())
4985 return NULL;
4986
Victor Stinner5ea4c062017-06-20 17:46:36 +02004987 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004988 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004989 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004990 return NULL;
4991 }
4992
4993 Py_RETURN_NONE;
4994}
4995
4996static PyObject *
4997tracemalloc_get_traceback(PyObject *self, PyObject *args)
4998{
4999 unsigned int domain;
5000 PyObject *ptr_obj;
5001 void *ptr;
5002
5003 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
5004 return NULL;
5005 ptr = PyLong_AsVoidPtr(ptr_obj);
5006 if (PyErr_Occurred())
5007 return NULL;
5008
Benjamin Petersonca470632016-09-06 13:47:26 -07005009 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01005010}
5011
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005012static PyObject *
5013dict_get_version(PyObject *self, PyObject *args)
5014{
5015 PyDictObject *dict;
5016 uint64_t version;
5017
5018 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
5019 return NULL;
5020
5021 version = dict->ma_version_tag;
5022
Sergey Fedoseeva9ed91e2019-10-21 11:49:48 +05005023 Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(version));
5024 return PyLong_FromUnsignedLongLong((unsigned long long)version);
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005025}
5026
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005027
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005028static PyObject *
5029raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
5030{
5031 PyGenObject *gen;
5032
5033 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
5034 return NULL;
5035
5036 /* This is used in a test to check what happens if a signal arrives just
5037 as we're in the process of entering a yield from chain (see
5038 bpo-30039).
5039
5040 Needs to be done in C, because:
5041 - we don't have a Python wrapper for raise()
5042 - we need to make sure that the Python-level signal handler doesn't run
5043 *before* we enter the generator frame, which is impossible in Python
5044 because we check for signals before every bytecode operation.
5045 */
5046 raise(SIGINT);
5047 return _PyGen_Send(gen, Py_None);
5048}
5049
5050
Victor Stinner3b5cf852017-06-09 16:48:45 +02005051static int
5052fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
5053{
5054 if (args == Py_None) {
5055 *stack = NULL;
5056 *nargs = 0;
5057 }
5058 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01005059 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02005060 *nargs = PyTuple_GET_SIZE(args);
5061 }
5062 else {
5063 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
5064 return -1;
5065 }
5066 return 0;
5067}
5068
5069
5070static PyObject *
5071test_pyobject_fastcall(PyObject *self, PyObject *args)
5072{
5073 PyObject *func, *func_args;
5074 PyObject **stack;
5075 Py_ssize_t nargs;
5076
5077 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
5078 return NULL;
5079 }
5080
5081 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5082 return NULL;
5083 }
5084 return _PyObject_FastCall(func, stack, nargs);
5085}
5086
5087
5088static PyObject *
5089test_pyobject_fastcalldict(PyObject *self, PyObject *args)
5090{
5091 PyObject *func, *func_args, *kwargs;
5092 PyObject **stack;
5093 Py_ssize_t nargs;
5094
5095 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
5096 return NULL;
5097 }
5098
5099 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5100 return NULL;
5101 }
5102
5103 if (kwargs == Py_None) {
5104 kwargs = NULL;
5105 }
5106 else if (!PyDict_Check(kwargs)) {
5107 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
5108 return NULL;
5109 }
5110
Petr Viktorinffd97532020-02-11 17:46:57 +01005111 return PyObject_VectorcallDict(func, stack, nargs, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005112}
5113
5114
5115static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005116test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02005117{
5118 PyObject *func, *func_args, *kwnames = NULL;
5119 PyObject **stack;
5120 Py_ssize_t nargs, nkw;
5121
5122 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
5123 return NULL;
5124 }
5125
5126 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5127 return NULL;
5128 }
5129
5130 if (kwnames == Py_None) {
5131 kwnames = NULL;
5132 }
5133 else if (PyTuple_Check(kwnames)) {
5134 nkw = PyTuple_GET_SIZE(kwnames);
5135 if (nargs < nkw) {
5136 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
5137 return NULL;
5138 }
5139 nargs -= nkw;
5140 }
5141 else {
5142 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
5143 return NULL;
5144 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005145 return PyObject_Vectorcall(func, stack, nargs, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005146}
5147
5148
5149static PyObject *
5150test_pyvectorcall_call(PyObject *self, PyObject *args)
5151{
5152 PyObject *func;
5153 PyObject *argstuple;
5154 PyObject *kwargs = NULL;
5155
5156 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
5157 return NULL;
5158 }
5159
5160 if (!PyTuple_Check(argstuple)) {
5161 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
5162 return NULL;
5163 }
5164 if (kwargs != NULL && !PyDict_Check(kwargs)) {
5165 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
5166 return NULL;
5167 }
5168
5169 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005170}
5171
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005172
Victor Stinner64fa4492017-07-10 14:37:49 +02005173static PyObject*
5174stack_pointer(PyObject *self, PyObject *args)
5175{
5176 int v = 5;
5177 return PyLong_FromVoidPtr(&v);
5178}
5179
Victor Stinner3b5cf852017-06-09 16:48:45 +02005180
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005181#ifdef W_STOPCODE
5182static PyObject*
5183py_w_stopcode(PyObject *self, PyObject *args)
5184{
5185 int sig, status;
5186 if (!PyArg_ParseTuple(args, "i", &sig)) {
5187 return NULL;
5188 }
5189 status = W_STOPCODE(sig);
5190 return PyLong_FromLong(status);
5191}
5192#endif
5193
5194
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005195static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03005196get_mapping_keys(PyObject* self, PyObject *obj)
5197{
5198 return PyMapping_Keys(obj);
5199}
5200
5201static PyObject *
5202get_mapping_values(PyObject* self, PyObject *obj)
5203{
5204 return PyMapping_Values(obj);
5205}
5206
5207static PyObject *
5208get_mapping_items(PyObject* self, PyObject *obj)
5209{
5210 return PyMapping_Items(obj);
5211}
5212
5213
5214static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005215test_pythread_tss_key_state(PyObject *self, PyObject *args)
5216{
5217 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
5218 if (PyThread_tss_is_created(&tss_key)) {
5219 return raiseTestError("test_pythread_tss_key_state",
5220 "TSS key not in an uninitialized state at "
5221 "creation time");
5222 }
5223 if (PyThread_tss_create(&tss_key) != 0) {
5224 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
5225 return NULL;
5226 }
5227 if (!PyThread_tss_is_created(&tss_key)) {
5228 return raiseTestError("test_pythread_tss_key_state",
5229 "PyThread_tss_create succeeded, "
5230 "but with TSS key in an uninitialized state");
5231 }
5232 if (PyThread_tss_create(&tss_key) != 0) {
5233 return raiseTestError("test_pythread_tss_key_state",
5234 "PyThread_tss_create unsuccessful with "
5235 "an already initialized key");
5236 }
5237#define CHECK_TSS_API(expr) \
5238 (void)(expr); \
5239 if (!PyThread_tss_is_created(&tss_key)) { \
5240 return raiseTestError("test_pythread_tss_key_state", \
5241 "TSS key initialization state was not " \
5242 "preserved after calling " #expr); }
5243 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
5244 CHECK_TSS_API(PyThread_tss_get(&tss_key));
5245#undef CHECK_TSS_API
5246 PyThread_tss_delete(&tss_key);
5247 if (PyThread_tss_is_created(&tss_key)) {
5248 return raiseTestError("test_pythread_tss_key_state",
5249 "PyThread_tss_delete called, but did not "
5250 "set the key state to uninitialized");
5251 }
5252
5253 Py_tss_t *ptr_key = PyThread_tss_alloc();
5254 if (ptr_key == NULL) {
5255 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
5256 return NULL;
5257 }
5258 if (PyThread_tss_is_created(ptr_key)) {
5259 return raiseTestError("test_pythread_tss_key_state",
5260 "TSS key not in an uninitialized state at "
5261 "allocation time");
5262 }
5263 PyThread_tss_free(ptr_key);
5264 ptr_key = NULL;
5265 Py_RETURN_NONE;
5266}
5267
5268
Yury Selivanovf23746a2018-01-22 19:11:18 -05005269static PyObject*
5270new_hamt(PyObject *self, PyObject *args)
5271{
5272 return _PyContext_NewHamtForTests();
5273}
5274
5275
jdemeyer5a306202018-10-19 23:50:06 +02005276/* def bad_get(self, obj, cls):
5277 cls()
5278 return repr(self)
5279*/
5280static PyObject*
5281bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5282{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005283 PyObject *self, *obj, *cls;
5284 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02005285 return NULL;
5286 }
5287
Jeroen Demeyer7f41c8e2019-07-04 12:35:31 +02005288 PyObject *res = _PyObject_CallNoArg(cls);
jdemeyer5a306202018-10-19 23:50:06 +02005289 if (res == NULL) {
5290 return NULL;
5291 }
5292 Py_DECREF(res);
5293
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005294 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02005295}
5296
5297
Victor Stinner3d4226a2018-08-29 22:21:32 +02005298static PyObject *
5299encode_locale_ex(PyObject *self, PyObject *args)
5300{
5301 PyObject *unicode;
5302 int current_locale = 0;
5303 wchar_t *wstr;
5304 PyObject *res = NULL;
5305 const char *errors = NULL;
5306
5307 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
5308 return NULL;
5309 }
5310 wstr = PyUnicode_AsWideCharString(unicode, NULL);
5311 if (wstr == NULL) {
5312 return NULL;
5313 }
5314 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5315
5316 char *str = NULL;
5317 size_t error_pos;
5318 const char *reason = NULL;
5319 int ret = _Py_EncodeLocaleEx(wstr,
5320 &str, &error_pos, &reason,
5321 current_locale, error_handler);
5322 PyMem_Free(wstr);
5323
5324 switch(ret) {
5325 case 0:
5326 res = PyBytes_FromString(str);
5327 PyMem_RawFree(str);
5328 break;
5329 case -1:
5330 PyErr_NoMemory();
5331 break;
5332 case -2:
5333 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
5334 error_pos, reason);
5335 break;
5336 case -3:
5337 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5338 break;
5339 default:
5340 PyErr_SetString(PyExc_ValueError, "unknow error code");
5341 break;
5342 }
5343 return res;
5344}
5345
5346
5347static PyObject *
5348decode_locale_ex(PyObject *self, PyObject *args)
5349{
5350 char *str;
5351 int current_locale = 0;
5352 PyObject *res = NULL;
5353 const char *errors = NULL;
5354
5355 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
5356 return NULL;
5357 }
5358 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5359
5360 wchar_t *wstr = NULL;
5361 size_t wlen = 0;
5362 const char *reason = NULL;
5363 int ret = _Py_DecodeLocaleEx(str,
5364 &wstr, &wlen, &reason,
5365 current_locale, error_handler);
5366
5367 switch(ret) {
5368 case 0:
5369 res = PyUnicode_FromWideChar(wstr, wlen);
5370 PyMem_RawFree(wstr);
5371 break;
5372 case -1:
5373 PyErr_NoMemory();
5374 break;
5375 case -2:
5376 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
5377 wlen, reason);
5378 break;
5379 case -3:
5380 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5381 break;
5382 default:
5383 PyErr_SetString(PyExc_ValueError, "unknow error code");
5384 break;
5385 }
5386 return res;
5387}
5388
5389
Victor Stinner18618e652018-10-25 17:28:11 +02005390#ifdef Py_REF_DEBUG
5391static PyObject *
5392negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5393{
5394 PyObject *obj = PyUnicode_FromString("negative_refcount");
5395 if (obj == NULL) {
5396 return NULL;
5397 }
5398 assert(Py_REFCNT(obj) == 1);
5399
Victor Stinnerc86a1122020-02-07 01:24:29 +01005400 Py_SET_REFCNT(obj, 0);
Victor Stinner18618e652018-10-25 17:28:11 +02005401 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5402 Py_DECREF(obj);
5403
5404 Py_RETURN_NONE;
5405}
5406#endif
5407
5408
Victor Stinneref9d9b62019-05-22 11:28:22 +02005409static PyObject*
5410test_write_unraisable_exc(PyObject *self, PyObject *args)
5411{
Victor Stinner71c52e32019-05-27 08:57:14 +02005412 PyObject *exc, *err_msg, *obj;
5413 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005414 return NULL;
5415 }
5416
Victor Stinner71c52e32019-05-27 08:57:14 +02005417 const char *err_msg_utf8;
5418 if (err_msg != Py_None) {
5419 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5420 if (err_msg_utf8 == NULL) {
5421 return NULL;
5422 }
5423 }
5424 else {
5425 err_msg_utf8 = NULL;
5426 }
5427
Victor Stinneref9d9b62019-05-22 11:28:22 +02005428 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005429 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005430 Py_RETURN_NONE;
5431}
5432
5433
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005434static PyObject *
5435sequence_getitem(PyObject *self, PyObject *args)
5436{
5437 PyObject *seq;
5438 Py_ssize_t i;
5439 if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
5440 return NULL;
5441 }
5442 return PySequence_GetItem(seq, i);
5443}
5444
5445
Petr Viktorinf9583772019-09-10 12:21:09 +01005446/* Functions for testing C calling conventions (METH_*) are named meth_*,
5447 * e.g. "meth_varargs" for METH_VARARGS.
5448 *
5449 * They all return a tuple of their C-level arguments, with None instead
5450 * of NULL and Python tuples instead of C arrays.
5451 */
5452
5453
5454static PyObject*
5455_null_to_none(PyObject* obj)
5456{
5457 if (obj == NULL) {
5458 Py_RETURN_NONE;
5459 }
5460 Py_INCREF(obj);
5461 return obj;
5462}
5463
5464static PyObject*
5465meth_varargs(PyObject* self, PyObject* args)
5466{
5467 return Py_BuildValue("NO", _null_to_none(self), args);
5468}
5469
5470static PyObject*
5471meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs)
5472{
5473 return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs));
5474}
5475
5476static PyObject*
5477meth_o(PyObject* self, PyObject* obj)
5478{
5479 return Py_BuildValue("NO", _null_to_none(self), obj);
5480}
5481
5482static PyObject*
5483meth_noargs(PyObject* self, PyObject* ignored)
5484{
5485 return _null_to_none(self);
5486}
5487
5488static PyObject*
5489_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs)
5490{
5491 PyObject *tuple = PyTuple_New(nargs);
5492 if (tuple == NULL) {
5493 return NULL;
5494 }
5495 for (Py_ssize_t i=0; i < nargs; i++) {
5496 Py_INCREF(args[i]);
5497 PyTuple_SET_ITEM(tuple, i, args[i]);
5498 }
5499 return tuple;
5500}
5501
5502static PyObject*
5503meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
5504{
5505 return Py_BuildValue(
5506 "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs)
5507 );
5508}
5509
5510static PyObject*
5511meth_fastcall_keywords(PyObject* self, PyObject* const* args,
5512 Py_ssize_t nargs, PyObject* kwargs)
5513{
5514 PyObject *pyargs = _fastcall_to_tuple(args, nargs);
5515 if (pyargs == NULL) {
5516 return NULL;
5517 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005518 PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type,
Petr Viktorinf9583772019-09-10 12:21:09 +01005519 args + nargs, 0, kwargs);
5520 return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
5521}
5522
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005523
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005524static PyObject*
5525pynumber_tobase(PyObject *module, PyObject *args)
5526{
5527 PyObject *obj;
5528 int base;
5529 if (!PyArg_ParseTuple(args, "Oi:pynumber_tobase",
5530 &obj, &base)) {
5531 return NULL;
5532 }
5533 return PyNumber_ToBase(obj, base);
5534}
5535
5536
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005537static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
5538
Tim Peters9ea17ac2001-02-02 05:57:15 +00005539static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305541 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005542 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305543 {"test_config", test_config, METH_NOARGS},
5544 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005545 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005546 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5547 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5548 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5549 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5550 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5551 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005552 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005553 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005554 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5555 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5556 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5557 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5558 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5559 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005560 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5561 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03005562 {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
5563 {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
5564 {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
5565 {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
Stefan Krah39042e02020-08-10 16:32:21 +02005566 {"decimal_is_special", decimal_is_special, METH_O},
5567 {"decimal_is_nan", decimal_is_nan, METH_O},
5568 {"decimal_is_infinite", decimal_is_infinite, METH_O},
5569 {"decimal_get_digits", decimal_get_digits, METH_O},
5570 {"decimal_as_triple", decimal_as_triple, METH_O},
5571 {"decimal_from_triple", decimal_from_triple, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305572 {"test_list_api", test_list_api, METH_NOARGS},
5573 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005574 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005575 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305576 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5577 {"test_long_api", test_long_api, METH_NOARGS},
5578 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5579 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5580 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5581 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005582 {"test_structseq_newtype_doesnt_leak",
5583 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305584 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5585 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5586 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5587 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
Zackery Spytzdc247652019-06-06 14:39:23 -06005588 {"test_long_as_unsigned_long_long_mask",
5589 test_long_as_unsigned_long_long_mask, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305590 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5591 {"test_k_code", test_k_code, METH_NOARGS},
5592 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005593 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305594 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305596 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305598 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5599 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5600 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005601 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005602 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005603#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005604 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005605#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005606 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03005607 {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005608 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005609 {"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03005610 {"get_args", get_args, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005611 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005613 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005615 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005616 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005617 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005618 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005619 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 {"getargs_b", getargs_b, METH_VARARGS},
5621 {"getargs_B", getargs_B, METH_VARARGS},
5622 {"getargs_h", getargs_h, METH_VARARGS},
5623 {"getargs_H", getargs_H, METH_VARARGS},
5624 {"getargs_I", getargs_I, METH_VARARGS},
5625 {"getargs_k", getargs_k, METH_VARARGS},
5626 {"getargs_i", getargs_i, METH_VARARGS},
5627 {"getargs_l", getargs_l, METH_VARARGS},
5628 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005629 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005630 {"getargs_L", getargs_L, METH_VARARGS},
5631 {"getargs_K", getargs_K, METH_VARARGS},
5632 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305633 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5634 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005635 {"getargs_f", getargs_f, METH_VARARGS},
5636 {"getargs_d", getargs_d, METH_VARARGS},
5637 {"getargs_D", getargs_D, METH_VARARGS},
5638 {"getargs_S", getargs_S, METH_VARARGS},
5639 {"getargs_Y", getargs_Y, METH_VARARGS},
5640 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005641 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005642 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005643 {"getargs_s", getargs_s, METH_VARARGS},
5644 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5645 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
5646 {"getargs_z", getargs_z, METH_VARARGS},
5647 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5648 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5649 {"getargs_y", getargs_y, METH_VARARGS},
5650 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5651 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5652 {"getargs_u", getargs_u, METH_VARARGS},
5653 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5654 {"getargs_Z", getargs_Z, METH_VARARGS},
5655 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005656 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005657 {"getargs_es", getargs_es, METH_VARARGS},
5658 {"getargs_et", getargs_et, METH_VARARGS},
5659 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5660 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005662 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005663 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005664 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305665 {"test_s_code", test_s_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005666#if USE_UNICODE_WCHAR_CACHE
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305667 {"test_u_code", test_u_code, METH_NOARGS},
5668 {"test_Z_code", test_Z_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005669#endif /* USE_UNICODE_WCHAR_CACHE */
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305670 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005671 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5672 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005673 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Hai Shi5623ac82019-07-20 02:56:23 -05005674 {"unicode_asutf8", unicode_asutf8, METH_VARARGS},
5675 {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005676 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005677 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005678#if USE_UNICODE_WCHAR_CACHE
Victor Stinner42bf7752011-11-21 22:52:58 +01005679 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5680 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005681 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005682#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinner1c24bd02010-10-02 11:03:13 +00005683 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005684 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005685#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005686 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005687#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005688 {"traceback_print", traceback_print, METH_VARARGS},
5689 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005690 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005691 {"argparsing", argparsing, METH_VARARGS},
5692 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005693 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305695 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005696 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305697 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005698 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005699 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5700 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005701 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005702 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005703 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305704 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5705 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5706 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5707 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005708 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5709 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305710 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005711 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005712 {"no_docstring",
5713 (PyCFunction)test_with_docstring, METH_NOARGS},
5714 {"docstring_empty",
5715 (PyCFunction)test_with_docstring, METH_NOARGS,
5716 docstring_empty},
5717 {"docstring_no_signature",
5718 (PyCFunction)test_with_docstring, METH_NOARGS,
5719 docstring_no_signature},
5720 {"docstring_with_invalid_signature",
5721 (PyCFunction)test_with_docstring, METH_NOARGS,
5722 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005723 {"docstring_with_invalid_signature2",
5724 (PyCFunction)test_with_docstring, METH_NOARGS,
5725 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005726 {"docstring_with_signature",
5727 (PyCFunction)test_with_docstring, METH_NOARGS,
5728 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005729 {"docstring_with_signature_but_no_doc",
5730 (PyCFunction)test_with_docstring, METH_NOARGS,
5731 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005732 {"docstring_with_signature_and_extra_newlines",
5733 (PyCFunction)test_with_docstring, METH_NOARGS,
5734 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005735 {"docstring_with_signature_with_defaults",
5736 (PyCFunction)test_with_docstring, METH_NOARGS,
5737 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005738 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5739 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005740 {"pymarshal_write_long_to_file",
5741 pymarshal_write_long_to_file, METH_VARARGS},
5742 {"pymarshal_write_object_to_file",
5743 pymarshal_write_object_to_file, METH_VARARGS},
5744 {"pymarshal_read_short_from_file",
5745 pymarshal_read_short_from_file, METH_VARARGS},
5746 {"pymarshal_read_long_from_file",
5747 pymarshal_read_long_from_file, METH_VARARGS},
5748 {"pymarshal_read_last_object_from_file",
5749 pymarshal_read_last_object_from_file, METH_VARARGS},
5750 {"pymarshal_read_object_from_file",
5751 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01005752 {"return_null_without_error",
5753 return_null_without_error, METH_NOARGS},
5754 {"return_result_with_error",
5755 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02005756 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005757 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5758 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005759 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005760#ifdef HAVE_CLOCK_GETTIME
5761 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5762#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005763 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5764 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01005765 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5766 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005767 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005768 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner68762572019-10-07 18:42:01 +02005769 {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02005770 {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
5771 {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
5772 {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005773 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005774 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5775 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5776 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005777 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005778 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005779 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5780 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005781 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5782 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005783 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005784#ifdef W_STOPCODE
5785 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5786#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005787 {"get_mapping_keys", get_mapping_keys, METH_O},
5788 {"get_mapping_values", get_mapping_values, METH_O},
5789 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005790 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005791 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005792 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005793 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5794 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005795#ifdef Py_REF_DEBUG
5796 {"negative_refcount", negative_refcount, METH_NOARGS},
5797#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005798 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005799 {"sequence_getitem", sequence_getitem, METH_VARARGS},
Petr Viktorinf9583772019-09-10 12:21:09 +01005800 {"meth_varargs", meth_varargs, METH_VARARGS},
5801 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
5802 {"meth_o", meth_o, METH_O},
5803 {"meth_noargs", meth_noargs, METH_NOARGS},
5804 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
5805 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005806 {"pynumber_tobase", pynumber_tobase, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005808};
5809
Thomas Hellera4ea6032003-04-17 18:55:45 +00005810#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5811
Thomas Wouters89f507f2006-12-13 04:49:30 +00005812typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005813 char bool_member;
5814 char byte_member;
5815 unsigned char ubyte_member;
5816 short short_member;
5817 unsigned short ushort_member;
5818 int int_member;
5819 unsigned int uint_member;
5820 long long_member;
5821 unsigned long ulong_member;
5822 Py_ssize_t pyssizet_member;
5823 float float_member;
5824 double double_member;
5825 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005826 long long longlong_member;
5827 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005828} all_structmembers;
5829
5830typedef struct {
5831 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005833} test_structmembers;
5834
5835static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005836 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5837 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5838 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5839 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5840 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5841 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5842 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5843 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5844 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5845 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5846 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5847 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5848 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005849 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5850 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005851 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005852};
5853
5854
Christian Heimes1af737c2008-01-23 08:24:23 +00005855static PyObject *
5856test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005858 static char *keywords[] = {
5859 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5860 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5861 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005864 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865 test_structmembers *ob;
5866 const char *s = NULL;
5867 Py_ssize_t string_len = 0;
5868 ob = PyObject_New(test_structmembers, type);
5869 if (ob == NULL)
5870 return NULL;
5871 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5872 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5873 &ob->structmembers.bool_member,
5874 &ob->structmembers.byte_member,
5875 &ob->structmembers.ubyte_member,
5876 &ob->structmembers.short_member,
5877 &ob->structmembers.ushort_member,
5878 &ob->structmembers.int_member,
5879 &ob->structmembers.uint_member,
5880 &ob->structmembers.long_member,
5881 &ob->structmembers.ulong_member,
5882 &ob->structmembers.pyssizet_member,
5883 &ob->structmembers.float_member,
5884 &ob->structmembers.double_member,
5885 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005886 , &ob->structmembers.longlong_member,
5887 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888 )) {
5889 Py_DECREF(ob);
5890 return NULL;
5891 }
5892 if (s != NULL) {
5893 if (string_len > 5) {
5894 Py_DECREF(ob);
5895 PyErr_SetString(PyExc_ValueError, "string too long");
5896 return NULL;
5897 }
5898 strcpy(ob->structmembers.inplace_member, s);
5899 }
5900 else {
5901 strcpy(ob->structmembers.inplace_member, "");
5902 }
5903 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005904}
5905
Christian Heimes1af737c2008-01-23 08:24:23 +00005906static void
5907test_structmembers_free(PyObject *ob)
5908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005909 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005910}
5911
5912static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005913 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005914 "test_structmembersType",
5915 sizeof(test_structmembers), /* tp_basicsize */
5916 0, /* tp_itemsize */
5917 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005918 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919 0, /* tp_getattr */
5920 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005921 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922 0, /* tp_repr */
5923 0, /* tp_as_number */
5924 0, /* tp_as_sequence */
5925 0, /* tp_as_mapping */
5926 0, /* tp_hash */
5927 0, /* tp_call */
5928 0, /* tp_str */
5929 PyObject_GenericGetAttr, /* tp_getattro */
5930 PyObject_GenericSetAttr, /* tp_setattro */
5931 0, /* tp_as_buffer */
5932 0, /* tp_flags */
5933 "Type containing all structmember types",
5934 0, /* traverseproc tp_traverse */
5935 0, /* tp_clear */
5936 0, /* tp_richcompare */
5937 0, /* tp_weaklistoffset */
5938 0, /* tp_iter */
5939 0, /* tp_iternext */
5940 0, /* tp_methods */
5941 test_members, /* tp_members */
5942 0,
5943 0,
5944 0,
5945 0,
5946 0,
5947 0,
5948 0,
5949 0,
5950 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005951};
5952
5953
Benjamin Petersond51374e2014-04-09 23:55:56 -04005954typedef struct {
5955 PyObject_HEAD
5956} matmulObject;
5957
5958static PyObject *
5959matmulType_matmul(PyObject *self, PyObject *other)
5960{
5961 return Py_BuildValue("(sOO)", "matmul", self, other);
5962}
5963
5964static PyObject *
5965matmulType_imatmul(PyObject *self, PyObject *other)
5966{
5967 return Py_BuildValue("(sOO)", "imatmul", self, other);
5968}
5969
5970static void
5971matmulType_dealloc(PyObject *self)
5972{
Zachary Ware420dc562014-04-23 13:51:27 -05005973 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005974}
5975
5976static PyNumberMethods matmulType_as_number = {
5977 0, /* nb_add */
5978 0, /* nb_subtract */
5979 0, /* nb_multiply */
5980 0, /* nb_remainde r*/
5981 0, /* nb_divmod */
5982 0, /* nb_power */
5983 0, /* nb_negative */
5984 0, /* tp_positive */
5985 0, /* tp_absolute */
5986 0, /* tp_bool */
5987 0, /* nb_invert */
5988 0, /* nb_lshift */
5989 0, /* nb_rshift */
5990 0, /* nb_and */
5991 0, /* nb_xor */
5992 0, /* nb_or */
5993 0, /* nb_int */
5994 0, /* nb_reserved */
5995 0, /* nb_float */
5996 0, /* nb_inplace_add */
5997 0, /* nb_inplace_subtract */
5998 0, /* nb_inplace_multiply */
5999 0, /* nb_inplace_remainder */
6000 0, /* nb_inplace_power */
6001 0, /* nb_inplace_lshift */
6002 0, /* nb_inplace_rshift */
6003 0, /* nb_inplace_and */
6004 0, /* nb_inplace_xor */
6005 0, /* nb_inplace_or */
6006 0, /* nb_floor_divide */
6007 0, /* nb_true_divide */
6008 0, /* nb_inplace_floor_divide */
6009 0, /* nb_inplace_true_divide */
6010 0, /* nb_index */
6011 matmulType_matmul, /* nb_matrix_multiply */
6012 matmulType_imatmul /* nb_matrix_inplace_multiply */
6013};
6014
6015static PyTypeObject matmulType = {
6016 PyVarObject_HEAD_INIT(NULL, 0)
6017 "matmulType",
6018 sizeof(matmulObject), /* tp_basicsize */
6019 0, /* tp_itemsize */
6020 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006021 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04006022 0, /* tp_getattr */
6023 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006024 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04006025 0, /* tp_repr */
6026 &matmulType_as_number, /* tp_as_number */
6027 0, /* tp_as_sequence */
6028 0, /* tp_as_mapping */
6029 0, /* tp_hash */
6030 0, /* tp_call */
6031 0, /* tp_str */
6032 PyObject_GenericGetAttr, /* tp_getattro */
6033 PyObject_GenericSetAttr, /* tp_setattro */
6034 0, /* tp_as_buffer */
6035 0, /* tp_flags */
6036 "C level type with matrix operations defined",
6037 0, /* traverseproc tp_traverse */
6038 0, /* tp_clear */
6039 0, /* tp_richcompare */
6040 0, /* tp_weaklistoffset */
6041 0, /* tp_iter */
6042 0, /* tp_iternext */
6043 0, /* tp_methods */
6044 0, /* tp_members */
6045 0,
6046 0,
6047 0,
6048 0,
6049 0,
6050 0,
6051 0,
6052 0,
6053 PyType_GenericNew, /* tp_new */
6054 PyObject_Del, /* tp_free */
6055};
6056
Zackery Spytzc7f803b2019-05-31 03:46:36 -06006057typedef struct {
6058 PyObject_HEAD
6059} ipowObject;
6060
6061static PyObject *
6062ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
6063{
6064 return Py_BuildValue("OO", other, mod);
6065}
6066
6067static PyNumberMethods ipowType_as_number = {
6068 .nb_inplace_power = ipowType_ipow
6069};
6070
6071static PyTypeObject ipowType = {
6072 PyVarObject_HEAD_INIT(NULL, 0)
6073 .tp_name = "ipowType",
6074 .tp_basicsize = sizeof(ipowObject),
6075 .tp_as_number = &ipowType_as_number,
6076 .tp_new = PyType_GenericNew
6077};
Martin v. Löwis1a214512008-06-11 05:26:20 +00006078
Yury Selivanov75445082015-05-11 22:57:16 -04006079typedef struct {
6080 PyObject_HEAD
6081 PyObject *ao_iterator;
6082} awaitObject;
6083
6084
6085static PyObject *
6086awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6087{
6088 PyObject *v;
6089 awaitObject *ao;
6090
6091 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
6092 return NULL;
6093
6094 ao = (awaitObject *)type->tp_alloc(type, 0);
6095 if (ao == NULL) {
6096 return NULL;
6097 }
6098
6099 Py_INCREF(v);
6100 ao->ao_iterator = v;
6101
6102 return (PyObject *)ao;
6103}
6104
6105
6106static void
6107awaitObject_dealloc(awaitObject *ao)
6108{
6109 Py_CLEAR(ao->ao_iterator);
6110 Py_TYPE(ao)->tp_free(ao);
6111}
6112
6113
6114static PyObject *
6115awaitObject_await(awaitObject *ao)
6116{
6117 Py_INCREF(ao->ao_iterator);
6118 return ao->ao_iterator;
6119}
6120
6121static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04006122 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04006123 0, /* am_aiter */
6124 0 /* am_anext */
6125};
6126
6127
6128static PyTypeObject awaitType = {
6129 PyVarObject_HEAD_INIT(NULL, 0)
6130 "awaitType",
6131 sizeof(awaitObject), /* tp_basicsize */
6132 0, /* tp_itemsize */
6133 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006134 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04006135 0, /* tp_getattr */
6136 0, /* tp_setattr */
6137 &awaitType_as_async, /* tp_as_async */
6138 0, /* tp_repr */
6139 0, /* tp_as_number */
6140 0, /* tp_as_sequence */
6141 0, /* tp_as_mapping */
6142 0, /* tp_hash */
6143 0, /* tp_call */
6144 0, /* tp_str */
6145 PyObject_GenericGetAttr, /* tp_getattro */
6146 PyObject_GenericSetAttr, /* tp_setattro */
6147 0, /* tp_as_buffer */
6148 0, /* tp_flags */
6149 "C level type with tp_as_async",
6150 0, /* traverseproc tp_traverse */
6151 0, /* tp_clear */
6152 0, /* tp_richcompare */
6153 0, /* tp_weaklistoffset */
6154 0, /* tp_iter */
6155 0, /* tp_iternext */
6156 0, /* tp_methods */
6157 0, /* tp_members */
6158 0,
6159 0,
6160 0,
6161 0,
6162 0,
6163 0,
6164 0,
6165 0,
6166 awaitObject_new, /* tp_new */
6167 PyObject_Del, /* tp_free */
6168};
6169
6170
xdegaye56d1f5c2017-10-26 15:09:06 +02006171static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
6172
6173static PyTypeObject PyRecursingInfinitelyError_Type = {
6174 PyVarObject_HEAD_INIT(NULL, 0)
6175 "RecursingInfinitelyError", /* tp_name */
6176 sizeof(PyBaseExceptionObject), /* tp_basicsize */
6177 0, /* tp_itemsize */
6178 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006179 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02006180 0, /* tp_getattr */
6181 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006182 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02006183 0, /* tp_repr */
6184 0, /* tp_as_number */
6185 0, /* tp_as_sequence */
6186 0, /* tp_as_mapping */
6187 0, /* tp_hash */
6188 0, /* tp_call */
6189 0, /* tp_str */
6190 0, /* tp_getattro */
6191 0, /* tp_setattro */
6192 0, /* tp_as_buffer */
6193 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6194 "Instantiating this exception starts infinite recursion.", /* tp_doc */
6195 0, /* tp_traverse */
6196 0, /* tp_clear */
6197 0, /* tp_richcompare */
6198 0, /* tp_weaklistoffset */
6199 0, /* tp_iter */
6200 0, /* tp_iternext */
6201 0, /* tp_methods */
6202 0, /* tp_members */
6203 0, /* tp_getset */
6204 0, /* tp_base */
6205 0, /* tp_dict */
6206 0, /* tp_descr_get */
6207 0, /* tp_descr_set */
6208 0, /* tp_dictoffset */
6209 (initproc)recurse_infinitely_error_init, /* tp_init */
6210 0, /* tp_alloc */
6211 0, /* tp_new */
6212};
6213
6214static int
6215recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
6216{
6217 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
6218
6219 /* Instantiating this exception starts infinite recursion. */
6220 Py_INCREF(type);
6221 PyErr_SetObject(type, NULL);
6222 return -1;
6223}
6224
6225
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006226/* Test bpo-35983: create a subclass of "list" which checks that instances
6227 * are not deallocated twice */
6228
6229typedef struct {
6230 PyListObject list;
6231 int deallocated;
6232} MyListObject;
6233
6234static PyObject *
6235MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6236{
6237 PyObject* op = PyList_Type.tp_new(type, args, kwds);
6238 ((MyListObject*)op)->deallocated = 0;
6239 return op;
6240}
6241
6242void
6243MyList_dealloc(MyListObject* op)
6244{
6245 if (op->deallocated) {
6246 /* We cannot raise exceptions here but we still want the testsuite
6247 * to fail when we hit this */
6248 Py_FatalError("MyList instance deallocated twice");
6249 }
6250 op->deallocated = 1;
6251 PyList_Type.tp_dealloc((PyObject *)op);
6252}
6253
6254static PyTypeObject MyList_Type = {
6255 PyVarObject_HEAD_INIT(NULL, 0)
6256 "MyList",
6257 sizeof(MyListObject),
6258 0,
6259 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006260 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006261 0, /* tp_getattr */
6262 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006263 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006264 0, /* tp_repr */
6265 0, /* tp_as_number */
6266 0, /* tp_as_sequence */
6267 0, /* tp_as_mapping */
6268 0, /* tp_hash */
6269 0, /* tp_call */
6270 0, /* tp_str */
6271 0, /* tp_getattro */
6272 0, /* tp_setattro */
6273 0, /* tp_as_buffer */
6274 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6275 0, /* tp_doc */
6276 0, /* tp_traverse */
6277 0, /* tp_clear */
6278 0, /* tp_richcompare */
6279 0, /* tp_weaklistoffset */
6280 0, /* tp_iter */
6281 0, /* tp_iternext */
6282 0, /* tp_methods */
6283 0, /* tp_members */
6284 0, /* tp_getset */
6285 0, /* &PyList_Type */ /* tp_base */
6286 0, /* tp_dict */
6287 0, /* tp_descr_get */
6288 0, /* tp_descr_set */
6289 0, /* tp_dictoffset */
6290 0, /* tp_init */
6291 0, /* tp_alloc */
6292 MyList_new, /* tp_new */
6293};
6294
6295
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006296/* Test PEP 560 */
6297
6298typedef struct {
6299 PyObject_HEAD
6300 PyObject *item;
6301} PyGenericAliasObject;
6302
6303static void
6304generic_alias_dealloc(PyGenericAliasObject *self)
6305{
6306 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01006307 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006308}
6309
6310static PyObject *
6311generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
6312{
6313 return PyTuple_Pack(1, self->item);
6314}
6315
6316static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006317 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006318 {NULL} /* sentinel */
6319};
6320
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006321static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006322 PyVarObject_HEAD_INIT(NULL, 0)
6323 "GenericAlias",
6324 sizeof(PyGenericAliasObject),
6325 0,
6326 .tp_dealloc = (destructor)generic_alias_dealloc,
6327 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6328 .tp_methods = generic_alias_methods,
6329};
6330
6331static PyObject *
6332generic_alias_new(PyObject *item)
6333{
6334 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
6335 if (o == NULL) {
6336 return NULL;
6337 }
6338 Py_INCREF(item);
6339 o->item = item;
6340 return (PyObject*) o;
6341}
6342
6343typedef struct {
6344 PyObject_HEAD
6345} PyGenericObject;
6346
6347static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006348generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006349{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006350 return generic_alias_new(item);
6351}
6352
6353static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006354 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006355 {NULL} /* sentinel */
6356};
6357
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006358static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006359 PyVarObject_HEAD_INIT(NULL, 0)
6360 "Generic",
6361 sizeof(PyGenericObject),
6362 0,
6363 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6364 .tp_methods = generic_methods,
6365};
6366
6367
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006368/* Test PEP 590 */
6369
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006370typedef struct {
6371 PyObject_HEAD
6372 vectorcallfunc vectorcall;
6373} MethodDescriptorObject;
6374
6375static PyObject *
6376MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
6377 size_t nargsf, PyObject *kwnames)
6378{
6379 /* True if using the vectorcall function in MethodDescriptorObject
6380 * but False for MethodDescriptor2Object */
6381 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
6382 return PyBool_FromLong(md->vectorcall != NULL);
6383}
6384
6385static PyObject *
6386MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6387{
Petr Viktorine584cbf2019-06-03 01:08:14 +02006388 MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006389 op->vectorcall = MethodDescriptor_vectorcall;
6390 return (PyObject *)op;
6391}
6392
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006393static PyObject *
6394func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6395{
6396 if (obj == Py_None || obj == NULL) {
6397 Py_INCREF(func);
6398 return func;
6399 }
6400 return PyMethod_New(func, obj);
6401}
6402
6403static PyObject *
6404nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6405{
6406 Py_INCREF(func);
6407 return func;
6408}
6409
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006410static PyObject *
6411call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
6412{
6413 Py_INCREF(args);
6414 return args;
6415}
6416
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006417static PyTypeObject MethodDescriptorBase_Type = {
6418 PyVarObject_HEAD_INIT(NULL, 0)
6419 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006420 sizeof(MethodDescriptorObject),
6421 .tp_new = MethodDescriptor_new,
6422 .tp_call = PyVectorcall_Call,
6423 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
6424 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Petr Viktorinffd97532020-02-11 17:46:57 +01006425 Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006426 .tp_descr_get = func_descr_get,
6427};
6428
6429static PyTypeObject MethodDescriptorDerived_Type = {
6430 PyVarObject_HEAD_INIT(NULL, 0)
6431 "MethodDescriptorDerived",
6432 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6433};
6434
6435static PyTypeObject MethodDescriptorNopGet_Type = {
6436 PyVarObject_HEAD_INIT(NULL, 0)
6437 "MethodDescriptorNopGet",
6438 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006439 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006440 .tp_descr_get = nop_descr_get,
6441};
6442
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006443typedef struct {
6444 MethodDescriptorObject base;
6445 vectorcallfunc vectorcall;
6446} MethodDescriptor2Object;
6447
6448static PyObject *
6449MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6450{
6451 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
6452 op->base.vectorcall = NULL;
6453 op->vectorcall = MethodDescriptor_vectorcall;
6454 return (PyObject *)op;
6455}
6456
6457static PyTypeObject MethodDescriptor2_Type = {
6458 PyVarObject_HEAD_INIT(NULL, 0)
6459 "MethodDescriptor2",
6460 sizeof(MethodDescriptor2Object),
6461 .tp_new = MethodDescriptor2_new,
6462 .tp_call = PyVectorcall_Call,
6463 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
Petr Viktorinffd97532020-02-11 17:46:57 +01006464 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006465};
6466
Benjamin Peterson39403332020-09-02 11:29:06 -05006467PyDoc_STRVAR(heapdocctype__doc__,
6468"HeapDocCType(arg1, arg2)\n"
6469"--\n"
6470"\n"
6471"somedoc");
6472
6473typedef struct {
6474 PyObject_HEAD
6475} HeapDocCTypeObject;
6476
6477static PyType_Slot HeapDocCType_slots[] = {
6478 {Py_tp_doc, (char*)heapdocctype__doc__},
6479 {0},
6480};
6481
6482static PyType_Spec HeapDocCType_spec = {
6483 "_testcapi.HeapDocCType",
6484 sizeof(HeapDocCTypeObject),
6485 0,
6486 Py_TPFLAGS_DEFAULT,
6487 HeapDocCType_slots
6488};
6489
6490
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006491PyDoc_STRVAR(heapgctype__doc__,
6492"A heap type with GC, and with overridden dealloc.\n\n"
6493"The 'value' attribute is set to 10 in __init__.");
6494
6495typedef struct {
6496 PyObject_HEAD
6497 int value;
6498} HeapCTypeObject;
6499
6500static struct PyMemberDef heapctype_members[] = {
6501 {"value", T_INT, offsetof(HeapCTypeObject, value)},
6502 {NULL} /* Sentinel */
6503};
6504
6505static int
6506heapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
6507{
6508 ((HeapCTypeObject *)self)->value = 10;
6509 return 0;
6510}
6511
6512static void
6513heapgcctype_dealloc(HeapCTypeObject *self)
6514{
6515 PyTypeObject *tp = Py_TYPE(self);
6516 PyObject_GC_UnTrack(self);
6517 PyObject_GC_Del(self);
6518 Py_DECREF(tp);
6519}
6520
6521static PyType_Slot HeapGcCType_slots[] = {
6522 {Py_tp_init, heapctype_init},
6523 {Py_tp_members, heapctype_members},
6524 {Py_tp_dealloc, heapgcctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006525 {Py_tp_doc, (char*)heapgctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006526 {0, 0},
6527};
6528
6529static PyType_Spec HeapGcCType_spec = {
6530 "_testcapi.HeapGcCType",
6531 sizeof(HeapCTypeObject),
6532 0,
6533 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6534 HeapGcCType_slots
6535};
6536
6537PyDoc_STRVAR(heapctype__doc__,
6538"A heap type without GC, but with overridden dealloc.\n\n"
6539"The 'value' attribute is set to 10 in __init__.");
6540
6541static void
6542heapctype_dealloc(HeapCTypeObject *self)
6543{
6544 PyTypeObject *tp = Py_TYPE(self);
6545 PyObject_Del(self);
6546 Py_DECREF(tp);
6547}
6548
6549static PyType_Slot HeapCType_slots[] = {
6550 {Py_tp_init, heapctype_init},
6551 {Py_tp_members, heapctype_members},
6552 {Py_tp_dealloc, heapctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006553 {Py_tp_doc, (char*)heapctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006554 {0, 0},
6555};
6556
6557static PyType_Spec HeapCType_spec = {
6558 "_testcapi.HeapCType",
6559 sizeof(HeapCTypeObject),
6560 0,
6561 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6562 HeapCType_slots
6563};
6564
6565PyDoc_STRVAR(heapctypesubclass__doc__,
6566"Subclass of HeapCType, without GC.\n\n"
6567"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6568
6569typedef struct {
6570 HeapCTypeObject base;
6571 int value2;
6572} HeapCTypeSubclassObject;
6573
6574static int
6575heapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
6576{
6577 /* Call __init__ of the superclass */
6578 if (heapctype_init(self, args, kwargs) < 0) {
6579 return -1;
6580 }
6581 /* Initialize additional element */
6582 ((HeapCTypeSubclassObject *)self)->value2 = 20;
6583 return 0;
6584}
6585
6586static struct PyMemberDef heapctypesubclass_members[] = {
6587 {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
6588 {NULL} /* Sentinel */
6589};
6590
6591static PyType_Slot HeapCTypeSubclass_slots[] = {
6592 {Py_tp_init, heapctypesubclass_init},
6593 {Py_tp_members, heapctypesubclass_members},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006594 {Py_tp_doc, (char*)heapctypesubclass__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006595 {0, 0},
6596};
6597
6598static PyType_Spec HeapCTypeSubclass_spec = {
6599 "_testcapi.HeapCTypeSubclass",
6600 sizeof(HeapCTypeSubclassObject),
6601 0,
6602 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6603 HeapCTypeSubclass_slots
6604};
6605
scoderf7c4e232020-06-06 21:35:10 +02006606PyDoc_STRVAR(heapctypewithbuffer__doc__,
6607"Heap type with buffer support.\n\n"
6608"The buffer is set to [b'1', b'2', b'3', b'4']");
6609
6610typedef struct {
6611 HeapCTypeObject base;
6612 char buffer[4];
6613} HeapCTypeWithBufferObject;
6614
6615static int
6616heapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags)
6617{
6618 self->buffer[0] = '1';
6619 self->buffer[1] = '2';
6620 self->buffer[2] = '3';
6621 self->buffer[3] = '4';
6622 return PyBuffer_FillInfo(
6623 view, (PyObject*)self, (void *)self->buffer, 4, 1, flags);
6624}
6625
Rémi Lapeyreb8867e52020-06-07 09:05:33 +02006626static void
scoderf7c4e232020-06-06 21:35:10 +02006627heapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view)
6628{
6629 assert(view->obj == (void*) self);
6630}
6631
6632static PyType_Slot HeapCTypeWithBuffer_slots[] = {
6633 {Py_bf_getbuffer, heapctypewithbuffer_getbuffer},
6634 {Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer},
6635 {Py_tp_doc, (char*)heapctypewithbuffer__doc__},
6636 {0, 0},
6637};
6638
6639static PyType_Spec HeapCTypeWithBuffer_spec = {
6640 "_testcapi.HeapCTypeWithBuffer",
6641 sizeof(HeapCTypeWithBufferObject),
6642 0,
6643 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6644 HeapCTypeWithBuffer_slots
6645};
6646
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006647PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
6648"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
6649"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
6650"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6651
6652static int
6653heapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
6654{
6655 PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
6656 initproc base_init = PyType_GetSlot(base, Py_tp_init);
6657 base_init(self, args, kwargs);
6658 return 0;
6659}
6660
6661static void
6662heapctypesubclasswithfinalizer_finalize(PyObject *self)
6663{
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006664 PyObject *error_type, *error_value, *error_traceback, *m;
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006665 PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006666
6667 /* Save the current exception, if any. */
6668 PyErr_Fetch(&error_type, &error_value, &error_traceback);
6669
6670 m = PyState_FindModule(&_testcapimodule);
6671 if (m == NULL) {
6672 goto cleanup_finalize;
6673 }
6674 oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
6675 newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
6676 if (oldtype == NULL || newtype == NULL) {
6677 goto cleanup_finalize;
6678 }
6679
6680 if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
6681 goto cleanup_finalize;
6682 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006683 refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
6684 if (refcnt == NULL) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006685 goto cleanup_finalize;
6686 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006687 if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
6688 goto cleanup_finalize;
6689 }
6690 Py_DECREF(refcnt);
6691 refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
6692 if (refcnt == NULL) {
6693 goto cleanup_finalize;
6694 }
6695 if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006696 goto cleanup_finalize;
6697 }
6698
6699cleanup_finalize:
6700 Py_XDECREF(oldtype);
6701 Py_XDECREF(newtype);
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006702 Py_XDECREF(refcnt);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006703
6704 /* Restore the saved exception. */
6705 PyErr_Restore(error_type, error_value, error_traceback);
6706}
6707
6708static PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
6709 {Py_tp_init, heapctypesubclasswithfinalizer_init},
6710 {Py_tp_members, heapctypesubclass_members},
6711 {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006712 {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006713 {0, 0},
6714};
6715
6716static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
6717 "_testcapi.HeapCTypeSubclassWithFinalizer",
6718 sizeof(HeapCTypeSubclassObject),
6719 0,
6720 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
6721 HeapCTypeSubclassWithFinalizer_slots
6722};
6723
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006724typedef struct {
6725 PyObject_HEAD
6726 PyObject *dict;
6727} HeapCTypeWithDictObject;
6728
6729static void
6730heapctypewithdict_dealloc(HeapCTypeWithDictObject* self)
6731{
6732
6733 PyTypeObject *tp = Py_TYPE(self);
6734 Py_XDECREF(self->dict);
6735 PyObject_DEL(self);
6736 Py_DECREF(tp);
6737}
6738
6739static PyGetSetDef heapctypewithdict_getsetlist[] = {
6740 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
6741 {NULL} /* Sentinel */
6742};
6743
6744static struct PyMemberDef heapctypewithdict_members[] = {
6745 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
6746 {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY},
6747 {NULL} /* Sentinel */
6748};
6749
6750static PyType_Slot HeapCTypeWithDict_slots[] = {
6751 {Py_tp_members, heapctypewithdict_members},
6752 {Py_tp_getset, heapctypewithdict_getsetlist},
6753 {Py_tp_dealloc, heapctypewithdict_dealloc},
6754 {0, 0},
6755};
6756
6757static PyType_Spec HeapCTypeWithDict_spec = {
6758 "_testcapi.HeapCTypeWithDict",
6759 sizeof(HeapCTypeWithDictObject),
6760 0,
6761 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6762 HeapCTypeWithDict_slots
6763};
6764
6765static struct PyMemberDef heapctypewithnegativedict_members[] = {
6766 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
Victor Stinneraca8c402019-09-30 21:14:26 +02006767 {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006768 {NULL} /* Sentinel */
6769};
6770
6771static PyType_Slot HeapCTypeWithNegativeDict_slots[] = {
6772 {Py_tp_members, heapctypewithnegativedict_members},
6773 {Py_tp_getset, heapctypewithdict_getsetlist},
6774 {Py_tp_dealloc, heapctypewithdict_dealloc},
6775 {0, 0},
6776};
6777
6778static PyType_Spec HeapCTypeWithNegativeDict_spec = {
6779 "_testcapi.HeapCTypeWithNegativeDict",
6780 sizeof(HeapCTypeWithDictObject),
6781 0,
6782 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6783 HeapCTypeWithNegativeDict_slots
6784};
6785
6786typedef struct {
6787 PyObject_HEAD
6788 PyObject *weakreflist;
6789} HeapCTypeWithWeakrefObject;
6790
6791static struct PyMemberDef heapctypewithweakref_members[] = {
6792 {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)},
6793 {"__weaklistoffset__", T_PYSSIZET,
6794 offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY},
6795 {NULL} /* Sentinel */
6796};
6797
6798static void
6799heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self)
6800{
6801
6802 PyTypeObject *tp = Py_TYPE(self);
6803 if (self->weakreflist != NULL)
6804 PyObject_ClearWeakRefs((PyObject *) self);
6805 Py_XDECREF(self->weakreflist);
6806 PyObject_DEL(self);
6807 Py_DECREF(tp);
6808}
6809
6810static PyType_Slot HeapCTypeWithWeakref_slots[] = {
6811 {Py_tp_members, heapctypewithweakref_members},
6812 {Py_tp_dealloc, heapctypewithweakref_dealloc},
6813 {0, 0},
6814};
6815
6816static PyType_Spec HeapCTypeWithWeakref_spec = {
6817 "_testcapi.HeapCTypeWithWeakref",
6818 sizeof(HeapCTypeWithWeakrefObject),
6819 0,
6820 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6821 HeapCTypeWithWeakref_slots
6822};
6823
scoder148f3292020-07-03 02:09:28 +02006824PyDoc_STRVAR(heapctypesetattr__doc__,
6825"A heap type without GC, but with overridden __setattr__.\n\n"
6826"The 'value' attribute is set to 10 in __init__ and updated via attribute setting.");
6827
6828typedef struct {
6829 PyObject_HEAD
6830 long value;
6831} HeapCTypeSetattrObject;
6832
6833static struct PyMemberDef heapctypesetattr_members[] = {
6834 {"pvalue", T_LONG, offsetof(HeapCTypeSetattrObject, value)},
6835 {NULL} /* Sentinel */
6836};
6837
6838static int
6839heapctypesetattr_init(PyObject *self, PyObject *args, PyObject *kwargs)
6840{
6841 ((HeapCTypeSetattrObject *)self)->value = 10;
6842 return 0;
6843}
6844
6845static void
6846heapctypesetattr_dealloc(HeapCTypeSetattrObject *self)
6847{
6848 PyTypeObject *tp = Py_TYPE(self);
6849 PyObject_Del(self);
6850 Py_DECREF(tp);
6851}
6852
6853static int
6854heapctypesetattr_setattro(HeapCTypeSetattrObject *self, PyObject *attr, PyObject *value)
6855{
6856 PyObject *svalue = PyUnicode_FromString("value");
6857 if (svalue == NULL)
6858 return -1;
6859 int eq = PyObject_RichCompareBool(svalue, attr, Py_EQ);
6860 Py_DECREF(svalue);
6861 if (eq < 0)
6862 return -1;
6863 if (!eq) {
6864 return PyObject_GenericSetAttr((PyObject*) self, attr, value);
6865 }
6866 if (value == NULL) {
6867 self->value = 0;
6868 return 0;
6869 }
6870 PyObject *ivalue = PyNumber_Long(value);
6871 if (ivalue == NULL)
6872 return -1;
6873 long v = PyLong_AsLong(ivalue);
6874 Py_DECREF(ivalue);
6875 if (v == -1 && PyErr_Occurred())
6876 return -1;
6877 self->value = v;
6878 return 0;
6879}
6880
6881static PyType_Slot HeapCTypeSetattr_slots[] = {
6882 {Py_tp_init, heapctypesetattr_init},
6883 {Py_tp_members, heapctypesetattr_members},
6884 {Py_tp_setattro, heapctypesetattr_setattro},
6885 {Py_tp_dealloc, heapctypesetattr_dealloc},
6886 {Py_tp_doc, (char*)heapctypesetattr__doc__},
6887 {0, 0},
6888};
6889
6890static PyType_Spec HeapCTypeSetattr_spec = {
6891 "_testcapi.HeapCTypeSetattr",
6892 sizeof(HeapCTypeSetattrObject),
6893 0,
6894 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6895 HeapCTypeSetattr_slots
6896};
6897
Petr Viktorinf9583772019-09-10 12:21:09 +01006898static PyMethodDef meth_instance_methods[] = {
6899 {"meth_varargs", meth_varargs, METH_VARARGS},
6900 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
6901 {"meth_o", meth_o, METH_O},
6902 {"meth_noargs", meth_noargs, METH_NOARGS},
6903 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
6904 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
6905 {NULL, NULL} /* sentinel */
6906};
6907
6908
6909static PyTypeObject MethInstance_Type = {
6910 PyVarObject_HEAD_INIT(NULL, 0)
6911 "MethInstance",
6912 sizeof(PyObject),
6913 .tp_new = PyType_GenericNew,
6914 .tp_flags = Py_TPFLAGS_DEFAULT,
6915 .tp_methods = meth_instance_methods,
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006916 .tp_doc = (char*)PyDoc_STR(
Petr Viktorinf9583772019-09-10 12:21:09 +01006917 "Class with normal (instance) methods to test calling conventions"),
6918};
6919
6920static PyMethodDef meth_class_methods[] = {
6921 {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS},
6922 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS},
6923 {"meth_o", meth_o, METH_O|METH_CLASS},
6924 {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS},
6925 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS},
6926 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS},
6927 {NULL, NULL} /* sentinel */
6928};
6929
6930
6931static PyTypeObject MethClass_Type = {
6932 PyVarObject_HEAD_INIT(NULL, 0)
6933 "MethClass",
6934 sizeof(PyObject),
6935 .tp_new = PyType_GenericNew,
6936 .tp_flags = Py_TPFLAGS_DEFAULT,
6937 .tp_methods = meth_class_methods,
6938 .tp_doc = PyDoc_STR(
6939 "Class with class methods to test calling conventions"),
6940};
6941
6942static PyMethodDef meth_static_methods[] = {
6943 {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC},
6944 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC},
6945 {"meth_o", meth_o, METH_O|METH_STATIC},
6946 {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC},
6947 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC},
6948 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC},
6949 {NULL, NULL} /* sentinel */
6950};
6951
6952
6953static PyTypeObject MethStatic_Type = {
6954 PyVarObject_HEAD_INIT(NULL, 0)
6955 "MethStatic",
6956 sizeof(PyObject),
6957 .tp_new = PyType_GenericNew,
6958 .tp_flags = Py_TPFLAGS_DEFAULT,
6959 .tp_methods = meth_static_methods,
6960 .tp_doc = PyDoc_STR(
6961 "Class with static methods to test calling conventions"),
6962};
6963
Neil Schemenauer392a13b2019-10-15 20:56:48 -07006964/* ContainerNoGC -- a simple container without GC methods */
6965
6966typedef struct {
6967 PyObject_HEAD
6968 PyObject *value;
6969} ContainerNoGCobject;
6970
6971static PyObject *
6972ContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
6973{
6974 PyObject *value;
6975 char *names[] = {"value", NULL};
6976 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) {
6977 return NULL;
6978 }
6979 PyObject *self = type->tp_alloc(type, 0);
6980 if (self == NULL) {
6981 return NULL;
6982 }
6983 Py_INCREF(value);
6984 ((ContainerNoGCobject *)self)->value = value;
6985 return self;
6986}
6987
6988static void
6989ContainerNoGC_dealloc(ContainerNoGCobject *self)
6990{
6991 Py_DECREF(self->value);
6992 Py_TYPE(self)->tp_free((PyObject *)self);
6993}
6994
6995static PyMemberDef ContainerNoGC_members[] = {
6996 {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY,
6997 PyDoc_STR("a container value for test purposes")},
6998 {0}
6999};
7000
7001static PyTypeObject ContainerNoGC_type = {
7002 PyVarObject_HEAD_INIT(NULL, 0)
7003 "_testcapi.ContainerNoGC",
7004 sizeof(ContainerNoGCobject),
7005 .tp_dealloc = (destructor)ContainerNoGC_dealloc,
7006 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7007 .tp_members = ContainerNoGC_members,
7008 .tp_new = ContainerNoGC_new,
7009};
7010
Jeroen Demeyereb65e242019-05-28 14:42:53 +02007011
Martin v. Löwis1a214512008-06-11 05:26:20 +00007012static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007013 PyModuleDef_HEAD_INIT,
7014 "_testcapi",
7015 NULL,
7016 -1,
7017 TestMethods,
7018 NULL,
7019 NULL,
7020 NULL,
7021 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007022};
7023
Nick Coghland5cacbb2015-05-23 22:24:10 +10007024/* Per PEP 489, this module will not be converted to multi-phase initialization
7025 */
7026
Mark Hammond62b1ab12002-07-23 06:31:15 +00007027PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007028PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00007029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007030 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007032 m = PyModule_Create(&_testcapimodule);
7033 if (m == NULL)
7034 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007035
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007036 Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type);
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00007037
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007038 Py_SET_TYPE(&test_structmembersType, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007039 Py_INCREF(&test_structmembersType);
7040 /* don't use a name starting with "test", since we don't want
7041 test_capi to automatically call this */
7042 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04007043 if (PyType_Ready(&matmulType) < 0)
7044 return NULL;
7045 Py_INCREF(&matmulType);
7046 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06007047 if (PyType_Ready(&ipowType) < 0) {
7048 return NULL;
7049 }
7050 Py_INCREF(&ipowType);
7051 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00007052
Yury Selivanov75445082015-05-11 22:57:16 -04007053 if (PyType_Ready(&awaitType) < 0)
7054 return NULL;
7055 Py_INCREF(&awaitType);
7056 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
7057
Jeroen Demeyer351c6742019-05-10 19:21:11 +02007058 MyList_Type.tp_base = &PyList_Type;
7059 if (PyType_Ready(&MyList_Type) < 0)
7060 return NULL;
7061 Py_INCREF(&MyList_Type);
7062 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
7063
Jeroen Demeyereb65e242019-05-28 14:42:53 +02007064 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
7065 return NULL;
7066 Py_INCREF(&MethodDescriptorBase_Type);
7067 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
7068
7069 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
7070 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
7071 return NULL;
7072 Py_INCREF(&MethodDescriptorDerived_Type);
7073 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
7074
7075 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
7076 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
7077 return NULL;
7078 Py_INCREF(&MethodDescriptorNopGet_Type);
7079 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
7080
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02007081 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
7082 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
7083 return NULL;
7084 Py_INCREF(&MethodDescriptor2_Type);
7085 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
7086
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02007087 if (PyType_Ready(&GenericAlias_Type) < 0)
7088 return NULL;
7089 Py_INCREF(&GenericAlias_Type);
7090 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
7091
7092 if (PyType_Ready(&Generic_Type) < 0)
7093 return NULL;
7094 Py_INCREF(&Generic_Type);
7095 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
7096
Petr Viktorinf9583772019-09-10 12:21:09 +01007097 if (PyType_Ready(&MethInstance_Type) < 0)
7098 return NULL;
7099 Py_INCREF(&MethInstance_Type);
7100 PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type);
7101
7102 if (PyType_Ready(&MethClass_Type) < 0)
7103 return NULL;
7104 Py_INCREF(&MethClass_Type);
7105 PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type);
7106
7107 if (PyType_Ready(&MethStatic_Type) < 0)
7108 return NULL;
7109 Py_INCREF(&MethStatic_Type);
7110 PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type);
7111
xdegaye56d1f5c2017-10-26 15:09:06 +02007112 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
7113 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
7114 return NULL;
7115 }
7116 Py_INCREF(&PyRecursingInfinitelyError_Type);
7117 PyModule_AddObject(m, "RecursingInfinitelyError",
7118 (PyObject *)&PyRecursingInfinitelyError_Type);
7119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007120 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
7121 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
7122 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
7123 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
7124 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
7125 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
7126 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
7127 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
7128 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
7129 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
7130 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
7131 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
7132 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
7133 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
7134 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
7135 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05007136 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX));
7137 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN));
7138 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007139 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
7140 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
Victor Stinner4237d342015-09-10 10:10:39 +02007141 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007142 Py_INCREF(&PyInstanceMethod_Type);
7143 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00007144
Larry Hastings2a727912014-01-16 11:32:01 -08007145 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner310e2d22019-11-22 10:58:00 +01007146 PyObject *v;
Victor Stinner5d39e042017-11-29 17:20:38 +01007147#ifdef WITH_PYMALLOC
Victor Stinner310e2d22019-11-22 10:58:00 +01007148 v = Py_True;
Victor Stinner5d39e042017-11-29 17:20:38 +01007149#else
Victor Stinner310e2d22019-11-22 10:58:00 +01007150 v = Py_False;
Victor Stinner5d39e042017-11-29 17:20:38 +01007151#endif
Victor Stinner310e2d22019-11-22 10:58:00 +01007152 Py_INCREF(v);
7153 PyModule_AddObject(m, "WITH_PYMALLOC", v);
Larry Hastings2a727912014-01-16 11:32:01 -08007154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007155 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
7156 Py_INCREF(TestError);
7157 PyModule_AddObject(m, "error", TestError);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007158
Benjamin Peterson39403332020-09-02 11:29:06 -05007159 PyObject *HeapDocCType = PyType_FromSpec(&HeapDocCType_spec);
7160 if (HeapDocCType == NULL) {
7161 return NULL;
7162 }
7163 PyModule_AddObject(m, "HeapDocCType", HeapDocCType);
7164
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007165 PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
7166 if (HeapGcCType == NULL) {
7167 return NULL;
7168 }
7169 PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
7170
7171 PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
7172 if (HeapCType == NULL) {
7173 return NULL;
7174 }
7175 PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
7176 if (subclass_bases == NULL) {
7177 return NULL;
7178 }
7179 PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
7180 if (HeapCTypeSubclass == NULL) {
7181 return NULL;
7182 }
7183 Py_DECREF(subclass_bases);
7184 PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
7185
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07007186 PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec);
7187 if (HeapCTypeWithDict == NULL) {
7188 return NULL;
7189 }
7190 PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict);
7191
7192 PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
7193 if (HeapCTypeWithNegativeDict == NULL) {
7194 return NULL;
7195 }
7196 PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict);
7197
7198 PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec);
7199 if (HeapCTypeWithWeakref == NULL) {
7200 return NULL;
7201 }
7202 PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref);
7203
scoderf7c4e232020-06-06 21:35:10 +02007204 PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec);
7205 if (HeapCTypeWithBuffer == NULL) {
7206 return NULL;
7207 }
7208 PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer);
7209
scoder148f3292020-07-03 02:09:28 +02007210 PyObject *HeapCTypeSetattr = PyType_FromSpec(&HeapCTypeSetattr_spec);
7211 if (HeapCTypeSetattr == NULL) {
7212 return NULL;
7213 }
7214 PyModule_AddObject(m, "HeapCTypeSetattr", HeapCTypeSetattr);
7215
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007216 PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
7217 if (subclass_with_finalizer_bases == NULL) {
7218 return NULL;
7219 }
7220 PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
7221 &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
7222 if (HeapCTypeSubclassWithFinalizer == NULL) {
7223 return NULL;
7224 }
7225 Py_DECREF(subclass_with_finalizer_bases);
7226 PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
7227
Neil Schemenauer392a13b2019-10-15 20:56:48 -07007228 if (PyType_Ready(&ContainerNoGC_type) < 0) {
7229 return NULL;
7230 }
7231 Py_INCREF(&ContainerNoGC_type);
7232 if (PyModule_AddObject(m, "ContainerNoGC",
7233 (PyObject *) &ContainerNoGC_type) < 0)
7234 return NULL;
7235
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007236 PyState_AddModule(m, &_testcapimodule);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007237 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007238}
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007239
7240
7241/* Test the C API exposed when PY_SSIZE_T_CLEAN is not defined */
7242
7243#undef Py_BuildValue
7244PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
7245
7246static PyObject *
7247test_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
7248{
7249 PyObject *res;
7250 const char str[] = "string";
7251 const Py_UNICODE unicode[] = L"unicode";
Victor Stinner37bb2892020-06-19 11:45:31 +02007252 assert(!PyErr_Occurred());
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007253
7254 res = Py_BuildValue("(s#O)", str, 1, Py_None);
7255 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007256 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007257 return NULL;
7258 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007259 PyErr_Clear();
7260
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007261 res = Py_BuildValue("(z#O)", str, 1, Py_None);
7262 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007263 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007264 return NULL;
7265 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007266 PyErr_Clear();
7267
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007268 res = Py_BuildValue("(y#O)", str, 1, Py_None);
7269 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007270 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007271 return NULL;
7272 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007273 PyErr_Clear();
7274
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007275 res = Py_BuildValue("(u#O)", unicode, 1, Py_None);
7276 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007277 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007278 return NULL;
7279 }
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007280 PyErr_Clear();
Victor Stinner37bb2892020-06-19 11:45:31 +02007281
7282
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007283 Py_RETURN_NONE;
7284}