blob: bf20e81a4ce8885d6a361ab0f3fa58ed617e7dd9 [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
828/* Test the PyLong_AsDouble API. At present this just tests that
829 non-integer arguments are handled correctly.
830 */
831
832static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530833test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200834{
835 double out;
836
837 Py_INCREF(Py_None);
838
839 out = PyLong_AsDouble(Py_None);
840 if (out != -1.0 || !PyErr_Occurred())
841 return raiseTestError("test_long_as_double",
842 "PyLong_AsDouble(None) didn't complain");
843 if (!PyErr_ExceptionMatches(PyExc_TypeError))
844 return raiseTestError("test_long_as_double",
845 "PyLong_AsDouble(None) raised "
846 "something other than TypeError");
847 PyErr_Clear();
848
849 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
850 return Py_None;
851}
852
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700853/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000854 for both long and int arguments. The test may leak a little memory if
855 it fails.
856*/
857static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530858test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersd38b1c72001-09-30 05:09:37 +0000859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700861 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 tuple = PyTuple_New(1);
864 if (tuple == NULL)
865 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 num = PyLong_FromLong(42);
868 if (num == NULL)
869 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300874 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300876 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 if (value != 42)
878 return raiseTestError("test_L_code",
879 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 Py_DECREF(num);
882 num = PyLong_FromLong(42);
883 if (num == NULL)
884 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300889 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300891 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 if (value != 42)
893 return raiseTestError("test_L_code",
894 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200897 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000898}
899
Serhiy Storchakace412872016-05-08 23:36:44 +0300900static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300901return_none(void *unused)
902{
903 Py_RETURN_NONE;
904}
905
906static PyObject *
907raise_error(void *unused)
908{
909 PyErr_SetNone(PyExc_ValueError);
910 return NULL;
911}
912
913static int
914test_buildvalue_N_error(const char *fmt)
915{
916 PyObject *arg, *res;
917
918 arg = PyList_New(0);
919 if (arg == NULL) {
920 return -1;
921 }
922
923 Py_INCREF(arg);
924 res = Py_BuildValue(fmt, return_none, NULL, arg);
925 if (res == NULL) {
926 return -1;
927 }
928 Py_DECREF(res);
929 if (Py_REFCNT(arg) != 1) {
930 PyErr_Format(TestError, "test_buildvalue_N: "
931 "arg was not decrefed in successful "
932 "Py_BuildValue(\"%s\")", fmt);
933 return -1;
934 }
935
936 Py_INCREF(arg);
937 res = Py_BuildValue(fmt, raise_error, NULL, arg);
938 if (res != NULL || !PyErr_Occurred()) {
939 PyErr_Format(TestError, "test_buildvalue_N: "
940 "Py_BuildValue(\"%s\") didn't complain", fmt);
941 return -1;
942 }
943 PyErr_Clear();
944 if (Py_REFCNT(arg) != 1) {
945 PyErr_Format(TestError, "test_buildvalue_N: "
946 "arg was not decrefed in failed "
947 "Py_BuildValue(\"%s\")", fmt);
948 return -1;
949 }
950 Py_DECREF(arg);
951 return 0;
952}
953
954static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +0200955test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300956{
957 PyObject *arg, *res;
958
959 arg = PyList_New(0);
960 if (arg == NULL) {
961 return NULL;
962 }
963 Py_INCREF(arg);
964 res = Py_BuildValue("N", arg);
965 if (res == NULL) {
966 return NULL;
967 }
968 if (res != arg) {
969 return raiseTestError("test_buildvalue_N",
970 "Py_BuildValue(\"N\") returned wrong result");
971 }
972 if (Py_REFCNT(arg) != 2) {
973 return raiseTestError("test_buildvalue_N",
974 "arg was not decrefed in Py_BuildValue(\"N\")");
975 }
976 Py_DECREF(res);
977 Py_DECREF(arg);
978
979 if (test_buildvalue_N_error("O&N") < 0)
980 return NULL;
981 if (test_buildvalue_N_error("(O&N)") < 0)
982 return NULL;
983 if (test_buildvalue_N_error("[O&N]") < 0)
984 return NULL;
985 if (test_buildvalue_N_error("{O&N}") < 0)
986 return NULL;
987 if (test_buildvalue_N_error("{()O&(())N}") < 0)
988 return NULL;
989
990 Py_RETURN_NONE;
991}
992
993
994static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +0300995get_args(PyObject *self, PyObject *args)
996{
997 if (args == NULL) {
998 args = Py_None;
999 }
1000 Py_INCREF(args);
1001 return args;
1002}
1003
1004static PyObject *
1005get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1006{
1007 if (kwargs == NULL) {
1008 kwargs = Py_None;
1009 }
1010 Py_INCREF(kwargs);
1011 return kwargs;
1012}
1013
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001014/* Test tuple argument processing */
1015static PyObject *
1016getargs_tuple(PyObject *self, PyObject *args)
1017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 int a, b, c;
1019 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1020 return NULL;
1021 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001022}
1023
Christian Heimes380f7f22008-02-28 11:19:05 +00001024/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001025static PyObject *
1026getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001027{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001029 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1033 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1034 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1035 return NULL;
1036 return Py_BuildValue("iiiiiiiiii",
1037 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1038 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001039}
1040
Larry Hastings83a9f482012-03-20 20:06:16 +00001041/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1042static PyObject *
1043getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1044{
1045 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1046 int required = -1;
1047 int optional = -1;
1048 int keyword_only = -1;
1049
1050 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1051 &required, &optional, &keyword_only))
1052 return NULL;
1053 return Py_BuildValue("iii", required, optional, keyword_only);
1054}
1055
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001056/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1057static PyObject *
1058getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1059{
1060 static char *keywords[] = {"", "", "keyword", NULL};
1061 int required = -1;
1062 int optional = -1;
1063 int keyword = -1;
1064
1065 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1066 &required, &optional, &keyword))
1067 return NULL;
1068 return Py_BuildValue("iii", required, optional, keyword);
1069}
1070
Thomas Heller3457e4b2003-04-24 16:14:27 +00001071/* Functions to call PyArg_ParseTuple with integer format codes,
1072 and return the result.
1073*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001074static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001075getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 unsigned char value;
1078 if (!PyArg_ParseTuple(args, "b", &value))
1079 return NULL;
1080 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001081}
1082
Thomas Heller3457e4b2003-04-24 16:14:27 +00001083static PyObject *
1084getargs_B(PyObject *self, PyObject *args)
1085{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 unsigned char value;
1087 if (!PyArg_ParseTuple(args, "B", &value))
1088 return NULL;
1089 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001090}
1091
1092static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001093getargs_h(PyObject *self, PyObject *args)
1094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 short value;
1096 if (!PyArg_ParseTuple(args, "h", &value))
1097 return NULL;
1098 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001099}
1100
1101static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001102getargs_H(PyObject *self, PyObject *args)
1103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 unsigned short value;
1105 if (!PyArg_ParseTuple(args, "H", &value))
1106 return NULL;
1107 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001108}
1109
1110static PyObject *
1111getargs_I(PyObject *self, PyObject *args)
1112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 unsigned int value;
1114 if (!PyArg_ParseTuple(args, "I", &value))
1115 return NULL;
1116 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001117}
1118
1119static PyObject *
1120getargs_k(PyObject *self, PyObject *args)
1121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 unsigned long value;
1123 if (!PyArg_ParseTuple(args, "k", &value))
1124 return NULL;
1125 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001126}
1127
1128static PyObject *
1129getargs_i(PyObject *self, PyObject *args)
1130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 int value;
1132 if (!PyArg_ParseTuple(args, "i", &value))
1133 return NULL;
1134 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001135}
1136
Thomas Hellera4ea6032003-04-17 18:55:45 +00001137static PyObject *
1138getargs_l(PyObject *self, PyObject *args)
1139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 long value;
1141 if (!PyArg_ParseTuple(args, "l", &value))
1142 return NULL;
1143 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001144}
1145
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001146static PyObject *
1147getargs_n(PyObject *self, PyObject *args)
1148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 Py_ssize_t value;
1150 if (!PyArg_ParseTuple(args, "n", &value))
1151 return NULL;
1152 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001153}
1154
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001155static PyObject *
1156getargs_p(PyObject *self, PyObject *args)
1157{
1158 int value;
1159 if (!PyArg_ParseTuple(args, "p", &value))
1160 return NULL;
1161 return PyLong_FromLong(value);
1162}
1163
Thomas Hellera4ea6032003-04-17 18:55:45 +00001164static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001165getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001166{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001167 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 if (!PyArg_ParseTuple(args, "L", &value))
1169 return NULL;
1170 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001171}
1172
Thomas Hellera4ea6032003-04-17 18:55:45 +00001173static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001174getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001175{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001176 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 if (!PyArg_ParseTuple(args, "K", &value))
1178 return NULL;
1179 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001180}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001181
1182/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001183 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001184static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301185test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001186{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 PyObject *tuple, *num;
1188 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 tuple = PyTuple_New(1);
1191 if (tuple == NULL)
1192 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 /* a number larger than ULONG_MAX even on 64-bit platforms */
1195 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1196 if (num == NULL)
1197 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 value = PyLong_AsUnsignedLongMask(num);
1200 if (value != ULONG_MAX)
1201 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001202 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001207 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001209 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 if (value != ULONG_MAX)
1211 return raiseTestError("test_k_code",
1212 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 Py_DECREF(num);
1215 num = PyLong_FromString("-FFFFFFFF000000000000000042", 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 != (unsigned long)-0x42)
1221 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001222 "PyLong_AsUnsignedLongMask() returned wrong "
1223 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001228 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001230 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 if (value != (unsigned long)-0x42)
1232 return raiseTestError("test_k_code",
1233 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001236 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001237}
1238
Victor Stinner06e49dd2010-06-13 18:21:50 +00001239static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001240getargs_f(PyObject *self, PyObject *args)
1241{
1242 float f;
1243 if (!PyArg_ParseTuple(args, "f", &f))
1244 return NULL;
1245 return PyFloat_FromDouble(f);
1246}
1247
1248static PyObject *
1249getargs_d(PyObject *self, PyObject *args)
1250{
1251 double d;
1252 if (!PyArg_ParseTuple(args, "d", &d))
1253 return NULL;
1254 return PyFloat_FromDouble(d);
1255}
1256
1257static PyObject *
1258getargs_D(PyObject *self, PyObject *args)
1259{
1260 Py_complex cval;
1261 if (!PyArg_ParseTuple(args, "D", &cval))
1262 return NULL;
1263 return PyComplex_FromCComplex(cval);
1264}
1265
1266static PyObject *
1267getargs_S(PyObject *self, PyObject *args)
1268{
1269 PyObject *obj;
1270 if (!PyArg_ParseTuple(args, "S", &obj))
1271 return NULL;
1272 Py_INCREF(obj);
1273 return obj;
1274}
1275
1276static PyObject *
1277getargs_Y(PyObject *self, PyObject *args)
1278{
1279 PyObject *obj;
1280 if (!PyArg_ParseTuple(args, "Y", &obj))
1281 return NULL;
1282 Py_INCREF(obj);
1283 return obj;
1284}
1285
1286static PyObject *
1287getargs_U(PyObject *self, PyObject *args)
1288{
1289 PyObject *obj;
1290 if (!PyArg_ParseTuple(args, "U", &obj))
1291 return NULL;
1292 Py_INCREF(obj);
1293 return obj;
1294}
1295
1296static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001297getargs_c(PyObject *self, PyObject *args)
1298{
1299 char c;
1300 if (!PyArg_ParseTuple(args, "c", &c))
1301 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001302 return PyLong_FromLong((unsigned char)c);
1303}
1304
1305static PyObject *
1306getargs_C(PyObject *self, PyObject *args)
1307{
1308 int c;
1309 if (!PyArg_ParseTuple(args, "C", &c))
1310 return NULL;
1311 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001312}
1313
1314static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001315getargs_s(PyObject *self, PyObject *args)
1316{
1317 char *str;
1318 if (!PyArg_ParseTuple(args, "s", &str))
1319 return NULL;
1320 return PyBytes_FromString(str);
1321}
1322
1323static PyObject *
1324getargs_s_star(PyObject *self, PyObject *args)
1325{
1326 Py_buffer buffer;
1327 PyObject *bytes;
1328 if (!PyArg_ParseTuple(args, "s*", &buffer))
1329 return NULL;
1330 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1331 PyBuffer_Release(&buffer);
1332 return bytes;
1333}
1334
1335static PyObject *
1336getargs_s_hash(PyObject *self, PyObject *args)
1337{
1338 char *str;
1339 Py_ssize_t size;
1340 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1341 return NULL;
1342 return PyBytes_FromStringAndSize(str, size);
1343}
1344
1345static PyObject *
1346getargs_z(PyObject *self, PyObject *args)
1347{
1348 char *str;
1349 if (!PyArg_ParseTuple(args, "z", &str))
1350 return NULL;
1351 if (str != NULL)
1352 return PyBytes_FromString(str);
1353 else
1354 Py_RETURN_NONE;
1355}
1356
1357static PyObject *
1358getargs_z_star(PyObject *self, PyObject *args)
1359{
1360 Py_buffer buffer;
1361 PyObject *bytes;
1362 if (!PyArg_ParseTuple(args, "z*", &buffer))
1363 return NULL;
1364 if (buffer.buf != NULL)
1365 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1366 else {
1367 Py_INCREF(Py_None);
1368 bytes = Py_None;
1369 }
1370 PyBuffer_Release(&buffer);
1371 return bytes;
1372}
1373
1374static PyObject *
1375getargs_z_hash(PyObject *self, PyObject *args)
1376{
1377 char *str;
1378 Py_ssize_t size;
1379 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1380 return NULL;
1381 if (str != NULL)
1382 return PyBytes_FromStringAndSize(str, size);
1383 else
1384 Py_RETURN_NONE;
1385}
1386
1387static PyObject *
1388getargs_y(PyObject *self, PyObject *args)
1389{
1390 char *str;
1391 if (!PyArg_ParseTuple(args, "y", &str))
1392 return NULL;
1393 return PyBytes_FromString(str);
1394}
1395
1396static PyObject *
1397getargs_y_star(PyObject *self, PyObject *args)
1398{
1399 Py_buffer buffer;
1400 PyObject *bytes;
1401 if (!PyArg_ParseTuple(args, "y*", &buffer))
1402 return NULL;
1403 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1404 PyBuffer_Release(&buffer);
1405 return bytes;
1406}
1407
1408static PyObject *
1409getargs_y_hash(PyObject *self, PyObject *args)
1410{
1411 char *str;
1412 Py_ssize_t size;
1413 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1414 return NULL;
1415 return PyBytes_FromStringAndSize(str, size);
1416}
1417
1418static PyObject *
1419getargs_u(PyObject *self, PyObject *args)
1420{
1421 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001422 if (!PyArg_ParseTuple(args, "u", &str))
1423 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001424 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001425}
1426
1427static PyObject *
1428getargs_u_hash(PyObject *self, PyObject *args)
1429{
1430 Py_UNICODE *str;
1431 Py_ssize_t size;
1432 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1433 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001434 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001435}
1436
1437static PyObject *
1438getargs_Z(PyObject *self, PyObject *args)
1439{
1440 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001441 if (!PyArg_ParseTuple(args, "Z", &str))
1442 return NULL;
1443 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001444 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001445 } else
1446 Py_RETURN_NONE;
1447}
1448
1449static PyObject *
1450getargs_Z_hash(PyObject *self, PyObject *args)
1451{
1452 Py_UNICODE *str;
1453 Py_ssize_t size;
1454 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1455 return NULL;
1456 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001457 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001458 else
1459 Py_RETURN_NONE;
1460}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001461
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001462static PyObject *
1463getargs_es(PyObject *self, PyObject *args)
1464{
1465 PyObject *arg, *result;
1466 const char *encoding = NULL;
1467 char *str;
1468
1469 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1470 return NULL;
1471 if (!PyArg_Parse(arg, "es", encoding, &str))
1472 return NULL;
1473 result = PyBytes_FromString(str);
1474 PyMem_Free(str);
1475 return result;
1476}
1477
1478static PyObject *
1479getargs_et(PyObject *self, PyObject *args)
1480{
1481 PyObject *arg, *result;
1482 const char *encoding = NULL;
1483 char *str;
1484
1485 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1486 return NULL;
1487 if (!PyArg_Parse(arg, "et", encoding, &str))
1488 return NULL;
1489 result = PyBytes_FromString(str);
1490 PyMem_Free(str);
1491 return result;
1492}
1493
1494static PyObject *
1495getargs_es_hash(PyObject *self, PyObject *args)
1496{
1497 PyObject *arg, *result;
1498 const char *encoding = NULL;
1499 PyByteArrayObject *buffer = NULL;
1500 char *str = NULL;
1501 Py_ssize_t size;
1502
1503 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1504 return NULL;
1505 if (buffer != NULL) {
1506 str = PyByteArray_AS_STRING(buffer);
1507 size = PyByteArray_GET_SIZE(buffer);
1508 }
1509 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1510 return NULL;
1511 result = PyBytes_FromStringAndSize(str, size);
1512 if (buffer == NULL)
1513 PyMem_Free(str);
1514 return result;
1515}
1516
1517static PyObject *
1518getargs_et_hash(PyObject *self, PyObject *args)
1519{
1520 PyObject *arg, *result;
1521 const char *encoding = NULL;
1522 PyByteArrayObject *buffer = NULL;
1523 char *str = NULL;
1524 Py_ssize_t size;
1525
1526 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1527 return NULL;
1528 if (buffer != NULL) {
1529 str = PyByteArray_AS_STRING(buffer);
1530 size = PyByteArray_GET_SIZE(buffer);
1531 }
1532 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1533 return NULL;
1534 result = PyBytes_FromStringAndSize(str, size);
1535 if (buffer == NULL)
1536 PyMem_Free(str);
1537 return result;
1538}
1539
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001540/* Test the s and z codes for PyArg_ParseTuple.
1541*/
1542static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301543test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001544{
1545 /* Unicode strings should be accepted */
1546 PyObject *tuple, *obj;
1547 char *value;
1548
1549 tuple = PyTuple_New(1);
1550 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001552
1553 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001555 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001557
1558 PyTuple_SET_ITEM(tuple, 0, obj);
1559
1560 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001562 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001563 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1564 return NULL;
1565 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001566
Oren Milmanba7d7362017-08-29 11:58:27 +03001567 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1568 return NULL;
1569 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001570
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001571 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001572 Py_RETURN_NONE;
1573}
1574
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001575static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001576parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001577{
Larry Hastings8f904da2012-06-22 03:56:29 -07001578 PyObject *sub_args;
1579 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001580 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001581 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001582
Larry Hastings8f904da2012-06-22 03:56:29 -07001583 Py_ssize_t i, size;
1584 char *keywords[8 + 1]; /* space for NULL at end */
1585 PyObject *o;
1586 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001587
Larry Hastings8f904da2012-06-22 03:56:29 -07001588 int result;
1589 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001590
Larry Hastings22701e82012-08-08 14:52:22 -07001591 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001592
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001593 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001594 &sub_args, &sub_kwargs,
1595 &sub_format, &sub_keywords))
1596 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001597
Larry Hastings8f904da2012-06-22 03:56:29 -07001598 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1599 PyErr_SetString(PyExc_ValueError,
1600 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1601 return NULL;
1602 }
1603
1604 memset(buffers, 0, sizeof(buffers));
1605 memset(converted, 0, sizeof(converted));
1606 memset(keywords, 0, sizeof(keywords));
1607
1608 size = PySequence_Fast_GET_SIZE(sub_keywords);
1609 if (size > 8) {
1610 PyErr_SetString(PyExc_ValueError,
1611 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1612 goto exit;
1613 }
1614
1615 for (i = 0; i < size; i++) {
1616 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1617 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1618 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001619 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001620 goto exit;
1621 }
1622 keywords[i] = PyBytes_AS_STRING(converted[i]);
1623 }
1624
1625 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1626 sub_format, keywords,
1627 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1628 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1629
1630 if (result) {
1631 return_value = Py_None;
1632 Py_INCREF(Py_None);
1633 }
1634
1635exit:
1636 size = sizeof(converted) / sizeof(converted[0]);
1637 for (i = 0; i < size; i++) {
1638 Py_XDECREF(converted[i]);
1639 }
1640 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001641}
1642
Benjamin Peterson92035012008-12-27 16:00:54 +00001643static volatile int x;
1644
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001645/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1646 of an error.
1647*/
1648static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301649test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001650{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 PyObject *tuple, *obj;
1652 Py_UNICODE *value;
1653 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1656 /* Just use the macro and check that it compiles */
1657 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 tuple = PyTuple_New(1);
1660 if (tuple == NULL)
1661 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 obj = PyUnicode_Decode("test", strlen("test"),
1664 "ascii", NULL);
1665 if (obj == NULL)
1666 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001671 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001673 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 if (value != PyUnicode_AS_UNICODE(obj))
1675 return raiseTestError("test_u_code",
1676 "u code returned wrong value for u'test'");
1677 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001678 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001680 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 if (value != PyUnicode_AS_UNICODE(obj) ||
1682 len != PyUnicode_GET_SIZE(obj))
1683 return raiseTestError("test_u_code",
1684 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001687 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001688}
1689
Guido van Rossumfb67be22007-08-29 18:38:11 +00001690/* Test Z and Z# codes for PyArg_ParseTuple */
1691static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301692test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001693{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001695 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 tuple = PyTuple_New(2);
1699 if (tuple == NULL)
1700 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 obj = PyUnicode_FromString("test");
1703 PyTuple_SET_ITEM(tuple, 0, obj);
1704 Py_INCREF(Py_None);
1705 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 /* swap values on purpose */
1708 value1 = NULL;
1709 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001712 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001714 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 if (value1 != PyUnicode_AS_UNICODE(obj))
1716 return raiseTestError("test_Z_code",
1717 "Z code returned wrong value for 'test'");
1718 if (value2 != NULL)
1719 return raiseTestError("test_Z_code",
1720 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 value1 = NULL;
1723 value2 = PyUnicode_AS_UNICODE(obj);
1724 len1 = -1;
1725 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001728 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1729 &value2, &len2))
1730 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001732 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1734 len1 != PyUnicode_GET_SIZE(obj))
1735 return raiseTestError("test_Z_code",
1736 "Z# code returned wrong values for 'test'");
1737 if (value2 != NULL ||
1738 len2 != 0)
1739 return raiseTestError("test_Z_code",
1740 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 Py_DECREF(tuple);
1743 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001744}
1745
Thomas Wouters477c8d52006-05-27 19:21:47 +00001746static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301747test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001748{
1749#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1751 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001752 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001753#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1755 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1760 if (wide == NULL)
1761 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1764 if (utf8 == NULL) {
1765 Py_DECREF(wide);
1766 return NULL;
1767 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001768
Victor Stinner8ef18872011-11-21 02:06:57 +01001769 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 Py_DECREF(wide);
1771 Py_DECREF(utf8);
1772 return raiseTestError("test_widechar",
1773 "wide string and utf8 string "
1774 "have different length");
1775 }
1776 if (PyUnicode_Compare(wide, utf8)) {
1777 Py_DECREF(wide);
1778 Py_DECREF(utf8);
1779 if (PyErr_Occurred())
1780 return NULL;
1781 return raiseTestError("test_widechar",
1782 "wide string and utf8 string "
1783 "are different");
1784 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 Py_DECREF(wide);
1787 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001788
1789#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1790 wide = PyUnicode_FromWideChar(invalid, 1);
1791 if (wide == NULL)
1792 PyErr_Clear();
1793 else
1794 return raiseTestError("test_widechar",
1795 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1796
1797 wide = PyUnicode_FromUnicode(invalid, 1);
1798 if (wide == NULL)
1799 PyErr_Clear();
1800 else
1801 return raiseTestError("test_widechar",
1802 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001803
1804 wide = PyUnicode_FromUnicode(NULL, 1);
1805 if (wide == NULL)
1806 return NULL;
1807 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001808 if (_PyUnicode_Ready(wide) < 0) {
1809 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001810 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001811 }
1812 else {
1813 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001814 return raiseTestError("test_widechar",
1815 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001816 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001817#endif
1818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001820}
1821
1822static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001823unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001824{
1825 PyObject *unicode, *result;
1826 Py_ssize_t buflen, size;
1827 wchar_t *buffer;
1828
1829 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1830 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001831 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001832 if (buffer == NULL)
1833 return PyErr_NoMemory();
1834
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001835 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001836 if (size == -1) {
1837 PyMem_Free(buffer);
1838 return NULL;
1839 }
1840
1841 if (size < buflen)
1842 buflen = size + 1;
1843 else
1844 buflen = size;
1845 result = PyUnicode_FromWideChar(buffer, buflen);
1846 PyMem_Free(buffer);
1847 if (result == NULL)
1848 return NULL;
1849
1850 return Py_BuildValue("(Nn)", result, size);
1851}
1852
1853static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001854unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001855{
1856 PyObject *unicode, *result;
1857 Py_ssize_t size;
1858 wchar_t *buffer;
1859
1860 if (!PyArg_ParseTuple(args, "U", &unicode))
1861 return NULL;
1862
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001863 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001864 if (buffer == NULL)
1865 return NULL;
1866
1867 result = PyUnicode_FromWideChar(buffer, size + 1);
1868 PyMem_Free(buffer);
1869 if (result == NULL)
1870 return NULL;
1871 return Py_BuildValue("(Nn)", result, size);
1872}
1873
1874static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001875unicode_asucs4(PyObject *self, PyObject *args)
1876{
1877 PyObject *unicode, *result;
1878 Py_UCS4 *buffer;
1879 int copy_null;
1880 Py_ssize_t str_len, buf_len;
1881
1882 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1883 return NULL;
1884 }
1885
1886 buf_len = str_len + 1;
1887 buffer = PyMem_NEW(Py_UCS4, buf_len);
1888 if (buffer == NULL) {
1889 return PyErr_NoMemory();
1890 }
1891 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1892 buffer[str_len] = 0xffffU;
1893
1894 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1895 PyMem_FREE(buffer);
1896 return NULL;
1897 }
1898
1899 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1900 PyMem_FREE(buffer);
1901 return result;
1902}
1903
1904static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001905unicode_findchar(PyObject *self, PyObject *args)
1906{
1907 PyObject *str;
1908 int direction;
1909 unsigned int ch;
1910 Py_ssize_t result;
1911 Py_ssize_t start, end;
1912
1913 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1914 &start, &end, &direction)) {
1915 return NULL;
1916 }
1917
1918 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
1919 if (result == -2)
1920 return NULL;
1921 else
1922 return PyLong_FromSsize_t(result);
1923}
1924
1925static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001926unicode_copycharacters(PyObject *self, PyObject *args)
1927{
1928 PyObject *from, *to, *to_copy;
1929 Py_ssize_t from_start, to_start, how_many, copied;
1930
1931 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1932 &from, &from_start, &how_many)) {
1933 return NULL;
1934 }
1935
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001936 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1937 PyUnicode_MAX_CHAR_VALUE(to)))) {
1938 return NULL;
1939 }
1940 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
1941 Py_DECREF(to_copy);
1942 return NULL;
1943 }
1944
1945 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
1946 from_start, how_many)) < 0) {
1947 Py_DECREF(to_copy);
1948 return NULL;
1949 }
1950
1951 return Py_BuildValue("(Nn)", to_copy, copied);
1952}
1953
1954static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001955unicode_encodedecimal(PyObject *self, PyObject *args)
1956{
1957 Py_UNICODE *unicode;
1958 Py_ssize_t length;
1959 char *errors = NULL;
1960 PyObject *decimal;
1961 Py_ssize_t decimal_length, new_length;
1962 int res;
1963
1964 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1965 return NULL;
1966
1967 decimal_length = length * 7; /* len('&#8364;') */
1968 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1969 if (decimal == NULL)
1970 return NULL;
1971
1972 res = PyUnicode_EncodeDecimal(unicode, length,
1973 PyBytes_AS_STRING(decimal),
1974 errors);
1975 if (res < 0) {
1976 Py_DECREF(decimal);
1977 return NULL;
1978 }
1979
1980 new_length = strlen(PyBytes_AS_STRING(decimal));
1981 assert(new_length <= decimal_length);
1982 res = _PyBytes_Resize(&decimal, new_length);
1983 if (res < 0)
1984 return NULL;
1985
1986 return decimal;
1987}
1988
1989static PyObject *
1990unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1991{
1992 Py_UNICODE *unicode;
1993 Py_ssize_t length;
1994 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1995 return NULL;
1996 return PyUnicode_TransformDecimalToASCII(unicode, length);
1997}
1998
1999static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002000unicode_legacy_string(PyObject *self, PyObject *args)
2001{
2002 Py_UNICODE *data;
2003 Py_ssize_t len;
2004 PyObject *u;
2005
2006 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2007 return NULL;
2008
2009 u = PyUnicode_FromUnicode(NULL, len);
2010 if (u == NULL)
2011 return NULL;
2012
2013 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2014
2015 if (len > 0) { /* The empty string is always ready. */
2016 assert(!PyUnicode_IS_READY(u));
2017 }
2018
2019 return u;
2020}
2021
2022static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002023getargs_w_star(PyObject *self, PyObject *args)
2024{
2025 Py_buffer buffer;
2026 PyObject *result;
2027 char *str;
2028
2029 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2030 return NULL;
2031
2032 if (2 <= buffer.len) {
2033 str = buffer.buf;
2034 str[0] = '[';
2035 str[buffer.len-1] = ']';
2036 }
2037
2038 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2039 PyBuffer_Release(&buffer);
2040 return result;
2041}
2042
2043
2044static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302045test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002046{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 /* Test that formats can begin with '|'. See issue #4720. */
2048 PyObject *tuple, *dict = NULL;
2049 static char *kwlist[] = {NULL};
2050 int result;
2051 tuple = PyTuple_New(0);
2052 if (!tuple)
2053 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002054 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002056 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 dict = PyDict_New();
2058 if (!dict)
2059 goto done;
2060 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002061 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 Py_DECREF(tuple);
2063 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002064 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002066 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 else {
2068 Py_RETURN_NONE;
2069 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002070}
2071
2072static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002073codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002074{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 const char *encoding, *errors = NULL;
2076 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2077 &encoding, &errors))
2078 return NULL;
2079 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002080}
2081
Thomas Wouters477c8d52006-05-27 19:21:47 +00002082static PyObject *
2083codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 const char *encoding, *errors = NULL;
2086 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2087 &encoding, &errors))
2088 return NULL;
2089 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002090}
2091
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002092
Tim Peters5b8132f2003-01-31 15:52:05 +00002093/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002094static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302095test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 struct triple {
2098 long input;
2099 size_t nbits;
2100 int sign;
2101 } testcases[] = {{0, 0, 0},
2102 {1L, 1, 1},
2103 {-1L, 1, -1},
2104 {2L, 2, 1},
2105 {-2L, 2, -1},
2106 {3L, 2, 1},
2107 {-3L, 2, -1},
2108 {4L, 3, 1},
2109 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002110 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 {-0x7fffL, 15, -1},
2112 {0xffffL, 16, 1},
2113 {-0xffffL, 16, -1},
2114 {0xfffffffL, 28, 1},
2115 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002116 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002117
Victor Stinner63941882011-09-29 00:42:28 +02002118 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002119 size_t nbits;
2120 int sign;
2121 PyObject *plong;
2122
2123 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002124 if (plong == NULL)
2125 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002126 nbits = _PyLong_NumBits(plong);
2127 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 Py_DECREF(plong);
2130 if (nbits != testcases[i].nbits)
2131 return raiseTestError("test_long_numbits",
2132 "wrong result for _PyLong_NumBits");
2133 if (sign != testcases[i].sign)
2134 return raiseTestError("test_long_numbits",
2135 "wrong result for _PyLong_Sign");
2136 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002137 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002138}
2139
Thomas Heller519a0422007-11-15 20:48:54 +00002140/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002141
2142static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302143test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2146 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2147 Py_XDECREF(o1);
2148 Py_XDECREF(o2);
2149 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002150}
2151
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002152static PyObject *
2153raise_exception(PyObject *self, PyObject *args)
2154{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002155 PyObject *exc;
2156 PyObject *exc_args, *v;
2157 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2160 &exc, &num_args))
2161 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 exc_args = PyTuple_New(num_args);
2164 if (exc_args == NULL)
2165 return NULL;
2166 for (i = 0; i < num_args; ++i) {
2167 v = PyLong_FromLong(i);
2168 if (v == NULL) {
2169 Py_DECREF(exc_args);
2170 return NULL;
2171 }
2172 PyTuple_SET_ITEM(exc_args, i, v);
2173 }
2174 PyErr_SetObject(exc, exc_args);
2175 Py_DECREF(exc_args);
2176 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002177}
Tim Peters91621db2001-06-12 20:10:01 +00002178
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002179static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002180set_errno(PyObject *self, PyObject *args)
2181{
2182 int new_errno;
2183
2184 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2185 return NULL;
2186
2187 errno = new_errno;
2188 Py_RETURN_NONE;
2189}
2190
2191static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002192test_set_exc_info(PyObject *self, PyObject *args)
2193{
2194 PyObject *orig_exc;
2195 PyObject *new_type, *new_value, *new_tb;
2196 PyObject *type, *value, *tb;
2197 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2198 &new_type, &new_value, &new_tb))
2199 return NULL;
2200
2201 PyErr_GetExcInfo(&type, &value, &tb);
2202
2203 Py_INCREF(new_type);
2204 Py_INCREF(new_value);
2205 Py_INCREF(new_tb);
2206 PyErr_SetExcInfo(new_type, new_value, new_tb);
2207
2208 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2209 Py_XDECREF(type);
2210 Py_XDECREF(value);
2211 Py_XDECREF(tb);
2212 return orig_exc;
2213}
Benjamin Peterson16323982010-02-03 01:13:41 +00002214
2215static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002216
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002217static PyObject *
2218test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 if (PyDateTimeAPI) {
2220 if (test_run_counter) {
2221 /* Probably regrtest.py -R */
2222 Py_RETURN_NONE;
2223 }
2224 else {
2225 PyErr_SetString(PyExc_AssertionError,
2226 "PyDateTime_CAPI somehow initialized");
2227 return NULL;
2228 }
2229 }
2230 test_run_counter++;
2231 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 if (PyDateTimeAPI)
2234 Py_RETURN_NONE;
2235 else
2236 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002237}
2238
Paul Ganssle04af5b12018-01-24 17:29:30 -05002239/* Functions exposing the C API type checking for testing */
2240#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2241 PyObject *obj; \
2242 int exact = 0; \
2243 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2244 return NULL; \
2245 } \
2246 int rv = exact?exact_method(obj):check_method(obj); \
2247 if (rv) { \
2248 Py_RETURN_TRUE; \
2249 } else { \
2250 Py_RETURN_FALSE; \
2251 }
2252
2253static PyObject *
2254datetime_check_date(PyObject *self, PyObject *args) {
2255 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2256}
2257
2258static PyObject *
2259datetime_check_time(PyObject *self, PyObject *args) {
2260 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2261}
2262
2263static PyObject *
2264datetime_check_datetime(PyObject *self, PyObject *args) {
2265 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2266}
2267
2268static PyObject *
2269datetime_check_delta(PyObject *self, PyObject *args) {
2270 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2271}
2272
2273static PyObject *
2274datetime_check_tzinfo(PyObject *self, PyObject *args) {
2275 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2276}
2277
2278
2279/* Makes three variations on timezone representing UTC-5:
2280 1. timezone with offset and name from PyDateTimeAPI
2281 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2282 3. timezone with offset (no name) from PyTimeZone_FromOffset
2283*/
2284static PyObject *
2285make_timezones_capi(PyObject *self, PyObject *args) {
2286 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2287 PyObject *name = PyUnicode_FromString("EST");
2288
2289 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2290 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2291 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2292
2293 Py_DecRef(offset);
2294 Py_DecRef(name);
2295
2296 PyObject *rv = PyTuple_New(3);
2297
2298 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2299 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2300 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2301
2302 return rv;
2303}
2304
2305static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002306get_timezones_offset_zero(PyObject *self, PyObject *args) {
2307 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2308 PyObject *name = PyUnicode_FromString("");
2309
2310 // These two should return the UTC singleton
2311 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2312 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2313
2314 // This one will return +00:00 zone, but not the UTC singleton
2315 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2316
2317 Py_DecRef(offset);
2318 Py_DecRef(name);
2319
2320 PyObject *rv = PyTuple_New(3);
2321 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2322 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2323 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2324
2325 return rv;
2326}
2327
2328static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002329get_timezone_utc_capi(PyObject* self, PyObject *args) {
2330 int macro = 0;
2331 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2332 return NULL;
2333 }
2334 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002335 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002336 return PyDateTime_TimeZone_UTC;
2337 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002338 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002339 return PyDateTimeAPI->TimeZone_UTC;
2340 }
2341}
2342
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002343static PyObject *
Edison A98ff4d52019-05-17 13:28:42 -07002344get_date_fromdate(PyObject *self, PyObject *args)
2345{
2346 PyObject *rv = NULL;
2347 int macro;
2348 int year, month, day;
2349
2350 if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2351 return NULL;
2352 }
2353
2354 if (macro) {
2355 rv = PyDate_FromDate(year, month, day);
2356 }
2357 else {
2358 rv = PyDateTimeAPI->Date_FromDate(
2359 year, month, day,
2360 PyDateTimeAPI->DateType);
2361 }
2362 return rv;
2363}
2364
2365static PyObject *
2366get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2367{
2368 PyObject *rv = NULL;
2369 int macro;
2370 int year, month, day;
2371 int hour, minute, second, microsecond;
2372
2373 if (!PyArg_ParseTuple(args, "piiiiiii",
2374 &macro,
2375 &year, &month, &day,
2376 &hour, &minute, &second, &microsecond)) {
2377 return NULL;
2378 }
2379
2380 if (macro) {
2381 rv = PyDateTime_FromDateAndTime(
2382 year, month, day,
2383 hour, minute, second, microsecond);
2384 }
2385 else {
2386 rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2387 year, month, day,
2388 hour, minute, second, microsecond,
2389 Py_None,
2390 PyDateTimeAPI->DateTimeType);
2391 }
2392 return rv;
2393}
2394
2395static PyObject *
2396get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2397{
2398 PyObject *rv = NULL;
2399 int macro;
2400 int year, month, day;
2401 int hour, minute, second, microsecond, fold;
2402
2403 if (!PyArg_ParseTuple(args, "piiiiiiii",
2404 &macro,
2405 &year, &month, &day,
2406 &hour, &minute, &second, &microsecond,
2407 &fold)) {
2408 return NULL;
2409 }
2410
2411 if (macro) {
2412 rv = PyDateTime_FromDateAndTimeAndFold(
2413 year, month, day,
2414 hour, minute, second, microsecond,
2415 fold);
2416 }
2417 else {
2418 rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2419 year, month, day,
2420 hour, minute, second, microsecond,
2421 Py_None,
2422 fold,
2423 PyDateTimeAPI->DateTimeType);
2424 }
2425 return rv;
2426}
2427
2428static PyObject *
2429get_time_fromtime(PyObject *self, PyObject *args)
2430{
2431 PyObject *rv = NULL;
2432 int macro;
2433 int hour, minute, second, microsecond;
2434
2435 if (!PyArg_ParseTuple(args, "piiii",
2436 &macro,
2437 &hour, &minute, &second, &microsecond)) {
2438 return NULL;
2439 }
2440
2441 if (macro) {
2442 rv = PyTime_FromTime(hour, minute, second, microsecond);
2443 }
2444 else {
2445 rv = PyDateTimeAPI->Time_FromTime(
2446 hour, minute, second, microsecond,
2447 Py_None,
2448 PyDateTimeAPI->TimeType);
2449 }
2450 return rv;
2451}
2452
2453static PyObject *
2454get_time_fromtimeandfold(PyObject *self, PyObject *args)
2455{
2456 PyObject *rv = NULL;
2457 int macro;
2458 int hour, minute, second, microsecond, fold;
2459
2460 if (!PyArg_ParseTuple(args, "piiiii",
2461 &macro,
2462 &hour, &minute, &second, &microsecond,
2463 &fold)) {
2464 return NULL;
2465 }
2466
2467 if (macro) {
2468 rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2469 }
2470 else {
2471 rv = PyDateTimeAPI->Time_FromTimeAndFold(
2472 hour, minute, second, microsecond,
2473 Py_None,
2474 fold,
2475 PyDateTimeAPI->TimeType);
2476 }
2477 return rv;
2478}
2479
2480static PyObject *
2481get_delta_fromdsu(PyObject *self, PyObject *args)
2482{
2483 PyObject *rv = NULL;
2484 int macro;
2485 int days, seconds, microseconds;
2486
2487 if (!PyArg_ParseTuple(args, "piii",
2488 &macro,
2489 &days, &seconds, &microseconds)) {
2490 return NULL;
2491 }
2492
2493 if (macro) {
2494 rv = PyDelta_FromDSU(days, seconds, microseconds);
2495 }
2496 else {
2497 rv = PyDateTimeAPI->Delta_FromDelta(
2498 days, seconds, microseconds, 1,
2499 PyDateTimeAPI->DeltaType);
2500 }
2501
2502 return rv;
2503}
2504
2505static PyObject *
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002506get_date_fromtimestamp(PyObject* self, PyObject *args)
2507{
2508 PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2509 int macro = 0;
2510
2511 if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2512 return NULL;
2513 }
2514
2515 // Construct the argument tuple
2516 if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2517 return NULL;
2518 }
2519
2520 // Pass along to the API function
2521 if (macro) {
2522 rv = PyDate_FromTimestamp(tsargs);
2523 }
2524 else {
2525 rv = PyDateTimeAPI->Date_FromTimestamp(
2526 (PyObject *)PyDateTimeAPI->DateType, tsargs
2527 );
2528 }
2529
2530 Py_DECREF(tsargs);
2531 return rv;
2532}
2533
2534static PyObject *
2535get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2536{
2537 int macro = 0;
2538 int usetz = 0;
2539 PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2540 if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2541 return NULL;
2542 }
2543
2544 // Construct the argument tuple
2545 if (usetz) {
2546 tsargs = PyTuple_Pack(2, ts, tzinfo);
2547 }
2548 else {
2549 tsargs = PyTuple_Pack(1, ts);
2550 }
2551
2552 if (tsargs == NULL) {
2553 return NULL;
2554 }
2555
2556 // Pass along to the API function
2557 if (macro) {
2558 rv = PyDateTime_FromTimestamp(tsargs);
2559 }
2560 else {
2561 rv = PyDateTimeAPI->DateTime_FromTimestamp(
2562 (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2563 );
2564 }
2565
2566 Py_DECREF(tsargs);
2567 return rv;
2568}
2569
Benjamin Peterson16323982010-02-03 01:13:41 +00002570
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002571/* test_thread_state spawns a thread of its own, and that thread releases
2572 * `thread_done` when it's finished. The driver code has to know when the
2573 * thread finishes, because the thread uses a PyObject (the callable) that
2574 * may go away when the driver finishes. The former lack of this explicit
2575 * synchronization caused rare segfaults, so rare that they were seen only
2576 * on a Mac buildbot (although they were possible on any box).
2577 */
2578static PyThread_type_lock thread_done = NULL;
2579
Benjamin Petersona786b022008-08-25 21:05:21 +00002580static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002581_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002582{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 PyObject *rc;
2584 int success;
2585 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002586 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 success = (rc != NULL);
2588 Py_XDECREF(rc);
2589 PyGILState_Release(s);
2590 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002591}
2592
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002593/* Same thing, but releases `thread_done` when it returns. This variant
2594 * should be called only from threads spawned by test_thread_state().
2595 */
2596static void
2597_make_call_from_thread(void *callable)
2598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 _make_call(callable);
2600 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002601}
2602
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002603static PyObject *
2604test_thread_state(PyObject *self, PyObject *args)
2605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 PyObject *fn;
2607 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2610 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 if (!PyCallable_Check(fn)) {
2613 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2614 fn->ob_type->tp_name);
2615 return NULL;
2616 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 /* Ensure Python is set up for threading */
2619 PyEval_InitThreads();
2620 thread_done = PyThread_allocate_lock();
2621 if (thread_done == NULL)
2622 return PyErr_NoMemory();
2623 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 /* Start a new thread with our callback. */
2626 PyThread_start_new_thread(_make_call_from_thread, fn);
2627 /* Make the callback with the thread lock held by this thread */
2628 success &= _make_call(fn);
2629 /* Do it all again, but this time with the thread-lock released */
2630 Py_BEGIN_ALLOW_THREADS
2631 success &= _make_call(fn);
2632 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2633 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002635 /* And once more with and without a thread
2636 XXX - should use a lock and work out exactly what we are trying
2637 to test <wink>
2638 */
2639 Py_BEGIN_ALLOW_THREADS
2640 PyThread_start_new_thread(_make_call_from_thread, fn);
2641 success &= _make_call(fn);
2642 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2643 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002645 /* Release lock we acquired above. This is required on HP-UX. */
2646 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 PyThread_free_lock(thread_done);
2649 if (!success)
2650 return NULL;
2651 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002652}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002653
2654/* test Py_AddPendingCalls using threads */
2655static int _pending_callback(void *arg)
2656{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 /* we assume the argument is callable object to which we own a reference */
2658 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002659 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 Py_DECREF(callable);
2661 Py_XDECREF(r);
2662 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002663}
2664
2665/* The following requests n callbacks to _pending_callback. It can be
2666 * run from any python thread.
2667 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07002668static PyObject *
2669pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 PyObject *callable;
2672 int r;
2673 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2674 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002676 /* create the reference for the callbackwhile we hold the lock */
2677 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002679 Py_BEGIN_ALLOW_THREADS
Eric Snow6a150bc2019-06-01 15:39:46 -06002680 /* XXX Use the internal _Py_AddPendingCall(). */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 r = Py_AddPendingCall(&_pending_callback, callable);
2682 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 if (r<0) {
2685 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002686 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002688 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002689}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002690
Neal Norwitzb0d26332007-08-25 00:49:05 +00002691/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002692static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002693test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 PyObject *result;
2696 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002697
Alexander Belopolskye239d232010-12-08 23:31:48 +00002698#define CHECK_1_FORMAT(FORMAT, TYPE) \
2699 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2700 if (result == NULL) \
2701 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002702 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002703 msg = FORMAT " failed at 1"; \
2704 goto Fail; \
2705 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 CHECK_1_FORMAT("%d", int);
2709 CHECK_1_FORMAT("%ld", long);
2710 /* The z width modifier was added in Python 2.5. */
2711 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 /* The u type code was added in Python 2.5. */
2714 CHECK_1_FORMAT("%u", unsigned int);
2715 CHECK_1_FORMAT("%lu", unsigned long);
2716 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002719 CHECK_1_FORMAT("%llu", unsigned long long);
2720 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002723
2724 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 Py_XDECREF(result);
2726 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002727
2728#undef CHECK_1_FORMAT
2729}
2730
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002731
2732static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302733test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2735 int result;
2736 if (py_s == NULL)
2737 return NULL;
2738 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2739 Py_DECREF(py_s);
2740 if (!result) {
2741 PyErr_SetString(TestError, "Python string ending in NULL "
2742 "should not compare equal to c string.");
2743 return NULL;
2744 }
2745 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002746}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002747
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002748/* This is here to provide a docstring for test_descr. */
2749static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302750test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002753}
2754
Mark Dickinson725bfd82009-05-03 20:33:40 +00002755/* Test PyOS_string_to_double. */
2756static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302757test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002759 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761#define CHECK_STRING(STR, expected) \
2762 result = PyOS_string_to_double(STR, NULL, NULL); \
2763 if (result == -1.0 && PyErr_Occurred()) \
2764 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002765 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 msg = "conversion of " STR " to float failed"; \
2767 goto fail; \
2768 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770#define CHECK_INVALID(STR) \
2771 result = PyOS_string_to_double(STR, NULL, NULL); \
2772 if (result == -1.0 && PyErr_Occurred()) { \
2773 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2774 PyErr_Clear(); \
2775 else \
2776 return NULL; \
2777 } \
2778 else { \
2779 msg = "conversion of " STR " didn't raise ValueError"; \
2780 goto fail; \
2781 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 CHECK_STRING("0.1", 0.1);
2784 CHECK_STRING("1.234", 1.234);
2785 CHECK_STRING("-1.35", -1.35);
2786 CHECK_STRING(".1e01", 1.0);
2787 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 CHECK_INVALID(" 0.1");
2790 CHECK_INVALID("\t\n-3");
2791 CHECK_INVALID(".123 ");
2792 CHECK_INVALID("3\n");
2793 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002796 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002797 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002798#undef CHECK_STRING
2799#undef CHECK_INVALID
2800}
2801
2802
Benjamin Petersonb173f782009-05-05 22:31:58 +00002803/* Coverage testing of capsule objects. */
2804
2805static const char *capsule_name = "capsule name";
2806static char *capsule_pointer = "capsule pointer";
2807static char *capsule_context = "capsule context";
2808static const char *capsule_error = NULL;
2809static int
2810capsule_destructor_call_count = 0;
2811
2812static void
2813capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 capsule_destructor_call_count++;
2815 if (PyCapsule_GetContext(o) != capsule_context) {
2816 capsule_error = "context did not match in destructor!";
2817 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2818 capsule_error = "destructor did not match in destructor! (woah!)";
2819 } else if (PyCapsule_GetName(o) != capsule_name) {
2820 capsule_error = "name did not match in destructor!";
2821 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2822 capsule_error = "pointer did not match in destructor!";
2823 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002824}
2825
2826typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 char *name;
2828 char *module;
2829 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002830} known_capsule;
2831
2832static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002833test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00002834{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 PyObject *object;
2836 const char *error = NULL;
2837 void *pointer;
2838 void *pointer2;
2839 known_capsule known_capsules[] = {
2840 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2841 KNOWN_CAPSULE("_socket", "CAPI"),
2842 KNOWN_CAPSULE("_curses", "_C_API"),
2843 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2844 { NULL, NULL },
2845 };
2846 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002847
2848#define FAIL(x) { error = (x); goto exit; }
2849
2850#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 if (capsule_error) { \
2852 FAIL(capsule_error); \
2853 } \
2854 else if (!capsule_destructor_call_count) { \
2855 FAIL("destructor not called!"); \
2856 } \
2857 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2860 PyCapsule_SetContext(object, capsule_context);
2861 capsule_destructor(object);
2862 CHECK_DESTRUCTOR;
2863 Py_DECREF(object);
2864 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002866 object = PyCapsule_New(known, "ignored", NULL);
2867 PyCapsule_SetPointer(object, capsule_pointer);
2868 PyCapsule_SetName(object, capsule_name);
2869 PyCapsule_SetDestructor(object, capsule_destructor);
2870 PyCapsule_SetContext(object, capsule_context);
2871 capsule_destructor(object);
2872 CHECK_DESTRUCTOR;
2873 /* intentionally access using the wrong name */
2874 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2875 if (!PyErr_Occurred()) {
2876 FAIL("PyCapsule_GetPointer should have failed but did not!");
2877 }
2878 PyErr_Clear();
2879 if (pointer2) {
2880 if (pointer2 == capsule_pointer) {
2881 FAIL("PyCapsule_GetPointer should not have"
2882 " returned the internal pointer!");
2883 } else {
2884 FAIL("PyCapsule_GetPointer should have "
2885 "returned NULL pointer but did not!");
2886 }
2887 }
2888 PyCapsule_SetDestructor(object, NULL);
2889 Py_DECREF(object);
2890 if (capsule_destructor_call_count) {
2891 FAIL("destructor called when it should not have been!");
2892 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002894 for (known = &known_capsules[0]; known->module != NULL; known++) {
2895 /* yeah, ordinarily I wouldn't do this either,
2896 but it's fine for this test harness.
2897 */
2898 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002899#undef FAIL
2900#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901 { \
2902 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2903 x, known->module, known->attribute); \
2904 error = buffer; \
2905 goto exit; \
2906 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 PyObject *module = PyImport_ImportModule(known->module);
2909 if (module) {
2910 pointer = PyCapsule_Import(known->name, 0);
2911 if (!pointer) {
2912 Py_DECREF(module);
2913 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2914 }
2915 object = PyObject_GetAttrString(module, known->attribute);
2916 if (!object) {
2917 Py_DECREF(module);
2918 return NULL;
2919 }
2920 pointer2 = PyCapsule_GetPointer(object,
2921 "weebles wobble but they don't fall down");
2922 if (!PyErr_Occurred()) {
2923 Py_DECREF(object);
2924 Py_DECREF(module);
2925 FAIL("PyCapsule_GetPointer should have failed but did not!");
2926 }
2927 PyErr_Clear();
2928 if (pointer2) {
2929 Py_DECREF(module);
2930 Py_DECREF(object);
2931 if (pointer2 == pointer) {
2932 FAIL("PyCapsule_GetPointer should not have"
2933 " returned its internal pointer!");
2934 } else {
2935 FAIL("PyCapsule_GetPointer should have"
2936 " returned NULL pointer but did not!");
2937 }
2938 }
2939 Py_DECREF(object);
2940 Py_DECREF(module);
2941 }
2942 else
2943 PyErr_Clear();
2944 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002945
2946 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 if (error) {
2948 return raiseTestError("test_capsule", error);
2949 }
2950 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002951#undef FAIL
2952}
2953
Guido van Rossumddefaf32007-01-14 03:31:43 +00002954#ifdef HAVE_GETTIMEOFDAY
2955/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002956static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002957{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 e->tv_sec -= s->tv_sec;
2959 e->tv_usec -= s->tv_usec;
2960 if (e->tv_usec < 0) {
2961 e->tv_sec -=1;
2962 e->tv_usec += 1000000;
2963 }
2964 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002965}
2966
2967static PyObject *
2968profile_int(PyObject *self, PyObject* args)
2969{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002970 int i, k;
2971 struct timeval start, stop;
2972 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002974 /* Test 1: Allocate and immediately deallocate
2975 many small integers */
2976 gettimeofday(&start, NULL);
2977 for(k=0; k < 20000; k++)
2978 for(i=0; i < 1000; i++) {
2979 single = PyLong_FromLong(i);
2980 Py_DECREF(single);
2981 }
2982 gettimeofday(&stop, NULL);
2983 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 /* Test 2: Allocate and immediately deallocate
2986 many large integers */
2987 gettimeofday(&start, NULL);
2988 for(k=0; k < 20000; k++)
2989 for(i=0; i < 1000; i++) {
2990 single = PyLong_FromLong(i+1000000);
2991 Py_DECREF(single);
2992 }
2993 gettimeofday(&stop, NULL);
2994 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002996 /* Test 3: Allocate a few integers, then release
2997 them all simultaneously. */
2998 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002999 if (multiple == NULL)
3000 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003001 gettimeofday(&start, NULL);
3002 for(k=0; k < 20000; k++) {
3003 for(i=0; i < 1000; i++) {
3004 multiple[i] = PyLong_FromLong(i+1000000);
3005 }
3006 for(i=0; i < 1000; i++) {
3007 Py_DECREF(multiple[i]);
3008 }
3009 }
3010 gettimeofday(&stop, NULL);
3011 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003012 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003014 /* Test 4: Allocate many integers, then release
3015 them all simultaneously. */
3016 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003017 if (multiple == NULL)
3018 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 gettimeofday(&start, NULL);
3020 for(k=0; k < 20; k++) {
3021 for(i=0; i < 1000000; i++) {
3022 multiple[i] = PyLong_FromLong(i+1000000);
3023 }
3024 for(i=0; i < 1000000; i++) {
3025 Py_DECREF(multiple[i]);
3026 }
3027 }
3028 gettimeofday(&stop, NULL);
3029 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003030 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 /* Test 5: Allocate many integers < 32000 */
3033 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003034 if (multiple == NULL)
3035 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 gettimeofday(&start, NULL);
3037 for(k=0; k < 10; k++) {
3038 for(i=0; i < 1000000; i++) {
3039 multiple[i] = PyLong_FromLong(i+1000);
3040 }
3041 for(i=0; i < 1000000; i++) {
3042 Py_DECREF(multiple[i]);
3043 }
3044 }
3045 gettimeofday(&stop, NULL);
3046 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003047 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003049 /* Test 6: Perform small int addition */
3050 op1 = PyLong_FromLong(1);
3051 gettimeofday(&start, NULL);
3052 for(i=0; i < 10000000; i++) {
3053 result = PyNumber_Add(op1, op1);
3054 Py_DECREF(result);
3055 }
3056 gettimeofday(&stop, NULL);
3057 Py_DECREF(op1);
3058 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003060 /* Test 7: Perform medium int addition */
3061 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003062 if (op1 == NULL)
3063 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003064 gettimeofday(&start, NULL);
3065 for(i=0; i < 10000000; i++) {
3066 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003067 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003068 }
3069 gettimeofday(&stop, NULL);
3070 Py_DECREF(op1);
3071 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003072
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003073 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003074}
3075#endif
3076
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003077/* To test the format of tracebacks as printed out. */
3078static PyObject *
3079traceback_print(PyObject *self, PyObject *args)
3080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 PyObject *file;
3082 PyObject *traceback;
3083 int result;
3084
3085 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3086 &traceback, &file))
3087 return NULL;
3088
3089 result = PyTraceBack_Print(traceback, file);
3090 if (result < 0)
3091 return NULL;
3092 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003093}
3094
Benjamin Petersone6528212008-07-15 15:32:09 +00003095/* To test the format of exceptions as printed out. */
3096static PyObject *
3097exception_print(PyObject *self, PyObject *args)
3098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 PyObject *value;
3100 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003102 if (!PyArg_ParseTuple(args, "O:exception_print",
3103 &value))
3104 return NULL;
3105 if (!PyExceptionInstance_Check(value)) {
3106 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3107 return NULL;
3108 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003110 tb = PyException_GetTraceback(value);
3111 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3112 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003115}
3116
3117
3118
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003119
3120/* reliably raise a MemoryError */
3121static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303122raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003123{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003124 PyErr_NoMemory();
3125 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003126}
3127
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003128/* Issue 6012 */
3129static PyObject *str1, *str2;
3130static int
3131failing_converter(PyObject *obj, void *arg)
3132{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003133 /* Clone str1, then let the conversion fail. */
3134 assert(str1);
3135 str2 = str1;
3136 Py_INCREF(str2);
3137 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003138}
3139static PyObject*
3140argparsing(PyObject *o, PyObject *args)
3141{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003142 PyObject *res;
3143 str1 = str2 = NULL;
3144 if (!PyArg_ParseTuple(args, "O&O&",
3145 PyUnicode_FSConverter, &str1,
3146 failing_converter, &str2)) {
3147 if (!str2)
3148 /* argument converter not called? */
3149 return NULL;
3150 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003151 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 Py_DECREF(str2);
3153 PyErr_Clear();
3154 return res;
3155 }
3156 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003157}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003158
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003159/* To test that the result of PyCode_NewEmpty has the right members. */
3160static PyObject *
3161code_newempty(PyObject *self, PyObject *args)
3162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003163 const char *filename;
3164 const char *funcname;
3165 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003167 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3168 &filename, &funcname, &firstlineno))
3169 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003171 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003172}
3173
Georg Brandl1e28a272009-12-28 08:41:01 +00003174/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3175 Run via Lib/test/test_exceptions.py */
3176static PyObject *
3177make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3178{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003179 const char *name;
3180 const char *doc = NULL;
3181 PyObject *base = NULL;
3182 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003186 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3187 "s|sOO:make_exception_with_doc", kwlist,
3188 &name, &doc, &base, &dict))
3189 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003191 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003192}
3193
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003194static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303195make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003196{
3197 Py_buffer info;
3198 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3199 return NULL;
3200 return PyMemoryView_FromBuffer(&info);
3201}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003202
Stefan Krah7213fcc2015-02-01 16:19:23 +01003203static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003204test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003205{
3206 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3207 int init[5] = {0, 1, 2, 3, 4};
3208 Py_ssize_t itemsize = sizeof(int);
3209 Py_ssize_t shape = 5;
3210 Py_ssize_t strides = 2 * itemsize;
3211 Py_buffer view = {
3212 data,
3213 NULL,
3214 5 * itemsize,
3215 itemsize,
3216 1,
3217 1,
3218 NULL,
3219 &shape,
3220 &strides,
3221 NULL,
3222 NULL
3223 };
3224 int *ptr;
3225 int i;
3226
3227 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3228 ptr = view.buf;
3229 for (i = 0; i < 5; i++) {
3230 if (ptr[2*i] != i) {
3231 PyErr_SetString(TestError,
3232 "test_from_contiguous: incorrect result");
3233 return NULL;
3234 }
3235 }
3236
3237 view.buf = &data[8];
3238 view.strides[0] = -2 * itemsize;
3239
3240 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3241 ptr = view.buf;
3242 for (i = 0; i < 5; i++) {
3243 if (*(ptr-2*i) != i) {
3244 PyErr_SetString(TestError,
3245 "test_from_contiguous: incorrect result");
3246 return NULL;
3247 }
3248 }
3249
3250 Py_RETURN_NONE;
3251}
Stefan Krah650c1e82015-02-03 21:43:23 +01003252
Stefan Kraha7559c02015-02-03 22:27:21 +01003253#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003254extern PyTypeObject _PyBytesIOBuffer_Type;
3255
Stefan Krah5178d912015-02-03 16:57:21 +01003256static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003257test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003258{
Stefan Krah650c1e82015-02-03 21:43:23 +01003259 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003260 PyObject *b;
3261 char *dummy[1];
3262 int ret, match;
3263
Stefan Krah650c1e82015-02-03 21:43:23 +01003264 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003265 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3266 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3267 PyErr_Clear();
3268 if (ret != -1 || match == 0)
3269 goto error;
3270
Stefan Krah650c1e82015-02-03 21:43:23 +01003271 /* bytesiobuf_getbuffer() */
3272 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003273 if (b == NULL) {
3274 return NULL;
3275 }
3276
3277 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3278 Py_DECREF(b);
3279 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3280 PyErr_Clear();
3281 if (ret != -1 || match == 0)
3282 goto error;
3283
3284 Py_RETURN_NONE;
3285
3286error:
3287 PyErr_SetString(TestError,
3288 "test_pep3118_obsolete_write_locks: failure");
3289 return NULL;
3290}
Stefan Kraha7559c02015-02-03 22:27:21 +01003291#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003292
Stefan Krah650c1e82015-02-03 21:43:23 +01003293/* This tests functions that historically supported write locks. It is
3294 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3295 is entitled to segfault in that case. */
3296static PyObject *
3297getbuffer_with_null_view(PyObject* self, PyObject *obj)
3298{
3299 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3300 return NULL;
3301
3302 Py_RETURN_NONE;
3303}
3304
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003305/* Test that the fatal error from not having a current thread doesn't
3306 cause an infinite loop. Run via Lib/test/test_capi.py */
3307static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303308crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003309{
3310 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003311 /* Using PyThreadState_Get() directly allows the test to pass in
3312 !pydebug mode. However, the test only actually tests anything
3313 in pydebug mode, since that's where the infinite loop was in
3314 the first place. */
3315 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003316 Py_END_ALLOW_THREADS
3317 return NULL;
3318}
3319
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003320/* To run some code in a sub-interpreter. */
3321static PyObject *
3322run_in_subinterp(PyObject *self, PyObject *args)
3323{
3324 const char *code;
3325 int r;
3326 PyThreadState *substate, *mainstate;
3327
3328 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3329 &code))
3330 return NULL;
3331
3332 mainstate = PyThreadState_Get();
3333
3334 PyThreadState_Swap(NULL);
3335
3336 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003337 if (substate == NULL) {
3338 /* Since no new thread state was created, there is no exception to
3339 propagate; raise a fresh one after swapping in the old thread
3340 state. */
3341 PyThreadState_Swap(mainstate);
3342 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3343 return NULL;
3344 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003345 r = PyRun_SimpleString(code);
3346 Py_EndInterpreter(substate);
3347
3348 PyThreadState_Swap(mainstate);
3349
3350 return PyLong_FromLong(r);
3351}
3352
Victor Stinner3c1b3792014-02-17 00:02:43 +01003353static int
3354check_time_rounding(int round)
3355{
Victor Stinner74474232015-09-02 01:43:56 +02003356 if (round != _PyTime_ROUND_FLOOR
3357 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003358 && round != _PyTime_ROUND_HALF_EVEN
3359 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003360 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3361 return -1;
3362 }
3363 return 0;
3364}
3365
Victor Stinner5d272cc2012-03-13 13:35:55 +01003366static PyObject *
3367test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3368{
3369 PyObject *obj;
3370 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003371 int round;
3372 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003373 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003374 if (check_time_rounding(round) < 0)
3375 return NULL;
3376 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003377 return NULL;
3378 return _PyLong_FromTime_t(sec);
3379}
3380
3381static PyObject *
3382test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3383{
3384 PyObject *obj;
3385 time_t sec;
3386 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003387 int round;
3388 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003389 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003390 if (check_time_rounding(round) < 0)
3391 return NULL;
3392 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003393 return NULL;
3394 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3395}
3396
Victor Stinner643cd682012-03-02 22:54:03 +01003397static PyObject *
3398test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3399{
3400 PyObject *obj;
3401 time_t sec;
3402 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003403 int round;
3404 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003405 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003406 if (check_time_rounding(round) < 0)
3407 return NULL;
3408 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003409 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003410 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003411}
3412
Antoine Pitrou796564c2013-07-30 19:59:21 +02003413static void
3414slot_tp_del(PyObject *self)
3415{
3416 _Py_IDENTIFIER(__tp_del__);
3417 PyObject *del, *res;
3418 PyObject *error_type, *error_value, *error_traceback;
3419
3420 /* Temporarily resurrect the object. */
3421 assert(self->ob_refcnt == 0);
3422 self->ob_refcnt = 1;
3423
3424 /* Save the current exception, if any. */
3425 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3426
3427 /* Execute __del__ method, if any. */
3428 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3429 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003430 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003431 if (res == NULL)
3432 PyErr_WriteUnraisable(del);
3433 else
3434 Py_DECREF(res);
3435 Py_DECREF(del);
3436 }
3437
3438 /* Restore the saved exception. */
3439 PyErr_Restore(error_type, error_value, error_traceback);
3440
3441 /* Undo the temporary resurrection; can't use DECREF here, it would
3442 * cause a recursive call.
3443 */
3444 assert(self->ob_refcnt > 0);
3445 if (--self->ob_refcnt == 0)
3446 return; /* this is the normal path out */
3447
3448 /* __del__ resurrected it! Make it look like the original Py_DECREF
3449 * never happened.
3450 */
3451 {
3452 Py_ssize_t refcnt = self->ob_refcnt;
3453 _Py_NewReference(self);
3454 self->ob_refcnt = refcnt;
3455 }
INADA Naokid8521422018-05-17 11:07:21 +09003456 assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self));
Antoine Pitrou796564c2013-07-30 19:59:21 +02003457 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3458 * we need to undo that. */
3459 _Py_DEC_REFTOTAL;
3460 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3461 * chain, so no more to do there.
3462 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3463 * _Py_NewReference bumped tp_allocs: both of those need to be
3464 * undone.
3465 */
3466#ifdef COUNT_ALLOCS
3467 --Py_TYPE(self)->tp_frees;
3468 --Py_TYPE(self)->tp_allocs;
3469#endif
3470}
3471
3472static PyObject *
3473with_tp_del(PyObject *self, PyObject *args)
3474{
3475 PyObject *obj;
3476 PyTypeObject *tp;
3477
3478 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3479 return NULL;
3480 tp = (PyTypeObject *) obj;
3481 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3482 PyErr_Format(PyExc_TypeError,
3483 "heap type expected, got %R", obj);
3484 return NULL;
3485 }
3486 tp->tp_del = slot_tp_del;
3487 Py_INCREF(obj);
3488 return obj;
3489}
3490
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003491static PyMethodDef ml;
3492
3493static PyObject *
3494create_cfunction(PyObject *self, PyObject *args)
3495{
3496 return PyCFunction_NewEx(&ml, self, NULL);
3497}
3498
3499static PyMethodDef ml = {
3500 "create_cfunction",
3501 create_cfunction,
3502 METH_NOARGS,
3503 NULL
3504};
3505
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003506static PyObject *
3507_test_incref(PyObject *ob)
3508{
3509 Py_INCREF(ob);
3510 return ob;
3511}
3512
3513static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303514test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003515{
3516 PyObject *obj = PyLong_FromLong(0);
3517 Py_XINCREF(_test_incref(obj));
3518 Py_DECREF(obj);
3519 Py_DECREF(obj);
3520 Py_DECREF(obj);
3521 Py_RETURN_NONE;
3522}
3523
3524static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303525test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003526{
3527 PyObject *obj = PyLong_FromLong(0);
3528 Py_INCREF(_test_incref(obj));
3529 Py_DECREF(obj);
3530 Py_DECREF(obj);
3531 Py_DECREF(obj);
3532 Py_RETURN_NONE;
3533}
3534
3535static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303536test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003537{
3538 Py_XDECREF(PyLong_FromLong(0));
3539 Py_RETURN_NONE;
3540}
3541
3542static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303543test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003544{
3545 Py_DECREF(PyLong_FromLong(0));
3546 Py_RETURN_NONE;
3547}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003548
Victor Stinner0507bf52013-07-07 02:05:46 +02003549static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003550test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3551 PyObject *Py_UNUSED(args))
3552{
3553 PyStructSequence_Desc descr;
3554 PyStructSequence_Field descr_fields[3];
3555
3556 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3557 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3558 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3559
3560 descr.name = "_testcapi.test_descr";
3561 descr.doc = "This is used to test for memory leaks in NewType";
3562 descr.fields = descr_fields;
3563 descr.n_in_sequence = 1;
3564
3565 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3566 assert(structseq_type != NULL);
3567 assert(PyType_Check(structseq_type));
3568 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3569 Py_DECREF(structseq_type);
3570
3571 Py_RETURN_NONE;
3572}
3573
3574static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303575test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003576{
3577 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003578 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003579 Py_DecRef(obj);
3580 Py_DecRef(obj);
3581 Py_RETURN_NONE;
3582}
3583
3584static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303585test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003586{
3587 void *ptr;
3588
Victor Stinnerdb067af2014-05-02 22:31:14 +02003589 ptr = PyMem_RawMalloc(0);
3590 if (ptr == NULL) {
3591 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3592 return NULL;
3593 }
3594 PyMem_RawFree(ptr);
3595
3596 ptr = PyMem_RawCalloc(0, 0);
3597 if (ptr == NULL) {
3598 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3599 return NULL;
3600 }
3601 PyMem_RawFree(ptr);
3602
Victor Stinner0507bf52013-07-07 02:05:46 +02003603 ptr = PyMem_Malloc(0);
3604 if (ptr == NULL) {
3605 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3606 return NULL;
3607 }
3608 PyMem_Free(ptr);
3609
Victor Stinnerdb067af2014-05-02 22:31:14 +02003610 ptr = PyMem_Calloc(0, 0);
3611 if (ptr == NULL) {
3612 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3613 return NULL;
3614 }
3615 PyMem_Free(ptr);
3616
Victor Stinner0507bf52013-07-07 02:05:46 +02003617 ptr = PyObject_Malloc(0);
3618 if (ptr == NULL) {
3619 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3620 return NULL;
3621 }
3622 PyObject_Free(ptr);
3623
Victor Stinnerdb067af2014-05-02 22:31:14 +02003624 ptr = PyObject_Calloc(0, 0);
3625 if (ptr == NULL) {
3626 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3627 return NULL;
3628 }
3629 PyObject_Free(ptr);
3630
Victor Stinner0507bf52013-07-07 02:05:46 +02003631 Py_RETURN_NONE;
3632}
3633
3634typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003635 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003636
3637 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003638 size_t calloc_nelem;
3639 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003640 void *realloc_ptr;
3641 size_t realloc_new_size;
3642 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003643 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003644} alloc_hook_t;
3645
Victor Stinner9ed83c42017-10-31 12:18:10 -07003646static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003647{
3648 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003649 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003650 hook->malloc_size = size;
3651 return hook->alloc.malloc(hook->alloc.ctx, size);
3652}
3653
Victor Stinner9ed83c42017-10-31 12:18:10 -07003654static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003655{
3656 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003657 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003658 hook->calloc_nelem = nelem;
3659 hook->calloc_elsize = elsize;
3660 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3661}
3662
Victor Stinner9ed83c42017-10-31 12:18:10 -07003663static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003664{
3665 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003666 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003667 hook->realloc_ptr = ptr;
3668 hook->realloc_new_size = new_size;
3669 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3670}
3671
Victor Stinner9ed83c42017-10-31 12:18:10 -07003672static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02003673{
3674 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003675 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003676 hook->free_ptr = ptr;
3677 hook->alloc.free(hook->alloc.ctx, ptr);
3678}
3679
3680static PyObject *
3681test_setallocators(PyMemAllocatorDomain domain)
3682{
3683 PyObject *res = NULL;
3684 const char *error_msg;
3685 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003686 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003687 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003688 void *ptr, *ptr2;
3689
Victor Stinnerdb067af2014-05-02 22:31:14 +02003690 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003691
3692 alloc.ctx = &hook;
3693 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003694 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003695 alloc.realloc = &hook_realloc;
3696 alloc.free = &hook_free;
3697 PyMem_GetAllocator(domain, &hook.alloc);
3698 PyMem_SetAllocator(domain, &alloc);
3699
Victor Stinner9ed83c42017-10-31 12:18:10 -07003700 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02003701 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003702 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02003703 switch(domain)
3704 {
3705 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3706 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3707 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3708 default: ptr = NULL; break;
3709 }
3710
Victor Stinner9ed83c42017-10-31 12:18:10 -07003711#define CHECK_CTX(FUNC) \
3712 if (hook.ctx != &hook) { \
3713 error_msg = FUNC " wrong context"; \
3714 goto fail; \
3715 } \
3716 hook.ctx = NULL; /* reset for next check */
3717
Victor Stinner0507bf52013-07-07 02:05:46 +02003718 if (ptr == NULL) {
3719 error_msg = "malloc failed";
3720 goto fail;
3721 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003722 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003723 if (hook.malloc_size != size) {
3724 error_msg = "malloc invalid size";
3725 goto fail;
3726 }
3727
3728 size2 = 200;
3729 switch(domain)
3730 {
3731 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3732 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3733 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003734 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003735 }
3736
3737 if (ptr2 == NULL) {
3738 error_msg = "realloc failed";
3739 goto fail;
3740 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003741 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003742 if (hook.realloc_ptr != ptr
3743 || hook.realloc_new_size != size2) {
3744 error_msg = "realloc invalid parameters";
3745 goto fail;
3746 }
3747
3748 switch(domain)
3749 {
3750 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3751 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3752 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3753 }
3754
Victor Stinner9ed83c42017-10-31 12:18:10 -07003755 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02003756 if (hook.free_ptr != ptr2) {
3757 error_msg = "free invalid pointer";
3758 goto fail;
3759 }
3760
Victor Stinner9ed83c42017-10-31 12:18:10 -07003761 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02003762 nelem = 2;
3763 elsize = 5;
3764 switch(domain)
3765 {
3766 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3767 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3768 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3769 default: ptr = NULL; break;
3770 }
3771
3772 if (ptr == NULL) {
3773 error_msg = "calloc failed";
3774 goto fail;
3775 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003776 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02003777 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3778 error_msg = "calloc invalid nelem or elsize";
3779 goto fail;
3780 }
3781
Victor Stinner9ed83c42017-10-31 12:18:10 -07003782 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003783 switch(domain)
3784 {
3785 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3786 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3787 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3788 }
3789
Victor Stinner9ed83c42017-10-31 12:18:10 -07003790 CHECK_CTX("calloc free");
3791 if (hook.free_ptr != ptr) {
3792 error_msg = "calloc free invalid pointer";
3793 goto fail;
3794 }
3795
Victor Stinner0507bf52013-07-07 02:05:46 +02003796 Py_INCREF(Py_None);
3797 res = Py_None;
3798 goto finally;
3799
3800fail:
3801 PyErr_SetString(PyExc_RuntimeError, error_msg);
3802
3803finally:
3804 PyMem_SetAllocator(domain, &hook.alloc);
3805 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003806
3807#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02003808}
3809
3810static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303811test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003812{
3813 return test_setallocators(PYMEM_DOMAIN_RAW);
3814}
3815
3816static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303817test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003818{
3819 return test_setallocators(PYMEM_DOMAIN_MEM);
3820}
3821
3822static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303823test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003824{
3825 return test_setallocators(PYMEM_DOMAIN_OBJ);
3826}
3827
xdegaye85f64302017-07-01 14:14:45 +02003828/* Most part of the following code is inherited from the pyfailmalloc project
3829 * written by Victor Stinner. */
3830static struct {
3831 int installed;
3832 PyMemAllocatorEx raw;
3833 PyMemAllocatorEx mem;
3834 PyMemAllocatorEx obj;
3835} FmHook;
3836
3837static struct {
3838 int start;
3839 int stop;
3840 Py_ssize_t count;
3841} FmData;
3842
3843static int
3844fm_nomemory(void)
3845{
3846 FmData.count++;
3847 if (FmData.count > FmData.start &&
3848 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
3849 return 1;
3850 }
3851 return 0;
3852}
3853
3854static void *
3855hook_fmalloc(void *ctx, size_t size)
3856{
3857 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3858 if (fm_nomemory()) {
3859 return NULL;
3860 }
3861 return alloc->malloc(alloc->ctx, size);
3862}
3863
3864static void *
3865hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
3866{
3867 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3868 if (fm_nomemory()) {
3869 return NULL;
3870 }
3871 return alloc->calloc(alloc->ctx, nelem, elsize);
3872}
3873
3874static void *
3875hook_frealloc(void *ctx, void *ptr, size_t new_size)
3876{
3877 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3878 if (fm_nomemory()) {
3879 return NULL;
3880 }
3881 return alloc->realloc(alloc->ctx, ptr, new_size);
3882}
3883
3884static void
3885hook_ffree(void *ctx, void *ptr)
3886{
3887 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3888 alloc->free(alloc->ctx, ptr);
3889}
3890
3891static void
3892fm_setup_hooks(void)
3893{
3894 PyMemAllocatorEx alloc;
3895
3896 if (FmHook.installed) {
3897 return;
3898 }
3899 FmHook.installed = 1;
3900
3901 alloc.malloc = hook_fmalloc;
3902 alloc.calloc = hook_fcalloc;
3903 alloc.realloc = hook_frealloc;
3904 alloc.free = hook_ffree;
3905 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3906 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3907 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3908
3909 alloc.ctx = &FmHook.raw;
3910 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
3911
3912 alloc.ctx = &FmHook.mem;
3913 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
3914
3915 alloc.ctx = &FmHook.obj;
3916 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
3917}
3918
3919static void
3920fm_remove_hooks(void)
3921{
3922 if (FmHook.installed) {
3923 FmHook.installed = 0;
3924 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3925 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3926 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3927 }
3928}
3929
3930static PyObject*
3931set_nomemory(PyObject *self, PyObject *args)
3932{
3933 /* Memory allocation fails after 'start' allocation requests, and until
3934 * 'stop' allocation requests except when 'stop' is negative or equal
3935 * to 0 (default) in which case allocation failures never stop. */
3936 FmData.count = 0;
3937 FmData.stop = 0;
3938 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
3939 return NULL;
3940 }
3941 fm_setup_hooks();
3942 Py_RETURN_NONE;
3943}
3944
3945static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303946remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02003947{
3948 fm_remove_hooks();
3949 Py_RETURN_NONE;
3950}
3951
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003952PyDoc_STRVAR(docstring_empty,
3953""
3954);
3955
3956PyDoc_STRVAR(docstring_no_signature,
3957"This docstring has no signature."
3958);
3959
3960PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003961"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003962"\n"
3963"This docstring has an invalid signature."
3964);
3965
Larry Hastings2623c8c2014-02-08 22:15:29 -08003966PyDoc_STRVAR(docstring_with_invalid_signature2,
3967"docstring_with_invalid_signature2($module, /, boo)\n"
3968"\n"
3969"--\n"
3970"\n"
3971"This docstring also has an invalid signature."
3972);
3973
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003974PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003975"docstring_with_signature($module, /, sig)\n"
3976"--\n"
3977"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003978"This docstring has a valid signature."
3979);
3980
Zachary Ware8ef887c2015-04-13 18:22:35 -05003981PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3982"docstring_with_signature_but_no_doc($module, /, sig)\n"
3983"--\n"
3984"\n"
3985);
3986
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003987PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003988"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3989"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003990"\n"
3991"\n"
3992"This docstring has a valid signature and some extra newlines."
3993);
3994
Larry Hastings16c51912014-01-07 11:53:01 -08003995PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003996"docstring_with_signature_with_defaults(module, s='avocado',\n"
3997" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3998" local=the_number_three, sys=sys.maxsize,\n"
3999" exp=sys.maxsize - 1)\n"
4000"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004001"\n"
4002"\n"
4003"\n"
4004"This docstring has a valid signature with parameters,\n"
4005"and the parameters take defaults of varying types."
4006);
4007
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004008typedef struct {
4009 PyThread_type_lock start_event;
4010 PyThread_type_lock exit_event;
4011 PyObject *callback;
4012} test_c_thread_t;
4013
4014static void
4015temporary_c_thread(void *data)
4016{
4017 test_c_thread_t *test_c_thread = data;
4018 PyGILState_STATE state;
4019 PyObject *res;
4020
4021 PyThread_release_lock(test_c_thread->start_event);
4022
4023 /* Allocate a Python thread state for this thread */
4024 state = PyGILState_Ensure();
4025
Victor Stinner3466bde2016-09-05 18:16:01 -07004026 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004027 Py_CLEAR(test_c_thread->callback);
4028
4029 if (res == NULL) {
4030 PyErr_Print();
4031 }
4032 else {
4033 Py_DECREF(res);
4034 }
4035
4036 /* Destroy the Python thread state for this thread */
4037 PyGILState_Release(state);
4038
4039 PyThread_release_lock(test_c_thread->exit_event);
4040
4041 PyThread_exit_thread();
4042}
4043
4044static PyObject *
4045call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4046{
4047 PyObject *res = NULL;
4048 test_c_thread_t test_c_thread;
4049 long thread;
4050
4051 PyEval_InitThreads();
4052
4053 test_c_thread.start_event = PyThread_allocate_lock();
4054 test_c_thread.exit_event = PyThread_allocate_lock();
4055 test_c_thread.callback = NULL;
4056 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4057 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4058 goto exit;
4059 }
4060
4061 Py_INCREF(callback);
4062 test_c_thread.callback = callback;
4063
4064 PyThread_acquire_lock(test_c_thread.start_event, 1);
4065 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4066
4067 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4068 if (thread == -1) {
4069 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4070 PyThread_release_lock(test_c_thread.start_event);
4071 PyThread_release_lock(test_c_thread.exit_event);
4072 goto exit;
4073 }
4074
4075 PyThread_acquire_lock(test_c_thread.start_event, 1);
4076 PyThread_release_lock(test_c_thread.start_event);
4077
4078 Py_BEGIN_ALLOW_THREADS
4079 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4080 PyThread_release_lock(test_c_thread.exit_event);
4081 Py_END_ALLOW_THREADS
4082
4083 Py_INCREF(Py_None);
4084 res = Py_None;
4085
4086exit:
4087 Py_CLEAR(test_c_thread.callback);
4088 if (test_c_thread.start_event)
4089 PyThread_free_lock(test_c_thread.start_event);
4090 if (test_c_thread.exit_event)
4091 PyThread_free_lock(test_c_thread.exit_event);
4092 return res;
4093}
Victor Stinner13105102013-12-13 02:17:29 +01004094
Serhiy Storchakab5181342015-02-06 08:58:56 +02004095/* marshal */
4096
4097static PyObject*
4098pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4099{
4100 long value;
4101 char *filename;
4102 int version;
4103 FILE *fp;
4104
4105 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
4106 &value, &filename, &version))
4107 return NULL;
4108
4109 fp = fopen(filename, "wb");
4110 if (fp == NULL) {
4111 PyErr_SetFromErrno(PyExc_OSError);
4112 return NULL;
4113 }
4114
4115 PyMarshal_WriteLongToFile(value, fp, version);
4116
4117 fclose(fp);
4118 if (PyErr_Occurred())
4119 return NULL;
4120 Py_RETURN_NONE;
4121}
4122
4123static PyObject*
4124pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4125{
4126 PyObject *obj;
4127 char *filename;
4128 int version;
4129 FILE *fp;
4130
4131 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
4132 &obj, &filename, &version))
4133 return NULL;
4134
4135 fp = fopen(filename, "wb");
4136 if (fp == NULL) {
4137 PyErr_SetFromErrno(PyExc_OSError);
4138 return NULL;
4139 }
4140
4141 PyMarshal_WriteObjectToFile(obj, fp, version);
4142
4143 fclose(fp);
4144 if (PyErr_Occurred())
4145 return NULL;
4146 Py_RETURN_NONE;
4147}
4148
4149static PyObject*
4150pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4151{
4152 int value;
4153 long pos;
4154 char *filename;
4155 FILE *fp;
4156
4157 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
4158 return NULL;
4159
4160 fp = fopen(filename, "rb");
4161 if (fp == NULL) {
4162 PyErr_SetFromErrno(PyExc_OSError);
4163 return NULL;
4164 }
4165
4166 value = PyMarshal_ReadShortFromFile(fp);
4167 pos = ftell(fp);
4168
4169 fclose(fp);
4170 if (PyErr_Occurred())
4171 return NULL;
4172 return Py_BuildValue("il", value, pos);
4173}
4174
4175static PyObject*
4176pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4177{
4178 long value, pos;
4179 char *filename;
4180 FILE *fp;
4181
4182 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
4183 return NULL;
4184
4185 fp = fopen(filename, "rb");
4186 if (fp == NULL) {
4187 PyErr_SetFromErrno(PyExc_OSError);
4188 return NULL;
4189 }
4190
4191 value = PyMarshal_ReadLongFromFile(fp);
4192 pos = ftell(fp);
4193
4194 fclose(fp);
4195 if (PyErr_Occurred())
4196 return NULL;
4197 return Py_BuildValue("ll", value, pos);
4198}
4199
4200static PyObject*
4201pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4202{
4203 PyObject *obj;
4204 long pos;
4205 char *filename;
4206 FILE *fp;
4207
4208 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
4209 return NULL;
4210
4211 fp = fopen(filename, "rb");
4212 if (fp == NULL) {
4213 PyErr_SetFromErrno(PyExc_OSError);
4214 return NULL;
4215 }
4216
4217 obj = PyMarshal_ReadLastObjectFromFile(fp);
4218 pos = ftell(fp);
4219
4220 fclose(fp);
4221 return Py_BuildValue("Nl", obj, pos);
4222}
4223
4224static PyObject*
4225pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4226{
4227 PyObject *obj;
4228 long pos;
4229 char *filename;
4230 FILE *fp;
4231
4232 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
4233 return NULL;
4234
4235 fp = fopen(filename, "rb");
4236 if (fp == NULL) {
4237 PyErr_SetFromErrno(PyExc_OSError);
4238 return NULL;
4239 }
4240
4241 obj = PyMarshal_ReadObjectFromFile(fp);
4242 pos = ftell(fp);
4243
4244 fclose(fp);
4245 return Py_BuildValue("Nl", obj, pos);
4246}
4247
Victor Stinnerefde1462015-03-21 15:04:43 +01004248static PyObject*
4249return_null_without_error(PyObject *self, PyObject *args)
4250{
4251 /* invalid call: return NULL without setting an error,
4252 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4253 PyErr_Clear();
4254 return NULL;
4255}
4256
4257static PyObject*
4258return_result_with_error(PyObject *self, PyObject *args)
4259{
4260 /* invalid call: return a result with an error set,
4261 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4262 PyErr_SetNone(PyExc_ValueError);
4263 Py_RETURN_NONE;
4264}
4265
Victor Stinner992c43f2015-03-27 17:12:45 +01004266static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004267test_pytime_fromseconds(PyObject *self, PyObject *args)
4268{
4269 int seconds;
4270 _PyTime_t ts;
4271
4272 if (!PyArg_ParseTuple(args, "i", &seconds))
4273 return NULL;
4274 ts = _PyTime_FromSeconds(seconds);
4275 return _PyTime_AsNanosecondsObject(ts);
4276}
4277
4278static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004279test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4280{
4281 PyObject *obj;
4282 int round;
4283 _PyTime_t ts;
4284
4285 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4286 return NULL;
4287 if (check_time_rounding(round) < 0)
4288 return NULL;
4289 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4290 return NULL;
4291 return _PyTime_AsNanosecondsObject(ts);
4292}
4293
Victor Stinner4bfb4602015-03-27 22:27:24 +01004294static PyObject *
4295test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4296{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004297 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004298 _PyTime_t ts;
4299 double d;
4300
Victor Stinnerc29b5852017-11-02 07:28:27 -07004301 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004302 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004303 }
4304 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4305 return NULL;
4306 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004307 d = _PyTime_AsSecondsDouble(ts);
4308 return PyFloat_FromDouble(d);
4309}
4310
Victor Stinner95e9cef2015-03-28 01:26:47 +01004311static PyObject *
4312test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4313{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004314 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004315 int round;
4316 _PyTime_t t;
4317 struct timeval tv;
4318 PyObject *seconds;
4319
Victor Stinnerc29b5852017-11-02 07:28:27 -07004320 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004321 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004322 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004323 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004324 }
4325 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004326 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004327 }
4328 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4329 return NULL;
4330 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004331
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004332 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004333 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004334 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004335 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004336 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4337}
4338
Victor Stinner34dc0f42015-03-27 18:19:03 +01004339#ifdef HAVE_CLOCK_GETTIME
4340static PyObject *
4341test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4342{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004343 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004344 _PyTime_t t;
4345 struct timespec ts;
4346
Victor Stinnerc29b5852017-11-02 07:28:27 -07004347 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004348 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004349 }
4350 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004351 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004352 }
4353 if (_PyTime_AsTimespec(t, &ts) == -1) {
4354 return NULL;
4355 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004356 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4357}
4358#endif
4359
Victor Stinner62d1c702015-04-01 17:47:07 +02004360static PyObject *
4361test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4362{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004363 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004364 int round;
4365 _PyTime_t t, ms;
4366
Victor Stinnerc29b5852017-11-02 07:28:27 -07004367 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004368 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004369 }
4370 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004371 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004372 }
4373 if (check_time_rounding(round) < 0) {
4374 return NULL;
4375 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004376 ms = _PyTime_AsMilliseconds(t, round);
4377 /* This conversion rely on the fact that _PyTime_t is a number of
4378 nanoseconds */
4379 return _PyTime_AsNanosecondsObject(ms);
4380}
4381
4382static PyObject *
4383test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4384{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004385 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004386 int round;
4387 _PyTime_t t, ms;
4388
Victor Stinnerc29b5852017-11-02 07:28:27 -07004389 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004390 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004391 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004392 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004393 }
4394 if (check_time_rounding(round) < 0) {
4395 return NULL;
4396 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004397 ms = _PyTime_AsMicroseconds(t, round);
4398 /* This conversion rely on the fact that _PyTime_t is a number of
4399 nanoseconds */
4400 return _PyTime_AsNanosecondsObject(ms);
4401}
4402
Victor Stinner50856d52015-10-13 00:11:21 +02004403static PyObject*
4404get_recursion_depth(PyObject *self, PyObject *args)
4405{
Victor Stinner50b48572018-11-01 01:51:40 +01004406 PyThreadState *tstate = PyThreadState_Get();
Victor Stinner50856d52015-10-13 00:11:21 +02004407
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07004408 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02004409 return PyLong_FromLong(tstate->recursion_depth - 1);
4410}
4411
Victor Stinner34be807c2016-03-14 12:04:26 +01004412static PyObject*
4413pymem_buffer_overflow(PyObject *self, PyObject *args)
4414{
4415 char *buffer;
4416
4417 /* Deliberate buffer overflow to check that PyMem_Free() detects
4418 the overflow when debug hooks are installed. */
4419 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004420 if (buffer == NULL) {
4421 PyErr_NoMemory();
4422 return NULL;
4423 }
Victor Stinner34be807c2016-03-14 12:04:26 +01004424 buffer[16] = 'x';
4425 PyMem_Free(buffer);
4426
4427 Py_RETURN_NONE;
4428}
4429
4430static PyObject*
4431pymem_api_misuse(PyObject *self, PyObject *args)
4432{
4433 char *buffer;
4434
4435 /* Deliberate misusage of Python allocators:
4436 allococate with PyMem but release with PyMem_Raw. */
4437 buffer = PyMem_Malloc(16);
4438 PyMem_RawFree(buffer);
4439
4440 Py_RETURN_NONE;
4441}
4442
Victor Stinnerc4aec362016-03-14 22:26:53 +01004443static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004444pymem_malloc_without_gil(PyObject *self, PyObject *args)
4445{
4446 char *buffer;
4447
4448 /* Deliberate bug to test debug hooks on Python memory allocators:
4449 call PyMem_Malloc() without holding the GIL */
4450 Py_BEGIN_ALLOW_THREADS
4451 buffer = PyMem_Malloc(10);
4452 Py_END_ALLOW_THREADS
4453
4454 PyMem_Free(buffer);
4455
4456 Py_RETURN_NONE;
4457}
4458
Victor Stinner5d39e042017-11-29 17:20:38 +01004459
4460static PyObject*
4461test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4462{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004463 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004464 if (name == NULL) {
4465 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4466 return NULL;
4467 }
4468 return PyUnicode_FromString(name);
4469}
4470
4471
Victor Stinnerad524372016-03-16 12:12:53 +01004472static PyObject*
Victor Stinner2b00db62019-04-11 11:33:27 +02004473pyobject_is_freed(PyObject *self, PyObject *op)
4474{
4475 int res = _PyObject_IsFreed(op);
4476 return PyBool_FromLong(res);
4477}
4478
4479
4480static PyObject*
4481pyobject_uninitialized(PyObject *self, PyObject *args)
4482{
4483 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4484 if (op == NULL) {
4485 return NULL;
4486 }
4487 /* Initialize reference count to avoid early crash in ceval or GC */
4488 Py_REFCNT(op) = 1;
4489 /* object fields like ob_type are uninitialized! */
4490 return op;
4491}
4492
4493
4494static PyObject*
4495pyobject_forbidden_bytes(PyObject *self, PyObject *args)
4496{
4497 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4498 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4499 if (op == NULL) {
4500 return NULL;
4501 }
4502 /* Initialize reference count to avoid early crash in ceval or GC */
4503 Py_REFCNT(op) = 1;
4504 /* ob_type field is after the memory block: part of "forbidden bytes"
4505 when using debug hooks on memory allocatrs! */
4506 return op;
4507}
4508
4509
4510static PyObject*
4511pyobject_freed(PyObject *self, PyObject *args)
4512{
4513 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4514 if (op == NULL) {
4515 return NULL;
4516 }
4517 Py_TYPE(op)->tp_dealloc(op);
4518 /* Reset reference count to avoid early crash in ceval or GC */
4519 Py_REFCNT(op) = 1;
4520 /* object memory is freed! */
4521 return op;
4522}
4523
4524
4525static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004526pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4527{
4528 char *buffer;
4529
Victor Stinnerad524372016-03-16 12:12:53 +01004530 /* Deliberate bug to test debug hooks on Python memory allocators:
4531 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004532 Py_BEGIN_ALLOW_THREADS
4533 buffer = PyObject_Malloc(10);
4534 Py_END_ALLOW_THREADS
4535
4536 PyObject_Free(buffer);
4537
4538 Py_RETURN_NONE;
4539}
4540
Victor Stinner10b73e12016-03-22 13:39:05 +01004541static PyObject *
4542tracemalloc_track(PyObject *self, PyObject *args)
4543{
4544 unsigned int domain;
4545 PyObject *ptr_obj;
4546 void *ptr;
4547 Py_ssize_t size;
4548 int release_gil = 0;
4549 int res;
4550
4551 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4552 return NULL;
4553 ptr = PyLong_AsVoidPtr(ptr_obj);
4554 if (PyErr_Occurred())
4555 return NULL;
4556
4557 if (release_gil) {
4558 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004559 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004560 Py_END_ALLOW_THREADS
4561 }
4562 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004563 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004564 }
4565
4566 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004567 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004568 return NULL;
4569 }
4570
4571 Py_RETURN_NONE;
4572}
4573
4574static PyObject *
4575tracemalloc_untrack(PyObject *self, PyObject *args)
4576{
4577 unsigned int domain;
4578 PyObject *ptr_obj;
4579 void *ptr;
4580 int res;
4581
4582 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4583 return NULL;
4584 ptr = PyLong_AsVoidPtr(ptr_obj);
4585 if (PyErr_Occurred())
4586 return NULL;
4587
Victor Stinner5ea4c062017-06-20 17:46:36 +02004588 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004589 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004590 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004591 return NULL;
4592 }
4593
4594 Py_RETURN_NONE;
4595}
4596
4597static PyObject *
4598tracemalloc_get_traceback(PyObject *self, PyObject *args)
4599{
4600 unsigned int domain;
4601 PyObject *ptr_obj;
4602 void *ptr;
4603
4604 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4605 return NULL;
4606 ptr = PyLong_AsVoidPtr(ptr_obj);
4607 if (PyErr_Occurred())
4608 return NULL;
4609
Benjamin Petersonca470632016-09-06 13:47:26 -07004610 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004611}
4612
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004613static PyObject *
4614dict_get_version(PyObject *self, PyObject *args)
4615{
4616 PyDictObject *dict;
4617 uint64_t version;
4618
4619 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4620 return NULL;
4621
4622 version = dict->ma_version_tag;
4623
4624 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4625 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4626}
4627
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004628
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004629static PyObject *
4630raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4631{
4632 PyGenObject *gen;
4633
4634 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4635 return NULL;
4636
4637 /* This is used in a test to check what happens if a signal arrives just
4638 as we're in the process of entering a yield from chain (see
4639 bpo-30039).
4640
4641 Needs to be done in C, because:
4642 - we don't have a Python wrapper for raise()
4643 - we need to make sure that the Python-level signal handler doesn't run
4644 *before* we enter the generator frame, which is impossible in Python
4645 because we check for signals before every bytecode operation.
4646 */
4647 raise(SIGINT);
4648 return _PyGen_Send(gen, Py_None);
4649}
4650
4651
Victor Stinner3b5cf852017-06-09 16:48:45 +02004652static int
4653fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4654{
4655 if (args == Py_None) {
4656 *stack = NULL;
4657 *nargs = 0;
4658 }
4659 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01004660 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02004661 *nargs = PyTuple_GET_SIZE(args);
4662 }
4663 else {
4664 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4665 return -1;
4666 }
4667 return 0;
4668}
4669
4670
4671static PyObject *
4672test_pyobject_fastcall(PyObject *self, PyObject *args)
4673{
4674 PyObject *func, *func_args;
4675 PyObject **stack;
4676 Py_ssize_t nargs;
4677
4678 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4679 return NULL;
4680 }
4681
4682 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4683 return NULL;
4684 }
4685 return _PyObject_FastCall(func, stack, nargs);
4686}
4687
4688
4689static PyObject *
4690test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4691{
4692 PyObject *func, *func_args, *kwargs;
4693 PyObject **stack;
4694 Py_ssize_t nargs;
4695
4696 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4697 return NULL;
4698 }
4699
4700 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4701 return NULL;
4702 }
4703
4704 if (kwargs == Py_None) {
4705 kwargs = NULL;
4706 }
4707 else if (!PyDict_Check(kwargs)) {
4708 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4709 return NULL;
4710 }
4711
4712 return _PyObject_FastCallDict(func, stack, nargs, kwargs);
4713}
4714
4715
4716static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004717test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02004718{
4719 PyObject *func, *func_args, *kwnames = NULL;
4720 PyObject **stack;
4721 Py_ssize_t nargs, nkw;
4722
4723 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4724 return NULL;
4725 }
4726
4727 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4728 return NULL;
4729 }
4730
4731 if (kwnames == Py_None) {
4732 kwnames = NULL;
4733 }
4734 else if (PyTuple_Check(kwnames)) {
4735 nkw = PyTuple_GET_SIZE(kwnames);
4736 if (nargs < nkw) {
4737 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4738 return NULL;
4739 }
4740 nargs -= nkw;
4741 }
4742 else {
4743 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4744 return NULL;
4745 }
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004746 return _PyObject_Vectorcall(func, stack, nargs, kwnames);
4747}
4748
4749
4750static PyObject *
4751test_pyvectorcall_call(PyObject *self, PyObject *args)
4752{
4753 PyObject *func;
4754 PyObject *argstuple;
4755 PyObject *kwargs = NULL;
4756
4757 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
4758 return NULL;
4759 }
4760
4761 if (!PyTuple_Check(argstuple)) {
4762 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
4763 return NULL;
4764 }
4765 if (kwargs != NULL && !PyDict_Check(kwargs)) {
4766 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
4767 return NULL;
4768 }
4769
4770 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02004771}
4772
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004773
Victor Stinner64fa4492017-07-10 14:37:49 +02004774static PyObject*
4775stack_pointer(PyObject *self, PyObject *args)
4776{
4777 int v = 5;
4778 return PyLong_FromVoidPtr(&v);
4779}
4780
Victor Stinner3b5cf852017-06-09 16:48:45 +02004781
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004782#ifdef W_STOPCODE
4783static PyObject*
4784py_w_stopcode(PyObject *self, PyObject *args)
4785{
4786 int sig, status;
4787 if (!PyArg_ParseTuple(args, "i", &sig)) {
4788 return NULL;
4789 }
4790 status = W_STOPCODE(sig);
4791 return PyLong_FromLong(status);
4792}
4793#endif
4794
4795
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004796static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03004797get_mapping_keys(PyObject* self, PyObject *obj)
4798{
4799 return PyMapping_Keys(obj);
4800}
4801
4802static PyObject *
4803get_mapping_values(PyObject* self, PyObject *obj)
4804{
4805 return PyMapping_Values(obj);
4806}
4807
4808static PyObject *
4809get_mapping_items(PyObject* self, PyObject *obj)
4810{
4811 return PyMapping_Items(obj);
4812}
4813
4814
4815static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004816test_pythread_tss_key_state(PyObject *self, PyObject *args)
4817{
4818 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
4819 if (PyThread_tss_is_created(&tss_key)) {
4820 return raiseTestError("test_pythread_tss_key_state",
4821 "TSS key not in an uninitialized state at "
4822 "creation time");
4823 }
4824 if (PyThread_tss_create(&tss_key) != 0) {
4825 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
4826 return NULL;
4827 }
4828 if (!PyThread_tss_is_created(&tss_key)) {
4829 return raiseTestError("test_pythread_tss_key_state",
4830 "PyThread_tss_create succeeded, "
4831 "but with TSS key in an uninitialized state");
4832 }
4833 if (PyThread_tss_create(&tss_key) != 0) {
4834 return raiseTestError("test_pythread_tss_key_state",
4835 "PyThread_tss_create unsuccessful with "
4836 "an already initialized key");
4837 }
4838#define CHECK_TSS_API(expr) \
4839 (void)(expr); \
4840 if (!PyThread_tss_is_created(&tss_key)) { \
4841 return raiseTestError("test_pythread_tss_key_state", \
4842 "TSS key initialization state was not " \
4843 "preserved after calling " #expr); }
4844 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
4845 CHECK_TSS_API(PyThread_tss_get(&tss_key));
4846#undef CHECK_TSS_API
4847 PyThread_tss_delete(&tss_key);
4848 if (PyThread_tss_is_created(&tss_key)) {
4849 return raiseTestError("test_pythread_tss_key_state",
4850 "PyThread_tss_delete called, but did not "
4851 "set the key state to uninitialized");
4852 }
4853
4854 Py_tss_t *ptr_key = PyThread_tss_alloc();
4855 if (ptr_key == NULL) {
4856 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
4857 return NULL;
4858 }
4859 if (PyThread_tss_is_created(ptr_key)) {
4860 return raiseTestError("test_pythread_tss_key_state",
4861 "TSS key not in an uninitialized state at "
4862 "allocation time");
4863 }
4864 PyThread_tss_free(ptr_key);
4865 ptr_key = NULL;
4866 Py_RETURN_NONE;
4867}
4868
4869
Yury Selivanovf23746a2018-01-22 19:11:18 -05004870static PyObject*
4871new_hamt(PyObject *self, PyObject *args)
4872{
4873 return _PyContext_NewHamtForTests();
4874}
4875
4876
jdemeyer5a306202018-10-19 23:50:06 +02004877/* def bad_get(self, obj, cls):
4878 cls()
4879 return repr(self)
4880*/
4881static PyObject*
4882bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4883{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02004884 PyObject *self, *obj, *cls;
4885 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02004886 return NULL;
4887 }
4888
Serhiy Storchakab1dede32018-11-20 20:45:40 +02004889 PyObject *res = PyObject_CallObject(cls, NULL);
jdemeyer5a306202018-10-19 23:50:06 +02004890 if (res == NULL) {
4891 return NULL;
4892 }
4893 Py_DECREF(res);
4894
Serhiy Storchakab1dede32018-11-20 20:45:40 +02004895 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02004896}
4897
4898
Victor Stinner3d4226a2018-08-29 22:21:32 +02004899static PyObject *
4900encode_locale_ex(PyObject *self, PyObject *args)
4901{
4902 PyObject *unicode;
4903 int current_locale = 0;
4904 wchar_t *wstr;
4905 PyObject *res = NULL;
4906 const char *errors = NULL;
4907
4908 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
4909 return NULL;
4910 }
4911 wstr = PyUnicode_AsWideCharString(unicode, NULL);
4912 if (wstr == NULL) {
4913 return NULL;
4914 }
4915 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
4916
4917 char *str = NULL;
4918 size_t error_pos;
4919 const char *reason = NULL;
4920 int ret = _Py_EncodeLocaleEx(wstr,
4921 &str, &error_pos, &reason,
4922 current_locale, error_handler);
4923 PyMem_Free(wstr);
4924
4925 switch(ret) {
4926 case 0:
4927 res = PyBytes_FromString(str);
4928 PyMem_RawFree(str);
4929 break;
4930 case -1:
4931 PyErr_NoMemory();
4932 break;
4933 case -2:
4934 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
4935 error_pos, reason);
4936 break;
4937 case -3:
4938 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
4939 break;
4940 default:
4941 PyErr_SetString(PyExc_ValueError, "unknow error code");
4942 break;
4943 }
4944 return res;
4945}
4946
4947
4948static PyObject *
4949decode_locale_ex(PyObject *self, PyObject *args)
4950{
4951 char *str;
4952 int current_locale = 0;
4953 PyObject *res = NULL;
4954 const char *errors = NULL;
4955
4956 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
4957 return NULL;
4958 }
4959 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
4960
4961 wchar_t *wstr = NULL;
4962 size_t wlen = 0;
4963 const char *reason = NULL;
4964 int ret = _Py_DecodeLocaleEx(str,
4965 &wstr, &wlen, &reason,
4966 current_locale, error_handler);
4967
4968 switch(ret) {
4969 case 0:
4970 res = PyUnicode_FromWideChar(wstr, wlen);
4971 PyMem_RawFree(wstr);
4972 break;
4973 case -1:
4974 PyErr_NoMemory();
4975 break;
4976 case -2:
4977 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
4978 wlen, reason);
4979 break;
4980 case -3:
4981 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
4982 break;
4983 default:
4984 PyErr_SetString(PyExc_ValueError, "unknow error code");
4985 break;
4986 }
4987 return res;
4988}
4989
4990
Victor Stinner18618e652018-10-25 17:28:11 +02004991#ifdef Py_REF_DEBUG
4992static PyObject *
4993negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
4994{
4995 PyObject *obj = PyUnicode_FromString("negative_refcount");
4996 if (obj == NULL) {
4997 return NULL;
4998 }
4999 assert(Py_REFCNT(obj) == 1);
5000
5001 Py_REFCNT(obj) = 0;
5002 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5003 Py_DECREF(obj);
5004
5005 Py_RETURN_NONE;
5006}
5007#endif
5008
5009
Victor Stinneref9d9b62019-05-22 11:28:22 +02005010static PyObject*
5011test_write_unraisable_exc(PyObject *self, PyObject *args)
5012{
Victor Stinner71c52e32019-05-27 08:57:14 +02005013 PyObject *exc, *err_msg, *obj;
5014 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005015 return NULL;
5016 }
5017
Victor Stinner71c52e32019-05-27 08:57:14 +02005018 const char *err_msg_utf8;
5019 if (err_msg != Py_None) {
5020 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5021 if (err_msg_utf8 == NULL) {
5022 return NULL;
5023 }
5024 }
5025 else {
5026 err_msg_utf8 = NULL;
5027 }
5028
Victor Stinneref9d9b62019-05-22 11:28:22 +02005029 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005030 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005031 Py_RETURN_NONE;
5032}
5033
5034
Tim Peters9ea17ac2001-02-02 05:57:15 +00005035static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005036 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305037 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005038 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305039 {"test_config", test_config, METH_NOARGS},
5040 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005041 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005042 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5043 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5044 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5045 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5046 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5047 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005048 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005049 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005050 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5051 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5052 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5053 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5054 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5055 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005056 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5057 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305058 {"test_list_api", test_list_api, METH_NOARGS},
5059 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005060 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005061 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305062 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5063 {"test_long_api", test_long_api, METH_NOARGS},
5064 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5065 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5066 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5067 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005068 {"test_structseq_newtype_doesnt_leak",
5069 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305070 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5071 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5072 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5073 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
5074 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5075 {"test_k_code", test_k_code, METH_NOARGS},
5076 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005077 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305078 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005079 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305080 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305082 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5083 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5084 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005086 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005087#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005088 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005089#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005090 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005091 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03005092 {"get_args", get_args, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005093 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005094 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005095 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005096 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005097 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005098 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005099 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005100 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005101 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102 {"getargs_b", getargs_b, METH_VARARGS},
5103 {"getargs_B", getargs_B, METH_VARARGS},
5104 {"getargs_h", getargs_h, METH_VARARGS},
5105 {"getargs_H", getargs_H, METH_VARARGS},
5106 {"getargs_I", getargs_I, METH_VARARGS},
5107 {"getargs_k", getargs_k, METH_VARARGS},
5108 {"getargs_i", getargs_i, METH_VARARGS},
5109 {"getargs_l", getargs_l, METH_VARARGS},
5110 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005111 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 {"getargs_L", getargs_L, METH_VARARGS},
5113 {"getargs_K", getargs_K, METH_VARARGS},
5114 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305115 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5116 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005117 {"getargs_f", getargs_f, METH_VARARGS},
5118 {"getargs_d", getargs_d, METH_VARARGS},
5119 {"getargs_D", getargs_D, METH_VARARGS},
5120 {"getargs_S", getargs_S, METH_VARARGS},
5121 {"getargs_Y", getargs_Y, METH_VARARGS},
5122 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005123 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005124 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005125 {"getargs_s", getargs_s, METH_VARARGS},
5126 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5127 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
5128 {"getargs_z", getargs_z, METH_VARARGS},
5129 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5130 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5131 {"getargs_y", getargs_y, METH_VARARGS},
5132 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5133 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5134 {"getargs_u", getargs_u, METH_VARARGS},
5135 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5136 {"getargs_Z", getargs_Z, METH_VARARGS},
5137 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005138 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005139 {"getargs_es", getargs_es, METH_VARARGS},
5140 {"getargs_et", getargs_et, METH_VARARGS},
5141 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5142 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005144 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005146 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305147 {"test_s_code", test_s_code, METH_NOARGS},
5148 {"test_u_code", test_u_code, METH_NOARGS},
5149 {"test_Z_code", test_Z_code, METH_NOARGS},
5150 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005151 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5152 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005153 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005154 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005155 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005156 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5157 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005158 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005159 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005160 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005161#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005162 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005163#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005164 {"traceback_print", traceback_print, METH_VARARGS},
5165 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005166 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005167 {"argparsing", argparsing, METH_VARARGS},
5168 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005169 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005170 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305171 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005172 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305173 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005174 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005175 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5176 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005177 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005178 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005179 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305180 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5181 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5182 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5183 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005184 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5185 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305186 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005187 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005188 {"no_docstring",
5189 (PyCFunction)test_with_docstring, METH_NOARGS},
5190 {"docstring_empty",
5191 (PyCFunction)test_with_docstring, METH_NOARGS,
5192 docstring_empty},
5193 {"docstring_no_signature",
5194 (PyCFunction)test_with_docstring, METH_NOARGS,
5195 docstring_no_signature},
5196 {"docstring_with_invalid_signature",
5197 (PyCFunction)test_with_docstring, METH_NOARGS,
5198 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005199 {"docstring_with_invalid_signature2",
5200 (PyCFunction)test_with_docstring, METH_NOARGS,
5201 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005202 {"docstring_with_signature",
5203 (PyCFunction)test_with_docstring, METH_NOARGS,
5204 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005205 {"docstring_with_signature_but_no_doc",
5206 (PyCFunction)test_with_docstring, METH_NOARGS,
5207 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005208 {"docstring_with_signature_and_extra_newlines",
5209 (PyCFunction)test_with_docstring, METH_NOARGS,
5210 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005211 {"docstring_with_signature_with_defaults",
5212 (PyCFunction)test_with_docstring, METH_NOARGS,
5213 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005214 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5215 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005216 {"pymarshal_write_long_to_file",
5217 pymarshal_write_long_to_file, METH_VARARGS},
5218 {"pymarshal_write_object_to_file",
5219 pymarshal_write_object_to_file, METH_VARARGS},
5220 {"pymarshal_read_short_from_file",
5221 pymarshal_read_short_from_file, METH_VARARGS},
5222 {"pymarshal_read_long_from_file",
5223 pymarshal_read_long_from_file, METH_VARARGS},
5224 {"pymarshal_read_last_object_from_file",
5225 pymarshal_read_last_object_from_file, METH_VARARGS},
5226 {"pymarshal_read_object_from_file",
5227 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01005228 {"return_null_without_error",
5229 return_null_without_error, METH_NOARGS},
5230 {"return_result_with_error",
5231 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02005232 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005233 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5234 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005235 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005236#ifdef HAVE_CLOCK_GETTIME
5237 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5238#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005239 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5240 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02005241 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01005242 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5243 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005244 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005245 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner2b00db62019-04-11 11:33:27 +02005246 {"pyobject_is_freed", (PyCFunction)(void(*)(void))pyobject_is_freed, METH_O},
5247 {"pyobject_uninitialized", pyobject_uninitialized, METH_NOARGS},
5248 {"pyobject_forbidden_bytes", pyobject_forbidden_bytes, METH_NOARGS},
5249 {"pyobject_freed", pyobject_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005250 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005251 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5252 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5253 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005254 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005255 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005256 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5257 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005258 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5259 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005260 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005261#ifdef W_STOPCODE
5262 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5263#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005264 {"get_mapping_keys", get_mapping_keys, METH_O},
5265 {"get_mapping_values", get_mapping_values, METH_O},
5266 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005267 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005268 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005269 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005270 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5271 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005272#ifdef Py_REF_DEBUG
5273 {"negative_refcount", negative_refcount, METH_NOARGS},
5274#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005275 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005277};
5278
Thomas Hellera4ea6032003-04-17 18:55:45 +00005279#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5280
Thomas Wouters89f507f2006-12-13 04:49:30 +00005281typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005282 char bool_member;
5283 char byte_member;
5284 unsigned char ubyte_member;
5285 short short_member;
5286 unsigned short ushort_member;
5287 int int_member;
5288 unsigned int uint_member;
5289 long long_member;
5290 unsigned long ulong_member;
5291 Py_ssize_t pyssizet_member;
5292 float float_member;
5293 double double_member;
5294 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005295 long long longlong_member;
5296 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005297} all_structmembers;
5298
5299typedef struct {
5300 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005301 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005302} test_structmembers;
5303
5304static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005305 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5306 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5307 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5308 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5309 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5310 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5311 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5312 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5313 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5314 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5315 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5316 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5317 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5319 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005320 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005321};
5322
5323
Christian Heimes1af737c2008-01-23 08:24:23 +00005324static PyObject *
5325test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5326{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005327 static char *keywords[] = {
5328 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5329 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5330 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005331 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005332 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005333 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334 test_structmembers *ob;
5335 const char *s = NULL;
5336 Py_ssize_t string_len = 0;
5337 ob = PyObject_New(test_structmembers, type);
5338 if (ob == NULL)
5339 return NULL;
5340 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5341 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5342 &ob->structmembers.bool_member,
5343 &ob->structmembers.byte_member,
5344 &ob->structmembers.ubyte_member,
5345 &ob->structmembers.short_member,
5346 &ob->structmembers.ushort_member,
5347 &ob->structmembers.int_member,
5348 &ob->structmembers.uint_member,
5349 &ob->structmembers.long_member,
5350 &ob->structmembers.ulong_member,
5351 &ob->structmembers.pyssizet_member,
5352 &ob->structmembers.float_member,
5353 &ob->structmembers.double_member,
5354 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 , &ob->structmembers.longlong_member,
5356 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 )) {
5358 Py_DECREF(ob);
5359 return NULL;
5360 }
5361 if (s != NULL) {
5362 if (string_len > 5) {
5363 Py_DECREF(ob);
5364 PyErr_SetString(PyExc_ValueError, "string too long");
5365 return NULL;
5366 }
5367 strcpy(ob->structmembers.inplace_member, s);
5368 }
5369 else {
5370 strcpy(ob->structmembers.inplace_member, "");
5371 }
5372 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005373}
5374
Christian Heimes1af737c2008-01-23 08:24:23 +00005375static void
5376test_structmembers_free(PyObject *ob)
5377{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005378 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005379}
5380
5381static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005382 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005383 "test_structmembersType",
5384 sizeof(test_structmembers), /* tp_basicsize */
5385 0, /* tp_itemsize */
5386 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005387 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005388 0, /* tp_getattr */
5389 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005390 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005391 0, /* tp_repr */
5392 0, /* tp_as_number */
5393 0, /* tp_as_sequence */
5394 0, /* tp_as_mapping */
5395 0, /* tp_hash */
5396 0, /* tp_call */
5397 0, /* tp_str */
5398 PyObject_GenericGetAttr, /* tp_getattro */
5399 PyObject_GenericSetAttr, /* tp_setattro */
5400 0, /* tp_as_buffer */
5401 0, /* tp_flags */
5402 "Type containing all structmember types",
5403 0, /* traverseproc tp_traverse */
5404 0, /* tp_clear */
5405 0, /* tp_richcompare */
5406 0, /* tp_weaklistoffset */
5407 0, /* tp_iter */
5408 0, /* tp_iternext */
5409 0, /* tp_methods */
5410 test_members, /* tp_members */
5411 0,
5412 0,
5413 0,
5414 0,
5415 0,
5416 0,
5417 0,
5418 0,
5419 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005420};
5421
5422
Benjamin Petersond51374e2014-04-09 23:55:56 -04005423typedef struct {
5424 PyObject_HEAD
5425} matmulObject;
5426
5427static PyObject *
5428matmulType_matmul(PyObject *self, PyObject *other)
5429{
5430 return Py_BuildValue("(sOO)", "matmul", self, other);
5431}
5432
5433static PyObject *
5434matmulType_imatmul(PyObject *self, PyObject *other)
5435{
5436 return Py_BuildValue("(sOO)", "imatmul", self, other);
5437}
5438
5439static void
5440matmulType_dealloc(PyObject *self)
5441{
Zachary Ware420dc562014-04-23 13:51:27 -05005442 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005443}
5444
5445static PyNumberMethods matmulType_as_number = {
5446 0, /* nb_add */
5447 0, /* nb_subtract */
5448 0, /* nb_multiply */
5449 0, /* nb_remainde r*/
5450 0, /* nb_divmod */
5451 0, /* nb_power */
5452 0, /* nb_negative */
5453 0, /* tp_positive */
5454 0, /* tp_absolute */
5455 0, /* tp_bool */
5456 0, /* nb_invert */
5457 0, /* nb_lshift */
5458 0, /* nb_rshift */
5459 0, /* nb_and */
5460 0, /* nb_xor */
5461 0, /* nb_or */
5462 0, /* nb_int */
5463 0, /* nb_reserved */
5464 0, /* nb_float */
5465 0, /* nb_inplace_add */
5466 0, /* nb_inplace_subtract */
5467 0, /* nb_inplace_multiply */
5468 0, /* nb_inplace_remainder */
5469 0, /* nb_inplace_power */
5470 0, /* nb_inplace_lshift */
5471 0, /* nb_inplace_rshift */
5472 0, /* nb_inplace_and */
5473 0, /* nb_inplace_xor */
5474 0, /* nb_inplace_or */
5475 0, /* nb_floor_divide */
5476 0, /* nb_true_divide */
5477 0, /* nb_inplace_floor_divide */
5478 0, /* nb_inplace_true_divide */
5479 0, /* nb_index */
5480 matmulType_matmul, /* nb_matrix_multiply */
5481 matmulType_imatmul /* nb_matrix_inplace_multiply */
5482};
5483
5484static PyTypeObject matmulType = {
5485 PyVarObject_HEAD_INIT(NULL, 0)
5486 "matmulType",
5487 sizeof(matmulObject), /* tp_basicsize */
5488 0, /* tp_itemsize */
5489 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005490 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005491 0, /* tp_getattr */
5492 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005493 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005494 0, /* tp_repr */
5495 &matmulType_as_number, /* tp_as_number */
5496 0, /* tp_as_sequence */
5497 0, /* tp_as_mapping */
5498 0, /* tp_hash */
5499 0, /* tp_call */
5500 0, /* tp_str */
5501 PyObject_GenericGetAttr, /* tp_getattro */
5502 PyObject_GenericSetAttr, /* tp_setattro */
5503 0, /* tp_as_buffer */
5504 0, /* tp_flags */
5505 "C level type with matrix operations defined",
5506 0, /* traverseproc tp_traverse */
5507 0, /* tp_clear */
5508 0, /* tp_richcompare */
5509 0, /* tp_weaklistoffset */
5510 0, /* tp_iter */
5511 0, /* tp_iternext */
5512 0, /* tp_methods */
5513 0, /* tp_members */
5514 0,
5515 0,
5516 0,
5517 0,
5518 0,
5519 0,
5520 0,
5521 0,
5522 PyType_GenericNew, /* tp_new */
5523 PyObject_Del, /* tp_free */
5524};
5525
Zackery Spytzc7f803b2019-05-31 03:46:36 -06005526typedef struct {
5527 PyObject_HEAD
5528} ipowObject;
5529
5530static PyObject *
5531ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
5532{
5533 return Py_BuildValue("OO", other, mod);
5534}
5535
5536static PyNumberMethods ipowType_as_number = {
5537 .nb_inplace_power = ipowType_ipow
5538};
5539
5540static PyTypeObject ipowType = {
5541 PyVarObject_HEAD_INIT(NULL, 0)
5542 .tp_name = "ipowType",
5543 .tp_basicsize = sizeof(ipowObject),
5544 .tp_as_number = &ipowType_as_number,
5545 .tp_new = PyType_GenericNew
5546};
Martin v. Löwis1a214512008-06-11 05:26:20 +00005547
Yury Selivanov75445082015-05-11 22:57:16 -04005548typedef struct {
5549 PyObject_HEAD
5550 PyObject *ao_iterator;
5551} awaitObject;
5552
5553
5554static PyObject *
5555awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5556{
5557 PyObject *v;
5558 awaitObject *ao;
5559
5560 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
5561 return NULL;
5562
5563 ao = (awaitObject *)type->tp_alloc(type, 0);
5564 if (ao == NULL) {
5565 return NULL;
5566 }
5567
5568 Py_INCREF(v);
5569 ao->ao_iterator = v;
5570
5571 return (PyObject *)ao;
5572}
5573
5574
5575static void
5576awaitObject_dealloc(awaitObject *ao)
5577{
5578 Py_CLEAR(ao->ao_iterator);
5579 Py_TYPE(ao)->tp_free(ao);
5580}
5581
5582
5583static PyObject *
5584awaitObject_await(awaitObject *ao)
5585{
5586 Py_INCREF(ao->ao_iterator);
5587 return ao->ao_iterator;
5588}
5589
5590static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04005591 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04005592 0, /* am_aiter */
5593 0 /* am_anext */
5594};
5595
5596
5597static PyTypeObject awaitType = {
5598 PyVarObject_HEAD_INIT(NULL, 0)
5599 "awaitType",
5600 sizeof(awaitObject), /* tp_basicsize */
5601 0, /* tp_itemsize */
5602 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005603 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04005604 0, /* tp_getattr */
5605 0, /* tp_setattr */
5606 &awaitType_as_async, /* tp_as_async */
5607 0, /* tp_repr */
5608 0, /* tp_as_number */
5609 0, /* tp_as_sequence */
5610 0, /* tp_as_mapping */
5611 0, /* tp_hash */
5612 0, /* tp_call */
5613 0, /* tp_str */
5614 PyObject_GenericGetAttr, /* tp_getattro */
5615 PyObject_GenericSetAttr, /* tp_setattro */
5616 0, /* tp_as_buffer */
5617 0, /* tp_flags */
5618 "C level type with tp_as_async",
5619 0, /* traverseproc tp_traverse */
5620 0, /* tp_clear */
5621 0, /* tp_richcompare */
5622 0, /* tp_weaklistoffset */
5623 0, /* tp_iter */
5624 0, /* tp_iternext */
5625 0, /* tp_methods */
5626 0, /* tp_members */
5627 0,
5628 0,
5629 0,
5630 0,
5631 0,
5632 0,
5633 0,
5634 0,
5635 awaitObject_new, /* tp_new */
5636 PyObject_Del, /* tp_free */
5637};
5638
5639
xdegaye56d1f5c2017-10-26 15:09:06 +02005640static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
5641
5642static PyTypeObject PyRecursingInfinitelyError_Type = {
5643 PyVarObject_HEAD_INIT(NULL, 0)
5644 "RecursingInfinitelyError", /* tp_name */
5645 sizeof(PyBaseExceptionObject), /* tp_basicsize */
5646 0, /* tp_itemsize */
5647 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005648 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02005649 0, /* tp_getattr */
5650 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005651 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02005652 0, /* tp_repr */
5653 0, /* tp_as_number */
5654 0, /* tp_as_sequence */
5655 0, /* tp_as_mapping */
5656 0, /* tp_hash */
5657 0, /* tp_call */
5658 0, /* tp_str */
5659 0, /* tp_getattro */
5660 0, /* tp_setattro */
5661 0, /* tp_as_buffer */
5662 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5663 "Instantiating this exception starts infinite recursion.", /* tp_doc */
5664 0, /* tp_traverse */
5665 0, /* tp_clear */
5666 0, /* tp_richcompare */
5667 0, /* tp_weaklistoffset */
5668 0, /* tp_iter */
5669 0, /* tp_iternext */
5670 0, /* tp_methods */
5671 0, /* tp_members */
5672 0, /* tp_getset */
5673 0, /* tp_base */
5674 0, /* tp_dict */
5675 0, /* tp_descr_get */
5676 0, /* tp_descr_set */
5677 0, /* tp_dictoffset */
5678 (initproc)recurse_infinitely_error_init, /* tp_init */
5679 0, /* tp_alloc */
5680 0, /* tp_new */
5681};
5682
5683static int
5684recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
5685{
5686 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
5687
5688 /* Instantiating this exception starts infinite recursion. */
5689 Py_INCREF(type);
5690 PyErr_SetObject(type, NULL);
5691 return -1;
5692}
5693
5694
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005695/* Test bpo-35983: create a subclass of "list" which checks that instances
5696 * are not deallocated twice */
5697
5698typedef struct {
5699 PyListObject list;
5700 int deallocated;
5701} MyListObject;
5702
5703static PyObject *
5704MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5705{
5706 PyObject* op = PyList_Type.tp_new(type, args, kwds);
5707 ((MyListObject*)op)->deallocated = 0;
5708 return op;
5709}
5710
5711void
5712MyList_dealloc(MyListObject* op)
5713{
5714 if (op->deallocated) {
5715 /* We cannot raise exceptions here but we still want the testsuite
5716 * to fail when we hit this */
5717 Py_FatalError("MyList instance deallocated twice");
5718 }
5719 op->deallocated = 1;
5720 PyList_Type.tp_dealloc((PyObject *)op);
5721}
5722
5723static PyTypeObject MyList_Type = {
5724 PyVarObject_HEAD_INIT(NULL, 0)
5725 "MyList",
5726 sizeof(MyListObject),
5727 0,
5728 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005729 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005730 0, /* tp_getattr */
5731 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005732 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005733 0, /* tp_repr */
5734 0, /* tp_as_number */
5735 0, /* tp_as_sequence */
5736 0, /* tp_as_mapping */
5737 0, /* tp_hash */
5738 0, /* tp_call */
5739 0, /* tp_str */
5740 0, /* tp_getattro */
5741 0, /* tp_setattro */
5742 0, /* tp_as_buffer */
5743 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5744 0, /* tp_doc */
5745 0, /* tp_traverse */
5746 0, /* tp_clear */
5747 0, /* tp_richcompare */
5748 0, /* tp_weaklistoffset */
5749 0, /* tp_iter */
5750 0, /* tp_iternext */
5751 0, /* tp_methods */
5752 0, /* tp_members */
5753 0, /* tp_getset */
5754 0, /* &PyList_Type */ /* tp_base */
5755 0, /* tp_dict */
5756 0, /* tp_descr_get */
5757 0, /* tp_descr_set */
5758 0, /* tp_dictoffset */
5759 0, /* tp_init */
5760 0, /* tp_alloc */
5761 MyList_new, /* tp_new */
5762};
5763
5764
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005765/* Test PEP 560 */
5766
5767typedef struct {
5768 PyObject_HEAD
5769 PyObject *item;
5770} PyGenericAliasObject;
5771
5772static void
5773generic_alias_dealloc(PyGenericAliasObject *self)
5774{
5775 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01005776 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005777}
5778
5779static PyObject *
5780generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
5781{
5782 return PyTuple_Pack(1, self->item);
5783}
5784
5785static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005786 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005787 {NULL} /* sentinel */
5788};
5789
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07005790static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005791 PyVarObject_HEAD_INIT(NULL, 0)
5792 "GenericAlias",
5793 sizeof(PyGenericAliasObject),
5794 0,
5795 .tp_dealloc = (destructor)generic_alias_dealloc,
5796 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5797 .tp_methods = generic_alias_methods,
5798};
5799
5800static PyObject *
5801generic_alias_new(PyObject *item)
5802{
5803 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
5804 if (o == NULL) {
5805 return NULL;
5806 }
5807 Py_INCREF(item);
5808 o->item = item;
5809 return (PyObject*) o;
5810}
5811
5812typedef struct {
5813 PyObject_HEAD
5814} PyGenericObject;
5815
5816static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005817generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005818{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005819 return generic_alias_new(item);
5820}
5821
5822static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005823 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005824 {NULL} /* sentinel */
5825};
5826
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07005827static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005828 PyVarObject_HEAD_INIT(NULL, 0)
5829 "Generic",
5830 sizeof(PyGenericObject),
5831 0,
5832 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5833 .tp_methods = generic_methods,
5834};
5835
5836
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005837/* Test PEP 590 */
5838
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005839typedef struct {
5840 PyObject_HEAD
5841 vectorcallfunc vectorcall;
5842} MethodDescriptorObject;
5843
5844static PyObject *
5845MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
5846 size_t nargsf, PyObject *kwnames)
5847{
5848 /* True if using the vectorcall function in MethodDescriptorObject
5849 * but False for MethodDescriptor2Object */
5850 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
5851 return PyBool_FromLong(md->vectorcall != NULL);
5852}
5853
5854static PyObject *
5855MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
5856{
5857 MethodDescriptorObject *op = PyObject_New(MethodDescriptorObject, type);
5858 op->vectorcall = MethodDescriptor_vectorcall;
5859 return (PyObject *)op;
5860}
5861
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005862static PyObject *
5863func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
5864{
5865 if (obj == Py_None || obj == NULL) {
5866 Py_INCREF(func);
5867 return func;
5868 }
5869 return PyMethod_New(func, obj);
5870}
5871
5872static PyObject *
5873nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
5874{
5875 Py_INCREF(func);
5876 return func;
5877}
5878
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005879static PyObject *
5880call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
5881{
5882 Py_INCREF(args);
5883 return args;
5884}
5885
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005886static PyTypeObject MethodDescriptorBase_Type = {
5887 PyVarObject_HEAD_INIT(NULL, 0)
5888 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005889 sizeof(MethodDescriptorObject),
5890 .tp_new = MethodDescriptor_new,
5891 .tp_call = PyVectorcall_Call,
5892 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
5893 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
5894 Py_TPFLAGS_METHOD_DESCRIPTOR | _Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005895 .tp_descr_get = func_descr_get,
5896};
5897
5898static PyTypeObject MethodDescriptorDerived_Type = {
5899 PyVarObject_HEAD_INIT(NULL, 0)
5900 "MethodDescriptorDerived",
5901 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5902};
5903
5904static PyTypeObject MethodDescriptorNopGet_Type = {
5905 PyVarObject_HEAD_INIT(NULL, 0)
5906 "MethodDescriptorNopGet",
5907 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005908 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005909 .tp_descr_get = nop_descr_get,
5910};
5911
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02005912typedef struct {
5913 MethodDescriptorObject base;
5914 vectorcallfunc vectorcall;
5915} MethodDescriptor2Object;
5916
5917static PyObject *
5918MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
5919{
5920 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
5921 op->base.vectorcall = NULL;
5922 op->vectorcall = MethodDescriptor_vectorcall;
5923 return (PyObject *)op;
5924}
5925
5926static PyTypeObject MethodDescriptor2_Type = {
5927 PyVarObject_HEAD_INIT(NULL, 0)
5928 "MethodDescriptor2",
5929 sizeof(MethodDescriptor2Object),
5930 .tp_new = MethodDescriptor2_new,
5931 .tp_call = PyVectorcall_Call,
5932 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
5933 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | _Py_TPFLAGS_HAVE_VECTORCALL,
5934};
5935
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005936
Martin v. Löwis1a214512008-06-11 05:26:20 +00005937static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005938 PyModuleDef_HEAD_INIT,
5939 "_testcapi",
5940 NULL,
5941 -1,
5942 TestMethods,
5943 NULL,
5944 NULL,
5945 NULL,
5946 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005947};
5948
Nick Coghland5cacbb2015-05-23 22:24:10 +10005949/* Per PEP 489, this module will not be converted to multi-phase initialization
5950 */
5951
Mark Hammond62b1ab12002-07-23 06:31:15 +00005952PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005953PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00005954{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005955 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957 m = PyModule_Create(&_testcapimodule);
5958 if (m == NULL)
5959 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005961 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00005962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005963 Py_TYPE(&test_structmembersType)=&PyType_Type;
5964 Py_INCREF(&test_structmembersType);
5965 /* don't use a name starting with "test", since we don't want
5966 test_capi to automatically call this */
5967 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005968 if (PyType_Ready(&matmulType) < 0)
5969 return NULL;
5970 Py_INCREF(&matmulType);
5971 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06005972 if (PyType_Ready(&ipowType) < 0) {
5973 return NULL;
5974 }
5975 Py_INCREF(&ipowType);
5976 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005977
Yury Selivanov75445082015-05-11 22:57:16 -04005978 if (PyType_Ready(&awaitType) < 0)
5979 return NULL;
5980 Py_INCREF(&awaitType);
5981 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
5982
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005983 MyList_Type.tp_base = &PyList_Type;
5984 if (PyType_Ready(&MyList_Type) < 0)
5985 return NULL;
5986 Py_INCREF(&MyList_Type);
5987 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
5988
Jeroen Demeyereb65e242019-05-28 14:42:53 +02005989 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
5990 return NULL;
5991 Py_INCREF(&MethodDescriptorBase_Type);
5992 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
5993
5994 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
5995 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
5996 return NULL;
5997 Py_INCREF(&MethodDescriptorDerived_Type);
5998 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
5999
6000 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
6001 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
6002 return NULL;
6003 Py_INCREF(&MethodDescriptorNopGet_Type);
6004 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
6005
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006006 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
6007 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
6008 return NULL;
6009 Py_INCREF(&MethodDescriptor2_Type);
6010 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
6011
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006012 if (PyType_Ready(&GenericAlias_Type) < 0)
6013 return NULL;
6014 Py_INCREF(&GenericAlias_Type);
6015 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
6016
6017 if (PyType_Ready(&Generic_Type) < 0)
6018 return NULL;
6019 Py_INCREF(&Generic_Type);
6020 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
6021
xdegaye56d1f5c2017-10-26 15:09:06 +02006022 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
6023 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
6024 return NULL;
6025 }
6026 Py_INCREF(&PyRecursingInfinitelyError_Type);
6027 PyModule_AddObject(m, "RecursingInfinitelyError",
6028 (PyObject *)&PyRecursingInfinitelyError_Type);
6029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006030 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
6031 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
6032 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
6033 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
6034 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
6035 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
6036 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
6037 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
6038 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
6039 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
6040 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
6041 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
6042 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
6043 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
6044 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
6045 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
6046 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
6047 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
6048 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
6049 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
6050 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
6051 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02006052 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006053 Py_INCREF(&PyInstanceMethod_Type);
6054 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00006055
Larry Hastings2a727912014-01-16 11:32:01 -08006056 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner5d39e042017-11-29 17:20:38 +01006057#ifdef WITH_PYMALLOC
6058 PyModule_AddObject(m, "WITH_PYMALLOC", Py_True);
6059#else
6060 PyModule_AddObject(m, "WITH_PYMALLOC", Py_False);
6061#endif
Larry Hastings2a727912014-01-16 11:32:01 -08006062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006063 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
6064 Py_INCREF(TestError);
6065 PyModule_AddObject(m, "error", TestError);
6066 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006067}