blob: 4f97927fa2322981603ed648954b07ae63852040 [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 *
Hai Shia13b26c2020-11-11 04:53:46 +08001022test_get_statictype_slots(PyObject *self, PyObject *Py_UNUSED(ignored))
1023{
1024 newfunc tp_new = PyType_GetSlot(&PyLong_Type, Py_tp_new);
1025 if (PyLong_Type.tp_new != tp_new) {
1026 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_new of long");
1027 return NULL;
1028 }
1029
1030 reprfunc tp_repr = PyType_GetSlot(&PyLong_Type, Py_tp_repr);
1031 if (PyLong_Type.tp_repr != tp_repr) {
1032 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_repr of long");
1033 return NULL;
1034 }
1035
1036 ternaryfunc tp_call = PyType_GetSlot(&PyLong_Type, Py_tp_call);
1037 if (tp_call != NULL) {
1038 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_call of long");
1039 return NULL;
1040 }
1041
1042 binaryfunc nb_add = PyType_GetSlot(&PyLong_Type, Py_nb_add);
1043 if (PyLong_Type.tp_as_number->nb_add != nb_add) {
1044 PyErr_SetString(PyExc_AssertionError, "mismatch: nb_add of long");
1045 return NULL;
1046 }
1047
1048 lenfunc mp_length = PyType_GetSlot(&PyLong_Type, Py_mp_length);
1049 if (mp_length != NULL) {
1050 PyErr_SetString(PyExc_AssertionError, "mismatch: mp_length of long");
1051 return NULL;
1052 }
1053
1054 void *over_value = PyType_GetSlot(&PyLong_Type, Py_bf_releasebuffer + 1);
1055 if (over_value != NULL) {
1056 PyErr_SetString(PyExc_AssertionError, "mismatch: max+1 of long");
1057 return NULL;
1058 }
1059
1060 tp_new = PyType_GetSlot(&PyLong_Type, 0);
1061 if (tp_new != NULL) {
1062 PyErr_SetString(PyExc_AssertionError, "mismatch: slot 0 of long");
1063 return NULL;
1064 }
1065 if (PyErr_ExceptionMatches(PyExc_SystemError)) {
1066 // This is the right exception
1067 PyErr_Clear();
1068 }
1069 else {
1070 return NULL;
1071 }
1072
1073 Py_RETURN_NONE;
1074}
1075
1076
1077static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +03001078get_args(PyObject *self, PyObject *args)
1079{
1080 if (args == NULL) {
1081 args = Py_None;
1082 }
1083 Py_INCREF(args);
1084 return args;
1085}
1086
1087static PyObject *
1088get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1089{
1090 if (kwargs == NULL) {
1091 kwargs = Py_None;
1092 }
1093 Py_INCREF(kwargs);
1094 return kwargs;
1095}
1096
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001097/* Test tuple argument processing */
1098static PyObject *
1099getargs_tuple(PyObject *self, PyObject *args)
1100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 int a, b, c;
1102 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1103 return NULL;
1104 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001105}
1106
Christian Heimes380f7f22008-02-28 11:19:05 +00001107/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001108static PyObject *
1109getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001112 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1116 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1117 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1118 return NULL;
1119 return Py_BuildValue("iiiiiiiiii",
1120 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1121 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001122}
1123
Larry Hastings83a9f482012-03-20 20:06:16 +00001124/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1125static PyObject *
1126getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1127{
1128 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1129 int required = -1;
1130 int optional = -1;
1131 int keyword_only = -1;
1132
1133 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1134 &required, &optional, &keyword_only))
1135 return NULL;
1136 return Py_BuildValue("iii", required, optional, keyword_only);
1137}
1138
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001139/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1140static PyObject *
1141getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1142{
1143 static char *keywords[] = {"", "", "keyword", NULL};
1144 int required = -1;
1145 int optional = -1;
1146 int keyword = -1;
1147
1148 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1149 &required, &optional, &keyword))
1150 return NULL;
1151 return Py_BuildValue("iii", required, optional, keyword);
1152}
1153
Thomas Heller3457e4b2003-04-24 16:14:27 +00001154/* Functions to call PyArg_ParseTuple with integer format codes,
1155 and return the result.
1156*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001157static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001158getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 unsigned char value;
1161 if (!PyArg_ParseTuple(args, "b", &value))
1162 return NULL;
1163 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001164}
1165
Thomas Heller3457e4b2003-04-24 16:14:27 +00001166static PyObject *
1167getargs_B(PyObject *self, PyObject *args)
1168{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 unsigned char value;
1170 if (!PyArg_ParseTuple(args, "B", &value))
1171 return NULL;
1172 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001173}
1174
1175static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001176getargs_h(PyObject *self, PyObject *args)
1177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 short value;
1179 if (!PyArg_ParseTuple(args, "h", &value))
1180 return NULL;
1181 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001182}
1183
1184static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001185getargs_H(PyObject *self, PyObject *args)
1186{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 unsigned short value;
1188 if (!PyArg_ParseTuple(args, "H", &value))
1189 return NULL;
1190 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001191}
1192
1193static PyObject *
1194getargs_I(PyObject *self, PyObject *args)
1195{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 unsigned int value;
1197 if (!PyArg_ParseTuple(args, "I", &value))
1198 return NULL;
1199 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001200}
1201
1202static PyObject *
1203getargs_k(PyObject *self, PyObject *args)
1204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 unsigned long value;
1206 if (!PyArg_ParseTuple(args, "k", &value))
1207 return NULL;
1208 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001209}
1210
1211static PyObject *
1212getargs_i(PyObject *self, PyObject *args)
1213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 int value;
1215 if (!PyArg_ParseTuple(args, "i", &value))
1216 return NULL;
1217 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001218}
1219
Thomas Hellera4ea6032003-04-17 18:55:45 +00001220static PyObject *
1221getargs_l(PyObject *self, PyObject *args)
1222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 long value;
1224 if (!PyArg_ParseTuple(args, "l", &value))
1225 return NULL;
1226 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001227}
1228
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001229static PyObject *
1230getargs_n(PyObject *self, PyObject *args)
1231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 Py_ssize_t value;
1233 if (!PyArg_ParseTuple(args, "n", &value))
1234 return NULL;
1235 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001236}
1237
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001238static PyObject *
1239getargs_p(PyObject *self, PyObject *args)
1240{
1241 int value;
1242 if (!PyArg_ParseTuple(args, "p", &value))
1243 return NULL;
1244 return PyLong_FromLong(value);
1245}
1246
Thomas Hellera4ea6032003-04-17 18:55:45 +00001247static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001248getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001249{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001250 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 if (!PyArg_ParseTuple(args, "L", &value))
1252 return NULL;
1253 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001254}
1255
Thomas Hellera4ea6032003-04-17 18:55:45 +00001256static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001257getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001258{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001259 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 if (!PyArg_ParseTuple(args, "K", &value))
1261 return NULL;
1262 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001263}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001264
1265/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001266 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001267static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301268test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 PyObject *tuple, *num;
1271 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 tuple = PyTuple_New(1);
1274 if (tuple == NULL)
1275 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 /* a number larger than ULONG_MAX even on 64-bit platforms */
1278 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1279 if (num == NULL)
1280 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 value = PyLong_AsUnsignedLongMask(num);
1283 if (value != ULONG_MAX)
1284 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001285 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001290 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001292 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 if (value != ULONG_MAX)
1294 return raiseTestError("test_k_code",
1295 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 Py_DECREF(num);
1298 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1299 if (num == NULL)
1300 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 value = PyLong_AsUnsignedLongMask(num);
1303 if (value != (unsigned long)-0x42)
1304 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001305 "PyLong_AsUnsignedLongMask() returned wrong "
1306 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001311 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001313 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 if (value != (unsigned long)-0x42)
1315 return raiseTestError("test_k_code",
1316 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001319 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001320}
1321
Victor Stinner06e49dd2010-06-13 18:21:50 +00001322static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001323getargs_f(PyObject *self, PyObject *args)
1324{
1325 float f;
1326 if (!PyArg_ParseTuple(args, "f", &f))
1327 return NULL;
1328 return PyFloat_FromDouble(f);
1329}
1330
1331static PyObject *
1332getargs_d(PyObject *self, PyObject *args)
1333{
1334 double d;
1335 if (!PyArg_ParseTuple(args, "d", &d))
1336 return NULL;
1337 return PyFloat_FromDouble(d);
1338}
1339
1340static PyObject *
1341getargs_D(PyObject *self, PyObject *args)
1342{
1343 Py_complex cval;
1344 if (!PyArg_ParseTuple(args, "D", &cval))
1345 return NULL;
1346 return PyComplex_FromCComplex(cval);
1347}
1348
1349static PyObject *
1350getargs_S(PyObject *self, PyObject *args)
1351{
1352 PyObject *obj;
1353 if (!PyArg_ParseTuple(args, "S", &obj))
1354 return NULL;
1355 Py_INCREF(obj);
1356 return obj;
1357}
1358
1359static PyObject *
1360getargs_Y(PyObject *self, PyObject *args)
1361{
1362 PyObject *obj;
1363 if (!PyArg_ParseTuple(args, "Y", &obj))
1364 return NULL;
1365 Py_INCREF(obj);
1366 return obj;
1367}
1368
1369static PyObject *
1370getargs_U(PyObject *self, PyObject *args)
1371{
1372 PyObject *obj;
1373 if (!PyArg_ParseTuple(args, "U", &obj))
1374 return NULL;
1375 Py_INCREF(obj);
1376 return obj;
1377}
1378
1379static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001380getargs_c(PyObject *self, PyObject *args)
1381{
1382 char c;
1383 if (!PyArg_ParseTuple(args, "c", &c))
1384 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001385 return PyLong_FromLong((unsigned char)c);
1386}
1387
1388static PyObject *
1389getargs_C(PyObject *self, PyObject *args)
1390{
1391 int c;
1392 if (!PyArg_ParseTuple(args, "C", &c))
1393 return NULL;
1394 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001395}
1396
1397static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001398getargs_s(PyObject *self, PyObject *args)
1399{
1400 char *str;
1401 if (!PyArg_ParseTuple(args, "s", &str))
1402 return NULL;
1403 return PyBytes_FromString(str);
1404}
1405
1406static PyObject *
1407getargs_s_star(PyObject *self, PyObject *args)
1408{
1409 Py_buffer buffer;
1410 PyObject *bytes;
1411 if (!PyArg_ParseTuple(args, "s*", &buffer))
1412 return NULL;
1413 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1414 PyBuffer_Release(&buffer);
1415 return bytes;
1416}
1417
1418static PyObject *
1419getargs_s_hash(PyObject *self, PyObject *args)
1420{
1421 char *str;
1422 Py_ssize_t size;
1423 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1424 return NULL;
1425 return PyBytes_FromStringAndSize(str, size);
1426}
1427
1428static PyObject *
1429getargs_z(PyObject *self, PyObject *args)
1430{
1431 char *str;
1432 if (!PyArg_ParseTuple(args, "z", &str))
1433 return NULL;
1434 if (str != NULL)
1435 return PyBytes_FromString(str);
1436 else
1437 Py_RETURN_NONE;
1438}
1439
1440static PyObject *
1441getargs_z_star(PyObject *self, PyObject *args)
1442{
1443 Py_buffer buffer;
1444 PyObject *bytes;
1445 if (!PyArg_ParseTuple(args, "z*", &buffer))
1446 return NULL;
1447 if (buffer.buf != NULL)
1448 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1449 else {
1450 Py_INCREF(Py_None);
1451 bytes = Py_None;
1452 }
1453 PyBuffer_Release(&buffer);
1454 return bytes;
1455}
1456
1457static PyObject *
1458getargs_z_hash(PyObject *self, PyObject *args)
1459{
1460 char *str;
1461 Py_ssize_t size;
1462 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1463 return NULL;
1464 if (str != NULL)
1465 return PyBytes_FromStringAndSize(str, size);
1466 else
1467 Py_RETURN_NONE;
1468}
1469
1470static PyObject *
1471getargs_y(PyObject *self, PyObject *args)
1472{
1473 char *str;
1474 if (!PyArg_ParseTuple(args, "y", &str))
1475 return NULL;
1476 return PyBytes_FromString(str);
1477}
1478
1479static PyObject *
1480getargs_y_star(PyObject *self, PyObject *args)
1481{
1482 Py_buffer buffer;
1483 PyObject *bytes;
1484 if (!PyArg_ParseTuple(args, "y*", &buffer))
1485 return NULL;
1486 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1487 PyBuffer_Release(&buffer);
1488 return bytes;
1489}
1490
1491static PyObject *
1492getargs_y_hash(PyObject *self, PyObject *args)
1493{
1494 char *str;
1495 Py_ssize_t size;
1496 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1497 return NULL;
1498 return PyBytes_FromStringAndSize(str, size);
1499}
1500
1501static PyObject *
1502getargs_u(PyObject *self, PyObject *args)
1503{
1504 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001505 if (!PyArg_ParseTuple(args, "u", &str))
1506 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001507 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001508}
1509
1510static PyObject *
1511getargs_u_hash(PyObject *self, PyObject *args)
1512{
1513 Py_UNICODE *str;
1514 Py_ssize_t size;
1515 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1516 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001517 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001518}
1519
1520static PyObject *
1521getargs_Z(PyObject *self, PyObject *args)
1522{
1523 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001524 if (!PyArg_ParseTuple(args, "Z", &str))
1525 return NULL;
1526 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001527 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001528 } else
1529 Py_RETURN_NONE;
1530}
1531
1532static PyObject *
1533getargs_Z_hash(PyObject *self, PyObject *args)
1534{
1535 Py_UNICODE *str;
1536 Py_ssize_t size;
1537 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1538 return NULL;
1539 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001540 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001541 else
1542 Py_RETURN_NONE;
1543}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001544
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001545static PyObject *
1546getargs_es(PyObject *self, PyObject *args)
1547{
1548 PyObject *arg, *result;
1549 const char *encoding = NULL;
1550 char *str;
1551
1552 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1553 return NULL;
1554 if (!PyArg_Parse(arg, "es", encoding, &str))
1555 return NULL;
1556 result = PyBytes_FromString(str);
1557 PyMem_Free(str);
1558 return result;
1559}
1560
1561static PyObject *
1562getargs_et(PyObject *self, PyObject *args)
1563{
1564 PyObject *arg, *result;
1565 const char *encoding = NULL;
1566 char *str;
1567
1568 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1569 return NULL;
1570 if (!PyArg_Parse(arg, "et", encoding, &str))
1571 return NULL;
1572 result = PyBytes_FromString(str);
1573 PyMem_Free(str);
1574 return result;
1575}
1576
1577static PyObject *
1578getargs_es_hash(PyObject *self, PyObject *args)
1579{
1580 PyObject *arg, *result;
1581 const char *encoding = NULL;
1582 PyByteArrayObject *buffer = NULL;
1583 char *str = NULL;
1584 Py_ssize_t size;
1585
1586 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1587 return NULL;
1588 if (buffer != NULL) {
1589 str = PyByteArray_AS_STRING(buffer);
1590 size = PyByteArray_GET_SIZE(buffer);
1591 }
1592 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1593 return NULL;
1594 result = PyBytes_FromStringAndSize(str, size);
1595 if (buffer == NULL)
1596 PyMem_Free(str);
1597 return result;
1598}
1599
1600static PyObject *
1601getargs_et_hash(PyObject *self, PyObject *args)
1602{
1603 PyObject *arg, *result;
1604 const char *encoding = NULL;
1605 PyByteArrayObject *buffer = NULL;
1606 char *str = NULL;
1607 Py_ssize_t size;
1608
1609 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1610 return NULL;
1611 if (buffer != NULL) {
1612 str = PyByteArray_AS_STRING(buffer);
1613 size = PyByteArray_GET_SIZE(buffer);
1614 }
1615 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1616 return NULL;
1617 result = PyBytes_FromStringAndSize(str, size);
1618 if (buffer == NULL)
1619 PyMem_Free(str);
1620 return result;
1621}
1622
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001623/* Test the s and z codes for PyArg_ParseTuple.
1624*/
1625static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301626test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001627{
1628 /* Unicode strings should be accepted */
1629 PyObject *tuple, *obj;
1630 char *value;
1631
1632 tuple = PyTuple_New(1);
1633 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001635
1636 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001638 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001640
1641 PyTuple_SET_ITEM(tuple, 0, obj);
1642
1643 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001644 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001645 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001646 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1647 return NULL;
1648 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001649
Oren Milmanba7d7362017-08-29 11:58:27 +03001650 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1651 return NULL;
1652 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001653
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001654 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001655 Py_RETURN_NONE;
1656}
1657
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001658static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001659parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001660{
Larry Hastings8f904da2012-06-22 03:56:29 -07001661 PyObject *sub_args;
1662 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001663 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001664 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001665
Larry Hastings8f904da2012-06-22 03:56:29 -07001666 Py_ssize_t i, size;
1667 char *keywords[8 + 1]; /* space for NULL at end */
1668 PyObject *o;
1669 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001670
Larry Hastings8f904da2012-06-22 03:56:29 -07001671 int result;
1672 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001673
Larry Hastings22701e82012-08-08 14:52:22 -07001674 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001675
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001676 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001677 &sub_args, &sub_kwargs,
1678 &sub_format, &sub_keywords))
1679 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001680
Larry Hastings8f904da2012-06-22 03:56:29 -07001681 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1682 PyErr_SetString(PyExc_ValueError,
1683 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1684 return NULL;
1685 }
1686
1687 memset(buffers, 0, sizeof(buffers));
1688 memset(converted, 0, sizeof(converted));
1689 memset(keywords, 0, sizeof(keywords));
1690
1691 size = PySequence_Fast_GET_SIZE(sub_keywords);
1692 if (size > 8) {
1693 PyErr_SetString(PyExc_ValueError,
1694 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1695 goto exit;
1696 }
1697
1698 for (i = 0; i < size; i++) {
1699 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1700 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1701 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001702 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001703 goto exit;
1704 }
1705 keywords[i] = PyBytes_AS_STRING(converted[i]);
1706 }
1707
1708 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1709 sub_format, keywords,
1710 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1711 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1712
1713 if (result) {
1714 return_value = Py_None;
1715 Py_INCREF(Py_None);
1716 }
1717
1718exit:
1719 size = sizeof(converted) / sizeof(converted[0]);
1720 for (i = 0; i < size; i++) {
1721 Py_XDECREF(converted[i]);
1722 }
1723 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001724}
1725
Benjamin Peterson92035012008-12-27 16:00:54 +00001726static volatile int x;
1727
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001728#if USE_UNICODE_WCHAR_CACHE
Inada Naoki2c4928d2020-06-17 20:09:44 +09001729/* Ignore use of deprecated APIs */
1730_Py_COMP_DIAG_PUSH
1731_Py_COMP_DIAG_IGNORE_DEPR_DECLS
1732
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001733/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1734 of an error.
1735*/
1736static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301737test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001738{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 PyObject *tuple, *obj;
1740 Py_UNICODE *value;
1741 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1744 /* Just use the macro and check that it compiles */
1745 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 tuple = PyTuple_New(1);
1748 if (tuple == NULL)
1749 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 obj = PyUnicode_Decode("test", strlen("test"),
1752 "ascii", NULL);
1753 if (obj == NULL)
1754 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001759 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001761 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 if (value != PyUnicode_AS_UNICODE(obj))
1763 return raiseTestError("test_u_code",
1764 "u code returned wrong value for u'test'");
1765 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001766 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001768 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 if (value != PyUnicode_AS_UNICODE(obj) ||
1770 len != PyUnicode_GET_SIZE(obj))
1771 return raiseTestError("test_u_code",
1772 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001775 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001776}
1777
Guido van Rossumfb67be22007-08-29 18:38:11 +00001778/* Test Z and Z# codes for PyArg_ParseTuple */
1779static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301780test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001781{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001783 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 tuple = PyTuple_New(2);
1787 if (tuple == NULL)
1788 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 obj = PyUnicode_FromString("test");
1791 PyTuple_SET_ITEM(tuple, 0, obj);
1792 Py_INCREF(Py_None);
1793 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 /* swap values on purpose */
1796 value1 = NULL;
1797 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001800 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001802 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 if (value1 != PyUnicode_AS_UNICODE(obj))
1804 return raiseTestError("test_Z_code",
1805 "Z code returned wrong value for 'test'");
1806 if (value2 != NULL)
1807 return raiseTestError("test_Z_code",
1808 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 value1 = NULL;
1811 value2 = PyUnicode_AS_UNICODE(obj);
1812 len1 = -1;
1813 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001816 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1817 &value2, &len2))
1818 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001820 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1822 len1 != PyUnicode_GET_SIZE(obj))
1823 return raiseTestError("test_Z_code",
1824 "Z# code returned wrong values for 'test'");
1825 if (value2 != NULL ||
1826 len2 != 0)
1827 return raiseTestError("test_Z_code",
1828 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 Py_DECREF(tuple);
1831 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001832}
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001833_Py_COMP_DIAG_POP
1834#endif /* USE_UNICODE_WCHAR_CACHE */
Guido van Rossumfb67be22007-08-29 18:38:11 +00001835
Thomas Wouters477c8d52006-05-27 19:21:47 +00001836static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301837test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001838{
1839#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1841 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001842 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001843#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1845 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001846#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1850 if (wide == NULL)
1851 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1854 if (utf8 == NULL) {
1855 Py_DECREF(wide);
1856 return NULL;
1857 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001858
Victor Stinner8ef18872011-11-21 02:06:57 +01001859 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 Py_DECREF(wide);
1861 Py_DECREF(utf8);
1862 return raiseTestError("test_widechar",
1863 "wide string and utf8 string "
1864 "have different length");
1865 }
1866 if (PyUnicode_Compare(wide, utf8)) {
1867 Py_DECREF(wide);
1868 Py_DECREF(utf8);
1869 if (PyErr_Occurred())
1870 return NULL;
1871 return raiseTestError("test_widechar",
1872 "wide string and utf8 string "
1873 "are different");
1874 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 Py_DECREF(wide);
1877 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001878
1879#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1880 wide = PyUnicode_FromWideChar(invalid, 1);
1881 if (wide == NULL)
1882 PyErr_Clear();
1883 else
1884 return raiseTestError("test_widechar",
1885 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1886
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001887#if USE_UNICODE_WCHAR_CACHE
1888/* Ignore use of deprecated APIs */
1889_Py_COMP_DIAG_PUSH
1890_Py_COMP_DIAG_IGNORE_DEPR_DECLS
Victor Stinnere3b47152011-12-09 20:49:49 +01001891 wide = PyUnicode_FromUnicode(invalid, 1);
1892 if (wide == NULL)
1893 PyErr_Clear();
1894 else
1895 return raiseTestError("test_widechar",
1896 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001897
1898 wide = PyUnicode_FromUnicode(NULL, 1);
1899 if (wide == NULL)
1900 return NULL;
1901 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001902 if (_PyUnicode_Ready(wide) < 0) {
1903 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001904 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001905 }
1906 else {
1907 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001908 return raiseTestError("test_widechar",
1909 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001910 }
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001911_Py_COMP_DIAG_POP
1912#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinnere3b47152011-12-09 20:49:49 +01001913#endif
1914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001916}
1917
1918static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001919unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001920{
1921 PyObject *unicode, *result;
1922 Py_ssize_t buflen, size;
1923 wchar_t *buffer;
1924
1925 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1926 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001927 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001928 if (buffer == NULL)
1929 return PyErr_NoMemory();
1930
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001931 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001932 if (size == -1) {
1933 PyMem_Free(buffer);
1934 return NULL;
1935 }
1936
1937 if (size < buflen)
1938 buflen = size + 1;
1939 else
1940 buflen = size;
1941 result = PyUnicode_FromWideChar(buffer, buflen);
1942 PyMem_Free(buffer);
1943 if (result == NULL)
1944 return NULL;
1945
1946 return Py_BuildValue("(Nn)", result, size);
1947}
1948
1949static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001950unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001951{
1952 PyObject *unicode, *result;
1953 Py_ssize_t size;
1954 wchar_t *buffer;
1955
1956 if (!PyArg_ParseTuple(args, "U", &unicode))
1957 return NULL;
1958
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001959 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001960 if (buffer == NULL)
1961 return NULL;
1962
1963 result = PyUnicode_FromWideChar(buffer, size + 1);
1964 PyMem_Free(buffer);
1965 if (result == NULL)
1966 return NULL;
1967 return Py_BuildValue("(Nn)", result, size);
1968}
1969
1970static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001971unicode_asucs4(PyObject *self, PyObject *args)
1972{
1973 PyObject *unicode, *result;
1974 Py_UCS4 *buffer;
1975 int copy_null;
1976 Py_ssize_t str_len, buf_len;
1977
1978 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1979 return NULL;
1980 }
1981
1982 buf_len = str_len + 1;
1983 buffer = PyMem_NEW(Py_UCS4, buf_len);
1984 if (buffer == NULL) {
1985 return PyErr_NoMemory();
1986 }
1987 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1988 buffer[str_len] = 0xffffU;
1989
1990 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
Victor Stinner00d7abd2020-12-01 09:56:42 +01001991 PyMem_Free(buffer);
Serhiy Storchakacc164232016-10-02 21:29:26 +03001992 return NULL;
1993 }
1994
1995 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
Victor Stinner00d7abd2020-12-01 09:56:42 +01001996 PyMem_Free(buffer);
Serhiy Storchakacc164232016-10-02 21:29:26 +03001997 return result;
1998}
1999
2000static PyObject *
Hai Shi5623ac82019-07-20 02:56:23 -05002001unicode_asutf8(PyObject *self, PyObject *args)
2002{
2003 PyObject *unicode;
2004 const char *buffer;
2005
2006 if (!PyArg_ParseTuple(args, "U", &unicode)) {
2007 return NULL;
2008 }
2009
2010 buffer = PyUnicode_AsUTF8(unicode);
2011 if (buffer == NULL) {
2012 return NULL;
2013 }
2014
2015 return PyBytes_FromString(buffer);
2016}
2017
2018static PyObject *
2019unicode_asutf8andsize(PyObject *self, PyObject *args)
2020{
2021 PyObject *unicode, *result;
2022 const char *buffer;
2023 Py_ssize_t utf8_len;
2024
2025 if(!PyArg_ParseTuple(args, "U", &unicode)) {
2026 return NULL;
2027 }
2028
Victor Stinneraca8c402019-09-30 21:14:26 +02002029 buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len);
Hai Shi5623ac82019-07-20 02:56:23 -05002030 if (buffer == NULL) {
2031 return NULL;
2032 }
2033
2034 result = PyBytes_FromString(buffer);
2035 if (result == NULL) {
2036 return NULL;
2037 }
2038
2039 return Py_BuildValue("(Nn)", result, utf8_len);
2040}
2041
2042static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08002043unicode_findchar(PyObject *self, PyObject *args)
2044{
2045 PyObject *str;
2046 int direction;
2047 unsigned int ch;
2048 Py_ssize_t result;
2049 Py_ssize_t start, end;
2050
2051 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
2052 &start, &end, &direction)) {
2053 return NULL;
2054 }
2055
2056 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
2057 if (result == -2)
2058 return NULL;
2059 else
2060 return PyLong_FromSsize_t(result);
2061}
2062
2063static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002064unicode_copycharacters(PyObject *self, PyObject *args)
2065{
2066 PyObject *from, *to, *to_copy;
2067 Py_ssize_t from_start, to_start, how_many, copied;
2068
2069 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
2070 &from, &from_start, &how_many)) {
2071 return NULL;
2072 }
2073
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002074 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
2075 PyUnicode_MAX_CHAR_VALUE(to)))) {
2076 return NULL;
2077 }
2078 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
2079 Py_DECREF(to_copy);
2080 return NULL;
2081 }
2082
2083 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
2084 from_start, how_many)) < 0) {
2085 Py_DECREF(to_copy);
2086 return NULL;
2087 }
2088
2089 return Py_BuildValue("(Nn)", to_copy, copied);
2090}
2091
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002092#if USE_UNICODE_WCHAR_CACHE
Inada Naoki13c90e82020-07-05 11:01:54 +09002093/* Ignore use of deprecated APIs */
2094_Py_COMP_DIAG_PUSH
2095_Py_COMP_DIAG_IGNORE_DEPR_DECLS
2096
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002097static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01002098unicode_encodedecimal(PyObject *self, PyObject *args)
2099{
2100 Py_UNICODE *unicode;
2101 Py_ssize_t length;
2102 char *errors = NULL;
2103 PyObject *decimal;
2104 Py_ssize_t decimal_length, new_length;
2105 int res;
2106
2107 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
2108 return NULL;
2109
2110 decimal_length = length * 7; /* len('&#8364;') */
2111 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
2112 if (decimal == NULL)
2113 return NULL;
2114
2115 res = PyUnicode_EncodeDecimal(unicode, length,
2116 PyBytes_AS_STRING(decimal),
2117 errors);
2118 if (res < 0) {
2119 Py_DECREF(decimal);
2120 return NULL;
2121 }
2122
2123 new_length = strlen(PyBytes_AS_STRING(decimal));
2124 assert(new_length <= decimal_length);
2125 res = _PyBytes_Resize(&decimal, new_length);
2126 if (res < 0)
2127 return NULL;
2128
2129 return decimal;
2130}
2131
2132static PyObject *
2133unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
2134{
2135 Py_UNICODE *unicode;
2136 Py_ssize_t length;
2137 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
2138 return NULL;
2139 return PyUnicode_TransformDecimalToASCII(unicode, length);
2140}
2141
2142static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002143unicode_legacy_string(PyObject *self, PyObject *args)
2144{
2145 Py_UNICODE *data;
2146 Py_ssize_t len;
2147 PyObject *u;
2148
2149 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2150 return NULL;
2151
2152 u = PyUnicode_FromUnicode(NULL, len);
2153 if (u == NULL)
2154 return NULL;
2155
2156 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2157
2158 if (len > 0) { /* The empty string is always ready. */
2159 assert(!PyUnicode_IS_READY(u));
2160 }
2161
2162 return u;
2163}
Inada Naoki2c4928d2020-06-17 20:09:44 +09002164_Py_COMP_DIAG_POP
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002165#endif /* USE_UNICODE_WCHAR_CACHE */
Stefan Krahe6996ed2012-11-02 14:44:20 +01002166
2167static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002168getargs_w_star(PyObject *self, PyObject *args)
2169{
2170 Py_buffer buffer;
2171 PyObject *result;
2172 char *str;
2173
2174 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2175 return NULL;
2176
2177 if (2 <= buffer.len) {
2178 str = buffer.buf;
2179 str[0] = '[';
2180 str[buffer.len-1] = ']';
2181 }
2182
2183 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2184 PyBuffer_Release(&buffer);
2185 return result;
2186}
2187
2188
2189static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302190test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002191{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 /* Test that formats can begin with '|'. See issue #4720. */
2193 PyObject *tuple, *dict = NULL;
2194 static char *kwlist[] = {NULL};
2195 int result;
2196 tuple = PyTuple_New(0);
2197 if (!tuple)
2198 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002199 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002201 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 dict = PyDict_New();
2203 if (!dict)
2204 goto done;
2205 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002206 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002207 Py_DECREF(tuple);
2208 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002209 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002211 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 else {
2213 Py_RETURN_NONE;
2214 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002215}
2216
2217static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002218codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002220 const char *encoding, *errors = NULL;
2221 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2222 &encoding, &errors))
2223 return NULL;
2224 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002225}
2226
Thomas Wouters477c8d52006-05-27 19:21:47 +00002227static PyObject *
2228codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002229{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 const char *encoding, *errors = NULL;
2231 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2232 &encoding, &errors))
2233 return NULL;
2234 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002235}
2236
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002237
Tim Peters5b8132f2003-01-31 15:52:05 +00002238/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002239static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302240test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242 struct triple {
2243 long input;
2244 size_t nbits;
2245 int sign;
2246 } testcases[] = {{0, 0, 0},
2247 {1L, 1, 1},
2248 {-1L, 1, -1},
2249 {2L, 2, 1},
2250 {-2L, 2, -1},
2251 {3L, 2, 1},
2252 {-3L, 2, -1},
2253 {4L, 3, 1},
2254 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002255 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 {-0x7fffL, 15, -1},
2257 {0xffffL, 16, 1},
2258 {-0xffffL, 16, -1},
2259 {0xfffffffL, 28, 1},
2260 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002261 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002262
Victor Stinner63941882011-09-29 00:42:28 +02002263 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002264 size_t nbits;
2265 int sign;
2266 PyObject *plong;
2267
2268 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002269 if (plong == NULL)
2270 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002271 nbits = _PyLong_NumBits(plong);
2272 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 Py_DECREF(plong);
2275 if (nbits != testcases[i].nbits)
2276 return raiseTestError("test_long_numbits",
2277 "wrong result for _PyLong_NumBits");
2278 if (sign != testcases[i].sign)
2279 return raiseTestError("test_long_numbits",
2280 "wrong result for _PyLong_Sign");
2281 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002282 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002283}
2284
Thomas Heller519a0422007-11-15 20:48:54 +00002285/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002286
2287static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302288test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002289{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2291 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2292 Py_XDECREF(o1);
2293 Py_XDECREF(o2);
2294 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002295}
2296
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002297static PyObject *
2298raise_exception(PyObject *self, PyObject *args)
2299{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 PyObject *exc;
2301 PyObject *exc_args, *v;
2302 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002304 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2305 &exc, &num_args))
2306 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 exc_args = PyTuple_New(num_args);
2309 if (exc_args == NULL)
2310 return NULL;
2311 for (i = 0; i < num_args; ++i) {
2312 v = PyLong_FromLong(i);
2313 if (v == NULL) {
2314 Py_DECREF(exc_args);
2315 return NULL;
2316 }
2317 PyTuple_SET_ITEM(exc_args, i, v);
2318 }
2319 PyErr_SetObject(exc, exc_args);
2320 Py_DECREF(exc_args);
2321 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002322}
Tim Peters91621db2001-06-12 20:10:01 +00002323
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002324static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002325set_errno(PyObject *self, PyObject *args)
2326{
2327 int new_errno;
2328
2329 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2330 return NULL;
2331
2332 errno = new_errno;
2333 Py_RETURN_NONE;
2334}
2335
2336static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002337test_set_exc_info(PyObject *self, PyObject *args)
2338{
2339 PyObject *orig_exc;
2340 PyObject *new_type, *new_value, *new_tb;
2341 PyObject *type, *value, *tb;
2342 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2343 &new_type, &new_value, &new_tb))
2344 return NULL;
2345
2346 PyErr_GetExcInfo(&type, &value, &tb);
2347
2348 Py_INCREF(new_type);
2349 Py_INCREF(new_value);
2350 Py_INCREF(new_tb);
2351 PyErr_SetExcInfo(new_type, new_value, new_tb);
2352
2353 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2354 Py_XDECREF(type);
2355 Py_XDECREF(value);
2356 Py_XDECREF(tb);
2357 return orig_exc;
2358}
Benjamin Peterson16323982010-02-03 01:13:41 +00002359
2360static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002361
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002362static PyObject *
2363test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 if (PyDateTimeAPI) {
2365 if (test_run_counter) {
2366 /* Probably regrtest.py -R */
2367 Py_RETURN_NONE;
2368 }
2369 else {
2370 PyErr_SetString(PyExc_AssertionError,
2371 "PyDateTime_CAPI somehow initialized");
2372 return NULL;
2373 }
2374 }
2375 test_run_counter++;
2376 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 if (PyDateTimeAPI)
2379 Py_RETURN_NONE;
2380 else
2381 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002382}
2383
Paul Ganssle04af5b12018-01-24 17:29:30 -05002384/* Functions exposing the C API type checking for testing */
2385#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2386 PyObject *obj; \
2387 int exact = 0; \
2388 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2389 return NULL; \
2390 } \
2391 int rv = exact?exact_method(obj):check_method(obj); \
2392 if (rv) { \
2393 Py_RETURN_TRUE; \
2394 } else { \
2395 Py_RETURN_FALSE; \
2396 }
2397
2398static PyObject *
2399datetime_check_date(PyObject *self, PyObject *args) {
2400 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2401}
2402
2403static PyObject *
2404datetime_check_time(PyObject *self, PyObject *args) {
2405 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2406}
2407
2408static PyObject *
2409datetime_check_datetime(PyObject *self, PyObject *args) {
2410 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2411}
2412
2413static PyObject *
2414datetime_check_delta(PyObject *self, PyObject *args) {
2415 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2416}
2417
2418static PyObject *
2419datetime_check_tzinfo(PyObject *self, PyObject *args) {
2420 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2421}
2422
2423
2424/* Makes three variations on timezone representing UTC-5:
2425 1. timezone with offset and name from PyDateTimeAPI
2426 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2427 3. timezone with offset (no name) from PyTimeZone_FromOffset
2428*/
2429static PyObject *
2430make_timezones_capi(PyObject *self, PyObject *args) {
2431 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2432 PyObject *name = PyUnicode_FromString("EST");
2433
2434 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2435 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2436 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2437
2438 Py_DecRef(offset);
2439 Py_DecRef(name);
2440
2441 PyObject *rv = PyTuple_New(3);
2442
2443 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2444 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2445 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2446
2447 return rv;
2448}
2449
2450static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002451get_timezones_offset_zero(PyObject *self, PyObject *args) {
2452 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2453 PyObject *name = PyUnicode_FromString("");
2454
2455 // These two should return the UTC singleton
2456 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2457 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2458
2459 // This one will return +00:00 zone, but not the UTC singleton
2460 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2461
2462 Py_DecRef(offset);
2463 Py_DecRef(name);
2464
2465 PyObject *rv = PyTuple_New(3);
2466 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2467 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2468 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2469
2470 return rv;
2471}
2472
2473static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002474get_timezone_utc_capi(PyObject* self, PyObject *args) {
2475 int macro = 0;
2476 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2477 return NULL;
2478 }
2479 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002480 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002481 return PyDateTime_TimeZone_UTC;
2482 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002483 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002484 return PyDateTimeAPI->TimeZone_UTC;
2485 }
2486}
2487
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002488static PyObject *
Edison A98ff4d52019-05-17 13:28:42 -07002489get_date_fromdate(PyObject *self, PyObject *args)
2490{
2491 PyObject *rv = NULL;
2492 int macro;
2493 int year, month, day;
2494
2495 if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2496 return NULL;
2497 }
2498
2499 if (macro) {
2500 rv = PyDate_FromDate(year, month, day);
2501 }
2502 else {
2503 rv = PyDateTimeAPI->Date_FromDate(
2504 year, month, day,
2505 PyDateTimeAPI->DateType);
2506 }
2507 return rv;
2508}
2509
2510static PyObject *
2511get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2512{
2513 PyObject *rv = NULL;
2514 int macro;
2515 int year, month, day;
2516 int hour, minute, second, microsecond;
2517
2518 if (!PyArg_ParseTuple(args, "piiiiiii",
2519 &macro,
2520 &year, &month, &day,
2521 &hour, &minute, &second, &microsecond)) {
2522 return NULL;
2523 }
2524
2525 if (macro) {
2526 rv = PyDateTime_FromDateAndTime(
2527 year, month, day,
2528 hour, minute, second, microsecond);
2529 }
2530 else {
2531 rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2532 year, month, day,
2533 hour, minute, second, microsecond,
2534 Py_None,
2535 PyDateTimeAPI->DateTimeType);
2536 }
2537 return rv;
2538}
2539
2540static PyObject *
2541get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2542{
2543 PyObject *rv = NULL;
2544 int macro;
2545 int year, month, day;
2546 int hour, minute, second, microsecond, fold;
2547
2548 if (!PyArg_ParseTuple(args, "piiiiiiii",
2549 &macro,
2550 &year, &month, &day,
2551 &hour, &minute, &second, &microsecond,
2552 &fold)) {
2553 return NULL;
2554 }
2555
2556 if (macro) {
2557 rv = PyDateTime_FromDateAndTimeAndFold(
2558 year, month, day,
2559 hour, minute, second, microsecond,
2560 fold);
2561 }
2562 else {
2563 rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2564 year, month, day,
2565 hour, minute, second, microsecond,
2566 Py_None,
2567 fold,
2568 PyDateTimeAPI->DateTimeType);
2569 }
2570 return rv;
2571}
2572
2573static PyObject *
2574get_time_fromtime(PyObject *self, PyObject *args)
2575{
2576 PyObject *rv = NULL;
2577 int macro;
2578 int hour, minute, second, microsecond;
2579
2580 if (!PyArg_ParseTuple(args, "piiii",
2581 &macro,
2582 &hour, &minute, &second, &microsecond)) {
2583 return NULL;
2584 }
2585
2586 if (macro) {
2587 rv = PyTime_FromTime(hour, minute, second, microsecond);
2588 }
2589 else {
2590 rv = PyDateTimeAPI->Time_FromTime(
2591 hour, minute, second, microsecond,
2592 Py_None,
2593 PyDateTimeAPI->TimeType);
2594 }
2595 return rv;
2596}
2597
2598static PyObject *
2599get_time_fromtimeandfold(PyObject *self, PyObject *args)
2600{
2601 PyObject *rv = NULL;
2602 int macro;
2603 int hour, minute, second, microsecond, fold;
2604
2605 if (!PyArg_ParseTuple(args, "piiiii",
2606 &macro,
2607 &hour, &minute, &second, &microsecond,
2608 &fold)) {
2609 return NULL;
2610 }
2611
2612 if (macro) {
2613 rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2614 }
2615 else {
2616 rv = PyDateTimeAPI->Time_FromTimeAndFold(
2617 hour, minute, second, microsecond,
2618 Py_None,
2619 fold,
2620 PyDateTimeAPI->TimeType);
2621 }
2622 return rv;
2623}
2624
2625static PyObject *
2626get_delta_fromdsu(PyObject *self, PyObject *args)
2627{
2628 PyObject *rv = NULL;
2629 int macro;
2630 int days, seconds, microseconds;
2631
2632 if (!PyArg_ParseTuple(args, "piii",
2633 &macro,
2634 &days, &seconds, &microseconds)) {
2635 return NULL;
2636 }
2637
2638 if (macro) {
2639 rv = PyDelta_FromDSU(days, seconds, microseconds);
2640 }
2641 else {
2642 rv = PyDateTimeAPI->Delta_FromDelta(
2643 days, seconds, microseconds, 1,
2644 PyDateTimeAPI->DeltaType);
2645 }
2646
2647 return rv;
2648}
2649
2650static PyObject *
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002651get_date_fromtimestamp(PyObject* self, PyObject *args)
2652{
2653 PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2654 int macro = 0;
2655
2656 if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2657 return NULL;
2658 }
2659
2660 // Construct the argument tuple
2661 if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2662 return NULL;
2663 }
2664
2665 // Pass along to the API function
2666 if (macro) {
2667 rv = PyDate_FromTimestamp(tsargs);
2668 }
2669 else {
2670 rv = PyDateTimeAPI->Date_FromTimestamp(
2671 (PyObject *)PyDateTimeAPI->DateType, tsargs
2672 );
2673 }
2674
2675 Py_DECREF(tsargs);
2676 return rv;
2677}
2678
2679static PyObject *
2680get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2681{
2682 int macro = 0;
2683 int usetz = 0;
2684 PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2685 if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2686 return NULL;
2687 }
2688
2689 // Construct the argument tuple
2690 if (usetz) {
2691 tsargs = PyTuple_Pack(2, ts, tzinfo);
2692 }
2693 else {
2694 tsargs = PyTuple_Pack(1, ts);
2695 }
2696
2697 if (tsargs == NULL) {
2698 return NULL;
2699 }
2700
2701 // Pass along to the API function
2702 if (macro) {
2703 rv = PyDateTime_FromTimestamp(tsargs);
2704 }
2705 else {
2706 rv = PyDateTimeAPI->DateTime_FromTimestamp(
2707 (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2708 );
2709 }
2710
2711 Py_DECREF(tsargs);
2712 return rv;
2713}
2714
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002715static PyObject *
2716test_PyDateTime_GET(PyObject *self, PyObject *obj)
2717{
2718 int year, month, day;
2719
2720 year = PyDateTime_GET_YEAR(obj);
2721 month = PyDateTime_GET_MONTH(obj);
2722 day = PyDateTime_GET_DAY(obj);
2723
2724 return Py_BuildValue("(lll)", year, month, day);
2725}
2726
2727static PyObject *
2728test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
2729{
2730 int hour, minute, second, microsecond;
2731
2732 hour = PyDateTime_DATE_GET_HOUR(obj);
2733 minute = PyDateTime_DATE_GET_MINUTE(obj);
2734 second = PyDateTime_DATE_GET_SECOND(obj);
2735 microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002736 PyObject *tzinfo = PyDateTime_DATE_GET_TZINFO(obj);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002737
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002738 return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002739}
2740
2741static PyObject *
2742test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
2743{
2744 int hour, minute, second, microsecond;
2745
2746 hour = PyDateTime_TIME_GET_HOUR(obj);
2747 minute = PyDateTime_TIME_GET_MINUTE(obj);
2748 second = PyDateTime_TIME_GET_SECOND(obj);
2749 microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002750 PyObject *tzinfo = PyDateTime_TIME_GET_TZINFO(obj);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002751
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002752 return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002753}
2754
2755static PyObject *
2756test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
2757{
2758 int days, seconds, microseconds;
2759
2760 days = PyDateTime_DELTA_GET_DAYS(obj);
2761 seconds = PyDateTime_DELTA_GET_SECONDS(obj);
2762 microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
2763
2764 return Py_BuildValue("(lll)", days, seconds, microseconds);
2765}
Benjamin Peterson16323982010-02-03 01:13:41 +00002766
Stefan Krah39042e02020-08-10 16:32:21 +02002767/* Test decimal API */
2768static int decimal_initialized = 0;
2769static PyObject *
2770decimal_is_special(PyObject *module, PyObject *dec)
2771{
2772 int is_special;
2773
2774 (void)module;
2775 if (!decimal_initialized) {
2776 if (import_decimal() < 0) {
2777 return NULL;
2778 }
2779
2780 decimal_initialized = 1;
2781 }
2782
2783 is_special = PyDec_IsSpecial(dec);
2784 if (is_special < 0) {
2785 return NULL;
2786 }
2787
2788 return PyBool_FromLong(is_special);
2789}
2790
2791static PyObject *
2792decimal_is_nan(PyObject *module, PyObject *dec)
2793{
2794 int is_nan;
2795
2796 (void)module;
2797 if (!decimal_initialized) {
2798 if (import_decimal() < 0) {
2799 return NULL;
2800 }
2801
2802 decimal_initialized = 1;
2803 }
2804
2805 is_nan = PyDec_IsNaN(dec);
2806 if (is_nan < 0) {
2807 return NULL;
2808 }
2809
2810 return PyBool_FromLong(is_nan);
2811}
2812
2813static PyObject *
2814decimal_is_infinite(PyObject *module, PyObject *dec)
2815{
2816 int is_infinite;
2817
2818 (void)module;
2819 if (!decimal_initialized) {
2820 if (import_decimal() < 0) {
2821 return NULL;
2822 }
2823
2824 decimal_initialized = 1;
2825 }
2826
2827 is_infinite = PyDec_IsInfinite(dec);
2828 if (is_infinite < 0) {
2829 return NULL;
2830 }
2831
2832 return PyBool_FromLong(is_infinite);
2833}
2834
2835static PyObject *
2836decimal_get_digits(PyObject *module, PyObject *dec)
2837{
2838 int64_t digits;
2839
2840 (void)module;
2841 if (!decimal_initialized) {
2842 if (import_decimal() < 0) {
2843 return NULL;
2844 }
2845
2846 decimal_initialized = 1;
2847 }
2848
2849 digits = PyDec_GetDigits(dec);
2850 if (digits < 0) {
2851 return NULL;
2852 }
2853
2854 return PyLong_FromLongLong(digits);
2855}
2856
2857static PyObject *
2858decimal_as_triple(PyObject *module, PyObject *dec)
2859{
2860 PyObject *tuple = NULL;
2861 PyObject *sign, *hi, *lo;
2862 mpd_uint128_triple_t triple;
2863
2864 (void)module;
2865 if (!decimal_initialized) {
2866 if (import_decimal() < 0) {
2867 return NULL;
2868 }
2869
2870 decimal_initialized = 1;
2871 }
2872
2873 triple = PyDec_AsUint128Triple(dec);
2874 if (triple.tag == MPD_TRIPLE_ERROR && PyErr_Occurred()) {
2875 return NULL;
2876 }
2877
2878 sign = PyLong_FromUnsignedLong(triple.sign);
2879 if (sign == NULL) {
2880 return NULL;
2881 }
2882
2883 hi = PyLong_FromUnsignedLongLong(triple.hi);
2884 if (hi == NULL) {
2885 Py_DECREF(sign);
2886 return NULL;
2887 }
2888
2889 lo = PyLong_FromUnsignedLongLong(triple.lo);
2890 if (lo == NULL) {
2891 Py_DECREF(hi);
2892 Py_DECREF(sign);
2893 return NULL;
2894 }
2895
2896 switch (triple.tag) {
2897 case MPD_TRIPLE_QNAN:
2898 assert(triple.exp == 0);
2899 tuple = Py_BuildValue("(OOOs)", sign, hi, lo, "n");
2900 break;
2901
2902 case MPD_TRIPLE_SNAN:
2903 assert(triple.exp == 0);
2904 tuple = Py_BuildValue("(OOOs)", sign, hi, lo, "N");
2905 break;
2906
2907 case MPD_TRIPLE_INF:
2908 assert(triple.hi == 0);
2909 assert(triple.lo == 0);
2910 assert(triple.exp == 0);
2911 tuple = Py_BuildValue("(OOOs)", sign, hi, lo, "F");
2912 break;
2913
2914 case MPD_TRIPLE_NORMAL:
2915 tuple = Py_BuildValue("(OOOL)", sign, hi, lo, triple.exp);
2916 break;
2917
2918 case MPD_TRIPLE_ERROR:
2919 PyErr_SetString(PyExc_ValueError,
2920 "value out of bounds for a uint128 triple");
2921 break;
2922
2923 default:
2924 PyErr_SetString(PyExc_RuntimeError,
2925 "decimal_as_triple: internal error: unexpected tag");
2926 break;
2927 }
2928
2929 Py_DECREF(lo);
2930 Py_DECREF(hi);
2931 Py_DECREF(sign);
2932
2933 return tuple;
2934}
2935
2936static PyObject *
2937decimal_from_triple(PyObject *module, PyObject *tuple)
2938{
2939 mpd_uint128_triple_t triple = { MPD_TRIPLE_ERROR, 0, 0, 0, 0 };
2940 PyObject *exp;
2941 unsigned long sign;
2942
2943 (void)module;
2944 if (!decimal_initialized) {
2945 if (import_decimal() < 0) {
2946 return NULL;
2947 }
2948
2949 decimal_initialized = 1;
2950 }
2951
2952 if (!PyTuple_Check(tuple)) {
2953 PyErr_SetString(PyExc_TypeError, "argument must be a tuple");
2954 return NULL;
2955 }
2956
2957 if (PyTuple_GET_SIZE(tuple) != 4) {
2958 PyErr_SetString(PyExc_ValueError, "tuple size must be 4");
2959 return NULL;
2960 }
2961
2962 sign = PyLong_AsUnsignedLong(PyTuple_GET_ITEM(tuple, 0));
2963 if (sign == (unsigned long)-1 && PyErr_Occurred()) {
2964 return NULL;
2965 }
2966 if (sign > UINT8_MAX) {
2967 PyErr_SetString(PyExc_ValueError, "sign must be 0 or 1");
2968 return NULL;
2969 }
2970 triple.sign = (uint8_t)sign;
2971
2972 triple.hi = PyLong_AsUnsignedLongLong(PyTuple_GET_ITEM(tuple, 1));
2973 if (triple.hi == (unsigned long long)-1 && PyErr_Occurred()) {
2974 return NULL;
2975 }
2976
2977 triple.lo = PyLong_AsUnsignedLongLong(PyTuple_GET_ITEM(tuple, 2));
2978 if (triple.lo == (unsigned long long)-1 && PyErr_Occurred()) {
2979 return NULL;
2980 }
2981
2982 exp = PyTuple_GET_ITEM(tuple, 3);
2983 if (PyLong_Check(exp)) {
2984 triple.tag = MPD_TRIPLE_NORMAL;
2985 triple.exp = PyLong_AsLongLong(exp);
2986 if (triple.exp == -1 && PyErr_Occurred()) {
2987 return NULL;
2988 }
2989 }
2990 else if (PyUnicode_Check(exp)) {
2991 if (PyUnicode_CompareWithASCIIString(exp, "F") == 0) {
2992 triple.tag = MPD_TRIPLE_INF;
2993 }
2994 else if (PyUnicode_CompareWithASCIIString(exp, "n") == 0) {
2995 triple.tag = MPD_TRIPLE_QNAN;
2996 }
2997 else if (PyUnicode_CompareWithASCIIString(exp, "N") == 0) {
2998 triple.tag = MPD_TRIPLE_SNAN;
2999 }
3000 else {
3001 PyErr_SetString(PyExc_ValueError, "not a valid exponent");
3002 return NULL;
3003 }
3004 }
3005 else {
3006 PyErr_SetString(PyExc_TypeError, "exponent must be int or string");
3007 return NULL;
3008 }
3009
3010 return PyDec_FromUint128Triple(&triple);
3011}
3012
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003013/* test_thread_state spawns a thread of its own, and that thread releases
3014 * `thread_done` when it's finished. The driver code has to know when the
3015 * thread finishes, because the thread uses a PyObject (the callable) that
3016 * may go away when the driver finishes. The former lack of this explicit
3017 * synchronization caused rare segfaults, so rare that they were seen only
3018 * on a Mac buildbot (although they were possible on any box).
3019 */
3020static PyThread_type_lock thread_done = NULL;
3021
Benjamin Petersona786b022008-08-25 21:05:21 +00003022static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003023_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003024{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003025 PyObject *rc;
3026 int success;
3027 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07003028 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003029 success = (rc != NULL);
3030 Py_XDECREF(rc);
3031 PyGILState_Release(s);
3032 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003033}
3034
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003035/* Same thing, but releases `thread_done` when it returns. This variant
3036 * should be called only from threads spawned by test_thread_state().
3037 */
3038static void
3039_make_call_from_thread(void *callable)
3040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003041 _make_call(callable);
3042 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003043}
3044
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003045static PyObject *
3046test_thread_state(PyObject *self, PyObject *args)
3047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 PyObject *fn;
3049 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003051 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
3052 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054 if (!PyCallable_Check(fn)) {
3055 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
Victor Stinnerdaa97562020-02-07 03:37:06 +01003056 Py_TYPE(fn)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003057 return NULL;
3058 }
Benjamin Petersona786b022008-08-25 21:05:21 +00003059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003060 thread_done = PyThread_allocate_lock();
3061 if (thread_done == NULL)
3062 return PyErr_NoMemory();
3063 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003065 /* Start a new thread with our callback. */
3066 PyThread_start_new_thread(_make_call_from_thread, fn);
3067 /* Make the callback with the thread lock held by this thread */
3068 success &= _make_call(fn);
3069 /* Do it all again, but this time with the thread-lock released */
3070 Py_BEGIN_ALLOW_THREADS
3071 success &= _make_call(fn);
3072 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
3073 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003075 /* And once more with and without a thread
3076 XXX - should use a lock and work out exactly what we are trying
3077 to test <wink>
3078 */
3079 Py_BEGIN_ALLOW_THREADS
3080 PyThread_start_new_thread(_make_call_from_thread, fn);
3081 success &= _make_call(fn);
3082 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
3083 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085 /* Release lock we acquired above. This is required on HP-UX. */
3086 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003088 PyThread_free_lock(thread_done);
3089 if (!success)
3090 return NULL;
3091 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003092}
Benjamin Petersona54c9092009-01-13 02:11:23 +00003093
3094/* test Py_AddPendingCalls using threads */
3095static int _pending_callback(void *arg)
3096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 /* we assume the argument is callable object to which we own a reference */
3098 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01003099 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003100 Py_DECREF(callable);
3101 Py_XDECREF(r);
3102 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00003103}
3104
3105/* The following requests n callbacks to _pending_callback. It can be
3106 * run from any python thread.
3107 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07003108static PyObject *
3109pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00003110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 PyObject *callable;
3112 int r;
3113 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
3114 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00003115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 /* create the reference for the callbackwhile we hold the lock */
3117 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00003118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003119 Py_BEGIN_ALLOW_THREADS
3120 r = Py_AddPendingCall(&_pending_callback, callable);
3121 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00003122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003123 if (r<0) {
3124 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003125 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003127 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00003128}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003129
Neal Norwitzb0d26332007-08-25 00:49:05 +00003130/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003131static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003132test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00003133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003134 PyObject *result;
3135 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003136
Alexander Belopolskye239d232010-12-08 23:31:48 +00003137#define CHECK_1_FORMAT(FORMAT, TYPE) \
3138 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
3139 if (result == NULL) \
3140 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003141 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00003142 msg = FORMAT " failed at 1"; \
3143 goto Fail; \
3144 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003145 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 CHECK_1_FORMAT("%d", int);
3148 CHECK_1_FORMAT("%ld", long);
3149 /* The z width modifier was added in Python 2.5. */
3150 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 /* The u type code was added in Python 2.5. */
3153 CHECK_1_FORMAT("%u", unsigned int);
3154 CHECK_1_FORMAT("%lu", unsigned long);
3155 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003157 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003158 CHECK_1_FORMAT("%llu", unsigned long long);
3159 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00003160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003161 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003162
3163 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003164 Py_XDECREF(result);
3165 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003166
3167#undef CHECK_1_FORMAT
3168}
3169
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00003170
3171static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303172test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003173 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
3174 int result;
3175 if (py_s == NULL)
3176 return NULL;
3177 result = PyUnicode_CompareWithASCIIString(py_s, "str");
3178 Py_DECREF(py_s);
3179 if (!result) {
3180 PyErr_SetString(TestError, "Python string ending in NULL "
3181 "should not compare equal to c string.");
3182 return NULL;
3183 }
3184 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00003185}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00003186
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003187/* This is here to provide a docstring for test_descr. */
3188static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303189test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003191 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003192}
3193
Mark Dickinson725bfd82009-05-03 20:33:40 +00003194/* Test PyOS_string_to_double. */
3195static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303196test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003197 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02003198 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200#define CHECK_STRING(STR, expected) \
3201 result = PyOS_string_to_double(STR, NULL, NULL); \
3202 if (result == -1.0 && PyErr_Occurred()) \
3203 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07003204 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 msg = "conversion of " STR " to float failed"; \
3206 goto fail; \
3207 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00003208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209#define CHECK_INVALID(STR) \
3210 result = PyOS_string_to_double(STR, NULL, NULL); \
3211 if (result == -1.0 && PyErr_Occurred()) { \
3212 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
3213 PyErr_Clear(); \
3214 else \
3215 return NULL; \
3216 } \
3217 else { \
3218 msg = "conversion of " STR " didn't raise ValueError"; \
3219 goto fail; \
3220 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00003221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 CHECK_STRING("0.1", 0.1);
3223 CHECK_STRING("1.234", 1.234);
3224 CHECK_STRING("-1.35", -1.35);
3225 CHECK_STRING(".1e01", 1.0);
3226 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00003227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 CHECK_INVALID(" 0.1");
3229 CHECK_INVALID("\t\n-3");
3230 CHECK_INVALID(".123 ");
3231 CHECK_INVALID("3\n");
3232 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00003233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003234 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003235 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00003237#undef CHECK_STRING
3238#undef CHECK_INVALID
3239}
3240
3241
Benjamin Petersonb173f782009-05-05 22:31:58 +00003242/* Coverage testing of capsule objects. */
3243
3244static const char *capsule_name = "capsule name";
3245static char *capsule_pointer = "capsule pointer";
3246static char *capsule_context = "capsule context";
3247static const char *capsule_error = NULL;
3248static int
3249capsule_destructor_call_count = 0;
3250
3251static void
3252capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 capsule_destructor_call_count++;
3254 if (PyCapsule_GetContext(o) != capsule_context) {
3255 capsule_error = "context did not match in destructor!";
3256 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
3257 capsule_error = "destructor did not match in destructor! (woah!)";
3258 } else if (PyCapsule_GetName(o) != capsule_name) {
3259 capsule_error = "name did not match in destructor!";
3260 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
3261 capsule_error = "pointer did not match in destructor!";
3262 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003263}
3264
3265typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003266 char *name;
3267 char *module;
3268 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003269} known_capsule;
3270
3271static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003272test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00003273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003274 PyObject *object;
3275 const char *error = NULL;
3276 void *pointer;
3277 void *pointer2;
3278 known_capsule known_capsules[] = {
3279 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
3280 KNOWN_CAPSULE("_socket", "CAPI"),
3281 KNOWN_CAPSULE("_curses", "_C_API"),
3282 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
3283 { NULL, NULL },
3284 };
3285 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003286
3287#define FAIL(x) { error = (x); goto exit; }
3288
3289#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003290 if (capsule_error) { \
3291 FAIL(capsule_error); \
3292 } \
3293 else if (!capsule_destructor_call_count) { \
3294 FAIL("destructor not called!"); \
3295 } \
3296 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
3299 PyCapsule_SetContext(object, capsule_context);
3300 capsule_destructor(object);
3301 CHECK_DESTRUCTOR;
3302 Py_DECREF(object);
3303 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 object = PyCapsule_New(known, "ignored", NULL);
3306 PyCapsule_SetPointer(object, capsule_pointer);
3307 PyCapsule_SetName(object, capsule_name);
3308 PyCapsule_SetDestructor(object, capsule_destructor);
3309 PyCapsule_SetContext(object, capsule_context);
3310 capsule_destructor(object);
3311 CHECK_DESTRUCTOR;
3312 /* intentionally access using the wrong name */
3313 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
3314 if (!PyErr_Occurred()) {
3315 FAIL("PyCapsule_GetPointer should have failed but did not!");
3316 }
3317 PyErr_Clear();
3318 if (pointer2) {
3319 if (pointer2 == capsule_pointer) {
3320 FAIL("PyCapsule_GetPointer should not have"
3321 " returned the internal pointer!");
3322 } else {
3323 FAIL("PyCapsule_GetPointer should have "
3324 "returned NULL pointer but did not!");
3325 }
3326 }
3327 PyCapsule_SetDestructor(object, NULL);
3328 Py_DECREF(object);
3329 if (capsule_destructor_call_count) {
3330 FAIL("destructor called when it should not have been!");
3331 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 for (known = &known_capsules[0]; known->module != NULL; known++) {
3334 /* yeah, ordinarily I wouldn't do this either,
3335 but it's fine for this test harness.
3336 */
3337 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003338#undef FAIL
3339#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 { \
3341 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
3342 x, known->module, known->attribute); \
3343 error = buffer; \
3344 goto exit; \
3345 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 PyObject *module = PyImport_ImportModule(known->module);
3348 if (module) {
3349 pointer = PyCapsule_Import(known->name, 0);
3350 if (!pointer) {
3351 Py_DECREF(module);
3352 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
3353 }
3354 object = PyObject_GetAttrString(module, known->attribute);
3355 if (!object) {
3356 Py_DECREF(module);
3357 return NULL;
3358 }
3359 pointer2 = PyCapsule_GetPointer(object,
3360 "weebles wobble but they don't fall down");
3361 if (!PyErr_Occurred()) {
3362 Py_DECREF(object);
3363 Py_DECREF(module);
3364 FAIL("PyCapsule_GetPointer should have failed but did not!");
3365 }
3366 PyErr_Clear();
3367 if (pointer2) {
3368 Py_DECREF(module);
3369 Py_DECREF(object);
3370 if (pointer2 == pointer) {
3371 FAIL("PyCapsule_GetPointer should not have"
3372 " returned its internal pointer!");
3373 } else {
3374 FAIL("PyCapsule_GetPointer should have"
3375 " returned NULL pointer but did not!");
3376 }
3377 }
3378 Py_DECREF(object);
3379 Py_DECREF(module);
3380 }
3381 else
3382 PyErr_Clear();
3383 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003384
3385 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003386 if (error) {
3387 return raiseTestError("test_capsule", error);
3388 }
3389 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003390#undef FAIL
3391}
3392
Guido van Rossumddefaf32007-01-14 03:31:43 +00003393#ifdef HAVE_GETTIMEOFDAY
3394/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00003395static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003397 e->tv_sec -= s->tv_sec;
3398 e->tv_usec -= s->tv_usec;
3399 if (e->tv_usec < 0) {
3400 e->tv_sec -=1;
3401 e->tv_usec += 1000000;
3402 }
3403 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003404}
3405
3406static PyObject *
3407profile_int(PyObject *self, PyObject* args)
3408{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003409 int i, k;
3410 struct timeval start, stop;
3411 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 /* Test 1: Allocate and immediately deallocate
3414 many small integers */
3415 gettimeofday(&start, NULL);
3416 for(k=0; k < 20000; k++)
3417 for(i=0; i < 1000; i++) {
3418 single = PyLong_FromLong(i);
3419 Py_DECREF(single);
3420 }
3421 gettimeofday(&stop, NULL);
3422 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 /* Test 2: Allocate and immediately deallocate
3425 many large integers */
3426 gettimeofday(&start, NULL);
3427 for(k=0; k < 20000; k++)
3428 for(i=0; i < 1000; i++) {
3429 single = PyLong_FromLong(i+1000000);
3430 Py_DECREF(single);
3431 }
3432 gettimeofday(&stop, NULL);
3433 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003435 /* Test 3: Allocate a few integers, then release
3436 them all simultaneously. */
3437 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02003438 if (multiple == NULL)
3439 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003440 gettimeofday(&start, NULL);
3441 for(k=0; k < 20000; k++) {
3442 for(i=0; i < 1000; i++) {
3443 multiple[i] = PyLong_FromLong(i+1000000);
3444 }
3445 for(i=0; i < 1000; i++) {
3446 Py_DECREF(multiple[i]);
3447 }
3448 }
3449 gettimeofday(&stop, NULL);
3450 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003451 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 /* Test 4: Allocate many integers, then release
3454 them all simultaneously. */
3455 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003456 if (multiple == NULL)
3457 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 gettimeofday(&start, NULL);
3459 for(k=0; k < 20; k++) {
3460 for(i=0; i < 1000000; i++) {
3461 multiple[i] = PyLong_FromLong(i+1000000);
3462 }
3463 for(i=0; i < 1000000; i++) {
3464 Py_DECREF(multiple[i]);
3465 }
3466 }
3467 gettimeofday(&stop, NULL);
3468 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003469 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003471 /* Test 5: Allocate many integers < 32000 */
3472 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003473 if (multiple == NULL)
3474 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003475 gettimeofday(&start, NULL);
3476 for(k=0; k < 10; k++) {
3477 for(i=0; i < 1000000; i++) {
3478 multiple[i] = PyLong_FromLong(i+1000);
3479 }
3480 for(i=0; i < 1000000; i++) {
3481 Py_DECREF(multiple[i]);
3482 }
3483 }
3484 gettimeofday(&stop, NULL);
3485 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003486 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003488 /* Test 6: Perform small int addition */
3489 op1 = PyLong_FromLong(1);
3490 gettimeofday(&start, NULL);
3491 for(i=0; i < 10000000; i++) {
3492 result = PyNumber_Add(op1, op1);
3493 Py_DECREF(result);
3494 }
3495 gettimeofday(&stop, NULL);
3496 Py_DECREF(op1);
3497 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003499 /* Test 7: Perform medium int addition */
3500 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003501 if (op1 == NULL)
3502 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003503 gettimeofday(&start, NULL);
3504 for(i=0; i < 10000000; i++) {
3505 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003506 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003507 }
3508 gettimeofday(&stop, NULL);
3509 Py_DECREF(op1);
3510 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003511
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003512 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003513}
3514#endif
3515
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003516/* To test the format of tracebacks as printed out. */
3517static PyObject *
3518traceback_print(PyObject *self, PyObject *args)
3519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003520 PyObject *file;
3521 PyObject *traceback;
3522 int result;
3523
3524 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3525 &traceback, &file))
3526 return NULL;
3527
3528 result = PyTraceBack_Print(traceback, file);
3529 if (result < 0)
3530 return NULL;
3531 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003532}
3533
Benjamin Petersone6528212008-07-15 15:32:09 +00003534/* To test the format of exceptions as printed out. */
3535static PyObject *
3536exception_print(PyObject *self, PyObject *args)
3537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003538 PyObject *value;
3539 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003541 if (!PyArg_ParseTuple(args, "O:exception_print",
3542 &value))
3543 return NULL;
3544 if (!PyExceptionInstance_Check(value)) {
3545 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3546 return NULL;
3547 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003549 tb = PyException_GetTraceback(value);
3550 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3551 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003554}
3555
3556
3557
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003558
3559/* reliably raise a MemoryError */
3560static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303561raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003562{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003563 PyErr_NoMemory();
3564 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003565}
3566
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003567/* Issue 6012 */
3568static PyObject *str1, *str2;
3569static int
3570failing_converter(PyObject *obj, void *arg)
3571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003572 /* Clone str1, then let the conversion fail. */
3573 assert(str1);
3574 str2 = str1;
3575 Py_INCREF(str2);
3576 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003577}
3578static PyObject*
3579argparsing(PyObject *o, PyObject *args)
3580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003581 PyObject *res;
3582 str1 = str2 = NULL;
3583 if (!PyArg_ParseTuple(args, "O&O&",
3584 PyUnicode_FSConverter, &str1,
3585 failing_converter, &str2)) {
3586 if (!str2)
3587 /* argument converter not called? */
3588 return NULL;
3589 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003590 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003591 Py_DECREF(str2);
3592 PyErr_Clear();
3593 return res;
3594 }
3595 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003596}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003597
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003598/* To test that the result of PyCode_NewEmpty has the right members. */
3599static PyObject *
3600code_newempty(PyObject *self, PyObject *args)
3601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003602 const char *filename;
3603 const char *funcname;
3604 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3607 &filename, &funcname, &firstlineno))
3608 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003610 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003611}
3612
Georg Brandl1e28a272009-12-28 08:41:01 +00003613/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3614 Run via Lib/test/test_exceptions.py */
3615static PyObject *
3616make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003618 const char *name;
3619 const char *doc = NULL;
3620 PyObject *base = NULL;
3621 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003623 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003625 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3626 "s|sOO:make_exception_with_doc", kwlist,
3627 &name, &doc, &base, &dict))
3628 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003630 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003631}
3632
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003633static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303634make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003635{
3636 Py_buffer info;
3637 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3638 return NULL;
3639 return PyMemoryView_FromBuffer(&info);
3640}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003641
Stefan Krah7213fcc2015-02-01 16:19:23 +01003642static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003643test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003644{
3645 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3646 int init[5] = {0, 1, 2, 3, 4};
3647 Py_ssize_t itemsize = sizeof(int);
3648 Py_ssize_t shape = 5;
3649 Py_ssize_t strides = 2 * itemsize;
3650 Py_buffer view = {
3651 data,
3652 NULL,
3653 5 * itemsize,
3654 itemsize,
3655 1,
3656 1,
3657 NULL,
3658 &shape,
3659 &strides,
3660 NULL,
3661 NULL
3662 };
3663 int *ptr;
3664 int i;
3665
3666 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3667 ptr = view.buf;
3668 for (i = 0; i < 5; i++) {
3669 if (ptr[2*i] != i) {
3670 PyErr_SetString(TestError,
3671 "test_from_contiguous: incorrect result");
3672 return NULL;
3673 }
3674 }
3675
3676 view.buf = &data[8];
3677 view.strides[0] = -2 * itemsize;
3678
3679 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3680 ptr = view.buf;
3681 for (i = 0; i < 5; i++) {
3682 if (*(ptr-2*i) != i) {
3683 PyErr_SetString(TestError,
3684 "test_from_contiguous: incorrect result");
3685 return NULL;
3686 }
3687 }
3688
3689 Py_RETURN_NONE;
3690}
Stefan Krah650c1e82015-02-03 21:43:23 +01003691
Stefan Kraha7559c02015-02-03 22:27:21 +01003692#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003693extern PyTypeObject _PyBytesIOBuffer_Type;
3694
Stefan Krah5178d912015-02-03 16:57:21 +01003695static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003696test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003697{
Stefan Krah650c1e82015-02-03 21:43:23 +01003698 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003699 PyObject *b;
3700 char *dummy[1];
3701 int ret, match;
3702
Stefan Krah650c1e82015-02-03 21:43:23 +01003703 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003704 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3705 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3706 PyErr_Clear();
3707 if (ret != -1 || match == 0)
3708 goto error;
3709
Stefan Krah650c1e82015-02-03 21:43:23 +01003710 /* bytesiobuf_getbuffer() */
3711 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003712 if (b == NULL) {
3713 return NULL;
3714 }
3715
3716 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3717 Py_DECREF(b);
3718 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3719 PyErr_Clear();
3720 if (ret != -1 || match == 0)
3721 goto error;
3722
3723 Py_RETURN_NONE;
3724
3725error:
3726 PyErr_SetString(TestError,
3727 "test_pep3118_obsolete_write_locks: failure");
3728 return NULL;
3729}
Stefan Kraha7559c02015-02-03 22:27:21 +01003730#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003731
Stefan Krah650c1e82015-02-03 21:43:23 +01003732/* This tests functions that historically supported write locks. It is
3733 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3734 is entitled to segfault in that case. */
3735static PyObject *
3736getbuffer_with_null_view(PyObject* self, PyObject *obj)
3737{
3738 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3739 return NULL;
3740
3741 Py_RETURN_NONE;
3742}
3743
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03003744/* PyBuffer_SizeFromFormat() */
3745static PyObject *
3746test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
3747{
3748 const char *format;
3749 Py_ssize_t result;
3750
3751 if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
3752 &format)) {
3753 return NULL;
3754 }
3755
3756 result = PyBuffer_SizeFromFormat(format);
3757 if (result == -1) {
3758 return NULL;
3759 }
3760
3761 return PyLong_FromSsize_t(result);
3762}
3763
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003764/* Test that the fatal error from not having a current thread doesn't
3765 cause an infinite loop. Run via Lib/test/test_capi.py */
3766static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303767crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003768{
3769 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003770 /* Using PyThreadState_Get() directly allows the test to pass in
3771 !pydebug mode. However, the test only actually tests anything
3772 in pydebug mode, since that's where the infinite loop was in
3773 the first place. */
3774 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003775 Py_END_ALLOW_THREADS
3776 return NULL;
3777}
3778
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003779/* To run some code in a sub-interpreter. */
3780static PyObject *
3781run_in_subinterp(PyObject *self, PyObject *args)
3782{
3783 const char *code;
3784 int r;
3785 PyThreadState *substate, *mainstate;
Guido van Rossum9d197c72020-06-27 17:33:49 -07003786 /* only initialise 'cflags.cf_flags' to test backwards compatibility */
3787 PyCompilerFlags cflags = {0};
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003788
3789 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3790 &code))
3791 return NULL;
3792
3793 mainstate = PyThreadState_Get();
3794
3795 PyThreadState_Swap(NULL);
3796
3797 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003798 if (substate == NULL) {
3799 /* Since no new thread state was created, there is no exception to
3800 propagate; raise a fresh one after swapping in the old thread
3801 state. */
3802 PyThreadState_Swap(mainstate);
3803 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3804 return NULL;
3805 }
Guido van Rossum9d197c72020-06-27 17:33:49 -07003806 r = PyRun_SimpleStringFlags(code, &cflags);
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003807 Py_EndInterpreter(substate);
3808
3809 PyThreadState_Swap(mainstate);
3810
3811 return PyLong_FromLong(r);
3812}
3813
Victor Stinner3c1b3792014-02-17 00:02:43 +01003814static int
3815check_time_rounding(int round)
3816{
Victor Stinner74474232015-09-02 01:43:56 +02003817 if (round != _PyTime_ROUND_FLOOR
3818 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003819 && round != _PyTime_ROUND_HALF_EVEN
3820 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003821 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3822 return -1;
3823 }
3824 return 0;
3825}
3826
Victor Stinner5d272cc2012-03-13 13:35:55 +01003827static PyObject *
3828test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3829{
3830 PyObject *obj;
3831 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003832 int round;
3833 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003834 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003835 if (check_time_rounding(round) < 0)
3836 return NULL;
3837 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003838 return NULL;
3839 return _PyLong_FromTime_t(sec);
3840}
3841
3842static PyObject *
3843test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3844{
3845 PyObject *obj;
3846 time_t sec;
3847 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003848 int round;
3849 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003850 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003851 if (check_time_rounding(round) < 0)
3852 return NULL;
3853 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003854 return NULL;
3855 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3856}
3857
Victor Stinner643cd682012-03-02 22:54:03 +01003858static PyObject *
3859test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3860{
3861 PyObject *obj;
3862 time_t sec;
3863 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003864 int round;
3865 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003866 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003867 if (check_time_rounding(round) < 0)
3868 return NULL;
3869 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003870 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003871 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003872}
3873
Antoine Pitrou796564c2013-07-30 19:59:21 +02003874static void
3875slot_tp_del(PyObject *self)
3876{
3877 _Py_IDENTIFIER(__tp_del__);
3878 PyObject *del, *res;
3879 PyObject *error_type, *error_value, *error_traceback;
3880
3881 /* Temporarily resurrect the object. */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003882 assert(Py_REFCNT(self) == 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003883 Py_SET_REFCNT(self, 1);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003884
3885 /* Save the current exception, if any. */
3886 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3887
3888 /* Execute __del__ method, if any. */
3889 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3890 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003891 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003892 if (res == NULL)
3893 PyErr_WriteUnraisable(del);
3894 else
3895 Py_DECREF(res);
3896 Py_DECREF(del);
3897 }
3898
3899 /* Restore the saved exception. */
3900 PyErr_Restore(error_type, error_value, error_traceback);
3901
3902 /* Undo the temporary resurrection; can't use DECREF here, it would
3903 * cause a recursive call.
3904 */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003905 assert(Py_REFCNT(self) > 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003906 Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
3907 if (Py_REFCNT(self) == 0) {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003908 /* this is the normal path out */
3909 return;
3910 }
Antoine Pitrou796564c2013-07-30 19:59:21 +02003911
3912 /* __del__ resurrected it! Make it look like the original Py_DECREF
3913 * never happened.
3914 */
3915 {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003916 Py_ssize_t refcnt = Py_REFCNT(self);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003917 _Py_NewReference(self);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003918 Py_SET_REFCNT(self, refcnt);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003919 }
Pablo Galindof13072b2020-04-11 01:21:54 +01003920 assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self));
Victor Stinner49932fe2020-02-03 17:55:05 +01003921 /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
3922 _Py_RefTotal, so we need to undo that. */
3923#ifdef Py_REF_DEBUG
3924 _Py_RefTotal--;
3925#endif
Antoine Pitrou796564c2013-07-30 19:59:21 +02003926}
3927
3928static PyObject *
3929with_tp_del(PyObject *self, PyObject *args)
3930{
3931 PyObject *obj;
3932 PyTypeObject *tp;
3933
3934 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3935 return NULL;
3936 tp = (PyTypeObject *) obj;
3937 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3938 PyErr_Format(PyExc_TypeError,
3939 "heap type expected, got %R", obj);
3940 return NULL;
3941 }
3942 tp->tp_del = slot_tp_del;
3943 Py_INCREF(obj);
3944 return obj;
3945}
3946
Brandt Bucherc13b8472020-10-14 18:44:07 -07003947static PyObject *
3948without_gc(PyObject *Py_UNUSED(self), PyObject *obj)
3949{
3950 PyTypeObject *tp = (PyTypeObject*)obj;
3951 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3952 return PyErr_Format(PyExc_TypeError, "heap type expected, got %R", obj);
3953 }
3954 if (PyType_IS_GC(tp)) {
3955 // Don't try this at home, kids:
3956 tp->tp_flags -= Py_TPFLAGS_HAVE_GC;
3957 tp->tp_free = PyObject_Del;
3958 tp->tp_traverse = NULL;
3959 tp->tp_clear = NULL;
3960 }
3961 assert(!PyType_IS_GC(tp));
3962 Py_INCREF(obj);
3963 return obj;
3964}
3965
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003966static PyMethodDef ml;
3967
3968static PyObject *
3969create_cfunction(PyObject *self, PyObject *args)
3970{
3971 return PyCFunction_NewEx(&ml, self, NULL);
3972}
3973
3974static PyMethodDef ml = {
3975 "create_cfunction",
3976 create_cfunction,
3977 METH_NOARGS,
3978 NULL
3979};
3980
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003981static PyObject *
3982_test_incref(PyObject *ob)
3983{
3984 Py_INCREF(ob);
3985 return ob;
3986}
3987
3988static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303989test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003990{
3991 PyObject *obj = PyLong_FromLong(0);
3992 Py_XINCREF(_test_incref(obj));
3993 Py_DECREF(obj);
3994 Py_DECREF(obj);
3995 Py_DECREF(obj);
3996 Py_RETURN_NONE;
3997}
3998
3999static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304000test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07004001{
4002 PyObject *obj = PyLong_FromLong(0);
4003 Py_INCREF(_test_incref(obj));
4004 Py_DECREF(obj);
4005 Py_DECREF(obj);
4006 Py_DECREF(obj);
4007 Py_RETURN_NONE;
4008}
4009
4010static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304011test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07004012{
4013 Py_XDECREF(PyLong_FromLong(0));
4014 Py_RETURN_NONE;
4015}
4016
4017static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304018test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07004019{
4020 Py_DECREF(PyLong_FromLong(0));
4021 Py_RETURN_NONE;
4022}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004023
Victor Stinner0507bf52013-07-07 02:05:46 +02004024static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08004025test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
4026 PyObject *Py_UNUSED(args))
4027{
4028 PyStructSequence_Desc descr;
4029 PyStructSequence_Field descr_fields[3];
4030
4031 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
4032 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
4033 descr_fields[2] = (PyStructSequence_Field){0, NULL};
4034
4035 descr.name = "_testcapi.test_descr";
4036 descr.doc = "This is used to test for memory leaks in NewType";
4037 descr.fields = descr_fields;
4038 descr.n_in_sequence = 1;
4039
4040 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
4041 assert(structseq_type != NULL);
4042 assert(PyType_Check(structseq_type));
4043 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
4044 Py_DECREF(structseq_type);
4045
4046 Py_RETURN_NONE;
4047}
4048
4049static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304050test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02004051{
4052 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02004053 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02004054 Py_DecRef(obj);
4055 Py_DecRef(obj);
4056 Py_RETURN_NONE;
4057}
4058
4059static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304060test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004061{
4062 void *ptr;
4063
Victor Stinnerdb067af2014-05-02 22:31:14 +02004064 ptr = PyMem_RawMalloc(0);
4065 if (ptr == NULL) {
4066 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
4067 return NULL;
4068 }
4069 PyMem_RawFree(ptr);
4070
4071 ptr = PyMem_RawCalloc(0, 0);
4072 if (ptr == NULL) {
4073 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
4074 return NULL;
4075 }
4076 PyMem_RawFree(ptr);
4077
Victor Stinner0507bf52013-07-07 02:05:46 +02004078 ptr = PyMem_Malloc(0);
4079 if (ptr == NULL) {
4080 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
4081 return NULL;
4082 }
4083 PyMem_Free(ptr);
4084
Victor Stinnerdb067af2014-05-02 22:31:14 +02004085 ptr = PyMem_Calloc(0, 0);
4086 if (ptr == NULL) {
4087 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
4088 return NULL;
4089 }
4090 PyMem_Free(ptr);
4091
Victor Stinner0507bf52013-07-07 02:05:46 +02004092 ptr = PyObject_Malloc(0);
4093 if (ptr == NULL) {
4094 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
4095 return NULL;
4096 }
4097 PyObject_Free(ptr);
4098
Victor Stinnerdb067af2014-05-02 22:31:14 +02004099 ptr = PyObject_Calloc(0, 0);
4100 if (ptr == NULL) {
4101 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
4102 return NULL;
4103 }
4104 PyObject_Free(ptr);
4105
Victor Stinner0507bf52013-07-07 02:05:46 +02004106 Py_RETURN_NONE;
4107}
4108
4109typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02004110 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02004111
4112 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004113 size_t calloc_nelem;
4114 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02004115 void *realloc_ptr;
4116 size_t realloc_new_size;
4117 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004118 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004119} alloc_hook_t;
4120
Victor Stinner9ed83c42017-10-31 12:18:10 -07004121static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02004122{
4123 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004124 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004125 hook->malloc_size = size;
4126 return hook->alloc.malloc(hook->alloc.ctx, size);
4127}
4128
Victor Stinner9ed83c42017-10-31 12:18:10 -07004129static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02004130{
4131 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004132 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004133 hook->calloc_nelem = nelem;
4134 hook->calloc_elsize = elsize;
4135 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
4136}
4137
Victor Stinner9ed83c42017-10-31 12:18:10 -07004138static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02004139{
4140 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004141 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004142 hook->realloc_ptr = ptr;
4143 hook->realloc_new_size = new_size;
4144 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
4145}
4146
Victor Stinner9ed83c42017-10-31 12:18:10 -07004147static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02004148{
4149 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004150 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004151 hook->free_ptr = ptr;
4152 hook->alloc.free(hook->alloc.ctx, ptr);
4153}
4154
4155static PyObject *
4156test_setallocators(PyMemAllocatorDomain domain)
4157{
4158 PyObject *res = NULL;
4159 const char *error_msg;
4160 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02004161 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004162 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02004163 void *ptr, *ptr2;
4164
Victor Stinnerdb067af2014-05-02 22:31:14 +02004165 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02004166
4167 alloc.ctx = &hook;
4168 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004169 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02004170 alloc.realloc = &hook_realloc;
4171 alloc.free = &hook_free;
4172 PyMem_GetAllocator(domain, &hook.alloc);
4173 PyMem_SetAllocator(domain, &alloc);
4174
Victor Stinner9ed83c42017-10-31 12:18:10 -07004175 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02004176 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004177 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02004178 switch(domain)
4179 {
4180 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
4181 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
4182 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
4183 default: ptr = NULL; break;
4184 }
4185
Victor Stinner9ed83c42017-10-31 12:18:10 -07004186#define CHECK_CTX(FUNC) \
4187 if (hook.ctx != &hook) { \
4188 error_msg = FUNC " wrong context"; \
4189 goto fail; \
4190 } \
4191 hook.ctx = NULL; /* reset for next check */
4192
Victor Stinner0507bf52013-07-07 02:05:46 +02004193 if (ptr == NULL) {
4194 error_msg = "malloc failed";
4195 goto fail;
4196 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004197 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02004198 if (hook.malloc_size != size) {
4199 error_msg = "malloc invalid size";
4200 goto fail;
4201 }
4202
4203 size2 = 200;
4204 switch(domain)
4205 {
4206 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
4207 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
4208 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02004209 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02004210 }
4211
4212 if (ptr2 == NULL) {
4213 error_msg = "realloc failed";
4214 goto fail;
4215 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004216 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02004217 if (hook.realloc_ptr != ptr
4218 || hook.realloc_new_size != size2) {
4219 error_msg = "realloc invalid parameters";
4220 goto fail;
4221 }
4222
4223 switch(domain)
4224 {
4225 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
4226 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
4227 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
4228 }
4229
Victor Stinner9ed83c42017-10-31 12:18:10 -07004230 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02004231 if (hook.free_ptr != ptr2) {
4232 error_msg = "free invalid pointer";
4233 goto fail;
4234 }
4235
Victor Stinner9ed83c42017-10-31 12:18:10 -07004236 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02004237 nelem = 2;
4238 elsize = 5;
4239 switch(domain)
4240 {
4241 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
4242 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
4243 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
4244 default: ptr = NULL; break;
4245 }
4246
4247 if (ptr == NULL) {
4248 error_msg = "calloc failed";
4249 goto fail;
4250 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004251 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02004252 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
4253 error_msg = "calloc invalid nelem or elsize";
4254 goto fail;
4255 }
4256
Victor Stinner9ed83c42017-10-31 12:18:10 -07004257 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004258 switch(domain)
4259 {
4260 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
4261 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
4262 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
4263 }
4264
Victor Stinner9ed83c42017-10-31 12:18:10 -07004265 CHECK_CTX("calloc free");
4266 if (hook.free_ptr != ptr) {
4267 error_msg = "calloc free invalid pointer";
4268 goto fail;
4269 }
4270
Victor Stinner0507bf52013-07-07 02:05:46 +02004271 Py_INCREF(Py_None);
4272 res = Py_None;
4273 goto finally;
4274
4275fail:
4276 PyErr_SetString(PyExc_RuntimeError, error_msg);
4277
4278finally:
4279 PyMem_SetAllocator(domain, &hook.alloc);
4280 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004281
4282#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02004283}
4284
4285static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304286test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004287{
4288 return test_setallocators(PYMEM_DOMAIN_RAW);
4289}
4290
4291static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304292test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004293{
4294 return test_setallocators(PYMEM_DOMAIN_MEM);
4295}
4296
4297static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304298test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004299{
4300 return test_setallocators(PYMEM_DOMAIN_OBJ);
4301}
4302
xdegaye85f64302017-07-01 14:14:45 +02004303/* Most part of the following code is inherited from the pyfailmalloc project
4304 * written by Victor Stinner. */
4305static struct {
4306 int installed;
4307 PyMemAllocatorEx raw;
4308 PyMemAllocatorEx mem;
4309 PyMemAllocatorEx obj;
4310} FmHook;
4311
4312static struct {
4313 int start;
4314 int stop;
4315 Py_ssize_t count;
4316} FmData;
4317
4318static int
4319fm_nomemory(void)
4320{
4321 FmData.count++;
4322 if (FmData.count > FmData.start &&
4323 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
4324 return 1;
4325 }
4326 return 0;
4327}
4328
4329static void *
4330hook_fmalloc(void *ctx, size_t size)
4331{
4332 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4333 if (fm_nomemory()) {
4334 return NULL;
4335 }
4336 return alloc->malloc(alloc->ctx, size);
4337}
4338
4339static void *
4340hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
4341{
4342 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4343 if (fm_nomemory()) {
4344 return NULL;
4345 }
4346 return alloc->calloc(alloc->ctx, nelem, elsize);
4347}
4348
4349static void *
4350hook_frealloc(void *ctx, void *ptr, size_t new_size)
4351{
4352 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4353 if (fm_nomemory()) {
4354 return NULL;
4355 }
4356 return alloc->realloc(alloc->ctx, ptr, new_size);
4357}
4358
4359static void
4360hook_ffree(void *ctx, void *ptr)
4361{
4362 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4363 alloc->free(alloc->ctx, ptr);
4364}
4365
4366static void
4367fm_setup_hooks(void)
4368{
4369 PyMemAllocatorEx alloc;
4370
4371 if (FmHook.installed) {
4372 return;
4373 }
4374 FmHook.installed = 1;
4375
4376 alloc.malloc = hook_fmalloc;
4377 alloc.calloc = hook_fcalloc;
4378 alloc.realloc = hook_frealloc;
4379 alloc.free = hook_ffree;
4380 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4381 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4382 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4383
4384 alloc.ctx = &FmHook.raw;
4385 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
4386
4387 alloc.ctx = &FmHook.mem;
4388 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
4389
4390 alloc.ctx = &FmHook.obj;
4391 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
4392}
4393
4394static void
4395fm_remove_hooks(void)
4396{
4397 if (FmHook.installed) {
4398 FmHook.installed = 0;
4399 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4400 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4401 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4402 }
4403}
4404
4405static PyObject*
4406set_nomemory(PyObject *self, PyObject *args)
4407{
4408 /* Memory allocation fails after 'start' allocation requests, and until
4409 * 'stop' allocation requests except when 'stop' is negative or equal
4410 * to 0 (default) in which case allocation failures never stop. */
4411 FmData.count = 0;
4412 FmData.stop = 0;
4413 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
4414 return NULL;
4415 }
4416 fm_setup_hooks();
4417 Py_RETURN_NONE;
4418}
4419
4420static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304421remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02004422{
4423 fm_remove_hooks();
4424 Py_RETURN_NONE;
4425}
4426
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004427PyDoc_STRVAR(docstring_empty,
4428""
4429);
4430
4431PyDoc_STRVAR(docstring_no_signature,
4432"This docstring has no signature."
4433);
4434
4435PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004436"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004437"\n"
4438"This docstring has an invalid signature."
4439);
4440
Larry Hastings2623c8c2014-02-08 22:15:29 -08004441PyDoc_STRVAR(docstring_with_invalid_signature2,
4442"docstring_with_invalid_signature2($module, /, boo)\n"
4443"\n"
4444"--\n"
4445"\n"
4446"This docstring also has an invalid signature."
4447);
4448
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004449PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004450"docstring_with_signature($module, /, sig)\n"
4451"--\n"
4452"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004453"This docstring has a valid signature."
4454);
4455
Zachary Ware8ef887c2015-04-13 18:22:35 -05004456PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4457"docstring_with_signature_but_no_doc($module, /, sig)\n"
4458"--\n"
4459"\n"
4460);
4461
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004462PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004463"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4464"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004465"\n"
4466"\n"
4467"This docstring has a valid signature and some extra newlines."
4468);
4469
Larry Hastings16c51912014-01-07 11:53:01 -08004470PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004471"docstring_with_signature_with_defaults(module, s='avocado',\n"
4472" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4473" local=the_number_three, sys=sys.maxsize,\n"
4474" exp=sys.maxsize - 1)\n"
4475"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004476"\n"
4477"\n"
4478"\n"
4479"This docstring has a valid signature with parameters,\n"
4480"and the parameters take defaults of varying types."
4481);
4482
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004483typedef struct {
4484 PyThread_type_lock start_event;
4485 PyThread_type_lock exit_event;
4486 PyObject *callback;
4487} test_c_thread_t;
4488
4489static void
4490temporary_c_thread(void *data)
4491{
4492 test_c_thread_t *test_c_thread = data;
4493 PyGILState_STATE state;
4494 PyObject *res;
4495
4496 PyThread_release_lock(test_c_thread->start_event);
4497
4498 /* Allocate a Python thread state for this thread */
4499 state = PyGILState_Ensure();
4500
Victor Stinner3466bde2016-09-05 18:16:01 -07004501 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004502 Py_CLEAR(test_c_thread->callback);
4503
4504 if (res == NULL) {
4505 PyErr_Print();
4506 }
4507 else {
4508 Py_DECREF(res);
4509 }
4510
4511 /* Destroy the Python thread state for this thread */
4512 PyGILState_Release(state);
4513
4514 PyThread_release_lock(test_c_thread->exit_event);
4515
4516 PyThread_exit_thread();
4517}
4518
4519static PyObject *
4520call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4521{
4522 PyObject *res = NULL;
4523 test_c_thread_t test_c_thread;
4524 long thread;
4525
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004526 test_c_thread.start_event = PyThread_allocate_lock();
4527 test_c_thread.exit_event = PyThread_allocate_lock();
4528 test_c_thread.callback = NULL;
4529 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4530 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4531 goto exit;
4532 }
4533
4534 Py_INCREF(callback);
4535 test_c_thread.callback = callback;
4536
4537 PyThread_acquire_lock(test_c_thread.start_event, 1);
4538 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4539
4540 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4541 if (thread == -1) {
4542 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4543 PyThread_release_lock(test_c_thread.start_event);
4544 PyThread_release_lock(test_c_thread.exit_event);
4545 goto exit;
4546 }
4547
4548 PyThread_acquire_lock(test_c_thread.start_event, 1);
4549 PyThread_release_lock(test_c_thread.start_event);
4550
4551 Py_BEGIN_ALLOW_THREADS
4552 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4553 PyThread_release_lock(test_c_thread.exit_event);
4554 Py_END_ALLOW_THREADS
4555
4556 Py_INCREF(Py_None);
4557 res = Py_None;
4558
4559exit:
4560 Py_CLEAR(test_c_thread.callback);
4561 if (test_c_thread.start_event)
4562 PyThread_free_lock(test_c_thread.start_event);
4563 if (test_c_thread.exit_event)
4564 PyThread_free_lock(test_c_thread.exit_event);
4565 return res;
4566}
Victor Stinner13105102013-12-13 02:17:29 +01004567
Serhiy Storchakab5181342015-02-06 08:58:56 +02004568/* marshal */
4569
4570static PyObject*
4571pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4572{
4573 long value;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004574 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004575 int version;
4576 FILE *fp;
4577
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004578 if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004579 &value, &filename, &version))
4580 return NULL;
4581
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004582 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004583 if (fp == NULL) {
4584 PyErr_SetFromErrno(PyExc_OSError);
4585 return NULL;
4586 }
4587
4588 PyMarshal_WriteLongToFile(value, fp, version);
4589
4590 fclose(fp);
4591 if (PyErr_Occurred())
4592 return NULL;
4593 Py_RETURN_NONE;
4594}
4595
4596static PyObject*
4597pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4598{
4599 PyObject *obj;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004600 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004601 int version;
4602 FILE *fp;
4603
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004604 if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004605 &obj, &filename, &version))
4606 return NULL;
4607
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004608 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004609 if (fp == NULL) {
4610 PyErr_SetFromErrno(PyExc_OSError);
4611 return NULL;
4612 }
4613
4614 PyMarshal_WriteObjectToFile(obj, fp, version);
4615
4616 fclose(fp);
4617 if (PyErr_Occurred())
4618 return NULL;
4619 Py_RETURN_NONE;
4620}
4621
4622static PyObject*
4623pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4624{
4625 int value;
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_short_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 value = PyMarshal_ReadShortFromFile(fp);
4640 pos = ftell(fp);
4641
4642 fclose(fp);
4643 if (PyErr_Occurred())
4644 return NULL;
4645 return Py_BuildValue("il", value, pos);
4646}
4647
4648static PyObject*
4649pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4650{
4651 long value, pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004652 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004653 FILE *fp;
4654
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004655 if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004656 return NULL;
4657
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004658 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004659 if (fp == NULL) {
4660 PyErr_SetFromErrno(PyExc_OSError);
4661 return NULL;
4662 }
4663
4664 value = PyMarshal_ReadLongFromFile(fp);
4665 pos = ftell(fp);
4666
4667 fclose(fp);
4668 if (PyErr_Occurred())
4669 return NULL;
4670 return Py_BuildValue("ll", value, pos);
4671}
4672
4673static PyObject*
4674pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4675{
4676 PyObject *obj;
4677 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004678 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004679 FILE *fp;
4680
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004681 if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004682 return NULL;
4683
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004684 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004685 if (fp == NULL) {
4686 PyErr_SetFromErrno(PyExc_OSError);
4687 return NULL;
4688 }
4689
4690 obj = PyMarshal_ReadLastObjectFromFile(fp);
4691 pos = ftell(fp);
4692
4693 fclose(fp);
4694 return Py_BuildValue("Nl", obj, pos);
4695}
4696
4697static PyObject*
4698pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4699{
4700 PyObject *obj;
4701 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004702 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004703 FILE *fp;
4704
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004705 if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004706 return NULL;
4707
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004708 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004709 if (fp == NULL) {
4710 PyErr_SetFromErrno(PyExc_OSError);
4711 return NULL;
4712 }
4713
4714 obj = PyMarshal_ReadObjectFromFile(fp);
4715 pos = ftell(fp);
4716
4717 fclose(fp);
4718 return Py_BuildValue("Nl", obj, pos);
4719}
4720
Victor Stinnerefde1462015-03-21 15:04:43 +01004721static PyObject*
4722return_null_without_error(PyObject *self, PyObject *args)
4723{
4724 /* invalid call: return NULL without setting an error,
4725 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4726 PyErr_Clear();
4727 return NULL;
4728}
4729
4730static PyObject*
4731return_result_with_error(PyObject *self, PyObject *args)
4732{
4733 /* invalid call: return a result with an error set,
4734 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4735 PyErr_SetNone(PyExc_ValueError);
4736 Py_RETURN_NONE;
4737}
4738
Victor Stinner992c43f2015-03-27 17:12:45 +01004739static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004740test_pytime_fromseconds(PyObject *self, PyObject *args)
4741{
4742 int seconds;
4743 _PyTime_t ts;
4744
4745 if (!PyArg_ParseTuple(args, "i", &seconds))
4746 return NULL;
4747 ts = _PyTime_FromSeconds(seconds);
4748 return _PyTime_AsNanosecondsObject(ts);
4749}
4750
4751static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004752test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4753{
4754 PyObject *obj;
4755 int round;
4756 _PyTime_t ts;
4757
4758 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4759 return NULL;
4760 if (check_time_rounding(round) < 0)
4761 return NULL;
4762 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4763 return NULL;
4764 return _PyTime_AsNanosecondsObject(ts);
4765}
4766
Victor Stinner4bfb4602015-03-27 22:27:24 +01004767static PyObject *
4768test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4769{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004770 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004771 _PyTime_t ts;
4772 double d;
4773
Victor Stinnerc29b5852017-11-02 07:28:27 -07004774 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004775 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004776 }
4777 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4778 return NULL;
4779 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004780 d = _PyTime_AsSecondsDouble(ts);
4781 return PyFloat_FromDouble(d);
4782}
4783
Victor Stinner95e9cef2015-03-28 01:26:47 +01004784static PyObject *
4785test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4786{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004787 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004788 int round;
4789 _PyTime_t t;
4790 struct timeval tv;
4791 PyObject *seconds;
4792
Victor Stinnerc29b5852017-11-02 07:28:27 -07004793 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004794 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004795 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004796 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004797 }
4798 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004799 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004800 }
4801 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4802 return NULL;
4803 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004804
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004805 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004806 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004807 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004808 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004809 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4810}
4811
Victor Stinner34dc0f42015-03-27 18:19:03 +01004812#ifdef HAVE_CLOCK_GETTIME
4813static PyObject *
4814test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4815{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004816 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004817 _PyTime_t t;
4818 struct timespec ts;
4819
Victor Stinnerc29b5852017-11-02 07:28:27 -07004820 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004821 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004822 }
4823 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004824 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004825 }
4826 if (_PyTime_AsTimespec(t, &ts) == -1) {
4827 return NULL;
4828 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004829 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4830}
4831#endif
4832
Victor Stinner62d1c702015-04-01 17:47:07 +02004833static PyObject *
4834test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4835{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004836 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004837 int round;
4838 _PyTime_t t, ms;
4839
Victor Stinnerc29b5852017-11-02 07:28:27 -07004840 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004841 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004842 }
4843 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004844 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004845 }
4846 if (check_time_rounding(round) < 0) {
4847 return NULL;
4848 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004849 ms = _PyTime_AsMilliseconds(t, round);
4850 /* This conversion rely on the fact that _PyTime_t is a number of
4851 nanoseconds */
4852 return _PyTime_AsNanosecondsObject(ms);
4853}
4854
4855static PyObject *
4856test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4857{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004858 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004859 int round;
4860 _PyTime_t t, ms;
4861
Victor Stinnerc29b5852017-11-02 07:28:27 -07004862 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004863 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004864 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004865 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004866 }
4867 if (check_time_rounding(round) < 0) {
4868 return NULL;
4869 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004870 ms = _PyTime_AsMicroseconds(t, round);
4871 /* This conversion rely on the fact that _PyTime_t is a number of
4872 nanoseconds */
4873 return _PyTime_AsNanosecondsObject(ms);
4874}
4875
Victor Stinner50856d52015-10-13 00:11:21 +02004876static PyObject*
Victor Stinner34be8072016-03-14 12:04:26 +01004877pymem_buffer_overflow(PyObject *self, PyObject *args)
4878{
4879 char *buffer;
4880
4881 /* Deliberate buffer overflow to check that PyMem_Free() detects
4882 the overflow when debug hooks are installed. */
4883 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004884 if (buffer == NULL) {
4885 PyErr_NoMemory();
4886 return NULL;
4887 }
Victor Stinner34be8072016-03-14 12:04:26 +01004888 buffer[16] = 'x';
4889 PyMem_Free(buffer);
4890
4891 Py_RETURN_NONE;
4892}
4893
4894static PyObject*
4895pymem_api_misuse(PyObject *self, PyObject *args)
4896{
4897 char *buffer;
4898
4899 /* Deliberate misusage of Python allocators:
4900 allococate with PyMem but release with PyMem_Raw. */
4901 buffer = PyMem_Malloc(16);
4902 PyMem_RawFree(buffer);
4903
4904 Py_RETURN_NONE;
4905}
4906
Victor Stinnerc4aec362016-03-14 22:26:53 +01004907static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004908pymem_malloc_without_gil(PyObject *self, PyObject *args)
4909{
4910 char *buffer;
4911
4912 /* Deliberate bug to test debug hooks on Python memory allocators:
4913 call PyMem_Malloc() without holding the GIL */
4914 Py_BEGIN_ALLOW_THREADS
4915 buffer = PyMem_Malloc(10);
4916 Py_END_ALLOW_THREADS
4917
4918 PyMem_Free(buffer);
4919
4920 Py_RETURN_NONE;
4921}
4922
Victor Stinner5d39e042017-11-29 17:20:38 +01004923
4924static PyObject*
4925test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4926{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004927 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004928 if (name == NULL) {
4929 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4930 return NULL;
4931 }
4932 return PyUnicode_FromString(name);
4933}
4934
4935
Victor Stinnerad524372016-03-16 12:12:53 +01004936static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004937test_pyobject_is_freed(const char *test_name, PyObject *op)
Victor Stinner2b00db62019-04-11 11:33:27 +02004938{
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004939 if (!_PyObject_IsFreed(op)) {
4940 return raiseTestError(test_name, "object is not seen as freed");
4941 }
4942 Py_RETURN_NONE;
Victor Stinner2b00db62019-04-11 11:33:27 +02004943}
4944
4945
4946static PyObject*
Victor Stinner68762572019-10-07 18:42:01 +02004947check_pyobject_null_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
4948{
4949 PyObject *op = NULL;
4950 return test_pyobject_is_freed("check_pyobject_null_is_freed", op);
4951}
4952
4953
4954static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004955check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004956{
4957 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4958 if (op == NULL) {
4959 return NULL;
4960 }
4961 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004962 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004963 /* object fields like ob_type are uninitialized! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004964 return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004965}
4966
4967
4968static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004969check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004970{
4971 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4972 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4973 if (op == NULL) {
4974 return NULL;
4975 }
4976 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004977 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004978 /* ob_type field is after the memory block: part of "forbidden bytes"
Min ho Kim39d87b52019-08-31 06:21:19 +10004979 when using debug hooks on memory allocators! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004980 return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004981}
4982
4983
4984static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004985check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004986{
4987 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4988 if (op == NULL) {
4989 return NULL;
4990 }
4991 Py_TYPE(op)->tp_dealloc(op);
4992 /* Reset reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004993 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004994 /* object memory is freed! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004995 return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004996}
4997
4998
4999static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01005000pyobject_malloc_without_gil(PyObject *self, PyObject *args)
5001{
5002 char *buffer;
5003
Victor Stinnerad524372016-03-16 12:12:53 +01005004 /* Deliberate bug to test debug hooks on Python memory allocators:
5005 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01005006 Py_BEGIN_ALLOW_THREADS
5007 buffer = PyObject_Malloc(10);
5008 Py_END_ALLOW_THREADS
5009
5010 PyObject_Free(buffer);
5011
5012 Py_RETURN_NONE;
5013}
5014
Victor Stinner10b73e12016-03-22 13:39:05 +01005015static PyObject *
5016tracemalloc_track(PyObject *self, PyObject *args)
5017{
5018 unsigned int domain;
5019 PyObject *ptr_obj;
5020 void *ptr;
5021 Py_ssize_t size;
5022 int release_gil = 0;
5023 int res;
5024
5025 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
5026 return NULL;
5027 ptr = PyLong_AsVoidPtr(ptr_obj);
5028 if (PyErr_Occurred())
5029 return NULL;
5030
5031 if (release_gil) {
5032 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02005033 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01005034 Py_END_ALLOW_THREADS
5035 }
5036 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02005037 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01005038 }
5039
5040 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02005041 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01005042 return NULL;
5043 }
5044
5045 Py_RETURN_NONE;
5046}
5047
5048static PyObject *
5049tracemalloc_untrack(PyObject *self, PyObject *args)
5050{
5051 unsigned int domain;
5052 PyObject *ptr_obj;
5053 void *ptr;
5054 int res;
5055
5056 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
5057 return NULL;
5058 ptr = PyLong_AsVoidPtr(ptr_obj);
5059 if (PyErr_Occurred())
5060 return NULL;
5061
Victor Stinner5ea4c062017-06-20 17:46:36 +02005062 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01005063 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02005064 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01005065 return NULL;
5066 }
5067
5068 Py_RETURN_NONE;
5069}
5070
5071static PyObject *
5072tracemalloc_get_traceback(PyObject *self, PyObject *args)
5073{
5074 unsigned int domain;
5075 PyObject *ptr_obj;
5076 void *ptr;
5077
5078 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
5079 return NULL;
5080 ptr = PyLong_AsVoidPtr(ptr_obj);
5081 if (PyErr_Occurred())
5082 return NULL;
5083
Benjamin Petersonca470632016-09-06 13:47:26 -07005084 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01005085}
5086
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005087static PyObject *
5088dict_get_version(PyObject *self, PyObject *args)
5089{
5090 PyDictObject *dict;
5091 uint64_t version;
5092
5093 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
5094 return NULL;
5095
5096 version = dict->ma_version_tag;
5097
Sergey Fedoseeva9ed91e2019-10-21 11:49:48 +05005098 Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(version));
5099 return PyLong_FromUnsignedLongLong((unsigned long long)version);
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005100}
5101
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005102
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005103static PyObject *
5104raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
5105{
Vladimir Matveev037245c2020-10-09 17:15:15 -07005106 _Py_IDENTIFIER(send);
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005107 PyGenObject *gen;
5108
5109 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
5110 return NULL;
5111
5112 /* This is used in a test to check what happens if a signal arrives just
5113 as we're in the process of entering a yield from chain (see
5114 bpo-30039).
5115
5116 Needs to be done in C, because:
5117 - we don't have a Python wrapper for raise()
5118 - we need to make sure that the Python-level signal handler doesn't run
5119 *before* we enter the generator frame, which is impossible in Python
5120 because we check for signals before every bytecode operation.
5121 */
5122 raise(SIGINT);
Vladimir Matveev037245c2020-10-09 17:15:15 -07005123 return _PyObject_CallMethodIdOneArg((PyObject *)gen, &PyId_send, Py_None);
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005124}
5125
5126
Victor Stinner3b5cf852017-06-09 16:48:45 +02005127static int
5128fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
5129{
5130 if (args == Py_None) {
5131 *stack = NULL;
5132 *nargs = 0;
5133 }
5134 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01005135 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02005136 *nargs = PyTuple_GET_SIZE(args);
5137 }
5138 else {
5139 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
5140 return -1;
5141 }
5142 return 0;
5143}
5144
5145
5146static PyObject *
5147test_pyobject_fastcall(PyObject *self, PyObject *args)
5148{
5149 PyObject *func, *func_args;
5150 PyObject **stack;
5151 Py_ssize_t nargs;
5152
5153 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
5154 return NULL;
5155 }
5156
5157 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5158 return NULL;
5159 }
5160 return _PyObject_FastCall(func, stack, nargs);
5161}
5162
5163
5164static PyObject *
5165test_pyobject_fastcalldict(PyObject *self, PyObject *args)
5166{
5167 PyObject *func, *func_args, *kwargs;
5168 PyObject **stack;
5169 Py_ssize_t nargs;
5170
5171 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
5172 return NULL;
5173 }
5174
5175 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5176 return NULL;
5177 }
5178
5179 if (kwargs == Py_None) {
5180 kwargs = NULL;
5181 }
5182 else if (!PyDict_Check(kwargs)) {
5183 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
5184 return NULL;
5185 }
5186
Petr Viktorinffd97532020-02-11 17:46:57 +01005187 return PyObject_VectorcallDict(func, stack, nargs, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005188}
5189
5190
5191static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005192test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02005193{
5194 PyObject *func, *func_args, *kwnames = NULL;
5195 PyObject **stack;
5196 Py_ssize_t nargs, nkw;
5197
5198 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
5199 return NULL;
5200 }
5201
5202 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5203 return NULL;
5204 }
5205
5206 if (kwnames == Py_None) {
5207 kwnames = NULL;
5208 }
5209 else if (PyTuple_Check(kwnames)) {
5210 nkw = PyTuple_GET_SIZE(kwnames);
5211 if (nargs < nkw) {
5212 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
5213 return NULL;
5214 }
5215 nargs -= nkw;
5216 }
5217 else {
5218 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
5219 return NULL;
5220 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005221 return PyObject_Vectorcall(func, stack, nargs, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005222}
5223
5224
5225static PyObject *
5226test_pyvectorcall_call(PyObject *self, PyObject *args)
5227{
5228 PyObject *func;
5229 PyObject *argstuple;
5230 PyObject *kwargs = NULL;
5231
5232 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
5233 return NULL;
5234 }
5235
5236 if (!PyTuple_Check(argstuple)) {
5237 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
5238 return NULL;
5239 }
5240 if (kwargs != NULL && !PyDict_Check(kwargs)) {
5241 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
5242 return NULL;
5243 }
5244
5245 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005246}
5247
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005248
Victor Stinner64fa4492017-07-10 14:37:49 +02005249static PyObject*
5250stack_pointer(PyObject *self, PyObject *args)
5251{
5252 int v = 5;
5253 return PyLong_FromVoidPtr(&v);
5254}
5255
Victor Stinner3b5cf852017-06-09 16:48:45 +02005256
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005257#ifdef W_STOPCODE
5258static PyObject*
5259py_w_stopcode(PyObject *self, PyObject *args)
5260{
5261 int sig, status;
5262 if (!PyArg_ParseTuple(args, "i", &sig)) {
5263 return NULL;
5264 }
5265 status = W_STOPCODE(sig);
5266 return PyLong_FromLong(status);
5267}
5268#endif
5269
5270
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005271static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03005272get_mapping_keys(PyObject* self, PyObject *obj)
5273{
5274 return PyMapping_Keys(obj);
5275}
5276
5277static PyObject *
5278get_mapping_values(PyObject* self, PyObject *obj)
5279{
5280 return PyMapping_Values(obj);
5281}
5282
5283static PyObject *
5284get_mapping_items(PyObject* self, PyObject *obj)
5285{
5286 return PyMapping_Items(obj);
5287}
5288
5289
5290static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005291test_pythread_tss_key_state(PyObject *self, PyObject *args)
5292{
5293 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
5294 if (PyThread_tss_is_created(&tss_key)) {
5295 return raiseTestError("test_pythread_tss_key_state",
5296 "TSS key not in an uninitialized state at "
5297 "creation time");
5298 }
5299 if (PyThread_tss_create(&tss_key) != 0) {
5300 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
5301 return NULL;
5302 }
5303 if (!PyThread_tss_is_created(&tss_key)) {
5304 return raiseTestError("test_pythread_tss_key_state",
5305 "PyThread_tss_create succeeded, "
5306 "but with TSS key in an uninitialized state");
5307 }
5308 if (PyThread_tss_create(&tss_key) != 0) {
5309 return raiseTestError("test_pythread_tss_key_state",
5310 "PyThread_tss_create unsuccessful with "
5311 "an already initialized key");
5312 }
5313#define CHECK_TSS_API(expr) \
5314 (void)(expr); \
5315 if (!PyThread_tss_is_created(&tss_key)) { \
5316 return raiseTestError("test_pythread_tss_key_state", \
5317 "TSS key initialization state was not " \
5318 "preserved after calling " #expr); }
5319 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
5320 CHECK_TSS_API(PyThread_tss_get(&tss_key));
5321#undef CHECK_TSS_API
5322 PyThread_tss_delete(&tss_key);
5323 if (PyThread_tss_is_created(&tss_key)) {
5324 return raiseTestError("test_pythread_tss_key_state",
5325 "PyThread_tss_delete called, but did not "
5326 "set the key state to uninitialized");
5327 }
5328
5329 Py_tss_t *ptr_key = PyThread_tss_alloc();
5330 if (ptr_key == NULL) {
5331 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
5332 return NULL;
5333 }
5334 if (PyThread_tss_is_created(ptr_key)) {
5335 return raiseTestError("test_pythread_tss_key_state",
5336 "TSS key not in an uninitialized state at "
5337 "allocation time");
5338 }
5339 PyThread_tss_free(ptr_key);
5340 ptr_key = NULL;
5341 Py_RETURN_NONE;
5342}
5343
5344
Yury Selivanovf23746a2018-01-22 19:11:18 -05005345static PyObject*
5346new_hamt(PyObject *self, PyObject *args)
5347{
5348 return _PyContext_NewHamtForTests();
5349}
5350
5351
jdemeyer5a306202018-10-19 23:50:06 +02005352/* def bad_get(self, obj, cls):
5353 cls()
5354 return repr(self)
5355*/
5356static PyObject*
5357bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5358{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005359 PyObject *self, *obj, *cls;
5360 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02005361 return NULL;
5362 }
5363
Jeroen Demeyer7f41c8e2019-07-04 12:35:31 +02005364 PyObject *res = _PyObject_CallNoArg(cls);
jdemeyer5a306202018-10-19 23:50:06 +02005365 if (res == NULL) {
5366 return NULL;
5367 }
5368 Py_DECREF(res);
5369
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005370 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02005371}
5372
5373
Victor Stinner3d4226a2018-08-29 22:21:32 +02005374static PyObject *
5375encode_locale_ex(PyObject *self, PyObject *args)
5376{
5377 PyObject *unicode;
5378 int current_locale = 0;
5379 wchar_t *wstr;
5380 PyObject *res = NULL;
5381 const char *errors = NULL;
5382
5383 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
5384 return NULL;
5385 }
5386 wstr = PyUnicode_AsWideCharString(unicode, NULL);
5387 if (wstr == NULL) {
5388 return NULL;
5389 }
5390 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5391
5392 char *str = NULL;
5393 size_t error_pos;
5394 const char *reason = NULL;
5395 int ret = _Py_EncodeLocaleEx(wstr,
5396 &str, &error_pos, &reason,
5397 current_locale, error_handler);
5398 PyMem_Free(wstr);
5399
5400 switch(ret) {
5401 case 0:
5402 res = PyBytes_FromString(str);
5403 PyMem_RawFree(str);
5404 break;
5405 case -1:
5406 PyErr_NoMemory();
5407 break;
5408 case -2:
5409 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
5410 error_pos, reason);
5411 break;
5412 case -3:
5413 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5414 break;
5415 default:
5416 PyErr_SetString(PyExc_ValueError, "unknow error code");
5417 break;
5418 }
5419 return res;
5420}
5421
5422
5423static PyObject *
5424decode_locale_ex(PyObject *self, PyObject *args)
5425{
5426 char *str;
5427 int current_locale = 0;
5428 PyObject *res = NULL;
5429 const char *errors = NULL;
5430
5431 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
5432 return NULL;
5433 }
5434 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5435
5436 wchar_t *wstr = NULL;
5437 size_t wlen = 0;
5438 const char *reason = NULL;
5439 int ret = _Py_DecodeLocaleEx(str,
5440 &wstr, &wlen, &reason,
5441 current_locale, error_handler);
5442
5443 switch(ret) {
5444 case 0:
5445 res = PyUnicode_FromWideChar(wstr, wlen);
5446 PyMem_RawFree(wstr);
5447 break;
5448 case -1:
5449 PyErr_NoMemory();
5450 break;
5451 case -2:
5452 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
5453 wlen, reason);
5454 break;
5455 case -3:
5456 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5457 break;
5458 default:
5459 PyErr_SetString(PyExc_ValueError, "unknow error code");
5460 break;
5461 }
5462 return res;
5463}
5464
5465
Victor Stinner18618e652018-10-25 17:28:11 +02005466#ifdef Py_REF_DEBUG
5467static PyObject *
5468negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5469{
5470 PyObject *obj = PyUnicode_FromString("negative_refcount");
5471 if (obj == NULL) {
5472 return NULL;
5473 }
5474 assert(Py_REFCNT(obj) == 1);
5475
Victor Stinnerc86a1122020-02-07 01:24:29 +01005476 Py_SET_REFCNT(obj, 0);
Victor Stinner18618e652018-10-25 17:28:11 +02005477 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5478 Py_DECREF(obj);
5479
5480 Py_RETURN_NONE;
5481}
5482#endif
5483
5484
Victor Stinneref9d9b62019-05-22 11:28:22 +02005485static PyObject*
5486test_write_unraisable_exc(PyObject *self, PyObject *args)
5487{
Victor Stinner71c52e32019-05-27 08:57:14 +02005488 PyObject *exc, *err_msg, *obj;
5489 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005490 return NULL;
5491 }
5492
Victor Stinner71c52e32019-05-27 08:57:14 +02005493 const char *err_msg_utf8;
5494 if (err_msg != Py_None) {
5495 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5496 if (err_msg_utf8 == NULL) {
5497 return NULL;
5498 }
5499 }
5500 else {
5501 err_msg_utf8 = NULL;
5502 }
5503
Victor Stinneref9d9b62019-05-22 11:28:22 +02005504 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005505 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005506 Py_RETURN_NONE;
5507}
5508
5509
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005510static PyObject *
5511sequence_getitem(PyObject *self, PyObject *args)
5512{
5513 PyObject *seq;
5514 Py_ssize_t i;
5515 if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
5516 return NULL;
5517 }
5518 return PySequence_GetItem(seq, i);
5519}
5520
5521
Petr Viktorinf9583772019-09-10 12:21:09 +01005522/* Functions for testing C calling conventions (METH_*) are named meth_*,
5523 * e.g. "meth_varargs" for METH_VARARGS.
5524 *
5525 * They all return a tuple of their C-level arguments, with None instead
5526 * of NULL and Python tuples instead of C arrays.
5527 */
5528
5529
5530static PyObject*
5531_null_to_none(PyObject* obj)
5532{
5533 if (obj == NULL) {
5534 Py_RETURN_NONE;
5535 }
5536 Py_INCREF(obj);
5537 return obj;
5538}
5539
5540static PyObject*
5541meth_varargs(PyObject* self, PyObject* args)
5542{
5543 return Py_BuildValue("NO", _null_to_none(self), args);
5544}
5545
5546static PyObject*
5547meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs)
5548{
5549 return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs));
5550}
5551
5552static PyObject*
5553meth_o(PyObject* self, PyObject* obj)
5554{
5555 return Py_BuildValue("NO", _null_to_none(self), obj);
5556}
5557
5558static PyObject*
5559meth_noargs(PyObject* self, PyObject* ignored)
5560{
5561 return _null_to_none(self);
5562}
5563
5564static PyObject*
5565_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs)
5566{
5567 PyObject *tuple = PyTuple_New(nargs);
5568 if (tuple == NULL) {
5569 return NULL;
5570 }
5571 for (Py_ssize_t i=0; i < nargs; i++) {
5572 Py_INCREF(args[i]);
5573 PyTuple_SET_ITEM(tuple, i, args[i]);
5574 }
5575 return tuple;
5576}
5577
5578static PyObject*
5579meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
5580{
5581 return Py_BuildValue(
5582 "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs)
5583 );
5584}
5585
5586static PyObject*
5587meth_fastcall_keywords(PyObject* self, PyObject* const* args,
5588 Py_ssize_t nargs, PyObject* kwargs)
5589{
5590 PyObject *pyargs = _fastcall_to_tuple(args, nargs);
5591 if (pyargs == NULL) {
5592 return NULL;
5593 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005594 PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type,
Petr Viktorinf9583772019-09-10 12:21:09 +01005595 args + nargs, 0, kwargs);
5596 return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
5597}
5598
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005599
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005600static PyObject*
5601pynumber_tobase(PyObject *module, PyObject *args)
5602{
5603 PyObject *obj;
5604 int base;
5605 if (!PyArg_ParseTuple(args, "Oi:pynumber_tobase",
5606 &obj, &base)) {
5607 return NULL;
5608 }
5609 return PyNumber_ToBase(obj, base);
5610}
5611
5612
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005613static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
5614
Victor Stinner0e2ac212020-11-18 18:48:06 +01005615
5616static PyObject*
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005617test_set_type_size(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0e2ac212020-11-18 18:48:06 +01005618{
5619 PyObject *obj = PyList_New(0);
5620 if (obj == NULL) {
5621 return NULL;
5622 }
5623
5624 // Ensure that following tests don't modify the object,
5625 // to ensure that Py_DECREF() will not crash.
5626 assert(Py_TYPE(obj) == &PyList_Type);
5627 assert(Py_SIZE(obj) == 0);
5628
5629 // bpo-39573: Check that Py_TYPE() and Py_SIZE() can be used
5630 // as l-values to set an object type and size.
5631 Py_TYPE(obj) = &PyList_Type;
5632 Py_SIZE(obj) = 0;
5633
5634 Py_DECREF(obj);
5635 Py_RETURN_NONE;
5636}
5637
5638
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005639// Test Py_NewRef() and Py_XNewRef() functions
5640static PyObject*
5641test_refcount(PyObject *self, PyObject *Py_UNUSED(ignored))
5642{
5643 PyObject *obj = PyList_New(0);
5644 if (obj == NULL) {
5645 return NULL;
5646 }
5647 assert(Py_REFCNT(obj) == 1);
5648
5649 // Test Py_NewRef()
5650 PyObject *ref = Py_NewRef(obj);
5651 assert(ref == obj);
5652 assert(Py_REFCNT(obj) == 2);
5653 Py_DECREF(ref);
5654
5655 // Test Py_XNewRef()
5656 PyObject *xref = Py_XNewRef(obj);
5657 assert(xref == obj);
5658 assert(Py_REFCNT(obj) == 2);
5659 Py_DECREF(xref);
5660
5661 assert(Py_XNewRef(NULL) == NULL);
5662
5663 Py_DECREF(obj);
5664 Py_RETURN_NONE;
5665}
5666
5667
Tim Peters9ea17ac2001-02-02 05:57:15 +00005668static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005669 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305670 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005671 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305672 {"test_config", test_config, METH_NOARGS},
5673 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005674 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005675 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5676 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5677 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5678 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5679 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5680 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005681 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005682 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005683 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5684 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5685 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5686 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5687 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5688 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005689 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5690 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03005691 {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
5692 {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
5693 {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
5694 {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
Stefan Krah39042e02020-08-10 16:32:21 +02005695 {"decimal_is_special", decimal_is_special, METH_O},
5696 {"decimal_is_nan", decimal_is_nan, METH_O},
5697 {"decimal_is_infinite", decimal_is_infinite, METH_O},
5698 {"decimal_get_digits", decimal_get_digits, METH_O},
5699 {"decimal_as_triple", decimal_as_triple, METH_O},
5700 {"decimal_from_triple", decimal_from_triple, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305701 {"test_list_api", test_list_api, METH_NOARGS},
5702 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005703 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005704 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305705 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5706 {"test_long_api", test_long_api, METH_NOARGS},
5707 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5708 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5709 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5710 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005711 {"test_structseq_newtype_doesnt_leak",
5712 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305713 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5714 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5715 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5716 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
Zackery Spytzdc247652019-06-06 14:39:23 -06005717 {"test_long_as_unsigned_long_long_mask",
5718 test_long_as_unsigned_long_long_mask, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305719 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5720 {"test_k_code", test_k_code, METH_NOARGS},
5721 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005722 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305723 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305725 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305727 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5728 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5729 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005731 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005732#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005733 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005734#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005735 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03005736 {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005737 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005738 {"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS},
Hai Shia13b26c2020-11-11 04:53:46 +08005739 {"get_args", get_args, METH_VARARGS},
5740 {"test_get_statictype_slots", test_get_statictype_slots, METH_NOARGS},
5741 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs,
5742 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005743 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005744 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005746 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005747 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005748 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005749 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005750 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751 {"getargs_b", getargs_b, METH_VARARGS},
5752 {"getargs_B", getargs_B, METH_VARARGS},
5753 {"getargs_h", getargs_h, METH_VARARGS},
5754 {"getargs_H", getargs_H, METH_VARARGS},
5755 {"getargs_I", getargs_I, METH_VARARGS},
5756 {"getargs_k", getargs_k, METH_VARARGS},
5757 {"getargs_i", getargs_i, METH_VARARGS},
5758 {"getargs_l", getargs_l, METH_VARARGS},
5759 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005760 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 {"getargs_L", getargs_L, METH_VARARGS},
5762 {"getargs_K", getargs_K, METH_VARARGS},
5763 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305764 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5765 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005766 {"getargs_f", getargs_f, METH_VARARGS},
5767 {"getargs_d", getargs_d, METH_VARARGS},
5768 {"getargs_D", getargs_D, METH_VARARGS},
5769 {"getargs_S", getargs_S, METH_VARARGS},
5770 {"getargs_Y", getargs_Y, METH_VARARGS},
5771 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005772 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005773 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005774 {"getargs_s", getargs_s, METH_VARARGS},
5775 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5776 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
5777 {"getargs_z", getargs_z, METH_VARARGS},
5778 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5779 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5780 {"getargs_y", getargs_y, METH_VARARGS},
5781 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5782 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5783 {"getargs_u", getargs_u, METH_VARARGS},
5784 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5785 {"getargs_Z", getargs_Z, METH_VARARGS},
5786 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005787 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005788 {"getargs_es", getargs_es, METH_VARARGS},
5789 {"getargs_et", getargs_et, METH_VARARGS},
5790 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5791 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005792 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005793 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005794 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005795 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305796 {"test_s_code", test_s_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005797#if USE_UNICODE_WCHAR_CACHE
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305798 {"test_u_code", test_u_code, METH_NOARGS},
5799 {"test_Z_code", test_Z_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005800#endif /* USE_UNICODE_WCHAR_CACHE */
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305801 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005802 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5803 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005804 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Hai Shi5623ac82019-07-20 02:56:23 -05005805 {"unicode_asutf8", unicode_asutf8, METH_VARARGS},
5806 {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005807 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005808 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005809#if USE_UNICODE_WCHAR_CACHE
Victor Stinner42bf7752011-11-21 22:52:58 +01005810 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5811 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005812 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005813#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinner1c24bd02010-10-02 11:03:13 +00005814 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005815 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005816#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005817 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005818#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005819 {"traceback_print", traceback_print, METH_VARARGS},
5820 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005821 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005822 {"argparsing", argparsing, METH_VARARGS},
5823 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005824 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305826 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005827 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305828 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005829 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005830 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5831 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005832 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005833 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005834 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305835 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5836 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5837 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5838 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005839 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5840 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305841 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005842 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005843 {"no_docstring",
5844 (PyCFunction)test_with_docstring, METH_NOARGS},
5845 {"docstring_empty",
5846 (PyCFunction)test_with_docstring, METH_NOARGS,
5847 docstring_empty},
5848 {"docstring_no_signature",
5849 (PyCFunction)test_with_docstring, METH_NOARGS,
5850 docstring_no_signature},
5851 {"docstring_with_invalid_signature",
5852 (PyCFunction)test_with_docstring, METH_NOARGS,
5853 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005854 {"docstring_with_invalid_signature2",
5855 (PyCFunction)test_with_docstring, METH_NOARGS,
5856 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005857 {"docstring_with_signature",
5858 (PyCFunction)test_with_docstring, METH_NOARGS,
5859 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005860 {"docstring_with_signature_but_no_doc",
5861 (PyCFunction)test_with_docstring, METH_NOARGS,
5862 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005863 {"docstring_with_signature_and_extra_newlines",
5864 (PyCFunction)test_with_docstring, METH_NOARGS,
5865 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005866 {"docstring_with_signature_with_defaults",
5867 (PyCFunction)test_with_docstring, METH_NOARGS,
5868 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005869 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5870 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005871 {"pymarshal_write_long_to_file",
5872 pymarshal_write_long_to_file, METH_VARARGS},
5873 {"pymarshal_write_object_to_file",
5874 pymarshal_write_object_to_file, METH_VARARGS},
5875 {"pymarshal_read_short_from_file",
5876 pymarshal_read_short_from_file, METH_VARARGS},
5877 {"pymarshal_read_long_from_file",
5878 pymarshal_read_long_from_file, METH_VARARGS},
5879 {"pymarshal_read_last_object_from_file",
5880 pymarshal_read_last_object_from_file, METH_VARARGS},
5881 {"pymarshal_read_object_from_file",
5882 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01005883 {"return_null_without_error",
5884 return_null_without_error, METH_NOARGS},
5885 {"return_result_with_error",
5886 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02005887 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005888 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5889 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005890 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005891#ifdef HAVE_CLOCK_GETTIME
5892 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5893#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005894 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5895 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner34be8072016-03-14 12:04:26 +01005896 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5897 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005898 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005899 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner68762572019-10-07 18:42:01 +02005900 {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02005901 {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
5902 {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
5903 {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005904 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005905 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5906 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5907 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005908 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005909 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005910 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5911 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005912 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5913 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005914 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005915#ifdef W_STOPCODE
5916 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5917#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005918 {"get_mapping_keys", get_mapping_keys, METH_O},
5919 {"get_mapping_values", get_mapping_values, METH_O},
5920 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005921 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005922 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005923 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005924 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5925 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005926#ifdef Py_REF_DEBUG
5927 {"negative_refcount", negative_refcount, METH_NOARGS},
5928#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005929 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005930 {"sequence_getitem", sequence_getitem, METH_VARARGS},
Petr Viktorinf9583772019-09-10 12:21:09 +01005931 {"meth_varargs", meth_varargs, METH_VARARGS},
5932 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
5933 {"meth_o", meth_o, METH_O},
5934 {"meth_noargs", meth_noargs, METH_NOARGS},
5935 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
5936 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005937 {"pynumber_tobase", pynumber_tobase, METH_VARARGS},
Brandt Bucherc13b8472020-10-14 18:44:07 -07005938 {"without_gc", without_gc, METH_O},
Victor Stinner0e2ac212020-11-18 18:48:06 +01005939 {"test_set_type_size", test_set_type_size, METH_NOARGS},
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005940 {"test_refcount", test_refcount, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005941 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005942};
5943
Thomas Hellera4ea6032003-04-17 18:55:45 +00005944#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5945
Thomas Wouters89f507f2006-12-13 04:49:30 +00005946typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 char bool_member;
5948 char byte_member;
5949 unsigned char ubyte_member;
5950 short short_member;
5951 unsigned short ushort_member;
5952 int int_member;
5953 unsigned int uint_member;
5954 long long_member;
5955 unsigned long ulong_member;
5956 Py_ssize_t pyssizet_member;
5957 float float_member;
5958 double double_member;
5959 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005960 long long longlong_member;
5961 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005962} all_structmembers;
5963
5964typedef struct {
5965 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005966 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005967} test_structmembers;
5968
5969static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005970 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5971 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5972 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5973 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5974 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5975 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5976 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5977 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5978 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5979 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5980 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5981 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5982 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005983 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5984 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005985 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005986};
5987
5988
Christian Heimes1af737c2008-01-23 08:24:23 +00005989static PyObject *
5990test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5991{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005992 static char *keywords[] = {
5993 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5994 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5995 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005996 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005997 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005998 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005999 test_structmembers *ob;
6000 const char *s = NULL;
6001 Py_ssize_t string_len = 0;
6002 ob = PyObject_New(test_structmembers, type);
6003 if (ob == NULL)
6004 return NULL;
6005 memset(&ob->structmembers, 0, sizeof(all_structmembers));
6006 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
6007 &ob->structmembers.bool_member,
6008 &ob->structmembers.byte_member,
6009 &ob->structmembers.ubyte_member,
6010 &ob->structmembers.short_member,
6011 &ob->structmembers.ushort_member,
6012 &ob->structmembers.int_member,
6013 &ob->structmembers.uint_member,
6014 &ob->structmembers.long_member,
6015 &ob->structmembers.ulong_member,
6016 &ob->structmembers.pyssizet_member,
6017 &ob->structmembers.float_member,
6018 &ob->structmembers.double_member,
6019 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020 , &ob->structmembers.longlong_member,
6021 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006022 )) {
6023 Py_DECREF(ob);
6024 return NULL;
6025 }
6026 if (s != NULL) {
6027 if (string_len > 5) {
6028 Py_DECREF(ob);
6029 PyErr_SetString(PyExc_ValueError, "string too long");
6030 return NULL;
6031 }
6032 strcpy(ob->structmembers.inplace_member, s);
6033 }
6034 else {
6035 strcpy(ob->structmembers.inplace_member, "");
6036 }
6037 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00006038}
6039
Christian Heimes1af737c2008-01-23 08:24:23 +00006040static void
6041test_structmembers_free(PyObject *ob)
6042{
Victor Stinner32bd68c2020-12-01 10:37:39 +01006043 PyObject_Free(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00006044}
6045
6046static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00006047 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006048 "test_structmembersType",
6049 sizeof(test_structmembers), /* tp_basicsize */
6050 0, /* tp_itemsize */
6051 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006052 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006053 0, /* tp_getattr */
6054 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006055 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056 0, /* tp_repr */
6057 0, /* tp_as_number */
6058 0, /* tp_as_sequence */
6059 0, /* tp_as_mapping */
6060 0, /* tp_hash */
6061 0, /* tp_call */
6062 0, /* tp_str */
6063 PyObject_GenericGetAttr, /* tp_getattro */
6064 PyObject_GenericSetAttr, /* tp_setattro */
6065 0, /* tp_as_buffer */
6066 0, /* tp_flags */
6067 "Type containing all structmember types",
6068 0, /* traverseproc tp_traverse */
6069 0, /* tp_clear */
6070 0, /* tp_richcompare */
6071 0, /* tp_weaklistoffset */
6072 0, /* tp_iter */
6073 0, /* tp_iternext */
6074 0, /* tp_methods */
6075 test_members, /* tp_members */
6076 0,
6077 0,
6078 0,
6079 0,
6080 0,
6081 0,
6082 0,
6083 0,
6084 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00006085};
6086
6087
Benjamin Petersond51374e2014-04-09 23:55:56 -04006088typedef struct {
6089 PyObject_HEAD
6090} matmulObject;
6091
6092static PyObject *
6093matmulType_matmul(PyObject *self, PyObject *other)
6094{
6095 return Py_BuildValue("(sOO)", "matmul", self, other);
6096}
6097
6098static PyObject *
6099matmulType_imatmul(PyObject *self, PyObject *other)
6100{
6101 return Py_BuildValue("(sOO)", "imatmul", self, other);
6102}
6103
6104static void
6105matmulType_dealloc(PyObject *self)
6106{
Zachary Ware420dc562014-04-23 13:51:27 -05006107 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04006108}
6109
6110static PyNumberMethods matmulType_as_number = {
6111 0, /* nb_add */
6112 0, /* nb_subtract */
6113 0, /* nb_multiply */
6114 0, /* nb_remainde r*/
6115 0, /* nb_divmod */
6116 0, /* nb_power */
6117 0, /* nb_negative */
6118 0, /* tp_positive */
6119 0, /* tp_absolute */
6120 0, /* tp_bool */
6121 0, /* nb_invert */
6122 0, /* nb_lshift */
6123 0, /* nb_rshift */
6124 0, /* nb_and */
6125 0, /* nb_xor */
6126 0, /* nb_or */
6127 0, /* nb_int */
6128 0, /* nb_reserved */
6129 0, /* nb_float */
6130 0, /* nb_inplace_add */
6131 0, /* nb_inplace_subtract */
6132 0, /* nb_inplace_multiply */
6133 0, /* nb_inplace_remainder */
6134 0, /* nb_inplace_power */
6135 0, /* nb_inplace_lshift */
6136 0, /* nb_inplace_rshift */
6137 0, /* nb_inplace_and */
6138 0, /* nb_inplace_xor */
6139 0, /* nb_inplace_or */
6140 0, /* nb_floor_divide */
6141 0, /* nb_true_divide */
6142 0, /* nb_inplace_floor_divide */
6143 0, /* nb_inplace_true_divide */
6144 0, /* nb_index */
6145 matmulType_matmul, /* nb_matrix_multiply */
6146 matmulType_imatmul /* nb_matrix_inplace_multiply */
6147};
6148
6149static PyTypeObject matmulType = {
6150 PyVarObject_HEAD_INIT(NULL, 0)
6151 "matmulType",
6152 sizeof(matmulObject), /* tp_basicsize */
6153 0, /* tp_itemsize */
6154 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006155 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04006156 0, /* tp_getattr */
6157 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006158 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04006159 0, /* tp_repr */
6160 &matmulType_as_number, /* tp_as_number */
6161 0, /* tp_as_sequence */
6162 0, /* tp_as_mapping */
6163 0, /* tp_hash */
6164 0, /* tp_call */
6165 0, /* tp_str */
6166 PyObject_GenericGetAttr, /* tp_getattro */
6167 PyObject_GenericSetAttr, /* tp_setattro */
6168 0, /* tp_as_buffer */
6169 0, /* tp_flags */
6170 "C level type with matrix operations defined",
6171 0, /* traverseproc tp_traverse */
6172 0, /* tp_clear */
6173 0, /* tp_richcompare */
6174 0, /* tp_weaklistoffset */
6175 0, /* tp_iter */
6176 0, /* tp_iternext */
6177 0, /* tp_methods */
6178 0, /* tp_members */
6179 0,
6180 0,
6181 0,
6182 0,
6183 0,
6184 0,
6185 0,
6186 0,
6187 PyType_GenericNew, /* tp_new */
6188 PyObject_Del, /* tp_free */
6189};
6190
Zackery Spytzc7f803b2019-05-31 03:46:36 -06006191typedef struct {
6192 PyObject_HEAD
6193} ipowObject;
6194
6195static PyObject *
6196ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
6197{
6198 return Py_BuildValue("OO", other, mod);
6199}
6200
6201static PyNumberMethods ipowType_as_number = {
6202 .nb_inplace_power = ipowType_ipow
6203};
6204
6205static PyTypeObject ipowType = {
6206 PyVarObject_HEAD_INIT(NULL, 0)
6207 .tp_name = "ipowType",
6208 .tp_basicsize = sizeof(ipowObject),
6209 .tp_as_number = &ipowType_as_number,
6210 .tp_new = PyType_GenericNew
6211};
Martin v. Löwis1a214512008-06-11 05:26:20 +00006212
Yury Selivanov75445082015-05-11 22:57:16 -04006213typedef struct {
6214 PyObject_HEAD
6215 PyObject *ao_iterator;
6216} awaitObject;
6217
6218
6219static PyObject *
6220awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6221{
6222 PyObject *v;
6223 awaitObject *ao;
6224
6225 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
6226 return NULL;
6227
6228 ao = (awaitObject *)type->tp_alloc(type, 0);
6229 if (ao == NULL) {
6230 return NULL;
6231 }
6232
6233 Py_INCREF(v);
6234 ao->ao_iterator = v;
6235
6236 return (PyObject *)ao;
6237}
6238
6239
6240static void
6241awaitObject_dealloc(awaitObject *ao)
6242{
6243 Py_CLEAR(ao->ao_iterator);
6244 Py_TYPE(ao)->tp_free(ao);
6245}
6246
6247
6248static PyObject *
6249awaitObject_await(awaitObject *ao)
6250{
6251 Py_INCREF(ao->ao_iterator);
6252 return ao->ao_iterator;
6253}
6254
6255static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04006256 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04006257 0, /* am_aiter */
Vladimir Matveev1e996c32020-11-10 12:09:55 -08006258 0, /* am_anext */
6259 0, /* am_send */
Yury Selivanov75445082015-05-11 22:57:16 -04006260};
6261
6262
6263static PyTypeObject awaitType = {
6264 PyVarObject_HEAD_INIT(NULL, 0)
6265 "awaitType",
6266 sizeof(awaitObject), /* tp_basicsize */
6267 0, /* tp_itemsize */
6268 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006269 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04006270 0, /* tp_getattr */
6271 0, /* tp_setattr */
6272 &awaitType_as_async, /* tp_as_async */
6273 0, /* tp_repr */
6274 0, /* tp_as_number */
6275 0, /* tp_as_sequence */
6276 0, /* tp_as_mapping */
6277 0, /* tp_hash */
6278 0, /* tp_call */
6279 0, /* tp_str */
6280 PyObject_GenericGetAttr, /* tp_getattro */
6281 PyObject_GenericSetAttr, /* tp_setattro */
6282 0, /* tp_as_buffer */
6283 0, /* tp_flags */
6284 "C level type with tp_as_async",
6285 0, /* traverseproc tp_traverse */
6286 0, /* tp_clear */
6287 0, /* tp_richcompare */
6288 0, /* tp_weaklistoffset */
6289 0, /* tp_iter */
6290 0, /* tp_iternext */
6291 0, /* tp_methods */
6292 0, /* tp_members */
6293 0,
6294 0,
6295 0,
6296 0,
6297 0,
6298 0,
6299 0,
6300 0,
6301 awaitObject_new, /* tp_new */
6302 PyObject_Del, /* tp_free */
6303};
6304
6305
xdegaye56d1f5c2017-10-26 15:09:06 +02006306static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
6307
6308static PyTypeObject PyRecursingInfinitelyError_Type = {
6309 PyVarObject_HEAD_INIT(NULL, 0)
6310 "RecursingInfinitelyError", /* tp_name */
6311 sizeof(PyBaseExceptionObject), /* tp_basicsize */
6312 0, /* tp_itemsize */
6313 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006314 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02006315 0, /* tp_getattr */
6316 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006317 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02006318 0, /* tp_repr */
6319 0, /* tp_as_number */
6320 0, /* tp_as_sequence */
6321 0, /* tp_as_mapping */
6322 0, /* tp_hash */
6323 0, /* tp_call */
6324 0, /* tp_str */
6325 0, /* tp_getattro */
6326 0, /* tp_setattro */
6327 0, /* tp_as_buffer */
6328 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6329 "Instantiating this exception starts infinite recursion.", /* tp_doc */
6330 0, /* tp_traverse */
6331 0, /* tp_clear */
6332 0, /* tp_richcompare */
6333 0, /* tp_weaklistoffset */
6334 0, /* tp_iter */
6335 0, /* tp_iternext */
6336 0, /* tp_methods */
6337 0, /* tp_members */
6338 0, /* tp_getset */
6339 0, /* tp_base */
6340 0, /* tp_dict */
6341 0, /* tp_descr_get */
6342 0, /* tp_descr_set */
6343 0, /* tp_dictoffset */
6344 (initproc)recurse_infinitely_error_init, /* tp_init */
6345 0, /* tp_alloc */
6346 0, /* tp_new */
6347};
6348
6349static int
6350recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
6351{
6352 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
6353
6354 /* Instantiating this exception starts infinite recursion. */
6355 Py_INCREF(type);
6356 PyErr_SetObject(type, NULL);
6357 return -1;
6358}
6359
6360
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006361/* Test bpo-35983: create a subclass of "list" which checks that instances
6362 * are not deallocated twice */
6363
6364typedef struct {
6365 PyListObject list;
6366 int deallocated;
6367} MyListObject;
6368
6369static PyObject *
6370MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6371{
6372 PyObject* op = PyList_Type.tp_new(type, args, kwds);
6373 ((MyListObject*)op)->deallocated = 0;
6374 return op;
6375}
6376
6377void
6378MyList_dealloc(MyListObject* op)
6379{
6380 if (op->deallocated) {
6381 /* We cannot raise exceptions here but we still want the testsuite
6382 * to fail when we hit this */
6383 Py_FatalError("MyList instance deallocated twice");
6384 }
6385 op->deallocated = 1;
6386 PyList_Type.tp_dealloc((PyObject *)op);
6387}
6388
6389static PyTypeObject MyList_Type = {
6390 PyVarObject_HEAD_INIT(NULL, 0)
6391 "MyList",
6392 sizeof(MyListObject),
6393 0,
6394 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006395 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006396 0, /* tp_getattr */
6397 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006398 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006399 0, /* tp_repr */
6400 0, /* tp_as_number */
6401 0, /* tp_as_sequence */
6402 0, /* tp_as_mapping */
6403 0, /* tp_hash */
6404 0, /* tp_call */
6405 0, /* tp_str */
6406 0, /* tp_getattro */
6407 0, /* tp_setattro */
6408 0, /* tp_as_buffer */
6409 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6410 0, /* tp_doc */
6411 0, /* tp_traverse */
6412 0, /* tp_clear */
6413 0, /* tp_richcompare */
6414 0, /* tp_weaklistoffset */
6415 0, /* tp_iter */
6416 0, /* tp_iternext */
6417 0, /* tp_methods */
6418 0, /* tp_members */
6419 0, /* tp_getset */
6420 0, /* &PyList_Type */ /* tp_base */
6421 0, /* tp_dict */
6422 0, /* tp_descr_get */
6423 0, /* tp_descr_set */
6424 0, /* tp_dictoffset */
6425 0, /* tp_init */
6426 0, /* tp_alloc */
6427 MyList_new, /* tp_new */
6428};
6429
6430
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006431/* Test PEP 560 */
6432
6433typedef struct {
6434 PyObject_HEAD
6435 PyObject *item;
6436} PyGenericAliasObject;
6437
6438static void
6439generic_alias_dealloc(PyGenericAliasObject *self)
6440{
6441 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01006442 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006443}
6444
6445static PyObject *
6446generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
6447{
6448 return PyTuple_Pack(1, self->item);
6449}
6450
6451static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006452 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006453 {NULL} /* sentinel */
6454};
6455
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006456static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006457 PyVarObject_HEAD_INIT(NULL, 0)
6458 "GenericAlias",
6459 sizeof(PyGenericAliasObject),
6460 0,
6461 .tp_dealloc = (destructor)generic_alias_dealloc,
6462 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6463 .tp_methods = generic_alias_methods,
6464};
6465
6466static PyObject *
6467generic_alias_new(PyObject *item)
6468{
6469 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
6470 if (o == NULL) {
6471 return NULL;
6472 }
6473 Py_INCREF(item);
6474 o->item = item;
6475 return (PyObject*) o;
6476}
6477
6478typedef struct {
6479 PyObject_HEAD
6480} PyGenericObject;
6481
6482static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006483generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006484{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006485 return generic_alias_new(item);
6486}
6487
6488static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006489 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006490 {NULL} /* sentinel */
6491};
6492
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006493static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006494 PyVarObject_HEAD_INIT(NULL, 0)
6495 "Generic",
6496 sizeof(PyGenericObject),
6497 0,
6498 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6499 .tp_methods = generic_methods,
6500};
6501
6502
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006503/* Test PEP 590 */
6504
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006505typedef struct {
6506 PyObject_HEAD
6507 vectorcallfunc vectorcall;
6508} MethodDescriptorObject;
6509
6510static PyObject *
6511MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
6512 size_t nargsf, PyObject *kwnames)
6513{
6514 /* True if using the vectorcall function in MethodDescriptorObject
6515 * but False for MethodDescriptor2Object */
6516 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
6517 return PyBool_FromLong(md->vectorcall != NULL);
6518}
6519
6520static PyObject *
6521MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6522{
Petr Viktorine584cbf2019-06-03 01:08:14 +02006523 MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006524 op->vectorcall = MethodDescriptor_vectorcall;
6525 return (PyObject *)op;
6526}
6527
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006528static PyObject *
6529func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6530{
6531 if (obj == Py_None || obj == NULL) {
6532 Py_INCREF(func);
6533 return func;
6534 }
6535 return PyMethod_New(func, obj);
6536}
6537
6538static PyObject *
6539nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6540{
6541 Py_INCREF(func);
6542 return func;
6543}
6544
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006545static PyObject *
6546call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
6547{
6548 Py_INCREF(args);
6549 return args;
6550}
6551
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006552static PyTypeObject MethodDescriptorBase_Type = {
6553 PyVarObject_HEAD_INIT(NULL, 0)
6554 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006555 sizeof(MethodDescriptorObject),
6556 .tp_new = MethodDescriptor_new,
6557 .tp_call = PyVectorcall_Call,
6558 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
6559 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Petr Viktorinffd97532020-02-11 17:46:57 +01006560 Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006561 .tp_descr_get = func_descr_get,
6562};
6563
6564static PyTypeObject MethodDescriptorDerived_Type = {
6565 PyVarObject_HEAD_INIT(NULL, 0)
6566 "MethodDescriptorDerived",
6567 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6568};
6569
6570static PyTypeObject MethodDescriptorNopGet_Type = {
6571 PyVarObject_HEAD_INIT(NULL, 0)
6572 "MethodDescriptorNopGet",
6573 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006574 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006575 .tp_descr_get = nop_descr_get,
6576};
6577
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006578typedef struct {
6579 MethodDescriptorObject base;
6580 vectorcallfunc vectorcall;
6581} MethodDescriptor2Object;
6582
6583static PyObject *
6584MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6585{
6586 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
6587 op->base.vectorcall = NULL;
6588 op->vectorcall = MethodDescriptor_vectorcall;
6589 return (PyObject *)op;
6590}
6591
6592static PyTypeObject MethodDescriptor2_Type = {
6593 PyVarObject_HEAD_INIT(NULL, 0)
6594 "MethodDescriptor2",
6595 sizeof(MethodDescriptor2Object),
6596 .tp_new = MethodDescriptor2_new,
6597 .tp_call = PyVectorcall_Call,
6598 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
Petr Viktorinffd97532020-02-11 17:46:57 +01006599 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006600};
6601
Benjamin Peterson39403332020-09-02 11:29:06 -05006602PyDoc_STRVAR(heapdocctype__doc__,
6603"HeapDocCType(arg1, arg2)\n"
6604"--\n"
6605"\n"
6606"somedoc");
6607
6608typedef struct {
6609 PyObject_HEAD
6610} HeapDocCTypeObject;
6611
6612static PyType_Slot HeapDocCType_slots[] = {
6613 {Py_tp_doc, (char*)heapdocctype__doc__},
6614 {0},
6615};
6616
6617static PyType_Spec HeapDocCType_spec = {
6618 "_testcapi.HeapDocCType",
6619 sizeof(HeapDocCTypeObject),
6620 0,
6621 Py_TPFLAGS_DEFAULT,
6622 HeapDocCType_slots
6623};
6624
Hai Shi88c2cfd2020-11-07 00:04:47 +08006625typedef struct {
6626 PyObject_HEAD
6627} NullTpDocTypeObject;
6628
6629static PyType_Slot NullTpDocType_slots[] = {
6630 {Py_tp_doc, NULL},
6631 {0, 0},
6632};
6633
6634static PyType_Spec NullTpDocType_spec = {
6635 "_testcapi.NullTpDocType",
6636 sizeof(NullTpDocTypeObject),
6637 0,
6638 Py_TPFLAGS_DEFAULT,
6639 NullTpDocType_slots
6640};
6641
Benjamin Peterson39403332020-09-02 11:29:06 -05006642
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006643PyDoc_STRVAR(heapgctype__doc__,
6644"A heap type with GC, and with overridden dealloc.\n\n"
6645"The 'value' attribute is set to 10 in __init__.");
6646
6647typedef struct {
6648 PyObject_HEAD
6649 int value;
6650} HeapCTypeObject;
6651
6652static struct PyMemberDef heapctype_members[] = {
6653 {"value", T_INT, offsetof(HeapCTypeObject, value)},
6654 {NULL} /* Sentinel */
6655};
6656
6657static int
6658heapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
6659{
6660 ((HeapCTypeObject *)self)->value = 10;
6661 return 0;
6662}
6663
6664static void
6665heapgcctype_dealloc(HeapCTypeObject *self)
6666{
6667 PyTypeObject *tp = Py_TYPE(self);
6668 PyObject_GC_UnTrack(self);
6669 PyObject_GC_Del(self);
6670 Py_DECREF(tp);
6671}
6672
6673static PyType_Slot HeapGcCType_slots[] = {
6674 {Py_tp_init, heapctype_init},
6675 {Py_tp_members, heapctype_members},
6676 {Py_tp_dealloc, heapgcctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006677 {Py_tp_doc, (char*)heapgctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006678 {0, 0},
6679};
6680
6681static PyType_Spec HeapGcCType_spec = {
6682 "_testcapi.HeapGcCType",
6683 sizeof(HeapCTypeObject),
6684 0,
6685 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6686 HeapGcCType_slots
6687};
6688
6689PyDoc_STRVAR(heapctype__doc__,
6690"A heap type without GC, but with overridden dealloc.\n\n"
6691"The 'value' attribute is set to 10 in __init__.");
6692
6693static void
6694heapctype_dealloc(HeapCTypeObject *self)
6695{
6696 PyTypeObject *tp = Py_TYPE(self);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006697 PyObject_Free(self);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006698 Py_DECREF(tp);
6699}
6700
6701static PyType_Slot HeapCType_slots[] = {
6702 {Py_tp_init, heapctype_init},
6703 {Py_tp_members, heapctype_members},
6704 {Py_tp_dealloc, heapctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006705 {Py_tp_doc, (char*)heapctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006706 {0, 0},
6707};
6708
6709static PyType_Spec HeapCType_spec = {
6710 "_testcapi.HeapCType",
6711 sizeof(HeapCTypeObject),
6712 0,
6713 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6714 HeapCType_slots
6715};
6716
6717PyDoc_STRVAR(heapctypesubclass__doc__,
6718"Subclass of HeapCType, without GC.\n\n"
6719"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6720
6721typedef struct {
6722 HeapCTypeObject base;
6723 int value2;
6724} HeapCTypeSubclassObject;
6725
6726static int
6727heapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
6728{
6729 /* Call __init__ of the superclass */
6730 if (heapctype_init(self, args, kwargs) < 0) {
6731 return -1;
6732 }
6733 /* Initialize additional element */
6734 ((HeapCTypeSubclassObject *)self)->value2 = 20;
6735 return 0;
6736}
6737
6738static struct PyMemberDef heapctypesubclass_members[] = {
6739 {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
6740 {NULL} /* Sentinel */
6741};
6742
6743static PyType_Slot HeapCTypeSubclass_slots[] = {
6744 {Py_tp_init, heapctypesubclass_init},
6745 {Py_tp_members, heapctypesubclass_members},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006746 {Py_tp_doc, (char*)heapctypesubclass__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006747 {0, 0},
6748};
6749
6750static PyType_Spec HeapCTypeSubclass_spec = {
6751 "_testcapi.HeapCTypeSubclass",
6752 sizeof(HeapCTypeSubclassObject),
6753 0,
6754 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6755 HeapCTypeSubclass_slots
6756};
6757
scoderf7c4e232020-06-06 21:35:10 +02006758PyDoc_STRVAR(heapctypewithbuffer__doc__,
6759"Heap type with buffer support.\n\n"
6760"The buffer is set to [b'1', b'2', b'3', b'4']");
6761
6762typedef struct {
6763 HeapCTypeObject base;
6764 char buffer[4];
6765} HeapCTypeWithBufferObject;
6766
6767static int
6768heapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags)
6769{
6770 self->buffer[0] = '1';
6771 self->buffer[1] = '2';
6772 self->buffer[2] = '3';
6773 self->buffer[3] = '4';
6774 return PyBuffer_FillInfo(
6775 view, (PyObject*)self, (void *)self->buffer, 4, 1, flags);
6776}
6777
RĂ©mi Lapeyreb8867e52020-06-07 09:05:33 +02006778static void
scoderf7c4e232020-06-06 21:35:10 +02006779heapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view)
6780{
6781 assert(view->obj == (void*) self);
6782}
6783
6784static PyType_Slot HeapCTypeWithBuffer_slots[] = {
6785 {Py_bf_getbuffer, heapctypewithbuffer_getbuffer},
6786 {Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer},
6787 {Py_tp_doc, (char*)heapctypewithbuffer__doc__},
6788 {0, 0},
6789};
6790
6791static PyType_Spec HeapCTypeWithBuffer_spec = {
6792 "_testcapi.HeapCTypeWithBuffer",
6793 sizeof(HeapCTypeWithBufferObject),
6794 0,
6795 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6796 HeapCTypeWithBuffer_slots
6797};
6798
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006799PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
6800"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
6801"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
6802"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6803
6804static int
6805heapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
6806{
6807 PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
6808 initproc base_init = PyType_GetSlot(base, Py_tp_init);
6809 base_init(self, args, kwargs);
6810 return 0;
6811}
6812
6813static void
6814heapctypesubclasswithfinalizer_finalize(PyObject *self)
6815{
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006816 PyObject *error_type, *error_value, *error_traceback, *m;
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006817 PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006818
6819 /* Save the current exception, if any. */
6820 PyErr_Fetch(&error_type, &error_value, &error_traceback);
6821
6822 m = PyState_FindModule(&_testcapimodule);
6823 if (m == NULL) {
6824 goto cleanup_finalize;
6825 }
6826 oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
6827 newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
6828 if (oldtype == NULL || newtype == NULL) {
6829 goto cleanup_finalize;
6830 }
6831
6832 if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
6833 goto cleanup_finalize;
6834 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006835 refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
6836 if (refcnt == NULL) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006837 goto cleanup_finalize;
6838 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006839 if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
6840 goto cleanup_finalize;
6841 }
6842 Py_DECREF(refcnt);
6843 refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
6844 if (refcnt == NULL) {
6845 goto cleanup_finalize;
6846 }
6847 if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006848 goto cleanup_finalize;
6849 }
6850
6851cleanup_finalize:
6852 Py_XDECREF(oldtype);
6853 Py_XDECREF(newtype);
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006854 Py_XDECREF(refcnt);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006855
6856 /* Restore the saved exception. */
6857 PyErr_Restore(error_type, error_value, error_traceback);
6858}
6859
6860static PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
6861 {Py_tp_init, heapctypesubclasswithfinalizer_init},
6862 {Py_tp_members, heapctypesubclass_members},
6863 {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006864 {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006865 {0, 0},
6866};
6867
6868static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
6869 "_testcapi.HeapCTypeSubclassWithFinalizer",
6870 sizeof(HeapCTypeSubclassObject),
6871 0,
6872 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
6873 HeapCTypeSubclassWithFinalizer_slots
6874};
6875
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006876typedef struct {
6877 PyObject_HEAD
6878 PyObject *dict;
6879} HeapCTypeWithDictObject;
6880
6881static void
6882heapctypewithdict_dealloc(HeapCTypeWithDictObject* self)
6883{
6884
6885 PyTypeObject *tp = Py_TYPE(self);
6886 Py_XDECREF(self->dict);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006887 PyObject_Free(self);
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006888 Py_DECREF(tp);
6889}
6890
6891static PyGetSetDef heapctypewithdict_getsetlist[] = {
6892 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
6893 {NULL} /* Sentinel */
6894};
6895
6896static struct PyMemberDef heapctypewithdict_members[] = {
6897 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
6898 {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY},
6899 {NULL} /* Sentinel */
6900};
6901
6902static PyType_Slot HeapCTypeWithDict_slots[] = {
6903 {Py_tp_members, heapctypewithdict_members},
6904 {Py_tp_getset, heapctypewithdict_getsetlist},
6905 {Py_tp_dealloc, heapctypewithdict_dealloc},
6906 {0, 0},
6907};
6908
6909static PyType_Spec HeapCTypeWithDict_spec = {
6910 "_testcapi.HeapCTypeWithDict",
6911 sizeof(HeapCTypeWithDictObject),
6912 0,
6913 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6914 HeapCTypeWithDict_slots
6915};
6916
6917static struct PyMemberDef heapctypewithnegativedict_members[] = {
6918 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
Victor Stinneraca8c402019-09-30 21:14:26 +02006919 {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006920 {NULL} /* Sentinel */
6921};
6922
6923static PyType_Slot HeapCTypeWithNegativeDict_slots[] = {
6924 {Py_tp_members, heapctypewithnegativedict_members},
6925 {Py_tp_getset, heapctypewithdict_getsetlist},
6926 {Py_tp_dealloc, heapctypewithdict_dealloc},
6927 {0, 0},
6928};
6929
6930static PyType_Spec HeapCTypeWithNegativeDict_spec = {
6931 "_testcapi.HeapCTypeWithNegativeDict",
6932 sizeof(HeapCTypeWithDictObject),
6933 0,
6934 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6935 HeapCTypeWithNegativeDict_slots
6936};
6937
6938typedef struct {
6939 PyObject_HEAD
6940 PyObject *weakreflist;
6941} HeapCTypeWithWeakrefObject;
6942
6943static struct PyMemberDef heapctypewithweakref_members[] = {
6944 {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)},
6945 {"__weaklistoffset__", T_PYSSIZET,
6946 offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY},
6947 {NULL} /* Sentinel */
6948};
6949
6950static void
6951heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self)
6952{
6953
6954 PyTypeObject *tp = Py_TYPE(self);
6955 if (self->weakreflist != NULL)
6956 PyObject_ClearWeakRefs((PyObject *) self);
6957 Py_XDECREF(self->weakreflist);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006958 PyObject_Free(self);
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006959 Py_DECREF(tp);
6960}
6961
6962static PyType_Slot HeapCTypeWithWeakref_slots[] = {
6963 {Py_tp_members, heapctypewithweakref_members},
6964 {Py_tp_dealloc, heapctypewithweakref_dealloc},
6965 {0, 0},
6966};
6967
6968static PyType_Spec HeapCTypeWithWeakref_spec = {
6969 "_testcapi.HeapCTypeWithWeakref",
6970 sizeof(HeapCTypeWithWeakrefObject),
6971 0,
6972 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6973 HeapCTypeWithWeakref_slots
6974};
6975
scoder148f3292020-07-03 02:09:28 +02006976PyDoc_STRVAR(heapctypesetattr__doc__,
6977"A heap type without GC, but with overridden __setattr__.\n\n"
6978"The 'value' attribute is set to 10 in __init__ and updated via attribute setting.");
6979
6980typedef struct {
6981 PyObject_HEAD
6982 long value;
6983} HeapCTypeSetattrObject;
6984
6985static struct PyMemberDef heapctypesetattr_members[] = {
6986 {"pvalue", T_LONG, offsetof(HeapCTypeSetattrObject, value)},
6987 {NULL} /* Sentinel */
6988};
6989
6990static int
6991heapctypesetattr_init(PyObject *self, PyObject *args, PyObject *kwargs)
6992{
6993 ((HeapCTypeSetattrObject *)self)->value = 10;
6994 return 0;
6995}
6996
6997static void
6998heapctypesetattr_dealloc(HeapCTypeSetattrObject *self)
6999{
7000 PyTypeObject *tp = Py_TYPE(self);
Victor Stinner32bd68c2020-12-01 10:37:39 +01007001 PyObject_Free(self);
scoder148f3292020-07-03 02:09:28 +02007002 Py_DECREF(tp);
7003}
7004
7005static int
7006heapctypesetattr_setattro(HeapCTypeSetattrObject *self, PyObject *attr, PyObject *value)
7007{
7008 PyObject *svalue = PyUnicode_FromString("value");
7009 if (svalue == NULL)
7010 return -1;
7011 int eq = PyObject_RichCompareBool(svalue, attr, Py_EQ);
7012 Py_DECREF(svalue);
7013 if (eq < 0)
7014 return -1;
7015 if (!eq) {
7016 return PyObject_GenericSetAttr((PyObject*) self, attr, value);
7017 }
7018 if (value == NULL) {
7019 self->value = 0;
7020 return 0;
7021 }
7022 PyObject *ivalue = PyNumber_Long(value);
7023 if (ivalue == NULL)
7024 return -1;
7025 long v = PyLong_AsLong(ivalue);
7026 Py_DECREF(ivalue);
7027 if (v == -1 && PyErr_Occurred())
7028 return -1;
7029 self->value = v;
7030 return 0;
7031}
7032
7033static PyType_Slot HeapCTypeSetattr_slots[] = {
7034 {Py_tp_init, heapctypesetattr_init},
7035 {Py_tp_members, heapctypesetattr_members},
7036 {Py_tp_setattro, heapctypesetattr_setattro},
7037 {Py_tp_dealloc, heapctypesetattr_dealloc},
7038 {Py_tp_doc, (char*)heapctypesetattr__doc__},
7039 {0, 0},
7040};
7041
7042static PyType_Spec HeapCTypeSetattr_spec = {
7043 "_testcapi.HeapCTypeSetattr",
7044 sizeof(HeapCTypeSetattrObject),
7045 0,
7046 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7047 HeapCTypeSetattr_slots
7048};
7049
Petr Viktorinf9583772019-09-10 12:21:09 +01007050static PyMethodDef meth_instance_methods[] = {
7051 {"meth_varargs", meth_varargs, METH_VARARGS},
7052 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
7053 {"meth_o", meth_o, METH_O},
7054 {"meth_noargs", meth_noargs, METH_NOARGS},
7055 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
7056 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
7057 {NULL, NULL} /* sentinel */
7058};
7059
7060
7061static PyTypeObject MethInstance_Type = {
7062 PyVarObject_HEAD_INIT(NULL, 0)
7063 "MethInstance",
7064 sizeof(PyObject),
7065 .tp_new = PyType_GenericNew,
7066 .tp_flags = Py_TPFLAGS_DEFAULT,
7067 .tp_methods = meth_instance_methods,
Petr Viktorin5e9caee2019-09-12 10:12:53 +01007068 .tp_doc = (char*)PyDoc_STR(
Petr Viktorinf9583772019-09-10 12:21:09 +01007069 "Class with normal (instance) methods to test calling conventions"),
7070};
7071
7072static PyMethodDef meth_class_methods[] = {
7073 {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS},
7074 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS},
7075 {"meth_o", meth_o, METH_O|METH_CLASS},
7076 {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS},
7077 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS},
7078 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS},
7079 {NULL, NULL} /* sentinel */
7080};
7081
7082
7083static PyTypeObject MethClass_Type = {
7084 PyVarObject_HEAD_INIT(NULL, 0)
7085 "MethClass",
7086 sizeof(PyObject),
7087 .tp_new = PyType_GenericNew,
7088 .tp_flags = Py_TPFLAGS_DEFAULT,
7089 .tp_methods = meth_class_methods,
7090 .tp_doc = PyDoc_STR(
7091 "Class with class methods to test calling conventions"),
7092};
7093
7094static PyMethodDef meth_static_methods[] = {
7095 {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC},
7096 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC},
7097 {"meth_o", meth_o, METH_O|METH_STATIC},
7098 {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC},
7099 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC},
7100 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC},
7101 {NULL, NULL} /* sentinel */
7102};
7103
7104
7105static PyTypeObject MethStatic_Type = {
7106 PyVarObject_HEAD_INIT(NULL, 0)
7107 "MethStatic",
7108 sizeof(PyObject),
7109 .tp_new = PyType_GenericNew,
7110 .tp_flags = Py_TPFLAGS_DEFAULT,
7111 .tp_methods = meth_static_methods,
7112 .tp_doc = PyDoc_STR(
7113 "Class with static methods to test calling conventions"),
7114};
7115
Neil Schemenauer392a13b2019-10-15 20:56:48 -07007116/* ContainerNoGC -- a simple container without GC methods */
7117
7118typedef struct {
7119 PyObject_HEAD
7120 PyObject *value;
7121} ContainerNoGCobject;
7122
7123static PyObject *
7124ContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
7125{
7126 PyObject *value;
7127 char *names[] = {"value", NULL};
7128 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) {
7129 return NULL;
7130 }
7131 PyObject *self = type->tp_alloc(type, 0);
7132 if (self == NULL) {
7133 return NULL;
7134 }
7135 Py_INCREF(value);
7136 ((ContainerNoGCobject *)self)->value = value;
7137 return self;
7138}
7139
7140static void
7141ContainerNoGC_dealloc(ContainerNoGCobject *self)
7142{
7143 Py_DECREF(self->value);
7144 Py_TYPE(self)->tp_free((PyObject *)self);
7145}
7146
7147static PyMemberDef ContainerNoGC_members[] = {
7148 {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY,
7149 PyDoc_STR("a container value for test purposes")},
7150 {0}
7151};
7152
7153static PyTypeObject ContainerNoGC_type = {
7154 PyVarObject_HEAD_INIT(NULL, 0)
7155 "_testcapi.ContainerNoGC",
7156 sizeof(ContainerNoGCobject),
7157 .tp_dealloc = (destructor)ContainerNoGC_dealloc,
7158 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7159 .tp_members = ContainerNoGC_members,
7160 .tp_new = ContainerNoGC_new,
7161};
7162
Jeroen Demeyereb65e242019-05-28 14:42:53 +02007163
Martin v. Löwis1a214512008-06-11 05:26:20 +00007164static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007165 PyModuleDef_HEAD_INIT,
7166 "_testcapi",
7167 NULL,
7168 -1,
7169 TestMethods,
7170 NULL,
7171 NULL,
7172 NULL,
7173 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007174};
7175
Nick Coghland5cacbb2015-05-23 22:24:10 +10007176/* Per PEP 489, this module will not be converted to multi-phase initialization
7177 */
7178
Mark Hammond62b1ab12002-07-23 06:31:15 +00007179PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007180PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00007181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007182 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184 m = PyModule_Create(&_testcapimodule);
7185 if (m == NULL)
7186 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007187
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007188 Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type);
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00007189
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007190 Py_SET_TYPE(&test_structmembersType, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007191 Py_INCREF(&test_structmembersType);
7192 /* don't use a name starting with "test", since we don't want
7193 test_capi to automatically call this */
7194 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04007195 if (PyType_Ready(&matmulType) < 0)
7196 return NULL;
7197 Py_INCREF(&matmulType);
7198 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06007199 if (PyType_Ready(&ipowType) < 0) {
7200 return NULL;
7201 }
7202 Py_INCREF(&ipowType);
7203 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00007204
Yury Selivanov75445082015-05-11 22:57:16 -04007205 if (PyType_Ready(&awaitType) < 0)
7206 return NULL;
7207 Py_INCREF(&awaitType);
7208 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
7209
Jeroen Demeyer351c6742019-05-10 19:21:11 +02007210 MyList_Type.tp_base = &PyList_Type;
7211 if (PyType_Ready(&MyList_Type) < 0)
7212 return NULL;
7213 Py_INCREF(&MyList_Type);
7214 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
7215
Jeroen Demeyereb65e242019-05-28 14:42:53 +02007216 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
7217 return NULL;
7218 Py_INCREF(&MethodDescriptorBase_Type);
7219 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
7220
7221 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
7222 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
7223 return NULL;
7224 Py_INCREF(&MethodDescriptorDerived_Type);
7225 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
7226
7227 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
7228 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
7229 return NULL;
7230 Py_INCREF(&MethodDescriptorNopGet_Type);
7231 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
7232
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02007233 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
7234 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
7235 return NULL;
7236 Py_INCREF(&MethodDescriptor2_Type);
7237 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
7238
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02007239 if (PyType_Ready(&GenericAlias_Type) < 0)
7240 return NULL;
7241 Py_INCREF(&GenericAlias_Type);
7242 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
7243
7244 if (PyType_Ready(&Generic_Type) < 0)
7245 return NULL;
7246 Py_INCREF(&Generic_Type);
7247 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
7248
Petr Viktorinf9583772019-09-10 12:21:09 +01007249 if (PyType_Ready(&MethInstance_Type) < 0)
7250 return NULL;
7251 Py_INCREF(&MethInstance_Type);
7252 PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type);
7253
7254 if (PyType_Ready(&MethClass_Type) < 0)
7255 return NULL;
7256 Py_INCREF(&MethClass_Type);
7257 PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type);
7258
7259 if (PyType_Ready(&MethStatic_Type) < 0)
7260 return NULL;
7261 Py_INCREF(&MethStatic_Type);
7262 PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type);
7263
xdegaye56d1f5c2017-10-26 15:09:06 +02007264 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
7265 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
7266 return NULL;
7267 }
7268 Py_INCREF(&PyRecursingInfinitelyError_Type);
7269 PyModule_AddObject(m, "RecursingInfinitelyError",
7270 (PyObject *)&PyRecursingInfinitelyError_Type);
7271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007272 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
7273 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
7274 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
7275 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
7276 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
7277 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
7278 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
7279 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
7280 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
7281 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
7282 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
7283 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
7284 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
7285 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
7286 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
7287 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05007288 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX));
7289 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN));
7290 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007291 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
7292 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
Victor Stinner4237d342015-09-10 10:10:39 +02007293 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007294 Py_INCREF(&PyInstanceMethod_Type);
7295 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00007296
Larry Hastings2a727912014-01-16 11:32:01 -08007297 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner310e2d22019-11-22 10:58:00 +01007298 PyObject *v;
Victor Stinner5d39e042017-11-29 17:20:38 +01007299#ifdef WITH_PYMALLOC
Victor Stinner310e2d22019-11-22 10:58:00 +01007300 v = Py_True;
Victor Stinner5d39e042017-11-29 17:20:38 +01007301#else
Victor Stinner310e2d22019-11-22 10:58:00 +01007302 v = Py_False;
Victor Stinner5d39e042017-11-29 17:20:38 +01007303#endif
Victor Stinner310e2d22019-11-22 10:58:00 +01007304 Py_INCREF(v);
7305 PyModule_AddObject(m, "WITH_PYMALLOC", v);
Larry Hastings2a727912014-01-16 11:32:01 -08007306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007307 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
7308 Py_INCREF(TestError);
7309 PyModule_AddObject(m, "error", TestError);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007310
Benjamin Peterson39403332020-09-02 11:29:06 -05007311 PyObject *HeapDocCType = PyType_FromSpec(&HeapDocCType_spec);
7312 if (HeapDocCType == NULL) {
7313 return NULL;
7314 }
7315 PyModule_AddObject(m, "HeapDocCType", HeapDocCType);
7316
Hai Shi88c2cfd2020-11-07 00:04:47 +08007317 /* bpo-41832: Add a new type to test PyType_FromSpec()
7318 now can accept a NULL tp_doc slot. */
7319 PyObject *NullTpDocType = PyType_FromSpec(&NullTpDocType_spec);
7320 if (NullTpDocType == NULL) {
7321 return NULL;
7322 }
7323 PyModule_AddObject(m, "NullTpDocType", NullTpDocType);
7324
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007325 PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
7326 if (HeapGcCType == NULL) {
7327 return NULL;
7328 }
7329 PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
7330
7331 PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
7332 if (HeapCType == NULL) {
7333 return NULL;
7334 }
7335 PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
7336 if (subclass_bases == NULL) {
7337 return NULL;
7338 }
7339 PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
7340 if (HeapCTypeSubclass == NULL) {
7341 return NULL;
7342 }
7343 Py_DECREF(subclass_bases);
7344 PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
7345
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07007346 PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec);
7347 if (HeapCTypeWithDict == NULL) {
7348 return NULL;
7349 }
7350 PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict);
7351
7352 PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
7353 if (HeapCTypeWithNegativeDict == NULL) {
7354 return NULL;
7355 }
7356 PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict);
7357
7358 PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec);
7359 if (HeapCTypeWithWeakref == NULL) {
7360 return NULL;
7361 }
7362 PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref);
7363
scoderf7c4e232020-06-06 21:35:10 +02007364 PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec);
7365 if (HeapCTypeWithBuffer == NULL) {
7366 return NULL;
7367 }
7368 PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer);
7369
scoder148f3292020-07-03 02:09:28 +02007370 PyObject *HeapCTypeSetattr = PyType_FromSpec(&HeapCTypeSetattr_spec);
7371 if (HeapCTypeSetattr == NULL) {
7372 return NULL;
7373 }
7374 PyModule_AddObject(m, "HeapCTypeSetattr", HeapCTypeSetattr);
7375
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007376 PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
7377 if (subclass_with_finalizer_bases == NULL) {
7378 return NULL;
7379 }
7380 PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
7381 &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
7382 if (HeapCTypeSubclassWithFinalizer == NULL) {
7383 return NULL;
7384 }
7385 Py_DECREF(subclass_with_finalizer_bases);
7386 PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
7387
Neil Schemenauer392a13b2019-10-15 20:56:48 -07007388 if (PyType_Ready(&ContainerNoGC_type) < 0) {
7389 return NULL;
7390 }
7391 Py_INCREF(&ContainerNoGC_type);
7392 if (PyModule_AddObject(m, "ContainerNoGC",
7393 (PyObject *) &ContainerNoGC_type) < 0)
7394 return NULL;
7395
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007396 PyState_AddModule(m, &_testcapimodule);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007397 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007398}
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007399
7400
7401/* Test the C API exposed when PY_SSIZE_T_CLEAN is not defined */
7402
7403#undef Py_BuildValue
7404PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
7405
7406static PyObject *
7407test_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
7408{
7409 PyObject *res;
7410 const char str[] = "string";
7411 const Py_UNICODE unicode[] = L"unicode";
Victor Stinner37bb2892020-06-19 11:45:31 +02007412 assert(!PyErr_Occurred());
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007413
7414 res = Py_BuildValue("(s#O)", str, 1, Py_None);
7415 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007416 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007417 return NULL;
7418 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007419 PyErr_Clear();
7420
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007421 res = Py_BuildValue("(z#O)", str, 1, Py_None);
7422 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007423 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007424 return NULL;
7425 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007426 PyErr_Clear();
7427
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007428 res = Py_BuildValue("(y#O)", str, 1, Py_None);
7429 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007430 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007431 return NULL;
7432 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007433 PyErr_Clear();
7434
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007435 res = Py_BuildValue("(u#O)", unicode, 1, Py_None);
7436 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007437 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007438 return NULL;
7439 }
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007440 PyErr_Clear();
Victor Stinner37bb2892020-06-19 11:45:31 +02007441
7442
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007443 Py_RETURN_NONE;
7444}