blob: 84f2651641c7a047f544fe516cf6ca7ffd7dbc08 [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 Stinner5c75f372019-04-17 23:02:26 +02008/* The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE
9 define, but we only want to test the public C API, not the internal
10 C API. */
11#undef Py_BUILD_CORE_MODULE
12
Neal Norwitz8866e0a2007-10-27 04:01:17 +000013#define PY_SSIZE_T_CLEAN
14
Tim Peters9ea17ac2001-02-02 05:57:15 +000015#include "Python.h"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000016#include "datetime.h"
Serhiy Storchakab5181342015-02-06 08:58:56 +020017#include "marshal.h"
Victor Stinnera1c249c2018-11-01 03:15:58 +010018#include "pythread.h"
19#include "structmember.h"
20#include <float.h>
Victor Stinner56e8c292014-07-21 12:30:22 +020021#include <signal.h>
Tim Peters9ea17ac2001-02-02 05:57:15 +000022
Victor Stinner95e9cef2015-03-28 01:26:47 +010023#ifdef MS_WINDOWS
Victor Stinner09e5cf22015-03-30 00:09:18 +020024# include <winsock2.h> /* struct timeval */
Victor Stinner95e9cef2015-03-28 01:26:47 +010025#endif
26
Victor Stinner7b7c6dc2017-08-10 12:37:39 +020027#ifdef HAVE_SYS_WAIT_H
28#include <sys/wait.h> /* For W_STOPCODE */
29#endif
30
Victor Stinner5ed69952018-11-06 15:59:52 +010031#ifdef Py_BUILD_CORE
32# error "_testcapi must test the public Python C API, not CPython internal C API"
33#endif
34
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000036
Tim Peters91621db2001-06-12 20:10:01 +000037/* Raise TestError with test_name + ": " + msg, and return NULL. */
38
39static PyObject *
40raiseTestError(const char* test_name, const char* msg)
41{
Victor Stinner6ced7c42011-03-21 18:15:42 +010042 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000044}
45
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000046/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000047
48 The ones derived from autoconf on the UNIX-like OSes can be relied
49 upon (in the absence of sloppy cross-compiling), but the Windows
50 platforms have these hardcoded. Better safe than sorry.
51*/
52static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000053sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000055{
Victor Stinner499dfcf2011-03-21 13:26:24 +010056 PyErr_Format(TestError,
57 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000060}
61
62static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053063test_config(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters9ea17ac2001-02-02 05:57:15 +000064{
Tim Peters9ea17ac2001-02-02 05:57:15 +000065#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066 if (FATNAME != sizeof(TYPE)) \
67 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000069 CHECK_SIZEOF(SIZEOF_SHORT, short);
70 CHECK_SIZEOF(SIZEOF_INT, int);
71 CHECK_SIZEOF(SIZEOF_LONG, long);
72 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
73 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Benjamin Petersonaf580df2016-09-06 10:46:49 -070074 CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
Tim Peters9ea17ac2001-02-02 05:57:15 +000075
76#undef CHECK_SIZEOF
77
Serhiy Storchaka228b12e2017-01-23 09:47:21 +020078 Py_RETURN_NONE;
Tim Peters9ea17ac2001-02-02 05:57:15 +000079}
80
Tim Peters5c4d5bf2001-02-12 22:13:26 +000081static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053082test_sizeof_c_types(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner01076552013-10-29 19:39:52 +010083{
Ned Deilye37a1942015-03-05 15:47:10 -080084#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020085#pragma GCC diagnostic push
86#pragma GCC diagnostic ignored "-Wtype-limits"
87#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010088#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010089 if (EXPECTED != sizeof(TYPE)) { \
90 PyErr_Format(TestError, \
91 "sizeof(%s) = %u instead of %u", \
92 #TYPE, sizeof(TYPE), EXPECTED); \
93 return (PyObject*)NULL; \
94 }
Victor Stinnerf866f972013-10-29 19:59:31 +010095#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
96#define CHECK_SIGNNESS(TYPE, SIGNED) \
97 if (IS_SIGNED(TYPE) != SIGNED) { \
98 PyErr_Format(TestError, \
99 "%s signness is, instead of %i", \
100 #TYPE, IS_SIGNED(TYPE), SIGNED); \
101 return (PyObject*)NULL; \
102 }
Victor Stinner01076552013-10-29 19:39:52 +0100103
104 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100105 CHECK_SIZEOF(Py_UCS1, 1);
106 CHECK_SIZEOF(Py_UCS2, 2);
107 CHECK_SIZEOF(Py_UCS4, 4);
108 CHECK_SIGNNESS(Py_UCS1, 0);
109 CHECK_SIGNNESS(Py_UCS2, 0);
110 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700111 CHECK_SIZEOF(int32_t, 4);
112 CHECK_SIGNNESS(int32_t, 1);
113 CHECK_SIZEOF(uint32_t, 4);
114 CHECK_SIGNNESS(uint32_t, 0);
115 CHECK_SIZEOF(int64_t, 8);
116 CHECK_SIGNNESS(int64_t, 1);
117 CHECK_SIZEOF(uint64_t, 8);
118 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100119
120 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100121 CHECK_SIZEOF(size_t, sizeof(void *));
122 CHECK_SIGNNESS(size_t, 0);
123 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
124 CHECK_SIGNNESS(Py_ssize_t, 1);
125
Benjamin Petersonca470632016-09-06 13:47:26 -0700126 CHECK_SIZEOF(uintptr_t, sizeof(void *));
127 CHECK_SIGNNESS(uintptr_t, 0);
128 CHECK_SIZEOF(intptr_t, sizeof(void *));
129 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100130
Serhiy Storchakad1302c02017-01-23 10:23:58 +0200131 Py_RETURN_NONE;
Victor Stinner01076552013-10-29 19:39:52 +0100132
Victor Stinnerf866f972013-10-29 19:59:31 +0100133#undef IS_SIGNED
134#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100135#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800136#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200137#pragma GCC diagnostic pop
138#endif
Victor Stinner01076552013-10-29 19:39:52 +0100139}
140
141
142static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530143test_list_api(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 PyObject* list;
146 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000149#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000150 list = PyList_New(NLIST);
151 if (list == (PyObject*)NULL)
152 return (PyObject*)NULL;
153 /* list = range(NLIST) */
154 for (i = 0; i < NLIST; ++i) {
155 PyObject* anint = PyLong_FromLong(i);
156 if (anint == (PyObject*)NULL) {
157 Py_DECREF(list);
158 return (PyObject*)NULL;
159 }
160 PyList_SET_ITEM(list, i, anint);
161 }
162 /* list.reverse(), via PyList_Reverse() */
163 i = PyList_Reverse(list); /* should not blow up! */
164 if (i != 0) {
165 Py_DECREF(list);
166 return (PyObject*)NULL;
167 }
168 /* Check that list == range(29, -1, -1) now */
169 for (i = 0; i < NLIST; ++i) {
170 PyObject* anint = PyList_GET_ITEM(list, i);
171 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
172 PyErr_SetString(TestError,
173 "test_list_api: reverse screwed up");
174 Py_DECREF(list);
175 return (PyObject*)NULL;
176 }
177 }
178 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000179#undef NLIST
180
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200181 Py_RETURN_NONE;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000182}
183
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000184static int
185test_dict_inner(int count)
186{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 Py_ssize_t pos = 0, iterations = 0;
188 int i;
189 PyObject *dict = PyDict_New();
190 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 if (dict == NULL)
193 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 for (i = 0; i < count; i++) {
196 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200197 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200198 return -1;
199 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200200 if (PyDict_SetItem(dict, v, v) < 0) {
201 Py_DECREF(v);
202 return -1;
203 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 Py_DECREF(v);
205 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 while (PyDict_Next(dict, &pos, &k, &v)) {
208 PyObject *o;
209 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 i = PyLong_AS_LONG(v) + 1;
212 o = PyLong_FromLong(i);
213 if (o == NULL)
214 return -1;
215 if (PyDict_SetItem(dict, k, o) < 0) {
216 Py_DECREF(o);
217 return -1;
218 }
219 Py_DECREF(o);
220 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 if (iterations != count) {
225 PyErr_SetString(
226 TestError,
227 "test_dict_iteration: dict iteration went wrong ");
228 return -1;
229 } else {
230 return 0;
231 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000232}
233
234static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530235test_dict_iteration(PyObject* self, PyObject *Py_UNUSED(ignored))
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 for (i = 0; i < 200; i++) {
240 if (test_dict_inner(i) < 0) {
241 return NULL;
242 }
243 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000244
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200245 Py_RETURN_NONE;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000246}
247
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200248static PyObject*
249dict_getitem_knownhash(PyObject *self, PyObject *args)
250{
251 PyObject *mp, *key, *result;
252 Py_ssize_t hash;
253
254 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
255 &mp, &key, &hash)) {
256 return NULL;
257 }
258
259 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
260 if (result == NULL && !PyErr_Occurred()) {
261 _PyErr_SetKeyError(key);
262 return NULL;
263 }
264
265 Py_XINCREF(result);
266 return result;
267}
Tim Peters91621db2001-06-12 20:10:01 +0000268
Victor Stinner3d3f2642016-12-15 17:21:23 +0100269static PyObject*
270dict_hassplittable(PyObject *self, PyObject *arg)
271{
272 if (!PyDict_Check(arg)) {
273 PyErr_Format(PyExc_TypeError,
274 "dict_hassplittable() argument must be dict, not '%s'",
275 arg->ob_type->tp_name);
276 return NULL;
277 }
278
279 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
280}
281
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000282/* Issue #4701: Check that PyObject_Hash implicitly calls
283 * PyType_Ready if it hasn't already been called
284 */
285static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 PyVarObject_HEAD_INIT(NULL, 0)
287 "hashinheritancetester", /* Name of this type */
288 sizeof(PyObject), /* Basic object size */
289 0, /* Item size for varobject */
290 (destructor)PyObject_Del, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200291 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 0, /* tp_getattr */
293 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200294 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 0, /* tp_repr */
296 0, /* tp_as_number */
297 0, /* tp_as_sequence */
298 0, /* tp_as_mapping */
299 0, /* tp_hash */
300 0, /* tp_call */
301 0, /* tp_str */
302 PyObject_GenericGetAttr, /* tp_getattro */
303 0, /* tp_setattro */
304 0, /* tp_as_buffer */
305 Py_TPFLAGS_DEFAULT, /* tp_flags */
306 0, /* tp_doc */
307 0, /* tp_traverse */
308 0, /* tp_clear */
309 0, /* tp_richcompare */
310 0, /* tp_weaklistoffset */
311 0, /* tp_iter */
312 0, /* tp_iternext */
313 0, /* tp_methods */
314 0, /* tp_members */
315 0, /* tp_getset */
316 0, /* tp_base */
317 0, /* tp_dict */
318 0, /* tp_descr_get */
319 0, /* tp_descr_set */
320 0, /* tp_dictoffset */
321 0, /* tp_init */
322 0, /* tp_alloc */
323 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000324};
325
326static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530327test_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 PyTypeObject *type;
330 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000331 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 if (type->tp_dict != NULL)
336 /* The type has already been initialized. This probably means
337 -R is being used. */
338 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000339
340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 obj = PyObject_New(PyObject, type);
342 if (obj == NULL) {
343 PyErr_Clear();
344 PyErr_SetString(
345 TestError,
346 "test_lazy_hash_inheritance: failed to create object");
347 return NULL;
348 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 if (type->tp_dict != NULL) {
351 PyErr_SetString(
352 TestError,
353 "test_lazy_hash_inheritance: type initialised too soon");
354 Py_DECREF(obj);
355 return NULL;
356 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 hash = PyObject_Hash(obj);
359 if ((hash == -1) && PyErr_Occurred()) {
360 PyErr_Clear();
361 PyErr_SetString(
362 TestError,
363 "test_lazy_hash_inheritance: could not hash object");
364 Py_DECREF(obj);
365 return NULL;
366 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 if (type->tp_dict == NULL) {
369 PyErr_SetString(
370 TestError,
371 "test_lazy_hash_inheritance: type not initialised by hash()");
372 Py_DECREF(obj);
373 return NULL;
374 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 if (type->tp_hash != PyType_Type.tp_hash) {
377 PyErr_SetString(
378 TestError,
379 "test_lazy_hash_inheritance: unexpected hash function");
380 Py_DECREF(obj);
381 return NULL;
382 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000387}
388
389
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700390/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000391 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000392
393 Note that the meat of the test is contained in testcapi_long.h.
394 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700395 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000396 dependence on type names makes it impossible to use a parameterized
397 function. A giant macro would be even worse than this. A C++ template
398 would be perfect.
399
400 The "report an error" functions are deliberately not part of the #include
401 file: if the test fails, you can set a breakpoint in the appropriate
402 error function directly, and crawl back from there in the debugger.
403*/
404
405#define UNBIND(X) Py_DECREF(X); (X) = NULL
406
407static PyObject *
408raise_test_long_error(const char* msg)
409{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000411}
412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413#define TESTNAME test_long_api_inner
414#define TYPENAME long
415#define F_S_TO_PY PyLong_FromLong
416#define F_PY_TO_S PyLong_AsLong
417#define F_U_TO_PY PyLong_FromUnsignedLong
418#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000419
420#include "testcapi_long.h"
421
422static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530423test_long_api(PyObject* self, PyObject *Py_UNUSED(ignored))
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000426}
427
428#undef TESTNAME
429#undef TYPENAME
430#undef F_S_TO_PY
431#undef F_PY_TO_S
432#undef F_U_TO_PY
433#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000434
Tim Peters91621db2001-06-12 20:10:01 +0000435static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000436raise_test_longlong_error(const char* msg)
437{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000439}
440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700442#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443#define F_S_TO_PY PyLong_FromLongLong
444#define F_PY_TO_S PyLong_AsLongLong
445#define F_U_TO_PY PyLong_FromUnsignedLongLong
446#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000447
448#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000449
450static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000451test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000452{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000454}
455
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000456#undef TESTNAME
457#undef TYPENAME
458#undef F_S_TO_PY
459#undef F_PY_TO_S
460#undef F_U_TO_PY
461#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000462
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000463/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
464 is tested by test_long_api_inner. This test will concentrate on proper
465 handling of overflow.
466*/
467
468static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530469test_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000470{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 PyObject *num, *one, *temp;
472 long value;
473 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 /* Test that overflow is set properly for a large value. */
476 /* num is a number larger than LONG_MAX even on 64-bit platforms */
477 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
478 if (num == NULL)
479 return NULL;
480 overflow = 1234;
481 value = PyLong_AsLongAndOverflow(num, &overflow);
482 Py_DECREF(num);
483 if (value == -1 && PyErr_Occurred())
484 return NULL;
485 if (value != -1)
486 return raiseTestError("test_long_and_overflow",
487 "return value was not set to -1");
488 if (overflow != 1)
489 return raiseTestError("test_long_and_overflow",
490 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 /* Same again, with num = LONG_MAX + 1 */
493 num = PyLong_FromLong(LONG_MAX);
494 if (num == NULL)
495 return NULL;
496 one = PyLong_FromLong(1L);
497 if (one == NULL) {
498 Py_DECREF(num);
499 return NULL;
500 }
501 temp = PyNumber_Add(num, one);
502 Py_DECREF(one);
503 Py_DECREF(num);
504 num = temp;
505 if (num == NULL)
506 return NULL;
507 overflow = 0;
508 value = PyLong_AsLongAndOverflow(num, &overflow);
509 Py_DECREF(num);
510 if (value == -1 && PyErr_Occurred())
511 return NULL;
512 if (value != -1)
513 return raiseTestError("test_long_and_overflow",
514 "return value was not set to -1");
515 if (overflow != 1)
516 return raiseTestError("test_long_and_overflow",
517 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 /* Test that overflow is set properly for a large negative value. */
520 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
521 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
522 if (num == NULL)
523 return NULL;
524 overflow = 1234;
525 value = PyLong_AsLongAndOverflow(num, &overflow);
526 Py_DECREF(num);
527 if (value == -1 && PyErr_Occurred())
528 return NULL;
529 if (value != -1)
530 return raiseTestError("test_long_and_overflow",
531 "return value was not set to -1");
532 if (overflow != -1)
533 return raiseTestError("test_long_and_overflow",
534 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 /* Same again, with num = LONG_MIN - 1 */
537 num = PyLong_FromLong(LONG_MIN);
538 if (num == NULL)
539 return NULL;
540 one = PyLong_FromLong(1L);
541 if (one == NULL) {
542 Py_DECREF(num);
543 return NULL;
544 }
545 temp = PyNumber_Subtract(num, one);
546 Py_DECREF(one);
547 Py_DECREF(num);
548 num = temp;
549 if (num == NULL)
550 return NULL;
551 overflow = 0;
552 value = PyLong_AsLongAndOverflow(num, &overflow);
553 Py_DECREF(num);
554 if (value == -1 && PyErr_Occurred())
555 return NULL;
556 if (value != -1)
557 return raiseTestError("test_long_and_overflow",
558 "return value was not set to -1");
559 if (overflow != -1)
560 return raiseTestError("test_long_and_overflow",
561 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 /* Test that overflow is cleared properly for small values. */
564 num = PyLong_FromString("FF", NULL, 16);
565 if (num == NULL)
566 return NULL;
567 overflow = 1234;
568 value = PyLong_AsLongAndOverflow(num, &overflow);
569 Py_DECREF(num);
570 if (value == -1 && PyErr_Occurred())
571 return NULL;
572 if (value != 0xFF)
573 return raiseTestError("test_long_and_overflow",
574 "expected return value 0xFF");
575 if (overflow != 0)
576 return raiseTestError("test_long_and_overflow",
577 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 num = PyLong_FromString("-FF", NULL, 16);
580 if (num == NULL)
581 return NULL;
582 overflow = 0;
583 value = PyLong_AsLongAndOverflow(num, &overflow);
584 Py_DECREF(num);
585 if (value == -1 && PyErr_Occurred())
586 return NULL;
587 if (value != -0xFF)
588 return raiseTestError("test_long_and_overflow",
589 "expected return value 0xFF");
590 if (overflow != 0)
591 return raiseTestError("test_long_and_overflow",
592 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 num = PyLong_FromLong(LONG_MAX);
595 if (num == NULL)
596 return NULL;
597 overflow = 1234;
598 value = PyLong_AsLongAndOverflow(num, &overflow);
599 Py_DECREF(num);
600 if (value == -1 && PyErr_Occurred())
601 return NULL;
602 if (value != LONG_MAX)
603 return raiseTestError("test_long_and_overflow",
604 "expected return value LONG_MAX");
605 if (overflow != 0)
606 return raiseTestError("test_long_and_overflow",
607 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 num = PyLong_FromLong(LONG_MIN);
610 if (num == NULL)
611 return NULL;
612 overflow = 0;
613 value = PyLong_AsLongAndOverflow(num, &overflow);
614 Py_DECREF(num);
615 if (value == -1 && PyErr_Occurred())
616 return NULL;
617 if (value != LONG_MIN)
618 return raiseTestError("test_long_and_overflow",
619 "expected return value LONG_MIN");
620 if (overflow != 0)
621 return raiseTestError("test_long_and_overflow",
622 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000623
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200624 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000625}
626
Mark Dickinson93f562c2010-01-30 10:30:15 +0000627/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700628 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000629 concentrate on proper handling of overflow.
630*/
631
632static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530633test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson93f562c2010-01-30 10:30:15 +0000634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700636 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 /* Test that overflow is set properly for a large value. */
640 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
641 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
642 if (num == NULL)
643 return NULL;
644 overflow = 1234;
645 value = PyLong_AsLongLongAndOverflow(num, &overflow);
646 Py_DECREF(num);
647 if (value == -1 && PyErr_Occurred())
648 return NULL;
649 if (value != -1)
650 return raiseTestError("test_long_long_and_overflow",
651 "return value was not set to -1");
652 if (overflow != 1)
653 return raiseTestError("test_long_long_and_overflow",
654 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 /* Same again, with num = PY_LLONG_MAX + 1 */
657 num = PyLong_FromLongLong(PY_LLONG_MAX);
658 if (num == NULL)
659 return NULL;
660 one = PyLong_FromLong(1L);
661 if (one == NULL) {
662 Py_DECREF(num);
663 return NULL;
664 }
665 temp = PyNumber_Add(num, one);
666 Py_DECREF(one);
667 Py_DECREF(num);
668 num = temp;
669 if (num == NULL)
670 return NULL;
671 overflow = 0;
672 value = PyLong_AsLongLongAndOverflow(num, &overflow);
673 Py_DECREF(num);
674 if (value == -1 && PyErr_Occurred())
675 return NULL;
676 if (value != -1)
677 return raiseTestError("test_long_long_and_overflow",
678 "return value was not set to -1");
679 if (overflow != 1)
680 return raiseTestError("test_long_long_and_overflow",
681 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 /* Test that overflow is set properly for a large negative value. */
684 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
685 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
686 if (num == NULL)
687 return NULL;
688 overflow = 1234;
689 value = PyLong_AsLongLongAndOverflow(num, &overflow);
690 Py_DECREF(num);
691 if (value == -1 && PyErr_Occurred())
692 return NULL;
693 if (value != -1)
694 return raiseTestError("test_long_long_and_overflow",
695 "return value was not set to -1");
696 if (overflow != -1)
697 return raiseTestError("test_long_long_and_overflow",
698 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 /* Same again, with num = PY_LLONG_MIN - 1 */
701 num = PyLong_FromLongLong(PY_LLONG_MIN);
702 if (num == NULL)
703 return NULL;
704 one = PyLong_FromLong(1L);
705 if (one == NULL) {
706 Py_DECREF(num);
707 return NULL;
708 }
709 temp = PyNumber_Subtract(num, one);
710 Py_DECREF(one);
711 Py_DECREF(num);
712 num = temp;
713 if (num == NULL)
714 return NULL;
715 overflow = 0;
716 value = PyLong_AsLongLongAndOverflow(num, &overflow);
717 Py_DECREF(num);
718 if (value == -1 && PyErr_Occurred())
719 return NULL;
720 if (value != -1)
721 return raiseTestError("test_long_long_and_overflow",
722 "return value was not set to -1");
723 if (overflow != -1)
724 return raiseTestError("test_long_long_and_overflow",
725 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 /* Test that overflow is cleared properly for small values. */
728 num = PyLong_FromString("FF", NULL, 16);
729 if (num == NULL)
730 return NULL;
731 overflow = 1234;
732 value = PyLong_AsLongLongAndOverflow(num, &overflow);
733 Py_DECREF(num);
734 if (value == -1 && PyErr_Occurred())
735 return NULL;
736 if (value != 0xFF)
737 return raiseTestError("test_long_long_and_overflow",
738 "expected return value 0xFF");
739 if (overflow != 0)
740 return raiseTestError("test_long_long_and_overflow",
741 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 num = PyLong_FromString("-FF", NULL, 16);
744 if (num == NULL)
745 return NULL;
746 overflow = 0;
747 value = PyLong_AsLongLongAndOverflow(num, &overflow);
748 Py_DECREF(num);
749 if (value == -1 && PyErr_Occurred())
750 return NULL;
751 if (value != -0xFF)
752 return raiseTestError("test_long_long_and_overflow",
753 "expected return value 0xFF");
754 if (overflow != 0)
755 return raiseTestError("test_long_long_and_overflow",
756 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 num = PyLong_FromLongLong(PY_LLONG_MAX);
759 if (num == NULL)
760 return NULL;
761 overflow = 1234;
762 value = PyLong_AsLongLongAndOverflow(num, &overflow);
763 Py_DECREF(num);
764 if (value == -1 && PyErr_Occurred())
765 return NULL;
766 if (value != PY_LLONG_MAX)
767 return raiseTestError("test_long_long_and_overflow",
768 "expected return value PY_LLONG_MAX");
769 if (overflow != 0)
770 return raiseTestError("test_long_long_and_overflow",
771 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 num = PyLong_FromLongLong(PY_LLONG_MIN);
774 if (num == NULL)
775 return NULL;
776 overflow = 0;
777 value = PyLong_AsLongLongAndOverflow(num, &overflow);
778 Py_DECREF(num);
779 if (value == -1 && PyErr_Occurred())
780 return NULL;
781 if (value != PY_LLONG_MIN)
782 return raiseTestError("test_long_long_and_overflow",
783 "expected return value PY_LLONG_MIN");
784 if (overflow != 0)
785 return raiseTestError("test_long_long_and_overflow",
786 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000787
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200788 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000789}
790
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200791/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
792 non-integer arguments are handled correctly. It should be extended to
793 test overflow handling.
794 */
795
796static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530797test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200798{
799 size_t out_u;
800 Py_ssize_t out_s;
801
802 Py_INCREF(Py_None);
803
804 out_u = PyLong_AsSize_t(Py_None);
805 if (out_u != (size_t)-1 || !PyErr_Occurred())
806 return raiseTestError("test_long_as_size_t",
807 "PyLong_AsSize_t(None) didn't complain");
808 if (!PyErr_ExceptionMatches(PyExc_TypeError))
809 return raiseTestError("test_long_as_size_t",
810 "PyLong_AsSize_t(None) raised "
811 "something other than TypeError");
812 PyErr_Clear();
813
814 out_s = PyLong_AsSsize_t(Py_None);
815 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
816 return raiseTestError("test_long_as_size_t",
817 "PyLong_AsSsize_t(None) didn't complain");
818 if (!PyErr_ExceptionMatches(PyExc_TypeError))
819 return raiseTestError("test_long_as_size_t",
820 "PyLong_AsSsize_t(None) raised "
821 "something other than TypeError");
822 PyErr_Clear();
823
824 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
825 return Py_None;
826}
827
Zackery Spytzdc247652019-06-06 14:39:23 -0600828static PyObject *
829test_long_as_unsigned_long_long_mask(PyObject *self,
830 PyObject *Py_UNUSED(ignored))
831{
832 unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL);
833
834 if (res != (unsigned long long)-1 || !PyErr_Occurred()) {
835 return raiseTestError("test_long_as_unsigned_long_long_mask",
836 "PyLong_AsUnsignedLongLongMask(NULL) didn't "
837 "complain");
838 }
839 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
840 return raiseTestError("test_long_as_unsigned_long_long_mask",
841 "PyLong_AsUnsignedLongLongMask(NULL) raised "
842 "something other than SystemError");
843 }
844 PyErr_Clear();
845 Py_RETURN_NONE;
846}
847
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200848/* Test the PyLong_AsDouble API. At present this just tests that
849 non-integer arguments are handled correctly.
850 */
851
852static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530853test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200854{
855 double out;
856
857 Py_INCREF(Py_None);
858
859 out = PyLong_AsDouble(Py_None);
860 if (out != -1.0 || !PyErr_Occurred())
861 return raiseTestError("test_long_as_double",
862 "PyLong_AsDouble(None) didn't complain");
863 if (!PyErr_ExceptionMatches(PyExc_TypeError))
864 return raiseTestError("test_long_as_double",
865 "PyLong_AsDouble(None) raised "
866 "something other than TypeError");
867 PyErr_Clear();
868
869 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
870 return Py_None;
871}
872
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700873/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000874 for both long and int arguments. The test may leak a little memory if
875 it fails.
876*/
877static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530878test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersd38b1c72001-09-30 05:09:37 +0000879{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700881 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 tuple = PyTuple_New(1);
884 if (tuple == NULL)
885 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 num = PyLong_FromLong(42);
888 if (num == NULL)
889 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300894 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300896 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 if (value != 42)
898 return raiseTestError("test_L_code",
899 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 Py_DECREF(num);
902 num = PyLong_FromLong(42);
903 if (num == NULL)
904 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300909 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300911 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 if (value != 42)
913 return raiseTestError("test_L_code",
914 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200917 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000918}
919
Serhiy Storchakace412872016-05-08 23:36:44 +0300920static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300921return_none(void *unused)
922{
923 Py_RETURN_NONE;
924}
925
926static PyObject *
927raise_error(void *unused)
928{
929 PyErr_SetNone(PyExc_ValueError);
930 return NULL;
931}
932
933static int
934test_buildvalue_N_error(const char *fmt)
935{
936 PyObject *arg, *res;
937
938 arg = PyList_New(0);
939 if (arg == NULL) {
940 return -1;
941 }
942
943 Py_INCREF(arg);
944 res = Py_BuildValue(fmt, return_none, NULL, arg);
945 if (res == NULL) {
946 return -1;
947 }
948 Py_DECREF(res);
949 if (Py_REFCNT(arg) != 1) {
950 PyErr_Format(TestError, "test_buildvalue_N: "
951 "arg was not decrefed in successful "
952 "Py_BuildValue(\"%s\")", fmt);
953 return -1;
954 }
955
956 Py_INCREF(arg);
957 res = Py_BuildValue(fmt, raise_error, NULL, arg);
958 if (res != NULL || !PyErr_Occurred()) {
959 PyErr_Format(TestError, "test_buildvalue_N: "
960 "Py_BuildValue(\"%s\") didn't complain", fmt);
961 return -1;
962 }
963 PyErr_Clear();
964 if (Py_REFCNT(arg) != 1) {
965 PyErr_Format(TestError, "test_buildvalue_N: "
966 "arg was not decrefed in failed "
967 "Py_BuildValue(\"%s\")", fmt);
968 return -1;
969 }
970 Py_DECREF(arg);
971 return 0;
972}
973
974static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +0200975test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300976{
977 PyObject *arg, *res;
978
979 arg = PyList_New(0);
980 if (arg == NULL) {
981 return NULL;
982 }
983 Py_INCREF(arg);
984 res = Py_BuildValue("N", arg);
985 if (res == NULL) {
986 return NULL;
987 }
988 if (res != arg) {
989 return raiseTestError("test_buildvalue_N",
990 "Py_BuildValue(\"N\") returned wrong result");
991 }
992 if (Py_REFCNT(arg) != 2) {
993 return raiseTestError("test_buildvalue_N",
994 "arg was not decrefed in Py_BuildValue(\"N\")");
995 }
996 Py_DECREF(res);
997 Py_DECREF(arg);
998
999 if (test_buildvalue_N_error("O&N") < 0)
1000 return NULL;
1001 if (test_buildvalue_N_error("(O&N)") < 0)
1002 return NULL;
1003 if (test_buildvalue_N_error("[O&N]") < 0)
1004 return NULL;
1005 if (test_buildvalue_N_error("{O&N}") < 0)
1006 return NULL;
1007 if (test_buildvalue_N_error("{()O&(())N}") < 0)
1008 return NULL;
1009
1010 Py_RETURN_NONE;
1011}
1012
1013
1014static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +03001015get_args(PyObject *self, PyObject *args)
1016{
1017 if (args == NULL) {
1018 args = Py_None;
1019 }
1020 Py_INCREF(args);
1021 return args;
1022}
1023
1024static PyObject *
1025get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1026{
1027 if (kwargs == NULL) {
1028 kwargs = Py_None;
1029 }
1030 Py_INCREF(kwargs);
1031 return kwargs;
1032}
1033
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001034/* Test tuple argument processing */
1035static PyObject *
1036getargs_tuple(PyObject *self, PyObject *args)
1037{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 int a, b, c;
1039 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1040 return NULL;
1041 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001042}
1043
Christian Heimes380f7f22008-02-28 11:19:05 +00001044/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001045static PyObject *
1046getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001049 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1053 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1054 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1055 return NULL;
1056 return Py_BuildValue("iiiiiiiiii",
1057 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1058 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001059}
1060
Larry Hastings83a9f482012-03-20 20:06:16 +00001061/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1062static PyObject *
1063getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1064{
1065 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1066 int required = -1;
1067 int optional = -1;
1068 int keyword_only = -1;
1069
1070 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1071 &required, &optional, &keyword_only))
1072 return NULL;
1073 return Py_BuildValue("iii", required, optional, keyword_only);
1074}
1075
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001076/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1077static PyObject *
1078getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1079{
1080 static char *keywords[] = {"", "", "keyword", NULL};
1081 int required = -1;
1082 int optional = -1;
1083 int keyword = -1;
1084
1085 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1086 &required, &optional, &keyword))
1087 return NULL;
1088 return Py_BuildValue("iii", required, optional, keyword);
1089}
1090
Thomas Heller3457e4b2003-04-24 16:14:27 +00001091/* Functions to call PyArg_ParseTuple with integer format codes,
1092 and return the result.
1093*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001094static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001095getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 unsigned char value;
1098 if (!PyArg_ParseTuple(args, "b", &value))
1099 return NULL;
1100 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001101}
1102
Thomas Heller3457e4b2003-04-24 16:14:27 +00001103static PyObject *
1104getargs_B(PyObject *self, PyObject *args)
1105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 unsigned char value;
1107 if (!PyArg_ParseTuple(args, "B", &value))
1108 return NULL;
1109 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001110}
1111
1112static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001113getargs_h(PyObject *self, PyObject *args)
1114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 short value;
1116 if (!PyArg_ParseTuple(args, "h", &value))
1117 return NULL;
1118 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001119}
1120
1121static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001122getargs_H(PyObject *self, PyObject *args)
1123{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 unsigned short value;
1125 if (!PyArg_ParseTuple(args, "H", &value))
1126 return NULL;
1127 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001128}
1129
1130static PyObject *
1131getargs_I(PyObject *self, PyObject *args)
1132{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 unsigned int value;
1134 if (!PyArg_ParseTuple(args, "I", &value))
1135 return NULL;
1136 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001137}
1138
1139static PyObject *
1140getargs_k(PyObject *self, PyObject *args)
1141{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 unsigned long value;
1143 if (!PyArg_ParseTuple(args, "k", &value))
1144 return NULL;
1145 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001146}
1147
1148static PyObject *
1149getargs_i(PyObject *self, PyObject *args)
1150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 int value;
1152 if (!PyArg_ParseTuple(args, "i", &value))
1153 return NULL;
1154 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001155}
1156
Thomas Hellera4ea6032003-04-17 18:55:45 +00001157static PyObject *
1158getargs_l(PyObject *self, PyObject *args)
1159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 long value;
1161 if (!PyArg_ParseTuple(args, "l", &value))
1162 return NULL;
1163 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001164}
1165
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001166static PyObject *
1167getargs_n(PyObject *self, PyObject *args)
1168{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 Py_ssize_t value;
1170 if (!PyArg_ParseTuple(args, "n", &value))
1171 return NULL;
1172 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001173}
1174
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001175static PyObject *
1176getargs_p(PyObject *self, PyObject *args)
1177{
1178 int value;
1179 if (!PyArg_ParseTuple(args, "p", &value))
1180 return NULL;
1181 return PyLong_FromLong(value);
1182}
1183
Thomas Hellera4ea6032003-04-17 18:55:45 +00001184static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001185getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001186{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001187 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 if (!PyArg_ParseTuple(args, "L", &value))
1189 return NULL;
1190 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001191}
1192
Thomas Hellera4ea6032003-04-17 18:55:45 +00001193static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001194getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001195{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001196 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 if (!PyArg_ParseTuple(args, "K", &value))
1198 return NULL;
1199 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001200}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001201
1202/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001203 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001204static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301205test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 PyObject *tuple, *num;
1208 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 tuple = PyTuple_New(1);
1211 if (tuple == NULL)
1212 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 /* a number larger than ULONG_MAX even on 64-bit platforms */
1215 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1216 if (num == NULL)
1217 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 value = PyLong_AsUnsignedLongMask(num);
1220 if (value != ULONG_MAX)
1221 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001222 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001227 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001229 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 if (value != ULONG_MAX)
1231 return raiseTestError("test_k_code",
1232 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 Py_DECREF(num);
1235 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1236 if (num == NULL)
1237 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 value = PyLong_AsUnsignedLongMask(num);
1240 if (value != (unsigned long)-0x42)
1241 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001242 "PyLong_AsUnsignedLongMask() returned wrong "
1243 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001248 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001250 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 if (value != (unsigned long)-0x42)
1252 return raiseTestError("test_k_code",
1253 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001256 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001257}
1258
Victor Stinner06e49dd2010-06-13 18:21:50 +00001259static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001260getargs_f(PyObject *self, PyObject *args)
1261{
1262 float f;
1263 if (!PyArg_ParseTuple(args, "f", &f))
1264 return NULL;
1265 return PyFloat_FromDouble(f);
1266}
1267
1268static PyObject *
1269getargs_d(PyObject *self, PyObject *args)
1270{
1271 double d;
1272 if (!PyArg_ParseTuple(args, "d", &d))
1273 return NULL;
1274 return PyFloat_FromDouble(d);
1275}
1276
1277static PyObject *
1278getargs_D(PyObject *self, PyObject *args)
1279{
1280 Py_complex cval;
1281 if (!PyArg_ParseTuple(args, "D", &cval))
1282 return NULL;
1283 return PyComplex_FromCComplex(cval);
1284}
1285
1286static PyObject *
1287getargs_S(PyObject *self, PyObject *args)
1288{
1289 PyObject *obj;
1290 if (!PyArg_ParseTuple(args, "S", &obj))
1291 return NULL;
1292 Py_INCREF(obj);
1293 return obj;
1294}
1295
1296static PyObject *
1297getargs_Y(PyObject *self, PyObject *args)
1298{
1299 PyObject *obj;
1300 if (!PyArg_ParseTuple(args, "Y", &obj))
1301 return NULL;
1302 Py_INCREF(obj);
1303 return obj;
1304}
1305
1306static PyObject *
1307getargs_U(PyObject *self, PyObject *args)
1308{
1309 PyObject *obj;
1310 if (!PyArg_ParseTuple(args, "U", &obj))
1311 return NULL;
1312 Py_INCREF(obj);
1313 return obj;
1314}
1315
1316static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001317getargs_c(PyObject *self, PyObject *args)
1318{
1319 char c;
1320 if (!PyArg_ParseTuple(args, "c", &c))
1321 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001322 return PyLong_FromLong((unsigned char)c);
1323}
1324
1325static PyObject *
1326getargs_C(PyObject *self, PyObject *args)
1327{
1328 int c;
1329 if (!PyArg_ParseTuple(args, "C", &c))
1330 return NULL;
1331 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001332}
1333
1334static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001335getargs_s(PyObject *self, PyObject *args)
1336{
1337 char *str;
1338 if (!PyArg_ParseTuple(args, "s", &str))
1339 return NULL;
1340 return PyBytes_FromString(str);
1341}
1342
1343static PyObject *
1344getargs_s_star(PyObject *self, PyObject *args)
1345{
1346 Py_buffer buffer;
1347 PyObject *bytes;
1348 if (!PyArg_ParseTuple(args, "s*", &buffer))
1349 return NULL;
1350 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1351 PyBuffer_Release(&buffer);
1352 return bytes;
1353}
1354
1355static PyObject *
1356getargs_s_hash(PyObject *self, PyObject *args)
1357{
1358 char *str;
1359 Py_ssize_t size;
1360 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1361 return NULL;
1362 return PyBytes_FromStringAndSize(str, size);
1363}
1364
1365static PyObject *
1366getargs_z(PyObject *self, PyObject *args)
1367{
1368 char *str;
1369 if (!PyArg_ParseTuple(args, "z", &str))
1370 return NULL;
1371 if (str != NULL)
1372 return PyBytes_FromString(str);
1373 else
1374 Py_RETURN_NONE;
1375}
1376
1377static PyObject *
1378getargs_z_star(PyObject *self, PyObject *args)
1379{
1380 Py_buffer buffer;
1381 PyObject *bytes;
1382 if (!PyArg_ParseTuple(args, "z*", &buffer))
1383 return NULL;
1384 if (buffer.buf != NULL)
1385 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1386 else {
1387 Py_INCREF(Py_None);
1388 bytes = Py_None;
1389 }
1390 PyBuffer_Release(&buffer);
1391 return bytes;
1392}
1393
1394static PyObject *
1395getargs_z_hash(PyObject *self, PyObject *args)
1396{
1397 char *str;
1398 Py_ssize_t size;
1399 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1400 return NULL;
1401 if (str != NULL)
1402 return PyBytes_FromStringAndSize(str, size);
1403 else
1404 Py_RETURN_NONE;
1405}
1406
1407static PyObject *
1408getargs_y(PyObject *self, PyObject *args)
1409{
1410 char *str;
1411 if (!PyArg_ParseTuple(args, "y", &str))
1412 return NULL;
1413 return PyBytes_FromString(str);
1414}
1415
1416static PyObject *
1417getargs_y_star(PyObject *self, PyObject *args)
1418{
1419 Py_buffer buffer;
1420 PyObject *bytes;
1421 if (!PyArg_ParseTuple(args, "y*", &buffer))
1422 return NULL;
1423 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1424 PyBuffer_Release(&buffer);
1425 return bytes;
1426}
1427
1428static PyObject *
1429getargs_y_hash(PyObject *self, PyObject *args)
1430{
1431 char *str;
1432 Py_ssize_t size;
1433 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1434 return NULL;
1435 return PyBytes_FromStringAndSize(str, size);
1436}
1437
1438static PyObject *
1439getargs_u(PyObject *self, PyObject *args)
1440{
1441 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001442 if (!PyArg_ParseTuple(args, "u", &str))
1443 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001444 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001445}
1446
1447static PyObject *
1448getargs_u_hash(PyObject *self, PyObject *args)
1449{
1450 Py_UNICODE *str;
1451 Py_ssize_t size;
1452 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1453 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001454 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001455}
1456
1457static PyObject *
1458getargs_Z(PyObject *self, PyObject *args)
1459{
1460 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001461 if (!PyArg_ParseTuple(args, "Z", &str))
1462 return NULL;
1463 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001464 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001465 } else
1466 Py_RETURN_NONE;
1467}
1468
1469static PyObject *
1470getargs_Z_hash(PyObject *self, PyObject *args)
1471{
1472 Py_UNICODE *str;
1473 Py_ssize_t size;
1474 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1475 return NULL;
1476 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001477 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001478 else
1479 Py_RETURN_NONE;
1480}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001481
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001482static PyObject *
1483getargs_es(PyObject *self, PyObject *args)
1484{
1485 PyObject *arg, *result;
1486 const char *encoding = NULL;
1487 char *str;
1488
1489 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1490 return NULL;
1491 if (!PyArg_Parse(arg, "es", encoding, &str))
1492 return NULL;
1493 result = PyBytes_FromString(str);
1494 PyMem_Free(str);
1495 return result;
1496}
1497
1498static PyObject *
1499getargs_et(PyObject *self, PyObject *args)
1500{
1501 PyObject *arg, *result;
1502 const char *encoding = NULL;
1503 char *str;
1504
1505 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1506 return NULL;
1507 if (!PyArg_Parse(arg, "et", encoding, &str))
1508 return NULL;
1509 result = PyBytes_FromString(str);
1510 PyMem_Free(str);
1511 return result;
1512}
1513
1514static PyObject *
1515getargs_es_hash(PyObject *self, PyObject *args)
1516{
1517 PyObject *arg, *result;
1518 const char *encoding = NULL;
1519 PyByteArrayObject *buffer = NULL;
1520 char *str = NULL;
1521 Py_ssize_t size;
1522
1523 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1524 return NULL;
1525 if (buffer != NULL) {
1526 str = PyByteArray_AS_STRING(buffer);
1527 size = PyByteArray_GET_SIZE(buffer);
1528 }
1529 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1530 return NULL;
1531 result = PyBytes_FromStringAndSize(str, size);
1532 if (buffer == NULL)
1533 PyMem_Free(str);
1534 return result;
1535}
1536
1537static PyObject *
1538getargs_et_hash(PyObject *self, PyObject *args)
1539{
1540 PyObject *arg, *result;
1541 const char *encoding = NULL;
1542 PyByteArrayObject *buffer = NULL;
1543 char *str = NULL;
1544 Py_ssize_t size;
1545
1546 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1547 return NULL;
1548 if (buffer != NULL) {
1549 str = PyByteArray_AS_STRING(buffer);
1550 size = PyByteArray_GET_SIZE(buffer);
1551 }
1552 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1553 return NULL;
1554 result = PyBytes_FromStringAndSize(str, size);
1555 if (buffer == NULL)
1556 PyMem_Free(str);
1557 return result;
1558}
1559
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001560/* Test the s and z codes for PyArg_ParseTuple.
1561*/
1562static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301563test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001564{
1565 /* Unicode strings should be accepted */
1566 PyObject *tuple, *obj;
1567 char *value;
1568
1569 tuple = PyTuple_New(1);
1570 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001572
1573 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001575 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001577
1578 PyTuple_SET_ITEM(tuple, 0, obj);
1579
1580 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001582 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001583 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1584 return NULL;
1585 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001586
Oren Milmanba7d7362017-08-29 11:58:27 +03001587 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1588 return NULL;
1589 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001590
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001591 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001592 Py_RETURN_NONE;
1593}
1594
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001595static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001596parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001597{
Larry Hastings8f904da2012-06-22 03:56:29 -07001598 PyObject *sub_args;
1599 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001600 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001601 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001602
Larry Hastings8f904da2012-06-22 03:56:29 -07001603 Py_ssize_t i, size;
1604 char *keywords[8 + 1]; /* space for NULL at end */
1605 PyObject *o;
1606 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001607
Larry Hastings8f904da2012-06-22 03:56:29 -07001608 int result;
1609 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001610
Larry Hastings22701e82012-08-08 14:52:22 -07001611 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001612
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001613 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001614 &sub_args, &sub_kwargs,
1615 &sub_format, &sub_keywords))
1616 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001617
Larry Hastings8f904da2012-06-22 03:56:29 -07001618 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1619 PyErr_SetString(PyExc_ValueError,
1620 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1621 return NULL;
1622 }
1623
1624 memset(buffers, 0, sizeof(buffers));
1625 memset(converted, 0, sizeof(converted));
1626 memset(keywords, 0, sizeof(keywords));
1627
1628 size = PySequence_Fast_GET_SIZE(sub_keywords);
1629 if (size > 8) {
1630 PyErr_SetString(PyExc_ValueError,
1631 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1632 goto exit;
1633 }
1634
1635 for (i = 0; i < size; i++) {
1636 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1637 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1638 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001639 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001640 goto exit;
1641 }
1642 keywords[i] = PyBytes_AS_STRING(converted[i]);
1643 }
1644
1645 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1646 sub_format, keywords,
1647 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1648 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1649
1650 if (result) {
1651 return_value = Py_None;
1652 Py_INCREF(Py_None);
1653 }
1654
1655exit:
1656 size = sizeof(converted) / sizeof(converted[0]);
1657 for (i = 0; i < size; i++) {
1658 Py_XDECREF(converted[i]);
1659 }
1660 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001661}
1662
Benjamin Peterson92035012008-12-27 16:00:54 +00001663static volatile int x;
1664
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001665/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1666 of an error.
1667*/
1668static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301669test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 PyObject *tuple, *obj;
1672 Py_UNICODE *value;
1673 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1676 /* Just use the macro and check that it compiles */
1677 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 tuple = PyTuple_New(1);
1680 if (tuple == NULL)
1681 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 obj = PyUnicode_Decode("test", strlen("test"),
1684 "ascii", NULL);
1685 if (obj == NULL)
1686 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001691 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001693 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 if (value != PyUnicode_AS_UNICODE(obj))
1695 return raiseTestError("test_u_code",
1696 "u code returned wrong value for u'test'");
1697 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001698 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001700 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 if (value != PyUnicode_AS_UNICODE(obj) ||
1702 len != PyUnicode_GET_SIZE(obj))
1703 return raiseTestError("test_u_code",
1704 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001707 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001708}
1709
Guido van Rossumfb67be22007-08-29 18:38:11 +00001710/* Test Z and Z# codes for PyArg_ParseTuple */
1711static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301712test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001715 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 tuple = PyTuple_New(2);
1719 if (tuple == NULL)
1720 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 obj = PyUnicode_FromString("test");
1723 PyTuple_SET_ITEM(tuple, 0, obj);
1724 Py_INCREF(Py_None);
1725 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 /* swap values on purpose */
1728 value1 = NULL;
1729 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001732 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001734 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 if (value1 != PyUnicode_AS_UNICODE(obj))
1736 return raiseTestError("test_Z_code",
1737 "Z code returned wrong value for 'test'");
1738 if (value2 != NULL)
1739 return raiseTestError("test_Z_code",
1740 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 value1 = NULL;
1743 value2 = PyUnicode_AS_UNICODE(obj);
1744 len1 = -1;
1745 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001748 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1749 &value2, &len2))
1750 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001752 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1754 len1 != PyUnicode_GET_SIZE(obj))
1755 return raiseTestError("test_Z_code",
1756 "Z# code returned wrong values for 'test'");
1757 if (value2 != NULL ||
1758 len2 != 0)
1759 return raiseTestError("test_Z_code",
1760 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 Py_DECREF(tuple);
1763 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001764}
1765
Thomas Wouters477c8d52006-05-27 19:21:47 +00001766static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301767test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001768{
1769#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1771 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001772 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001773#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1775 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001776#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1780 if (wide == NULL)
1781 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1784 if (utf8 == NULL) {
1785 Py_DECREF(wide);
1786 return NULL;
1787 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001788
Victor Stinner8ef18872011-11-21 02:06:57 +01001789 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 Py_DECREF(wide);
1791 Py_DECREF(utf8);
1792 return raiseTestError("test_widechar",
1793 "wide string and utf8 string "
1794 "have different length");
1795 }
1796 if (PyUnicode_Compare(wide, utf8)) {
1797 Py_DECREF(wide);
1798 Py_DECREF(utf8);
1799 if (PyErr_Occurred())
1800 return NULL;
1801 return raiseTestError("test_widechar",
1802 "wide string and utf8 string "
1803 "are different");
1804 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 Py_DECREF(wide);
1807 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001808
1809#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1810 wide = PyUnicode_FromWideChar(invalid, 1);
1811 if (wide == NULL)
1812 PyErr_Clear();
1813 else
1814 return raiseTestError("test_widechar",
1815 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1816
1817 wide = PyUnicode_FromUnicode(invalid, 1);
1818 if (wide == NULL)
1819 PyErr_Clear();
1820 else
1821 return raiseTestError("test_widechar",
1822 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001823
1824 wide = PyUnicode_FromUnicode(NULL, 1);
1825 if (wide == NULL)
1826 return NULL;
1827 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001828 if (_PyUnicode_Ready(wide) < 0) {
1829 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001830 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001831 }
1832 else {
1833 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001834 return raiseTestError("test_widechar",
1835 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001836 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001837#endif
1838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001840}
1841
1842static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001843unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001844{
1845 PyObject *unicode, *result;
1846 Py_ssize_t buflen, size;
1847 wchar_t *buffer;
1848
1849 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1850 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001851 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001852 if (buffer == NULL)
1853 return PyErr_NoMemory();
1854
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001855 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001856 if (size == -1) {
1857 PyMem_Free(buffer);
1858 return NULL;
1859 }
1860
1861 if (size < buflen)
1862 buflen = size + 1;
1863 else
1864 buflen = size;
1865 result = PyUnicode_FromWideChar(buffer, buflen);
1866 PyMem_Free(buffer);
1867 if (result == NULL)
1868 return NULL;
1869
1870 return Py_BuildValue("(Nn)", result, size);
1871}
1872
1873static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001874unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001875{
1876 PyObject *unicode, *result;
1877 Py_ssize_t size;
1878 wchar_t *buffer;
1879
1880 if (!PyArg_ParseTuple(args, "U", &unicode))
1881 return NULL;
1882
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001883 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001884 if (buffer == NULL)
1885 return NULL;
1886
1887 result = PyUnicode_FromWideChar(buffer, size + 1);
1888 PyMem_Free(buffer);
1889 if (result == NULL)
1890 return NULL;
1891 return Py_BuildValue("(Nn)", result, size);
1892}
1893
1894static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001895unicode_asucs4(PyObject *self, PyObject *args)
1896{
1897 PyObject *unicode, *result;
1898 Py_UCS4 *buffer;
1899 int copy_null;
1900 Py_ssize_t str_len, buf_len;
1901
1902 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1903 return NULL;
1904 }
1905
1906 buf_len = str_len + 1;
1907 buffer = PyMem_NEW(Py_UCS4, buf_len);
1908 if (buffer == NULL) {
1909 return PyErr_NoMemory();
1910 }
1911 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1912 buffer[str_len] = 0xffffU;
1913
1914 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1915 PyMem_FREE(buffer);
1916 return NULL;
1917 }
1918
1919 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1920 PyMem_FREE(buffer);
1921 return result;
1922}
1923
1924static PyObject *
Hai Shi5623ac82019-07-20 02:56:23 -05001925unicode_asutf8(PyObject *self, PyObject *args)
1926{
1927 PyObject *unicode;
1928 const char *buffer;
1929
1930 if (!PyArg_ParseTuple(args, "U", &unicode)) {
1931 return NULL;
1932 }
1933
1934 buffer = PyUnicode_AsUTF8(unicode);
1935 if (buffer == NULL) {
1936 return NULL;
1937 }
1938
1939 return PyBytes_FromString(buffer);
1940}
1941
1942static PyObject *
1943unicode_asutf8andsize(PyObject *self, PyObject *args)
1944{
1945 PyObject *unicode, *result;
1946 const char *buffer;
1947 Py_ssize_t utf8_len;
1948
1949 if(!PyArg_ParseTuple(args, "U", &unicode)) {
1950 return NULL;
1951 }
1952
1953 buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len);
1954 if (buffer == NULL) {
1955 return NULL;
1956 }
1957
1958 result = PyBytes_FromString(buffer);
1959 if (result == NULL) {
1960 return NULL;
1961 }
1962
1963 return Py_BuildValue("(Nn)", result, utf8_len);
1964}
1965
1966static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001967unicode_findchar(PyObject *self, PyObject *args)
1968{
1969 PyObject *str;
1970 int direction;
1971 unsigned int ch;
1972 Py_ssize_t result;
1973 Py_ssize_t start, end;
1974
1975 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1976 &start, &end, &direction)) {
1977 return NULL;
1978 }
1979
1980 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
1981 if (result == -2)
1982 return NULL;
1983 else
1984 return PyLong_FromSsize_t(result);
1985}
1986
1987static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001988unicode_copycharacters(PyObject *self, PyObject *args)
1989{
1990 PyObject *from, *to, *to_copy;
1991 Py_ssize_t from_start, to_start, how_many, copied;
1992
1993 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1994 &from, &from_start, &how_many)) {
1995 return NULL;
1996 }
1997
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001998 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1999 PyUnicode_MAX_CHAR_VALUE(to)))) {
2000 return NULL;
2001 }
2002 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
2003 Py_DECREF(to_copy);
2004 return NULL;
2005 }
2006
2007 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
2008 from_start, how_many)) < 0) {
2009 Py_DECREF(to_copy);
2010 return NULL;
2011 }
2012
2013 return Py_BuildValue("(Nn)", to_copy, copied);
2014}
2015
2016static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01002017unicode_encodedecimal(PyObject *self, PyObject *args)
2018{
2019 Py_UNICODE *unicode;
2020 Py_ssize_t length;
2021 char *errors = NULL;
2022 PyObject *decimal;
2023 Py_ssize_t decimal_length, new_length;
2024 int res;
2025
2026 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
2027 return NULL;
2028
2029 decimal_length = length * 7; /* len('&#8364;') */
2030 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
2031 if (decimal == NULL)
2032 return NULL;
2033
2034 res = PyUnicode_EncodeDecimal(unicode, length,
2035 PyBytes_AS_STRING(decimal),
2036 errors);
2037 if (res < 0) {
2038 Py_DECREF(decimal);
2039 return NULL;
2040 }
2041
2042 new_length = strlen(PyBytes_AS_STRING(decimal));
2043 assert(new_length <= decimal_length);
2044 res = _PyBytes_Resize(&decimal, new_length);
2045 if (res < 0)
2046 return NULL;
2047
2048 return decimal;
2049}
2050
2051static PyObject *
2052unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
2053{
2054 Py_UNICODE *unicode;
2055 Py_ssize_t length;
2056 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
2057 return NULL;
2058 return PyUnicode_TransformDecimalToASCII(unicode, length);
2059}
2060
2061static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002062unicode_legacy_string(PyObject *self, PyObject *args)
2063{
2064 Py_UNICODE *data;
2065 Py_ssize_t len;
2066 PyObject *u;
2067
2068 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2069 return NULL;
2070
2071 u = PyUnicode_FromUnicode(NULL, len);
2072 if (u == NULL)
2073 return NULL;
2074
2075 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2076
2077 if (len > 0) { /* The empty string is always ready. */
2078 assert(!PyUnicode_IS_READY(u));
2079 }
2080
2081 return u;
2082}
2083
2084static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002085getargs_w_star(PyObject *self, PyObject *args)
2086{
2087 Py_buffer buffer;
2088 PyObject *result;
2089 char *str;
2090
2091 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2092 return NULL;
2093
2094 if (2 <= buffer.len) {
2095 str = buffer.buf;
2096 str[0] = '[';
2097 str[buffer.len-1] = ']';
2098 }
2099
2100 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2101 PyBuffer_Release(&buffer);
2102 return result;
2103}
2104
2105
2106static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302107test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 /* Test that formats can begin with '|'. See issue #4720. */
2110 PyObject *tuple, *dict = NULL;
2111 static char *kwlist[] = {NULL};
2112 int result;
2113 tuple = PyTuple_New(0);
2114 if (!tuple)
2115 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002116 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002118 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 dict = PyDict_New();
2120 if (!dict)
2121 goto done;
2122 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002123 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 Py_DECREF(tuple);
2125 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002126 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002127 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002128 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 else {
2130 Py_RETURN_NONE;
2131 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002132}
2133
2134static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002135codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 const char *encoding, *errors = NULL;
2138 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2139 &encoding, &errors))
2140 return NULL;
2141 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002142}
2143
Thomas Wouters477c8d52006-05-27 19:21:47 +00002144static PyObject *
2145codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 const char *encoding, *errors = NULL;
2148 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2149 &encoding, &errors))
2150 return NULL;
2151 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002152}
2153
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002154
Tim Peters5b8132f2003-01-31 15:52:05 +00002155/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002156static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302157test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 struct triple {
2160 long input;
2161 size_t nbits;
2162 int sign;
2163 } testcases[] = {{0, 0, 0},
2164 {1L, 1, 1},
2165 {-1L, 1, -1},
2166 {2L, 2, 1},
2167 {-2L, 2, -1},
2168 {3L, 2, 1},
2169 {-3L, 2, -1},
2170 {4L, 3, 1},
2171 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002172 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 {-0x7fffL, 15, -1},
2174 {0xffffL, 16, 1},
2175 {-0xffffL, 16, -1},
2176 {0xfffffffL, 28, 1},
2177 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002178 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002179
Victor Stinner63941882011-09-29 00:42:28 +02002180 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002181 size_t nbits;
2182 int sign;
2183 PyObject *plong;
2184
2185 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002186 if (plong == NULL)
2187 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002188 nbits = _PyLong_NumBits(plong);
2189 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 Py_DECREF(plong);
2192 if (nbits != testcases[i].nbits)
2193 return raiseTestError("test_long_numbits",
2194 "wrong result for _PyLong_NumBits");
2195 if (sign != testcases[i].sign)
2196 return raiseTestError("test_long_numbits",
2197 "wrong result for _PyLong_Sign");
2198 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002199 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002200}
2201
Thomas Heller519a0422007-11-15 20:48:54 +00002202/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002203
2204static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302205test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002207 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2208 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2209 Py_XDECREF(o1);
2210 Py_XDECREF(o2);
2211 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002212}
2213
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002214static PyObject *
2215raise_exception(PyObject *self, PyObject *args)
2216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 PyObject *exc;
2218 PyObject *exc_args, *v;
2219 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2222 &exc, &num_args))
2223 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002225 exc_args = PyTuple_New(num_args);
2226 if (exc_args == NULL)
2227 return NULL;
2228 for (i = 0; i < num_args; ++i) {
2229 v = PyLong_FromLong(i);
2230 if (v == NULL) {
2231 Py_DECREF(exc_args);
2232 return NULL;
2233 }
2234 PyTuple_SET_ITEM(exc_args, i, v);
2235 }
2236 PyErr_SetObject(exc, exc_args);
2237 Py_DECREF(exc_args);
2238 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002239}
Tim Peters91621db2001-06-12 20:10:01 +00002240
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002241static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002242set_errno(PyObject *self, PyObject *args)
2243{
2244 int new_errno;
2245
2246 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2247 return NULL;
2248
2249 errno = new_errno;
2250 Py_RETURN_NONE;
2251}
2252
2253static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002254test_set_exc_info(PyObject *self, PyObject *args)
2255{
2256 PyObject *orig_exc;
2257 PyObject *new_type, *new_value, *new_tb;
2258 PyObject *type, *value, *tb;
2259 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2260 &new_type, &new_value, &new_tb))
2261 return NULL;
2262
2263 PyErr_GetExcInfo(&type, &value, &tb);
2264
2265 Py_INCREF(new_type);
2266 Py_INCREF(new_value);
2267 Py_INCREF(new_tb);
2268 PyErr_SetExcInfo(new_type, new_value, new_tb);
2269
2270 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2271 Py_XDECREF(type);
2272 Py_XDECREF(value);
2273 Py_XDECREF(tb);
2274 return orig_exc;
2275}
Benjamin Peterson16323982010-02-03 01:13:41 +00002276
2277static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002278
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002279static PyObject *
2280test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 if (PyDateTimeAPI) {
2282 if (test_run_counter) {
2283 /* Probably regrtest.py -R */
2284 Py_RETURN_NONE;
2285 }
2286 else {
2287 PyErr_SetString(PyExc_AssertionError,
2288 "PyDateTime_CAPI somehow initialized");
2289 return NULL;
2290 }
2291 }
2292 test_run_counter++;
2293 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 if (PyDateTimeAPI)
2296 Py_RETURN_NONE;
2297 else
2298 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002299}
2300
Paul Ganssle04af5b12018-01-24 17:29:30 -05002301/* Functions exposing the C API type checking for testing */
2302#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2303 PyObject *obj; \
2304 int exact = 0; \
2305 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2306 return NULL; \
2307 } \
2308 int rv = exact?exact_method(obj):check_method(obj); \
2309 if (rv) { \
2310 Py_RETURN_TRUE; \
2311 } else { \
2312 Py_RETURN_FALSE; \
2313 }
2314
2315static PyObject *
2316datetime_check_date(PyObject *self, PyObject *args) {
2317 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2318}
2319
2320static PyObject *
2321datetime_check_time(PyObject *self, PyObject *args) {
2322 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2323}
2324
2325static PyObject *
2326datetime_check_datetime(PyObject *self, PyObject *args) {
2327 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2328}
2329
2330static PyObject *
2331datetime_check_delta(PyObject *self, PyObject *args) {
2332 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2333}
2334
2335static PyObject *
2336datetime_check_tzinfo(PyObject *self, PyObject *args) {
2337 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2338}
2339
2340
2341/* Makes three variations on timezone representing UTC-5:
2342 1. timezone with offset and name from PyDateTimeAPI
2343 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2344 3. timezone with offset (no name) from PyTimeZone_FromOffset
2345*/
2346static PyObject *
2347make_timezones_capi(PyObject *self, PyObject *args) {
2348 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2349 PyObject *name = PyUnicode_FromString("EST");
2350
2351 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2352 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2353 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2354
2355 Py_DecRef(offset);
2356 Py_DecRef(name);
2357
2358 PyObject *rv = PyTuple_New(3);
2359
2360 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2361 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2362 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2363
2364 return rv;
2365}
2366
2367static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002368get_timezones_offset_zero(PyObject *self, PyObject *args) {
2369 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2370 PyObject *name = PyUnicode_FromString("");
2371
2372 // These two should return the UTC singleton
2373 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2374 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2375
2376 // This one will return +00:00 zone, but not the UTC singleton
2377 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2378
2379 Py_DecRef(offset);
2380 Py_DecRef(name);
2381
2382 PyObject *rv = PyTuple_New(3);
2383 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2384 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2385 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2386
2387 return rv;
2388}
2389
2390static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002391get_timezone_utc_capi(PyObject* self, PyObject *args) {
2392 int macro = 0;
2393 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2394 return NULL;
2395 }
2396 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002397 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002398 return PyDateTime_TimeZone_UTC;
2399 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002400 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002401 return PyDateTimeAPI->TimeZone_UTC;
2402 }
2403}
2404
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002405static PyObject *
Edison A98ff4d52019-05-17 13:28:42 -07002406get_date_fromdate(PyObject *self, PyObject *args)
2407{
2408 PyObject *rv = NULL;
2409 int macro;
2410 int year, month, day;
2411
2412 if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2413 return NULL;
2414 }
2415
2416 if (macro) {
2417 rv = PyDate_FromDate(year, month, day);
2418 }
2419 else {
2420 rv = PyDateTimeAPI->Date_FromDate(
2421 year, month, day,
2422 PyDateTimeAPI->DateType);
2423 }
2424 return rv;
2425}
2426
2427static PyObject *
2428get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2429{
2430 PyObject *rv = NULL;
2431 int macro;
2432 int year, month, day;
2433 int hour, minute, second, microsecond;
2434
2435 if (!PyArg_ParseTuple(args, "piiiiiii",
2436 &macro,
2437 &year, &month, &day,
2438 &hour, &minute, &second, &microsecond)) {
2439 return NULL;
2440 }
2441
2442 if (macro) {
2443 rv = PyDateTime_FromDateAndTime(
2444 year, month, day,
2445 hour, minute, second, microsecond);
2446 }
2447 else {
2448 rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2449 year, month, day,
2450 hour, minute, second, microsecond,
2451 Py_None,
2452 PyDateTimeAPI->DateTimeType);
2453 }
2454 return rv;
2455}
2456
2457static PyObject *
2458get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2459{
2460 PyObject *rv = NULL;
2461 int macro;
2462 int year, month, day;
2463 int hour, minute, second, microsecond, fold;
2464
2465 if (!PyArg_ParseTuple(args, "piiiiiiii",
2466 &macro,
2467 &year, &month, &day,
2468 &hour, &minute, &second, &microsecond,
2469 &fold)) {
2470 return NULL;
2471 }
2472
2473 if (macro) {
2474 rv = PyDateTime_FromDateAndTimeAndFold(
2475 year, month, day,
2476 hour, minute, second, microsecond,
2477 fold);
2478 }
2479 else {
2480 rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2481 year, month, day,
2482 hour, minute, second, microsecond,
2483 Py_None,
2484 fold,
2485 PyDateTimeAPI->DateTimeType);
2486 }
2487 return rv;
2488}
2489
2490static PyObject *
2491get_time_fromtime(PyObject *self, PyObject *args)
2492{
2493 PyObject *rv = NULL;
2494 int macro;
2495 int hour, minute, second, microsecond;
2496
2497 if (!PyArg_ParseTuple(args, "piiii",
2498 &macro,
2499 &hour, &minute, &second, &microsecond)) {
2500 return NULL;
2501 }
2502
2503 if (macro) {
2504 rv = PyTime_FromTime(hour, minute, second, microsecond);
2505 }
2506 else {
2507 rv = PyDateTimeAPI->Time_FromTime(
2508 hour, minute, second, microsecond,
2509 Py_None,
2510 PyDateTimeAPI->TimeType);
2511 }
2512 return rv;
2513}
2514
2515static PyObject *
2516get_time_fromtimeandfold(PyObject *self, PyObject *args)
2517{
2518 PyObject *rv = NULL;
2519 int macro;
2520 int hour, minute, second, microsecond, fold;
2521
2522 if (!PyArg_ParseTuple(args, "piiiii",
2523 &macro,
2524 &hour, &minute, &second, &microsecond,
2525 &fold)) {
2526 return NULL;
2527 }
2528
2529 if (macro) {
2530 rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2531 }
2532 else {
2533 rv = PyDateTimeAPI->Time_FromTimeAndFold(
2534 hour, minute, second, microsecond,
2535 Py_None,
2536 fold,
2537 PyDateTimeAPI->TimeType);
2538 }
2539 return rv;
2540}
2541
2542static PyObject *
2543get_delta_fromdsu(PyObject *self, PyObject *args)
2544{
2545 PyObject *rv = NULL;
2546 int macro;
2547 int days, seconds, microseconds;
2548
2549 if (!PyArg_ParseTuple(args, "piii",
2550 &macro,
2551 &days, &seconds, &microseconds)) {
2552 return NULL;
2553 }
2554
2555 if (macro) {
2556 rv = PyDelta_FromDSU(days, seconds, microseconds);
2557 }
2558 else {
2559 rv = PyDateTimeAPI->Delta_FromDelta(
2560 days, seconds, microseconds, 1,
2561 PyDateTimeAPI->DeltaType);
2562 }
2563
2564 return rv;
2565}
2566
2567static PyObject *
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002568get_date_fromtimestamp(PyObject* self, PyObject *args)
2569{
2570 PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2571 int macro = 0;
2572
2573 if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2574 return NULL;
2575 }
2576
2577 // Construct the argument tuple
2578 if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2579 return NULL;
2580 }
2581
2582 // Pass along to the API function
2583 if (macro) {
2584 rv = PyDate_FromTimestamp(tsargs);
2585 }
2586 else {
2587 rv = PyDateTimeAPI->Date_FromTimestamp(
2588 (PyObject *)PyDateTimeAPI->DateType, tsargs
2589 );
2590 }
2591
2592 Py_DECREF(tsargs);
2593 return rv;
2594}
2595
2596static PyObject *
2597get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2598{
2599 int macro = 0;
2600 int usetz = 0;
2601 PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2602 if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2603 return NULL;
2604 }
2605
2606 // Construct the argument tuple
2607 if (usetz) {
2608 tsargs = PyTuple_Pack(2, ts, tzinfo);
2609 }
2610 else {
2611 tsargs = PyTuple_Pack(1, ts);
2612 }
2613
2614 if (tsargs == NULL) {
2615 return NULL;
2616 }
2617
2618 // Pass along to the API function
2619 if (macro) {
2620 rv = PyDateTime_FromTimestamp(tsargs);
2621 }
2622 else {
2623 rv = PyDateTimeAPI->DateTime_FromTimestamp(
2624 (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2625 );
2626 }
2627
2628 Py_DECREF(tsargs);
2629 return rv;
2630}
2631
Benjamin Peterson16323982010-02-03 01:13:41 +00002632
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002633/* test_thread_state spawns a thread of its own, and that thread releases
2634 * `thread_done` when it's finished. The driver code has to know when the
2635 * thread finishes, because the thread uses a PyObject (the callable) that
2636 * may go away when the driver finishes. The former lack of this explicit
2637 * synchronization caused rare segfaults, so rare that they were seen only
2638 * on a Mac buildbot (although they were possible on any box).
2639 */
2640static PyThread_type_lock thread_done = NULL;
2641
Benjamin Petersona786b022008-08-25 21:05:21 +00002642static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002643_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002645 PyObject *rc;
2646 int success;
2647 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002648 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 success = (rc != NULL);
2650 Py_XDECREF(rc);
2651 PyGILState_Release(s);
2652 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002653}
2654
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002655/* Same thing, but releases `thread_done` when it returns. This variant
2656 * should be called only from threads spawned by test_thread_state().
2657 */
2658static void
2659_make_call_from_thread(void *callable)
2660{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 _make_call(callable);
2662 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002663}
2664
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002665static PyObject *
2666test_thread_state(PyObject *self, PyObject *args)
2667{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002668 PyObject *fn;
2669 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2672 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 if (!PyCallable_Check(fn)) {
2675 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2676 fn->ob_type->tp_name);
2677 return NULL;
2678 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 /* Ensure Python is set up for threading */
2681 PyEval_InitThreads();
2682 thread_done = PyThread_allocate_lock();
2683 if (thread_done == NULL)
2684 return PyErr_NoMemory();
2685 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 /* Start a new thread with our callback. */
2688 PyThread_start_new_thread(_make_call_from_thread, fn);
2689 /* Make the callback with the thread lock held by this thread */
2690 success &= _make_call(fn);
2691 /* Do it all again, but this time with the thread-lock released */
2692 Py_BEGIN_ALLOW_THREADS
2693 success &= _make_call(fn);
2694 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2695 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 /* And once more with and without a thread
2698 XXX - should use a lock and work out exactly what we are trying
2699 to test <wink>
2700 */
2701 Py_BEGIN_ALLOW_THREADS
2702 PyThread_start_new_thread(_make_call_from_thread, fn);
2703 success &= _make_call(fn);
2704 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2705 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 /* Release lock we acquired above. This is required on HP-UX. */
2708 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 PyThread_free_lock(thread_done);
2711 if (!success)
2712 return NULL;
2713 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002714}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002715
2716/* test Py_AddPendingCalls using threads */
2717static int _pending_callback(void *arg)
2718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 /* we assume the argument is callable object to which we own a reference */
2720 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002721 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 Py_DECREF(callable);
2723 Py_XDECREF(r);
2724 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002725}
2726
2727/* The following requests n callbacks to _pending_callback. It can be
2728 * run from any python thread.
2729 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07002730static PyObject *
2731pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 PyObject *callable;
2734 int r;
2735 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2736 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 /* create the reference for the callbackwhile we hold the lock */
2739 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 Py_BEGIN_ALLOW_THREADS
2742 r = Py_AddPendingCall(&_pending_callback, callable);
2743 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 if (r<0) {
2746 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002747 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002749 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002750}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002751
Neal Norwitzb0d26332007-08-25 00:49:05 +00002752/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002753static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002754test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 PyObject *result;
2757 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002758
Alexander Belopolskye239d232010-12-08 23:31:48 +00002759#define CHECK_1_FORMAT(FORMAT, TYPE) \
2760 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2761 if (result == NULL) \
2762 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002763 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002764 msg = FORMAT " failed at 1"; \
2765 goto Fail; \
2766 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 CHECK_1_FORMAT("%d", int);
2770 CHECK_1_FORMAT("%ld", long);
2771 /* The z width modifier was added in Python 2.5. */
2772 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 /* The u type code was added in Python 2.5. */
2775 CHECK_1_FORMAT("%u", unsigned int);
2776 CHECK_1_FORMAT("%lu", unsigned long);
2777 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002780 CHECK_1_FORMAT("%llu", unsigned long long);
2781 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002784
2785 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 Py_XDECREF(result);
2787 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002788
2789#undef CHECK_1_FORMAT
2790}
2791
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002792
2793static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302794test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2796 int result;
2797 if (py_s == NULL)
2798 return NULL;
2799 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2800 Py_DECREF(py_s);
2801 if (!result) {
2802 PyErr_SetString(TestError, "Python string ending in NULL "
2803 "should not compare equal to c string.");
2804 return NULL;
2805 }
2806 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002807}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002808
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002809/* This is here to provide a docstring for test_descr. */
2810static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302811test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002812{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002813 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002814}
2815
Mark Dickinson725bfd82009-05-03 20:33:40 +00002816/* Test PyOS_string_to_double. */
2817static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302818test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002820 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822#define CHECK_STRING(STR, expected) \
2823 result = PyOS_string_to_double(STR, NULL, NULL); \
2824 if (result == -1.0 && PyErr_Occurred()) \
2825 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002826 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 msg = "conversion of " STR " to float failed"; \
2828 goto fail; \
2829 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831#define CHECK_INVALID(STR) \
2832 result = PyOS_string_to_double(STR, NULL, NULL); \
2833 if (result == -1.0 && PyErr_Occurred()) { \
2834 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2835 PyErr_Clear(); \
2836 else \
2837 return NULL; \
2838 } \
2839 else { \
2840 msg = "conversion of " STR " didn't raise ValueError"; \
2841 goto fail; \
2842 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 CHECK_STRING("0.1", 0.1);
2845 CHECK_STRING("1.234", 1.234);
2846 CHECK_STRING("-1.35", -1.35);
2847 CHECK_STRING(".1e01", 1.0);
2848 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 CHECK_INVALID(" 0.1");
2851 CHECK_INVALID("\t\n-3");
2852 CHECK_INVALID(".123 ");
2853 CHECK_INVALID("3\n");
2854 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002856 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002857 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002858 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002859#undef CHECK_STRING
2860#undef CHECK_INVALID
2861}
2862
2863
Benjamin Petersonb173f782009-05-05 22:31:58 +00002864/* Coverage testing of capsule objects. */
2865
2866static const char *capsule_name = "capsule name";
2867static char *capsule_pointer = "capsule pointer";
2868static char *capsule_context = "capsule context";
2869static const char *capsule_error = NULL;
2870static int
2871capsule_destructor_call_count = 0;
2872
2873static void
2874capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002875 capsule_destructor_call_count++;
2876 if (PyCapsule_GetContext(o) != capsule_context) {
2877 capsule_error = "context did not match in destructor!";
2878 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2879 capsule_error = "destructor did not match in destructor! (woah!)";
2880 } else if (PyCapsule_GetName(o) != capsule_name) {
2881 capsule_error = "name did not match in destructor!";
2882 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2883 capsule_error = "pointer did not match in destructor!";
2884 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002885}
2886
2887typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002888 char *name;
2889 char *module;
2890 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002891} known_capsule;
2892
2893static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002894test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00002895{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002896 PyObject *object;
2897 const char *error = NULL;
2898 void *pointer;
2899 void *pointer2;
2900 known_capsule known_capsules[] = {
2901 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2902 KNOWN_CAPSULE("_socket", "CAPI"),
2903 KNOWN_CAPSULE("_curses", "_C_API"),
2904 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2905 { NULL, NULL },
2906 };
2907 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002908
2909#define FAIL(x) { error = (x); goto exit; }
2910
2911#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002912 if (capsule_error) { \
2913 FAIL(capsule_error); \
2914 } \
2915 else if (!capsule_destructor_call_count) { \
2916 FAIL("destructor not called!"); \
2917 } \
2918 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002920 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2921 PyCapsule_SetContext(object, capsule_context);
2922 capsule_destructor(object);
2923 CHECK_DESTRUCTOR;
2924 Py_DECREF(object);
2925 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002927 object = PyCapsule_New(known, "ignored", NULL);
2928 PyCapsule_SetPointer(object, capsule_pointer);
2929 PyCapsule_SetName(object, capsule_name);
2930 PyCapsule_SetDestructor(object, capsule_destructor);
2931 PyCapsule_SetContext(object, capsule_context);
2932 capsule_destructor(object);
2933 CHECK_DESTRUCTOR;
2934 /* intentionally access using the wrong name */
2935 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2936 if (!PyErr_Occurred()) {
2937 FAIL("PyCapsule_GetPointer should have failed but did not!");
2938 }
2939 PyErr_Clear();
2940 if (pointer2) {
2941 if (pointer2 == capsule_pointer) {
2942 FAIL("PyCapsule_GetPointer should not have"
2943 " returned the internal pointer!");
2944 } else {
2945 FAIL("PyCapsule_GetPointer should have "
2946 "returned NULL pointer but did not!");
2947 }
2948 }
2949 PyCapsule_SetDestructor(object, NULL);
2950 Py_DECREF(object);
2951 if (capsule_destructor_call_count) {
2952 FAIL("destructor called when it should not have been!");
2953 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002955 for (known = &known_capsules[0]; known->module != NULL; known++) {
2956 /* yeah, ordinarily I wouldn't do this either,
2957 but it's fine for this test harness.
2958 */
2959 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002960#undef FAIL
2961#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002962 { \
2963 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2964 x, known->module, known->attribute); \
2965 error = buffer; \
2966 goto exit; \
2967 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 PyObject *module = PyImport_ImportModule(known->module);
2970 if (module) {
2971 pointer = PyCapsule_Import(known->name, 0);
2972 if (!pointer) {
2973 Py_DECREF(module);
2974 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2975 }
2976 object = PyObject_GetAttrString(module, known->attribute);
2977 if (!object) {
2978 Py_DECREF(module);
2979 return NULL;
2980 }
2981 pointer2 = PyCapsule_GetPointer(object,
2982 "weebles wobble but they don't fall down");
2983 if (!PyErr_Occurred()) {
2984 Py_DECREF(object);
2985 Py_DECREF(module);
2986 FAIL("PyCapsule_GetPointer should have failed but did not!");
2987 }
2988 PyErr_Clear();
2989 if (pointer2) {
2990 Py_DECREF(module);
2991 Py_DECREF(object);
2992 if (pointer2 == pointer) {
2993 FAIL("PyCapsule_GetPointer should not have"
2994 " returned its internal pointer!");
2995 } else {
2996 FAIL("PyCapsule_GetPointer should have"
2997 " returned NULL pointer but did not!");
2998 }
2999 }
3000 Py_DECREF(object);
3001 Py_DECREF(module);
3002 }
3003 else
3004 PyErr_Clear();
3005 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003006
3007 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003008 if (error) {
3009 return raiseTestError("test_capsule", error);
3010 }
3011 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003012#undef FAIL
3013}
3014
Guido van Rossumddefaf32007-01-14 03:31:43 +00003015#ifdef HAVE_GETTIMEOFDAY
3016/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00003017static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 e->tv_sec -= s->tv_sec;
3020 e->tv_usec -= s->tv_usec;
3021 if (e->tv_usec < 0) {
3022 e->tv_sec -=1;
3023 e->tv_usec += 1000000;
3024 }
3025 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003026}
3027
3028static PyObject *
3029profile_int(PyObject *self, PyObject* args)
3030{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031 int i, k;
3032 struct timeval start, stop;
3033 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035 /* Test 1: Allocate and immediately deallocate
3036 many small integers */
3037 gettimeofday(&start, NULL);
3038 for(k=0; k < 20000; k++)
3039 for(i=0; i < 1000; i++) {
3040 single = PyLong_FromLong(i);
3041 Py_DECREF(single);
3042 }
3043 gettimeofday(&stop, NULL);
3044 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003046 /* Test 2: Allocate and immediately deallocate
3047 many large integers */
3048 gettimeofday(&start, NULL);
3049 for(k=0; k < 20000; k++)
3050 for(i=0; i < 1000; i++) {
3051 single = PyLong_FromLong(i+1000000);
3052 Py_DECREF(single);
3053 }
3054 gettimeofday(&stop, NULL);
3055 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003057 /* Test 3: Allocate a few integers, then release
3058 them all simultaneously. */
3059 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02003060 if (multiple == NULL)
3061 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003062 gettimeofday(&start, NULL);
3063 for(k=0; k < 20000; k++) {
3064 for(i=0; i < 1000; i++) {
3065 multiple[i] = PyLong_FromLong(i+1000000);
3066 }
3067 for(i=0; i < 1000; i++) {
3068 Py_DECREF(multiple[i]);
3069 }
3070 }
3071 gettimeofday(&stop, NULL);
3072 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003073 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003075 /* Test 4: Allocate many integers, then release
3076 them all simultaneously. */
3077 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003078 if (multiple == NULL)
3079 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 gettimeofday(&start, NULL);
3081 for(k=0; k < 20; k++) {
3082 for(i=0; i < 1000000; i++) {
3083 multiple[i] = PyLong_FromLong(i+1000000);
3084 }
3085 for(i=0; i < 1000000; i++) {
3086 Py_DECREF(multiple[i]);
3087 }
3088 }
3089 gettimeofday(&stop, NULL);
3090 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003091 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 /* Test 5: Allocate many integers < 32000 */
3094 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003095 if (multiple == NULL)
3096 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 gettimeofday(&start, NULL);
3098 for(k=0; k < 10; k++) {
3099 for(i=0; i < 1000000; i++) {
3100 multiple[i] = PyLong_FromLong(i+1000);
3101 }
3102 for(i=0; i < 1000000; i++) {
3103 Py_DECREF(multiple[i]);
3104 }
3105 }
3106 gettimeofday(&stop, NULL);
3107 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003108 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003110 /* Test 6: Perform small int addition */
3111 op1 = PyLong_FromLong(1);
3112 gettimeofday(&start, NULL);
3113 for(i=0; i < 10000000; i++) {
3114 result = PyNumber_Add(op1, op1);
3115 Py_DECREF(result);
3116 }
3117 gettimeofday(&stop, NULL);
3118 Py_DECREF(op1);
3119 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003121 /* Test 7: Perform medium int addition */
3122 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003123 if (op1 == NULL)
3124 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125 gettimeofday(&start, NULL);
3126 for(i=0; i < 10000000; i++) {
3127 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003128 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003129 }
3130 gettimeofday(&stop, NULL);
3131 Py_DECREF(op1);
3132 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003133
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003134 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003135}
3136#endif
3137
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003138/* To test the format of tracebacks as printed out. */
3139static PyObject *
3140traceback_print(PyObject *self, PyObject *args)
3141{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003142 PyObject *file;
3143 PyObject *traceback;
3144 int result;
3145
3146 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3147 &traceback, &file))
3148 return NULL;
3149
3150 result = PyTraceBack_Print(traceback, file);
3151 if (result < 0)
3152 return NULL;
3153 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003154}
3155
Benjamin Petersone6528212008-07-15 15:32:09 +00003156/* To test the format of exceptions as printed out. */
3157static PyObject *
3158exception_print(PyObject *self, PyObject *args)
3159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003160 PyObject *value;
3161 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003163 if (!PyArg_ParseTuple(args, "O:exception_print",
3164 &value))
3165 return NULL;
3166 if (!PyExceptionInstance_Check(value)) {
3167 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3168 return NULL;
3169 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003171 tb = PyException_GetTraceback(value);
3172 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3173 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003175 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003176}
3177
3178
3179
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003180
3181/* reliably raise a MemoryError */
3182static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303183raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003185 PyErr_NoMemory();
3186 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003187}
3188
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003189/* Issue 6012 */
3190static PyObject *str1, *str2;
3191static int
3192failing_converter(PyObject *obj, void *arg)
3193{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 /* Clone str1, then let the conversion fail. */
3195 assert(str1);
3196 str2 = str1;
3197 Py_INCREF(str2);
3198 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003199}
3200static PyObject*
3201argparsing(PyObject *o, PyObject *args)
3202{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003203 PyObject *res;
3204 str1 = str2 = NULL;
3205 if (!PyArg_ParseTuple(args, "O&O&",
3206 PyUnicode_FSConverter, &str1,
3207 failing_converter, &str2)) {
3208 if (!str2)
3209 /* argument converter not called? */
3210 return NULL;
3211 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003212 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 Py_DECREF(str2);
3214 PyErr_Clear();
3215 return res;
3216 }
3217 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003218}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003219
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003220/* To test that the result of PyCode_NewEmpty has the right members. */
3221static PyObject *
3222code_newempty(PyObject *self, PyObject *args)
3223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003224 const char *filename;
3225 const char *funcname;
3226 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3229 &filename, &funcname, &firstlineno))
3230 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003232 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003233}
3234
Georg Brandl1e28a272009-12-28 08:41:01 +00003235/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3236 Run via Lib/test/test_exceptions.py */
3237static PyObject *
3238make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3239{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 const char *name;
3241 const char *doc = NULL;
3242 PyObject *base = NULL;
3243 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3248 "s|sOO:make_exception_with_doc", kwlist,
3249 &name, &doc, &base, &dict))
3250 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003253}
3254
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003255static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303256make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003257{
3258 Py_buffer info;
3259 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3260 return NULL;
3261 return PyMemoryView_FromBuffer(&info);
3262}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003263
Stefan Krah7213fcc2015-02-01 16:19:23 +01003264static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003265test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003266{
3267 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3268 int init[5] = {0, 1, 2, 3, 4};
3269 Py_ssize_t itemsize = sizeof(int);
3270 Py_ssize_t shape = 5;
3271 Py_ssize_t strides = 2 * itemsize;
3272 Py_buffer view = {
3273 data,
3274 NULL,
3275 5 * itemsize,
3276 itemsize,
3277 1,
3278 1,
3279 NULL,
3280 &shape,
3281 &strides,
3282 NULL,
3283 NULL
3284 };
3285 int *ptr;
3286 int i;
3287
3288 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3289 ptr = view.buf;
3290 for (i = 0; i < 5; i++) {
3291 if (ptr[2*i] != i) {
3292 PyErr_SetString(TestError,
3293 "test_from_contiguous: incorrect result");
3294 return NULL;
3295 }
3296 }
3297
3298 view.buf = &data[8];
3299 view.strides[0] = -2 * itemsize;
3300
3301 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3302 ptr = view.buf;
3303 for (i = 0; i < 5; i++) {
3304 if (*(ptr-2*i) != i) {
3305 PyErr_SetString(TestError,
3306 "test_from_contiguous: incorrect result");
3307 return NULL;
3308 }
3309 }
3310
3311 Py_RETURN_NONE;
3312}
Stefan Krah650c1e82015-02-03 21:43:23 +01003313
Stefan Kraha7559c02015-02-03 22:27:21 +01003314#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003315extern PyTypeObject _PyBytesIOBuffer_Type;
3316
Stefan Krah5178d912015-02-03 16:57:21 +01003317static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003318test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003319{
Stefan Krah650c1e82015-02-03 21:43:23 +01003320 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003321 PyObject *b;
3322 char *dummy[1];
3323 int ret, match;
3324
Stefan Krah650c1e82015-02-03 21:43:23 +01003325 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003326 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3327 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3328 PyErr_Clear();
3329 if (ret != -1 || match == 0)
3330 goto error;
3331
Stefan Krah650c1e82015-02-03 21:43:23 +01003332 /* bytesiobuf_getbuffer() */
3333 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003334 if (b == NULL) {
3335 return NULL;
3336 }
3337
3338 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3339 Py_DECREF(b);
3340 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3341 PyErr_Clear();
3342 if (ret != -1 || match == 0)
3343 goto error;
3344
3345 Py_RETURN_NONE;
3346
3347error:
3348 PyErr_SetString(TestError,
3349 "test_pep3118_obsolete_write_locks: failure");
3350 return NULL;
3351}
Stefan Kraha7559c02015-02-03 22:27:21 +01003352#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003353
Stefan Krah650c1e82015-02-03 21:43:23 +01003354/* This tests functions that historically supported write locks. It is
3355 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3356 is entitled to segfault in that case. */
3357static PyObject *
3358getbuffer_with_null_view(PyObject* self, PyObject *obj)
3359{
3360 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3361 return NULL;
3362
3363 Py_RETURN_NONE;
3364}
3365
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03003366/* PyBuffer_SizeFromFormat() */
3367static PyObject *
3368test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
3369{
3370 const char *format;
3371 Py_ssize_t result;
3372
3373 if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
3374 &format)) {
3375 return NULL;
3376 }
3377
3378 result = PyBuffer_SizeFromFormat(format);
3379 if (result == -1) {
3380 return NULL;
3381 }
3382
3383 return PyLong_FromSsize_t(result);
3384}
3385
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003386/* Test that the fatal error from not having a current thread doesn't
3387 cause an infinite loop. Run via Lib/test/test_capi.py */
3388static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303389crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003390{
3391 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003392 /* Using PyThreadState_Get() directly allows the test to pass in
3393 !pydebug mode. However, the test only actually tests anything
3394 in pydebug mode, since that's where the infinite loop was in
3395 the first place. */
3396 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003397 Py_END_ALLOW_THREADS
3398 return NULL;
3399}
3400
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003401/* To run some code in a sub-interpreter. */
3402static PyObject *
3403run_in_subinterp(PyObject *self, PyObject *args)
3404{
3405 const char *code;
3406 int r;
3407 PyThreadState *substate, *mainstate;
3408
3409 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3410 &code))
3411 return NULL;
3412
3413 mainstate = PyThreadState_Get();
3414
3415 PyThreadState_Swap(NULL);
3416
3417 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003418 if (substate == NULL) {
3419 /* Since no new thread state was created, there is no exception to
3420 propagate; raise a fresh one after swapping in the old thread
3421 state. */
3422 PyThreadState_Swap(mainstate);
3423 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3424 return NULL;
3425 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003426 r = PyRun_SimpleString(code);
3427 Py_EndInterpreter(substate);
3428
3429 PyThreadState_Swap(mainstate);
3430
3431 return PyLong_FromLong(r);
3432}
3433
Victor Stinner3c1b3792014-02-17 00:02:43 +01003434static int
3435check_time_rounding(int round)
3436{
Victor Stinner74474232015-09-02 01:43:56 +02003437 if (round != _PyTime_ROUND_FLOOR
3438 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003439 && round != _PyTime_ROUND_HALF_EVEN
3440 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003441 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3442 return -1;
3443 }
3444 return 0;
3445}
3446
Victor Stinner5d272cc2012-03-13 13:35:55 +01003447static PyObject *
3448test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3449{
3450 PyObject *obj;
3451 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003452 int round;
3453 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003454 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003455 if (check_time_rounding(round) < 0)
3456 return NULL;
3457 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003458 return NULL;
3459 return _PyLong_FromTime_t(sec);
3460}
3461
3462static PyObject *
3463test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3464{
3465 PyObject *obj;
3466 time_t sec;
3467 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003468 int round;
3469 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003470 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003471 if (check_time_rounding(round) < 0)
3472 return NULL;
3473 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003474 return NULL;
3475 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3476}
3477
Victor Stinner643cd682012-03-02 22:54:03 +01003478static PyObject *
3479test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3480{
3481 PyObject *obj;
3482 time_t sec;
3483 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003484 int round;
3485 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003486 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003487 if (check_time_rounding(round) < 0)
3488 return NULL;
3489 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003490 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003491 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003492}
3493
Antoine Pitrou796564c2013-07-30 19:59:21 +02003494static void
3495slot_tp_del(PyObject *self)
3496{
3497 _Py_IDENTIFIER(__tp_del__);
3498 PyObject *del, *res;
3499 PyObject *error_type, *error_value, *error_traceback;
3500
3501 /* Temporarily resurrect the object. */
3502 assert(self->ob_refcnt == 0);
3503 self->ob_refcnt = 1;
3504
3505 /* Save the current exception, if any. */
3506 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3507
3508 /* Execute __del__ method, if any. */
3509 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3510 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003511 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003512 if (res == NULL)
3513 PyErr_WriteUnraisable(del);
3514 else
3515 Py_DECREF(res);
3516 Py_DECREF(del);
3517 }
3518
3519 /* Restore the saved exception. */
3520 PyErr_Restore(error_type, error_value, error_traceback);
3521
3522 /* Undo the temporary resurrection; can't use DECREF here, it would
3523 * cause a recursive call.
3524 */
3525 assert(self->ob_refcnt > 0);
3526 if (--self->ob_refcnt == 0)
3527 return; /* this is the normal path out */
3528
3529 /* __del__ resurrected it! Make it look like the original Py_DECREF
3530 * never happened.
3531 */
3532 {
3533 Py_ssize_t refcnt = self->ob_refcnt;
3534 _Py_NewReference(self);
3535 self->ob_refcnt = refcnt;
3536 }
INADA Naokid8521422018-05-17 11:07:21 +09003537 assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self));
Antoine Pitrou796564c2013-07-30 19:59:21 +02003538 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3539 * we need to undo that. */
3540 _Py_DEC_REFTOTAL;
3541 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3542 * chain, so no more to do there.
3543 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3544 * _Py_NewReference bumped tp_allocs: both of those need to be
3545 * undone.
3546 */
3547#ifdef COUNT_ALLOCS
3548 --Py_TYPE(self)->tp_frees;
3549 --Py_TYPE(self)->tp_allocs;
3550#endif
3551}
3552
3553static PyObject *
3554with_tp_del(PyObject *self, PyObject *args)
3555{
3556 PyObject *obj;
3557 PyTypeObject *tp;
3558
3559 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3560 return NULL;
3561 tp = (PyTypeObject *) obj;
3562 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3563 PyErr_Format(PyExc_TypeError,
3564 "heap type expected, got %R", obj);
3565 return NULL;
3566 }
3567 tp->tp_del = slot_tp_del;
3568 Py_INCREF(obj);
3569 return obj;
3570}
3571
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003572static PyMethodDef ml;
3573
3574static PyObject *
3575create_cfunction(PyObject *self, PyObject *args)
3576{
3577 return PyCFunction_NewEx(&ml, self, NULL);
3578}
3579
3580static PyMethodDef ml = {
3581 "create_cfunction",
3582 create_cfunction,
3583 METH_NOARGS,
3584 NULL
3585};
3586
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003587static PyObject *
3588_test_incref(PyObject *ob)
3589{
3590 Py_INCREF(ob);
3591 return ob;
3592}
3593
3594static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303595test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003596{
3597 PyObject *obj = PyLong_FromLong(0);
3598 Py_XINCREF(_test_incref(obj));
3599 Py_DECREF(obj);
3600 Py_DECREF(obj);
3601 Py_DECREF(obj);
3602 Py_RETURN_NONE;
3603}
3604
3605static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303606test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003607{
3608 PyObject *obj = PyLong_FromLong(0);
3609 Py_INCREF(_test_incref(obj));
3610 Py_DECREF(obj);
3611 Py_DECREF(obj);
3612 Py_DECREF(obj);
3613 Py_RETURN_NONE;
3614}
3615
3616static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303617test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003618{
3619 Py_XDECREF(PyLong_FromLong(0));
3620 Py_RETURN_NONE;
3621}
3622
3623static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303624test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003625{
3626 Py_DECREF(PyLong_FromLong(0));
3627 Py_RETURN_NONE;
3628}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003629
Victor Stinner0507bf52013-07-07 02:05:46 +02003630static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003631test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3632 PyObject *Py_UNUSED(args))
3633{
3634 PyStructSequence_Desc descr;
3635 PyStructSequence_Field descr_fields[3];
3636
3637 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3638 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3639 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3640
3641 descr.name = "_testcapi.test_descr";
3642 descr.doc = "This is used to test for memory leaks in NewType";
3643 descr.fields = descr_fields;
3644 descr.n_in_sequence = 1;
3645
3646 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3647 assert(structseq_type != NULL);
3648 assert(PyType_Check(structseq_type));
3649 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3650 Py_DECREF(structseq_type);
3651
3652 Py_RETURN_NONE;
3653}
3654
3655static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303656test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003657{
3658 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003659 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003660 Py_DecRef(obj);
3661 Py_DecRef(obj);
3662 Py_RETURN_NONE;
3663}
3664
3665static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303666test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003667{
3668 void *ptr;
3669
Victor Stinnerdb067af2014-05-02 22:31:14 +02003670 ptr = PyMem_RawMalloc(0);
3671 if (ptr == NULL) {
3672 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3673 return NULL;
3674 }
3675 PyMem_RawFree(ptr);
3676
3677 ptr = PyMem_RawCalloc(0, 0);
3678 if (ptr == NULL) {
3679 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3680 return NULL;
3681 }
3682 PyMem_RawFree(ptr);
3683
Victor Stinner0507bf52013-07-07 02:05:46 +02003684 ptr = PyMem_Malloc(0);
3685 if (ptr == NULL) {
3686 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3687 return NULL;
3688 }
3689 PyMem_Free(ptr);
3690
Victor Stinnerdb067af2014-05-02 22:31:14 +02003691 ptr = PyMem_Calloc(0, 0);
3692 if (ptr == NULL) {
3693 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3694 return NULL;
3695 }
3696 PyMem_Free(ptr);
3697
Victor Stinner0507bf52013-07-07 02:05:46 +02003698 ptr = PyObject_Malloc(0);
3699 if (ptr == NULL) {
3700 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3701 return NULL;
3702 }
3703 PyObject_Free(ptr);
3704
Victor Stinnerdb067af2014-05-02 22:31:14 +02003705 ptr = PyObject_Calloc(0, 0);
3706 if (ptr == NULL) {
3707 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3708 return NULL;
3709 }
3710 PyObject_Free(ptr);
3711
Victor Stinner0507bf52013-07-07 02:05:46 +02003712 Py_RETURN_NONE;
3713}
3714
3715typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003716 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003717
3718 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003719 size_t calloc_nelem;
3720 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003721 void *realloc_ptr;
3722 size_t realloc_new_size;
3723 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003724 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003725} alloc_hook_t;
3726
Victor Stinner9ed83c42017-10-31 12:18:10 -07003727static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003728{
3729 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003730 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003731 hook->malloc_size = size;
3732 return hook->alloc.malloc(hook->alloc.ctx, size);
3733}
3734
Victor Stinner9ed83c42017-10-31 12:18:10 -07003735static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003736{
3737 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003738 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003739 hook->calloc_nelem = nelem;
3740 hook->calloc_elsize = elsize;
3741 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3742}
3743
Victor Stinner9ed83c42017-10-31 12:18:10 -07003744static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003745{
3746 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003747 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003748 hook->realloc_ptr = ptr;
3749 hook->realloc_new_size = new_size;
3750 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3751}
3752
Victor Stinner9ed83c42017-10-31 12:18:10 -07003753static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02003754{
3755 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003756 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003757 hook->free_ptr = ptr;
3758 hook->alloc.free(hook->alloc.ctx, ptr);
3759}
3760
3761static PyObject *
3762test_setallocators(PyMemAllocatorDomain domain)
3763{
3764 PyObject *res = NULL;
3765 const char *error_msg;
3766 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003767 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003768 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003769 void *ptr, *ptr2;
3770
Victor Stinnerdb067af2014-05-02 22:31:14 +02003771 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003772
3773 alloc.ctx = &hook;
3774 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003775 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003776 alloc.realloc = &hook_realloc;
3777 alloc.free = &hook_free;
3778 PyMem_GetAllocator(domain, &hook.alloc);
3779 PyMem_SetAllocator(domain, &alloc);
3780
Victor Stinner9ed83c42017-10-31 12:18:10 -07003781 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02003782 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003783 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02003784 switch(domain)
3785 {
3786 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3787 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3788 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3789 default: ptr = NULL; break;
3790 }
3791
Victor Stinner9ed83c42017-10-31 12:18:10 -07003792#define CHECK_CTX(FUNC) \
3793 if (hook.ctx != &hook) { \
3794 error_msg = FUNC " wrong context"; \
3795 goto fail; \
3796 } \
3797 hook.ctx = NULL; /* reset for next check */
3798
Victor Stinner0507bf52013-07-07 02:05:46 +02003799 if (ptr == NULL) {
3800 error_msg = "malloc failed";
3801 goto fail;
3802 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003803 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003804 if (hook.malloc_size != size) {
3805 error_msg = "malloc invalid size";
3806 goto fail;
3807 }
3808
3809 size2 = 200;
3810 switch(domain)
3811 {
3812 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3813 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3814 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003815 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003816 }
3817
3818 if (ptr2 == NULL) {
3819 error_msg = "realloc failed";
3820 goto fail;
3821 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003822 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003823 if (hook.realloc_ptr != ptr
3824 || hook.realloc_new_size != size2) {
3825 error_msg = "realloc invalid parameters";
3826 goto fail;
3827 }
3828
3829 switch(domain)
3830 {
3831 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3832 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3833 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3834 }
3835
Victor Stinner9ed83c42017-10-31 12:18:10 -07003836 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02003837 if (hook.free_ptr != ptr2) {
3838 error_msg = "free invalid pointer";
3839 goto fail;
3840 }
3841
Victor Stinner9ed83c42017-10-31 12:18:10 -07003842 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02003843 nelem = 2;
3844 elsize = 5;
3845 switch(domain)
3846 {
3847 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3848 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3849 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3850 default: ptr = NULL; break;
3851 }
3852
3853 if (ptr == NULL) {
3854 error_msg = "calloc failed";
3855 goto fail;
3856 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003857 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02003858 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3859 error_msg = "calloc invalid nelem or elsize";
3860 goto fail;
3861 }
3862
Victor Stinner9ed83c42017-10-31 12:18:10 -07003863 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003864 switch(domain)
3865 {
3866 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3867 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3868 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3869 }
3870
Victor Stinner9ed83c42017-10-31 12:18:10 -07003871 CHECK_CTX("calloc free");
3872 if (hook.free_ptr != ptr) {
3873 error_msg = "calloc free invalid pointer";
3874 goto fail;
3875 }
3876
Victor Stinner0507bf52013-07-07 02:05:46 +02003877 Py_INCREF(Py_None);
3878 res = Py_None;
3879 goto finally;
3880
3881fail:
3882 PyErr_SetString(PyExc_RuntimeError, error_msg);
3883
3884finally:
3885 PyMem_SetAllocator(domain, &hook.alloc);
3886 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003887
3888#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02003889}
3890
3891static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303892test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003893{
3894 return test_setallocators(PYMEM_DOMAIN_RAW);
3895}
3896
3897static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303898test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003899{
3900 return test_setallocators(PYMEM_DOMAIN_MEM);
3901}
3902
3903static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303904test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003905{
3906 return test_setallocators(PYMEM_DOMAIN_OBJ);
3907}
3908
xdegaye85f64302017-07-01 14:14:45 +02003909/* Most part of the following code is inherited from the pyfailmalloc project
3910 * written by Victor Stinner. */
3911static struct {
3912 int installed;
3913 PyMemAllocatorEx raw;
3914 PyMemAllocatorEx mem;
3915 PyMemAllocatorEx obj;
3916} FmHook;
3917
3918static struct {
3919 int start;
3920 int stop;
3921 Py_ssize_t count;
3922} FmData;
3923
3924static int
3925fm_nomemory(void)
3926{
3927 FmData.count++;
3928 if (FmData.count > FmData.start &&
3929 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
3930 return 1;
3931 }
3932 return 0;
3933}
3934
3935static void *
3936hook_fmalloc(void *ctx, size_t size)
3937{
3938 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3939 if (fm_nomemory()) {
3940 return NULL;
3941 }
3942 return alloc->malloc(alloc->ctx, size);
3943}
3944
3945static void *
3946hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
3947{
3948 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3949 if (fm_nomemory()) {
3950 return NULL;
3951 }
3952 return alloc->calloc(alloc->ctx, nelem, elsize);
3953}
3954
3955static void *
3956hook_frealloc(void *ctx, void *ptr, size_t new_size)
3957{
3958 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3959 if (fm_nomemory()) {
3960 return NULL;
3961 }
3962 return alloc->realloc(alloc->ctx, ptr, new_size);
3963}
3964
3965static void
3966hook_ffree(void *ctx, void *ptr)
3967{
3968 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3969 alloc->free(alloc->ctx, ptr);
3970}
3971
3972static void
3973fm_setup_hooks(void)
3974{
3975 PyMemAllocatorEx alloc;
3976
3977 if (FmHook.installed) {
3978 return;
3979 }
3980 FmHook.installed = 1;
3981
3982 alloc.malloc = hook_fmalloc;
3983 alloc.calloc = hook_fcalloc;
3984 alloc.realloc = hook_frealloc;
3985 alloc.free = hook_ffree;
3986 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3987 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3988 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3989
3990 alloc.ctx = &FmHook.raw;
3991 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
3992
3993 alloc.ctx = &FmHook.mem;
3994 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
3995
3996 alloc.ctx = &FmHook.obj;
3997 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
3998}
3999
4000static void
4001fm_remove_hooks(void)
4002{
4003 if (FmHook.installed) {
4004 FmHook.installed = 0;
4005 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4006 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4007 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4008 }
4009}
4010
4011static PyObject*
4012set_nomemory(PyObject *self, PyObject *args)
4013{
4014 /* Memory allocation fails after 'start' allocation requests, and until
4015 * 'stop' allocation requests except when 'stop' is negative or equal
4016 * to 0 (default) in which case allocation failures never stop. */
4017 FmData.count = 0;
4018 FmData.stop = 0;
4019 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
4020 return NULL;
4021 }
4022 fm_setup_hooks();
4023 Py_RETURN_NONE;
4024}
4025
4026static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304027remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02004028{
4029 fm_remove_hooks();
4030 Py_RETURN_NONE;
4031}
4032
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004033PyDoc_STRVAR(docstring_empty,
4034""
4035);
4036
4037PyDoc_STRVAR(docstring_no_signature,
4038"This docstring has no signature."
4039);
4040
4041PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004042"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004043"\n"
4044"This docstring has an invalid signature."
4045);
4046
Larry Hastings2623c8c2014-02-08 22:15:29 -08004047PyDoc_STRVAR(docstring_with_invalid_signature2,
4048"docstring_with_invalid_signature2($module, /, boo)\n"
4049"\n"
4050"--\n"
4051"\n"
4052"This docstring also has an invalid signature."
4053);
4054
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004055PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004056"docstring_with_signature($module, /, sig)\n"
4057"--\n"
4058"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004059"This docstring has a valid signature."
4060);
4061
Zachary Ware8ef887c2015-04-13 18:22:35 -05004062PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4063"docstring_with_signature_but_no_doc($module, /, sig)\n"
4064"--\n"
4065"\n"
4066);
4067
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004068PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004069"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4070"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004071"\n"
4072"\n"
4073"This docstring has a valid signature and some extra newlines."
4074);
4075
Larry Hastings16c51912014-01-07 11:53:01 -08004076PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004077"docstring_with_signature_with_defaults(module, s='avocado',\n"
4078" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4079" local=the_number_three, sys=sys.maxsize,\n"
4080" exp=sys.maxsize - 1)\n"
4081"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004082"\n"
4083"\n"
4084"\n"
4085"This docstring has a valid signature with parameters,\n"
4086"and the parameters take defaults of varying types."
4087);
4088
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004089typedef struct {
4090 PyThread_type_lock start_event;
4091 PyThread_type_lock exit_event;
4092 PyObject *callback;
4093} test_c_thread_t;
4094
4095static void
4096temporary_c_thread(void *data)
4097{
4098 test_c_thread_t *test_c_thread = data;
4099 PyGILState_STATE state;
4100 PyObject *res;
4101
4102 PyThread_release_lock(test_c_thread->start_event);
4103
4104 /* Allocate a Python thread state for this thread */
4105 state = PyGILState_Ensure();
4106
Victor Stinner3466bde2016-09-05 18:16:01 -07004107 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004108 Py_CLEAR(test_c_thread->callback);
4109
4110 if (res == NULL) {
4111 PyErr_Print();
4112 }
4113 else {
4114 Py_DECREF(res);
4115 }
4116
4117 /* Destroy the Python thread state for this thread */
4118 PyGILState_Release(state);
4119
4120 PyThread_release_lock(test_c_thread->exit_event);
4121
4122 PyThread_exit_thread();
4123}
4124
4125static PyObject *
4126call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4127{
4128 PyObject *res = NULL;
4129 test_c_thread_t test_c_thread;
4130 long thread;
4131
4132 PyEval_InitThreads();
4133
4134 test_c_thread.start_event = PyThread_allocate_lock();
4135 test_c_thread.exit_event = PyThread_allocate_lock();
4136 test_c_thread.callback = NULL;
4137 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4138 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4139 goto exit;
4140 }
4141
4142 Py_INCREF(callback);
4143 test_c_thread.callback = callback;
4144
4145 PyThread_acquire_lock(test_c_thread.start_event, 1);
4146 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4147
4148 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4149 if (thread == -1) {
4150 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4151 PyThread_release_lock(test_c_thread.start_event);
4152 PyThread_release_lock(test_c_thread.exit_event);
4153 goto exit;
4154 }
4155
4156 PyThread_acquire_lock(test_c_thread.start_event, 1);
4157 PyThread_release_lock(test_c_thread.start_event);
4158
4159 Py_BEGIN_ALLOW_THREADS
4160 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4161 PyThread_release_lock(test_c_thread.exit_event);
4162 Py_END_ALLOW_THREADS
4163
4164 Py_INCREF(Py_None);
4165 res = Py_None;
4166
4167exit:
4168 Py_CLEAR(test_c_thread.callback);
4169 if (test_c_thread.start_event)
4170 PyThread_free_lock(test_c_thread.start_event);
4171 if (test_c_thread.exit_event)
4172 PyThread_free_lock(test_c_thread.exit_event);
4173 return res;
4174}
Victor Stinner13105102013-12-13 02:17:29 +01004175
Serhiy Storchakab5181342015-02-06 08:58:56 +02004176/* marshal */
4177
4178static PyObject*
4179pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4180{
4181 long value;
4182 char *filename;
4183 int version;
4184 FILE *fp;
4185
4186 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
4187 &value, &filename, &version))
4188 return NULL;
4189
4190 fp = fopen(filename, "wb");
4191 if (fp == NULL) {
4192 PyErr_SetFromErrno(PyExc_OSError);
4193 return NULL;
4194 }
4195
4196 PyMarshal_WriteLongToFile(value, fp, version);
4197
4198 fclose(fp);
4199 if (PyErr_Occurred())
4200 return NULL;
4201 Py_RETURN_NONE;
4202}
4203
4204static PyObject*
4205pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4206{
4207 PyObject *obj;
4208 char *filename;
4209 int version;
4210 FILE *fp;
4211
4212 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
4213 &obj, &filename, &version))
4214 return NULL;
4215
4216 fp = fopen(filename, "wb");
4217 if (fp == NULL) {
4218 PyErr_SetFromErrno(PyExc_OSError);
4219 return NULL;
4220 }
4221
4222 PyMarshal_WriteObjectToFile(obj, fp, version);
4223
4224 fclose(fp);
4225 if (PyErr_Occurred())
4226 return NULL;
4227 Py_RETURN_NONE;
4228}
4229
4230static PyObject*
4231pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4232{
4233 int value;
4234 long pos;
4235 char *filename;
4236 FILE *fp;
4237
4238 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
4239 return NULL;
4240
4241 fp = fopen(filename, "rb");
4242 if (fp == NULL) {
4243 PyErr_SetFromErrno(PyExc_OSError);
4244 return NULL;
4245 }
4246
4247 value = PyMarshal_ReadShortFromFile(fp);
4248 pos = ftell(fp);
4249
4250 fclose(fp);
4251 if (PyErr_Occurred())
4252 return NULL;
4253 return Py_BuildValue("il", value, pos);
4254}
4255
4256static PyObject*
4257pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4258{
4259 long value, pos;
4260 char *filename;
4261 FILE *fp;
4262
4263 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
4264 return NULL;
4265
4266 fp = fopen(filename, "rb");
4267 if (fp == NULL) {
4268 PyErr_SetFromErrno(PyExc_OSError);
4269 return NULL;
4270 }
4271
4272 value = PyMarshal_ReadLongFromFile(fp);
4273 pos = ftell(fp);
4274
4275 fclose(fp);
4276 if (PyErr_Occurred())
4277 return NULL;
4278 return Py_BuildValue("ll", value, pos);
4279}
4280
4281static PyObject*
4282pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4283{
4284 PyObject *obj;
4285 long pos;
4286 char *filename;
4287 FILE *fp;
4288
4289 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
4290 return NULL;
4291
4292 fp = fopen(filename, "rb");
4293 if (fp == NULL) {
4294 PyErr_SetFromErrno(PyExc_OSError);
4295 return NULL;
4296 }
4297
4298 obj = PyMarshal_ReadLastObjectFromFile(fp);
4299 pos = ftell(fp);
4300
4301 fclose(fp);
4302 return Py_BuildValue("Nl", obj, pos);
4303}
4304
4305static PyObject*
4306pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4307{
4308 PyObject *obj;
4309 long pos;
4310 char *filename;
4311 FILE *fp;
4312
4313 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
4314 return NULL;
4315
4316 fp = fopen(filename, "rb");
4317 if (fp == NULL) {
4318 PyErr_SetFromErrno(PyExc_OSError);
4319 return NULL;
4320 }
4321
4322 obj = PyMarshal_ReadObjectFromFile(fp);
4323 pos = ftell(fp);
4324
4325 fclose(fp);
4326 return Py_BuildValue("Nl", obj, pos);
4327}
4328
Victor Stinnerefde1462015-03-21 15:04:43 +01004329static PyObject*
4330return_null_without_error(PyObject *self, PyObject *args)
4331{
4332 /* invalid call: return NULL without setting an error,
4333 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4334 PyErr_Clear();
4335 return NULL;
4336}
4337
4338static PyObject*
4339return_result_with_error(PyObject *self, PyObject *args)
4340{
4341 /* invalid call: return a result with an error set,
4342 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4343 PyErr_SetNone(PyExc_ValueError);
4344 Py_RETURN_NONE;
4345}
4346
Victor Stinner992c43f2015-03-27 17:12:45 +01004347static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004348test_pytime_fromseconds(PyObject *self, PyObject *args)
4349{
4350 int seconds;
4351 _PyTime_t ts;
4352
4353 if (!PyArg_ParseTuple(args, "i", &seconds))
4354 return NULL;
4355 ts = _PyTime_FromSeconds(seconds);
4356 return _PyTime_AsNanosecondsObject(ts);
4357}
4358
4359static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004360test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4361{
4362 PyObject *obj;
4363 int round;
4364 _PyTime_t ts;
4365
4366 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4367 return NULL;
4368 if (check_time_rounding(round) < 0)
4369 return NULL;
4370 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4371 return NULL;
4372 return _PyTime_AsNanosecondsObject(ts);
4373}
4374
Victor Stinner4bfb4602015-03-27 22:27:24 +01004375static PyObject *
4376test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4377{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004378 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004379 _PyTime_t ts;
4380 double d;
4381
Victor Stinnerc29b5852017-11-02 07:28:27 -07004382 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004383 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004384 }
4385 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4386 return NULL;
4387 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004388 d = _PyTime_AsSecondsDouble(ts);
4389 return PyFloat_FromDouble(d);
4390}
4391
Victor Stinner95e9cef2015-03-28 01:26:47 +01004392static PyObject *
4393test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4394{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004395 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004396 int round;
4397 _PyTime_t t;
4398 struct timeval tv;
4399 PyObject *seconds;
4400
Victor Stinnerc29b5852017-11-02 07:28:27 -07004401 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004402 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004403 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004404 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004405 }
4406 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004407 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004408 }
4409 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4410 return NULL;
4411 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004412
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004413 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004414 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004415 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004416 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004417 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4418}
4419
Victor Stinner34dc0f42015-03-27 18:19:03 +01004420#ifdef HAVE_CLOCK_GETTIME
4421static PyObject *
4422test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4423{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004424 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004425 _PyTime_t t;
4426 struct timespec ts;
4427
Victor Stinnerc29b5852017-11-02 07:28:27 -07004428 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004429 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004430 }
4431 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004432 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004433 }
4434 if (_PyTime_AsTimespec(t, &ts) == -1) {
4435 return NULL;
4436 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004437 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4438}
4439#endif
4440
Victor Stinner62d1c702015-04-01 17:47:07 +02004441static PyObject *
4442test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4443{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004444 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004445 int round;
4446 _PyTime_t t, ms;
4447
Victor Stinnerc29b5852017-11-02 07:28:27 -07004448 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004449 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004450 }
4451 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004452 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004453 }
4454 if (check_time_rounding(round) < 0) {
4455 return NULL;
4456 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004457 ms = _PyTime_AsMilliseconds(t, round);
4458 /* This conversion rely on the fact that _PyTime_t is a number of
4459 nanoseconds */
4460 return _PyTime_AsNanosecondsObject(ms);
4461}
4462
4463static PyObject *
4464test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4465{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004466 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004467 int round;
4468 _PyTime_t t, ms;
4469
Victor Stinnerc29b5852017-11-02 07:28:27 -07004470 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004471 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004472 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004473 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004474 }
4475 if (check_time_rounding(round) < 0) {
4476 return NULL;
4477 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004478 ms = _PyTime_AsMicroseconds(t, round);
4479 /* This conversion rely on the fact that _PyTime_t is a number of
4480 nanoseconds */
4481 return _PyTime_AsNanosecondsObject(ms);
4482}
4483
Victor Stinner50856d52015-10-13 00:11:21 +02004484static PyObject*
4485get_recursion_depth(PyObject *self, PyObject *args)
4486{
Victor Stinner50b48572018-11-01 01:51:40 +01004487 PyThreadState *tstate = PyThreadState_Get();
Victor Stinner50856d52015-10-13 00:11:21 +02004488
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07004489 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02004490 return PyLong_FromLong(tstate->recursion_depth - 1);
4491}
4492
Victor Stinner34be807c2016-03-14 12:04:26 +01004493static PyObject*
4494pymem_buffer_overflow(PyObject *self, PyObject *args)
4495{
4496 char *buffer;
4497
4498 /* Deliberate buffer overflow to check that PyMem_Free() detects
4499 the overflow when debug hooks are installed. */
4500 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004501 if (buffer == NULL) {
4502 PyErr_NoMemory();
4503 return NULL;
4504 }
Victor Stinner34be807c2016-03-14 12:04:26 +01004505 buffer[16] = 'x';
4506 PyMem_Free(buffer);
4507
4508 Py_RETURN_NONE;
4509}
4510
4511static PyObject*
4512pymem_api_misuse(PyObject *self, PyObject *args)
4513{
4514 char *buffer;
4515
4516 /* Deliberate misusage of Python allocators:
4517 allococate with PyMem but release with PyMem_Raw. */
4518 buffer = PyMem_Malloc(16);
4519 PyMem_RawFree(buffer);
4520
4521 Py_RETURN_NONE;
4522}
4523
Victor Stinnerc4aec362016-03-14 22:26:53 +01004524static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004525pymem_malloc_without_gil(PyObject *self, PyObject *args)
4526{
4527 char *buffer;
4528
4529 /* Deliberate bug to test debug hooks on Python memory allocators:
4530 call PyMem_Malloc() without holding the GIL */
4531 Py_BEGIN_ALLOW_THREADS
4532 buffer = PyMem_Malloc(10);
4533 Py_END_ALLOW_THREADS
4534
4535 PyMem_Free(buffer);
4536
4537 Py_RETURN_NONE;
4538}
4539
Victor Stinner5d39e042017-11-29 17:20:38 +01004540
4541static PyObject*
4542test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4543{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004544 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004545 if (name == NULL) {
4546 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4547 return NULL;
4548 }
4549 return PyUnicode_FromString(name);
4550}
4551
4552
Victor Stinnerad524372016-03-16 12:12:53 +01004553static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004554test_pyobject_is_freed(const char *test_name, PyObject *op)
Victor Stinner2b00db62019-04-11 11:33:27 +02004555{
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004556 if (!_PyObject_IsFreed(op)) {
4557 return raiseTestError(test_name, "object is not seen as freed");
4558 }
4559 Py_RETURN_NONE;
Victor Stinner2b00db62019-04-11 11:33:27 +02004560}
4561
4562
4563static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004564check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004565{
4566 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4567 if (op == NULL) {
4568 return NULL;
4569 }
4570 /* Initialize reference count to avoid early crash in ceval or GC */
4571 Py_REFCNT(op) = 1;
4572 /* object fields like ob_type are uninitialized! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004573 return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004574}
4575
4576
4577static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004578check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004579{
4580 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4581 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4582 if (op == NULL) {
4583 return NULL;
4584 }
4585 /* Initialize reference count to avoid early crash in ceval or GC */
4586 Py_REFCNT(op) = 1;
4587 /* ob_type field is after the memory block: part of "forbidden bytes"
4588 when using debug hooks on memory allocatrs! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004589 return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004590}
4591
4592
4593static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004594check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004595{
4596 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4597 if (op == NULL) {
4598 return NULL;
4599 }
4600 Py_TYPE(op)->tp_dealloc(op);
4601 /* Reset reference count to avoid early crash in ceval or GC */
4602 Py_REFCNT(op) = 1;
4603 /* object memory is freed! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004604 return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004605}
4606
4607
4608static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004609pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4610{
4611 char *buffer;
4612
Victor Stinnerad524372016-03-16 12:12:53 +01004613 /* Deliberate bug to test debug hooks on Python memory allocators:
4614 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004615 Py_BEGIN_ALLOW_THREADS
4616 buffer = PyObject_Malloc(10);
4617 Py_END_ALLOW_THREADS
4618
4619 PyObject_Free(buffer);
4620
4621 Py_RETURN_NONE;
4622}
4623
Victor Stinner10b73e12016-03-22 13:39:05 +01004624static PyObject *
4625tracemalloc_track(PyObject *self, PyObject *args)
4626{
4627 unsigned int domain;
4628 PyObject *ptr_obj;
4629 void *ptr;
4630 Py_ssize_t size;
4631 int release_gil = 0;
4632 int res;
4633
4634 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4635 return NULL;
4636 ptr = PyLong_AsVoidPtr(ptr_obj);
4637 if (PyErr_Occurred())
4638 return NULL;
4639
4640 if (release_gil) {
4641 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004642 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004643 Py_END_ALLOW_THREADS
4644 }
4645 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004646 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004647 }
4648
4649 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004650 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004651 return NULL;
4652 }
4653
4654 Py_RETURN_NONE;
4655}
4656
4657static PyObject *
4658tracemalloc_untrack(PyObject *self, PyObject *args)
4659{
4660 unsigned int domain;
4661 PyObject *ptr_obj;
4662 void *ptr;
4663 int res;
4664
4665 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4666 return NULL;
4667 ptr = PyLong_AsVoidPtr(ptr_obj);
4668 if (PyErr_Occurred())
4669 return NULL;
4670
Victor Stinner5ea4c062017-06-20 17:46:36 +02004671 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004672 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004673 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004674 return NULL;
4675 }
4676
4677 Py_RETURN_NONE;
4678}
4679
4680static PyObject *
4681tracemalloc_get_traceback(PyObject *self, PyObject *args)
4682{
4683 unsigned int domain;
4684 PyObject *ptr_obj;
4685 void *ptr;
4686
4687 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4688 return NULL;
4689 ptr = PyLong_AsVoidPtr(ptr_obj);
4690 if (PyErr_Occurred())
4691 return NULL;
4692
Benjamin Petersonca470632016-09-06 13:47:26 -07004693 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004694}
4695
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004696static PyObject *
4697dict_get_version(PyObject *self, PyObject *args)
4698{
4699 PyDictObject *dict;
4700 uint64_t version;
4701
4702 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4703 return NULL;
4704
4705 version = dict->ma_version_tag;
4706
4707 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4708 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4709}
4710
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004711
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004712static PyObject *
4713raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4714{
4715 PyGenObject *gen;
4716
4717 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4718 return NULL;
4719
4720 /* This is used in a test to check what happens if a signal arrives just
4721 as we're in the process of entering a yield from chain (see
4722 bpo-30039).
4723
4724 Needs to be done in C, because:
4725 - we don't have a Python wrapper for raise()
4726 - we need to make sure that the Python-level signal handler doesn't run
4727 *before* we enter the generator frame, which is impossible in Python
4728 because we check for signals before every bytecode operation.
4729 */
4730 raise(SIGINT);
4731 return _PyGen_Send(gen, Py_None);
4732}
4733
4734
Victor Stinner3b5cf852017-06-09 16:48:45 +02004735static int
4736fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4737{
4738 if (args == Py_None) {
4739 *stack = NULL;
4740 *nargs = 0;
4741 }
4742 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01004743 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02004744 *nargs = PyTuple_GET_SIZE(args);
4745 }
4746 else {
4747 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4748 return -1;
4749 }
4750 return 0;
4751}
4752
4753
4754static PyObject *
4755test_pyobject_fastcall(PyObject *self, PyObject *args)
4756{
4757 PyObject *func, *func_args;
4758 PyObject **stack;
4759 Py_ssize_t nargs;
4760
4761 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4762 return NULL;
4763 }
4764
4765 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4766 return NULL;
4767 }
4768 return _PyObject_FastCall(func, stack, nargs);
4769}
4770
4771
4772static PyObject *
4773test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4774{
4775 PyObject *func, *func_args, *kwargs;
4776 PyObject **stack;
4777 Py_ssize_t nargs;
4778
4779 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4780 return NULL;
4781 }
4782
4783 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4784 return NULL;
4785 }
4786
4787 if (kwargs == Py_None) {
4788 kwargs = NULL;
4789 }
4790 else if (!PyDict_Check(kwargs)) {
4791 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4792 return NULL;
4793 }
4794
4795 return _PyObject_FastCallDict(func, stack, nargs, kwargs);
4796}
4797
4798
4799static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004800test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02004801{
4802 PyObject *func, *func_args, *kwnames = NULL;
4803 PyObject **stack;
4804 Py_ssize_t nargs, nkw;
4805
4806 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4807 return NULL;
4808 }
4809
4810 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4811 return NULL;
4812 }
4813
4814 if (kwnames == Py_None) {
4815 kwnames = NULL;
4816 }
4817 else if (PyTuple_Check(kwnames)) {
4818 nkw = PyTuple_GET_SIZE(kwnames);
4819 if (nargs < nkw) {
4820 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4821 return NULL;
4822 }
4823 nargs -= nkw;
4824 }
4825 else {
4826 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4827 return NULL;
4828 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004829 return _PyObject_Vectorcall(func, stack, nargs, kwnames);
4830}
4831
4832
4833static PyObject *
4834test_pyvectorcall_call(PyObject *self, PyObject *args)
4835{
4836 PyObject *func;
4837 PyObject *argstuple;
4838 PyObject *kwargs = NULL;
4839
4840 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
4841 return NULL;
4842 }
4843
4844 if (!PyTuple_Check(argstuple)) {
4845 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
4846 return NULL;
4847 }
4848 if (kwargs != NULL && !PyDict_Check(kwargs)) {
4849 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
4850 return NULL;
4851 }
4852
4853 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02004854}
4855
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004856
Victor Stinner64fa4492017-07-10 14:37:49 +02004857static PyObject*
4858stack_pointer(PyObject *self, PyObject *args)
4859{
4860 int v = 5;
4861 return PyLong_FromVoidPtr(&v);
4862}
4863
Victor Stinner3b5cf852017-06-09 16:48:45 +02004864
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004865#ifdef W_STOPCODE
4866static PyObject*
4867py_w_stopcode(PyObject *self, PyObject *args)
4868{
4869 int sig, status;
4870 if (!PyArg_ParseTuple(args, "i", &sig)) {
4871 return NULL;
4872 }
4873 status = W_STOPCODE(sig);
4874 return PyLong_FromLong(status);
4875}
4876#endif
4877
4878
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004879static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03004880get_mapping_keys(PyObject* self, PyObject *obj)
4881{
4882 return PyMapping_Keys(obj);
4883}
4884
4885static PyObject *
4886get_mapping_values(PyObject* self, PyObject *obj)
4887{
4888 return PyMapping_Values(obj);
4889}
4890
4891static PyObject *
4892get_mapping_items(PyObject* self, PyObject *obj)
4893{
4894 return PyMapping_Items(obj);
4895}
4896
4897
4898static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004899test_pythread_tss_key_state(PyObject *self, PyObject *args)
4900{
4901 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
4902 if (PyThread_tss_is_created(&tss_key)) {
4903 return raiseTestError("test_pythread_tss_key_state",
4904 "TSS key not in an uninitialized state at "
4905 "creation time");
4906 }
4907 if (PyThread_tss_create(&tss_key) != 0) {
4908 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
4909 return NULL;
4910 }
4911 if (!PyThread_tss_is_created(&tss_key)) {
4912 return raiseTestError("test_pythread_tss_key_state",
4913 "PyThread_tss_create succeeded, "
4914 "but with TSS key in an uninitialized state");
4915 }
4916 if (PyThread_tss_create(&tss_key) != 0) {
4917 return raiseTestError("test_pythread_tss_key_state",
4918 "PyThread_tss_create unsuccessful with "
4919 "an already initialized key");
4920 }
4921#define CHECK_TSS_API(expr) \
4922 (void)(expr); \
4923 if (!PyThread_tss_is_created(&tss_key)) { \
4924 return raiseTestError("test_pythread_tss_key_state", \
4925 "TSS key initialization state was not " \
4926 "preserved after calling " #expr); }
4927 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
4928 CHECK_TSS_API(PyThread_tss_get(&tss_key));
4929#undef CHECK_TSS_API
4930 PyThread_tss_delete(&tss_key);
4931 if (PyThread_tss_is_created(&tss_key)) {
4932 return raiseTestError("test_pythread_tss_key_state",
4933 "PyThread_tss_delete called, but did not "
4934 "set the key state to uninitialized");
4935 }
4936
4937 Py_tss_t *ptr_key = PyThread_tss_alloc();
4938 if (ptr_key == NULL) {
4939 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
4940 return NULL;
4941 }
4942 if (PyThread_tss_is_created(ptr_key)) {
4943 return raiseTestError("test_pythread_tss_key_state",
4944 "TSS key not in an uninitialized state at "
4945 "allocation time");
4946 }
4947 PyThread_tss_free(ptr_key);
4948 ptr_key = NULL;
4949 Py_RETURN_NONE;
4950}
4951
4952
Yury Selivanovf23746a2018-01-22 19:11:18 -05004953static PyObject*
4954new_hamt(PyObject *self, PyObject *args)
4955{
4956 return _PyContext_NewHamtForTests();
4957}
4958
4959
jdemeyer5a306202018-10-19 23:50:06 +02004960/* def bad_get(self, obj, cls):
4961 cls()
4962 return repr(self)
4963*/
4964static PyObject*
4965bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4966{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02004967 PyObject *self, *obj, *cls;
4968 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02004969 return NULL;
4970 }
4971
Jeroen Demeyer7f41c8e2019-07-04 12:35:31 +02004972 PyObject *res = _PyObject_CallNoArg(cls);
jdemeyer5a306202018-10-19 23:50:06 +02004973 if (res == NULL) {
4974 return NULL;
4975 }
4976 Py_DECREF(res);
4977
Serhiy Storchakab1dede32018-11-20 20:45:40 +02004978 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02004979}
4980
4981
Victor Stinner3d4226a2018-08-29 22:21:32 +02004982static PyObject *
4983encode_locale_ex(PyObject *self, PyObject *args)
4984{
4985 PyObject *unicode;
4986 int current_locale = 0;
4987 wchar_t *wstr;
4988 PyObject *res = NULL;
4989 const char *errors = NULL;
4990
4991 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
4992 return NULL;
4993 }
4994 wstr = PyUnicode_AsWideCharString(unicode, NULL);
4995 if (wstr == NULL) {
4996 return NULL;
4997 }
4998 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
4999
5000 char *str = NULL;
5001 size_t error_pos;
5002 const char *reason = NULL;
5003 int ret = _Py_EncodeLocaleEx(wstr,
5004 &str, &error_pos, &reason,
5005 current_locale, error_handler);
5006 PyMem_Free(wstr);
5007
5008 switch(ret) {
5009 case 0:
5010 res = PyBytes_FromString(str);
5011 PyMem_RawFree(str);
5012 break;
5013 case -1:
5014 PyErr_NoMemory();
5015 break;
5016 case -2:
5017 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
5018 error_pos, reason);
5019 break;
5020 case -3:
5021 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5022 break;
5023 default:
5024 PyErr_SetString(PyExc_ValueError, "unknow error code");
5025 break;
5026 }
5027 return res;
5028}
5029
5030
5031static PyObject *
5032decode_locale_ex(PyObject *self, PyObject *args)
5033{
5034 char *str;
5035 int current_locale = 0;
5036 PyObject *res = NULL;
5037 const char *errors = NULL;
5038
5039 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
5040 return NULL;
5041 }
5042 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5043
5044 wchar_t *wstr = NULL;
5045 size_t wlen = 0;
5046 const char *reason = NULL;
5047 int ret = _Py_DecodeLocaleEx(str,
5048 &wstr, &wlen, &reason,
5049 current_locale, error_handler);
5050
5051 switch(ret) {
5052 case 0:
5053 res = PyUnicode_FromWideChar(wstr, wlen);
5054 PyMem_RawFree(wstr);
5055 break;
5056 case -1:
5057 PyErr_NoMemory();
5058 break;
5059 case -2:
5060 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
5061 wlen, reason);
5062 break;
5063 case -3:
5064 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5065 break;
5066 default:
5067 PyErr_SetString(PyExc_ValueError, "unknow error code");
5068 break;
5069 }
5070 return res;
5071}
5072
5073
Victor Stinner18618e652018-10-25 17:28:11 +02005074#ifdef Py_REF_DEBUG
5075static PyObject *
5076negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5077{
5078 PyObject *obj = PyUnicode_FromString("negative_refcount");
5079 if (obj == NULL) {
5080 return NULL;
5081 }
5082 assert(Py_REFCNT(obj) == 1);
5083
5084 Py_REFCNT(obj) = 0;
5085 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5086 Py_DECREF(obj);
5087
5088 Py_RETURN_NONE;
5089}
5090#endif
5091
5092
Victor Stinneref9d9b62019-05-22 11:28:22 +02005093static PyObject*
5094test_write_unraisable_exc(PyObject *self, PyObject *args)
5095{
Victor Stinner71c52e32019-05-27 08:57:14 +02005096 PyObject *exc, *err_msg, *obj;
5097 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005098 return NULL;
5099 }
5100
Victor Stinner71c52e32019-05-27 08:57:14 +02005101 const char *err_msg_utf8;
5102 if (err_msg != Py_None) {
5103 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5104 if (err_msg_utf8 == NULL) {
5105 return NULL;
5106 }
5107 }
5108 else {
5109 err_msg_utf8 = NULL;
5110 }
5111
Victor Stinneref9d9b62019-05-22 11:28:22 +02005112 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005113 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005114 Py_RETURN_NONE;
5115}
5116
5117
Tim Peters9ea17ac2001-02-02 05:57:15 +00005118static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305120 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005121 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305122 {"test_config", test_config, METH_NOARGS},
5123 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005124 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005125 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5126 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5127 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5128 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5129 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5130 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005131 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005132 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005133 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5134 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5135 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5136 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5137 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5138 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005139 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5140 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305141 {"test_list_api", test_list_api, METH_NOARGS},
5142 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005143 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005144 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305145 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5146 {"test_long_api", test_long_api, METH_NOARGS},
5147 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5148 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5149 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5150 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005151 {"test_structseq_newtype_doesnt_leak",
5152 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305153 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5154 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5155 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5156 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
Zackery Spytzdc247652019-06-06 14:39:23 -06005157 {"test_long_as_unsigned_long_long_mask",
5158 test_long_as_unsigned_long_long_mask, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305159 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5160 {"test_k_code", test_k_code, METH_NOARGS},
5161 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005162 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305163 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305165 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305167 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5168 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5169 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005170 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005171 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005172#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005173 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005174#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005175 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03005176 {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005177 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03005178 {"get_args", get_args, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005179 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005180 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005181 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005182 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005183 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005184 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005185 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005186 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005187 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 {"getargs_b", getargs_b, METH_VARARGS},
5189 {"getargs_B", getargs_B, METH_VARARGS},
5190 {"getargs_h", getargs_h, METH_VARARGS},
5191 {"getargs_H", getargs_H, METH_VARARGS},
5192 {"getargs_I", getargs_I, METH_VARARGS},
5193 {"getargs_k", getargs_k, METH_VARARGS},
5194 {"getargs_i", getargs_i, METH_VARARGS},
5195 {"getargs_l", getargs_l, METH_VARARGS},
5196 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005197 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005198 {"getargs_L", getargs_L, METH_VARARGS},
5199 {"getargs_K", getargs_K, METH_VARARGS},
5200 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305201 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5202 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005203 {"getargs_f", getargs_f, METH_VARARGS},
5204 {"getargs_d", getargs_d, METH_VARARGS},
5205 {"getargs_D", getargs_D, METH_VARARGS},
5206 {"getargs_S", getargs_S, METH_VARARGS},
5207 {"getargs_Y", getargs_Y, METH_VARARGS},
5208 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005209 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005210 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005211 {"getargs_s", getargs_s, METH_VARARGS},
5212 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5213 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
5214 {"getargs_z", getargs_z, METH_VARARGS},
5215 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5216 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5217 {"getargs_y", getargs_y, METH_VARARGS},
5218 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5219 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5220 {"getargs_u", getargs_u, METH_VARARGS},
5221 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5222 {"getargs_Z", getargs_Z, METH_VARARGS},
5223 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005224 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005225 {"getargs_es", getargs_es, METH_VARARGS},
5226 {"getargs_et", getargs_et, METH_VARARGS},
5227 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5228 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005229 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005230 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005231 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005232 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305233 {"test_s_code", test_s_code, METH_NOARGS},
5234 {"test_u_code", test_u_code, METH_NOARGS},
5235 {"test_Z_code", test_Z_code, METH_NOARGS},
5236 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005237 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5238 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005239 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Hai Shi5623ac82019-07-20 02:56:23 -05005240 {"unicode_asutf8", unicode_asutf8, METH_VARARGS},
5241 {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005242 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005243 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005244 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5245 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005246 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005247 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005248 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005249#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005250 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005251#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005252 {"traceback_print", traceback_print, METH_VARARGS},
5253 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005254 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005255 {"argparsing", argparsing, METH_VARARGS},
5256 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005257 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305259 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005260 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305261 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005262 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005263 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5264 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005265 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005266 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005267 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305268 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5269 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5270 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5271 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005272 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5273 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305274 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005275 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005276 {"no_docstring",
5277 (PyCFunction)test_with_docstring, METH_NOARGS},
5278 {"docstring_empty",
5279 (PyCFunction)test_with_docstring, METH_NOARGS,
5280 docstring_empty},
5281 {"docstring_no_signature",
5282 (PyCFunction)test_with_docstring, METH_NOARGS,
5283 docstring_no_signature},
5284 {"docstring_with_invalid_signature",
5285 (PyCFunction)test_with_docstring, METH_NOARGS,
5286 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005287 {"docstring_with_invalid_signature2",
5288 (PyCFunction)test_with_docstring, METH_NOARGS,
5289 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005290 {"docstring_with_signature",
5291 (PyCFunction)test_with_docstring, METH_NOARGS,
5292 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005293 {"docstring_with_signature_but_no_doc",
5294 (PyCFunction)test_with_docstring, METH_NOARGS,
5295 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005296 {"docstring_with_signature_and_extra_newlines",
5297 (PyCFunction)test_with_docstring, METH_NOARGS,
5298 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005299 {"docstring_with_signature_with_defaults",
5300 (PyCFunction)test_with_docstring, METH_NOARGS,
5301 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005302 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5303 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005304 {"pymarshal_write_long_to_file",
5305 pymarshal_write_long_to_file, METH_VARARGS},
5306 {"pymarshal_write_object_to_file",
5307 pymarshal_write_object_to_file, METH_VARARGS},
5308 {"pymarshal_read_short_from_file",
5309 pymarshal_read_short_from_file, METH_VARARGS},
5310 {"pymarshal_read_long_from_file",
5311 pymarshal_read_long_from_file, METH_VARARGS},
5312 {"pymarshal_read_last_object_from_file",
5313 pymarshal_read_last_object_from_file, METH_VARARGS},
5314 {"pymarshal_read_object_from_file",
5315 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01005316 {"return_null_without_error",
5317 return_null_without_error, METH_NOARGS},
5318 {"return_result_with_error",
5319 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02005320 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005321 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5322 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005323 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005324#ifdef HAVE_CLOCK_GETTIME
5325 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5326#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005327 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5328 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02005329 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01005330 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5331 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005332 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005333 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02005334 {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
5335 {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
5336 {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005337 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005338 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5339 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5340 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005341 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005342 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005343 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5344 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005345 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5346 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005347 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005348#ifdef W_STOPCODE
5349 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5350#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005351 {"get_mapping_keys", get_mapping_keys, METH_O},
5352 {"get_mapping_values", get_mapping_values, METH_O},
5353 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005354 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005355 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005356 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005357 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5358 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005359#ifdef Py_REF_DEBUG
5360 {"negative_refcount", negative_refcount, METH_NOARGS},
5361#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005362 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005364};
5365
Thomas Hellera4ea6032003-04-17 18:55:45 +00005366#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5367
Thomas Wouters89f507f2006-12-13 04:49:30 +00005368typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005369 char bool_member;
5370 char byte_member;
5371 unsigned char ubyte_member;
5372 short short_member;
5373 unsigned short ushort_member;
5374 int int_member;
5375 unsigned int uint_member;
5376 long long_member;
5377 unsigned long ulong_member;
5378 Py_ssize_t pyssizet_member;
5379 float float_member;
5380 double double_member;
5381 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005382 long long longlong_member;
5383 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005384} all_structmembers;
5385
5386typedef struct {
5387 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005388 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005389} test_structmembers;
5390
5391static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005392 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5393 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5394 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5395 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5396 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5397 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5398 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5399 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5400 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5401 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5402 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5403 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5404 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5406 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005407 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005408};
5409
5410
Christian Heimes1af737c2008-01-23 08:24:23 +00005411static PyObject *
5412test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005414 static char *keywords[] = {
5415 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5416 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5417 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005419 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005420 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 test_structmembers *ob;
5422 const char *s = NULL;
5423 Py_ssize_t string_len = 0;
5424 ob = PyObject_New(test_structmembers, type);
5425 if (ob == NULL)
5426 return NULL;
5427 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5428 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5429 &ob->structmembers.bool_member,
5430 &ob->structmembers.byte_member,
5431 &ob->structmembers.ubyte_member,
5432 &ob->structmembers.short_member,
5433 &ob->structmembers.ushort_member,
5434 &ob->structmembers.int_member,
5435 &ob->structmembers.uint_member,
5436 &ob->structmembers.long_member,
5437 &ob->structmembers.ulong_member,
5438 &ob->structmembers.pyssizet_member,
5439 &ob->structmembers.float_member,
5440 &ob->structmembers.double_member,
5441 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 , &ob->structmembers.longlong_member,
5443 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005444 )) {
5445 Py_DECREF(ob);
5446 return NULL;
5447 }
5448 if (s != NULL) {
5449 if (string_len > 5) {
5450 Py_DECREF(ob);
5451 PyErr_SetString(PyExc_ValueError, "string too long");
5452 return NULL;
5453 }
5454 strcpy(ob->structmembers.inplace_member, s);
5455 }
5456 else {
5457 strcpy(ob->structmembers.inplace_member, "");
5458 }
5459 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005460}
5461
Christian Heimes1af737c2008-01-23 08:24:23 +00005462static void
5463test_structmembers_free(PyObject *ob)
5464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005465 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005466}
5467
5468static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005469 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 "test_structmembersType",
5471 sizeof(test_structmembers), /* tp_basicsize */
5472 0, /* tp_itemsize */
5473 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005474 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005475 0, /* tp_getattr */
5476 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005477 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005478 0, /* tp_repr */
5479 0, /* tp_as_number */
5480 0, /* tp_as_sequence */
5481 0, /* tp_as_mapping */
5482 0, /* tp_hash */
5483 0, /* tp_call */
5484 0, /* tp_str */
5485 PyObject_GenericGetAttr, /* tp_getattro */
5486 PyObject_GenericSetAttr, /* tp_setattro */
5487 0, /* tp_as_buffer */
5488 0, /* tp_flags */
5489 "Type containing all structmember types",
5490 0, /* traverseproc tp_traverse */
5491 0, /* tp_clear */
5492 0, /* tp_richcompare */
5493 0, /* tp_weaklistoffset */
5494 0, /* tp_iter */
5495 0, /* tp_iternext */
5496 0, /* tp_methods */
5497 test_members, /* tp_members */
5498 0,
5499 0,
5500 0,
5501 0,
5502 0,
5503 0,
5504 0,
5505 0,
5506 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005507};
5508
5509
Benjamin Petersond51374e2014-04-09 23:55:56 -04005510typedef struct {
5511 PyObject_HEAD
5512} matmulObject;
5513
5514static PyObject *
5515matmulType_matmul(PyObject *self, PyObject *other)
5516{
5517 return Py_BuildValue("(sOO)", "matmul", self, other);
5518}
5519
5520static PyObject *
5521matmulType_imatmul(PyObject *self, PyObject *other)
5522{
5523 return Py_BuildValue("(sOO)", "imatmul", self, other);
5524}
5525
5526static void
5527matmulType_dealloc(PyObject *self)
5528{
Zachary Ware420dc562014-04-23 13:51:27 -05005529 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005530}
5531
5532static PyNumberMethods matmulType_as_number = {
5533 0, /* nb_add */
5534 0, /* nb_subtract */
5535 0, /* nb_multiply */
5536 0, /* nb_remainde r*/
5537 0, /* nb_divmod */
5538 0, /* nb_power */
5539 0, /* nb_negative */
5540 0, /* tp_positive */
5541 0, /* tp_absolute */
5542 0, /* tp_bool */
5543 0, /* nb_invert */
5544 0, /* nb_lshift */
5545 0, /* nb_rshift */
5546 0, /* nb_and */
5547 0, /* nb_xor */
5548 0, /* nb_or */
5549 0, /* nb_int */
5550 0, /* nb_reserved */
5551 0, /* nb_float */
5552 0, /* nb_inplace_add */
5553 0, /* nb_inplace_subtract */
5554 0, /* nb_inplace_multiply */
5555 0, /* nb_inplace_remainder */
5556 0, /* nb_inplace_power */
5557 0, /* nb_inplace_lshift */
5558 0, /* nb_inplace_rshift */
5559 0, /* nb_inplace_and */
5560 0, /* nb_inplace_xor */
5561 0, /* nb_inplace_or */
5562 0, /* nb_floor_divide */
5563 0, /* nb_true_divide */
5564 0, /* nb_inplace_floor_divide */
5565 0, /* nb_inplace_true_divide */
5566 0, /* nb_index */
5567 matmulType_matmul, /* nb_matrix_multiply */
5568 matmulType_imatmul /* nb_matrix_inplace_multiply */
5569};
5570
5571static PyTypeObject matmulType = {
5572 PyVarObject_HEAD_INIT(NULL, 0)
5573 "matmulType",
5574 sizeof(matmulObject), /* tp_basicsize */
5575 0, /* tp_itemsize */
5576 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005577 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005578 0, /* tp_getattr */
5579 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005580 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005581 0, /* tp_repr */
5582 &matmulType_as_number, /* tp_as_number */
5583 0, /* tp_as_sequence */
5584 0, /* tp_as_mapping */
5585 0, /* tp_hash */
5586 0, /* tp_call */
5587 0, /* tp_str */
5588 PyObject_GenericGetAttr, /* tp_getattro */
5589 PyObject_GenericSetAttr, /* tp_setattro */
5590 0, /* tp_as_buffer */
5591 0, /* tp_flags */
5592 "C level type with matrix operations defined",
5593 0, /* traverseproc tp_traverse */
5594 0, /* tp_clear */
5595 0, /* tp_richcompare */
5596 0, /* tp_weaklistoffset */
5597 0, /* tp_iter */
5598 0, /* tp_iternext */
5599 0, /* tp_methods */
5600 0, /* tp_members */
5601 0,
5602 0,
5603 0,
5604 0,
5605 0,
5606 0,
5607 0,
5608 0,
5609 PyType_GenericNew, /* tp_new */
5610 PyObject_Del, /* tp_free */
5611};
5612
Zackery Spytzc7f803b2019-05-31 03:46:36 -06005613typedef struct {
5614 PyObject_HEAD
5615} ipowObject;
5616
5617static PyObject *
5618ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
5619{
5620 return Py_BuildValue("OO", other, mod);
5621}
5622
5623static PyNumberMethods ipowType_as_number = {
5624 .nb_inplace_power = ipowType_ipow
5625};
5626
5627static PyTypeObject ipowType = {
5628 PyVarObject_HEAD_INIT(NULL, 0)
5629 .tp_name = "ipowType",
5630 .tp_basicsize = sizeof(ipowObject),
5631 .tp_as_number = &ipowType_as_number,
5632 .tp_new = PyType_GenericNew
5633};
Martin v. Löwis1a214512008-06-11 05:26:20 +00005634
Yury Selivanov75445082015-05-11 22:57:16 -04005635typedef struct {
5636 PyObject_HEAD
5637 PyObject *ao_iterator;
5638} awaitObject;
5639
5640
5641static PyObject *
5642awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5643{
5644 PyObject *v;
5645 awaitObject *ao;
5646
5647 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
5648 return NULL;
5649
5650 ao = (awaitObject *)type->tp_alloc(type, 0);
5651 if (ao == NULL) {
5652 return NULL;
5653 }
5654
5655 Py_INCREF(v);
5656 ao->ao_iterator = v;
5657
5658 return (PyObject *)ao;
5659}
5660
5661
5662static void
5663awaitObject_dealloc(awaitObject *ao)
5664{
5665 Py_CLEAR(ao->ao_iterator);
5666 Py_TYPE(ao)->tp_free(ao);
5667}
5668
5669
5670static PyObject *
5671awaitObject_await(awaitObject *ao)
5672{
5673 Py_INCREF(ao->ao_iterator);
5674 return ao->ao_iterator;
5675}
5676
5677static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04005678 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04005679 0, /* am_aiter */
5680 0 /* am_anext */
5681};
5682
5683
5684static PyTypeObject awaitType = {
5685 PyVarObject_HEAD_INIT(NULL, 0)
5686 "awaitType",
5687 sizeof(awaitObject), /* tp_basicsize */
5688 0, /* tp_itemsize */
5689 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005690 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04005691 0, /* tp_getattr */
5692 0, /* tp_setattr */
5693 &awaitType_as_async, /* tp_as_async */
5694 0, /* tp_repr */
5695 0, /* tp_as_number */
5696 0, /* tp_as_sequence */
5697 0, /* tp_as_mapping */
5698 0, /* tp_hash */
5699 0, /* tp_call */
5700 0, /* tp_str */
5701 PyObject_GenericGetAttr, /* tp_getattro */
5702 PyObject_GenericSetAttr, /* tp_setattro */
5703 0, /* tp_as_buffer */
5704 0, /* tp_flags */
5705 "C level type with tp_as_async",
5706 0, /* traverseproc tp_traverse */
5707 0, /* tp_clear */
5708 0, /* tp_richcompare */
5709 0, /* tp_weaklistoffset */
5710 0, /* tp_iter */
5711 0, /* tp_iternext */
5712 0, /* tp_methods */
5713 0, /* tp_members */
5714 0,
5715 0,
5716 0,
5717 0,
5718 0,
5719 0,
5720 0,
5721 0,
5722 awaitObject_new, /* tp_new */
5723 PyObject_Del, /* tp_free */
5724};
5725
5726
xdegaye56d1f5c2017-10-26 15:09:06 +02005727static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
5728
5729static PyTypeObject PyRecursingInfinitelyError_Type = {
5730 PyVarObject_HEAD_INIT(NULL, 0)
5731 "RecursingInfinitelyError", /* tp_name */
5732 sizeof(PyBaseExceptionObject), /* tp_basicsize */
5733 0, /* tp_itemsize */
5734 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005735 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02005736 0, /* tp_getattr */
5737 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005738 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02005739 0, /* tp_repr */
5740 0, /* tp_as_number */
5741 0, /* tp_as_sequence */
5742 0, /* tp_as_mapping */
5743 0, /* tp_hash */
5744 0, /* tp_call */
5745 0, /* tp_str */
5746 0, /* tp_getattro */
5747 0, /* tp_setattro */
5748 0, /* tp_as_buffer */
5749 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5750 "Instantiating this exception starts infinite recursion.", /* tp_doc */
5751 0, /* tp_traverse */
5752 0, /* tp_clear */
5753 0, /* tp_richcompare */
5754 0, /* tp_weaklistoffset */
5755 0, /* tp_iter */
5756 0, /* tp_iternext */
5757 0, /* tp_methods */
5758 0, /* tp_members */
5759 0, /* tp_getset */
5760 0, /* tp_base */
5761 0, /* tp_dict */
5762 0, /* tp_descr_get */
5763 0, /* tp_descr_set */
5764 0, /* tp_dictoffset */
5765 (initproc)recurse_infinitely_error_init, /* tp_init */
5766 0, /* tp_alloc */
5767 0, /* tp_new */
5768};
5769
5770static int
5771recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
5772{
5773 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
5774
5775 /* Instantiating this exception starts infinite recursion. */
5776 Py_INCREF(type);
5777 PyErr_SetObject(type, NULL);
5778 return -1;
5779}
5780
5781
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005782/* Test bpo-35983: create a subclass of "list" which checks that instances
5783 * are not deallocated twice */
5784
5785typedef struct {
5786 PyListObject list;
5787 int deallocated;
5788} MyListObject;
5789
5790static PyObject *
5791MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5792{
5793 PyObject* op = PyList_Type.tp_new(type, args, kwds);
5794 ((MyListObject*)op)->deallocated = 0;
5795 return op;
5796}
5797
5798void
5799MyList_dealloc(MyListObject* op)
5800{
5801 if (op->deallocated) {
5802 /* We cannot raise exceptions here but we still want the testsuite
5803 * to fail when we hit this */
5804 Py_FatalError("MyList instance deallocated twice");
5805 }
5806 op->deallocated = 1;
5807 PyList_Type.tp_dealloc((PyObject *)op);
5808}
5809
5810static PyTypeObject MyList_Type = {
5811 PyVarObject_HEAD_INIT(NULL, 0)
5812 "MyList",
5813 sizeof(MyListObject),
5814 0,
5815 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005816 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005817 0, /* tp_getattr */
5818 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005819 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005820 0, /* tp_repr */
5821 0, /* tp_as_number */
5822 0, /* tp_as_sequence */
5823 0, /* tp_as_mapping */
5824 0, /* tp_hash */
5825 0, /* tp_call */
5826 0, /* tp_str */
5827 0, /* tp_getattro */
5828 0, /* tp_setattro */
5829 0, /* tp_as_buffer */
5830 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5831 0, /* tp_doc */
5832 0, /* tp_traverse */
5833 0, /* tp_clear */
5834 0, /* tp_richcompare */
5835 0, /* tp_weaklistoffset */
5836 0, /* tp_iter */
5837 0, /* tp_iternext */
5838 0, /* tp_methods */
5839 0, /* tp_members */
5840 0, /* tp_getset */
5841 0, /* &PyList_Type */ /* tp_base */
5842 0, /* tp_dict */
5843 0, /* tp_descr_get */
5844 0, /* tp_descr_set */
5845 0, /* tp_dictoffset */
5846 0, /* tp_init */
5847 0, /* tp_alloc */
5848 MyList_new, /* tp_new */
5849};
5850
5851
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005852/* Test PEP 560 */
5853
5854typedef struct {
5855 PyObject_HEAD
5856 PyObject *item;
5857} PyGenericAliasObject;
5858
5859static void
5860generic_alias_dealloc(PyGenericAliasObject *self)
5861{
5862 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01005863 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005864}
5865
5866static PyObject *
5867generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
5868{
5869 return PyTuple_Pack(1, self->item);
5870}
5871
5872static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005873 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005874 {NULL} /* sentinel */
5875};
5876
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07005877static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005878 PyVarObject_HEAD_INIT(NULL, 0)
5879 "GenericAlias",
5880 sizeof(PyGenericAliasObject),
5881 0,
5882 .tp_dealloc = (destructor)generic_alias_dealloc,
5883 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5884 .tp_methods = generic_alias_methods,
5885};
5886
5887static PyObject *
5888generic_alias_new(PyObject *item)
5889{
5890 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
5891 if (o == NULL) {
5892 return NULL;
5893 }
5894 Py_INCREF(item);
5895 o->item = item;
5896 return (PyObject*) o;
5897}
5898
5899typedef struct {
5900 PyObject_HEAD
5901} PyGenericObject;
5902
5903static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005904generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005905{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005906 return generic_alias_new(item);
5907}
5908
5909static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005910 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005911 {NULL} /* sentinel */
5912};
5913
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07005914static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005915 PyVarObject_HEAD_INIT(NULL, 0)
5916 "Generic",
5917 sizeof(PyGenericObject),
5918 0,
5919 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5920 .tp_methods = generic_methods,
5921};
5922
5923
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005924/* Test PEP 590 */
5925
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005926typedef struct {
5927 PyObject_HEAD
5928 vectorcallfunc vectorcall;
5929} MethodDescriptorObject;
5930
5931static PyObject *
5932MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
5933 size_t nargsf, PyObject *kwnames)
5934{
5935 /* True if using the vectorcall function in MethodDescriptorObject
5936 * but False for MethodDescriptor2Object */
5937 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
5938 return PyBool_FromLong(md->vectorcall != NULL);
5939}
5940
5941static PyObject *
5942MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
5943{
Petr Viktorine584cbf2019-06-03 01:08:14 +02005944 MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005945 op->vectorcall = MethodDescriptor_vectorcall;
5946 return (PyObject *)op;
5947}
5948
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005949static PyObject *
5950func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
5951{
5952 if (obj == Py_None || obj == NULL) {
5953 Py_INCREF(func);
5954 return func;
5955 }
5956 return PyMethod_New(func, obj);
5957}
5958
5959static PyObject *
5960nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
5961{
5962 Py_INCREF(func);
5963 return func;
5964}
5965
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005966static PyObject *
5967call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
5968{
5969 Py_INCREF(args);
5970 return args;
5971}
5972
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005973static PyTypeObject MethodDescriptorBase_Type = {
5974 PyVarObject_HEAD_INIT(NULL, 0)
5975 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005976 sizeof(MethodDescriptorObject),
5977 .tp_new = MethodDescriptor_new,
5978 .tp_call = PyVectorcall_Call,
5979 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
5980 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
5981 Py_TPFLAGS_METHOD_DESCRIPTOR | _Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005982 .tp_descr_get = func_descr_get,
5983};
5984
5985static PyTypeObject MethodDescriptorDerived_Type = {
5986 PyVarObject_HEAD_INIT(NULL, 0)
5987 "MethodDescriptorDerived",
5988 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5989};
5990
5991static PyTypeObject MethodDescriptorNopGet_Type = {
5992 PyVarObject_HEAD_INIT(NULL, 0)
5993 "MethodDescriptorNopGet",
5994 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005995 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005996 .tp_descr_get = nop_descr_get,
5997};
5998
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005999typedef struct {
6000 MethodDescriptorObject base;
6001 vectorcallfunc vectorcall;
6002} MethodDescriptor2Object;
6003
6004static PyObject *
6005MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6006{
6007 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
6008 op->base.vectorcall = NULL;
6009 op->vectorcall = MethodDescriptor_vectorcall;
6010 return (PyObject *)op;
6011}
6012
6013static PyTypeObject MethodDescriptor2_Type = {
6014 PyVarObject_HEAD_INIT(NULL, 0)
6015 "MethodDescriptor2",
6016 sizeof(MethodDescriptor2Object),
6017 .tp_new = MethodDescriptor2_new,
6018 .tp_call = PyVectorcall_Call,
6019 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
6020 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | _Py_TPFLAGS_HAVE_VECTORCALL,
6021};
6022
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006023
Martin v. Löwis1a214512008-06-11 05:26:20 +00006024static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025 PyModuleDef_HEAD_INIT,
6026 "_testcapi",
6027 NULL,
6028 -1,
6029 TestMethods,
6030 NULL,
6031 NULL,
6032 NULL,
6033 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006034};
6035
Nick Coghland5cacbb2015-05-23 22:24:10 +10006036/* Per PEP 489, this module will not be converted to multi-phase initialization
6037 */
6038
Mark Hammond62b1ab12002-07-23 06:31:15 +00006039PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006040PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00006041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006042 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006044 m = PyModule_Create(&_testcapimodule);
6045 if (m == NULL)
6046 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006048 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00006049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006050 Py_TYPE(&test_structmembersType)=&PyType_Type;
6051 Py_INCREF(&test_structmembersType);
6052 /* don't use a name starting with "test", since we don't want
6053 test_capi to automatically call this */
6054 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04006055 if (PyType_Ready(&matmulType) < 0)
6056 return NULL;
6057 Py_INCREF(&matmulType);
6058 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06006059 if (PyType_Ready(&ipowType) < 0) {
6060 return NULL;
6061 }
6062 Py_INCREF(&ipowType);
6063 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00006064
Yury Selivanov75445082015-05-11 22:57:16 -04006065 if (PyType_Ready(&awaitType) < 0)
6066 return NULL;
6067 Py_INCREF(&awaitType);
6068 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
6069
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006070 MyList_Type.tp_base = &PyList_Type;
6071 if (PyType_Ready(&MyList_Type) < 0)
6072 return NULL;
6073 Py_INCREF(&MyList_Type);
6074 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
6075
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006076 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
6077 return NULL;
6078 Py_INCREF(&MethodDescriptorBase_Type);
6079 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
6080
6081 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
6082 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
6083 return NULL;
6084 Py_INCREF(&MethodDescriptorDerived_Type);
6085 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
6086
6087 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
6088 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
6089 return NULL;
6090 Py_INCREF(&MethodDescriptorNopGet_Type);
6091 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
6092
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006093 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
6094 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
6095 return NULL;
6096 Py_INCREF(&MethodDescriptor2_Type);
6097 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
6098
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006099 if (PyType_Ready(&GenericAlias_Type) < 0)
6100 return NULL;
6101 Py_INCREF(&GenericAlias_Type);
6102 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
6103
6104 if (PyType_Ready(&Generic_Type) < 0)
6105 return NULL;
6106 Py_INCREF(&Generic_Type);
6107 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
6108
xdegaye56d1f5c2017-10-26 15:09:06 +02006109 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
6110 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
6111 return NULL;
6112 }
6113 Py_INCREF(&PyRecursingInfinitelyError_Type);
6114 PyModule_AddObject(m, "RecursingInfinitelyError",
6115 (PyObject *)&PyRecursingInfinitelyError_Type);
6116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
6118 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
6119 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
6120 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
6121 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
6122 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
6123 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
6124 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
6125 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
6126 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
6127 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
6128 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
6129 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
6130 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
6131 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
6132 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
6133 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
6134 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
6135 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
6136 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
6137 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
6138 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02006139 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006140 Py_INCREF(&PyInstanceMethod_Type);
6141 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00006142
Larry Hastings2a727912014-01-16 11:32:01 -08006143 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner5d39e042017-11-29 17:20:38 +01006144#ifdef WITH_PYMALLOC
6145 PyModule_AddObject(m, "WITH_PYMALLOC", Py_True);
6146#else
6147 PyModule_AddObject(m, "WITH_PYMALLOC", Py_False);
6148#endif
Larry Hastings2a727912014-01-16 11:32:01 -08006149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
6151 Py_INCREF(TestError);
6152 PyModule_AddObject(m, "error", TestError);
6153 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006154}