blob: 28d2c124d517758048db7f784e380c2be49e3b83 [file] [log] [blame]
Tim Peters9ea17ac2001-02-02 05:57:15 +00001/*
2 * C Extension module to test Python interpreter C APIs.
3 *
4 * The 'test_*' functions exported by this module are run as part of the
5 * standard Python regression test, via Lib/test/test_capi.py.
6 */
7
Victor Stinner3f2f4fe2020-03-13 13:07:31 +01008/* This module tests the public (Include/ and Include/cpython/) C API.
9 The internal C API must not be used here: use _testinternalcapi for that.
10
11 The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE
12 macro defined, but only the public C API must be tested here. */
Hai Shi5dd21f52020-04-21 00:49:13 +080013
Victor Stinner5c75f372019-04-17 23:02:26 +020014#undef Py_BUILD_CORE_MODULE
Hai Shi5dd21f52020-04-21 00:49:13 +080015/* Always enable assertions */
16#undef NDEBUG
Victor Stinner5c75f372019-04-17 23:02:26 +020017
Neal Norwitz8866e0a2007-10-27 04:01:17 +000018#define PY_SSIZE_T_CLEAN
19
Tim Peters9ea17ac2001-02-02 05:57:15 +000020#include "Python.h"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000021#include "datetime.h"
Stefan Krah39042e02020-08-10 16:32:21 +020022#include "pydecimal.h"
Serhiy Storchakab5181342015-02-06 08:58:56 +020023#include "marshal.h"
Victor Stinner4a21e572020-04-15 02:35:41 +020024#include "structmember.h" // PyMemberDef
Victor Stinnera1c249c2018-11-01 03:15:58 +010025#include <float.h>
Victor Stinner56e8c292014-07-21 12:30:22 +020026#include <signal.h>
Tim Peters9ea17ac2001-02-02 05:57:15 +000027
Victor Stinner95e9cef2015-03-28 01:26:47 +010028#ifdef MS_WINDOWS
Victor Stinner09e5cf22015-03-30 00:09:18 +020029# include <winsock2.h> /* struct timeval */
Victor Stinner95e9cef2015-03-28 01:26:47 +010030#endif
31
Victor Stinner7b7c6dc2017-08-10 12:37:39 +020032#ifdef HAVE_SYS_WAIT_H
33#include <sys/wait.h> /* For W_STOPCODE */
34#endif
35
Victor Stinner5ed69952018-11-06 15:59:52 +010036#ifdef Py_BUILD_CORE
37# error "_testcapi must test the public Python C API, not CPython internal C API"
38#endif
39
Eddie Elizondoff023ed2019-09-11 05:17:13 -040040static struct PyModuleDef _testcapimodule;
41
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000043
Tim Peters91621db2001-06-12 20:10:01 +000044/* Raise TestError with test_name + ": " + msg, and return NULL. */
45
46static PyObject *
47raiseTestError(const char* test_name, const char* msg)
48{
Victor Stinner6ced7c42011-03-21 18:15:42 +010049 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000051}
52
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000053/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000054
55 The ones derived from autoconf on the UNIX-like OSes can be relied
56 upon (in the absence of sloppy cross-compiling), but the Windows
57 platforms have these hardcoded. Better safe than sorry.
58*/
59static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000060sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000062{
Victor Stinner499dfcf2011-03-21 13:26:24 +010063 PyErr_Format(TestError,
64 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000067}
68
69static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053070test_config(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters9ea17ac2001-02-02 05:57:15 +000071{
Tim Peters9ea17ac2001-02-02 05:57:15 +000072#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 if (FATNAME != sizeof(TYPE)) \
74 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000076 CHECK_SIZEOF(SIZEOF_SHORT, short);
77 CHECK_SIZEOF(SIZEOF_INT, int);
78 CHECK_SIZEOF(SIZEOF_LONG, long);
79 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
80 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Benjamin Petersonaf580df2016-09-06 10:46:49 -070081 CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
Tim Peters9ea17ac2001-02-02 05:57:15 +000082
83#undef CHECK_SIZEOF
84
Serhiy Storchaka228b12e2017-01-23 09:47:21 +020085 Py_RETURN_NONE;
Tim Peters9ea17ac2001-02-02 05:57:15 +000086}
87
Tim Peters5c4d5bf2001-02-12 22:13:26 +000088static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053089test_sizeof_c_types(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner01076552013-10-29 19:39:52 +010090{
Ned Deilye37a1942015-03-05 15:47:10 -080091#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020092#pragma GCC diagnostic push
93#pragma GCC diagnostic ignored "-Wtype-limits"
94#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010095#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010096 if (EXPECTED != sizeof(TYPE)) { \
97 PyErr_Format(TestError, \
98 "sizeof(%s) = %u instead of %u", \
99 #TYPE, sizeof(TYPE), EXPECTED); \
100 return (PyObject*)NULL; \
101 }
Victor Stinnerf866f972013-10-29 19:59:31 +0100102#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
103#define CHECK_SIGNNESS(TYPE, SIGNED) \
104 if (IS_SIGNED(TYPE) != SIGNED) { \
105 PyErr_Format(TestError, \
106 "%s signness is, instead of %i", \
107 #TYPE, IS_SIGNED(TYPE), SIGNED); \
108 return (PyObject*)NULL; \
109 }
Victor Stinner01076552013-10-29 19:39:52 +0100110
111 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100112 CHECK_SIZEOF(Py_UCS1, 1);
113 CHECK_SIZEOF(Py_UCS2, 2);
114 CHECK_SIZEOF(Py_UCS4, 4);
115 CHECK_SIGNNESS(Py_UCS1, 0);
116 CHECK_SIGNNESS(Py_UCS2, 0);
117 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700118 CHECK_SIZEOF(int32_t, 4);
119 CHECK_SIGNNESS(int32_t, 1);
120 CHECK_SIZEOF(uint32_t, 4);
121 CHECK_SIGNNESS(uint32_t, 0);
122 CHECK_SIZEOF(int64_t, 8);
123 CHECK_SIGNNESS(int64_t, 1);
124 CHECK_SIZEOF(uint64_t, 8);
125 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100126
127 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100128 CHECK_SIZEOF(size_t, sizeof(void *));
129 CHECK_SIGNNESS(size_t, 0);
130 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
131 CHECK_SIGNNESS(Py_ssize_t, 1);
132
Benjamin Petersonca470632016-09-06 13:47:26 -0700133 CHECK_SIZEOF(uintptr_t, sizeof(void *));
134 CHECK_SIGNNESS(uintptr_t, 0);
135 CHECK_SIZEOF(intptr_t, sizeof(void *));
136 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100137
Serhiy Storchakad1302c02017-01-23 10:23:58 +0200138 Py_RETURN_NONE;
Victor Stinner01076552013-10-29 19:39:52 +0100139
Victor Stinnerf866f972013-10-29 19:59:31 +0100140#undef IS_SIGNED
141#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100142#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800143#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200144#pragma GCC diagnostic pop
145#endif
Victor Stinner01076552013-10-29 19:39:52 +0100146}
147
148
149static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530150test_list_api(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 PyObject* list;
153 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000156#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 list = PyList_New(NLIST);
158 if (list == (PyObject*)NULL)
159 return (PyObject*)NULL;
160 /* list = range(NLIST) */
161 for (i = 0; i < NLIST; ++i) {
162 PyObject* anint = PyLong_FromLong(i);
163 if (anint == (PyObject*)NULL) {
164 Py_DECREF(list);
165 return (PyObject*)NULL;
166 }
167 PyList_SET_ITEM(list, i, anint);
168 }
169 /* list.reverse(), via PyList_Reverse() */
170 i = PyList_Reverse(list); /* should not blow up! */
171 if (i != 0) {
172 Py_DECREF(list);
173 return (PyObject*)NULL;
174 }
175 /* Check that list == range(29, -1, -1) now */
176 for (i = 0; i < NLIST; ++i) {
177 PyObject* anint = PyList_GET_ITEM(list, i);
178 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
179 PyErr_SetString(TestError,
180 "test_list_api: reverse screwed up");
181 Py_DECREF(list);
182 return (PyObject*)NULL;
183 }
184 }
185 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000186#undef NLIST
187
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200188 Py_RETURN_NONE;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000189}
190
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000191static int
192test_dict_inner(int count)
193{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 Py_ssize_t pos = 0, iterations = 0;
195 int i;
196 PyObject *dict = PyDict_New();
197 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 if (dict == NULL)
200 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 for (i = 0; i < count; i++) {
203 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200204 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200205 return -1;
206 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200207 if (PyDict_SetItem(dict, v, v) < 0) {
208 Py_DECREF(v);
209 return -1;
210 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 Py_DECREF(v);
212 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 while (PyDict_Next(dict, &pos, &k, &v)) {
215 PyObject *o;
216 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 i = PyLong_AS_LONG(v) + 1;
219 o = PyLong_FromLong(i);
220 if (o == NULL)
221 return -1;
222 if (PyDict_SetItem(dict, k, o) < 0) {
223 Py_DECREF(o);
224 return -1;
225 }
226 Py_DECREF(o);
227 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 if (iterations != count) {
232 PyErr_SetString(
233 TestError,
234 "test_dict_iteration: dict iteration went wrong ");
235 return -1;
236 } else {
237 return 0;
238 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000239}
240
241static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530242test_dict_iteration(PyObject* self, PyObject *Py_UNUSED(ignored))
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 for (i = 0; i < 200; i++) {
247 if (test_dict_inner(i) < 0) {
248 return NULL;
249 }
250 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000251
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200252 Py_RETURN_NONE;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000253}
254
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200255static PyObject*
256dict_getitem_knownhash(PyObject *self, PyObject *args)
257{
258 PyObject *mp, *key, *result;
259 Py_ssize_t hash;
260
261 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
262 &mp, &key, &hash)) {
263 return NULL;
264 }
265
266 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
267 if (result == NULL && !PyErr_Occurred()) {
268 _PyErr_SetKeyError(key);
269 return NULL;
270 }
271
272 Py_XINCREF(result);
273 return result;
274}
Tim Peters91621db2001-06-12 20:10:01 +0000275
Victor Stinner3d3f2642016-12-15 17:21:23 +0100276static PyObject*
277dict_hassplittable(PyObject *self, PyObject *arg)
278{
279 if (!PyDict_Check(arg)) {
280 PyErr_Format(PyExc_TypeError,
281 "dict_hassplittable() argument must be dict, not '%s'",
Victor Stinnerdaa97562020-02-07 03:37:06 +0100282 Py_TYPE(arg)->tp_name);
Victor Stinner3d3f2642016-12-15 17:21:23 +0100283 return NULL;
284 }
285
286 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
287}
288
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000289/* Issue #4701: Check that PyObject_Hash implicitly calls
290 * PyType_Ready if it hasn't already been called
291 */
292static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 PyVarObject_HEAD_INIT(NULL, 0)
294 "hashinheritancetester", /* Name of this type */
295 sizeof(PyObject), /* Basic object size */
296 0, /* Item size for varobject */
297 (destructor)PyObject_Del, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200298 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 0, /* tp_getattr */
300 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200301 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 0, /* tp_repr */
303 0, /* tp_as_number */
304 0, /* tp_as_sequence */
305 0, /* tp_as_mapping */
306 0, /* tp_hash */
307 0, /* tp_call */
308 0, /* tp_str */
309 PyObject_GenericGetAttr, /* tp_getattro */
310 0, /* tp_setattro */
311 0, /* tp_as_buffer */
312 Py_TPFLAGS_DEFAULT, /* tp_flags */
313 0, /* tp_doc */
314 0, /* tp_traverse */
315 0, /* tp_clear */
316 0, /* tp_richcompare */
317 0, /* tp_weaklistoffset */
318 0, /* tp_iter */
319 0, /* tp_iternext */
320 0, /* tp_methods */
321 0, /* tp_members */
322 0, /* tp_getset */
323 0, /* tp_base */
324 0, /* tp_dict */
325 0, /* tp_descr_get */
326 0, /* tp_descr_set */
327 0, /* tp_dictoffset */
328 0, /* tp_init */
329 0, /* tp_alloc */
330 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000331};
332
333static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530334test_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000335{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 PyTypeObject *type;
337 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000338 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 if (type->tp_dict != NULL)
343 /* The type has already been initialized. This probably means
344 -R is being used. */
345 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000346
347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 obj = PyObject_New(PyObject, type);
349 if (obj == NULL) {
350 PyErr_Clear();
351 PyErr_SetString(
352 TestError,
353 "test_lazy_hash_inheritance: failed to create object");
354 return NULL;
355 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 if (type->tp_dict != NULL) {
358 PyErr_SetString(
359 TestError,
360 "test_lazy_hash_inheritance: type initialised too soon");
361 Py_DECREF(obj);
362 return NULL;
363 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 hash = PyObject_Hash(obj);
366 if ((hash == -1) && PyErr_Occurred()) {
367 PyErr_Clear();
368 PyErr_SetString(
369 TestError,
370 "test_lazy_hash_inheritance: could not hash object");
371 Py_DECREF(obj);
372 return NULL;
373 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 if (type->tp_dict == NULL) {
376 PyErr_SetString(
377 TestError,
378 "test_lazy_hash_inheritance: type not initialised by hash()");
379 Py_DECREF(obj);
380 return NULL;
381 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 if (type->tp_hash != PyType_Type.tp_hash) {
384 PyErr_SetString(
385 TestError,
386 "test_lazy_hash_inheritance: unexpected hash function");
387 Py_DECREF(obj);
388 return NULL;
389 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000394}
395
396
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700397/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000398 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000399
400 Note that the meat of the test is contained in testcapi_long.h.
401 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700402 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000403 dependence on type names makes it impossible to use a parameterized
404 function. A giant macro would be even worse than this. A C++ template
405 would be perfect.
406
407 The "report an error" functions are deliberately not part of the #include
408 file: if the test fails, you can set a breakpoint in the appropriate
409 error function directly, and crawl back from there in the debugger.
410*/
411
412#define UNBIND(X) Py_DECREF(X); (X) = NULL
413
414static PyObject *
415raise_test_long_error(const char* msg)
416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000418}
419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420#define TESTNAME test_long_api_inner
421#define TYPENAME long
422#define F_S_TO_PY PyLong_FromLong
423#define F_PY_TO_S PyLong_AsLong
424#define F_U_TO_PY PyLong_FromUnsignedLong
425#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000426
427#include "testcapi_long.h"
428
429static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530430test_long_api(PyObject* self, PyObject *Py_UNUSED(ignored))
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000433}
434
435#undef TESTNAME
436#undef TYPENAME
437#undef F_S_TO_PY
438#undef F_PY_TO_S
439#undef F_U_TO_PY
440#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000441
Tim Peters91621db2001-06-12 20:10:01 +0000442static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000443raise_test_longlong_error(const char* msg)
444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000446}
447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700449#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450#define F_S_TO_PY PyLong_FromLongLong
451#define F_PY_TO_S PyLong_AsLongLong
452#define F_U_TO_PY PyLong_FromUnsignedLongLong
453#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000454
455#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000456
457static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000458test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000461}
462
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000463#undef TESTNAME
464#undef TYPENAME
465#undef F_S_TO_PY
466#undef F_PY_TO_S
467#undef F_U_TO_PY
468#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000469
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000470/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
471 is tested by test_long_api_inner. This test will concentrate on proper
472 handling of overflow.
473*/
474
475static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530476test_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 PyObject *num, *one, *temp;
479 long value;
480 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 /* Test that overflow is set properly for a large value. */
483 /* num is a number larger than LONG_MAX even on 64-bit platforms */
484 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
485 if (num == NULL)
486 return NULL;
487 overflow = 1234;
488 value = PyLong_AsLongAndOverflow(num, &overflow);
489 Py_DECREF(num);
490 if (value == -1 && PyErr_Occurred())
491 return NULL;
492 if (value != -1)
493 return raiseTestError("test_long_and_overflow",
494 "return value was not set to -1");
495 if (overflow != 1)
496 return raiseTestError("test_long_and_overflow",
497 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 /* Same again, with num = LONG_MAX + 1 */
500 num = PyLong_FromLong(LONG_MAX);
501 if (num == NULL)
502 return NULL;
503 one = PyLong_FromLong(1L);
504 if (one == NULL) {
505 Py_DECREF(num);
506 return NULL;
507 }
508 temp = PyNumber_Add(num, one);
509 Py_DECREF(one);
510 Py_DECREF(num);
511 num = temp;
512 if (num == NULL)
513 return NULL;
514 overflow = 0;
515 value = PyLong_AsLongAndOverflow(num, &overflow);
516 Py_DECREF(num);
517 if (value == -1 && PyErr_Occurred())
518 return NULL;
519 if (value != -1)
520 return raiseTestError("test_long_and_overflow",
521 "return value was not set to -1");
522 if (overflow != 1)
523 return raiseTestError("test_long_and_overflow",
524 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 /* Test that overflow is set properly for a large negative value. */
527 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
528 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
529 if (num == NULL)
530 return NULL;
531 overflow = 1234;
532 value = PyLong_AsLongAndOverflow(num, &overflow);
533 Py_DECREF(num);
534 if (value == -1 && PyErr_Occurred())
535 return NULL;
536 if (value != -1)
537 return raiseTestError("test_long_and_overflow",
538 "return value was not set to -1");
539 if (overflow != -1)
540 return raiseTestError("test_long_and_overflow",
541 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 /* Same again, with num = LONG_MIN - 1 */
544 num = PyLong_FromLong(LONG_MIN);
545 if (num == NULL)
546 return NULL;
547 one = PyLong_FromLong(1L);
548 if (one == NULL) {
549 Py_DECREF(num);
550 return NULL;
551 }
552 temp = PyNumber_Subtract(num, one);
553 Py_DECREF(one);
554 Py_DECREF(num);
555 num = temp;
556 if (num == NULL)
557 return NULL;
558 overflow = 0;
559 value = PyLong_AsLongAndOverflow(num, &overflow);
560 Py_DECREF(num);
561 if (value == -1 && PyErr_Occurred())
562 return NULL;
563 if (value != -1)
564 return raiseTestError("test_long_and_overflow",
565 "return value was not set to -1");
566 if (overflow != -1)
567 return raiseTestError("test_long_and_overflow",
568 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 /* Test that overflow is cleared properly for small values. */
571 num = PyLong_FromString("FF", NULL, 16);
572 if (num == NULL)
573 return NULL;
574 overflow = 1234;
575 value = PyLong_AsLongAndOverflow(num, &overflow);
576 Py_DECREF(num);
577 if (value == -1 && PyErr_Occurred())
578 return NULL;
579 if (value != 0xFF)
580 return raiseTestError("test_long_and_overflow",
581 "expected return value 0xFF");
582 if (overflow != 0)
583 return raiseTestError("test_long_and_overflow",
584 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 num = PyLong_FromString("-FF", NULL, 16);
587 if (num == NULL)
588 return NULL;
589 overflow = 0;
590 value = PyLong_AsLongAndOverflow(num, &overflow);
591 Py_DECREF(num);
592 if (value == -1 && PyErr_Occurred())
593 return NULL;
594 if (value != -0xFF)
595 return raiseTestError("test_long_and_overflow",
596 "expected return value 0xFF");
597 if (overflow != 0)
598 return raiseTestError("test_long_and_overflow",
599 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 num = PyLong_FromLong(LONG_MAX);
602 if (num == NULL)
603 return NULL;
604 overflow = 1234;
605 value = PyLong_AsLongAndOverflow(num, &overflow);
606 Py_DECREF(num);
607 if (value == -1 && PyErr_Occurred())
608 return NULL;
609 if (value != LONG_MAX)
610 return raiseTestError("test_long_and_overflow",
611 "expected return value LONG_MAX");
612 if (overflow != 0)
613 return raiseTestError("test_long_and_overflow",
614 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 num = PyLong_FromLong(LONG_MIN);
617 if (num == NULL)
618 return NULL;
619 overflow = 0;
620 value = PyLong_AsLongAndOverflow(num, &overflow);
621 Py_DECREF(num);
622 if (value == -1 && PyErr_Occurred())
623 return NULL;
624 if (value != LONG_MIN)
625 return raiseTestError("test_long_and_overflow",
626 "expected return value LONG_MIN");
627 if (overflow != 0)
628 return raiseTestError("test_long_and_overflow",
629 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000630
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200631 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000632}
633
Mark Dickinson93f562c2010-01-30 10:30:15 +0000634/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700635 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000636 concentrate on proper handling of overflow.
637*/
638
639static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530640test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson93f562c2010-01-30 10:30:15 +0000641{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700643 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 /* Test that overflow is set properly for a large value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500647 /* num is a number larger than LLONG_MAX on a typical machine. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
649 if (num == NULL)
650 return NULL;
651 overflow = 1234;
652 value = PyLong_AsLongLongAndOverflow(num, &overflow);
653 Py_DECREF(num);
654 if (value == -1 && PyErr_Occurred())
655 return NULL;
656 if (value != -1)
657 return raiseTestError("test_long_long_and_overflow",
658 "return value was not set to -1");
659 if (overflow != 1)
660 return raiseTestError("test_long_long_and_overflow",
661 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000662
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500663 /* Same again, with num = LLONG_MAX + 1 */
664 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 if (num == NULL)
666 return NULL;
667 one = PyLong_FromLong(1L);
668 if (one == NULL) {
669 Py_DECREF(num);
670 return NULL;
671 }
672 temp = PyNumber_Add(num, one);
673 Py_DECREF(one);
674 Py_DECREF(num);
675 num = temp;
676 if (num == NULL)
677 return NULL;
678 overflow = 0;
679 value = PyLong_AsLongLongAndOverflow(num, &overflow);
680 Py_DECREF(num);
681 if (value == -1 && PyErr_Occurred())
682 return NULL;
683 if (value != -1)
684 return raiseTestError("test_long_long_and_overflow",
685 "return value was not set to -1");
686 if (overflow != 1)
687 return raiseTestError("test_long_long_and_overflow",
688 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 /* Test that overflow is set properly for a large negative value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500691 /* num is a number smaller than LLONG_MIN on a typical platform */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
693 if (num == NULL)
694 return NULL;
695 overflow = 1234;
696 value = PyLong_AsLongLongAndOverflow(num, &overflow);
697 Py_DECREF(num);
698 if (value == -1 && PyErr_Occurred())
699 return NULL;
700 if (value != -1)
701 return raiseTestError("test_long_long_and_overflow",
702 "return value was not set to -1");
703 if (overflow != -1)
704 return raiseTestError("test_long_long_and_overflow",
705 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000706
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500707 /* Same again, with num = LLONG_MIN - 1 */
708 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 if (num == NULL)
710 return NULL;
711 one = PyLong_FromLong(1L);
712 if (one == NULL) {
713 Py_DECREF(num);
714 return NULL;
715 }
716 temp = PyNumber_Subtract(num, one);
717 Py_DECREF(one);
718 Py_DECREF(num);
719 num = temp;
720 if (num == NULL)
721 return NULL;
722 overflow = 0;
723 value = PyLong_AsLongLongAndOverflow(num, &overflow);
724 Py_DECREF(num);
725 if (value == -1 && PyErr_Occurred())
726 return NULL;
727 if (value != -1)
728 return raiseTestError("test_long_long_and_overflow",
729 "return value was not set to -1");
730 if (overflow != -1)
731 return raiseTestError("test_long_long_and_overflow",
732 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 /* Test that overflow is cleared properly for small values. */
735 num = PyLong_FromString("FF", NULL, 16);
736 if (num == NULL)
737 return NULL;
738 overflow = 1234;
739 value = PyLong_AsLongLongAndOverflow(num, &overflow);
740 Py_DECREF(num);
741 if (value == -1 && PyErr_Occurred())
742 return NULL;
743 if (value != 0xFF)
744 return raiseTestError("test_long_long_and_overflow",
745 "expected return value 0xFF");
746 if (overflow != 0)
747 return raiseTestError("test_long_long_and_overflow",
748 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 num = PyLong_FromString("-FF", NULL, 16);
751 if (num == NULL)
752 return NULL;
753 overflow = 0;
754 value = PyLong_AsLongLongAndOverflow(num, &overflow);
755 Py_DECREF(num);
756 if (value == -1 && PyErr_Occurred())
757 return NULL;
758 if (value != -0xFF)
759 return raiseTestError("test_long_long_and_overflow",
760 "expected return value 0xFF");
761 if (overflow != 0)
762 return raiseTestError("test_long_long_and_overflow",
763 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000764
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500765 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 if (num == NULL)
767 return NULL;
768 overflow = 1234;
769 value = PyLong_AsLongLongAndOverflow(num, &overflow);
770 Py_DECREF(num);
771 if (value == -1 && PyErr_Occurred())
772 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500773 if (value != LLONG_MAX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500775 "expected return value LLONG_MAX");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 if (overflow != 0)
777 return raiseTestError("test_long_long_and_overflow",
778 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000779
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500780 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 if (num == NULL)
782 return NULL;
783 overflow = 0;
784 value = PyLong_AsLongLongAndOverflow(num, &overflow);
785 Py_DECREF(num);
786 if (value == -1 && PyErr_Occurred())
787 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500788 if (value != LLONG_MIN)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500790 "expected return value LLONG_MIN");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 if (overflow != 0)
792 return raiseTestError("test_long_long_and_overflow",
793 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000794
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200795 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000796}
797
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200798/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
799 non-integer arguments are handled correctly. It should be extended to
800 test overflow handling.
801 */
802
803static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530804test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200805{
806 size_t out_u;
807 Py_ssize_t out_s;
808
809 Py_INCREF(Py_None);
810
811 out_u = PyLong_AsSize_t(Py_None);
812 if (out_u != (size_t)-1 || !PyErr_Occurred())
813 return raiseTestError("test_long_as_size_t",
814 "PyLong_AsSize_t(None) didn't complain");
815 if (!PyErr_ExceptionMatches(PyExc_TypeError))
816 return raiseTestError("test_long_as_size_t",
817 "PyLong_AsSize_t(None) raised "
818 "something other than TypeError");
819 PyErr_Clear();
820
821 out_s = PyLong_AsSsize_t(Py_None);
822 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
823 return raiseTestError("test_long_as_size_t",
824 "PyLong_AsSsize_t(None) didn't complain");
825 if (!PyErr_ExceptionMatches(PyExc_TypeError))
826 return raiseTestError("test_long_as_size_t",
827 "PyLong_AsSsize_t(None) raised "
828 "something other than TypeError");
829 PyErr_Clear();
830
831 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
832 return Py_None;
833}
834
Zackery Spytzdc247652019-06-06 14:39:23 -0600835static PyObject *
836test_long_as_unsigned_long_long_mask(PyObject *self,
837 PyObject *Py_UNUSED(ignored))
838{
839 unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL);
840
841 if (res != (unsigned long long)-1 || !PyErr_Occurred()) {
842 return raiseTestError("test_long_as_unsigned_long_long_mask",
843 "PyLong_AsUnsignedLongLongMask(NULL) didn't "
844 "complain");
845 }
846 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
847 return raiseTestError("test_long_as_unsigned_long_long_mask",
848 "PyLong_AsUnsignedLongLongMask(NULL) raised "
849 "something other than SystemError");
850 }
851 PyErr_Clear();
852 Py_RETURN_NONE;
853}
854
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200855/* Test the PyLong_AsDouble API. At present this just tests that
856 non-integer arguments are handled correctly.
857 */
858
859static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530860test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200861{
862 double out;
863
864 Py_INCREF(Py_None);
865
866 out = PyLong_AsDouble(Py_None);
867 if (out != -1.0 || !PyErr_Occurred())
868 return raiseTestError("test_long_as_double",
869 "PyLong_AsDouble(None) didn't complain");
870 if (!PyErr_ExceptionMatches(PyExc_TypeError))
871 return raiseTestError("test_long_as_double",
872 "PyLong_AsDouble(None) raised "
873 "something other than TypeError");
874 PyErr_Clear();
875
876 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
877 return Py_None;
878}
879
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700880/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000881 for both long and int arguments. The test may leak a little memory if
882 it fails.
883*/
884static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530885test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersd38b1c72001-09-30 05:09:37 +0000886{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700888 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 tuple = PyTuple_New(1);
891 if (tuple == NULL)
892 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 num = PyLong_FromLong(42);
895 if (num == NULL)
896 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300901 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300903 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 if (value != 42)
905 return raiseTestError("test_L_code",
906 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 Py_DECREF(num);
909 num = PyLong_FromLong(42);
910 if (num == NULL)
911 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300916 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300918 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 if (value != 42)
920 return raiseTestError("test_L_code",
921 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200924 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000925}
926
Serhiy Storchakace412872016-05-08 23:36:44 +0300927static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300928return_none(void *unused)
929{
930 Py_RETURN_NONE;
931}
932
933static PyObject *
934raise_error(void *unused)
935{
936 PyErr_SetNone(PyExc_ValueError);
937 return NULL;
938}
939
940static int
941test_buildvalue_N_error(const char *fmt)
942{
943 PyObject *arg, *res;
944
945 arg = PyList_New(0);
946 if (arg == NULL) {
947 return -1;
948 }
949
950 Py_INCREF(arg);
951 res = Py_BuildValue(fmt, return_none, NULL, arg);
952 if (res == NULL) {
953 return -1;
954 }
955 Py_DECREF(res);
956 if (Py_REFCNT(arg) != 1) {
957 PyErr_Format(TestError, "test_buildvalue_N: "
958 "arg was not decrefed in successful "
959 "Py_BuildValue(\"%s\")", fmt);
960 return -1;
961 }
962
963 Py_INCREF(arg);
964 res = Py_BuildValue(fmt, raise_error, NULL, arg);
965 if (res != NULL || !PyErr_Occurred()) {
966 PyErr_Format(TestError, "test_buildvalue_N: "
967 "Py_BuildValue(\"%s\") didn't complain", fmt);
968 return -1;
969 }
970 PyErr_Clear();
971 if (Py_REFCNT(arg) != 1) {
972 PyErr_Format(TestError, "test_buildvalue_N: "
973 "arg was not decrefed in failed "
974 "Py_BuildValue(\"%s\")", fmt);
975 return -1;
976 }
977 Py_DECREF(arg);
978 return 0;
979}
980
981static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +0200982test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300983{
984 PyObject *arg, *res;
985
986 arg = PyList_New(0);
987 if (arg == NULL) {
988 return NULL;
989 }
990 Py_INCREF(arg);
991 res = Py_BuildValue("N", arg);
992 if (res == NULL) {
993 return NULL;
994 }
995 if (res != arg) {
996 return raiseTestError("test_buildvalue_N",
997 "Py_BuildValue(\"N\") returned wrong result");
998 }
999 if (Py_REFCNT(arg) != 2) {
1000 return raiseTestError("test_buildvalue_N",
1001 "arg was not decrefed in Py_BuildValue(\"N\")");
1002 }
1003 Py_DECREF(res);
1004 Py_DECREF(arg);
1005
1006 if (test_buildvalue_N_error("O&N") < 0)
1007 return NULL;
1008 if (test_buildvalue_N_error("(O&N)") < 0)
1009 return NULL;
1010 if (test_buildvalue_N_error("[O&N]") < 0)
1011 return NULL;
1012 if (test_buildvalue_N_error("{O&N}") < 0)
1013 return NULL;
1014 if (test_buildvalue_N_error("{()O&(())N}") < 0)
1015 return NULL;
1016
1017 Py_RETURN_NONE;
1018}
1019
1020
1021static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +03001022get_args(PyObject *self, PyObject *args)
1023{
1024 if (args == NULL) {
1025 args = Py_None;
1026 }
1027 Py_INCREF(args);
1028 return args;
1029}
1030
1031static PyObject *
1032get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1033{
1034 if (kwargs == NULL) {
1035 kwargs = Py_None;
1036 }
1037 Py_INCREF(kwargs);
1038 return kwargs;
1039}
1040
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001041/* Test tuple argument processing */
1042static PyObject *
1043getargs_tuple(PyObject *self, PyObject *args)
1044{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 int a, b, c;
1046 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1047 return NULL;
1048 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001049}
1050
Christian Heimes380f7f22008-02-28 11:19:05 +00001051/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001052static PyObject *
1053getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001056 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1060 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1061 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1062 return NULL;
1063 return Py_BuildValue("iiiiiiiiii",
1064 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1065 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001066}
1067
Larry Hastings83a9f482012-03-20 20:06:16 +00001068/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1069static PyObject *
1070getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1071{
1072 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1073 int required = -1;
1074 int optional = -1;
1075 int keyword_only = -1;
1076
1077 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1078 &required, &optional, &keyword_only))
1079 return NULL;
1080 return Py_BuildValue("iii", required, optional, keyword_only);
1081}
1082
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001083/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1084static PyObject *
1085getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1086{
1087 static char *keywords[] = {"", "", "keyword", NULL};
1088 int required = -1;
1089 int optional = -1;
1090 int keyword = -1;
1091
1092 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1093 &required, &optional, &keyword))
1094 return NULL;
1095 return Py_BuildValue("iii", required, optional, keyword);
1096}
1097
Thomas Heller3457e4b2003-04-24 16:14:27 +00001098/* Functions to call PyArg_ParseTuple with integer format codes,
1099 and return the result.
1100*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001101static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001102getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 unsigned char value;
1105 if (!PyArg_ParseTuple(args, "b", &value))
1106 return NULL;
1107 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001108}
1109
Thomas Heller3457e4b2003-04-24 16:14:27 +00001110static PyObject *
1111getargs_B(PyObject *self, PyObject *args)
1112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 unsigned char value;
1114 if (!PyArg_ParseTuple(args, "B", &value))
1115 return NULL;
1116 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001117}
1118
1119static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001120getargs_h(PyObject *self, PyObject *args)
1121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 short value;
1123 if (!PyArg_ParseTuple(args, "h", &value))
1124 return NULL;
1125 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001126}
1127
1128static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001129getargs_H(PyObject *self, PyObject *args)
1130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 unsigned short value;
1132 if (!PyArg_ParseTuple(args, "H", &value))
1133 return NULL;
1134 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001135}
1136
1137static PyObject *
1138getargs_I(PyObject *self, PyObject *args)
1139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 unsigned int value;
1141 if (!PyArg_ParseTuple(args, "I", &value))
1142 return NULL;
1143 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001144}
1145
1146static PyObject *
1147getargs_k(PyObject *self, PyObject *args)
1148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 unsigned long value;
1150 if (!PyArg_ParseTuple(args, "k", &value))
1151 return NULL;
1152 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001153}
1154
1155static PyObject *
1156getargs_i(PyObject *self, PyObject *args)
1157{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 int value;
1159 if (!PyArg_ParseTuple(args, "i", &value))
1160 return NULL;
1161 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001162}
1163
Thomas Hellera4ea6032003-04-17 18:55:45 +00001164static PyObject *
1165getargs_l(PyObject *self, PyObject *args)
1166{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 long value;
1168 if (!PyArg_ParseTuple(args, "l", &value))
1169 return NULL;
1170 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001171}
1172
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001173static PyObject *
1174getargs_n(PyObject *self, PyObject *args)
1175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 Py_ssize_t value;
1177 if (!PyArg_ParseTuple(args, "n", &value))
1178 return NULL;
1179 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001180}
1181
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001182static PyObject *
1183getargs_p(PyObject *self, PyObject *args)
1184{
1185 int value;
1186 if (!PyArg_ParseTuple(args, "p", &value))
1187 return NULL;
1188 return PyLong_FromLong(value);
1189}
1190
Thomas Hellera4ea6032003-04-17 18:55:45 +00001191static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001192getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001193{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001194 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 if (!PyArg_ParseTuple(args, "L", &value))
1196 return NULL;
1197 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001198}
1199
Thomas Hellera4ea6032003-04-17 18:55:45 +00001200static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001201getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001202{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001203 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 if (!PyArg_ParseTuple(args, "K", &value))
1205 return NULL;
1206 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001207}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001208
1209/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001210 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001211static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301212test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 PyObject *tuple, *num;
1215 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 tuple = PyTuple_New(1);
1218 if (tuple == NULL)
1219 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 /* a number larger than ULONG_MAX even on 64-bit platforms */
1222 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1223 if (num == NULL)
1224 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 value = PyLong_AsUnsignedLongMask(num);
1227 if (value != ULONG_MAX)
1228 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001229 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001234 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001236 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 if (value != ULONG_MAX)
1238 return raiseTestError("test_k_code",
1239 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 Py_DECREF(num);
1242 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1243 if (num == NULL)
1244 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 value = PyLong_AsUnsignedLongMask(num);
1247 if (value != (unsigned long)-0x42)
1248 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001249 "PyLong_AsUnsignedLongMask() returned wrong "
1250 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001255 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001257 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 if (value != (unsigned long)-0x42)
1259 return raiseTestError("test_k_code",
1260 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001263 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001264}
1265
Victor Stinner06e49dd2010-06-13 18:21:50 +00001266static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001267getargs_f(PyObject *self, PyObject *args)
1268{
1269 float f;
1270 if (!PyArg_ParseTuple(args, "f", &f))
1271 return NULL;
1272 return PyFloat_FromDouble(f);
1273}
1274
1275static PyObject *
1276getargs_d(PyObject *self, PyObject *args)
1277{
1278 double d;
1279 if (!PyArg_ParseTuple(args, "d", &d))
1280 return NULL;
1281 return PyFloat_FromDouble(d);
1282}
1283
1284static PyObject *
1285getargs_D(PyObject *self, PyObject *args)
1286{
1287 Py_complex cval;
1288 if (!PyArg_ParseTuple(args, "D", &cval))
1289 return NULL;
1290 return PyComplex_FromCComplex(cval);
1291}
1292
1293static PyObject *
1294getargs_S(PyObject *self, PyObject *args)
1295{
1296 PyObject *obj;
1297 if (!PyArg_ParseTuple(args, "S", &obj))
1298 return NULL;
1299 Py_INCREF(obj);
1300 return obj;
1301}
1302
1303static PyObject *
1304getargs_Y(PyObject *self, PyObject *args)
1305{
1306 PyObject *obj;
1307 if (!PyArg_ParseTuple(args, "Y", &obj))
1308 return NULL;
1309 Py_INCREF(obj);
1310 return obj;
1311}
1312
1313static PyObject *
1314getargs_U(PyObject *self, PyObject *args)
1315{
1316 PyObject *obj;
1317 if (!PyArg_ParseTuple(args, "U", &obj))
1318 return NULL;
1319 Py_INCREF(obj);
1320 return obj;
1321}
1322
1323static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001324getargs_c(PyObject *self, PyObject *args)
1325{
1326 char c;
1327 if (!PyArg_ParseTuple(args, "c", &c))
1328 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001329 return PyLong_FromLong((unsigned char)c);
1330}
1331
1332static PyObject *
1333getargs_C(PyObject *self, PyObject *args)
1334{
1335 int c;
1336 if (!PyArg_ParseTuple(args, "C", &c))
1337 return NULL;
1338 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001339}
1340
1341static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001342getargs_s(PyObject *self, PyObject *args)
1343{
1344 char *str;
1345 if (!PyArg_ParseTuple(args, "s", &str))
1346 return NULL;
1347 return PyBytes_FromString(str);
1348}
1349
1350static PyObject *
1351getargs_s_star(PyObject *self, PyObject *args)
1352{
1353 Py_buffer buffer;
1354 PyObject *bytes;
1355 if (!PyArg_ParseTuple(args, "s*", &buffer))
1356 return NULL;
1357 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1358 PyBuffer_Release(&buffer);
1359 return bytes;
1360}
1361
1362static PyObject *
1363getargs_s_hash(PyObject *self, PyObject *args)
1364{
1365 char *str;
1366 Py_ssize_t size;
1367 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1368 return NULL;
1369 return PyBytes_FromStringAndSize(str, size);
1370}
1371
1372static PyObject *
1373getargs_z(PyObject *self, PyObject *args)
1374{
1375 char *str;
1376 if (!PyArg_ParseTuple(args, "z", &str))
1377 return NULL;
1378 if (str != NULL)
1379 return PyBytes_FromString(str);
1380 else
1381 Py_RETURN_NONE;
1382}
1383
1384static PyObject *
1385getargs_z_star(PyObject *self, PyObject *args)
1386{
1387 Py_buffer buffer;
1388 PyObject *bytes;
1389 if (!PyArg_ParseTuple(args, "z*", &buffer))
1390 return NULL;
1391 if (buffer.buf != NULL)
1392 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1393 else {
1394 Py_INCREF(Py_None);
1395 bytes = Py_None;
1396 }
1397 PyBuffer_Release(&buffer);
1398 return bytes;
1399}
1400
1401static PyObject *
1402getargs_z_hash(PyObject *self, PyObject *args)
1403{
1404 char *str;
1405 Py_ssize_t size;
1406 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1407 return NULL;
1408 if (str != NULL)
1409 return PyBytes_FromStringAndSize(str, size);
1410 else
1411 Py_RETURN_NONE;
1412}
1413
1414static PyObject *
1415getargs_y(PyObject *self, PyObject *args)
1416{
1417 char *str;
1418 if (!PyArg_ParseTuple(args, "y", &str))
1419 return NULL;
1420 return PyBytes_FromString(str);
1421}
1422
1423static PyObject *
1424getargs_y_star(PyObject *self, PyObject *args)
1425{
1426 Py_buffer buffer;
1427 PyObject *bytes;
1428 if (!PyArg_ParseTuple(args, "y*", &buffer))
1429 return NULL;
1430 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1431 PyBuffer_Release(&buffer);
1432 return bytes;
1433}
1434
1435static PyObject *
1436getargs_y_hash(PyObject *self, PyObject *args)
1437{
1438 char *str;
1439 Py_ssize_t size;
1440 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1441 return NULL;
1442 return PyBytes_FromStringAndSize(str, size);
1443}
1444
1445static PyObject *
1446getargs_u(PyObject *self, PyObject *args)
1447{
1448 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001449 if (!PyArg_ParseTuple(args, "u", &str))
1450 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001451 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001452}
1453
1454static PyObject *
1455getargs_u_hash(PyObject *self, PyObject *args)
1456{
1457 Py_UNICODE *str;
1458 Py_ssize_t size;
1459 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1460 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001461 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001462}
1463
1464static PyObject *
1465getargs_Z(PyObject *self, PyObject *args)
1466{
1467 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001468 if (!PyArg_ParseTuple(args, "Z", &str))
1469 return NULL;
1470 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001471 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001472 } else
1473 Py_RETURN_NONE;
1474}
1475
1476static PyObject *
1477getargs_Z_hash(PyObject *self, PyObject *args)
1478{
1479 Py_UNICODE *str;
1480 Py_ssize_t size;
1481 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1482 return NULL;
1483 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001484 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001485 else
1486 Py_RETURN_NONE;
1487}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001488
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001489static PyObject *
1490getargs_es(PyObject *self, PyObject *args)
1491{
1492 PyObject *arg, *result;
1493 const char *encoding = NULL;
1494 char *str;
1495
1496 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1497 return NULL;
1498 if (!PyArg_Parse(arg, "es", encoding, &str))
1499 return NULL;
1500 result = PyBytes_FromString(str);
1501 PyMem_Free(str);
1502 return result;
1503}
1504
1505static PyObject *
1506getargs_et(PyObject *self, PyObject *args)
1507{
1508 PyObject *arg, *result;
1509 const char *encoding = NULL;
1510 char *str;
1511
1512 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1513 return NULL;
1514 if (!PyArg_Parse(arg, "et", encoding, &str))
1515 return NULL;
1516 result = PyBytes_FromString(str);
1517 PyMem_Free(str);
1518 return result;
1519}
1520
1521static PyObject *
1522getargs_es_hash(PyObject *self, PyObject *args)
1523{
1524 PyObject *arg, *result;
1525 const char *encoding = NULL;
1526 PyByteArrayObject *buffer = NULL;
1527 char *str = NULL;
1528 Py_ssize_t size;
1529
1530 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1531 return NULL;
1532 if (buffer != NULL) {
1533 str = PyByteArray_AS_STRING(buffer);
1534 size = PyByteArray_GET_SIZE(buffer);
1535 }
1536 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1537 return NULL;
1538 result = PyBytes_FromStringAndSize(str, size);
1539 if (buffer == NULL)
1540 PyMem_Free(str);
1541 return result;
1542}
1543
1544static PyObject *
1545getargs_et_hash(PyObject *self, PyObject *args)
1546{
1547 PyObject *arg, *result;
1548 const char *encoding = NULL;
1549 PyByteArrayObject *buffer = NULL;
1550 char *str = NULL;
1551 Py_ssize_t size;
1552
1553 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1554 return NULL;
1555 if (buffer != NULL) {
1556 str = PyByteArray_AS_STRING(buffer);
1557 size = PyByteArray_GET_SIZE(buffer);
1558 }
1559 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1560 return NULL;
1561 result = PyBytes_FromStringAndSize(str, size);
1562 if (buffer == NULL)
1563 PyMem_Free(str);
1564 return result;
1565}
1566
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001567/* Test the s and z codes for PyArg_ParseTuple.
1568*/
1569static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301570test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001571{
1572 /* Unicode strings should be accepted */
1573 PyObject *tuple, *obj;
1574 char *value;
1575
1576 tuple = PyTuple_New(1);
1577 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001579
1580 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001582 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001584
1585 PyTuple_SET_ITEM(tuple, 0, obj);
1586
1587 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001589 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001590 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1591 return NULL;
1592 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001593
Oren Milmanba7d7362017-08-29 11:58:27 +03001594 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1595 return NULL;
1596 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001597
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001598 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001599 Py_RETURN_NONE;
1600}
1601
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001602static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001603parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001604{
Larry Hastings8f904da2012-06-22 03:56:29 -07001605 PyObject *sub_args;
1606 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001607 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001608 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001609
Larry Hastings8f904da2012-06-22 03:56:29 -07001610 Py_ssize_t i, size;
1611 char *keywords[8 + 1]; /* space for NULL at end */
1612 PyObject *o;
1613 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001614
Larry Hastings8f904da2012-06-22 03:56:29 -07001615 int result;
1616 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001617
Larry Hastings22701e82012-08-08 14:52:22 -07001618 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001619
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001620 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001621 &sub_args, &sub_kwargs,
1622 &sub_format, &sub_keywords))
1623 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001624
Larry Hastings8f904da2012-06-22 03:56:29 -07001625 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1626 PyErr_SetString(PyExc_ValueError,
1627 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1628 return NULL;
1629 }
1630
1631 memset(buffers, 0, sizeof(buffers));
1632 memset(converted, 0, sizeof(converted));
1633 memset(keywords, 0, sizeof(keywords));
1634
1635 size = PySequence_Fast_GET_SIZE(sub_keywords);
1636 if (size > 8) {
1637 PyErr_SetString(PyExc_ValueError,
1638 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1639 goto exit;
1640 }
1641
1642 for (i = 0; i < size; i++) {
1643 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1644 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1645 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001646 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001647 goto exit;
1648 }
1649 keywords[i] = PyBytes_AS_STRING(converted[i]);
1650 }
1651
1652 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1653 sub_format, keywords,
1654 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1655 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1656
1657 if (result) {
1658 return_value = Py_None;
1659 Py_INCREF(Py_None);
1660 }
1661
1662exit:
1663 size = sizeof(converted) / sizeof(converted[0]);
1664 for (i = 0; i < size; i++) {
1665 Py_XDECREF(converted[i]);
1666 }
1667 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001668}
1669
Benjamin Peterson92035012008-12-27 16:00:54 +00001670static volatile int x;
1671
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001672#if USE_UNICODE_WCHAR_CACHE
Inada Naoki2c4928d2020-06-17 20:09:44 +09001673/* Ignore use of deprecated APIs */
1674_Py_COMP_DIAG_PUSH
1675_Py_COMP_DIAG_IGNORE_DEPR_DECLS
1676
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001677/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1678 of an error.
1679*/
1680static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301681test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001682{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 PyObject *tuple, *obj;
1684 Py_UNICODE *value;
1685 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1688 /* Just use the macro and check that it compiles */
1689 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 tuple = PyTuple_New(1);
1692 if (tuple == NULL)
1693 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 obj = PyUnicode_Decode("test", strlen("test"),
1696 "ascii", NULL);
1697 if (obj == NULL)
1698 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001703 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001705 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 if (value != PyUnicode_AS_UNICODE(obj))
1707 return raiseTestError("test_u_code",
1708 "u code returned wrong value for u'test'");
1709 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001710 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001712 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 if (value != PyUnicode_AS_UNICODE(obj) ||
1714 len != PyUnicode_GET_SIZE(obj))
1715 return raiseTestError("test_u_code",
1716 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001719 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001720}
1721
Guido van Rossumfb67be22007-08-29 18:38:11 +00001722/* Test Z and Z# codes for PyArg_ParseTuple */
1723static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301724test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001725{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001727 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 tuple = PyTuple_New(2);
1731 if (tuple == NULL)
1732 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 obj = PyUnicode_FromString("test");
1735 PyTuple_SET_ITEM(tuple, 0, obj);
1736 Py_INCREF(Py_None);
1737 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 /* swap values on purpose */
1740 value1 = NULL;
1741 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001744 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001746 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 if (value1 != PyUnicode_AS_UNICODE(obj))
1748 return raiseTestError("test_Z_code",
1749 "Z code returned wrong value for 'test'");
1750 if (value2 != NULL)
1751 return raiseTestError("test_Z_code",
1752 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 value1 = NULL;
1755 value2 = PyUnicode_AS_UNICODE(obj);
1756 len1 = -1;
1757 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001760 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1761 &value2, &len2))
1762 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001764 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1766 len1 != PyUnicode_GET_SIZE(obj))
1767 return raiseTestError("test_Z_code",
1768 "Z# code returned wrong values for 'test'");
1769 if (value2 != NULL ||
1770 len2 != 0)
1771 return raiseTestError("test_Z_code",
1772 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 Py_DECREF(tuple);
1775 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001776}
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001777_Py_COMP_DIAG_POP
1778#endif /* USE_UNICODE_WCHAR_CACHE */
Guido van Rossumfb67be22007-08-29 18:38:11 +00001779
Thomas Wouters477c8d52006-05-27 19:21:47 +00001780static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301781test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001782{
1783#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1785 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001786 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001787#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1789 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001790#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1794 if (wide == NULL)
1795 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1798 if (utf8 == NULL) {
1799 Py_DECREF(wide);
1800 return NULL;
1801 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001802
Victor Stinner8ef18872011-11-21 02:06:57 +01001803 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 Py_DECREF(wide);
1805 Py_DECREF(utf8);
1806 return raiseTestError("test_widechar",
1807 "wide string and utf8 string "
1808 "have different length");
1809 }
1810 if (PyUnicode_Compare(wide, utf8)) {
1811 Py_DECREF(wide);
1812 Py_DECREF(utf8);
1813 if (PyErr_Occurred())
1814 return NULL;
1815 return raiseTestError("test_widechar",
1816 "wide string and utf8 string "
1817 "are different");
1818 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 Py_DECREF(wide);
1821 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001822
1823#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1824 wide = PyUnicode_FromWideChar(invalid, 1);
1825 if (wide == NULL)
1826 PyErr_Clear();
1827 else
1828 return raiseTestError("test_widechar",
1829 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1830
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001831#if USE_UNICODE_WCHAR_CACHE
1832/* Ignore use of deprecated APIs */
1833_Py_COMP_DIAG_PUSH
1834_Py_COMP_DIAG_IGNORE_DEPR_DECLS
Victor Stinnere3b47152011-12-09 20:49:49 +01001835 wide = PyUnicode_FromUnicode(invalid, 1);
1836 if (wide == NULL)
1837 PyErr_Clear();
1838 else
1839 return raiseTestError("test_widechar",
1840 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001841
1842 wide = PyUnicode_FromUnicode(NULL, 1);
1843 if (wide == NULL)
1844 return NULL;
1845 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001846 if (_PyUnicode_Ready(wide) < 0) {
1847 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001848 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001849 }
1850 else {
1851 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001852 return raiseTestError("test_widechar",
1853 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001854 }
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001855_Py_COMP_DIAG_POP
1856#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinnere3b47152011-12-09 20:49:49 +01001857#endif
1858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001860}
1861
1862static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001863unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001864{
1865 PyObject *unicode, *result;
1866 Py_ssize_t buflen, size;
1867 wchar_t *buffer;
1868
1869 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1870 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001871 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001872 if (buffer == NULL)
1873 return PyErr_NoMemory();
1874
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001875 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001876 if (size == -1) {
1877 PyMem_Free(buffer);
1878 return NULL;
1879 }
1880
1881 if (size < buflen)
1882 buflen = size + 1;
1883 else
1884 buflen = size;
1885 result = PyUnicode_FromWideChar(buffer, buflen);
1886 PyMem_Free(buffer);
1887 if (result == NULL)
1888 return NULL;
1889
1890 return Py_BuildValue("(Nn)", result, size);
1891}
1892
1893static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001894unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001895{
1896 PyObject *unicode, *result;
1897 Py_ssize_t size;
1898 wchar_t *buffer;
1899
1900 if (!PyArg_ParseTuple(args, "U", &unicode))
1901 return NULL;
1902
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001903 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001904 if (buffer == NULL)
1905 return NULL;
1906
1907 result = PyUnicode_FromWideChar(buffer, size + 1);
1908 PyMem_Free(buffer);
1909 if (result == NULL)
1910 return NULL;
1911 return Py_BuildValue("(Nn)", result, size);
1912}
1913
1914static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001915unicode_asucs4(PyObject *self, PyObject *args)
1916{
1917 PyObject *unicode, *result;
1918 Py_UCS4 *buffer;
1919 int copy_null;
1920 Py_ssize_t str_len, buf_len;
1921
1922 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1923 return NULL;
1924 }
1925
1926 buf_len = str_len + 1;
1927 buffer = PyMem_NEW(Py_UCS4, buf_len);
1928 if (buffer == NULL) {
1929 return PyErr_NoMemory();
1930 }
1931 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1932 buffer[str_len] = 0xffffU;
1933
1934 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1935 PyMem_FREE(buffer);
1936 return NULL;
1937 }
1938
1939 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1940 PyMem_FREE(buffer);
1941 return result;
1942}
1943
1944static PyObject *
Hai Shi5623ac82019-07-20 02:56:23 -05001945unicode_asutf8(PyObject *self, PyObject *args)
1946{
1947 PyObject *unicode;
1948 const char *buffer;
1949
1950 if (!PyArg_ParseTuple(args, "U", &unicode)) {
1951 return NULL;
1952 }
1953
1954 buffer = PyUnicode_AsUTF8(unicode);
1955 if (buffer == NULL) {
1956 return NULL;
1957 }
1958
1959 return PyBytes_FromString(buffer);
1960}
1961
1962static PyObject *
1963unicode_asutf8andsize(PyObject *self, PyObject *args)
1964{
1965 PyObject *unicode, *result;
1966 const char *buffer;
1967 Py_ssize_t utf8_len;
1968
1969 if(!PyArg_ParseTuple(args, "U", &unicode)) {
1970 return NULL;
1971 }
1972
Victor Stinneraca8c402019-09-30 21:14:26 +02001973 buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len);
Hai Shi5623ac82019-07-20 02:56:23 -05001974 if (buffer == NULL) {
1975 return NULL;
1976 }
1977
1978 result = PyBytes_FromString(buffer);
1979 if (result == NULL) {
1980 return NULL;
1981 }
1982
1983 return Py_BuildValue("(Nn)", result, utf8_len);
1984}
1985
1986static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001987unicode_findchar(PyObject *self, PyObject *args)
1988{
1989 PyObject *str;
1990 int direction;
1991 unsigned int ch;
1992 Py_ssize_t result;
1993 Py_ssize_t start, end;
1994
1995 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1996 &start, &end, &direction)) {
1997 return NULL;
1998 }
1999
2000 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
2001 if (result == -2)
2002 return NULL;
2003 else
2004 return PyLong_FromSsize_t(result);
2005}
2006
2007static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002008unicode_copycharacters(PyObject *self, PyObject *args)
2009{
2010 PyObject *from, *to, *to_copy;
2011 Py_ssize_t from_start, to_start, how_many, copied;
2012
2013 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
2014 &from, &from_start, &how_many)) {
2015 return NULL;
2016 }
2017
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002018 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
2019 PyUnicode_MAX_CHAR_VALUE(to)))) {
2020 return NULL;
2021 }
2022 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
2023 Py_DECREF(to_copy);
2024 return NULL;
2025 }
2026
2027 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
2028 from_start, how_many)) < 0) {
2029 Py_DECREF(to_copy);
2030 return NULL;
2031 }
2032
2033 return Py_BuildValue("(Nn)", to_copy, copied);
2034}
2035
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002036#if USE_UNICODE_WCHAR_CACHE
Inada Naoki13c90e82020-07-05 11:01:54 +09002037/* Ignore use of deprecated APIs */
2038_Py_COMP_DIAG_PUSH
2039_Py_COMP_DIAG_IGNORE_DEPR_DECLS
2040
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002041static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01002042unicode_encodedecimal(PyObject *self, PyObject *args)
2043{
2044 Py_UNICODE *unicode;
2045 Py_ssize_t length;
2046 char *errors = NULL;
2047 PyObject *decimal;
2048 Py_ssize_t decimal_length, new_length;
2049 int res;
2050
2051 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
2052 return NULL;
2053
2054 decimal_length = length * 7; /* len('&#8364;') */
2055 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
2056 if (decimal == NULL)
2057 return NULL;
2058
2059 res = PyUnicode_EncodeDecimal(unicode, length,
2060 PyBytes_AS_STRING(decimal),
2061 errors);
2062 if (res < 0) {
2063 Py_DECREF(decimal);
2064 return NULL;
2065 }
2066
2067 new_length = strlen(PyBytes_AS_STRING(decimal));
2068 assert(new_length <= decimal_length);
2069 res = _PyBytes_Resize(&decimal, new_length);
2070 if (res < 0)
2071 return NULL;
2072
2073 return decimal;
2074}
2075
2076static PyObject *
2077unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
2078{
2079 Py_UNICODE *unicode;
2080 Py_ssize_t length;
2081 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
2082 return NULL;
2083 return PyUnicode_TransformDecimalToASCII(unicode, length);
2084}
2085
2086static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002087unicode_legacy_string(PyObject *self, PyObject *args)
2088{
2089 Py_UNICODE *data;
2090 Py_ssize_t len;
2091 PyObject *u;
2092
2093 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2094 return NULL;
2095
2096 u = PyUnicode_FromUnicode(NULL, len);
2097 if (u == NULL)
2098 return NULL;
2099
2100 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2101
2102 if (len > 0) { /* The empty string is always ready. */
2103 assert(!PyUnicode_IS_READY(u));
2104 }
2105
2106 return u;
2107}
Inada Naoki2c4928d2020-06-17 20:09:44 +09002108_Py_COMP_DIAG_POP
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002109#endif /* USE_UNICODE_WCHAR_CACHE */
Stefan Krahe6996ed2012-11-02 14:44:20 +01002110
2111static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002112getargs_w_star(PyObject *self, PyObject *args)
2113{
2114 Py_buffer buffer;
2115 PyObject *result;
2116 char *str;
2117
2118 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2119 return NULL;
2120
2121 if (2 <= buffer.len) {
2122 str = buffer.buf;
2123 str[0] = '[';
2124 str[buffer.len-1] = ']';
2125 }
2126
2127 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2128 PyBuffer_Release(&buffer);
2129 return result;
2130}
2131
2132
2133static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302134test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 /* Test that formats can begin with '|'. See issue #4720. */
2137 PyObject *tuple, *dict = NULL;
2138 static char *kwlist[] = {NULL};
2139 int result;
2140 tuple = PyTuple_New(0);
2141 if (!tuple)
2142 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002143 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002145 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 dict = PyDict_New();
2147 if (!dict)
2148 goto done;
2149 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002150 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 Py_DECREF(tuple);
2152 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002153 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002155 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 else {
2157 Py_RETURN_NONE;
2158 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002159}
2160
2161static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002162codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002164 const char *encoding, *errors = NULL;
2165 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2166 &encoding, &errors))
2167 return NULL;
2168 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002169}
2170
Thomas Wouters477c8d52006-05-27 19:21:47 +00002171static PyObject *
2172codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 const char *encoding, *errors = NULL;
2175 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2176 &encoding, &errors))
2177 return NULL;
2178 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002179}
2180
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002181
Tim Peters5b8132f2003-01-31 15:52:05 +00002182/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002183static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302184test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002185{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 struct triple {
2187 long input;
2188 size_t nbits;
2189 int sign;
2190 } testcases[] = {{0, 0, 0},
2191 {1L, 1, 1},
2192 {-1L, 1, -1},
2193 {2L, 2, 1},
2194 {-2L, 2, -1},
2195 {3L, 2, 1},
2196 {-3L, 2, -1},
2197 {4L, 3, 1},
2198 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002199 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200 {-0x7fffL, 15, -1},
2201 {0xffffL, 16, 1},
2202 {-0xffffL, 16, -1},
2203 {0xfffffffL, 28, 1},
2204 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002205 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002206
Victor Stinner63941882011-09-29 00:42:28 +02002207 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002208 size_t nbits;
2209 int sign;
2210 PyObject *plong;
2211
2212 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002213 if (plong == NULL)
2214 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002215 nbits = _PyLong_NumBits(plong);
2216 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 Py_DECREF(plong);
2219 if (nbits != testcases[i].nbits)
2220 return raiseTestError("test_long_numbits",
2221 "wrong result for _PyLong_NumBits");
2222 if (sign != testcases[i].sign)
2223 return raiseTestError("test_long_numbits",
2224 "wrong result for _PyLong_Sign");
2225 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002226 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002227}
2228
Thomas Heller519a0422007-11-15 20:48:54 +00002229/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002230
2231static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302232test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2235 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2236 Py_XDECREF(o1);
2237 Py_XDECREF(o2);
2238 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002239}
2240
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002241static PyObject *
2242raise_exception(PyObject *self, PyObject *args)
2243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 PyObject *exc;
2245 PyObject *exc_args, *v;
2246 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2249 &exc, &num_args))
2250 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 exc_args = PyTuple_New(num_args);
2253 if (exc_args == NULL)
2254 return NULL;
2255 for (i = 0; i < num_args; ++i) {
2256 v = PyLong_FromLong(i);
2257 if (v == NULL) {
2258 Py_DECREF(exc_args);
2259 return NULL;
2260 }
2261 PyTuple_SET_ITEM(exc_args, i, v);
2262 }
2263 PyErr_SetObject(exc, exc_args);
2264 Py_DECREF(exc_args);
2265 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002266}
Tim Peters91621db2001-06-12 20:10:01 +00002267
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002268static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002269set_errno(PyObject *self, PyObject *args)
2270{
2271 int new_errno;
2272
2273 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2274 return NULL;
2275
2276 errno = new_errno;
2277 Py_RETURN_NONE;
2278}
2279
2280static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002281test_set_exc_info(PyObject *self, PyObject *args)
2282{
2283 PyObject *orig_exc;
2284 PyObject *new_type, *new_value, *new_tb;
2285 PyObject *type, *value, *tb;
2286 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2287 &new_type, &new_value, &new_tb))
2288 return NULL;
2289
2290 PyErr_GetExcInfo(&type, &value, &tb);
2291
2292 Py_INCREF(new_type);
2293 Py_INCREF(new_value);
2294 Py_INCREF(new_tb);
2295 PyErr_SetExcInfo(new_type, new_value, new_tb);
2296
2297 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2298 Py_XDECREF(type);
2299 Py_XDECREF(value);
2300 Py_XDECREF(tb);
2301 return orig_exc;
2302}
Benjamin Peterson16323982010-02-03 01:13:41 +00002303
2304static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002305
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002306static PyObject *
2307test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 if (PyDateTimeAPI) {
2309 if (test_run_counter) {
2310 /* Probably regrtest.py -R */
2311 Py_RETURN_NONE;
2312 }
2313 else {
2314 PyErr_SetString(PyExc_AssertionError,
2315 "PyDateTime_CAPI somehow initialized");
2316 return NULL;
2317 }
2318 }
2319 test_run_counter++;
2320 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 if (PyDateTimeAPI)
2323 Py_RETURN_NONE;
2324 else
2325 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002326}
2327
Paul Ganssle04af5b12018-01-24 17:29:30 -05002328/* Functions exposing the C API type checking for testing */
2329#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2330 PyObject *obj; \
2331 int exact = 0; \
2332 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2333 return NULL; \
2334 } \
2335 int rv = exact?exact_method(obj):check_method(obj); \
2336 if (rv) { \
2337 Py_RETURN_TRUE; \
2338 } else { \
2339 Py_RETURN_FALSE; \
2340 }
2341
2342static PyObject *
2343datetime_check_date(PyObject *self, PyObject *args) {
2344 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2345}
2346
2347static PyObject *
2348datetime_check_time(PyObject *self, PyObject *args) {
2349 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2350}
2351
2352static PyObject *
2353datetime_check_datetime(PyObject *self, PyObject *args) {
2354 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2355}
2356
2357static PyObject *
2358datetime_check_delta(PyObject *self, PyObject *args) {
2359 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2360}
2361
2362static PyObject *
2363datetime_check_tzinfo(PyObject *self, PyObject *args) {
2364 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2365}
2366
2367
2368/* Makes three variations on timezone representing UTC-5:
2369 1. timezone with offset and name from PyDateTimeAPI
2370 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2371 3. timezone with offset (no name) from PyTimeZone_FromOffset
2372*/
2373static PyObject *
2374make_timezones_capi(PyObject *self, PyObject *args) {
2375 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2376 PyObject *name = PyUnicode_FromString("EST");
2377
2378 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2379 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2380 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2381
2382 Py_DecRef(offset);
2383 Py_DecRef(name);
2384
2385 PyObject *rv = PyTuple_New(3);
2386
2387 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2388 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2389 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2390
2391 return rv;
2392}
2393
2394static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002395get_timezones_offset_zero(PyObject *self, PyObject *args) {
2396 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2397 PyObject *name = PyUnicode_FromString("");
2398
2399 // These two should return the UTC singleton
2400 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2401 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2402
2403 // This one will return +00:00 zone, but not the UTC singleton
2404 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2405
2406 Py_DecRef(offset);
2407 Py_DecRef(name);
2408
2409 PyObject *rv = PyTuple_New(3);
2410 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2411 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2412 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2413
2414 return rv;
2415}
2416
2417static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002418get_timezone_utc_capi(PyObject* self, PyObject *args) {
2419 int macro = 0;
2420 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2421 return NULL;
2422 }
2423 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002424 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002425 return PyDateTime_TimeZone_UTC;
2426 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002427 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002428 return PyDateTimeAPI->TimeZone_UTC;
2429 }
2430}
2431
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002432static PyObject *
Edison A98ff4d52019-05-17 13:28:42 -07002433get_date_fromdate(PyObject *self, PyObject *args)
2434{
2435 PyObject *rv = NULL;
2436 int macro;
2437 int year, month, day;
2438
2439 if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2440 return NULL;
2441 }
2442
2443 if (macro) {
2444 rv = PyDate_FromDate(year, month, day);
2445 }
2446 else {
2447 rv = PyDateTimeAPI->Date_FromDate(
2448 year, month, day,
2449 PyDateTimeAPI->DateType);
2450 }
2451 return rv;
2452}
2453
2454static PyObject *
2455get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2456{
2457 PyObject *rv = NULL;
2458 int macro;
2459 int year, month, day;
2460 int hour, minute, second, microsecond;
2461
2462 if (!PyArg_ParseTuple(args, "piiiiiii",
2463 &macro,
2464 &year, &month, &day,
2465 &hour, &minute, &second, &microsecond)) {
2466 return NULL;
2467 }
2468
2469 if (macro) {
2470 rv = PyDateTime_FromDateAndTime(
2471 year, month, day,
2472 hour, minute, second, microsecond);
2473 }
2474 else {
2475 rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2476 year, month, day,
2477 hour, minute, second, microsecond,
2478 Py_None,
2479 PyDateTimeAPI->DateTimeType);
2480 }
2481 return rv;
2482}
2483
2484static PyObject *
2485get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2486{
2487 PyObject *rv = NULL;
2488 int macro;
2489 int year, month, day;
2490 int hour, minute, second, microsecond, fold;
2491
2492 if (!PyArg_ParseTuple(args, "piiiiiiii",
2493 &macro,
2494 &year, &month, &day,
2495 &hour, &minute, &second, &microsecond,
2496 &fold)) {
2497 return NULL;
2498 }
2499
2500 if (macro) {
2501 rv = PyDateTime_FromDateAndTimeAndFold(
2502 year, month, day,
2503 hour, minute, second, microsecond,
2504 fold);
2505 }
2506 else {
2507 rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2508 year, month, day,
2509 hour, minute, second, microsecond,
2510 Py_None,
2511 fold,
2512 PyDateTimeAPI->DateTimeType);
2513 }
2514 return rv;
2515}
2516
2517static PyObject *
2518get_time_fromtime(PyObject *self, PyObject *args)
2519{
2520 PyObject *rv = NULL;
2521 int macro;
2522 int hour, minute, second, microsecond;
2523
2524 if (!PyArg_ParseTuple(args, "piiii",
2525 &macro,
2526 &hour, &minute, &second, &microsecond)) {
2527 return NULL;
2528 }
2529
2530 if (macro) {
2531 rv = PyTime_FromTime(hour, minute, second, microsecond);
2532 }
2533 else {
2534 rv = PyDateTimeAPI->Time_FromTime(
2535 hour, minute, second, microsecond,
2536 Py_None,
2537 PyDateTimeAPI->TimeType);
2538 }
2539 return rv;
2540}
2541
2542static PyObject *
2543get_time_fromtimeandfold(PyObject *self, PyObject *args)
2544{
2545 PyObject *rv = NULL;
2546 int macro;
2547 int hour, minute, second, microsecond, fold;
2548
2549 if (!PyArg_ParseTuple(args, "piiiii",
2550 &macro,
2551 &hour, &minute, &second, &microsecond,
2552 &fold)) {
2553 return NULL;
2554 }
2555
2556 if (macro) {
2557 rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2558 }
2559 else {
2560 rv = PyDateTimeAPI->Time_FromTimeAndFold(
2561 hour, minute, second, microsecond,
2562 Py_None,
2563 fold,
2564 PyDateTimeAPI->TimeType);
2565 }
2566 return rv;
2567}
2568
2569static PyObject *
2570get_delta_fromdsu(PyObject *self, PyObject *args)
2571{
2572 PyObject *rv = NULL;
2573 int macro;
2574 int days, seconds, microseconds;
2575
2576 if (!PyArg_ParseTuple(args, "piii",
2577 &macro,
2578 &days, &seconds, &microseconds)) {
2579 return NULL;
2580 }
2581
2582 if (macro) {
2583 rv = PyDelta_FromDSU(days, seconds, microseconds);
2584 }
2585 else {
2586 rv = PyDateTimeAPI->Delta_FromDelta(
2587 days, seconds, microseconds, 1,
2588 PyDateTimeAPI->DeltaType);
2589 }
2590
2591 return rv;
2592}
2593
2594static PyObject *
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002595get_date_fromtimestamp(PyObject* self, PyObject *args)
2596{
2597 PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2598 int macro = 0;
2599
2600 if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2601 return NULL;
2602 }
2603
2604 // Construct the argument tuple
2605 if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2606 return NULL;
2607 }
2608
2609 // Pass along to the API function
2610 if (macro) {
2611 rv = PyDate_FromTimestamp(tsargs);
2612 }
2613 else {
2614 rv = PyDateTimeAPI->Date_FromTimestamp(
2615 (PyObject *)PyDateTimeAPI->DateType, tsargs
2616 );
2617 }
2618
2619 Py_DECREF(tsargs);
2620 return rv;
2621}
2622
2623static PyObject *
2624get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2625{
2626 int macro = 0;
2627 int usetz = 0;
2628 PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2629 if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2630 return NULL;
2631 }
2632
2633 // Construct the argument tuple
2634 if (usetz) {
2635 tsargs = PyTuple_Pack(2, ts, tzinfo);
2636 }
2637 else {
2638 tsargs = PyTuple_Pack(1, ts);
2639 }
2640
2641 if (tsargs == NULL) {
2642 return NULL;
2643 }
2644
2645 // Pass along to the API function
2646 if (macro) {
2647 rv = PyDateTime_FromTimestamp(tsargs);
2648 }
2649 else {
2650 rv = PyDateTimeAPI->DateTime_FromTimestamp(
2651 (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2652 );
2653 }
2654
2655 Py_DECREF(tsargs);
2656 return rv;
2657}
2658
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002659static PyObject *
2660test_PyDateTime_GET(PyObject *self, PyObject *obj)
2661{
2662 int year, month, day;
2663
2664 year = PyDateTime_GET_YEAR(obj);
2665 month = PyDateTime_GET_MONTH(obj);
2666 day = PyDateTime_GET_DAY(obj);
2667
2668 return Py_BuildValue("(lll)", year, month, day);
2669}
2670
2671static PyObject *
2672test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
2673{
2674 int hour, minute, second, microsecond;
2675
2676 hour = PyDateTime_DATE_GET_HOUR(obj);
2677 minute = PyDateTime_DATE_GET_MINUTE(obj);
2678 second = PyDateTime_DATE_GET_SECOND(obj);
2679 microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002680 PyObject *tzinfo = PyDateTime_DATE_GET_TZINFO(obj);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002681
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002682 return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002683}
2684
2685static PyObject *
2686test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
2687{
2688 int hour, minute, second, microsecond;
2689
2690 hour = PyDateTime_TIME_GET_HOUR(obj);
2691 minute = PyDateTime_TIME_GET_MINUTE(obj);
2692 second = PyDateTime_TIME_GET_SECOND(obj);
2693 microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002694 PyObject *tzinfo = PyDateTime_TIME_GET_TZINFO(obj);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002695
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002696 return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002697}
2698
2699static PyObject *
2700test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
2701{
2702 int days, seconds, microseconds;
2703
2704 days = PyDateTime_DELTA_GET_DAYS(obj);
2705 seconds = PyDateTime_DELTA_GET_SECONDS(obj);
2706 microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
2707
2708 return Py_BuildValue("(lll)", days, seconds, microseconds);
2709}
Benjamin Peterson16323982010-02-03 01:13:41 +00002710
Stefan Krah39042e02020-08-10 16:32:21 +02002711/* Test decimal API */
2712static int decimal_initialized = 0;
2713static PyObject *
2714decimal_is_special(PyObject *module, PyObject *dec)
2715{
2716 int is_special;
2717
2718 (void)module;
2719 if (!decimal_initialized) {
2720 if (import_decimal() < 0) {
2721 return NULL;
2722 }
2723
2724 decimal_initialized = 1;
2725 }
2726
2727 is_special = PyDec_IsSpecial(dec);
2728 if (is_special < 0) {
2729 return NULL;
2730 }
2731
2732 return PyBool_FromLong(is_special);
2733}
2734
2735static PyObject *
2736decimal_is_nan(PyObject *module, PyObject *dec)
2737{
2738 int is_nan;
2739
2740 (void)module;
2741 if (!decimal_initialized) {
2742 if (import_decimal() < 0) {
2743 return NULL;
2744 }
2745
2746 decimal_initialized = 1;
2747 }
2748
2749 is_nan = PyDec_IsNaN(dec);
2750 if (is_nan < 0) {
2751 return NULL;
2752 }
2753
2754 return PyBool_FromLong(is_nan);
2755}
2756
2757static PyObject *
2758decimal_is_infinite(PyObject *module, PyObject *dec)
2759{
2760 int is_infinite;
2761
2762 (void)module;
2763 if (!decimal_initialized) {
2764 if (import_decimal() < 0) {
2765 return NULL;
2766 }
2767
2768 decimal_initialized = 1;
2769 }
2770
2771 is_infinite = PyDec_IsInfinite(dec);
2772 if (is_infinite < 0) {
2773 return NULL;
2774 }
2775
2776 return PyBool_FromLong(is_infinite);
2777}
2778
2779static PyObject *
2780decimal_get_digits(PyObject *module, PyObject *dec)
2781{
2782 int64_t digits;
2783
2784 (void)module;
2785 if (!decimal_initialized) {
2786 if (import_decimal() < 0) {
2787 return NULL;
2788 }
2789
2790 decimal_initialized = 1;
2791 }
2792
2793 digits = PyDec_GetDigits(dec);
2794 if (digits < 0) {
2795 return NULL;
2796 }
2797
2798 return PyLong_FromLongLong(digits);
2799}
2800
2801static PyObject *
2802decimal_as_triple(PyObject *module, PyObject *dec)
2803{
2804 PyObject *tuple = NULL;
2805 PyObject *sign, *hi, *lo;
2806 mpd_uint128_triple_t triple;
2807
2808 (void)module;
2809 if (!decimal_initialized) {
2810 if (import_decimal() < 0) {
2811 return NULL;
2812 }
2813
2814 decimal_initialized = 1;
2815 }
2816
2817 triple = PyDec_AsUint128Triple(dec);
2818 if (triple.tag == MPD_TRIPLE_ERROR && PyErr_Occurred()) {
2819 return NULL;
2820 }
2821
2822 sign = PyLong_FromUnsignedLong(triple.sign);
2823 if (sign == NULL) {
2824 return NULL;
2825 }
2826
2827 hi = PyLong_FromUnsignedLongLong(triple.hi);
2828 if (hi == NULL) {
2829 Py_DECREF(sign);
2830 return NULL;
2831 }
2832
2833 lo = PyLong_FromUnsignedLongLong(triple.lo);
2834 if (lo == NULL) {
2835 Py_DECREF(hi);
2836 Py_DECREF(sign);
2837 return NULL;
2838 }
2839
2840 switch (triple.tag) {
2841 case MPD_TRIPLE_QNAN:
2842 assert(triple.exp == 0);
2843 tuple = Py_BuildValue("(OOOs)", sign, hi, lo, "n");
2844 break;
2845
2846 case MPD_TRIPLE_SNAN:
2847 assert(triple.exp == 0);
2848 tuple = Py_BuildValue("(OOOs)", sign, hi, lo, "N");
2849 break;
2850
2851 case MPD_TRIPLE_INF:
2852 assert(triple.hi == 0);
2853 assert(triple.lo == 0);
2854 assert(triple.exp == 0);
2855 tuple = Py_BuildValue("(OOOs)", sign, hi, lo, "F");
2856 break;
2857
2858 case MPD_TRIPLE_NORMAL:
2859 tuple = Py_BuildValue("(OOOL)", sign, hi, lo, triple.exp);
2860 break;
2861
2862 case MPD_TRIPLE_ERROR:
2863 PyErr_SetString(PyExc_ValueError,
2864 "value out of bounds for a uint128 triple");
2865 break;
2866
2867 default:
2868 PyErr_SetString(PyExc_RuntimeError,
2869 "decimal_as_triple: internal error: unexpected tag");
2870 break;
2871 }
2872
2873 Py_DECREF(lo);
2874 Py_DECREF(hi);
2875 Py_DECREF(sign);
2876
2877 return tuple;
2878}
2879
2880static PyObject *
2881decimal_from_triple(PyObject *module, PyObject *tuple)
2882{
2883 mpd_uint128_triple_t triple = { MPD_TRIPLE_ERROR, 0, 0, 0, 0 };
2884 PyObject *exp;
2885 unsigned long sign;
2886
2887 (void)module;
2888 if (!decimal_initialized) {
2889 if (import_decimal() < 0) {
2890 return NULL;
2891 }
2892
2893 decimal_initialized = 1;
2894 }
2895
2896 if (!PyTuple_Check(tuple)) {
2897 PyErr_SetString(PyExc_TypeError, "argument must be a tuple");
2898 return NULL;
2899 }
2900
2901 if (PyTuple_GET_SIZE(tuple) != 4) {
2902 PyErr_SetString(PyExc_ValueError, "tuple size must be 4");
2903 return NULL;
2904 }
2905
2906 sign = PyLong_AsUnsignedLong(PyTuple_GET_ITEM(tuple, 0));
2907 if (sign == (unsigned long)-1 && PyErr_Occurred()) {
2908 return NULL;
2909 }
2910 if (sign > UINT8_MAX) {
2911 PyErr_SetString(PyExc_ValueError, "sign must be 0 or 1");
2912 return NULL;
2913 }
2914 triple.sign = (uint8_t)sign;
2915
2916 triple.hi = PyLong_AsUnsignedLongLong(PyTuple_GET_ITEM(tuple, 1));
2917 if (triple.hi == (unsigned long long)-1 && PyErr_Occurred()) {
2918 return NULL;
2919 }
2920
2921 triple.lo = PyLong_AsUnsignedLongLong(PyTuple_GET_ITEM(tuple, 2));
2922 if (triple.lo == (unsigned long long)-1 && PyErr_Occurred()) {
2923 return NULL;
2924 }
2925
2926 exp = PyTuple_GET_ITEM(tuple, 3);
2927 if (PyLong_Check(exp)) {
2928 triple.tag = MPD_TRIPLE_NORMAL;
2929 triple.exp = PyLong_AsLongLong(exp);
2930 if (triple.exp == -1 && PyErr_Occurred()) {
2931 return NULL;
2932 }
2933 }
2934 else if (PyUnicode_Check(exp)) {
2935 if (PyUnicode_CompareWithASCIIString(exp, "F") == 0) {
2936 triple.tag = MPD_TRIPLE_INF;
2937 }
2938 else if (PyUnicode_CompareWithASCIIString(exp, "n") == 0) {
2939 triple.tag = MPD_TRIPLE_QNAN;
2940 }
2941 else if (PyUnicode_CompareWithASCIIString(exp, "N") == 0) {
2942 triple.tag = MPD_TRIPLE_SNAN;
2943 }
2944 else {
2945 PyErr_SetString(PyExc_ValueError, "not a valid exponent");
2946 return NULL;
2947 }
2948 }
2949 else {
2950 PyErr_SetString(PyExc_TypeError, "exponent must be int or string");
2951 return NULL;
2952 }
2953
2954 return PyDec_FromUint128Triple(&triple);
2955}
2956
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002957/* test_thread_state spawns a thread of its own, and that thread releases
2958 * `thread_done` when it's finished. The driver code has to know when the
2959 * thread finishes, because the thread uses a PyObject (the callable) that
2960 * may go away when the driver finishes. The former lack of this explicit
2961 * synchronization caused rare segfaults, so rare that they were seen only
2962 * on a Mac buildbot (although they were possible on any box).
2963 */
2964static PyThread_type_lock thread_done = NULL;
2965
Benjamin Petersona786b022008-08-25 21:05:21 +00002966static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002967_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002968{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 PyObject *rc;
2970 int success;
2971 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002972 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002973 success = (rc != NULL);
2974 Py_XDECREF(rc);
2975 PyGILState_Release(s);
2976 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002977}
2978
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002979/* Same thing, but releases `thread_done` when it returns. This variant
2980 * should be called only from threads spawned by test_thread_state().
2981 */
2982static void
2983_make_call_from_thread(void *callable)
2984{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 _make_call(callable);
2986 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002987}
2988
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002989static PyObject *
2990test_thread_state(PyObject *self, PyObject *args)
2991{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002992 PyObject *fn;
2993 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002995 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2996 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002998 if (!PyCallable_Check(fn)) {
2999 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
Victor Stinnerdaa97562020-02-07 03:37:06 +01003000 Py_TYPE(fn)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003001 return NULL;
3002 }
Benjamin Petersona786b022008-08-25 21:05:21 +00003003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003004 thread_done = PyThread_allocate_lock();
3005 if (thread_done == NULL)
3006 return PyErr_NoMemory();
3007 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003009 /* Start a new thread with our callback. */
3010 PyThread_start_new_thread(_make_call_from_thread, fn);
3011 /* Make the callback with the thread lock held by this thread */
3012 success &= _make_call(fn);
3013 /* Do it all again, but this time with the thread-lock released */
3014 Py_BEGIN_ALLOW_THREADS
3015 success &= _make_call(fn);
3016 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
3017 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 /* And once more with and without a thread
3020 XXX - should use a lock and work out exactly what we are trying
3021 to test <wink>
3022 */
3023 Py_BEGIN_ALLOW_THREADS
3024 PyThread_start_new_thread(_make_call_from_thread, fn);
3025 success &= _make_call(fn);
3026 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
3027 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003029 /* Release lock we acquired above. This is required on HP-UX. */
3030 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 PyThread_free_lock(thread_done);
3033 if (!success)
3034 return NULL;
3035 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003036}
Benjamin Petersona54c9092009-01-13 02:11:23 +00003037
3038/* test Py_AddPendingCalls using threads */
3039static int _pending_callback(void *arg)
3040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003041 /* we assume the argument is callable object to which we own a reference */
3042 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01003043 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 Py_DECREF(callable);
3045 Py_XDECREF(r);
3046 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00003047}
3048
3049/* The following requests n callbacks to _pending_callback. It can be
3050 * run from any python thread.
3051 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07003052static PyObject *
3053pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00003054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 PyObject *callable;
3056 int r;
3057 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
3058 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00003059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003060 /* create the reference for the callbackwhile we hold the lock */
3061 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00003062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 Py_BEGIN_ALLOW_THREADS
3064 r = Py_AddPendingCall(&_pending_callback, callable);
3065 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00003066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 if (r<0) {
3068 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003069 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003071 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00003072}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003073
Neal Norwitzb0d26332007-08-25 00:49:05 +00003074/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003075static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003076test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00003077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003078 PyObject *result;
3079 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003080
Alexander Belopolskye239d232010-12-08 23:31:48 +00003081#define CHECK_1_FORMAT(FORMAT, TYPE) \
3082 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
3083 if (result == NULL) \
3084 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003085 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00003086 msg = FORMAT " failed at 1"; \
3087 goto Fail; \
3088 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003091 CHECK_1_FORMAT("%d", int);
3092 CHECK_1_FORMAT("%ld", long);
3093 /* The z width modifier was added in Python 2.5. */
3094 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 /* The u type code was added in Python 2.5. */
3097 CHECK_1_FORMAT("%u", unsigned int);
3098 CHECK_1_FORMAT("%lu", unsigned long);
3099 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003101 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003102 CHECK_1_FORMAT("%llu", unsigned long long);
3103 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00003104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003106
3107 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003108 Py_XDECREF(result);
3109 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003110
3111#undef CHECK_1_FORMAT
3112}
3113
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00003114
3115static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303116test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003117 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
3118 int result;
3119 if (py_s == NULL)
3120 return NULL;
3121 result = PyUnicode_CompareWithASCIIString(py_s, "str");
3122 Py_DECREF(py_s);
3123 if (!result) {
3124 PyErr_SetString(TestError, "Python string ending in NULL "
3125 "should not compare equal to c string.");
3126 return NULL;
3127 }
3128 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00003129}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00003130
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003131/* This is here to provide a docstring for test_descr. */
3132static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303133test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003135 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003136}
3137
Mark Dickinson725bfd82009-05-03 20:33:40 +00003138/* Test PyOS_string_to_double. */
3139static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303140test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02003142 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144#define CHECK_STRING(STR, expected) \
3145 result = PyOS_string_to_double(STR, NULL, NULL); \
3146 if (result == -1.0 && PyErr_Occurred()) \
3147 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07003148 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149 msg = "conversion of " STR " to float failed"; \
3150 goto fail; \
3151 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00003152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153#define CHECK_INVALID(STR) \
3154 result = PyOS_string_to_double(STR, NULL, NULL); \
3155 if (result == -1.0 && PyErr_Occurred()) { \
3156 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
3157 PyErr_Clear(); \
3158 else \
3159 return NULL; \
3160 } \
3161 else { \
3162 msg = "conversion of " STR " didn't raise ValueError"; \
3163 goto fail; \
3164 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00003165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003166 CHECK_STRING("0.1", 0.1);
3167 CHECK_STRING("1.234", 1.234);
3168 CHECK_STRING("-1.35", -1.35);
3169 CHECK_STRING(".1e01", 1.0);
3170 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00003171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003172 CHECK_INVALID(" 0.1");
3173 CHECK_INVALID("\t\n-3");
3174 CHECK_INVALID(".123 ");
3175 CHECK_INVALID("3\n");
3176 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00003177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003179 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00003181#undef CHECK_STRING
3182#undef CHECK_INVALID
3183}
3184
3185
Benjamin Petersonb173f782009-05-05 22:31:58 +00003186/* Coverage testing of capsule objects. */
3187
3188static const char *capsule_name = "capsule name";
3189static char *capsule_pointer = "capsule pointer";
3190static char *capsule_context = "capsule context";
3191static const char *capsule_error = NULL;
3192static int
3193capsule_destructor_call_count = 0;
3194
3195static void
3196capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003197 capsule_destructor_call_count++;
3198 if (PyCapsule_GetContext(o) != capsule_context) {
3199 capsule_error = "context did not match in destructor!";
3200 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
3201 capsule_error = "destructor did not match in destructor! (woah!)";
3202 } else if (PyCapsule_GetName(o) != capsule_name) {
3203 capsule_error = "name did not match in destructor!";
3204 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
3205 capsule_error = "pointer did not match in destructor!";
3206 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003207}
3208
3209typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003210 char *name;
3211 char *module;
3212 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003213} known_capsule;
3214
3215static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003216test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00003217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 PyObject *object;
3219 const char *error = NULL;
3220 void *pointer;
3221 void *pointer2;
3222 known_capsule known_capsules[] = {
3223 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
3224 KNOWN_CAPSULE("_socket", "CAPI"),
3225 KNOWN_CAPSULE("_curses", "_C_API"),
3226 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
3227 { NULL, NULL },
3228 };
3229 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003230
3231#define FAIL(x) { error = (x); goto exit; }
3232
3233#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003234 if (capsule_error) { \
3235 FAIL(capsule_error); \
3236 } \
3237 else if (!capsule_destructor_call_count) { \
3238 FAIL("destructor not called!"); \
3239 } \
3240 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
3243 PyCapsule_SetContext(object, capsule_context);
3244 capsule_destructor(object);
3245 CHECK_DESTRUCTOR;
3246 Py_DECREF(object);
3247 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 object = PyCapsule_New(known, "ignored", NULL);
3250 PyCapsule_SetPointer(object, capsule_pointer);
3251 PyCapsule_SetName(object, capsule_name);
3252 PyCapsule_SetDestructor(object, capsule_destructor);
3253 PyCapsule_SetContext(object, capsule_context);
3254 capsule_destructor(object);
3255 CHECK_DESTRUCTOR;
3256 /* intentionally access using the wrong name */
3257 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
3258 if (!PyErr_Occurred()) {
3259 FAIL("PyCapsule_GetPointer should have failed but did not!");
3260 }
3261 PyErr_Clear();
3262 if (pointer2) {
3263 if (pointer2 == capsule_pointer) {
3264 FAIL("PyCapsule_GetPointer should not have"
3265 " returned the internal pointer!");
3266 } else {
3267 FAIL("PyCapsule_GetPointer should have "
3268 "returned NULL pointer but did not!");
3269 }
3270 }
3271 PyCapsule_SetDestructor(object, NULL);
3272 Py_DECREF(object);
3273 if (capsule_destructor_call_count) {
3274 FAIL("destructor called when it should not have been!");
3275 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003277 for (known = &known_capsules[0]; known->module != NULL; known++) {
3278 /* yeah, ordinarily I wouldn't do this either,
3279 but it's fine for this test harness.
3280 */
3281 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003282#undef FAIL
3283#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003284 { \
3285 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
3286 x, known->module, known->attribute); \
3287 error = buffer; \
3288 goto exit; \
3289 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 PyObject *module = PyImport_ImportModule(known->module);
3292 if (module) {
3293 pointer = PyCapsule_Import(known->name, 0);
3294 if (!pointer) {
3295 Py_DECREF(module);
3296 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
3297 }
3298 object = PyObject_GetAttrString(module, known->attribute);
3299 if (!object) {
3300 Py_DECREF(module);
3301 return NULL;
3302 }
3303 pointer2 = PyCapsule_GetPointer(object,
3304 "weebles wobble but they don't fall down");
3305 if (!PyErr_Occurred()) {
3306 Py_DECREF(object);
3307 Py_DECREF(module);
3308 FAIL("PyCapsule_GetPointer should have failed but did not!");
3309 }
3310 PyErr_Clear();
3311 if (pointer2) {
3312 Py_DECREF(module);
3313 Py_DECREF(object);
3314 if (pointer2 == pointer) {
3315 FAIL("PyCapsule_GetPointer should not have"
3316 " returned its internal pointer!");
3317 } else {
3318 FAIL("PyCapsule_GetPointer should have"
3319 " returned NULL pointer but did not!");
3320 }
3321 }
3322 Py_DECREF(object);
3323 Py_DECREF(module);
3324 }
3325 else
3326 PyErr_Clear();
3327 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003328
3329 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 if (error) {
3331 return raiseTestError("test_capsule", error);
3332 }
3333 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003334#undef FAIL
3335}
3336
Guido van Rossumddefaf32007-01-14 03:31:43 +00003337#ifdef HAVE_GETTIMEOFDAY
3338/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00003339static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003340{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 e->tv_sec -= s->tv_sec;
3342 e->tv_usec -= s->tv_usec;
3343 if (e->tv_usec < 0) {
3344 e->tv_sec -=1;
3345 e->tv_usec += 1000000;
3346 }
3347 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003348}
3349
3350static PyObject *
3351profile_int(PyObject *self, PyObject* args)
3352{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 int i, k;
3354 struct timeval start, stop;
3355 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 /* Test 1: Allocate and immediately deallocate
3358 many small integers */
3359 gettimeofday(&start, NULL);
3360 for(k=0; k < 20000; k++)
3361 for(i=0; i < 1000; i++) {
3362 single = PyLong_FromLong(i);
3363 Py_DECREF(single);
3364 }
3365 gettimeofday(&stop, NULL);
3366 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003368 /* Test 2: Allocate and immediately deallocate
3369 many large integers */
3370 gettimeofday(&start, NULL);
3371 for(k=0; k < 20000; k++)
3372 for(i=0; i < 1000; i++) {
3373 single = PyLong_FromLong(i+1000000);
3374 Py_DECREF(single);
3375 }
3376 gettimeofday(&stop, NULL);
3377 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 /* Test 3: Allocate a few integers, then release
3380 them all simultaneously. */
3381 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02003382 if (multiple == NULL)
3383 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003384 gettimeofday(&start, NULL);
3385 for(k=0; k < 20000; k++) {
3386 for(i=0; i < 1000; i++) {
3387 multiple[i] = PyLong_FromLong(i+1000000);
3388 }
3389 for(i=0; i < 1000; i++) {
3390 Py_DECREF(multiple[i]);
3391 }
3392 }
3393 gettimeofday(&stop, NULL);
3394 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003395 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003397 /* Test 4: Allocate many integers, then release
3398 them all simultaneously. */
3399 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003400 if (multiple == NULL)
3401 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003402 gettimeofday(&start, NULL);
3403 for(k=0; k < 20; k++) {
3404 for(i=0; i < 1000000; i++) {
3405 multiple[i] = PyLong_FromLong(i+1000000);
3406 }
3407 for(i=0; i < 1000000; i++) {
3408 Py_DECREF(multiple[i]);
3409 }
3410 }
3411 gettimeofday(&stop, NULL);
3412 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003413 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003415 /* Test 5: Allocate many integers < 32000 */
3416 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003417 if (multiple == NULL)
3418 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 gettimeofday(&start, NULL);
3420 for(k=0; k < 10; k++) {
3421 for(i=0; i < 1000000; i++) {
3422 multiple[i] = PyLong_FromLong(i+1000);
3423 }
3424 for(i=0; i < 1000000; i++) {
3425 Py_DECREF(multiple[i]);
3426 }
3427 }
3428 gettimeofday(&stop, NULL);
3429 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003430 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003432 /* Test 6: Perform small int addition */
3433 op1 = PyLong_FromLong(1);
3434 gettimeofday(&start, NULL);
3435 for(i=0; i < 10000000; i++) {
3436 result = PyNumber_Add(op1, op1);
3437 Py_DECREF(result);
3438 }
3439 gettimeofday(&stop, NULL);
3440 Py_DECREF(op1);
3441 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 /* Test 7: Perform medium int addition */
3444 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003445 if (op1 == NULL)
3446 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003447 gettimeofday(&start, NULL);
3448 for(i=0; i < 10000000; i++) {
3449 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003450 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003451 }
3452 gettimeofday(&stop, NULL);
3453 Py_DECREF(op1);
3454 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003455
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003456 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003457}
3458#endif
3459
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003460/* To test the format of tracebacks as printed out. */
3461static PyObject *
3462traceback_print(PyObject *self, PyObject *args)
3463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003464 PyObject *file;
3465 PyObject *traceback;
3466 int result;
3467
3468 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3469 &traceback, &file))
3470 return NULL;
3471
3472 result = PyTraceBack_Print(traceback, file);
3473 if (result < 0)
3474 return NULL;
3475 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003476}
3477
Benjamin Petersone6528212008-07-15 15:32:09 +00003478/* To test the format of exceptions as printed out. */
3479static PyObject *
3480exception_print(PyObject *self, PyObject *args)
3481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003482 PyObject *value;
3483 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003485 if (!PyArg_ParseTuple(args, "O:exception_print",
3486 &value))
3487 return NULL;
3488 if (!PyExceptionInstance_Check(value)) {
3489 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3490 return NULL;
3491 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003493 tb = PyException_GetTraceback(value);
3494 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3495 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003497 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003498}
3499
3500
3501
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003502
3503/* reliably raise a MemoryError */
3504static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303505raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003506{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003507 PyErr_NoMemory();
3508 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003509}
3510
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003511/* Issue 6012 */
3512static PyObject *str1, *str2;
3513static int
3514failing_converter(PyObject *obj, void *arg)
3515{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 /* Clone str1, then let the conversion fail. */
3517 assert(str1);
3518 str2 = str1;
3519 Py_INCREF(str2);
3520 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003521}
3522static PyObject*
3523argparsing(PyObject *o, PyObject *args)
3524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003525 PyObject *res;
3526 str1 = str2 = NULL;
3527 if (!PyArg_ParseTuple(args, "O&O&",
3528 PyUnicode_FSConverter, &str1,
3529 failing_converter, &str2)) {
3530 if (!str2)
3531 /* argument converter not called? */
3532 return NULL;
3533 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003534 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003535 Py_DECREF(str2);
3536 PyErr_Clear();
3537 return res;
3538 }
3539 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003540}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003541
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003542/* To test that the result of PyCode_NewEmpty has the right members. */
3543static PyObject *
3544code_newempty(PyObject *self, PyObject *args)
3545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003546 const char *filename;
3547 const char *funcname;
3548 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003550 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3551 &filename, &funcname, &firstlineno))
3552 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003554 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003555}
3556
Georg Brandl1e28a272009-12-28 08:41:01 +00003557/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3558 Run via Lib/test/test_exceptions.py */
3559static PyObject *
3560make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3561{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003562 const char *name;
3563 const char *doc = NULL;
3564 PyObject *base = NULL;
3565 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003567 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003569 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3570 "s|sOO:make_exception_with_doc", kwlist,
3571 &name, &doc, &base, &dict))
3572 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003574 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003575}
3576
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003577static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303578make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003579{
3580 Py_buffer info;
3581 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3582 return NULL;
3583 return PyMemoryView_FromBuffer(&info);
3584}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003585
Stefan Krah7213fcc2015-02-01 16:19:23 +01003586static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003587test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003588{
3589 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3590 int init[5] = {0, 1, 2, 3, 4};
3591 Py_ssize_t itemsize = sizeof(int);
3592 Py_ssize_t shape = 5;
3593 Py_ssize_t strides = 2 * itemsize;
3594 Py_buffer view = {
3595 data,
3596 NULL,
3597 5 * itemsize,
3598 itemsize,
3599 1,
3600 1,
3601 NULL,
3602 &shape,
3603 &strides,
3604 NULL,
3605 NULL
3606 };
3607 int *ptr;
3608 int i;
3609
3610 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3611 ptr = view.buf;
3612 for (i = 0; i < 5; i++) {
3613 if (ptr[2*i] != i) {
3614 PyErr_SetString(TestError,
3615 "test_from_contiguous: incorrect result");
3616 return NULL;
3617 }
3618 }
3619
3620 view.buf = &data[8];
3621 view.strides[0] = -2 * itemsize;
3622
3623 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3624 ptr = view.buf;
3625 for (i = 0; i < 5; i++) {
3626 if (*(ptr-2*i) != i) {
3627 PyErr_SetString(TestError,
3628 "test_from_contiguous: incorrect result");
3629 return NULL;
3630 }
3631 }
3632
3633 Py_RETURN_NONE;
3634}
Stefan Krah650c1e82015-02-03 21:43:23 +01003635
Stefan Kraha7559c02015-02-03 22:27:21 +01003636#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003637extern PyTypeObject _PyBytesIOBuffer_Type;
3638
Stefan Krah5178d912015-02-03 16:57:21 +01003639static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003640test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003641{
Stefan Krah650c1e82015-02-03 21:43:23 +01003642 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003643 PyObject *b;
3644 char *dummy[1];
3645 int ret, match;
3646
Stefan Krah650c1e82015-02-03 21:43:23 +01003647 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003648 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3649 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3650 PyErr_Clear();
3651 if (ret != -1 || match == 0)
3652 goto error;
3653
Stefan Krah650c1e82015-02-03 21:43:23 +01003654 /* bytesiobuf_getbuffer() */
3655 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003656 if (b == NULL) {
3657 return NULL;
3658 }
3659
3660 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3661 Py_DECREF(b);
3662 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3663 PyErr_Clear();
3664 if (ret != -1 || match == 0)
3665 goto error;
3666
3667 Py_RETURN_NONE;
3668
3669error:
3670 PyErr_SetString(TestError,
3671 "test_pep3118_obsolete_write_locks: failure");
3672 return NULL;
3673}
Stefan Kraha7559c02015-02-03 22:27:21 +01003674#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003675
Stefan Krah650c1e82015-02-03 21:43:23 +01003676/* This tests functions that historically supported write locks. It is
3677 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3678 is entitled to segfault in that case. */
3679static PyObject *
3680getbuffer_with_null_view(PyObject* self, PyObject *obj)
3681{
3682 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3683 return NULL;
3684
3685 Py_RETURN_NONE;
3686}
3687
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03003688/* PyBuffer_SizeFromFormat() */
3689static PyObject *
3690test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
3691{
3692 const char *format;
3693 Py_ssize_t result;
3694
3695 if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
3696 &format)) {
3697 return NULL;
3698 }
3699
3700 result = PyBuffer_SizeFromFormat(format);
3701 if (result == -1) {
3702 return NULL;
3703 }
3704
3705 return PyLong_FromSsize_t(result);
3706}
3707
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003708/* Test that the fatal error from not having a current thread doesn't
3709 cause an infinite loop. Run via Lib/test/test_capi.py */
3710static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303711crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003712{
3713 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003714 /* Using PyThreadState_Get() directly allows the test to pass in
3715 !pydebug mode. However, the test only actually tests anything
3716 in pydebug mode, since that's where the infinite loop was in
3717 the first place. */
3718 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003719 Py_END_ALLOW_THREADS
3720 return NULL;
3721}
3722
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003723/* To run some code in a sub-interpreter. */
3724static PyObject *
3725run_in_subinterp(PyObject *self, PyObject *args)
3726{
3727 const char *code;
3728 int r;
3729 PyThreadState *substate, *mainstate;
Guido van Rossum9d197c72020-06-27 17:33:49 -07003730 /* only initialise 'cflags.cf_flags' to test backwards compatibility */
3731 PyCompilerFlags cflags = {0};
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003732
3733 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3734 &code))
3735 return NULL;
3736
3737 mainstate = PyThreadState_Get();
3738
3739 PyThreadState_Swap(NULL);
3740
3741 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003742 if (substate == NULL) {
3743 /* Since no new thread state was created, there is no exception to
3744 propagate; raise a fresh one after swapping in the old thread
3745 state. */
3746 PyThreadState_Swap(mainstate);
3747 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3748 return NULL;
3749 }
Guido van Rossum9d197c72020-06-27 17:33:49 -07003750 r = PyRun_SimpleStringFlags(code, &cflags);
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003751 Py_EndInterpreter(substate);
3752
3753 PyThreadState_Swap(mainstate);
3754
3755 return PyLong_FromLong(r);
3756}
3757
Victor Stinner3c1b3792014-02-17 00:02:43 +01003758static int
3759check_time_rounding(int round)
3760{
Victor Stinner74474232015-09-02 01:43:56 +02003761 if (round != _PyTime_ROUND_FLOOR
3762 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003763 && round != _PyTime_ROUND_HALF_EVEN
3764 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003765 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3766 return -1;
3767 }
3768 return 0;
3769}
3770
Victor Stinner5d272cc2012-03-13 13:35:55 +01003771static PyObject *
3772test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3773{
3774 PyObject *obj;
3775 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003776 int round;
3777 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003778 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003779 if (check_time_rounding(round) < 0)
3780 return NULL;
3781 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003782 return NULL;
3783 return _PyLong_FromTime_t(sec);
3784}
3785
3786static PyObject *
3787test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3788{
3789 PyObject *obj;
3790 time_t sec;
3791 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003792 int round;
3793 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003794 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003795 if (check_time_rounding(round) < 0)
3796 return NULL;
3797 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003798 return NULL;
3799 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3800}
3801
Victor Stinner643cd682012-03-02 22:54:03 +01003802static PyObject *
3803test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3804{
3805 PyObject *obj;
3806 time_t sec;
3807 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003808 int round;
3809 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003810 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003811 if (check_time_rounding(round) < 0)
3812 return NULL;
3813 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003814 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003815 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003816}
3817
Antoine Pitrou796564c2013-07-30 19:59:21 +02003818static void
3819slot_tp_del(PyObject *self)
3820{
3821 _Py_IDENTIFIER(__tp_del__);
3822 PyObject *del, *res;
3823 PyObject *error_type, *error_value, *error_traceback;
3824
3825 /* Temporarily resurrect the object. */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003826 assert(Py_REFCNT(self) == 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003827 Py_SET_REFCNT(self, 1);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003828
3829 /* Save the current exception, if any. */
3830 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3831
3832 /* Execute __del__ method, if any. */
3833 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3834 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003835 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003836 if (res == NULL)
3837 PyErr_WriteUnraisable(del);
3838 else
3839 Py_DECREF(res);
3840 Py_DECREF(del);
3841 }
3842
3843 /* Restore the saved exception. */
3844 PyErr_Restore(error_type, error_value, error_traceback);
3845
3846 /* Undo the temporary resurrection; can't use DECREF here, it would
3847 * cause a recursive call.
3848 */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003849 assert(Py_REFCNT(self) > 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003850 Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
3851 if (Py_REFCNT(self) == 0) {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003852 /* this is the normal path out */
3853 return;
3854 }
Antoine Pitrou796564c2013-07-30 19:59:21 +02003855
3856 /* __del__ resurrected it! Make it look like the original Py_DECREF
3857 * never happened.
3858 */
3859 {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003860 Py_ssize_t refcnt = Py_REFCNT(self);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003861 _Py_NewReference(self);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003862 Py_SET_REFCNT(self, refcnt);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003863 }
Pablo Galindof13072b2020-04-11 01:21:54 +01003864 assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self));
Victor Stinner49932fe2020-02-03 17:55:05 +01003865 /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
3866 _Py_RefTotal, so we need to undo that. */
3867#ifdef Py_REF_DEBUG
3868 _Py_RefTotal--;
3869#endif
Antoine Pitrou796564c2013-07-30 19:59:21 +02003870}
3871
3872static PyObject *
3873with_tp_del(PyObject *self, PyObject *args)
3874{
3875 PyObject *obj;
3876 PyTypeObject *tp;
3877
3878 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3879 return NULL;
3880 tp = (PyTypeObject *) obj;
3881 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3882 PyErr_Format(PyExc_TypeError,
3883 "heap type expected, got %R", obj);
3884 return NULL;
3885 }
3886 tp->tp_del = slot_tp_del;
3887 Py_INCREF(obj);
3888 return obj;
3889}
3890
Brandt Bucherc13b8472020-10-14 18:44:07 -07003891static PyObject *
3892without_gc(PyObject *Py_UNUSED(self), PyObject *obj)
3893{
3894 PyTypeObject *tp = (PyTypeObject*)obj;
3895 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3896 return PyErr_Format(PyExc_TypeError, "heap type expected, got %R", obj);
3897 }
3898 if (PyType_IS_GC(tp)) {
3899 // Don't try this at home, kids:
3900 tp->tp_flags -= Py_TPFLAGS_HAVE_GC;
3901 tp->tp_free = PyObject_Del;
3902 tp->tp_traverse = NULL;
3903 tp->tp_clear = NULL;
3904 }
3905 assert(!PyType_IS_GC(tp));
3906 Py_INCREF(obj);
3907 return obj;
3908}
3909
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003910static PyMethodDef ml;
3911
3912static PyObject *
3913create_cfunction(PyObject *self, PyObject *args)
3914{
3915 return PyCFunction_NewEx(&ml, self, NULL);
3916}
3917
3918static PyMethodDef ml = {
3919 "create_cfunction",
3920 create_cfunction,
3921 METH_NOARGS,
3922 NULL
3923};
3924
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003925static PyObject *
3926_test_incref(PyObject *ob)
3927{
3928 Py_INCREF(ob);
3929 return ob;
3930}
3931
3932static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303933test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003934{
3935 PyObject *obj = PyLong_FromLong(0);
3936 Py_XINCREF(_test_incref(obj));
3937 Py_DECREF(obj);
3938 Py_DECREF(obj);
3939 Py_DECREF(obj);
3940 Py_RETURN_NONE;
3941}
3942
3943static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303944test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003945{
3946 PyObject *obj = PyLong_FromLong(0);
3947 Py_INCREF(_test_incref(obj));
3948 Py_DECREF(obj);
3949 Py_DECREF(obj);
3950 Py_DECREF(obj);
3951 Py_RETURN_NONE;
3952}
3953
3954static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303955test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003956{
3957 Py_XDECREF(PyLong_FromLong(0));
3958 Py_RETURN_NONE;
3959}
3960
3961static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303962test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003963{
3964 Py_DECREF(PyLong_FromLong(0));
3965 Py_RETURN_NONE;
3966}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003967
Victor Stinner0507bf52013-07-07 02:05:46 +02003968static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003969test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3970 PyObject *Py_UNUSED(args))
3971{
3972 PyStructSequence_Desc descr;
3973 PyStructSequence_Field descr_fields[3];
3974
3975 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3976 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3977 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3978
3979 descr.name = "_testcapi.test_descr";
3980 descr.doc = "This is used to test for memory leaks in NewType";
3981 descr.fields = descr_fields;
3982 descr.n_in_sequence = 1;
3983
3984 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3985 assert(structseq_type != NULL);
3986 assert(PyType_Check(structseq_type));
3987 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3988 Py_DECREF(structseq_type);
3989
3990 Py_RETURN_NONE;
3991}
3992
3993static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303994test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003995{
3996 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003997 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003998 Py_DecRef(obj);
3999 Py_DecRef(obj);
4000 Py_RETURN_NONE;
4001}
4002
4003static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304004test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004005{
4006 void *ptr;
4007
Victor Stinnerdb067af2014-05-02 22:31:14 +02004008 ptr = PyMem_RawMalloc(0);
4009 if (ptr == NULL) {
4010 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
4011 return NULL;
4012 }
4013 PyMem_RawFree(ptr);
4014
4015 ptr = PyMem_RawCalloc(0, 0);
4016 if (ptr == NULL) {
4017 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
4018 return NULL;
4019 }
4020 PyMem_RawFree(ptr);
4021
Victor Stinner0507bf52013-07-07 02:05:46 +02004022 ptr = PyMem_Malloc(0);
4023 if (ptr == NULL) {
4024 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
4025 return NULL;
4026 }
4027 PyMem_Free(ptr);
4028
Victor Stinnerdb067af2014-05-02 22:31:14 +02004029 ptr = PyMem_Calloc(0, 0);
4030 if (ptr == NULL) {
4031 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
4032 return NULL;
4033 }
4034 PyMem_Free(ptr);
4035
Victor Stinner0507bf52013-07-07 02:05:46 +02004036 ptr = PyObject_Malloc(0);
4037 if (ptr == NULL) {
4038 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
4039 return NULL;
4040 }
4041 PyObject_Free(ptr);
4042
Victor Stinnerdb067af2014-05-02 22:31:14 +02004043 ptr = PyObject_Calloc(0, 0);
4044 if (ptr == NULL) {
4045 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
4046 return NULL;
4047 }
4048 PyObject_Free(ptr);
4049
Victor Stinner0507bf52013-07-07 02:05:46 +02004050 Py_RETURN_NONE;
4051}
4052
4053typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02004054 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02004055
4056 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004057 size_t calloc_nelem;
4058 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02004059 void *realloc_ptr;
4060 size_t realloc_new_size;
4061 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004062 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004063} alloc_hook_t;
4064
Victor Stinner9ed83c42017-10-31 12:18:10 -07004065static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02004066{
4067 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004068 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004069 hook->malloc_size = size;
4070 return hook->alloc.malloc(hook->alloc.ctx, size);
4071}
4072
Victor Stinner9ed83c42017-10-31 12:18:10 -07004073static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02004074{
4075 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004076 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004077 hook->calloc_nelem = nelem;
4078 hook->calloc_elsize = elsize;
4079 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
4080}
4081
Victor Stinner9ed83c42017-10-31 12:18:10 -07004082static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02004083{
4084 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004085 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004086 hook->realloc_ptr = ptr;
4087 hook->realloc_new_size = new_size;
4088 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
4089}
4090
Victor Stinner9ed83c42017-10-31 12:18:10 -07004091static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02004092{
4093 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004094 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02004095 hook->free_ptr = ptr;
4096 hook->alloc.free(hook->alloc.ctx, ptr);
4097}
4098
4099static PyObject *
4100test_setallocators(PyMemAllocatorDomain domain)
4101{
4102 PyObject *res = NULL;
4103 const char *error_msg;
4104 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02004105 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004106 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02004107 void *ptr, *ptr2;
4108
Victor Stinnerdb067af2014-05-02 22:31:14 +02004109 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02004110
4111 alloc.ctx = &hook;
4112 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004113 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02004114 alloc.realloc = &hook_realloc;
4115 alloc.free = &hook_free;
4116 PyMem_GetAllocator(domain, &hook.alloc);
4117 PyMem_SetAllocator(domain, &alloc);
4118
Victor Stinner9ed83c42017-10-31 12:18:10 -07004119 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02004120 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004121 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02004122 switch(domain)
4123 {
4124 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
4125 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
4126 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
4127 default: ptr = NULL; break;
4128 }
4129
Victor Stinner9ed83c42017-10-31 12:18:10 -07004130#define CHECK_CTX(FUNC) \
4131 if (hook.ctx != &hook) { \
4132 error_msg = FUNC " wrong context"; \
4133 goto fail; \
4134 } \
4135 hook.ctx = NULL; /* reset for next check */
4136
Victor Stinner0507bf52013-07-07 02:05:46 +02004137 if (ptr == NULL) {
4138 error_msg = "malloc failed";
4139 goto fail;
4140 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004141 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02004142 if (hook.malloc_size != size) {
4143 error_msg = "malloc invalid size";
4144 goto fail;
4145 }
4146
4147 size2 = 200;
4148 switch(domain)
4149 {
4150 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
4151 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
4152 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02004153 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02004154 }
4155
4156 if (ptr2 == NULL) {
4157 error_msg = "realloc failed";
4158 goto fail;
4159 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004160 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02004161 if (hook.realloc_ptr != ptr
4162 || hook.realloc_new_size != size2) {
4163 error_msg = "realloc invalid parameters";
4164 goto fail;
4165 }
4166
4167 switch(domain)
4168 {
4169 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
4170 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
4171 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
4172 }
4173
Victor Stinner9ed83c42017-10-31 12:18:10 -07004174 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02004175 if (hook.free_ptr != ptr2) {
4176 error_msg = "free invalid pointer";
4177 goto fail;
4178 }
4179
Victor Stinner9ed83c42017-10-31 12:18:10 -07004180 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02004181 nelem = 2;
4182 elsize = 5;
4183 switch(domain)
4184 {
4185 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
4186 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
4187 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
4188 default: ptr = NULL; break;
4189 }
4190
4191 if (ptr == NULL) {
4192 error_msg = "calloc failed";
4193 goto fail;
4194 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004195 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02004196 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
4197 error_msg = "calloc invalid nelem or elsize";
4198 goto fail;
4199 }
4200
Victor Stinner9ed83c42017-10-31 12:18:10 -07004201 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004202 switch(domain)
4203 {
4204 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
4205 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
4206 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
4207 }
4208
Victor Stinner9ed83c42017-10-31 12:18:10 -07004209 CHECK_CTX("calloc free");
4210 if (hook.free_ptr != ptr) {
4211 error_msg = "calloc free invalid pointer";
4212 goto fail;
4213 }
4214
Victor Stinner0507bf52013-07-07 02:05:46 +02004215 Py_INCREF(Py_None);
4216 res = Py_None;
4217 goto finally;
4218
4219fail:
4220 PyErr_SetString(PyExc_RuntimeError, error_msg);
4221
4222finally:
4223 PyMem_SetAllocator(domain, &hook.alloc);
4224 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004225
4226#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02004227}
4228
4229static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304230test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004231{
4232 return test_setallocators(PYMEM_DOMAIN_RAW);
4233}
4234
4235static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304236test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004237{
4238 return test_setallocators(PYMEM_DOMAIN_MEM);
4239}
4240
4241static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304242test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004243{
4244 return test_setallocators(PYMEM_DOMAIN_OBJ);
4245}
4246
xdegaye85f64302017-07-01 14:14:45 +02004247/* Most part of the following code is inherited from the pyfailmalloc project
4248 * written by Victor Stinner. */
4249static struct {
4250 int installed;
4251 PyMemAllocatorEx raw;
4252 PyMemAllocatorEx mem;
4253 PyMemAllocatorEx obj;
4254} FmHook;
4255
4256static struct {
4257 int start;
4258 int stop;
4259 Py_ssize_t count;
4260} FmData;
4261
4262static int
4263fm_nomemory(void)
4264{
4265 FmData.count++;
4266 if (FmData.count > FmData.start &&
4267 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
4268 return 1;
4269 }
4270 return 0;
4271}
4272
4273static void *
4274hook_fmalloc(void *ctx, size_t size)
4275{
4276 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4277 if (fm_nomemory()) {
4278 return NULL;
4279 }
4280 return alloc->malloc(alloc->ctx, size);
4281}
4282
4283static void *
4284hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
4285{
4286 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4287 if (fm_nomemory()) {
4288 return NULL;
4289 }
4290 return alloc->calloc(alloc->ctx, nelem, elsize);
4291}
4292
4293static void *
4294hook_frealloc(void *ctx, void *ptr, size_t new_size)
4295{
4296 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4297 if (fm_nomemory()) {
4298 return NULL;
4299 }
4300 return alloc->realloc(alloc->ctx, ptr, new_size);
4301}
4302
4303static void
4304hook_ffree(void *ctx, void *ptr)
4305{
4306 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4307 alloc->free(alloc->ctx, ptr);
4308}
4309
4310static void
4311fm_setup_hooks(void)
4312{
4313 PyMemAllocatorEx alloc;
4314
4315 if (FmHook.installed) {
4316 return;
4317 }
4318 FmHook.installed = 1;
4319
4320 alloc.malloc = hook_fmalloc;
4321 alloc.calloc = hook_fcalloc;
4322 alloc.realloc = hook_frealloc;
4323 alloc.free = hook_ffree;
4324 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4325 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4326 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4327
4328 alloc.ctx = &FmHook.raw;
4329 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
4330
4331 alloc.ctx = &FmHook.mem;
4332 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
4333
4334 alloc.ctx = &FmHook.obj;
4335 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
4336}
4337
4338static void
4339fm_remove_hooks(void)
4340{
4341 if (FmHook.installed) {
4342 FmHook.installed = 0;
4343 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4344 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4345 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4346 }
4347}
4348
4349static PyObject*
4350set_nomemory(PyObject *self, PyObject *args)
4351{
4352 /* Memory allocation fails after 'start' allocation requests, and until
4353 * 'stop' allocation requests except when 'stop' is negative or equal
4354 * to 0 (default) in which case allocation failures never stop. */
4355 FmData.count = 0;
4356 FmData.stop = 0;
4357 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
4358 return NULL;
4359 }
4360 fm_setup_hooks();
4361 Py_RETURN_NONE;
4362}
4363
4364static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304365remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02004366{
4367 fm_remove_hooks();
4368 Py_RETURN_NONE;
4369}
4370
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004371PyDoc_STRVAR(docstring_empty,
4372""
4373);
4374
4375PyDoc_STRVAR(docstring_no_signature,
4376"This docstring has no signature."
4377);
4378
4379PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004380"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004381"\n"
4382"This docstring has an invalid signature."
4383);
4384
Larry Hastings2623c8c2014-02-08 22:15:29 -08004385PyDoc_STRVAR(docstring_with_invalid_signature2,
4386"docstring_with_invalid_signature2($module, /, boo)\n"
4387"\n"
4388"--\n"
4389"\n"
4390"This docstring also has an invalid signature."
4391);
4392
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004393PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004394"docstring_with_signature($module, /, sig)\n"
4395"--\n"
4396"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004397"This docstring has a valid signature."
4398);
4399
Zachary Ware8ef887c2015-04-13 18:22:35 -05004400PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4401"docstring_with_signature_but_no_doc($module, /, sig)\n"
4402"--\n"
4403"\n"
4404);
4405
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004406PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004407"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4408"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004409"\n"
4410"\n"
4411"This docstring has a valid signature and some extra newlines."
4412);
4413
Larry Hastings16c51912014-01-07 11:53:01 -08004414PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004415"docstring_with_signature_with_defaults(module, s='avocado',\n"
4416" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4417" local=the_number_three, sys=sys.maxsize,\n"
4418" exp=sys.maxsize - 1)\n"
4419"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004420"\n"
4421"\n"
4422"\n"
4423"This docstring has a valid signature with parameters,\n"
4424"and the parameters take defaults of varying types."
4425);
4426
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004427typedef struct {
4428 PyThread_type_lock start_event;
4429 PyThread_type_lock exit_event;
4430 PyObject *callback;
4431} test_c_thread_t;
4432
4433static void
4434temporary_c_thread(void *data)
4435{
4436 test_c_thread_t *test_c_thread = data;
4437 PyGILState_STATE state;
4438 PyObject *res;
4439
4440 PyThread_release_lock(test_c_thread->start_event);
4441
4442 /* Allocate a Python thread state for this thread */
4443 state = PyGILState_Ensure();
4444
Victor Stinner3466bde2016-09-05 18:16:01 -07004445 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004446 Py_CLEAR(test_c_thread->callback);
4447
4448 if (res == NULL) {
4449 PyErr_Print();
4450 }
4451 else {
4452 Py_DECREF(res);
4453 }
4454
4455 /* Destroy the Python thread state for this thread */
4456 PyGILState_Release(state);
4457
4458 PyThread_release_lock(test_c_thread->exit_event);
4459
4460 PyThread_exit_thread();
4461}
4462
4463static PyObject *
4464call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4465{
4466 PyObject *res = NULL;
4467 test_c_thread_t test_c_thread;
4468 long thread;
4469
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004470 test_c_thread.start_event = PyThread_allocate_lock();
4471 test_c_thread.exit_event = PyThread_allocate_lock();
4472 test_c_thread.callback = NULL;
4473 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4474 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4475 goto exit;
4476 }
4477
4478 Py_INCREF(callback);
4479 test_c_thread.callback = callback;
4480
4481 PyThread_acquire_lock(test_c_thread.start_event, 1);
4482 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4483
4484 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4485 if (thread == -1) {
4486 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4487 PyThread_release_lock(test_c_thread.start_event);
4488 PyThread_release_lock(test_c_thread.exit_event);
4489 goto exit;
4490 }
4491
4492 PyThread_acquire_lock(test_c_thread.start_event, 1);
4493 PyThread_release_lock(test_c_thread.start_event);
4494
4495 Py_BEGIN_ALLOW_THREADS
4496 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4497 PyThread_release_lock(test_c_thread.exit_event);
4498 Py_END_ALLOW_THREADS
4499
4500 Py_INCREF(Py_None);
4501 res = Py_None;
4502
4503exit:
4504 Py_CLEAR(test_c_thread.callback);
4505 if (test_c_thread.start_event)
4506 PyThread_free_lock(test_c_thread.start_event);
4507 if (test_c_thread.exit_event)
4508 PyThread_free_lock(test_c_thread.exit_event);
4509 return res;
4510}
Victor Stinner13105102013-12-13 02:17:29 +01004511
Serhiy Storchakab5181342015-02-06 08:58:56 +02004512/* marshal */
4513
4514static PyObject*
4515pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4516{
4517 long value;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004518 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004519 int version;
4520 FILE *fp;
4521
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004522 if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004523 &value, &filename, &version))
4524 return NULL;
4525
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004526 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004527 if (fp == NULL) {
4528 PyErr_SetFromErrno(PyExc_OSError);
4529 return NULL;
4530 }
4531
4532 PyMarshal_WriteLongToFile(value, fp, version);
4533
4534 fclose(fp);
4535 if (PyErr_Occurred())
4536 return NULL;
4537 Py_RETURN_NONE;
4538}
4539
4540static PyObject*
4541pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4542{
4543 PyObject *obj;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004544 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004545 int version;
4546 FILE *fp;
4547
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004548 if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004549 &obj, &filename, &version))
4550 return NULL;
4551
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004552 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004553 if (fp == NULL) {
4554 PyErr_SetFromErrno(PyExc_OSError);
4555 return NULL;
4556 }
4557
4558 PyMarshal_WriteObjectToFile(obj, fp, version);
4559
4560 fclose(fp);
4561 if (PyErr_Occurred())
4562 return NULL;
4563 Py_RETURN_NONE;
4564}
4565
4566static PyObject*
4567pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4568{
4569 int value;
4570 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004571 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004572 FILE *fp;
4573
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004574 if (!PyArg_ParseTuple(args, "O:pymarshal_read_short_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004575 return NULL;
4576
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004577 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004578 if (fp == NULL) {
4579 PyErr_SetFromErrno(PyExc_OSError);
4580 return NULL;
4581 }
4582
4583 value = PyMarshal_ReadShortFromFile(fp);
4584 pos = ftell(fp);
4585
4586 fclose(fp);
4587 if (PyErr_Occurred())
4588 return NULL;
4589 return Py_BuildValue("il", value, pos);
4590}
4591
4592static PyObject*
4593pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4594{
4595 long value, pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004596 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004597 FILE *fp;
4598
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004599 if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004600 return NULL;
4601
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004602 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004603 if (fp == NULL) {
4604 PyErr_SetFromErrno(PyExc_OSError);
4605 return NULL;
4606 }
4607
4608 value = PyMarshal_ReadLongFromFile(fp);
4609 pos = ftell(fp);
4610
4611 fclose(fp);
4612 if (PyErr_Occurred())
4613 return NULL;
4614 return Py_BuildValue("ll", value, pos);
4615}
4616
4617static PyObject*
4618pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4619{
4620 PyObject *obj;
4621 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004622 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004623 FILE *fp;
4624
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004625 if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004626 return NULL;
4627
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004628 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004629 if (fp == NULL) {
4630 PyErr_SetFromErrno(PyExc_OSError);
4631 return NULL;
4632 }
4633
4634 obj = PyMarshal_ReadLastObjectFromFile(fp);
4635 pos = ftell(fp);
4636
4637 fclose(fp);
4638 return Py_BuildValue("Nl", obj, pos);
4639}
4640
4641static PyObject*
4642pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4643{
4644 PyObject *obj;
4645 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004646 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004647 FILE *fp;
4648
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004649 if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004650 return NULL;
4651
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004652 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004653 if (fp == NULL) {
4654 PyErr_SetFromErrno(PyExc_OSError);
4655 return NULL;
4656 }
4657
4658 obj = PyMarshal_ReadObjectFromFile(fp);
4659 pos = ftell(fp);
4660
4661 fclose(fp);
4662 return Py_BuildValue("Nl", obj, pos);
4663}
4664
Victor Stinnerefde1462015-03-21 15:04:43 +01004665static PyObject*
4666return_null_without_error(PyObject *self, PyObject *args)
4667{
4668 /* invalid call: return NULL without setting an error,
4669 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4670 PyErr_Clear();
4671 return NULL;
4672}
4673
4674static PyObject*
4675return_result_with_error(PyObject *self, PyObject *args)
4676{
4677 /* invalid call: return a result with an error set,
4678 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4679 PyErr_SetNone(PyExc_ValueError);
4680 Py_RETURN_NONE;
4681}
4682
Victor Stinner992c43f2015-03-27 17:12:45 +01004683static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004684test_pytime_fromseconds(PyObject *self, PyObject *args)
4685{
4686 int seconds;
4687 _PyTime_t ts;
4688
4689 if (!PyArg_ParseTuple(args, "i", &seconds))
4690 return NULL;
4691 ts = _PyTime_FromSeconds(seconds);
4692 return _PyTime_AsNanosecondsObject(ts);
4693}
4694
4695static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004696test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4697{
4698 PyObject *obj;
4699 int round;
4700 _PyTime_t ts;
4701
4702 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4703 return NULL;
4704 if (check_time_rounding(round) < 0)
4705 return NULL;
4706 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4707 return NULL;
4708 return _PyTime_AsNanosecondsObject(ts);
4709}
4710
Victor Stinner4bfb4602015-03-27 22:27:24 +01004711static PyObject *
4712test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4713{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004714 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004715 _PyTime_t ts;
4716 double d;
4717
Victor Stinnerc29b5852017-11-02 07:28:27 -07004718 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004719 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004720 }
4721 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4722 return NULL;
4723 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004724 d = _PyTime_AsSecondsDouble(ts);
4725 return PyFloat_FromDouble(d);
4726}
4727
Victor Stinner95e9cef2015-03-28 01:26:47 +01004728static PyObject *
4729test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4730{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004731 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004732 int round;
4733 _PyTime_t t;
4734 struct timeval tv;
4735 PyObject *seconds;
4736
Victor Stinnerc29b5852017-11-02 07:28:27 -07004737 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004738 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004739 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004740 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004741 }
4742 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004743 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004744 }
4745 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4746 return NULL;
4747 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004748
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004749 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004750 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004751 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004752 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004753 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4754}
4755
Victor Stinner34dc0f42015-03-27 18:19:03 +01004756#ifdef HAVE_CLOCK_GETTIME
4757static PyObject *
4758test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4759{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004760 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004761 _PyTime_t t;
4762 struct timespec ts;
4763
Victor Stinnerc29b5852017-11-02 07:28:27 -07004764 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004765 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004766 }
4767 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004768 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004769 }
4770 if (_PyTime_AsTimespec(t, &ts) == -1) {
4771 return NULL;
4772 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004773 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4774}
4775#endif
4776
Victor Stinner62d1c702015-04-01 17:47:07 +02004777static PyObject *
4778test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4779{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004780 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004781 int round;
4782 _PyTime_t t, ms;
4783
Victor Stinnerc29b5852017-11-02 07:28:27 -07004784 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004785 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004786 }
4787 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004788 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004789 }
4790 if (check_time_rounding(round) < 0) {
4791 return NULL;
4792 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004793 ms = _PyTime_AsMilliseconds(t, round);
4794 /* This conversion rely on the fact that _PyTime_t is a number of
4795 nanoseconds */
4796 return _PyTime_AsNanosecondsObject(ms);
4797}
4798
4799static PyObject *
4800test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4801{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004802 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004803 int round;
4804 _PyTime_t t, ms;
4805
Victor Stinnerc29b5852017-11-02 07:28:27 -07004806 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004807 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004808 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004809 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004810 }
4811 if (check_time_rounding(round) < 0) {
4812 return NULL;
4813 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004814 ms = _PyTime_AsMicroseconds(t, round);
4815 /* This conversion rely on the fact that _PyTime_t is a number of
4816 nanoseconds */
4817 return _PyTime_AsNanosecondsObject(ms);
4818}
4819
Victor Stinner50856d52015-10-13 00:11:21 +02004820static PyObject*
Victor Stinner34be807c2016-03-14 12:04:26 +01004821pymem_buffer_overflow(PyObject *self, PyObject *args)
4822{
4823 char *buffer;
4824
4825 /* Deliberate buffer overflow to check that PyMem_Free() detects
4826 the overflow when debug hooks are installed. */
4827 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004828 if (buffer == NULL) {
4829 PyErr_NoMemory();
4830 return NULL;
4831 }
Victor Stinner34be807c2016-03-14 12:04:26 +01004832 buffer[16] = 'x';
4833 PyMem_Free(buffer);
4834
4835 Py_RETURN_NONE;
4836}
4837
4838static PyObject*
4839pymem_api_misuse(PyObject *self, PyObject *args)
4840{
4841 char *buffer;
4842
4843 /* Deliberate misusage of Python allocators:
4844 allococate with PyMem but release with PyMem_Raw. */
4845 buffer = PyMem_Malloc(16);
4846 PyMem_RawFree(buffer);
4847
4848 Py_RETURN_NONE;
4849}
4850
Victor Stinnerc4aec362016-03-14 22:26:53 +01004851static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004852pymem_malloc_without_gil(PyObject *self, PyObject *args)
4853{
4854 char *buffer;
4855
4856 /* Deliberate bug to test debug hooks on Python memory allocators:
4857 call PyMem_Malloc() without holding the GIL */
4858 Py_BEGIN_ALLOW_THREADS
4859 buffer = PyMem_Malloc(10);
4860 Py_END_ALLOW_THREADS
4861
4862 PyMem_Free(buffer);
4863
4864 Py_RETURN_NONE;
4865}
4866
Victor Stinner5d39e042017-11-29 17:20:38 +01004867
4868static PyObject*
4869test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4870{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004871 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004872 if (name == NULL) {
4873 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4874 return NULL;
4875 }
4876 return PyUnicode_FromString(name);
4877}
4878
4879
Victor Stinnerad524372016-03-16 12:12:53 +01004880static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004881test_pyobject_is_freed(const char *test_name, PyObject *op)
Victor Stinner2b00db62019-04-11 11:33:27 +02004882{
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004883 if (!_PyObject_IsFreed(op)) {
4884 return raiseTestError(test_name, "object is not seen as freed");
4885 }
4886 Py_RETURN_NONE;
Victor Stinner2b00db62019-04-11 11:33:27 +02004887}
4888
4889
4890static PyObject*
Victor Stinner68762572019-10-07 18:42:01 +02004891check_pyobject_null_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
4892{
4893 PyObject *op = NULL;
4894 return test_pyobject_is_freed("check_pyobject_null_is_freed", op);
4895}
4896
4897
4898static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004899check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004900{
4901 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4902 if (op == NULL) {
4903 return NULL;
4904 }
4905 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004906 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004907 /* object fields like ob_type are uninitialized! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004908 return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004909}
4910
4911
4912static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004913check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004914{
4915 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4916 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4917 if (op == NULL) {
4918 return NULL;
4919 }
4920 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004921 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004922 /* ob_type field is after the memory block: part of "forbidden bytes"
Min ho Kim39d87b52019-08-31 06:21:19 +10004923 when using debug hooks on memory allocators! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004924 return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004925}
4926
4927
4928static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004929check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004930{
4931 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4932 if (op == NULL) {
4933 return NULL;
4934 }
4935 Py_TYPE(op)->tp_dealloc(op);
4936 /* Reset reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004937 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004938 /* object memory is freed! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004939 return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004940}
4941
4942
4943static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004944pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4945{
4946 char *buffer;
4947
Victor Stinnerad524372016-03-16 12:12:53 +01004948 /* Deliberate bug to test debug hooks on Python memory allocators:
4949 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004950 Py_BEGIN_ALLOW_THREADS
4951 buffer = PyObject_Malloc(10);
4952 Py_END_ALLOW_THREADS
4953
4954 PyObject_Free(buffer);
4955
4956 Py_RETURN_NONE;
4957}
4958
Victor Stinner10b73e12016-03-22 13:39:05 +01004959static PyObject *
4960tracemalloc_track(PyObject *self, PyObject *args)
4961{
4962 unsigned int domain;
4963 PyObject *ptr_obj;
4964 void *ptr;
4965 Py_ssize_t size;
4966 int release_gil = 0;
4967 int res;
4968
4969 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4970 return NULL;
4971 ptr = PyLong_AsVoidPtr(ptr_obj);
4972 if (PyErr_Occurred())
4973 return NULL;
4974
4975 if (release_gil) {
4976 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004977 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004978 Py_END_ALLOW_THREADS
4979 }
4980 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004981 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004982 }
4983
4984 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004985 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004986 return NULL;
4987 }
4988
4989 Py_RETURN_NONE;
4990}
4991
4992static PyObject *
4993tracemalloc_untrack(PyObject *self, PyObject *args)
4994{
4995 unsigned int domain;
4996 PyObject *ptr_obj;
4997 void *ptr;
4998 int res;
4999
5000 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
5001 return NULL;
5002 ptr = PyLong_AsVoidPtr(ptr_obj);
5003 if (PyErr_Occurred())
5004 return NULL;
5005
Victor Stinner5ea4c062017-06-20 17:46:36 +02005006 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01005007 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02005008 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01005009 return NULL;
5010 }
5011
5012 Py_RETURN_NONE;
5013}
5014
5015static PyObject *
5016tracemalloc_get_traceback(PyObject *self, PyObject *args)
5017{
5018 unsigned int domain;
5019 PyObject *ptr_obj;
5020 void *ptr;
5021
5022 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
5023 return NULL;
5024 ptr = PyLong_AsVoidPtr(ptr_obj);
5025 if (PyErr_Occurred())
5026 return NULL;
5027
Benjamin Petersonca470632016-09-06 13:47:26 -07005028 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01005029}
5030
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005031static PyObject *
5032dict_get_version(PyObject *self, PyObject *args)
5033{
5034 PyDictObject *dict;
5035 uint64_t version;
5036
5037 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
5038 return NULL;
5039
5040 version = dict->ma_version_tag;
5041
Sergey Fedoseeva9ed91e2019-10-21 11:49:48 +05005042 Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(version));
5043 return PyLong_FromUnsignedLongLong((unsigned long long)version);
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005044}
5045
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005046
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005047static PyObject *
5048raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
5049{
Vladimir Matveev037245c2020-10-09 17:15:15 -07005050 _Py_IDENTIFIER(send);
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005051 PyGenObject *gen;
5052
5053 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
5054 return NULL;
5055
5056 /* This is used in a test to check what happens if a signal arrives just
5057 as we're in the process of entering a yield from chain (see
5058 bpo-30039).
5059
5060 Needs to be done in C, because:
5061 - we don't have a Python wrapper for raise()
5062 - we need to make sure that the Python-level signal handler doesn't run
5063 *before* we enter the generator frame, which is impossible in Python
5064 because we check for signals before every bytecode operation.
5065 */
5066 raise(SIGINT);
Vladimir Matveev037245c2020-10-09 17:15:15 -07005067 return _PyObject_CallMethodIdOneArg((PyObject *)gen, &PyId_send, Py_None);
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005068}
5069
5070
Victor Stinner3b5cf852017-06-09 16:48:45 +02005071static int
5072fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
5073{
5074 if (args == Py_None) {
5075 *stack = NULL;
5076 *nargs = 0;
5077 }
5078 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01005079 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02005080 *nargs = PyTuple_GET_SIZE(args);
5081 }
5082 else {
5083 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
5084 return -1;
5085 }
5086 return 0;
5087}
5088
5089
5090static PyObject *
5091test_pyobject_fastcall(PyObject *self, PyObject *args)
5092{
5093 PyObject *func, *func_args;
5094 PyObject **stack;
5095 Py_ssize_t nargs;
5096
5097 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
5098 return NULL;
5099 }
5100
5101 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5102 return NULL;
5103 }
5104 return _PyObject_FastCall(func, stack, nargs);
5105}
5106
5107
5108static PyObject *
5109test_pyobject_fastcalldict(PyObject *self, PyObject *args)
5110{
5111 PyObject *func, *func_args, *kwargs;
5112 PyObject **stack;
5113 Py_ssize_t nargs;
5114
5115 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
5116 return NULL;
5117 }
5118
5119 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5120 return NULL;
5121 }
5122
5123 if (kwargs == Py_None) {
5124 kwargs = NULL;
5125 }
5126 else if (!PyDict_Check(kwargs)) {
5127 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
5128 return NULL;
5129 }
5130
Petr Viktorinffd97532020-02-11 17:46:57 +01005131 return PyObject_VectorcallDict(func, stack, nargs, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005132}
5133
5134
5135static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005136test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02005137{
5138 PyObject *func, *func_args, *kwnames = NULL;
5139 PyObject **stack;
5140 Py_ssize_t nargs, nkw;
5141
5142 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
5143 return NULL;
5144 }
5145
5146 if (fastcall_args(func_args, &stack, &nargs) < 0) {
5147 return NULL;
5148 }
5149
5150 if (kwnames == Py_None) {
5151 kwnames = NULL;
5152 }
5153 else if (PyTuple_Check(kwnames)) {
5154 nkw = PyTuple_GET_SIZE(kwnames);
5155 if (nargs < nkw) {
5156 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
5157 return NULL;
5158 }
5159 nargs -= nkw;
5160 }
5161 else {
5162 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
5163 return NULL;
5164 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005165 return PyObject_Vectorcall(func, stack, nargs, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005166}
5167
5168
5169static PyObject *
5170test_pyvectorcall_call(PyObject *self, PyObject *args)
5171{
5172 PyObject *func;
5173 PyObject *argstuple;
5174 PyObject *kwargs = NULL;
5175
5176 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
5177 return NULL;
5178 }
5179
5180 if (!PyTuple_Check(argstuple)) {
5181 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
5182 return NULL;
5183 }
5184 if (kwargs != NULL && !PyDict_Check(kwargs)) {
5185 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
5186 return NULL;
5187 }
5188
5189 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005190}
5191
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005192
Victor Stinner64fa4492017-07-10 14:37:49 +02005193static PyObject*
5194stack_pointer(PyObject *self, PyObject *args)
5195{
5196 int v = 5;
5197 return PyLong_FromVoidPtr(&v);
5198}
5199
Victor Stinner3b5cf852017-06-09 16:48:45 +02005200
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005201#ifdef W_STOPCODE
5202static PyObject*
5203py_w_stopcode(PyObject *self, PyObject *args)
5204{
5205 int sig, status;
5206 if (!PyArg_ParseTuple(args, "i", &sig)) {
5207 return NULL;
5208 }
5209 status = W_STOPCODE(sig);
5210 return PyLong_FromLong(status);
5211}
5212#endif
5213
5214
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005215static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03005216get_mapping_keys(PyObject* self, PyObject *obj)
5217{
5218 return PyMapping_Keys(obj);
5219}
5220
5221static PyObject *
5222get_mapping_values(PyObject* self, PyObject *obj)
5223{
5224 return PyMapping_Values(obj);
5225}
5226
5227static PyObject *
5228get_mapping_items(PyObject* self, PyObject *obj)
5229{
5230 return PyMapping_Items(obj);
5231}
5232
5233
5234static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005235test_pythread_tss_key_state(PyObject *self, PyObject *args)
5236{
5237 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
5238 if (PyThread_tss_is_created(&tss_key)) {
5239 return raiseTestError("test_pythread_tss_key_state",
5240 "TSS key not in an uninitialized state at "
5241 "creation time");
5242 }
5243 if (PyThread_tss_create(&tss_key) != 0) {
5244 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
5245 return NULL;
5246 }
5247 if (!PyThread_tss_is_created(&tss_key)) {
5248 return raiseTestError("test_pythread_tss_key_state",
5249 "PyThread_tss_create succeeded, "
5250 "but with TSS key in an uninitialized state");
5251 }
5252 if (PyThread_tss_create(&tss_key) != 0) {
5253 return raiseTestError("test_pythread_tss_key_state",
5254 "PyThread_tss_create unsuccessful with "
5255 "an already initialized key");
5256 }
5257#define CHECK_TSS_API(expr) \
5258 (void)(expr); \
5259 if (!PyThread_tss_is_created(&tss_key)) { \
5260 return raiseTestError("test_pythread_tss_key_state", \
5261 "TSS key initialization state was not " \
5262 "preserved after calling " #expr); }
5263 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
5264 CHECK_TSS_API(PyThread_tss_get(&tss_key));
5265#undef CHECK_TSS_API
5266 PyThread_tss_delete(&tss_key);
5267 if (PyThread_tss_is_created(&tss_key)) {
5268 return raiseTestError("test_pythread_tss_key_state",
5269 "PyThread_tss_delete called, but did not "
5270 "set the key state to uninitialized");
5271 }
5272
5273 Py_tss_t *ptr_key = PyThread_tss_alloc();
5274 if (ptr_key == NULL) {
5275 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
5276 return NULL;
5277 }
5278 if (PyThread_tss_is_created(ptr_key)) {
5279 return raiseTestError("test_pythread_tss_key_state",
5280 "TSS key not in an uninitialized state at "
5281 "allocation time");
5282 }
5283 PyThread_tss_free(ptr_key);
5284 ptr_key = NULL;
5285 Py_RETURN_NONE;
5286}
5287
5288
Yury Selivanovf23746a2018-01-22 19:11:18 -05005289static PyObject*
5290new_hamt(PyObject *self, PyObject *args)
5291{
5292 return _PyContext_NewHamtForTests();
5293}
5294
5295
jdemeyer5a306202018-10-19 23:50:06 +02005296/* def bad_get(self, obj, cls):
5297 cls()
5298 return repr(self)
5299*/
5300static PyObject*
5301bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5302{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005303 PyObject *self, *obj, *cls;
5304 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02005305 return NULL;
5306 }
5307
Jeroen Demeyer7f41c8e2019-07-04 12:35:31 +02005308 PyObject *res = _PyObject_CallNoArg(cls);
jdemeyer5a306202018-10-19 23:50:06 +02005309 if (res == NULL) {
5310 return NULL;
5311 }
5312 Py_DECREF(res);
5313
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005314 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02005315}
5316
5317
Victor Stinner3d4226a2018-08-29 22:21:32 +02005318static PyObject *
5319encode_locale_ex(PyObject *self, PyObject *args)
5320{
5321 PyObject *unicode;
5322 int current_locale = 0;
5323 wchar_t *wstr;
5324 PyObject *res = NULL;
5325 const char *errors = NULL;
5326
5327 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
5328 return NULL;
5329 }
5330 wstr = PyUnicode_AsWideCharString(unicode, NULL);
5331 if (wstr == NULL) {
5332 return NULL;
5333 }
5334 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5335
5336 char *str = NULL;
5337 size_t error_pos;
5338 const char *reason = NULL;
5339 int ret = _Py_EncodeLocaleEx(wstr,
5340 &str, &error_pos, &reason,
5341 current_locale, error_handler);
5342 PyMem_Free(wstr);
5343
5344 switch(ret) {
5345 case 0:
5346 res = PyBytes_FromString(str);
5347 PyMem_RawFree(str);
5348 break;
5349 case -1:
5350 PyErr_NoMemory();
5351 break;
5352 case -2:
5353 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
5354 error_pos, reason);
5355 break;
5356 case -3:
5357 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5358 break;
5359 default:
5360 PyErr_SetString(PyExc_ValueError, "unknow error code");
5361 break;
5362 }
5363 return res;
5364}
5365
5366
5367static PyObject *
5368decode_locale_ex(PyObject *self, PyObject *args)
5369{
5370 char *str;
5371 int current_locale = 0;
5372 PyObject *res = NULL;
5373 const char *errors = NULL;
5374
5375 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
5376 return NULL;
5377 }
5378 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5379
5380 wchar_t *wstr = NULL;
5381 size_t wlen = 0;
5382 const char *reason = NULL;
5383 int ret = _Py_DecodeLocaleEx(str,
5384 &wstr, &wlen, &reason,
5385 current_locale, error_handler);
5386
5387 switch(ret) {
5388 case 0:
5389 res = PyUnicode_FromWideChar(wstr, wlen);
5390 PyMem_RawFree(wstr);
5391 break;
5392 case -1:
5393 PyErr_NoMemory();
5394 break;
5395 case -2:
5396 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
5397 wlen, reason);
5398 break;
5399 case -3:
5400 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5401 break;
5402 default:
5403 PyErr_SetString(PyExc_ValueError, "unknow error code");
5404 break;
5405 }
5406 return res;
5407}
5408
5409
Victor Stinner18618e652018-10-25 17:28:11 +02005410#ifdef Py_REF_DEBUG
5411static PyObject *
5412negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5413{
5414 PyObject *obj = PyUnicode_FromString("negative_refcount");
5415 if (obj == NULL) {
5416 return NULL;
5417 }
5418 assert(Py_REFCNT(obj) == 1);
5419
Victor Stinnerc86a1122020-02-07 01:24:29 +01005420 Py_SET_REFCNT(obj, 0);
Victor Stinner18618e652018-10-25 17:28:11 +02005421 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5422 Py_DECREF(obj);
5423
5424 Py_RETURN_NONE;
5425}
5426#endif
5427
5428
Victor Stinneref9d9b62019-05-22 11:28:22 +02005429static PyObject*
5430test_write_unraisable_exc(PyObject *self, PyObject *args)
5431{
Victor Stinner71c52e32019-05-27 08:57:14 +02005432 PyObject *exc, *err_msg, *obj;
5433 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005434 return NULL;
5435 }
5436
Victor Stinner71c52e32019-05-27 08:57:14 +02005437 const char *err_msg_utf8;
5438 if (err_msg != Py_None) {
5439 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5440 if (err_msg_utf8 == NULL) {
5441 return NULL;
5442 }
5443 }
5444 else {
5445 err_msg_utf8 = NULL;
5446 }
5447
Victor Stinneref9d9b62019-05-22 11:28:22 +02005448 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005449 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005450 Py_RETURN_NONE;
5451}
5452
5453
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005454static PyObject *
5455sequence_getitem(PyObject *self, PyObject *args)
5456{
5457 PyObject *seq;
5458 Py_ssize_t i;
5459 if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
5460 return NULL;
5461 }
5462 return PySequence_GetItem(seq, i);
5463}
5464
5465
Petr Viktorinf9583772019-09-10 12:21:09 +01005466/* Functions for testing C calling conventions (METH_*) are named meth_*,
5467 * e.g. "meth_varargs" for METH_VARARGS.
5468 *
5469 * They all return a tuple of their C-level arguments, with None instead
5470 * of NULL and Python tuples instead of C arrays.
5471 */
5472
5473
5474static PyObject*
5475_null_to_none(PyObject* obj)
5476{
5477 if (obj == NULL) {
5478 Py_RETURN_NONE;
5479 }
5480 Py_INCREF(obj);
5481 return obj;
5482}
5483
5484static PyObject*
5485meth_varargs(PyObject* self, PyObject* args)
5486{
5487 return Py_BuildValue("NO", _null_to_none(self), args);
5488}
5489
5490static PyObject*
5491meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs)
5492{
5493 return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs));
5494}
5495
5496static PyObject*
5497meth_o(PyObject* self, PyObject* obj)
5498{
5499 return Py_BuildValue("NO", _null_to_none(self), obj);
5500}
5501
5502static PyObject*
5503meth_noargs(PyObject* self, PyObject* ignored)
5504{
5505 return _null_to_none(self);
5506}
5507
5508static PyObject*
5509_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs)
5510{
5511 PyObject *tuple = PyTuple_New(nargs);
5512 if (tuple == NULL) {
5513 return NULL;
5514 }
5515 for (Py_ssize_t i=0; i < nargs; i++) {
5516 Py_INCREF(args[i]);
5517 PyTuple_SET_ITEM(tuple, i, args[i]);
5518 }
5519 return tuple;
5520}
5521
5522static PyObject*
5523meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
5524{
5525 return Py_BuildValue(
5526 "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs)
5527 );
5528}
5529
5530static PyObject*
5531meth_fastcall_keywords(PyObject* self, PyObject* const* args,
5532 Py_ssize_t nargs, PyObject* kwargs)
5533{
5534 PyObject *pyargs = _fastcall_to_tuple(args, nargs);
5535 if (pyargs == NULL) {
5536 return NULL;
5537 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005538 PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type,
Petr Viktorinf9583772019-09-10 12:21:09 +01005539 args + nargs, 0, kwargs);
5540 return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
5541}
5542
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005543
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005544static PyObject*
5545pynumber_tobase(PyObject *module, PyObject *args)
5546{
5547 PyObject *obj;
5548 int base;
5549 if (!PyArg_ParseTuple(args, "Oi:pynumber_tobase",
5550 &obj, &base)) {
5551 return NULL;
5552 }
5553 return PyNumber_ToBase(obj, base);
5554}
5555
5556
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005557static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
5558
Tim Peters9ea17ac2001-02-02 05:57:15 +00005559static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305561 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005562 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305563 {"test_config", test_config, METH_NOARGS},
5564 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005565 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005566 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5567 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5568 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5569 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5570 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5571 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005572 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005573 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005574 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5575 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5576 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5577 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5578 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5579 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005580 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5581 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03005582 {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
5583 {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
5584 {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
5585 {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
Stefan Krah39042e02020-08-10 16:32:21 +02005586 {"decimal_is_special", decimal_is_special, METH_O},
5587 {"decimal_is_nan", decimal_is_nan, METH_O},
5588 {"decimal_is_infinite", decimal_is_infinite, METH_O},
5589 {"decimal_get_digits", decimal_get_digits, METH_O},
5590 {"decimal_as_triple", decimal_as_triple, METH_O},
5591 {"decimal_from_triple", decimal_from_triple, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305592 {"test_list_api", test_list_api, METH_NOARGS},
5593 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005594 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005595 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305596 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5597 {"test_long_api", test_long_api, METH_NOARGS},
5598 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5599 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5600 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5601 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005602 {"test_structseq_newtype_doesnt_leak",
5603 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305604 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5605 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5606 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5607 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
Zackery Spytzdc247652019-06-06 14:39:23 -06005608 {"test_long_as_unsigned_long_long_mask",
5609 test_long_as_unsigned_long_long_mask, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305610 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5611 {"test_k_code", test_k_code, METH_NOARGS},
5612 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005613 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305614 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005615 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305616 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005617 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305618 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5619 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5620 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005621 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005622 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005623#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005624 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005625#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005626 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03005627 {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005628 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005629 {"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03005630 {"get_args", get_args, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005631 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005632 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005633 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005635 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005636 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005637 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005638 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005639 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005640 {"getargs_b", getargs_b, METH_VARARGS},
5641 {"getargs_B", getargs_B, METH_VARARGS},
5642 {"getargs_h", getargs_h, METH_VARARGS},
5643 {"getargs_H", getargs_H, METH_VARARGS},
5644 {"getargs_I", getargs_I, METH_VARARGS},
5645 {"getargs_k", getargs_k, METH_VARARGS},
5646 {"getargs_i", getargs_i, METH_VARARGS},
5647 {"getargs_l", getargs_l, METH_VARARGS},
5648 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005649 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005650 {"getargs_L", getargs_L, METH_VARARGS},
5651 {"getargs_K", getargs_K, METH_VARARGS},
5652 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305653 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5654 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005655 {"getargs_f", getargs_f, METH_VARARGS},
5656 {"getargs_d", getargs_d, METH_VARARGS},
5657 {"getargs_D", getargs_D, METH_VARARGS},
5658 {"getargs_S", getargs_S, METH_VARARGS},
5659 {"getargs_Y", getargs_Y, METH_VARARGS},
5660 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005661 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005662 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005663 {"getargs_s", getargs_s, METH_VARARGS},
5664 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5665 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
5666 {"getargs_z", getargs_z, METH_VARARGS},
5667 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5668 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5669 {"getargs_y", getargs_y, METH_VARARGS},
5670 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5671 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5672 {"getargs_u", getargs_u, METH_VARARGS},
5673 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5674 {"getargs_Z", getargs_Z, METH_VARARGS},
5675 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005676 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005677 {"getargs_es", getargs_es, METH_VARARGS},
5678 {"getargs_et", getargs_et, METH_VARARGS},
5679 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5680 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005682 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005683 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005684 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305685 {"test_s_code", test_s_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005686#if USE_UNICODE_WCHAR_CACHE
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305687 {"test_u_code", test_u_code, METH_NOARGS},
5688 {"test_Z_code", test_Z_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005689#endif /* USE_UNICODE_WCHAR_CACHE */
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305690 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005691 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5692 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005693 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Hai Shi5623ac82019-07-20 02:56:23 -05005694 {"unicode_asutf8", unicode_asutf8, METH_VARARGS},
5695 {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005696 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005697 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005698#if USE_UNICODE_WCHAR_CACHE
Victor Stinner42bf7752011-11-21 22:52:58 +01005699 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5700 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005701 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005702#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinner1c24bd02010-10-02 11:03:13 +00005703 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005704 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005705#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005706 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005707#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005708 {"traceback_print", traceback_print, METH_VARARGS},
5709 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005710 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005711 {"argparsing", argparsing, METH_VARARGS},
5712 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005713 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305715 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005716 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305717 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005718 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005719 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5720 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005721 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005722 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005723 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305724 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5725 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5726 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5727 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005728 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5729 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305730 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005731 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005732 {"no_docstring",
5733 (PyCFunction)test_with_docstring, METH_NOARGS},
5734 {"docstring_empty",
5735 (PyCFunction)test_with_docstring, METH_NOARGS,
5736 docstring_empty},
5737 {"docstring_no_signature",
5738 (PyCFunction)test_with_docstring, METH_NOARGS,
5739 docstring_no_signature},
5740 {"docstring_with_invalid_signature",
5741 (PyCFunction)test_with_docstring, METH_NOARGS,
5742 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005743 {"docstring_with_invalid_signature2",
5744 (PyCFunction)test_with_docstring, METH_NOARGS,
5745 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005746 {"docstring_with_signature",
5747 (PyCFunction)test_with_docstring, METH_NOARGS,
5748 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005749 {"docstring_with_signature_but_no_doc",
5750 (PyCFunction)test_with_docstring, METH_NOARGS,
5751 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005752 {"docstring_with_signature_and_extra_newlines",
5753 (PyCFunction)test_with_docstring, METH_NOARGS,
5754 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005755 {"docstring_with_signature_with_defaults",
5756 (PyCFunction)test_with_docstring, METH_NOARGS,
5757 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005758 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5759 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005760 {"pymarshal_write_long_to_file",
5761 pymarshal_write_long_to_file, METH_VARARGS},
5762 {"pymarshal_write_object_to_file",
5763 pymarshal_write_object_to_file, METH_VARARGS},
5764 {"pymarshal_read_short_from_file",
5765 pymarshal_read_short_from_file, METH_VARARGS},
5766 {"pymarshal_read_long_from_file",
5767 pymarshal_read_long_from_file, METH_VARARGS},
5768 {"pymarshal_read_last_object_from_file",
5769 pymarshal_read_last_object_from_file, METH_VARARGS},
5770 {"pymarshal_read_object_from_file",
5771 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01005772 {"return_null_without_error",
5773 return_null_without_error, METH_NOARGS},
5774 {"return_result_with_error",
5775 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02005776 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005777 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5778 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005779 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005780#ifdef HAVE_CLOCK_GETTIME
5781 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5782#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005783 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5784 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01005785 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5786 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005787 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005788 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner68762572019-10-07 18:42:01 +02005789 {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02005790 {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
5791 {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
5792 {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005793 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005794 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5795 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5796 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005797 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005798 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005799 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5800 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005801 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5802 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005803 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005804#ifdef W_STOPCODE
5805 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5806#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005807 {"get_mapping_keys", get_mapping_keys, METH_O},
5808 {"get_mapping_values", get_mapping_values, METH_O},
5809 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005810 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005811 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005812 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005813 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5814 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005815#ifdef Py_REF_DEBUG
5816 {"negative_refcount", negative_refcount, METH_NOARGS},
5817#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005818 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005819 {"sequence_getitem", sequence_getitem, METH_VARARGS},
Petr Viktorinf9583772019-09-10 12:21:09 +01005820 {"meth_varargs", meth_varargs, METH_VARARGS},
5821 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
5822 {"meth_o", meth_o, METH_O},
5823 {"meth_noargs", meth_noargs, METH_NOARGS},
5824 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
5825 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005826 {"pynumber_tobase", pynumber_tobase, METH_VARARGS},
Brandt Bucherc13b8472020-10-14 18:44:07 -07005827 {"without_gc", without_gc, METH_O},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005829};
5830
Thomas Hellera4ea6032003-04-17 18:55:45 +00005831#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5832
Thomas Wouters89f507f2006-12-13 04:49:30 +00005833typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 char bool_member;
5835 char byte_member;
5836 unsigned char ubyte_member;
5837 short short_member;
5838 unsigned short ushort_member;
5839 int int_member;
5840 unsigned int uint_member;
5841 long long_member;
5842 unsigned long ulong_member;
5843 Py_ssize_t pyssizet_member;
5844 float float_member;
5845 double double_member;
5846 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005847 long long longlong_member;
5848 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005849} all_structmembers;
5850
5851typedef struct {
5852 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005854} test_structmembers;
5855
5856static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5858 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5859 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5860 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5861 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5862 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5863 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5864 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5865 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5866 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5867 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5868 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5869 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005870 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5871 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005873};
5874
5875
Christian Heimes1af737c2008-01-23 08:24:23 +00005876static PyObject *
5877test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879 static char *keywords[] = {
5880 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5881 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5882 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005884 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005885 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005886 test_structmembers *ob;
5887 const char *s = NULL;
5888 Py_ssize_t string_len = 0;
5889 ob = PyObject_New(test_structmembers, type);
5890 if (ob == NULL)
5891 return NULL;
5892 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5893 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5894 &ob->structmembers.bool_member,
5895 &ob->structmembers.byte_member,
5896 &ob->structmembers.ubyte_member,
5897 &ob->structmembers.short_member,
5898 &ob->structmembers.ushort_member,
5899 &ob->structmembers.int_member,
5900 &ob->structmembers.uint_member,
5901 &ob->structmembers.long_member,
5902 &ob->structmembers.ulong_member,
5903 &ob->structmembers.pyssizet_member,
5904 &ob->structmembers.float_member,
5905 &ob->structmembers.double_member,
5906 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005907 , &ob->structmembers.longlong_member,
5908 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005909 )) {
5910 Py_DECREF(ob);
5911 return NULL;
5912 }
5913 if (s != NULL) {
5914 if (string_len > 5) {
5915 Py_DECREF(ob);
5916 PyErr_SetString(PyExc_ValueError, "string too long");
5917 return NULL;
5918 }
5919 strcpy(ob->structmembers.inplace_member, s);
5920 }
5921 else {
5922 strcpy(ob->structmembers.inplace_member, "");
5923 }
5924 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005925}
5926
Christian Heimes1af737c2008-01-23 08:24:23 +00005927static void
5928test_structmembers_free(PyObject *ob)
5929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005931}
5932
5933static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005934 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005935 "test_structmembersType",
5936 sizeof(test_structmembers), /* tp_basicsize */
5937 0, /* tp_itemsize */
5938 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005939 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005940 0, /* tp_getattr */
5941 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005942 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943 0, /* tp_repr */
5944 0, /* tp_as_number */
5945 0, /* tp_as_sequence */
5946 0, /* tp_as_mapping */
5947 0, /* tp_hash */
5948 0, /* tp_call */
5949 0, /* tp_str */
5950 PyObject_GenericGetAttr, /* tp_getattro */
5951 PyObject_GenericSetAttr, /* tp_setattro */
5952 0, /* tp_as_buffer */
5953 0, /* tp_flags */
5954 "Type containing all structmember types",
5955 0, /* traverseproc tp_traverse */
5956 0, /* tp_clear */
5957 0, /* tp_richcompare */
5958 0, /* tp_weaklistoffset */
5959 0, /* tp_iter */
5960 0, /* tp_iternext */
5961 0, /* tp_methods */
5962 test_members, /* tp_members */
5963 0,
5964 0,
5965 0,
5966 0,
5967 0,
5968 0,
5969 0,
5970 0,
5971 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005972};
5973
5974
Benjamin Petersond51374e2014-04-09 23:55:56 -04005975typedef struct {
5976 PyObject_HEAD
5977} matmulObject;
5978
5979static PyObject *
5980matmulType_matmul(PyObject *self, PyObject *other)
5981{
5982 return Py_BuildValue("(sOO)", "matmul", self, other);
5983}
5984
5985static PyObject *
5986matmulType_imatmul(PyObject *self, PyObject *other)
5987{
5988 return Py_BuildValue("(sOO)", "imatmul", self, other);
5989}
5990
5991static void
5992matmulType_dealloc(PyObject *self)
5993{
Zachary Ware420dc562014-04-23 13:51:27 -05005994 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005995}
5996
5997static PyNumberMethods matmulType_as_number = {
5998 0, /* nb_add */
5999 0, /* nb_subtract */
6000 0, /* nb_multiply */
6001 0, /* nb_remainde r*/
6002 0, /* nb_divmod */
6003 0, /* nb_power */
6004 0, /* nb_negative */
6005 0, /* tp_positive */
6006 0, /* tp_absolute */
6007 0, /* tp_bool */
6008 0, /* nb_invert */
6009 0, /* nb_lshift */
6010 0, /* nb_rshift */
6011 0, /* nb_and */
6012 0, /* nb_xor */
6013 0, /* nb_or */
6014 0, /* nb_int */
6015 0, /* nb_reserved */
6016 0, /* nb_float */
6017 0, /* nb_inplace_add */
6018 0, /* nb_inplace_subtract */
6019 0, /* nb_inplace_multiply */
6020 0, /* nb_inplace_remainder */
6021 0, /* nb_inplace_power */
6022 0, /* nb_inplace_lshift */
6023 0, /* nb_inplace_rshift */
6024 0, /* nb_inplace_and */
6025 0, /* nb_inplace_xor */
6026 0, /* nb_inplace_or */
6027 0, /* nb_floor_divide */
6028 0, /* nb_true_divide */
6029 0, /* nb_inplace_floor_divide */
6030 0, /* nb_inplace_true_divide */
6031 0, /* nb_index */
6032 matmulType_matmul, /* nb_matrix_multiply */
6033 matmulType_imatmul /* nb_matrix_inplace_multiply */
6034};
6035
6036static PyTypeObject matmulType = {
6037 PyVarObject_HEAD_INIT(NULL, 0)
6038 "matmulType",
6039 sizeof(matmulObject), /* tp_basicsize */
6040 0, /* tp_itemsize */
6041 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006042 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04006043 0, /* tp_getattr */
6044 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006045 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04006046 0, /* tp_repr */
6047 &matmulType_as_number, /* tp_as_number */
6048 0, /* tp_as_sequence */
6049 0, /* tp_as_mapping */
6050 0, /* tp_hash */
6051 0, /* tp_call */
6052 0, /* tp_str */
6053 PyObject_GenericGetAttr, /* tp_getattro */
6054 PyObject_GenericSetAttr, /* tp_setattro */
6055 0, /* tp_as_buffer */
6056 0, /* tp_flags */
6057 "C level type with matrix operations defined",
6058 0, /* traverseproc tp_traverse */
6059 0, /* tp_clear */
6060 0, /* tp_richcompare */
6061 0, /* tp_weaklistoffset */
6062 0, /* tp_iter */
6063 0, /* tp_iternext */
6064 0, /* tp_methods */
6065 0, /* tp_members */
6066 0,
6067 0,
6068 0,
6069 0,
6070 0,
6071 0,
6072 0,
6073 0,
6074 PyType_GenericNew, /* tp_new */
6075 PyObject_Del, /* tp_free */
6076};
6077
Zackery Spytzc7f803b2019-05-31 03:46:36 -06006078typedef struct {
6079 PyObject_HEAD
6080} ipowObject;
6081
6082static PyObject *
6083ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
6084{
6085 return Py_BuildValue("OO", other, mod);
6086}
6087
6088static PyNumberMethods ipowType_as_number = {
6089 .nb_inplace_power = ipowType_ipow
6090};
6091
6092static PyTypeObject ipowType = {
6093 PyVarObject_HEAD_INIT(NULL, 0)
6094 .tp_name = "ipowType",
6095 .tp_basicsize = sizeof(ipowObject),
6096 .tp_as_number = &ipowType_as_number,
6097 .tp_new = PyType_GenericNew
6098};
Martin v. Löwis1a214512008-06-11 05:26:20 +00006099
Yury Selivanov75445082015-05-11 22:57:16 -04006100typedef struct {
6101 PyObject_HEAD
6102 PyObject *ao_iterator;
6103} awaitObject;
6104
6105
6106static PyObject *
6107awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6108{
6109 PyObject *v;
6110 awaitObject *ao;
6111
6112 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
6113 return NULL;
6114
6115 ao = (awaitObject *)type->tp_alloc(type, 0);
6116 if (ao == NULL) {
6117 return NULL;
6118 }
6119
6120 Py_INCREF(v);
6121 ao->ao_iterator = v;
6122
6123 return (PyObject *)ao;
6124}
6125
6126
6127static void
6128awaitObject_dealloc(awaitObject *ao)
6129{
6130 Py_CLEAR(ao->ao_iterator);
6131 Py_TYPE(ao)->tp_free(ao);
6132}
6133
6134
6135static PyObject *
6136awaitObject_await(awaitObject *ao)
6137{
6138 Py_INCREF(ao->ao_iterator);
6139 return ao->ao_iterator;
6140}
6141
6142static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04006143 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04006144 0, /* am_aiter */
6145 0 /* am_anext */
6146};
6147
6148
6149static PyTypeObject awaitType = {
6150 PyVarObject_HEAD_INIT(NULL, 0)
6151 "awaitType",
6152 sizeof(awaitObject), /* tp_basicsize */
6153 0, /* tp_itemsize */
6154 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006155 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04006156 0, /* tp_getattr */
6157 0, /* tp_setattr */
6158 &awaitType_as_async, /* tp_as_async */
6159 0, /* tp_repr */
6160 0, /* 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 tp_as_async",
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 awaitObject_new, /* tp_new */
6188 PyObject_Del, /* tp_free */
6189};
6190
6191
xdegaye56d1f5c2017-10-26 15:09:06 +02006192static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
6193
6194static PyTypeObject PyRecursingInfinitelyError_Type = {
6195 PyVarObject_HEAD_INIT(NULL, 0)
6196 "RecursingInfinitelyError", /* tp_name */
6197 sizeof(PyBaseExceptionObject), /* tp_basicsize */
6198 0, /* tp_itemsize */
6199 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006200 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02006201 0, /* tp_getattr */
6202 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006203 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02006204 0, /* tp_repr */
6205 0, /* tp_as_number */
6206 0, /* tp_as_sequence */
6207 0, /* tp_as_mapping */
6208 0, /* tp_hash */
6209 0, /* tp_call */
6210 0, /* tp_str */
6211 0, /* tp_getattro */
6212 0, /* tp_setattro */
6213 0, /* tp_as_buffer */
6214 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6215 "Instantiating this exception starts infinite recursion.", /* tp_doc */
6216 0, /* tp_traverse */
6217 0, /* tp_clear */
6218 0, /* tp_richcompare */
6219 0, /* tp_weaklistoffset */
6220 0, /* tp_iter */
6221 0, /* tp_iternext */
6222 0, /* tp_methods */
6223 0, /* tp_members */
6224 0, /* tp_getset */
6225 0, /* tp_base */
6226 0, /* tp_dict */
6227 0, /* tp_descr_get */
6228 0, /* tp_descr_set */
6229 0, /* tp_dictoffset */
6230 (initproc)recurse_infinitely_error_init, /* tp_init */
6231 0, /* tp_alloc */
6232 0, /* tp_new */
6233};
6234
6235static int
6236recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
6237{
6238 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
6239
6240 /* Instantiating this exception starts infinite recursion. */
6241 Py_INCREF(type);
6242 PyErr_SetObject(type, NULL);
6243 return -1;
6244}
6245
6246
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006247/* Test bpo-35983: create a subclass of "list" which checks that instances
6248 * are not deallocated twice */
6249
6250typedef struct {
6251 PyListObject list;
6252 int deallocated;
6253} MyListObject;
6254
6255static PyObject *
6256MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6257{
6258 PyObject* op = PyList_Type.tp_new(type, args, kwds);
6259 ((MyListObject*)op)->deallocated = 0;
6260 return op;
6261}
6262
6263void
6264MyList_dealloc(MyListObject* op)
6265{
6266 if (op->deallocated) {
6267 /* We cannot raise exceptions here but we still want the testsuite
6268 * to fail when we hit this */
6269 Py_FatalError("MyList instance deallocated twice");
6270 }
6271 op->deallocated = 1;
6272 PyList_Type.tp_dealloc((PyObject *)op);
6273}
6274
6275static PyTypeObject MyList_Type = {
6276 PyVarObject_HEAD_INIT(NULL, 0)
6277 "MyList",
6278 sizeof(MyListObject),
6279 0,
6280 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006281 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006282 0, /* tp_getattr */
6283 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006284 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006285 0, /* tp_repr */
6286 0, /* tp_as_number */
6287 0, /* tp_as_sequence */
6288 0, /* tp_as_mapping */
6289 0, /* tp_hash */
6290 0, /* tp_call */
6291 0, /* tp_str */
6292 0, /* tp_getattro */
6293 0, /* tp_setattro */
6294 0, /* tp_as_buffer */
6295 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6296 0, /* tp_doc */
6297 0, /* tp_traverse */
6298 0, /* tp_clear */
6299 0, /* tp_richcompare */
6300 0, /* tp_weaklistoffset */
6301 0, /* tp_iter */
6302 0, /* tp_iternext */
6303 0, /* tp_methods */
6304 0, /* tp_members */
6305 0, /* tp_getset */
6306 0, /* &PyList_Type */ /* tp_base */
6307 0, /* tp_dict */
6308 0, /* tp_descr_get */
6309 0, /* tp_descr_set */
6310 0, /* tp_dictoffset */
6311 0, /* tp_init */
6312 0, /* tp_alloc */
6313 MyList_new, /* tp_new */
6314};
6315
6316
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006317/* Test PEP 560 */
6318
6319typedef struct {
6320 PyObject_HEAD
6321 PyObject *item;
6322} PyGenericAliasObject;
6323
6324static void
6325generic_alias_dealloc(PyGenericAliasObject *self)
6326{
6327 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01006328 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006329}
6330
6331static PyObject *
6332generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
6333{
6334 return PyTuple_Pack(1, self->item);
6335}
6336
6337static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006338 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006339 {NULL} /* sentinel */
6340};
6341
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006342static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006343 PyVarObject_HEAD_INIT(NULL, 0)
6344 "GenericAlias",
6345 sizeof(PyGenericAliasObject),
6346 0,
6347 .tp_dealloc = (destructor)generic_alias_dealloc,
6348 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6349 .tp_methods = generic_alias_methods,
6350};
6351
6352static PyObject *
6353generic_alias_new(PyObject *item)
6354{
6355 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
6356 if (o == NULL) {
6357 return NULL;
6358 }
6359 Py_INCREF(item);
6360 o->item = item;
6361 return (PyObject*) o;
6362}
6363
6364typedef struct {
6365 PyObject_HEAD
6366} PyGenericObject;
6367
6368static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006369generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006370{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006371 return generic_alias_new(item);
6372}
6373
6374static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006375 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006376 {NULL} /* sentinel */
6377};
6378
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006379static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006380 PyVarObject_HEAD_INIT(NULL, 0)
6381 "Generic",
6382 sizeof(PyGenericObject),
6383 0,
6384 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6385 .tp_methods = generic_methods,
6386};
6387
6388
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006389/* Test PEP 590 */
6390
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006391typedef struct {
6392 PyObject_HEAD
6393 vectorcallfunc vectorcall;
6394} MethodDescriptorObject;
6395
6396static PyObject *
6397MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
6398 size_t nargsf, PyObject *kwnames)
6399{
6400 /* True if using the vectorcall function in MethodDescriptorObject
6401 * but False for MethodDescriptor2Object */
6402 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
6403 return PyBool_FromLong(md->vectorcall != NULL);
6404}
6405
6406static PyObject *
6407MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6408{
Petr Viktorine584cbf2019-06-03 01:08:14 +02006409 MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006410 op->vectorcall = MethodDescriptor_vectorcall;
6411 return (PyObject *)op;
6412}
6413
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006414static PyObject *
6415func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6416{
6417 if (obj == Py_None || obj == NULL) {
6418 Py_INCREF(func);
6419 return func;
6420 }
6421 return PyMethod_New(func, obj);
6422}
6423
6424static PyObject *
6425nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6426{
6427 Py_INCREF(func);
6428 return func;
6429}
6430
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006431static PyObject *
6432call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
6433{
6434 Py_INCREF(args);
6435 return args;
6436}
6437
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006438static PyTypeObject MethodDescriptorBase_Type = {
6439 PyVarObject_HEAD_INIT(NULL, 0)
6440 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006441 sizeof(MethodDescriptorObject),
6442 .tp_new = MethodDescriptor_new,
6443 .tp_call = PyVectorcall_Call,
6444 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
6445 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Petr Viktorinffd97532020-02-11 17:46:57 +01006446 Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006447 .tp_descr_get = func_descr_get,
6448};
6449
6450static PyTypeObject MethodDescriptorDerived_Type = {
6451 PyVarObject_HEAD_INIT(NULL, 0)
6452 "MethodDescriptorDerived",
6453 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6454};
6455
6456static PyTypeObject MethodDescriptorNopGet_Type = {
6457 PyVarObject_HEAD_INIT(NULL, 0)
6458 "MethodDescriptorNopGet",
6459 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006460 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006461 .tp_descr_get = nop_descr_get,
6462};
6463
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006464typedef struct {
6465 MethodDescriptorObject base;
6466 vectorcallfunc vectorcall;
6467} MethodDescriptor2Object;
6468
6469static PyObject *
6470MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6471{
6472 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
6473 op->base.vectorcall = NULL;
6474 op->vectorcall = MethodDescriptor_vectorcall;
6475 return (PyObject *)op;
6476}
6477
6478static PyTypeObject MethodDescriptor2_Type = {
6479 PyVarObject_HEAD_INIT(NULL, 0)
6480 "MethodDescriptor2",
6481 sizeof(MethodDescriptor2Object),
6482 .tp_new = MethodDescriptor2_new,
6483 .tp_call = PyVectorcall_Call,
6484 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
Petr Viktorinffd97532020-02-11 17:46:57 +01006485 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006486};
6487
Benjamin Peterson39403332020-09-02 11:29:06 -05006488PyDoc_STRVAR(heapdocctype__doc__,
6489"HeapDocCType(arg1, arg2)\n"
6490"--\n"
6491"\n"
6492"somedoc");
6493
6494typedef struct {
6495 PyObject_HEAD
6496} HeapDocCTypeObject;
6497
6498static PyType_Slot HeapDocCType_slots[] = {
6499 {Py_tp_doc, (char*)heapdocctype__doc__},
6500 {0},
6501};
6502
6503static PyType_Spec HeapDocCType_spec = {
6504 "_testcapi.HeapDocCType",
6505 sizeof(HeapDocCTypeObject),
6506 0,
6507 Py_TPFLAGS_DEFAULT,
6508 HeapDocCType_slots
6509};
6510
6511
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006512PyDoc_STRVAR(heapgctype__doc__,
6513"A heap type with GC, and with overridden dealloc.\n\n"
6514"The 'value' attribute is set to 10 in __init__.");
6515
6516typedef struct {
6517 PyObject_HEAD
6518 int value;
6519} HeapCTypeObject;
6520
6521static struct PyMemberDef heapctype_members[] = {
6522 {"value", T_INT, offsetof(HeapCTypeObject, value)},
6523 {NULL} /* Sentinel */
6524};
6525
6526static int
6527heapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
6528{
6529 ((HeapCTypeObject *)self)->value = 10;
6530 return 0;
6531}
6532
6533static void
6534heapgcctype_dealloc(HeapCTypeObject *self)
6535{
6536 PyTypeObject *tp = Py_TYPE(self);
6537 PyObject_GC_UnTrack(self);
6538 PyObject_GC_Del(self);
6539 Py_DECREF(tp);
6540}
6541
6542static PyType_Slot HeapGcCType_slots[] = {
6543 {Py_tp_init, heapctype_init},
6544 {Py_tp_members, heapctype_members},
6545 {Py_tp_dealloc, heapgcctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006546 {Py_tp_doc, (char*)heapgctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006547 {0, 0},
6548};
6549
6550static PyType_Spec HeapGcCType_spec = {
6551 "_testcapi.HeapGcCType",
6552 sizeof(HeapCTypeObject),
6553 0,
6554 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6555 HeapGcCType_slots
6556};
6557
6558PyDoc_STRVAR(heapctype__doc__,
6559"A heap type without GC, but with overridden dealloc.\n\n"
6560"The 'value' attribute is set to 10 in __init__.");
6561
6562static void
6563heapctype_dealloc(HeapCTypeObject *self)
6564{
6565 PyTypeObject *tp = Py_TYPE(self);
6566 PyObject_Del(self);
6567 Py_DECREF(tp);
6568}
6569
6570static PyType_Slot HeapCType_slots[] = {
6571 {Py_tp_init, heapctype_init},
6572 {Py_tp_members, heapctype_members},
6573 {Py_tp_dealloc, heapctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006574 {Py_tp_doc, (char*)heapctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006575 {0, 0},
6576};
6577
6578static PyType_Spec HeapCType_spec = {
6579 "_testcapi.HeapCType",
6580 sizeof(HeapCTypeObject),
6581 0,
6582 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6583 HeapCType_slots
6584};
6585
6586PyDoc_STRVAR(heapctypesubclass__doc__,
6587"Subclass of HeapCType, without GC.\n\n"
6588"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6589
6590typedef struct {
6591 HeapCTypeObject base;
6592 int value2;
6593} HeapCTypeSubclassObject;
6594
6595static int
6596heapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
6597{
6598 /* Call __init__ of the superclass */
6599 if (heapctype_init(self, args, kwargs) < 0) {
6600 return -1;
6601 }
6602 /* Initialize additional element */
6603 ((HeapCTypeSubclassObject *)self)->value2 = 20;
6604 return 0;
6605}
6606
6607static struct PyMemberDef heapctypesubclass_members[] = {
6608 {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
6609 {NULL} /* Sentinel */
6610};
6611
6612static PyType_Slot HeapCTypeSubclass_slots[] = {
6613 {Py_tp_init, heapctypesubclass_init},
6614 {Py_tp_members, heapctypesubclass_members},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006615 {Py_tp_doc, (char*)heapctypesubclass__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006616 {0, 0},
6617};
6618
6619static PyType_Spec HeapCTypeSubclass_spec = {
6620 "_testcapi.HeapCTypeSubclass",
6621 sizeof(HeapCTypeSubclassObject),
6622 0,
6623 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6624 HeapCTypeSubclass_slots
6625};
6626
scoderf7c4e232020-06-06 21:35:10 +02006627PyDoc_STRVAR(heapctypewithbuffer__doc__,
6628"Heap type with buffer support.\n\n"
6629"The buffer is set to [b'1', b'2', b'3', b'4']");
6630
6631typedef struct {
6632 HeapCTypeObject base;
6633 char buffer[4];
6634} HeapCTypeWithBufferObject;
6635
6636static int
6637heapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags)
6638{
6639 self->buffer[0] = '1';
6640 self->buffer[1] = '2';
6641 self->buffer[2] = '3';
6642 self->buffer[3] = '4';
6643 return PyBuffer_FillInfo(
6644 view, (PyObject*)self, (void *)self->buffer, 4, 1, flags);
6645}
6646
Rémi Lapeyreb8867e52020-06-07 09:05:33 +02006647static void
scoderf7c4e232020-06-06 21:35:10 +02006648heapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view)
6649{
6650 assert(view->obj == (void*) self);
6651}
6652
6653static PyType_Slot HeapCTypeWithBuffer_slots[] = {
6654 {Py_bf_getbuffer, heapctypewithbuffer_getbuffer},
6655 {Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer},
6656 {Py_tp_doc, (char*)heapctypewithbuffer__doc__},
6657 {0, 0},
6658};
6659
6660static PyType_Spec HeapCTypeWithBuffer_spec = {
6661 "_testcapi.HeapCTypeWithBuffer",
6662 sizeof(HeapCTypeWithBufferObject),
6663 0,
6664 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6665 HeapCTypeWithBuffer_slots
6666};
6667
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006668PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
6669"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
6670"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
6671"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6672
6673static int
6674heapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
6675{
6676 PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
6677 initproc base_init = PyType_GetSlot(base, Py_tp_init);
6678 base_init(self, args, kwargs);
6679 return 0;
6680}
6681
6682static void
6683heapctypesubclasswithfinalizer_finalize(PyObject *self)
6684{
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006685 PyObject *error_type, *error_value, *error_traceback, *m;
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006686 PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006687
6688 /* Save the current exception, if any. */
6689 PyErr_Fetch(&error_type, &error_value, &error_traceback);
6690
6691 m = PyState_FindModule(&_testcapimodule);
6692 if (m == NULL) {
6693 goto cleanup_finalize;
6694 }
6695 oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
6696 newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
6697 if (oldtype == NULL || newtype == NULL) {
6698 goto cleanup_finalize;
6699 }
6700
6701 if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
6702 goto cleanup_finalize;
6703 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006704 refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
6705 if (refcnt == NULL) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006706 goto cleanup_finalize;
6707 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006708 if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
6709 goto cleanup_finalize;
6710 }
6711 Py_DECREF(refcnt);
6712 refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
6713 if (refcnt == NULL) {
6714 goto cleanup_finalize;
6715 }
6716 if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006717 goto cleanup_finalize;
6718 }
6719
6720cleanup_finalize:
6721 Py_XDECREF(oldtype);
6722 Py_XDECREF(newtype);
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006723 Py_XDECREF(refcnt);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006724
6725 /* Restore the saved exception. */
6726 PyErr_Restore(error_type, error_value, error_traceback);
6727}
6728
6729static PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
6730 {Py_tp_init, heapctypesubclasswithfinalizer_init},
6731 {Py_tp_members, heapctypesubclass_members},
6732 {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006733 {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006734 {0, 0},
6735};
6736
6737static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
6738 "_testcapi.HeapCTypeSubclassWithFinalizer",
6739 sizeof(HeapCTypeSubclassObject),
6740 0,
6741 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
6742 HeapCTypeSubclassWithFinalizer_slots
6743};
6744
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006745typedef struct {
6746 PyObject_HEAD
6747 PyObject *dict;
6748} HeapCTypeWithDictObject;
6749
6750static void
6751heapctypewithdict_dealloc(HeapCTypeWithDictObject* self)
6752{
6753
6754 PyTypeObject *tp = Py_TYPE(self);
6755 Py_XDECREF(self->dict);
6756 PyObject_DEL(self);
6757 Py_DECREF(tp);
6758}
6759
6760static PyGetSetDef heapctypewithdict_getsetlist[] = {
6761 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
6762 {NULL} /* Sentinel */
6763};
6764
6765static struct PyMemberDef heapctypewithdict_members[] = {
6766 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
6767 {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY},
6768 {NULL} /* Sentinel */
6769};
6770
6771static PyType_Slot HeapCTypeWithDict_slots[] = {
6772 {Py_tp_members, heapctypewithdict_members},
6773 {Py_tp_getset, heapctypewithdict_getsetlist},
6774 {Py_tp_dealloc, heapctypewithdict_dealloc},
6775 {0, 0},
6776};
6777
6778static PyType_Spec HeapCTypeWithDict_spec = {
6779 "_testcapi.HeapCTypeWithDict",
6780 sizeof(HeapCTypeWithDictObject),
6781 0,
6782 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6783 HeapCTypeWithDict_slots
6784};
6785
6786static struct PyMemberDef heapctypewithnegativedict_members[] = {
6787 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
Victor Stinneraca8c402019-09-30 21:14:26 +02006788 {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006789 {NULL} /* Sentinel */
6790};
6791
6792static PyType_Slot HeapCTypeWithNegativeDict_slots[] = {
6793 {Py_tp_members, heapctypewithnegativedict_members},
6794 {Py_tp_getset, heapctypewithdict_getsetlist},
6795 {Py_tp_dealloc, heapctypewithdict_dealloc},
6796 {0, 0},
6797};
6798
6799static PyType_Spec HeapCTypeWithNegativeDict_spec = {
6800 "_testcapi.HeapCTypeWithNegativeDict",
6801 sizeof(HeapCTypeWithDictObject),
6802 0,
6803 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6804 HeapCTypeWithNegativeDict_slots
6805};
6806
6807typedef struct {
6808 PyObject_HEAD
6809 PyObject *weakreflist;
6810} HeapCTypeWithWeakrefObject;
6811
6812static struct PyMemberDef heapctypewithweakref_members[] = {
6813 {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)},
6814 {"__weaklistoffset__", T_PYSSIZET,
6815 offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY},
6816 {NULL} /* Sentinel */
6817};
6818
6819static void
6820heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self)
6821{
6822
6823 PyTypeObject *tp = Py_TYPE(self);
6824 if (self->weakreflist != NULL)
6825 PyObject_ClearWeakRefs((PyObject *) self);
6826 Py_XDECREF(self->weakreflist);
6827 PyObject_DEL(self);
6828 Py_DECREF(tp);
6829}
6830
6831static PyType_Slot HeapCTypeWithWeakref_slots[] = {
6832 {Py_tp_members, heapctypewithweakref_members},
6833 {Py_tp_dealloc, heapctypewithweakref_dealloc},
6834 {0, 0},
6835};
6836
6837static PyType_Spec HeapCTypeWithWeakref_spec = {
6838 "_testcapi.HeapCTypeWithWeakref",
6839 sizeof(HeapCTypeWithWeakrefObject),
6840 0,
6841 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6842 HeapCTypeWithWeakref_slots
6843};
6844
scoder148f3292020-07-03 02:09:28 +02006845PyDoc_STRVAR(heapctypesetattr__doc__,
6846"A heap type without GC, but with overridden __setattr__.\n\n"
6847"The 'value' attribute is set to 10 in __init__ and updated via attribute setting.");
6848
6849typedef struct {
6850 PyObject_HEAD
6851 long value;
6852} HeapCTypeSetattrObject;
6853
6854static struct PyMemberDef heapctypesetattr_members[] = {
6855 {"pvalue", T_LONG, offsetof(HeapCTypeSetattrObject, value)},
6856 {NULL} /* Sentinel */
6857};
6858
6859static int
6860heapctypesetattr_init(PyObject *self, PyObject *args, PyObject *kwargs)
6861{
6862 ((HeapCTypeSetattrObject *)self)->value = 10;
6863 return 0;
6864}
6865
6866static void
6867heapctypesetattr_dealloc(HeapCTypeSetattrObject *self)
6868{
6869 PyTypeObject *tp = Py_TYPE(self);
6870 PyObject_Del(self);
6871 Py_DECREF(tp);
6872}
6873
6874static int
6875heapctypesetattr_setattro(HeapCTypeSetattrObject *self, PyObject *attr, PyObject *value)
6876{
6877 PyObject *svalue = PyUnicode_FromString("value");
6878 if (svalue == NULL)
6879 return -1;
6880 int eq = PyObject_RichCompareBool(svalue, attr, Py_EQ);
6881 Py_DECREF(svalue);
6882 if (eq < 0)
6883 return -1;
6884 if (!eq) {
6885 return PyObject_GenericSetAttr((PyObject*) self, attr, value);
6886 }
6887 if (value == NULL) {
6888 self->value = 0;
6889 return 0;
6890 }
6891 PyObject *ivalue = PyNumber_Long(value);
6892 if (ivalue == NULL)
6893 return -1;
6894 long v = PyLong_AsLong(ivalue);
6895 Py_DECREF(ivalue);
6896 if (v == -1 && PyErr_Occurred())
6897 return -1;
6898 self->value = v;
6899 return 0;
6900}
6901
6902static PyType_Slot HeapCTypeSetattr_slots[] = {
6903 {Py_tp_init, heapctypesetattr_init},
6904 {Py_tp_members, heapctypesetattr_members},
6905 {Py_tp_setattro, heapctypesetattr_setattro},
6906 {Py_tp_dealloc, heapctypesetattr_dealloc},
6907 {Py_tp_doc, (char*)heapctypesetattr__doc__},
6908 {0, 0},
6909};
6910
6911static PyType_Spec HeapCTypeSetattr_spec = {
6912 "_testcapi.HeapCTypeSetattr",
6913 sizeof(HeapCTypeSetattrObject),
6914 0,
6915 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6916 HeapCTypeSetattr_slots
6917};
6918
Petr Viktorinf9583772019-09-10 12:21:09 +01006919static PyMethodDef meth_instance_methods[] = {
6920 {"meth_varargs", meth_varargs, METH_VARARGS},
6921 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
6922 {"meth_o", meth_o, METH_O},
6923 {"meth_noargs", meth_noargs, METH_NOARGS},
6924 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
6925 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
6926 {NULL, NULL} /* sentinel */
6927};
6928
6929
6930static PyTypeObject MethInstance_Type = {
6931 PyVarObject_HEAD_INIT(NULL, 0)
6932 "MethInstance",
6933 sizeof(PyObject),
6934 .tp_new = PyType_GenericNew,
6935 .tp_flags = Py_TPFLAGS_DEFAULT,
6936 .tp_methods = meth_instance_methods,
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006937 .tp_doc = (char*)PyDoc_STR(
Petr Viktorinf9583772019-09-10 12:21:09 +01006938 "Class with normal (instance) methods to test calling conventions"),
6939};
6940
6941static PyMethodDef meth_class_methods[] = {
6942 {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS},
6943 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS},
6944 {"meth_o", meth_o, METH_O|METH_CLASS},
6945 {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS},
6946 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS},
6947 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS},
6948 {NULL, NULL} /* sentinel */
6949};
6950
6951
6952static PyTypeObject MethClass_Type = {
6953 PyVarObject_HEAD_INIT(NULL, 0)
6954 "MethClass",
6955 sizeof(PyObject),
6956 .tp_new = PyType_GenericNew,
6957 .tp_flags = Py_TPFLAGS_DEFAULT,
6958 .tp_methods = meth_class_methods,
6959 .tp_doc = PyDoc_STR(
6960 "Class with class methods to test calling conventions"),
6961};
6962
6963static PyMethodDef meth_static_methods[] = {
6964 {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC},
6965 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC},
6966 {"meth_o", meth_o, METH_O|METH_STATIC},
6967 {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC},
6968 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC},
6969 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC},
6970 {NULL, NULL} /* sentinel */
6971};
6972
6973
6974static PyTypeObject MethStatic_Type = {
6975 PyVarObject_HEAD_INIT(NULL, 0)
6976 "MethStatic",
6977 sizeof(PyObject),
6978 .tp_new = PyType_GenericNew,
6979 .tp_flags = Py_TPFLAGS_DEFAULT,
6980 .tp_methods = meth_static_methods,
6981 .tp_doc = PyDoc_STR(
6982 "Class with static methods to test calling conventions"),
6983};
6984
Neil Schemenauer392a13b2019-10-15 20:56:48 -07006985/* ContainerNoGC -- a simple container without GC methods */
6986
6987typedef struct {
6988 PyObject_HEAD
6989 PyObject *value;
6990} ContainerNoGCobject;
6991
6992static PyObject *
6993ContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
6994{
6995 PyObject *value;
6996 char *names[] = {"value", NULL};
6997 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) {
6998 return NULL;
6999 }
7000 PyObject *self = type->tp_alloc(type, 0);
7001 if (self == NULL) {
7002 return NULL;
7003 }
7004 Py_INCREF(value);
7005 ((ContainerNoGCobject *)self)->value = value;
7006 return self;
7007}
7008
7009static void
7010ContainerNoGC_dealloc(ContainerNoGCobject *self)
7011{
7012 Py_DECREF(self->value);
7013 Py_TYPE(self)->tp_free((PyObject *)self);
7014}
7015
7016static PyMemberDef ContainerNoGC_members[] = {
7017 {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY,
7018 PyDoc_STR("a container value for test purposes")},
7019 {0}
7020};
7021
7022static PyTypeObject ContainerNoGC_type = {
7023 PyVarObject_HEAD_INIT(NULL, 0)
7024 "_testcapi.ContainerNoGC",
7025 sizeof(ContainerNoGCobject),
7026 .tp_dealloc = (destructor)ContainerNoGC_dealloc,
7027 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
7028 .tp_members = ContainerNoGC_members,
7029 .tp_new = ContainerNoGC_new,
7030};
7031
Jeroen Demeyereb65e242019-05-28 14:42:53 +02007032
Martin v. Löwis1a214512008-06-11 05:26:20 +00007033static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007034 PyModuleDef_HEAD_INIT,
7035 "_testcapi",
7036 NULL,
7037 -1,
7038 TestMethods,
7039 NULL,
7040 NULL,
7041 NULL,
7042 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007043};
7044
Nick Coghland5cacbb2015-05-23 22:24:10 +10007045/* Per PEP 489, this module will not be converted to multi-phase initialization
7046 */
7047
Mark Hammond62b1ab12002-07-23 06:31:15 +00007048PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007049PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00007050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007051 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007053 m = PyModule_Create(&_testcapimodule);
7054 if (m == NULL)
7055 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007056
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007057 Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type);
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00007058
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01007059 Py_SET_TYPE(&test_structmembersType, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007060 Py_INCREF(&test_structmembersType);
7061 /* don't use a name starting with "test", since we don't want
7062 test_capi to automatically call this */
7063 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04007064 if (PyType_Ready(&matmulType) < 0)
7065 return NULL;
7066 Py_INCREF(&matmulType);
7067 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06007068 if (PyType_Ready(&ipowType) < 0) {
7069 return NULL;
7070 }
7071 Py_INCREF(&ipowType);
7072 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00007073
Yury Selivanov75445082015-05-11 22:57:16 -04007074 if (PyType_Ready(&awaitType) < 0)
7075 return NULL;
7076 Py_INCREF(&awaitType);
7077 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
7078
Jeroen Demeyer351c6742019-05-10 19:21:11 +02007079 MyList_Type.tp_base = &PyList_Type;
7080 if (PyType_Ready(&MyList_Type) < 0)
7081 return NULL;
7082 Py_INCREF(&MyList_Type);
7083 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
7084
Jeroen Demeyereb65e242019-05-28 14:42:53 +02007085 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
7086 return NULL;
7087 Py_INCREF(&MethodDescriptorBase_Type);
7088 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
7089
7090 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
7091 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
7092 return NULL;
7093 Py_INCREF(&MethodDescriptorDerived_Type);
7094 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
7095
7096 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
7097 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
7098 return NULL;
7099 Py_INCREF(&MethodDescriptorNopGet_Type);
7100 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
7101
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02007102 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
7103 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
7104 return NULL;
7105 Py_INCREF(&MethodDescriptor2_Type);
7106 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
7107
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02007108 if (PyType_Ready(&GenericAlias_Type) < 0)
7109 return NULL;
7110 Py_INCREF(&GenericAlias_Type);
7111 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
7112
7113 if (PyType_Ready(&Generic_Type) < 0)
7114 return NULL;
7115 Py_INCREF(&Generic_Type);
7116 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
7117
Petr Viktorinf9583772019-09-10 12:21:09 +01007118 if (PyType_Ready(&MethInstance_Type) < 0)
7119 return NULL;
7120 Py_INCREF(&MethInstance_Type);
7121 PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type);
7122
7123 if (PyType_Ready(&MethClass_Type) < 0)
7124 return NULL;
7125 Py_INCREF(&MethClass_Type);
7126 PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type);
7127
7128 if (PyType_Ready(&MethStatic_Type) < 0)
7129 return NULL;
7130 Py_INCREF(&MethStatic_Type);
7131 PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type);
7132
xdegaye56d1f5c2017-10-26 15:09:06 +02007133 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
7134 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
7135 return NULL;
7136 }
7137 Py_INCREF(&PyRecursingInfinitelyError_Type);
7138 PyModule_AddObject(m, "RecursingInfinitelyError",
7139 (PyObject *)&PyRecursingInfinitelyError_Type);
7140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007141 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
7142 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
7143 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
7144 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
7145 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
7146 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
7147 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
7148 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
7149 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
7150 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
7151 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
7152 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
7153 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
7154 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
7155 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
7156 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05007157 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX));
7158 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN));
7159 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007160 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
7161 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
Victor Stinner4237d342015-09-10 10:10:39 +02007162 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007163 Py_INCREF(&PyInstanceMethod_Type);
7164 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00007165
Larry Hastings2a727912014-01-16 11:32:01 -08007166 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner310e2d22019-11-22 10:58:00 +01007167 PyObject *v;
Victor Stinner5d39e042017-11-29 17:20:38 +01007168#ifdef WITH_PYMALLOC
Victor Stinner310e2d22019-11-22 10:58:00 +01007169 v = Py_True;
Victor Stinner5d39e042017-11-29 17:20:38 +01007170#else
Victor Stinner310e2d22019-11-22 10:58:00 +01007171 v = Py_False;
Victor Stinner5d39e042017-11-29 17:20:38 +01007172#endif
Victor Stinner310e2d22019-11-22 10:58:00 +01007173 Py_INCREF(v);
7174 PyModule_AddObject(m, "WITH_PYMALLOC", v);
Larry Hastings2a727912014-01-16 11:32:01 -08007175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007176 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
7177 Py_INCREF(TestError);
7178 PyModule_AddObject(m, "error", TestError);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007179
Benjamin Peterson39403332020-09-02 11:29:06 -05007180 PyObject *HeapDocCType = PyType_FromSpec(&HeapDocCType_spec);
7181 if (HeapDocCType == NULL) {
7182 return NULL;
7183 }
7184 PyModule_AddObject(m, "HeapDocCType", HeapDocCType);
7185
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007186 PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
7187 if (HeapGcCType == NULL) {
7188 return NULL;
7189 }
7190 PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
7191
7192 PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
7193 if (HeapCType == NULL) {
7194 return NULL;
7195 }
7196 PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
7197 if (subclass_bases == NULL) {
7198 return NULL;
7199 }
7200 PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
7201 if (HeapCTypeSubclass == NULL) {
7202 return NULL;
7203 }
7204 Py_DECREF(subclass_bases);
7205 PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
7206
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07007207 PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec);
7208 if (HeapCTypeWithDict == NULL) {
7209 return NULL;
7210 }
7211 PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict);
7212
7213 PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
7214 if (HeapCTypeWithNegativeDict == NULL) {
7215 return NULL;
7216 }
7217 PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict);
7218
7219 PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec);
7220 if (HeapCTypeWithWeakref == NULL) {
7221 return NULL;
7222 }
7223 PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref);
7224
scoderf7c4e232020-06-06 21:35:10 +02007225 PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec);
7226 if (HeapCTypeWithBuffer == NULL) {
7227 return NULL;
7228 }
7229 PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer);
7230
scoder148f3292020-07-03 02:09:28 +02007231 PyObject *HeapCTypeSetattr = PyType_FromSpec(&HeapCTypeSetattr_spec);
7232 if (HeapCTypeSetattr == NULL) {
7233 return NULL;
7234 }
7235 PyModule_AddObject(m, "HeapCTypeSetattr", HeapCTypeSetattr);
7236
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007237 PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
7238 if (subclass_with_finalizer_bases == NULL) {
7239 return NULL;
7240 }
7241 PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
7242 &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
7243 if (HeapCTypeSubclassWithFinalizer == NULL) {
7244 return NULL;
7245 }
7246 Py_DECREF(subclass_with_finalizer_bases);
7247 PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
7248
Neil Schemenauer392a13b2019-10-15 20:56:48 -07007249 if (PyType_Ready(&ContainerNoGC_type) < 0) {
7250 return NULL;
7251 }
7252 Py_INCREF(&ContainerNoGC_type);
7253 if (PyModule_AddObject(m, "ContainerNoGC",
7254 (PyObject *) &ContainerNoGC_type) < 0)
7255 return NULL;
7256
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007257 PyState_AddModule(m, &_testcapimodule);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007258 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007259}
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007260
7261
7262/* Test the C API exposed when PY_SSIZE_T_CLEAN is not defined */
7263
7264#undef Py_BuildValue
7265PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
7266
7267static PyObject *
7268test_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
7269{
7270 PyObject *res;
7271 const char str[] = "string";
7272 const Py_UNICODE unicode[] = L"unicode";
Victor Stinner37bb2892020-06-19 11:45:31 +02007273 assert(!PyErr_Occurred());
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007274
7275 res = Py_BuildValue("(s#O)", str, 1, Py_None);
7276 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007277 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007278 return NULL;
7279 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007280 PyErr_Clear();
7281
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007282 res = Py_BuildValue("(z#O)", str, 1, Py_None);
7283 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007284 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007285 return NULL;
7286 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007287 PyErr_Clear();
7288
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007289 res = Py_BuildValue("(y#O)", str, 1, Py_None);
7290 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007291 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007292 return NULL;
7293 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007294 PyErr_Clear();
7295
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007296 res = Py_BuildValue("(u#O)", unicode, 1, Py_None);
7297 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007298 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007299 return NULL;
7300 }
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007301 PyErr_Clear();
Victor Stinner37bb2892020-06-19 11:45:31 +02007302
7303
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007304 Py_RETURN_NONE;
7305}