blob: add642f223afdc49dbf420dd04afb8bcc3c11c2c [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
Neal Norwitz8866e0a2007-10-27 04:01:17 +00008#define PY_SSIZE_T_CLEAN
9
Tim Peters9ea17ac2001-02-02 05:57:15 +000010#include "Python.h"
Thomas Wouters89f507f2006-12-13 04:49:30 +000011#include <float.h>
12#include "structmember.h"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000013#include "datetime.h"
Serhiy Storchakab5181342015-02-06 08:58:56 +020014#include "marshal.h"
Victor Stinner56e8c292014-07-21 12:30:22 +020015#include <signal.h>
Tim Peters9ea17ac2001-02-02 05:57:15 +000016
Victor Stinner95e9cef2015-03-28 01:26:47 +010017#ifdef MS_WINDOWS
Victor Stinner09e5cf22015-03-30 00:09:18 +020018# include <winsock2.h> /* struct timeval */
Victor Stinner95e9cef2015-03-28 01:26:47 +010019#endif
20
Victor Stinner7b7c6dc2017-08-10 12:37:39 +020021#ifdef HAVE_SYS_WAIT_H
22#include <sys/wait.h> /* For W_STOPCODE */
23#endif
24
Mark Hammond8d98d2c2003-04-19 15:41:53 +000025#include "pythread.h"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000026static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000027
Tim Peters91621db2001-06-12 20:10:01 +000028/* Raise TestError with test_name + ": " + msg, and return NULL. */
29
30static PyObject *
31raiseTestError(const char* test_name, const char* msg)
32{
Victor Stinner6ced7c42011-03-21 18:15:42 +010033 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000034 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000035}
36
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000037/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000038
39 The ones derived from autoconf on the UNIX-like OSes can be relied
40 upon (in the absence of sloppy cross-compiling), but the Windows
41 platforms have these hardcoded. Better safe than sorry.
42*/
43static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000044sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000046{
Victor Stinner499dfcf2011-03-21 13:26:24 +010047 PyErr_Format(TestError,
48 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000051}
52
53static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053054test_config(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters9ea17ac2001-02-02 05:57:15 +000055{
Tim Peters9ea17ac2001-02-02 05:57:15 +000056#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 if (FATNAME != sizeof(TYPE)) \
58 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 CHECK_SIZEOF(SIZEOF_SHORT, short);
61 CHECK_SIZEOF(SIZEOF_INT, int);
62 CHECK_SIZEOF(SIZEOF_LONG, long);
63 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
64 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Benjamin Petersonaf580df2016-09-06 10:46:49 -070065 CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
Tim Peters9ea17ac2001-02-02 05:57:15 +000066
67#undef CHECK_SIZEOF
68
Serhiy Storchaka228b12e2017-01-23 09:47:21 +020069 Py_RETURN_NONE;
Tim Peters9ea17ac2001-02-02 05:57:15 +000070}
71
Tim Peters5c4d5bf2001-02-12 22:13:26 +000072static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053073test_sizeof_c_types(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner01076552013-10-29 19:39:52 +010074{
Ned Deilye37a1942015-03-05 15:47:10 -080075#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020076#pragma GCC diagnostic push
77#pragma GCC diagnostic ignored "-Wtype-limits"
78#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010079#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010080 if (EXPECTED != sizeof(TYPE)) { \
81 PyErr_Format(TestError, \
82 "sizeof(%s) = %u instead of %u", \
83 #TYPE, sizeof(TYPE), EXPECTED); \
84 return (PyObject*)NULL; \
85 }
Victor Stinnerf866f972013-10-29 19:59:31 +010086#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
87#define CHECK_SIGNNESS(TYPE, SIGNED) \
88 if (IS_SIGNED(TYPE) != SIGNED) { \
89 PyErr_Format(TestError, \
90 "%s signness is, instead of %i", \
91 #TYPE, IS_SIGNED(TYPE), SIGNED); \
92 return (PyObject*)NULL; \
93 }
Victor Stinner01076552013-10-29 19:39:52 +010094
95 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +010096 CHECK_SIZEOF(Py_UCS1, 1);
97 CHECK_SIZEOF(Py_UCS2, 2);
98 CHECK_SIZEOF(Py_UCS4, 4);
99 CHECK_SIGNNESS(Py_UCS1, 0);
100 CHECK_SIGNNESS(Py_UCS2, 0);
101 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700102 CHECK_SIZEOF(int32_t, 4);
103 CHECK_SIGNNESS(int32_t, 1);
104 CHECK_SIZEOF(uint32_t, 4);
105 CHECK_SIGNNESS(uint32_t, 0);
106 CHECK_SIZEOF(int64_t, 8);
107 CHECK_SIGNNESS(int64_t, 1);
108 CHECK_SIZEOF(uint64_t, 8);
109 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100110
111 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100112 CHECK_SIZEOF(size_t, sizeof(void *));
113 CHECK_SIGNNESS(size_t, 0);
114 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
115 CHECK_SIGNNESS(Py_ssize_t, 1);
116
Benjamin Petersonca470632016-09-06 13:47:26 -0700117 CHECK_SIZEOF(uintptr_t, sizeof(void *));
118 CHECK_SIGNNESS(uintptr_t, 0);
119 CHECK_SIZEOF(intptr_t, sizeof(void *));
120 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100121
Serhiy Storchakad1302c02017-01-23 10:23:58 +0200122 Py_RETURN_NONE;
Victor Stinner01076552013-10-29 19:39:52 +0100123
Victor Stinnerf866f972013-10-29 19:59:31 +0100124#undef IS_SIGNED
125#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100126#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800127#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200128#pragma GCC diagnostic pop
129#endif
Victor Stinner01076552013-10-29 19:39:52 +0100130}
131
132
133static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530134test_list_api(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 PyObject* list;
137 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000140#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 list = PyList_New(NLIST);
142 if (list == (PyObject*)NULL)
143 return (PyObject*)NULL;
144 /* list = range(NLIST) */
145 for (i = 0; i < NLIST; ++i) {
146 PyObject* anint = PyLong_FromLong(i);
147 if (anint == (PyObject*)NULL) {
148 Py_DECREF(list);
149 return (PyObject*)NULL;
150 }
151 PyList_SET_ITEM(list, i, anint);
152 }
153 /* list.reverse(), via PyList_Reverse() */
154 i = PyList_Reverse(list); /* should not blow up! */
155 if (i != 0) {
156 Py_DECREF(list);
157 return (PyObject*)NULL;
158 }
159 /* Check that list == range(29, -1, -1) now */
160 for (i = 0; i < NLIST; ++i) {
161 PyObject* anint = PyList_GET_ITEM(list, i);
162 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
163 PyErr_SetString(TestError,
164 "test_list_api: reverse screwed up");
165 Py_DECREF(list);
166 return (PyObject*)NULL;
167 }
168 }
169 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000170#undef NLIST
171
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200172 Py_RETURN_NONE;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000173}
174
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000175static int
176test_dict_inner(int count)
177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 Py_ssize_t pos = 0, iterations = 0;
179 int i;
180 PyObject *dict = PyDict_New();
181 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 if (dict == NULL)
184 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 for (i = 0; i < count; i++) {
187 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200188 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200189 return -1;
190 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200191 if (PyDict_SetItem(dict, v, v) < 0) {
192 Py_DECREF(v);
193 return -1;
194 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 Py_DECREF(v);
196 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000198 while (PyDict_Next(dict, &pos, &k, &v)) {
199 PyObject *o;
200 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 i = PyLong_AS_LONG(v) + 1;
203 o = PyLong_FromLong(i);
204 if (o == NULL)
205 return -1;
206 if (PyDict_SetItem(dict, k, o) < 0) {
207 Py_DECREF(o);
208 return -1;
209 }
210 Py_DECREF(o);
211 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 if (iterations != count) {
216 PyErr_SetString(
217 TestError,
218 "test_dict_iteration: dict iteration went wrong ");
219 return -1;
220 } else {
221 return 0;
222 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000223}
224
225static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530226test_dict_iteration(PyObject* self, PyObject *Py_UNUSED(ignored))
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 for (i = 0; i < 200; i++) {
231 if (test_dict_inner(i) < 0) {
232 return NULL;
233 }
234 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000235
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200236 Py_RETURN_NONE;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000237}
238
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200239static PyObject*
240dict_getitem_knownhash(PyObject *self, PyObject *args)
241{
242 PyObject *mp, *key, *result;
243 Py_ssize_t hash;
244
245 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
246 &mp, &key, &hash)) {
247 return NULL;
248 }
249
250 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
251 if (result == NULL && !PyErr_Occurred()) {
252 _PyErr_SetKeyError(key);
253 return NULL;
254 }
255
256 Py_XINCREF(result);
257 return result;
258}
Tim Peters91621db2001-06-12 20:10:01 +0000259
Victor Stinner3d3f2642016-12-15 17:21:23 +0100260static PyObject*
261dict_hassplittable(PyObject *self, PyObject *arg)
262{
263 if (!PyDict_Check(arg)) {
264 PyErr_Format(PyExc_TypeError,
265 "dict_hassplittable() argument must be dict, not '%s'",
266 arg->ob_type->tp_name);
267 return NULL;
268 }
269
270 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
271}
272
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000273/* Issue #4701: Check that PyObject_Hash implicitly calls
274 * PyType_Ready if it hasn't already been called
275 */
276static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 PyVarObject_HEAD_INIT(NULL, 0)
278 "hashinheritancetester", /* Name of this type */
279 sizeof(PyObject), /* Basic object size */
280 0, /* Item size for varobject */
281 (destructor)PyObject_Del, /* tp_dealloc */
282 0, /* tp_print */
283 0, /* tp_getattr */
284 0, /* tp_setattr */
285 0, /* tp_reserved */
286 0, /* tp_repr */
287 0, /* tp_as_number */
288 0, /* tp_as_sequence */
289 0, /* tp_as_mapping */
290 0, /* tp_hash */
291 0, /* tp_call */
292 0, /* tp_str */
293 PyObject_GenericGetAttr, /* tp_getattro */
294 0, /* tp_setattro */
295 0, /* tp_as_buffer */
296 Py_TPFLAGS_DEFAULT, /* tp_flags */
297 0, /* tp_doc */
298 0, /* tp_traverse */
299 0, /* tp_clear */
300 0, /* tp_richcompare */
301 0, /* tp_weaklistoffset */
302 0, /* tp_iter */
303 0, /* tp_iternext */
304 0, /* tp_methods */
305 0, /* tp_members */
306 0, /* tp_getset */
307 0, /* tp_base */
308 0, /* tp_dict */
309 0, /* tp_descr_get */
310 0, /* tp_descr_set */
311 0, /* tp_dictoffset */
312 0, /* tp_init */
313 0, /* tp_alloc */
314 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000315};
316
317static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530318test_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 PyTypeObject *type;
321 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000322 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 if (type->tp_dict != NULL)
327 /* The type has already been initialized. This probably means
328 -R is being used. */
329 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000330
331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 obj = PyObject_New(PyObject, type);
333 if (obj == NULL) {
334 PyErr_Clear();
335 PyErr_SetString(
336 TestError,
337 "test_lazy_hash_inheritance: failed to create object");
338 return NULL;
339 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 if (type->tp_dict != NULL) {
342 PyErr_SetString(
343 TestError,
344 "test_lazy_hash_inheritance: type initialised too soon");
345 Py_DECREF(obj);
346 return NULL;
347 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 hash = PyObject_Hash(obj);
350 if ((hash == -1) && PyErr_Occurred()) {
351 PyErr_Clear();
352 PyErr_SetString(
353 TestError,
354 "test_lazy_hash_inheritance: could not hash object");
355 Py_DECREF(obj);
356 return NULL;
357 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 if (type->tp_dict == NULL) {
360 PyErr_SetString(
361 TestError,
362 "test_lazy_hash_inheritance: type not initialised by hash()");
363 Py_DECREF(obj);
364 return NULL;
365 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 if (type->tp_hash != PyType_Type.tp_hash) {
368 PyErr_SetString(
369 TestError,
370 "test_lazy_hash_inheritance: unexpected hash function");
371 Py_DECREF(obj);
372 return NULL;
373 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000378}
379
380
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700381/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000382 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000383
384 Note that the meat of the test is contained in testcapi_long.h.
385 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700386 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000387 dependence on type names makes it impossible to use a parameterized
388 function. A giant macro would be even worse than this. A C++ template
389 would be perfect.
390
391 The "report an error" functions are deliberately not part of the #include
392 file: if the test fails, you can set a breakpoint in the appropriate
393 error function directly, and crawl back from there in the debugger.
394*/
395
396#define UNBIND(X) Py_DECREF(X); (X) = NULL
397
398static PyObject *
399raise_test_long_error(const char* msg)
400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000402}
403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404#define TESTNAME test_long_api_inner
405#define TYPENAME long
406#define F_S_TO_PY PyLong_FromLong
407#define F_PY_TO_S PyLong_AsLong
408#define F_U_TO_PY PyLong_FromUnsignedLong
409#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000410
411#include "testcapi_long.h"
412
413static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530414test_long_api(PyObject* self, PyObject *Py_UNUSED(ignored))
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000417}
418
419#undef TESTNAME
420#undef TYPENAME
421#undef F_S_TO_PY
422#undef F_PY_TO_S
423#undef F_U_TO_PY
424#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000425
Tim Peters91621db2001-06-12 20:10:01 +0000426static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000427raise_test_longlong_error(const char* msg)
428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000430}
431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700433#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434#define F_S_TO_PY PyLong_FromLongLong
435#define F_PY_TO_S PyLong_AsLongLong
436#define F_U_TO_PY PyLong_FromUnsignedLongLong
437#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000438
439#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000440
441static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000442test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000445}
446
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000447#undef TESTNAME
448#undef TYPENAME
449#undef F_S_TO_PY
450#undef F_PY_TO_S
451#undef F_U_TO_PY
452#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000453
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000454/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
455 is tested by test_long_api_inner. This test will concentrate on proper
456 handling of overflow.
457*/
458
459static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530460test_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 PyObject *num, *one, *temp;
463 long value;
464 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 /* Test that overflow is set properly for a large value. */
467 /* num is a number larger than LONG_MAX even on 64-bit platforms */
468 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
469 if (num == NULL)
470 return NULL;
471 overflow = 1234;
472 value = PyLong_AsLongAndOverflow(num, &overflow);
473 Py_DECREF(num);
474 if (value == -1 && PyErr_Occurred())
475 return NULL;
476 if (value != -1)
477 return raiseTestError("test_long_and_overflow",
478 "return value was not set to -1");
479 if (overflow != 1)
480 return raiseTestError("test_long_and_overflow",
481 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 /* Same again, with num = LONG_MAX + 1 */
484 num = PyLong_FromLong(LONG_MAX);
485 if (num == NULL)
486 return NULL;
487 one = PyLong_FromLong(1L);
488 if (one == NULL) {
489 Py_DECREF(num);
490 return NULL;
491 }
492 temp = PyNumber_Add(num, one);
493 Py_DECREF(one);
494 Py_DECREF(num);
495 num = temp;
496 if (num == NULL)
497 return NULL;
498 overflow = 0;
499 value = PyLong_AsLongAndOverflow(num, &overflow);
500 Py_DECREF(num);
501 if (value == -1 && PyErr_Occurred())
502 return NULL;
503 if (value != -1)
504 return raiseTestError("test_long_and_overflow",
505 "return value was not set to -1");
506 if (overflow != 1)
507 return raiseTestError("test_long_and_overflow",
508 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 /* Test that overflow is set properly for a large negative value. */
511 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
512 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
513 if (num == NULL)
514 return NULL;
515 overflow = 1234;
516 value = PyLong_AsLongAndOverflow(num, &overflow);
517 Py_DECREF(num);
518 if (value == -1 && PyErr_Occurred())
519 return NULL;
520 if (value != -1)
521 return raiseTestError("test_long_and_overflow",
522 "return value was not set to -1");
523 if (overflow != -1)
524 return raiseTestError("test_long_and_overflow",
525 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 /* Same again, with num = LONG_MIN - 1 */
528 num = PyLong_FromLong(LONG_MIN);
529 if (num == NULL)
530 return NULL;
531 one = PyLong_FromLong(1L);
532 if (one == NULL) {
533 Py_DECREF(num);
534 return NULL;
535 }
536 temp = PyNumber_Subtract(num, one);
537 Py_DECREF(one);
538 Py_DECREF(num);
539 num = temp;
540 if (num == NULL)
541 return NULL;
542 overflow = 0;
543 value = PyLong_AsLongAndOverflow(num, &overflow);
544 Py_DECREF(num);
545 if (value == -1 && PyErr_Occurred())
546 return NULL;
547 if (value != -1)
548 return raiseTestError("test_long_and_overflow",
549 "return value was not set to -1");
550 if (overflow != -1)
551 return raiseTestError("test_long_and_overflow",
552 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 /* Test that overflow is cleared properly for small values. */
555 num = PyLong_FromString("FF", NULL, 16);
556 if (num == NULL)
557 return NULL;
558 overflow = 1234;
559 value = PyLong_AsLongAndOverflow(num, &overflow);
560 Py_DECREF(num);
561 if (value == -1 && PyErr_Occurred())
562 return NULL;
563 if (value != 0xFF)
564 return raiseTestError("test_long_and_overflow",
565 "expected return value 0xFF");
566 if (overflow != 0)
567 return raiseTestError("test_long_and_overflow",
568 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 num = PyLong_FromString("-FF", NULL, 16);
571 if (num == NULL)
572 return NULL;
573 overflow = 0;
574 value = PyLong_AsLongAndOverflow(num, &overflow);
575 Py_DECREF(num);
576 if (value == -1 && PyErr_Occurred())
577 return NULL;
578 if (value != -0xFF)
579 return raiseTestError("test_long_and_overflow",
580 "expected return value 0xFF");
581 if (overflow != 0)
582 return raiseTestError("test_long_and_overflow",
583 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 num = PyLong_FromLong(LONG_MAX);
586 if (num == NULL)
587 return NULL;
588 overflow = 1234;
589 value = PyLong_AsLongAndOverflow(num, &overflow);
590 Py_DECREF(num);
591 if (value == -1 && PyErr_Occurred())
592 return NULL;
593 if (value != LONG_MAX)
594 return raiseTestError("test_long_and_overflow",
595 "expected return value LONG_MAX");
596 if (overflow != 0)
597 return raiseTestError("test_long_and_overflow",
598 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 num = PyLong_FromLong(LONG_MIN);
601 if (num == NULL)
602 return NULL;
603 overflow = 0;
604 value = PyLong_AsLongAndOverflow(num, &overflow);
605 Py_DECREF(num);
606 if (value == -1 && PyErr_Occurred())
607 return NULL;
608 if (value != LONG_MIN)
609 return raiseTestError("test_long_and_overflow",
610 "expected return value LONG_MIN");
611 if (overflow != 0)
612 return raiseTestError("test_long_and_overflow",
613 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000614
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200615 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000616}
617
Mark Dickinson93f562c2010-01-30 10:30:15 +0000618/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700619 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000620 concentrate on proper handling of overflow.
621*/
622
623static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530624test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson93f562c2010-01-30 10:30:15 +0000625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700627 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 /* Test that overflow is set properly for a large value. */
631 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
632 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
633 if (num == NULL)
634 return NULL;
635 overflow = 1234;
636 value = PyLong_AsLongLongAndOverflow(num, &overflow);
637 Py_DECREF(num);
638 if (value == -1 && PyErr_Occurred())
639 return NULL;
640 if (value != -1)
641 return raiseTestError("test_long_long_and_overflow",
642 "return value was not set to -1");
643 if (overflow != 1)
644 return raiseTestError("test_long_long_and_overflow",
645 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 /* Same again, with num = PY_LLONG_MAX + 1 */
648 num = PyLong_FromLongLong(PY_LLONG_MAX);
649 if (num == NULL)
650 return NULL;
651 one = PyLong_FromLong(1L);
652 if (one == NULL) {
653 Py_DECREF(num);
654 return NULL;
655 }
656 temp = PyNumber_Add(num, one);
657 Py_DECREF(one);
658 Py_DECREF(num);
659 num = temp;
660 if (num == NULL)
661 return NULL;
662 overflow = 0;
663 value = PyLong_AsLongLongAndOverflow(num, &overflow);
664 Py_DECREF(num);
665 if (value == -1 && PyErr_Occurred())
666 return NULL;
667 if (value != -1)
668 return raiseTestError("test_long_long_and_overflow",
669 "return value was not set to -1");
670 if (overflow != 1)
671 return raiseTestError("test_long_long_and_overflow",
672 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 /* Test that overflow is set properly for a large negative value. */
675 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
676 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
677 if (num == NULL)
678 return NULL;
679 overflow = 1234;
680 value = PyLong_AsLongLongAndOverflow(num, &overflow);
681 Py_DECREF(num);
682 if (value == -1 && PyErr_Occurred())
683 return NULL;
684 if (value != -1)
685 return raiseTestError("test_long_long_and_overflow",
686 "return value was not set to -1");
687 if (overflow != -1)
688 return raiseTestError("test_long_long_and_overflow",
689 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 /* Same again, with num = PY_LLONG_MIN - 1 */
692 num = PyLong_FromLongLong(PY_LLONG_MIN);
693 if (num == NULL)
694 return NULL;
695 one = PyLong_FromLong(1L);
696 if (one == NULL) {
697 Py_DECREF(num);
698 return NULL;
699 }
700 temp = PyNumber_Subtract(num, one);
701 Py_DECREF(one);
702 Py_DECREF(num);
703 num = temp;
704 if (num == NULL)
705 return NULL;
706 overflow = 0;
707 value = PyLong_AsLongLongAndOverflow(num, &overflow);
708 Py_DECREF(num);
709 if (value == -1 && PyErr_Occurred())
710 return NULL;
711 if (value != -1)
712 return raiseTestError("test_long_long_and_overflow",
713 "return value was not set to -1");
714 if (overflow != -1)
715 return raiseTestError("test_long_long_and_overflow",
716 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 /* Test that overflow is cleared properly for small values. */
719 num = PyLong_FromString("FF", NULL, 16);
720 if (num == NULL)
721 return NULL;
722 overflow = 1234;
723 value = PyLong_AsLongLongAndOverflow(num, &overflow);
724 Py_DECREF(num);
725 if (value == -1 && PyErr_Occurred())
726 return NULL;
727 if (value != 0xFF)
728 return raiseTestError("test_long_long_and_overflow",
729 "expected return value 0xFF");
730 if (overflow != 0)
731 return raiseTestError("test_long_long_and_overflow",
732 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 num = PyLong_FromString("-FF", NULL, 16);
735 if (num == NULL)
736 return NULL;
737 overflow = 0;
738 value = PyLong_AsLongLongAndOverflow(num, &overflow);
739 Py_DECREF(num);
740 if (value == -1 && PyErr_Occurred())
741 return NULL;
742 if (value != -0xFF)
743 return raiseTestError("test_long_long_and_overflow",
744 "expected return value 0xFF");
745 if (overflow != 0)
746 return raiseTestError("test_long_long_and_overflow",
747 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 num = PyLong_FromLongLong(PY_LLONG_MAX);
750 if (num == NULL)
751 return NULL;
752 overflow = 1234;
753 value = PyLong_AsLongLongAndOverflow(num, &overflow);
754 Py_DECREF(num);
755 if (value == -1 && PyErr_Occurred())
756 return NULL;
757 if (value != PY_LLONG_MAX)
758 return raiseTestError("test_long_long_and_overflow",
759 "expected return value PY_LLONG_MAX");
760 if (overflow != 0)
761 return raiseTestError("test_long_long_and_overflow",
762 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 num = PyLong_FromLongLong(PY_LLONG_MIN);
765 if (num == NULL)
766 return NULL;
767 overflow = 0;
768 value = PyLong_AsLongLongAndOverflow(num, &overflow);
769 Py_DECREF(num);
770 if (value == -1 && PyErr_Occurred())
771 return NULL;
772 if (value != PY_LLONG_MIN)
773 return raiseTestError("test_long_long_and_overflow",
774 "expected return value PY_LLONG_MIN");
775 if (overflow != 0)
776 return raiseTestError("test_long_long_and_overflow",
777 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000778
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200779 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000780}
781
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200782/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
783 non-integer arguments are handled correctly. It should be extended to
784 test overflow handling.
785 */
786
787static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530788test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200789{
790 size_t out_u;
791 Py_ssize_t out_s;
792
793 Py_INCREF(Py_None);
794
795 out_u = PyLong_AsSize_t(Py_None);
796 if (out_u != (size_t)-1 || !PyErr_Occurred())
797 return raiseTestError("test_long_as_size_t",
798 "PyLong_AsSize_t(None) didn't complain");
799 if (!PyErr_ExceptionMatches(PyExc_TypeError))
800 return raiseTestError("test_long_as_size_t",
801 "PyLong_AsSize_t(None) raised "
802 "something other than TypeError");
803 PyErr_Clear();
804
805 out_s = PyLong_AsSsize_t(Py_None);
806 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
807 return raiseTestError("test_long_as_size_t",
808 "PyLong_AsSsize_t(None) didn't complain");
809 if (!PyErr_ExceptionMatches(PyExc_TypeError))
810 return raiseTestError("test_long_as_size_t",
811 "PyLong_AsSsize_t(None) raised "
812 "something other than TypeError");
813 PyErr_Clear();
814
815 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
816 return Py_None;
817}
818
819/* Test the PyLong_AsDouble API. At present this just tests that
820 non-integer arguments are handled correctly.
821 */
822
823static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530824test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200825{
826 double out;
827
828 Py_INCREF(Py_None);
829
830 out = PyLong_AsDouble(Py_None);
831 if (out != -1.0 || !PyErr_Occurred())
832 return raiseTestError("test_long_as_double",
833 "PyLong_AsDouble(None) didn't complain");
834 if (!PyErr_ExceptionMatches(PyExc_TypeError))
835 return raiseTestError("test_long_as_double",
836 "PyLong_AsDouble(None) raised "
837 "something other than TypeError");
838 PyErr_Clear();
839
840 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
841 return Py_None;
842}
843
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700844/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000845 for both long and int arguments. The test may leak a little memory if
846 it fails.
847*/
848static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530849test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersd38b1c72001-09-30 05:09:37 +0000850{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700852 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 tuple = PyTuple_New(1);
855 if (tuple == NULL)
856 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 num = PyLong_FromLong(42);
859 if (num == NULL)
860 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300865 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300867 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 if (value != 42)
869 return raiseTestError("test_L_code",
870 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 Py_DECREF(num);
873 num = PyLong_FromLong(42);
874 if (num == NULL)
875 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300880 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300882 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 if (value != 42)
884 return raiseTestError("test_L_code",
885 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200888 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000889}
890
Serhiy Storchakace412872016-05-08 23:36:44 +0300891static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300892return_none(void *unused)
893{
894 Py_RETURN_NONE;
895}
896
897static PyObject *
898raise_error(void *unused)
899{
900 PyErr_SetNone(PyExc_ValueError);
901 return NULL;
902}
903
904static int
905test_buildvalue_N_error(const char *fmt)
906{
907 PyObject *arg, *res;
908
909 arg = PyList_New(0);
910 if (arg == NULL) {
911 return -1;
912 }
913
914 Py_INCREF(arg);
915 res = Py_BuildValue(fmt, return_none, NULL, arg);
916 if (res == NULL) {
917 return -1;
918 }
919 Py_DECREF(res);
920 if (Py_REFCNT(arg) != 1) {
921 PyErr_Format(TestError, "test_buildvalue_N: "
922 "arg was not decrefed in successful "
923 "Py_BuildValue(\"%s\")", fmt);
924 return -1;
925 }
926
927 Py_INCREF(arg);
928 res = Py_BuildValue(fmt, raise_error, NULL, arg);
929 if (res != NULL || !PyErr_Occurred()) {
930 PyErr_Format(TestError, "test_buildvalue_N: "
931 "Py_BuildValue(\"%s\") didn't complain", fmt);
932 return -1;
933 }
934 PyErr_Clear();
935 if (Py_REFCNT(arg) != 1) {
936 PyErr_Format(TestError, "test_buildvalue_N: "
937 "arg was not decrefed in failed "
938 "Py_BuildValue(\"%s\")", fmt);
939 return -1;
940 }
941 Py_DECREF(arg);
942 return 0;
943}
944
945static PyObject *
946test_buildvalue_N(PyObject *self, PyObject *noargs)
947{
948 PyObject *arg, *res;
949
950 arg = PyList_New(0);
951 if (arg == NULL) {
952 return NULL;
953 }
954 Py_INCREF(arg);
955 res = Py_BuildValue("N", arg);
956 if (res == NULL) {
957 return NULL;
958 }
959 if (res != arg) {
960 return raiseTestError("test_buildvalue_N",
961 "Py_BuildValue(\"N\") returned wrong result");
962 }
963 if (Py_REFCNT(arg) != 2) {
964 return raiseTestError("test_buildvalue_N",
965 "arg was not decrefed in Py_BuildValue(\"N\")");
966 }
967 Py_DECREF(res);
968 Py_DECREF(arg);
969
970 if (test_buildvalue_N_error("O&N") < 0)
971 return NULL;
972 if (test_buildvalue_N_error("(O&N)") < 0)
973 return NULL;
974 if (test_buildvalue_N_error("[O&N]") < 0)
975 return NULL;
976 if (test_buildvalue_N_error("{O&N}") < 0)
977 return NULL;
978 if (test_buildvalue_N_error("{()O&(())N}") < 0)
979 return NULL;
980
981 Py_RETURN_NONE;
982}
983
984
985static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +0300986get_args(PyObject *self, PyObject *args)
987{
988 if (args == NULL) {
989 args = Py_None;
990 }
991 Py_INCREF(args);
992 return args;
993}
994
995static PyObject *
996get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
997{
998 if (kwargs == NULL) {
999 kwargs = Py_None;
1000 }
1001 Py_INCREF(kwargs);
1002 return kwargs;
1003}
1004
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001005/* Test tuple argument processing */
1006static PyObject *
1007getargs_tuple(PyObject *self, PyObject *args)
1008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 int a, b, c;
1010 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1011 return NULL;
1012 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001013}
1014
Christian Heimes380f7f22008-02-28 11:19:05 +00001015/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001016static PyObject *
1017getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001020 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1024 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1025 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1026 return NULL;
1027 return Py_BuildValue("iiiiiiiiii",
1028 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1029 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001030}
1031
Larry Hastings83a9f482012-03-20 20:06:16 +00001032/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1033static PyObject *
1034getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1035{
1036 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1037 int required = -1;
1038 int optional = -1;
1039 int keyword_only = -1;
1040
1041 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1042 &required, &optional, &keyword_only))
1043 return NULL;
1044 return Py_BuildValue("iii", required, optional, keyword_only);
1045}
1046
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001047/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1048static PyObject *
1049getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1050{
1051 static char *keywords[] = {"", "", "keyword", NULL};
1052 int required = -1;
1053 int optional = -1;
1054 int keyword = -1;
1055
1056 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1057 &required, &optional, &keyword))
1058 return NULL;
1059 return Py_BuildValue("iii", required, optional, keyword);
1060}
1061
Thomas Heller3457e4b2003-04-24 16:14:27 +00001062/* Functions to call PyArg_ParseTuple with integer format codes,
1063 and return the result.
1064*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001065static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001066getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001067{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 unsigned char value;
1069 if (!PyArg_ParseTuple(args, "b", &value))
1070 return NULL;
1071 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001072}
1073
Thomas Heller3457e4b2003-04-24 16:14:27 +00001074static PyObject *
1075getargs_B(PyObject *self, PyObject *args)
1076{
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 Heller3457e4b2003-04-24 16:14:27 +00001081}
1082
1083static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001084getargs_h(PyObject *self, PyObject *args)
1085{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 short value;
1087 if (!PyArg_ParseTuple(args, "h", &value))
1088 return NULL;
1089 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001090}
1091
1092static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001093getargs_H(PyObject *self, PyObject *args)
1094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 unsigned short value;
1096 if (!PyArg_ParseTuple(args, "H", &value))
1097 return NULL;
1098 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001099}
1100
1101static PyObject *
1102getargs_I(PyObject *self, PyObject *args)
1103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 unsigned int value;
1105 if (!PyArg_ParseTuple(args, "I", &value))
1106 return NULL;
1107 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001108}
1109
1110static PyObject *
1111getargs_k(PyObject *self, PyObject *args)
1112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 unsigned long value;
1114 if (!PyArg_ParseTuple(args, "k", &value))
1115 return NULL;
1116 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001117}
1118
1119static PyObject *
1120getargs_i(PyObject *self, PyObject *args)
1121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 int value;
1123 if (!PyArg_ParseTuple(args, "i", &value))
1124 return NULL;
1125 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001126}
1127
Thomas Hellera4ea6032003-04-17 18:55:45 +00001128static PyObject *
1129getargs_l(PyObject *self, PyObject *args)
1130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 long value;
1132 if (!PyArg_ParseTuple(args, "l", &value))
1133 return NULL;
1134 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001135}
1136
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001137static PyObject *
1138getargs_n(PyObject *self, PyObject *args)
1139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 Py_ssize_t value;
1141 if (!PyArg_ParseTuple(args, "n", &value))
1142 return NULL;
1143 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001144}
1145
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001146static PyObject *
1147getargs_p(PyObject *self, PyObject *args)
1148{
1149 int value;
1150 if (!PyArg_ParseTuple(args, "p", &value))
1151 return NULL;
1152 return PyLong_FromLong(value);
1153}
1154
Thomas Hellera4ea6032003-04-17 18:55:45 +00001155static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001156getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001157{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001158 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 if (!PyArg_ParseTuple(args, "L", &value))
1160 return NULL;
1161 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001162}
1163
Thomas Hellera4ea6032003-04-17 18:55:45 +00001164static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001165getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001166{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001167 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 if (!PyArg_ParseTuple(args, "K", &value))
1169 return NULL;
1170 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001171}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001172
1173/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001174 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001175static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301176test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 PyObject *tuple, *num;
1179 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 tuple = PyTuple_New(1);
1182 if (tuple == NULL)
1183 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 /* a number larger than ULONG_MAX even on 64-bit platforms */
1186 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1187 if (num == NULL)
1188 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 value = PyLong_AsUnsignedLongMask(num);
1191 if (value != ULONG_MAX)
1192 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001193 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001198 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001200 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 if (value != ULONG_MAX)
1202 return raiseTestError("test_k_code",
1203 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 Py_DECREF(num);
1206 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1207 if (num == NULL)
1208 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 value = PyLong_AsUnsignedLongMask(num);
1211 if (value != (unsigned long)-0x42)
1212 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001213 "PyLong_AsUnsignedLongMask() returned wrong "
1214 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001219 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001221 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 if (value != (unsigned long)-0x42)
1223 return raiseTestError("test_k_code",
1224 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001227 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001228}
1229
Victor Stinner06e49dd2010-06-13 18:21:50 +00001230static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001231getargs_f(PyObject *self, PyObject *args)
1232{
1233 float f;
1234 if (!PyArg_ParseTuple(args, "f", &f))
1235 return NULL;
1236 return PyFloat_FromDouble(f);
1237}
1238
1239static PyObject *
1240getargs_d(PyObject *self, PyObject *args)
1241{
1242 double d;
1243 if (!PyArg_ParseTuple(args, "d", &d))
1244 return NULL;
1245 return PyFloat_FromDouble(d);
1246}
1247
1248static PyObject *
1249getargs_D(PyObject *self, PyObject *args)
1250{
1251 Py_complex cval;
1252 if (!PyArg_ParseTuple(args, "D", &cval))
1253 return NULL;
1254 return PyComplex_FromCComplex(cval);
1255}
1256
1257static PyObject *
1258getargs_S(PyObject *self, PyObject *args)
1259{
1260 PyObject *obj;
1261 if (!PyArg_ParseTuple(args, "S", &obj))
1262 return NULL;
1263 Py_INCREF(obj);
1264 return obj;
1265}
1266
1267static PyObject *
1268getargs_Y(PyObject *self, PyObject *args)
1269{
1270 PyObject *obj;
1271 if (!PyArg_ParseTuple(args, "Y", &obj))
1272 return NULL;
1273 Py_INCREF(obj);
1274 return obj;
1275}
1276
1277static PyObject *
1278getargs_U(PyObject *self, PyObject *args)
1279{
1280 PyObject *obj;
1281 if (!PyArg_ParseTuple(args, "U", &obj))
1282 return NULL;
1283 Py_INCREF(obj);
1284 return obj;
1285}
1286
1287static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001288getargs_c(PyObject *self, PyObject *args)
1289{
1290 char c;
1291 if (!PyArg_ParseTuple(args, "c", &c))
1292 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001293 return PyLong_FromLong((unsigned char)c);
1294}
1295
1296static PyObject *
1297getargs_C(PyObject *self, PyObject *args)
1298{
1299 int c;
1300 if (!PyArg_ParseTuple(args, "C", &c))
1301 return NULL;
1302 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001303}
1304
1305static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001306getargs_s(PyObject *self, PyObject *args)
1307{
1308 char *str;
1309 if (!PyArg_ParseTuple(args, "s", &str))
1310 return NULL;
1311 return PyBytes_FromString(str);
1312}
1313
1314static PyObject *
1315getargs_s_star(PyObject *self, PyObject *args)
1316{
1317 Py_buffer buffer;
1318 PyObject *bytes;
1319 if (!PyArg_ParseTuple(args, "s*", &buffer))
1320 return NULL;
1321 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1322 PyBuffer_Release(&buffer);
1323 return bytes;
1324}
1325
1326static PyObject *
1327getargs_s_hash(PyObject *self, PyObject *args)
1328{
1329 char *str;
1330 Py_ssize_t size;
1331 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1332 return NULL;
1333 return PyBytes_FromStringAndSize(str, size);
1334}
1335
1336static PyObject *
1337getargs_z(PyObject *self, PyObject *args)
1338{
1339 char *str;
1340 if (!PyArg_ParseTuple(args, "z", &str))
1341 return NULL;
1342 if (str != NULL)
1343 return PyBytes_FromString(str);
1344 else
1345 Py_RETURN_NONE;
1346}
1347
1348static PyObject *
1349getargs_z_star(PyObject *self, PyObject *args)
1350{
1351 Py_buffer buffer;
1352 PyObject *bytes;
1353 if (!PyArg_ParseTuple(args, "z*", &buffer))
1354 return NULL;
1355 if (buffer.buf != NULL)
1356 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1357 else {
1358 Py_INCREF(Py_None);
1359 bytes = Py_None;
1360 }
1361 PyBuffer_Release(&buffer);
1362 return bytes;
1363}
1364
1365static PyObject *
1366getargs_z_hash(PyObject *self, PyObject *args)
1367{
1368 char *str;
1369 Py_ssize_t size;
1370 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1371 return NULL;
1372 if (str != NULL)
1373 return PyBytes_FromStringAndSize(str, size);
1374 else
1375 Py_RETURN_NONE;
1376}
1377
1378static PyObject *
1379getargs_y(PyObject *self, PyObject *args)
1380{
1381 char *str;
1382 if (!PyArg_ParseTuple(args, "y", &str))
1383 return NULL;
1384 return PyBytes_FromString(str);
1385}
1386
1387static PyObject *
1388getargs_y_star(PyObject *self, PyObject *args)
1389{
1390 Py_buffer buffer;
1391 PyObject *bytes;
1392 if (!PyArg_ParseTuple(args, "y*", &buffer))
1393 return NULL;
1394 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1395 PyBuffer_Release(&buffer);
1396 return bytes;
1397}
1398
1399static PyObject *
1400getargs_y_hash(PyObject *self, PyObject *args)
1401{
1402 char *str;
1403 Py_ssize_t size;
1404 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1405 return NULL;
1406 return PyBytes_FromStringAndSize(str, size);
1407}
1408
1409static PyObject *
1410getargs_u(PyObject *self, PyObject *args)
1411{
1412 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001413 if (!PyArg_ParseTuple(args, "u", &str))
1414 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001415 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001416}
1417
1418static PyObject *
1419getargs_u_hash(PyObject *self, PyObject *args)
1420{
1421 Py_UNICODE *str;
1422 Py_ssize_t size;
1423 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1424 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001425 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001426}
1427
1428static PyObject *
1429getargs_Z(PyObject *self, PyObject *args)
1430{
1431 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001432 if (!PyArg_ParseTuple(args, "Z", &str))
1433 return NULL;
1434 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001435 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001436 } else
1437 Py_RETURN_NONE;
1438}
1439
1440static PyObject *
1441getargs_Z_hash(PyObject *self, PyObject *args)
1442{
1443 Py_UNICODE *str;
1444 Py_ssize_t size;
1445 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1446 return NULL;
1447 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001448 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001449 else
1450 Py_RETURN_NONE;
1451}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001452
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001453static PyObject *
1454getargs_es(PyObject *self, PyObject *args)
1455{
1456 PyObject *arg, *result;
1457 const char *encoding = NULL;
1458 char *str;
1459
1460 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1461 return NULL;
1462 if (!PyArg_Parse(arg, "es", encoding, &str))
1463 return NULL;
1464 result = PyBytes_FromString(str);
1465 PyMem_Free(str);
1466 return result;
1467}
1468
1469static PyObject *
1470getargs_et(PyObject *self, PyObject *args)
1471{
1472 PyObject *arg, *result;
1473 const char *encoding = NULL;
1474 char *str;
1475
1476 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1477 return NULL;
1478 if (!PyArg_Parse(arg, "et", encoding, &str))
1479 return NULL;
1480 result = PyBytes_FromString(str);
1481 PyMem_Free(str);
1482 return result;
1483}
1484
1485static PyObject *
1486getargs_es_hash(PyObject *self, PyObject *args)
1487{
1488 PyObject *arg, *result;
1489 const char *encoding = NULL;
1490 PyByteArrayObject *buffer = NULL;
1491 char *str = NULL;
1492 Py_ssize_t size;
1493
1494 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1495 return NULL;
1496 if (buffer != NULL) {
1497 str = PyByteArray_AS_STRING(buffer);
1498 size = PyByteArray_GET_SIZE(buffer);
1499 }
1500 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1501 return NULL;
1502 result = PyBytes_FromStringAndSize(str, size);
1503 if (buffer == NULL)
1504 PyMem_Free(str);
1505 return result;
1506}
1507
1508static PyObject *
1509getargs_et_hash(PyObject *self, PyObject *args)
1510{
1511 PyObject *arg, *result;
1512 const char *encoding = NULL;
1513 PyByteArrayObject *buffer = NULL;
1514 char *str = NULL;
1515 Py_ssize_t size;
1516
1517 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1518 return NULL;
1519 if (buffer != NULL) {
1520 str = PyByteArray_AS_STRING(buffer);
1521 size = PyByteArray_GET_SIZE(buffer);
1522 }
1523 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1524 return NULL;
1525 result = PyBytes_FromStringAndSize(str, size);
1526 if (buffer == NULL)
1527 PyMem_Free(str);
1528 return result;
1529}
1530
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001531/* Test the s and z codes for PyArg_ParseTuple.
1532*/
1533static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301534test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001535{
1536 /* Unicode strings should be accepted */
1537 PyObject *tuple, *obj;
1538 char *value;
1539
1540 tuple = PyTuple_New(1);
1541 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001543
1544 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001546 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001548
1549 PyTuple_SET_ITEM(tuple, 0, obj);
1550
1551 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001553 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001554 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1555 return NULL;
1556 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001557
Oren Milmanba7d7362017-08-29 11:58:27 +03001558 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1559 return NULL;
1560 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001561
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001562 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001563 Py_RETURN_NONE;
1564}
1565
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001566static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001567parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001568{
Larry Hastings8f904da2012-06-22 03:56:29 -07001569 PyObject *sub_args;
1570 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001571 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001572 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001573
Larry Hastings8f904da2012-06-22 03:56:29 -07001574 Py_ssize_t i, size;
1575 char *keywords[8 + 1]; /* space for NULL at end */
1576 PyObject *o;
1577 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001578
Larry Hastings8f904da2012-06-22 03:56:29 -07001579 int result;
1580 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001581
Larry Hastings22701e82012-08-08 14:52:22 -07001582 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001583
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001584 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001585 &sub_args, &sub_kwargs,
1586 &sub_format, &sub_keywords))
1587 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001588
Larry Hastings8f904da2012-06-22 03:56:29 -07001589 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1590 PyErr_SetString(PyExc_ValueError,
1591 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1592 return NULL;
1593 }
1594
1595 memset(buffers, 0, sizeof(buffers));
1596 memset(converted, 0, sizeof(converted));
1597 memset(keywords, 0, sizeof(keywords));
1598
1599 size = PySequence_Fast_GET_SIZE(sub_keywords);
1600 if (size > 8) {
1601 PyErr_SetString(PyExc_ValueError,
1602 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1603 goto exit;
1604 }
1605
1606 for (i = 0; i < size; i++) {
1607 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1608 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1609 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001610 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001611 goto exit;
1612 }
1613 keywords[i] = PyBytes_AS_STRING(converted[i]);
1614 }
1615
1616 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1617 sub_format, keywords,
1618 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1619 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1620
1621 if (result) {
1622 return_value = Py_None;
1623 Py_INCREF(Py_None);
1624 }
1625
1626exit:
1627 size = sizeof(converted) / sizeof(converted[0]);
1628 for (i = 0; i < size; i++) {
1629 Py_XDECREF(converted[i]);
1630 }
1631 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001632}
1633
Benjamin Peterson92035012008-12-27 16:00:54 +00001634static volatile int x;
1635
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001636/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1637 of an error.
1638*/
1639static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301640test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001641{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 PyObject *tuple, *obj;
1643 Py_UNICODE *value;
1644 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1647 /* Just use the macro and check that it compiles */
1648 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 tuple = PyTuple_New(1);
1651 if (tuple == NULL)
1652 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 obj = PyUnicode_Decode("test", strlen("test"),
1655 "ascii", NULL);
1656 if (obj == NULL)
1657 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001662 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001664 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 if (value != PyUnicode_AS_UNICODE(obj))
1666 return raiseTestError("test_u_code",
1667 "u code returned wrong value for u'test'");
1668 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001669 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001671 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 if (value != PyUnicode_AS_UNICODE(obj) ||
1673 len != PyUnicode_GET_SIZE(obj))
1674 return raiseTestError("test_u_code",
1675 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001678 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001679}
1680
Guido van Rossumfb67be22007-08-29 18:38:11 +00001681/* Test Z and Z# codes for PyArg_ParseTuple */
1682static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301683test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001686 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 tuple = PyTuple_New(2);
1690 if (tuple == NULL)
1691 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 obj = PyUnicode_FromString("test");
1694 PyTuple_SET_ITEM(tuple, 0, obj);
1695 Py_INCREF(Py_None);
1696 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 /* swap values on purpose */
1699 value1 = NULL;
1700 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001703 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001705 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 if (value1 != PyUnicode_AS_UNICODE(obj))
1707 return raiseTestError("test_Z_code",
1708 "Z code returned wrong value for 'test'");
1709 if (value2 != NULL)
1710 return raiseTestError("test_Z_code",
1711 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 value1 = NULL;
1714 value2 = PyUnicode_AS_UNICODE(obj);
1715 len1 = -1;
1716 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001719 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1720 &value2, &len2))
1721 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001723 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1725 len1 != PyUnicode_GET_SIZE(obj))
1726 return raiseTestError("test_Z_code",
1727 "Z# code returned wrong values for 'test'");
1728 if (value2 != NULL ||
1729 len2 != 0)
1730 return raiseTestError("test_Z_code",
1731 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 Py_DECREF(tuple);
1734 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001735}
1736
Thomas Wouters477c8d52006-05-27 19:21:47 +00001737static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301738test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001739{
1740#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1742 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001743 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001744#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1746 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1751 if (wide == NULL)
1752 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1755 if (utf8 == NULL) {
1756 Py_DECREF(wide);
1757 return NULL;
1758 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001759
Victor Stinner8ef18872011-11-21 02:06:57 +01001760 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 Py_DECREF(wide);
1762 Py_DECREF(utf8);
1763 return raiseTestError("test_widechar",
1764 "wide string and utf8 string "
1765 "have different length");
1766 }
1767 if (PyUnicode_Compare(wide, utf8)) {
1768 Py_DECREF(wide);
1769 Py_DECREF(utf8);
1770 if (PyErr_Occurred())
1771 return NULL;
1772 return raiseTestError("test_widechar",
1773 "wide string and utf8 string "
1774 "are different");
1775 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 Py_DECREF(wide);
1778 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001779
1780#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1781 wide = PyUnicode_FromWideChar(invalid, 1);
1782 if (wide == NULL)
1783 PyErr_Clear();
1784 else
1785 return raiseTestError("test_widechar",
1786 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1787
1788 wide = PyUnicode_FromUnicode(invalid, 1);
1789 if (wide == NULL)
1790 PyErr_Clear();
1791 else
1792 return raiseTestError("test_widechar",
1793 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001794
1795 wide = PyUnicode_FromUnicode(NULL, 1);
1796 if (wide == NULL)
1797 return NULL;
1798 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001799 if (_PyUnicode_Ready(wide) < 0) {
1800 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001801 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001802 }
1803 else {
1804 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001805 return raiseTestError("test_widechar",
1806 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001807 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001808#endif
1809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001811}
1812
1813static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001814unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001815{
1816 PyObject *unicode, *result;
1817 Py_ssize_t buflen, size;
1818 wchar_t *buffer;
1819
1820 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1821 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001822 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001823 if (buffer == NULL)
1824 return PyErr_NoMemory();
1825
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001826 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001827 if (size == -1) {
1828 PyMem_Free(buffer);
1829 return NULL;
1830 }
1831
1832 if (size < buflen)
1833 buflen = size + 1;
1834 else
1835 buflen = size;
1836 result = PyUnicode_FromWideChar(buffer, buflen);
1837 PyMem_Free(buffer);
1838 if (result == NULL)
1839 return NULL;
1840
1841 return Py_BuildValue("(Nn)", result, size);
1842}
1843
1844static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001845unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001846{
1847 PyObject *unicode, *result;
1848 Py_ssize_t size;
1849 wchar_t *buffer;
1850
1851 if (!PyArg_ParseTuple(args, "U", &unicode))
1852 return NULL;
1853
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001854 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001855 if (buffer == NULL)
1856 return NULL;
1857
1858 result = PyUnicode_FromWideChar(buffer, size + 1);
1859 PyMem_Free(buffer);
1860 if (result == NULL)
1861 return NULL;
1862 return Py_BuildValue("(Nn)", result, size);
1863}
1864
1865static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001866unicode_asucs4(PyObject *self, PyObject *args)
1867{
1868 PyObject *unicode, *result;
1869 Py_UCS4 *buffer;
1870 int copy_null;
1871 Py_ssize_t str_len, buf_len;
1872
1873 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1874 return NULL;
1875 }
1876
1877 buf_len = str_len + 1;
1878 buffer = PyMem_NEW(Py_UCS4, buf_len);
1879 if (buffer == NULL) {
1880 return PyErr_NoMemory();
1881 }
1882 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1883 buffer[str_len] = 0xffffU;
1884
1885 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1886 PyMem_FREE(buffer);
1887 return NULL;
1888 }
1889
1890 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1891 PyMem_FREE(buffer);
1892 return result;
1893}
1894
1895static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001896unicode_findchar(PyObject *self, PyObject *args)
1897{
1898 PyObject *str;
1899 int direction;
1900 unsigned int ch;
1901 Py_ssize_t result;
1902 Py_ssize_t start, end;
1903
1904 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1905 &start, &end, &direction)) {
1906 return NULL;
1907 }
1908
1909 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
1910 if (result == -2)
1911 return NULL;
1912 else
1913 return PyLong_FromSsize_t(result);
1914}
1915
1916static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001917unicode_copycharacters(PyObject *self, PyObject *args)
1918{
1919 PyObject *from, *to, *to_copy;
1920 Py_ssize_t from_start, to_start, how_many, copied;
1921
1922 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1923 &from, &from_start, &how_many)) {
1924 return NULL;
1925 }
1926
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001927 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1928 PyUnicode_MAX_CHAR_VALUE(to)))) {
1929 return NULL;
1930 }
1931 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
1932 Py_DECREF(to_copy);
1933 return NULL;
1934 }
1935
1936 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
1937 from_start, how_many)) < 0) {
1938 Py_DECREF(to_copy);
1939 return NULL;
1940 }
1941
1942 return Py_BuildValue("(Nn)", to_copy, copied);
1943}
1944
1945static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001946unicode_encodedecimal(PyObject *self, PyObject *args)
1947{
1948 Py_UNICODE *unicode;
1949 Py_ssize_t length;
1950 char *errors = NULL;
1951 PyObject *decimal;
1952 Py_ssize_t decimal_length, new_length;
1953 int res;
1954
1955 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1956 return NULL;
1957
1958 decimal_length = length * 7; /* len('&#8364;') */
1959 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1960 if (decimal == NULL)
1961 return NULL;
1962
1963 res = PyUnicode_EncodeDecimal(unicode, length,
1964 PyBytes_AS_STRING(decimal),
1965 errors);
1966 if (res < 0) {
1967 Py_DECREF(decimal);
1968 return NULL;
1969 }
1970
1971 new_length = strlen(PyBytes_AS_STRING(decimal));
1972 assert(new_length <= decimal_length);
1973 res = _PyBytes_Resize(&decimal, new_length);
1974 if (res < 0)
1975 return NULL;
1976
1977 return decimal;
1978}
1979
1980static PyObject *
1981unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1982{
1983 Py_UNICODE *unicode;
1984 Py_ssize_t length;
1985 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1986 return NULL;
1987 return PyUnicode_TransformDecimalToASCII(unicode, length);
1988}
1989
1990static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001991unicode_legacy_string(PyObject *self, PyObject *args)
1992{
1993 Py_UNICODE *data;
1994 Py_ssize_t len;
1995 PyObject *u;
1996
1997 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1998 return NULL;
1999
2000 u = PyUnicode_FromUnicode(NULL, len);
2001 if (u == NULL)
2002 return NULL;
2003
2004 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2005
2006 if (len > 0) { /* The empty string is always ready. */
2007 assert(!PyUnicode_IS_READY(u));
2008 }
2009
2010 return u;
2011}
2012
2013static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002014getargs_w_star(PyObject *self, PyObject *args)
2015{
2016 Py_buffer buffer;
2017 PyObject *result;
2018 char *str;
2019
2020 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2021 return NULL;
2022
2023 if (2 <= buffer.len) {
2024 str = buffer.buf;
2025 str[0] = '[';
2026 str[buffer.len-1] = ']';
2027 }
2028
2029 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2030 PyBuffer_Release(&buffer);
2031 return result;
2032}
2033
2034
2035static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302036test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002037{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 /* Test that formats can begin with '|'. See issue #4720. */
2039 PyObject *tuple, *dict = NULL;
2040 static char *kwlist[] = {NULL};
2041 int result;
2042 tuple = PyTuple_New(0);
2043 if (!tuple)
2044 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002045 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002047 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 dict = PyDict_New();
2049 if (!dict)
2050 goto done;
2051 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002052 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 Py_DECREF(tuple);
2054 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002055 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002057 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 else {
2059 Py_RETURN_NONE;
2060 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002061}
2062
2063static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002064codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002065{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 const char *encoding, *errors = NULL;
2067 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2068 &encoding, &errors))
2069 return NULL;
2070 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002071}
2072
Thomas Wouters477c8d52006-05-27 19:21:47 +00002073static PyObject *
2074codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002075{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 const char *encoding, *errors = NULL;
2077 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2078 &encoding, &errors))
2079 return NULL;
2080 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002081}
2082
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002083
Tim Peters5b8132f2003-01-31 15:52:05 +00002084/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002085static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302086test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002087{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 struct triple {
2089 long input;
2090 size_t nbits;
2091 int sign;
2092 } testcases[] = {{0, 0, 0},
2093 {1L, 1, 1},
2094 {-1L, 1, -1},
2095 {2L, 2, 1},
2096 {-2L, 2, -1},
2097 {3L, 2, 1},
2098 {-3L, 2, -1},
2099 {4L, 3, 1},
2100 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002101 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 {-0x7fffL, 15, -1},
2103 {0xffffL, 16, 1},
2104 {-0xffffL, 16, -1},
2105 {0xfffffffL, 28, 1},
2106 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002107 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002108
Victor Stinner63941882011-09-29 00:42:28 +02002109 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002110 size_t nbits;
2111 int sign;
2112 PyObject *plong;
2113
2114 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002115 if (plong == NULL)
2116 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002117 nbits = _PyLong_NumBits(plong);
2118 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 Py_DECREF(plong);
2121 if (nbits != testcases[i].nbits)
2122 return raiseTestError("test_long_numbits",
2123 "wrong result for _PyLong_NumBits");
2124 if (sign != testcases[i].sign)
2125 return raiseTestError("test_long_numbits",
2126 "wrong result for _PyLong_Sign");
2127 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002128 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002129}
2130
Thomas Heller519a0422007-11-15 20:48:54 +00002131/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002132
2133static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302134test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2137 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2138 Py_XDECREF(o1);
2139 Py_XDECREF(o2);
2140 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002141}
2142
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002143static PyObject *
2144raise_exception(PyObject *self, PyObject *args)
2145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 PyObject *exc;
2147 PyObject *exc_args, *v;
2148 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2151 &exc, &num_args))
2152 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 exc_args = PyTuple_New(num_args);
2155 if (exc_args == NULL)
2156 return NULL;
2157 for (i = 0; i < num_args; ++i) {
2158 v = PyLong_FromLong(i);
2159 if (v == NULL) {
2160 Py_DECREF(exc_args);
2161 return NULL;
2162 }
2163 PyTuple_SET_ITEM(exc_args, i, v);
2164 }
2165 PyErr_SetObject(exc, exc_args);
2166 Py_DECREF(exc_args);
2167 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002168}
Tim Peters91621db2001-06-12 20:10:01 +00002169
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002170static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002171set_errno(PyObject *self, PyObject *args)
2172{
2173 int new_errno;
2174
2175 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2176 return NULL;
2177
2178 errno = new_errno;
2179 Py_RETURN_NONE;
2180}
2181
2182static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002183test_set_exc_info(PyObject *self, PyObject *args)
2184{
2185 PyObject *orig_exc;
2186 PyObject *new_type, *new_value, *new_tb;
2187 PyObject *type, *value, *tb;
2188 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2189 &new_type, &new_value, &new_tb))
2190 return NULL;
2191
2192 PyErr_GetExcInfo(&type, &value, &tb);
2193
2194 Py_INCREF(new_type);
2195 Py_INCREF(new_value);
2196 Py_INCREF(new_tb);
2197 PyErr_SetExcInfo(new_type, new_value, new_tb);
2198
2199 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2200 Py_XDECREF(type);
2201 Py_XDECREF(value);
2202 Py_XDECREF(tb);
2203 return orig_exc;
2204}
Benjamin Peterson16323982010-02-03 01:13:41 +00002205
2206static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002207
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002208static PyObject *
2209test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 if (PyDateTimeAPI) {
2211 if (test_run_counter) {
2212 /* Probably regrtest.py -R */
2213 Py_RETURN_NONE;
2214 }
2215 else {
2216 PyErr_SetString(PyExc_AssertionError,
2217 "PyDateTime_CAPI somehow initialized");
2218 return NULL;
2219 }
2220 }
2221 test_run_counter++;
2222 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 if (PyDateTimeAPI)
2225 Py_RETURN_NONE;
2226 else
2227 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002228}
2229
Paul Ganssle04af5b12018-01-24 17:29:30 -05002230/* Functions exposing the C API type checking for testing */
2231#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2232 PyObject *obj; \
2233 int exact = 0; \
2234 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2235 return NULL; \
2236 } \
2237 int rv = exact?exact_method(obj):check_method(obj); \
2238 if (rv) { \
2239 Py_RETURN_TRUE; \
2240 } else { \
2241 Py_RETURN_FALSE; \
2242 }
2243
2244static PyObject *
2245datetime_check_date(PyObject *self, PyObject *args) {
2246 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2247}
2248
2249static PyObject *
2250datetime_check_time(PyObject *self, PyObject *args) {
2251 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2252}
2253
2254static PyObject *
2255datetime_check_datetime(PyObject *self, PyObject *args) {
2256 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2257}
2258
2259static PyObject *
2260datetime_check_delta(PyObject *self, PyObject *args) {
2261 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2262}
2263
2264static PyObject *
2265datetime_check_tzinfo(PyObject *self, PyObject *args) {
2266 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2267}
2268
2269
2270/* Makes three variations on timezone representing UTC-5:
2271 1. timezone with offset and name from PyDateTimeAPI
2272 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2273 3. timezone with offset (no name) from PyTimeZone_FromOffset
2274*/
2275static PyObject *
2276make_timezones_capi(PyObject *self, PyObject *args) {
2277 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2278 PyObject *name = PyUnicode_FromString("EST");
2279
2280 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2281 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2282 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2283
2284 Py_DecRef(offset);
2285 Py_DecRef(name);
2286
2287 PyObject *rv = PyTuple_New(3);
2288
2289 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2290 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2291 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2292
2293 return rv;
2294}
2295
2296static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002297get_timezones_offset_zero(PyObject *self, PyObject *args) {
2298 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2299 PyObject *name = PyUnicode_FromString("");
2300
2301 // These two should return the UTC singleton
2302 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2303 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2304
2305 // This one will return +00:00 zone, but not the UTC singleton
2306 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2307
2308 Py_DecRef(offset);
2309 Py_DecRef(name);
2310
2311 PyObject *rv = PyTuple_New(3);
2312 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2313 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2314 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2315
2316 return rv;
2317}
2318
2319static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002320get_timezone_utc_capi(PyObject* self, PyObject *args) {
2321 int macro = 0;
2322 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2323 return NULL;
2324 }
2325 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002326 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002327 return PyDateTime_TimeZone_UTC;
2328 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002329 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002330 return PyDateTimeAPI->TimeZone_UTC;
2331 }
2332}
2333
Benjamin Peterson16323982010-02-03 01:13:41 +00002334
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002335/* test_thread_state spawns a thread of its own, and that thread releases
2336 * `thread_done` when it's finished. The driver code has to know when the
2337 * thread finishes, because the thread uses a PyObject (the callable) that
2338 * may go away when the driver finishes. The former lack of this explicit
2339 * synchronization caused rare segfaults, so rare that they were seen only
2340 * on a Mac buildbot (although they were possible on any box).
2341 */
2342static PyThread_type_lock thread_done = NULL;
2343
Benjamin Petersona786b022008-08-25 21:05:21 +00002344static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002345_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002346{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 PyObject *rc;
2348 int success;
2349 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002350 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 success = (rc != NULL);
2352 Py_XDECREF(rc);
2353 PyGILState_Release(s);
2354 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002355}
2356
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002357/* Same thing, but releases `thread_done` when it returns. This variant
2358 * should be called only from threads spawned by test_thread_state().
2359 */
2360static void
2361_make_call_from_thread(void *callable)
2362{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 _make_call(callable);
2364 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002365}
2366
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002367static PyObject *
2368test_thread_state(PyObject *self, PyObject *args)
2369{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 PyObject *fn;
2371 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2374 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376 if (!PyCallable_Check(fn)) {
2377 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2378 fn->ob_type->tp_name);
2379 return NULL;
2380 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 /* Ensure Python is set up for threading */
2383 PyEval_InitThreads();
2384 thread_done = PyThread_allocate_lock();
2385 if (thread_done == NULL)
2386 return PyErr_NoMemory();
2387 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 /* Start a new thread with our callback. */
2390 PyThread_start_new_thread(_make_call_from_thread, fn);
2391 /* Make the callback with the thread lock held by this thread */
2392 success &= _make_call(fn);
2393 /* Do it all again, but this time with the thread-lock released */
2394 Py_BEGIN_ALLOW_THREADS
2395 success &= _make_call(fn);
2396 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2397 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 /* And once more with and without a thread
2400 XXX - should use a lock and work out exactly what we are trying
2401 to test <wink>
2402 */
2403 Py_BEGIN_ALLOW_THREADS
2404 PyThread_start_new_thread(_make_call_from_thread, fn);
2405 success &= _make_call(fn);
2406 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2407 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 /* Release lock we acquired above. This is required on HP-UX. */
2410 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 PyThread_free_lock(thread_done);
2413 if (!success)
2414 return NULL;
2415 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002416}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002417
2418/* test Py_AddPendingCalls using threads */
2419static int _pending_callback(void *arg)
2420{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 /* we assume the argument is callable object to which we own a reference */
2422 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002423 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 Py_DECREF(callable);
2425 Py_XDECREF(r);
2426 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002427}
2428
2429/* The following requests n callbacks to _pending_callback. It can be
2430 * run from any python thread.
2431 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07002432static PyObject *
2433pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 PyObject *callable;
2436 int r;
2437 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2438 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 /* create the reference for the callbackwhile we hold the lock */
2441 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 Py_BEGIN_ALLOW_THREADS
2444 r = Py_AddPendingCall(&_pending_callback, callable);
2445 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 if (r<0) {
2448 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002449 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002451 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002452}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002453
Neal Norwitzb0d26332007-08-25 00:49:05 +00002454/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002455static PyObject *
2456test_string_from_format(PyObject *self, PyObject *args)
2457{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 PyObject *result;
2459 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002460
Alexander Belopolskye239d232010-12-08 23:31:48 +00002461#define CHECK_1_FORMAT(FORMAT, TYPE) \
2462 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2463 if (result == NULL) \
2464 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002465 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002466 msg = FORMAT " failed at 1"; \
2467 goto Fail; \
2468 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 CHECK_1_FORMAT("%d", int);
2472 CHECK_1_FORMAT("%ld", long);
2473 /* The z width modifier was added in Python 2.5. */
2474 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 /* The u type code was added in Python 2.5. */
2477 CHECK_1_FORMAT("%u", unsigned int);
2478 CHECK_1_FORMAT("%lu", unsigned long);
2479 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002482 CHECK_1_FORMAT("%llu", unsigned long long);
2483 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002486
2487 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002488 Py_XDECREF(result);
2489 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002490
2491#undef CHECK_1_FORMAT
2492}
2493
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002494
2495static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302496test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2498 int result;
2499 if (py_s == NULL)
2500 return NULL;
2501 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2502 Py_DECREF(py_s);
2503 if (!result) {
2504 PyErr_SetString(TestError, "Python string ending in NULL "
2505 "should not compare equal to c string.");
2506 return NULL;
2507 }
2508 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002509}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002510
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002511/* This is here to provide a docstring for test_descr. */
2512static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302513test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002516}
2517
Mark Dickinson725bfd82009-05-03 20:33:40 +00002518/* Test PyOS_string_to_double. */
2519static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302520test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002522 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524#define CHECK_STRING(STR, expected) \
2525 result = PyOS_string_to_double(STR, NULL, NULL); \
2526 if (result == -1.0 && PyErr_Occurred()) \
2527 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002528 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 msg = "conversion of " STR " to float failed"; \
2530 goto fail; \
2531 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533#define CHECK_INVALID(STR) \
2534 result = PyOS_string_to_double(STR, NULL, NULL); \
2535 if (result == -1.0 && PyErr_Occurred()) { \
2536 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2537 PyErr_Clear(); \
2538 else \
2539 return NULL; \
2540 } \
2541 else { \
2542 msg = "conversion of " STR " didn't raise ValueError"; \
2543 goto fail; \
2544 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 CHECK_STRING("0.1", 0.1);
2547 CHECK_STRING("1.234", 1.234);
2548 CHECK_STRING("-1.35", -1.35);
2549 CHECK_STRING(".1e01", 1.0);
2550 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 CHECK_INVALID(" 0.1");
2553 CHECK_INVALID("\t\n-3");
2554 CHECK_INVALID(".123 ");
2555 CHECK_INVALID("3\n");
2556 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002559 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002561#undef CHECK_STRING
2562#undef CHECK_INVALID
2563}
2564
2565
Benjamin Petersonb173f782009-05-05 22:31:58 +00002566/* Coverage testing of capsule objects. */
2567
2568static const char *capsule_name = "capsule name";
2569static char *capsule_pointer = "capsule pointer";
2570static char *capsule_context = "capsule context";
2571static const char *capsule_error = NULL;
2572static int
2573capsule_destructor_call_count = 0;
2574
2575static void
2576capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002577 capsule_destructor_call_count++;
2578 if (PyCapsule_GetContext(o) != capsule_context) {
2579 capsule_error = "context did not match in destructor!";
2580 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2581 capsule_error = "destructor did not match in destructor! (woah!)";
2582 } else if (PyCapsule_GetName(o) != capsule_name) {
2583 capsule_error = "name did not match in destructor!";
2584 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2585 capsule_error = "pointer did not match in destructor!";
2586 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002587}
2588
2589typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 char *name;
2591 char *module;
2592 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002593} known_capsule;
2594
2595static PyObject *
2596test_capsule(PyObject *self, PyObject *args)
2597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002598 PyObject *object;
2599 const char *error = NULL;
2600 void *pointer;
2601 void *pointer2;
2602 known_capsule known_capsules[] = {
2603 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2604 KNOWN_CAPSULE("_socket", "CAPI"),
2605 KNOWN_CAPSULE("_curses", "_C_API"),
2606 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2607 { NULL, NULL },
2608 };
2609 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002610
2611#define FAIL(x) { error = (x); goto exit; }
2612
2613#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 if (capsule_error) { \
2615 FAIL(capsule_error); \
2616 } \
2617 else if (!capsule_destructor_call_count) { \
2618 FAIL("destructor not called!"); \
2619 } \
2620 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2623 PyCapsule_SetContext(object, capsule_context);
2624 capsule_destructor(object);
2625 CHECK_DESTRUCTOR;
2626 Py_DECREF(object);
2627 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 object = PyCapsule_New(known, "ignored", NULL);
2630 PyCapsule_SetPointer(object, capsule_pointer);
2631 PyCapsule_SetName(object, capsule_name);
2632 PyCapsule_SetDestructor(object, capsule_destructor);
2633 PyCapsule_SetContext(object, capsule_context);
2634 capsule_destructor(object);
2635 CHECK_DESTRUCTOR;
2636 /* intentionally access using the wrong name */
2637 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2638 if (!PyErr_Occurred()) {
2639 FAIL("PyCapsule_GetPointer should have failed but did not!");
2640 }
2641 PyErr_Clear();
2642 if (pointer2) {
2643 if (pointer2 == capsule_pointer) {
2644 FAIL("PyCapsule_GetPointer should not have"
2645 " returned the internal pointer!");
2646 } else {
2647 FAIL("PyCapsule_GetPointer should have "
2648 "returned NULL pointer but did not!");
2649 }
2650 }
2651 PyCapsule_SetDestructor(object, NULL);
2652 Py_DECREF(object);
2653 if (capsule_destructor_call_count) {
2654 FAIL("destructor called when it should not have been!");
2655 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 for (known = &known_capsules[0]; known->module != NULL; known++) {
2658 /* yeah, ordinarily I wouldn't do this either,
2659 but it's fine for this test harness.
2660 */
2661 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002662#undef FAIL
2663#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 { \
2665 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2666 x, known->module, known->attribute); \
2667 error = buffer; \
2668 goto exit; \
2669 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 PyObject *module = PyImport_ImportModule(known->module);
2672 if (module) {
2673 pointer = PyCapsule_Import(known->name, 0);
2674 if (!pointer) {
2675 Py_DECREF(module);
2676 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2677 }
2678 object = PyObject_GetAttrString(module, known->attribute);
2679 if (!object) {
2680 Py_DECREF(module);
2681 return NULL;
2682 }
2683 pointer2 = PyCapsule_GetPointer(object,
2684 "weebles wobble but they don't fall down");
2685 if (!PyErr_Occurred()) {
2686 Py_DECREF(object);
2687 Py_DECREF(module);
2688 FAIL("PyCapsule_GetPointer should have failed but did not!");
2689 }
2690 PyErr_Clear();
2691 if (pointer2) {
2692 Py_DECREF(module);
2693 Py_DECREF(object);
2694 if (pointer2 == pointer) {
2695 FAIL("PyCapsule_GetPointer should not have"
2696 " returned its internal pointer!");
2697 } else {
2698 FAIL("PyCapsule_GetPointer should have"
2699 " returned NULL pointer but did not!");
2700 }
2701 }
2702 Py_DECREF(object);
2703 Py_DECREF(module);
2704 }
2705 else
2706 PyErr_Clear();
2707 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002708
2709 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 if (error) {
2711 return raiseTestError("test_capsule", error);
2712 }
2713 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002714#undef FAIL
2715}
2716
Guido van Rossumddefaf32007-01-14 03:31:43 +00002717#ifdef HAVE_GETTIMEOFDAY
2718/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002719static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002720{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002721 e->tv_sec -= s->tv_sec;
2722 e->tv_usec -= s->tv_usec;
2723 if (e->tv_usec < 0) {
2724 e->tv_sec -=1;
2725 e->tv_usec += 1000000;
2726 }
2727 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002728}
2729
2730static PyObject *
2731profile_int(PyObject *self, PyObject* args)
2732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 int i, k;
2734 struct timeval start, stop;
2735 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 /* Test 1: Allocate and immediately deallocate
2738 many small integers */
2739 gettimeofday(&start, NULL);
2740 for(k=0; k < 20000; k++)
2741 for(i=0; i < 1000; i++) {
2742 single = PyLong_FromLong(i);
2743 Py_DECREF(single);
2744 }
2745 gettimeofday(&stop, NULL);
2746 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 /* Test 2: Allocate and immediately deallocate
2749 many large integers */
2750 gettimeofday(&start, NULL);
2751 for(k=0; k < 20000; k++)
2752 for(i=0; i < 1000; i++) {
2753 single = PyLong_FromLong(i+1000000);
2754 Py_DECREF(single);
2755 }
2756 gettimeofday(&stop, NULL);
2757 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 /* Test 3: Allocate a few integers, then release
2760 them all simultaneously. */
2761 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002762 if (multiple == NULL)
2763 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 gettimeofday(&start, NULL);
2765 for(k=0; k < 20000; k++) {
2766 for(i=0; i < 1000; i++) {
2767 multiple[i] = PyLong_FromLong(i+1000000);
2768 }
2769 for(i=0; i < 1000; i++) {
2770 Py_DECREF(multiple[i]);
2771 }
2772 }
2773 gettimeofday(&stop, NULL);
2774 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002775 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 /* Test 4: Allocate many integers, then release
2778 them all simultaneously. */
2779 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002780 if (multiple == NULL)
2781 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 gettimeofday(&start, NULL);
2783 for(k=0; k < 20; k++) {
2784 for(i=0; i < 1000000; i++) {
2785 multiple[i] = PyLong_FromLong(i+1000000);
2786 }
2787 for(i=0; i < 1000000; i++) {
2788 Py_DECREF(multiple[i]);
2789 }
2790 }
2791 gettimeofday(&stop, NULL);
2792 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002793 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 /* Test 5: Allocate many integers < 32000 */
2796 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002797 if (multiple == NULL)
2798 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 gettimeofday(&start, NULL);
2800 for(k=0; k < 10; k++) {
2801 for(i=0; i < 1000000; i++) {
2802 multiple[i] = PyLong_FromLong(i+1000);
2803 }
2804 for(i=0; i < 1000000; i++) {
2805 Py_DECREF(multiple[i]);
2806 }
2807 }
2808 gettimeofday(&stop, NULL);
2809 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002810 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 /* Test 6: Perform small int addition */
2813 op1 = PyLong_FromLong(1);
2814 gettimeofday(&start, NULL);
2815 for(i=0; i < 10000000; i++) {
2816 result = PyNumber_Add(op1, op1);
2817 Py_DECREF(result);
2818 }
2819 gettimeofday(&stop, NULL);
2820 Py_DECREF(op1);
2821 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 /* Test 7: Perform medium int addition */
2824 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002825 if (op1 == NULL)
2826 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 gettimeofday(&start, NULL);
2828 for(i=0; i < 10000000; i++) {
2829 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002830 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 }
2832 gettimeofday(&stop, NULL);
2833 Py_DECREF(op1);
2834 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002835
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002836 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002837}
2838#endif
2839
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002840/* To test the format of tracebacks as printed out. */
2841static PyObject *
2842traceback_print(PyObject *self, PyObject *args)
2843{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 PyObject *file;
2845 PyObject *traceback;
2846 int result;
2847
2848 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2849 &traceback, &file))
2850 return NULL;
2851
2852 result = PyTraceBack_Print(traceback, file);
2853 if (result < 0)
2854 return NULL;
2855 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002856}
2857
Benjamin Petersone6528212008-07-15 15:32:09 +00002858/* To test the format of exceptions as printed out. */
2859static PyObject *
2860exception_print(PyObject *self, PyObject *args)
2861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 PyObject *value;
2863 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 if (!PyArg_ParseTuple(args, "O:exception_print",
2866 &value))
2867 return NULL;
2868 if (!PyExceptionInstance_Check(value)) {
2869 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2870 return NULL;
2871 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 tb = PyException_GetTraceback(value);
2874 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2875 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002878}
2879
2880
2881
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002882
2883/* reliably raise a MemoryError */
2884static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302885raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002886{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 PyErr_NoMemory();
2888 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002889}
2890
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002891/* Issue 6012 */
2892static PyObject *str1, *str2;
2893static int
2894failing_converter(PyObject *obj, void *arg)
2895{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002896 /* Clone str1, then let the conversion fail. */
2897 assert(str1);
2898 str2 = str1;
2899 Py_INCREF(str2);
2900 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002901}
2902static PyObject*
2903argparsing(PyObject *o, PyObject *args)
2904{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002905 PyObject *res;
2906 str1 = str2 = NULL;
2907 if (!PyArg_ParseTuple(args, "O&O&",
2908 PyUnicode_FSConverter, &str1,
2909 failing_converter, &str2)) {
2910 if (!str2)
2911 /* argument converter not called? */
2912 return NULL;
2913 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002914 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 Py_DECREF(str2);
2916 PyErr_Clear();
2917 return res;
2918 }
2919 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002920}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002921
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002922/* To test that the result of PyCode_NewEmpty has the right members. */
2923static PyObject *
2924code_newempty(PyObject *self, PyObject *args)
2925{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 const char *filename;
2927 const char *funcname;
2928 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2931 &filename, &funcname, &firstlineno))
2932 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002935}
2936
Georg Brandl1e28a272009-12-28 08:41:01 +00002937/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2938 Run via Lib/test/test_exceptions.py */
2939static PyObject *
2940make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002942 const char *name;
2943 const char *doc = NULL;
2944 PyObject *base = NULL;
2945 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002949 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2950 "s|sOO:make_exception_with_doc", kwlist,
2951 &name, &doc, &base, &dict))
2952 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002955}
2956
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002957static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302958make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002959{
2960 Py_buffer info;
2961 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2962 return NULL;
2963 return PyMemoryView_FromBuffer(&info);
2964}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002965
Stefan Krah7213fcc2015-02-01 16:19:23 +01002966static PyObject *
2967test_from_contiguous(PyObject* self, PyObject *noargs)
2968{
2969 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2970 int init[5] = {0, 1, 2, 3, 4};
2971 Py_ssize_t itemsize = sizeof(int);
2972 Py_ssize_t shape = 5;
2973 Py_ssize_t strides = 2 * itemsize;
2974 Py_buffer view = {
2975 data,
2976 NULL,
2977 5 * itemsize,
2978 itemsize,
2979 1,
2980 1,
2981 NULL,
2982 &shape,
2983 &strides,
2984 NULL,
2985 NULL
2986 };
2987 int *ptr;
2988 int i;
2989
2990 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2991 ptr = view.buf;
2992 for (i = 0; i < 5; i++) {
2993 if (ptr[2*i] != i) {
2994 PyErr_SetString(TestError,
2995 "test_from_contiguous: incorrect result");
2996 return NULL;
2997 }
2998 }
2999
3000 view.buf = &data[8];
3001 view.strides[0] = -2 * itemsize;
3002
3003 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3004 ptr = view.buf;
3005 for (i = 0; i < 5; i++) {
3006 if (*(ptr-2*i) != i) {
3007 PyErr_SetString(TestError,
3008 "test_from_contiguous: incorrect result");
3009 return NULL;
3010 }
3011 }
3012
3013 Py_RETURN_NONE;
3014}
Stefan Krah650c1e82015-02-03 21:43:23 +01003015
Stefan Kraha7559c02015-02-03 22:27:21 +01003016#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003017extern PyTypeObject _PyBytesIOBuffer_Type;
3018
Stefan Krah5178d912015-02-03 16:57:21 +01003019static PyObject *
3020test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
3021{
Stefan Krah650c1e82015-02-03 21:43:23 +01003022 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003023 PyObject *b;
3024 char *dummy[1];
3025 int ret, match;
3026
Stefan Krah650c1e82015-02-03 21:43:23 +01003027 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003028 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3029 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3030 PyErr_Clear();
3031 if (ret != -1 || match == 0)
3032 goto error;
3033
Stefan Krah650c1e82015-02-03 21:43:23 +01003034 /* bytesiobuf_getbuffer() */
3035 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003036 if (b == NULL) {
3037 return NULL;
3038 }
3039
3040 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3041 Py_DECREF(b);
3042 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3043 PyErr_Clear();
3044 if (ret != -1 || match == 0)
3045 goto error;
3046
3047 Py_RETURN_NONE;
3048
3049error:
3050 PyErr_SetString(TestError,
3051 "test_pep3118_obsolete_write_locks: failure");
3052 return NULL;
3053}
Stefan Kraha7559c02015-02-03 22:27:21 +01003054#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003055
Stefan Krah650c1e82015-02-03 21:43:23 +01003056/* This tests functions that historically supported write locks. It is
3057 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3058 is entitled to segfault in that case. */
3059static PyObject *
3060getbuffer_with_null_view(PyObject* self, PyObject *obj)
3061{
3062 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3063 return NULL;
3064
3065 Py_RETURN_NONE;
3066}
3067
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003068/* Test that the fatal error from not having a current thread doesn't
3069 cause an infinite loop. Run via Lib/test/test_capi.py */
3070static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303071crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003072{
3073 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003074 /* Using PyThreadState_Get() directly allows the test to pass in
3075 !pydebug mode. However, the test only actually tests anything
3076 in pydebug mode, since that's where the infinite loop was in
3077 the first place. */
3078 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003079 Py_END_ALLOW_THREADS
3080 return NULL;
3081}
3082
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003083/* To run some code in a sub-interpreter. */
3084static PyObject *
3085run_in_subinterp(PyObject *self, PyObject *args)
3086{
3087 const char *code;
3088 int r;
3089 PyThreadState *substate, *mainstate;
3090
3091 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3092 &code))
3093 return NULL;
3094
3095 mainstate = PyThreadState_Get();
3096
3097 PyThreadState_Swap(NULL);
3098
3099 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003100 if (substate == NULL) {
3101 /* Since no new thread state was created, there is no exception to
3102 propagate; raise a fresh one after swapping in the old thread
3103 state. */
3104 PyThreadState_Swap(mainstate);
3105 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3106 return NULL;
3107 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003108 r = PyRun_SimpleString(code);
3109 Py_EndInterpreter(substate);
3110
3111 PyThreadState_Swap(mainstate);
3112
3113 return PyLong_FromLong(r);
3114}
3115
Victor Stinner3c1b3792014-02-17 00:02:43 +01003116static int
3117check_time_rounding(int round)
3118{
Victor Stinner74474232015-09-02 01:43:56 +02003119 if (round != _PyTime_ROUND_FLOOR
3120 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003121 && round != _PyTime_ROUND_HALF_EVEN
3122 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003123 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3124 return -1;
3125 }
3126 return 0;
3127}
3128
Victor Stinner5d272cc2012-03-13 13:35:55 +01003129static PyObject *
3130test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3131{
3132 PyObject *obj;
3133 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003134 int round;
3135 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003136 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003137 if (check_time_rounding(round) < 0)
3138 return NULL;
3139 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003140 return NULL;
3141 return _PyLong_FromTime_t(sec);
3142}
3143
3144static PyObject *
3145test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3146{
3147 PyObject *obj;
3148 time_t sec;
3149 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003150 int round;
3151 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003152 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003153 if (check_time_rounding(round) < 0)
3154 return NULL;
3155 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003156 return NULL;
3157 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3158}
3159
Victor Stinner643cd682012-03-02 22:54:03 +01003160static PyObject *
3161test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3162{
3163 PyObject *obj;
3164 time_t sec;
3165 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003166 int round;
3167 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003168 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003169 if (check_time_rounding(round) < 0)
3170 return NULL;
3171 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003172 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003173 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003174}
3175
Antoine Pitrou796564c2013-07-30 19:59:21 +02003176static void
3177slot_tp_del(PyObject *self)
3178{
3179 _Py_IDENTIFIER(__tp_del__);
3180 PyObject *del, *res;
3181 PyObject *error_type, *error_value, *error_traceback;
3182
3183 /* Temporarily resurrect the object. */
3184 assert(self->ob_refcnt == 0);
3185 self->ob_refcnt = 1;
3186
3187 /* Save the current exception, if any. */
3188 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3189
3190 /* Execute __del__ method, if any. */
3191 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3192 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003193 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003194 if (res == NULL)
3195 PyErr_WriteUnraisable(del);
3196 else
3197 Py_DECREF(res);
3198 Py_DECREF(del);
3199 }
3200
3201 /* Restore the saved exception. */
3202 PyErr_Restore(error_type, error_value, error_traceback);
3203
3204 /* Undo the temporary resurrection; can't use DECREF here, it would
3205 * cause a recursive call.
3206 */
3207 assert(self->ob_refcnt > 0);
3208 if (--self->ob_refcnt == 0)
3209 return; /* this is the normal path out */
3210
3211 /* __del__ resurrected it! Make it look like the original Py_DECREF
3212 * never happened.
3213 */
3214 {
3215 Py_ssize_t refcnt = self->ob_refcnt;
3216 _Py_NewReference(self);
3217 self->ob_refcnt = refcnt;
3218 }
INADA Naokid8521422018-05-17 11:07:21 +09003219 assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self));
Antoine Pitrou796564c2013-07-30 19:59:21 +02003220 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3221 * we need to undo that. */
3222 _Py_DEC_REFTOTAL;
3223 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3224 * chain, so no more to do there.
3225 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3226 * _Py_NewReference bumped tp_allocs: both of those need to be
3227 * undone.
3228 */
3229#ifdef COUNT_ALLOCS
3230 --Py_TYPE(self)->tp_frees;
3231 --Py_TYPE(self)->tp_allocs;
3232#endif
3233}
3234
3235static PyObject *
3236with_tp_del(PyObject *self, PyObject *args)
3237{
3238 PyObject *obj;
3239 PyTypeObject *tp;
3240
3241 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3242 return NULL;
3243 tp = (PyTypeObject *) obj;
3244 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3245 PyErr_Format(PyExc_TypeError,
3246 "heap type expected, got %R", obj);
3247 return NULL;
3248 }
3249 tp->tp_del = slot_tp_del;
3250 Py_INCREF(obj);
3251 return obj;
3252}
3253
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003254static PyMethodDef ml;
3255
3256static PyObject *
3257create_cfunction(PyObject *self, PyObject *args)
3258{
3259 return PyCFunction_NewEx(&ml, self, NULL);
3260}
3261
3262static PyMethodDef ml = {
3263 "create_cfunction",
3264 create_cfunction,
3265 METH_NOARGS,
3266 NULL
3267};
3268
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003269static PyObject *
3270_test_incref(PyObject *ob)
3271{
3272 Py_INCREF(ob);
3273 return ob;
3274}
3275
3276static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303277test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003278{
3279 PyObject *obj = PyLong_FromLong(0);
3280 Py_XINCREF(_test_incref(obj));
3281 Py_DECREF(obj);
3282 Py_DECREF(obj);
3283 Py_DECREF(obj);
3284 Py_RETURN_NONE;
3285}
3286
3287static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303288test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003289{
3290 PyObject *obj = PyLong_FromLong(0);
3291 Py_INCREF(_test_incref(obj));
3292 Py_DECREF(obj);
3293 Py_DECREF(obj);
3294 Py_DECREF(obj);
3295 Py_RETURN_NONE;
3296}
3297
3298static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303299test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003300{
3301 Py_XDECREF(PyLong_FromLong(0));
3302 Py_RETURN_NONE;
3303}
3304
3305static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303306test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003307{
3308 Py_DECREF(PyLong_FromLong(0));
3309 Py_RETURN_NONE;
3310}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003311
Victor Stinner0507bf52013-07-07 02:05:46 +02003312static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303313test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003314{
3315 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003316 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003317 Py_DecRef(obj);
3318 Py_DecRef(obj);
3319 Py_RETURN_NONE;
3320}
3321
3322static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303323test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003324{
3325 void *ptr;
3326
Victor Stinnerdb067af2014-05-02 22:31:14 +02003327 ptr = PyMem_RawMalloc(0);
3328 if (ptr == NULL) {
3329 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3330 return NULL;
3331 }
3332 PyMem_RawFree(ptr);
3333
3334 ptr = PyMem_RawCalloc(0, 0);
3335 if (ptr == NULL) {
3336 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3337 return NULL;
3338 }
3339 PyMem_RawFree(ptr);
3340
Victor Stinner0507bf52013-07-07 02:05:46 +02003341 ptr = PyMem_Malloc(0);
3342 if (ptr == NULL) {
3343 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3344 return NULL;
3345 }
3346 PyMem_Free(ptr);
3347
Victor Stinnerdb067af2014-05-02 22:31:14 +02003348 ptr = PyMem_Calloc(0, 0);
3349 if (ptr == NULL) {
3350 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3351 return NULL;
3352 }
3353 PyMem_Free(ptr);
3354
Victor Stinner0507bf52013-07-07 02:05:46 +02003355 ptr = PyObject_Malloc(0);
3356 if (ptr == NULL) {
3357 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3358 return NULL;
3359 }
3360 PyObject_Free(ptr);
3361
Victor Stinnerdb067af2014-05-02 22:31:14 +02003362 ptr = PyObject_Calloc(0, 0);
3363 if (ptr == NULL) {
3364 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3365 return NULL;
3366 }
3367 PyObject_Free(ptr);
3368
Victor Stinner0507bf52013-07-07 02:05:46 +02003369 Py_RETURN_NONE;
3370}
3371
3372typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003373 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003374
3375 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003376 size_t calloc_nelem;
3377 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003378 void *realloc_ptr;
3379 size_t realloc_new_size;
3380 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003381 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003382} alloc_hook_t;
3383
Victor Stinner9ed83c42017-10-31 12:18:10 -07003384static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003385{
3386 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003387 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003388 hook->malloc_size = size;
3389 return hook->alloc.malloc(hook->alloc.ctx, size);
3390}
3391
Victor Stinner9ed83c42017-10-31 12:18:10 -07003392static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003393{
3394 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003395 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003396 hook->calloc_nelem = nelem;
3397 hook->calloc_elsize = elsize;
3398 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3399}
3400
Victor Stinner9ed83c42017-10-31 12:18:10 -07003401static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003402{
3403 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003404 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003405 hook->realloc_ptr = ptr;
3406 hook->realloc_new_size = new_size;
3407 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3408}
3409
Victor Stinner9ed83c42017-10-31 12:18:10 -07003410static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02003411{
3412 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003413 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003414 hook->free_ptr = ptr;
3415 hook->alloc.free(hook->alloc.ctx, ptr);
3416}
3417
3418static PyObject *
3419test_setallocators(PyMemAllocatorDomain domain)
3420{
3421 PyObject *res = NULL;
3422 const char *error_msg;
3423 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003424 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003425 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003426 void *ptr, *ptr2;
3427
Victor Stinnerdb067af2014-05-02 22:31:14 +02003428 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003429
3430 alloc.ctx = &hook;
3431 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003432 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003433 alloc.realloc = &hook_realloc;
3434 alloc.free = &hook_free;
3435 PyMem_GetAllocator(domain, &hook.alloc);
3436 PyMem_SetAllocator(domain, &alloc);
3437
Victor Stinner9ed83c42017-10-31 12:18:10 -07003438 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02003439 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003440 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02003441 switch(domain)
3442 {
3443 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3444 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3445 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3446 default: ptr = NULL; break;
3447 }
3448
Victor Stinner9ed83c42017-10-31 12:18:10 -07003449#define CHECK_CTX(FUNC) \
3450 if (hook.ctx != &hook) { \
3451 error_msg = FUNC " wrong context"; \
3452 goto fail; \
3453 } \
3454 hook.ctx = NULL; /* reset for next check */
3455
Victor Stinner0507bf52013-07-07 02:05:46 +02003456 if (ptr == NULL) {
3457 error_msg = "malloc failed";
3458 goto fail;
3459 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003460 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003461 if (hook.malloc_size != size) {
3462 error_msg = "malloc invalid size";
3463 goto fail;
3464 }
3465
3466 size2 = 200;
3467 switch(domain)
3468 {
3469 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3470 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3471 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003472 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003473 }
3474
3475 if (ptr2 == NULL) {
3476 error_msg = "realloc failed";
3477 goto fail;
3478 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003479 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003480 if (hook.realloc_ptr != ptr
3481 || hook.realloc_new_size != size2) {
3482 error_msg = "realloc invalid parameters";
3483 goto fail;
3484 }
3485
3486 switch(domain)
3487 {
3488 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3489 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3490 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3491 }
3492
Victor Stinner9ed83c42017-10-31 12:18:10 -07003493 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02003494 if (hook.free_ptr != ptr2) {
3495 error_msg = "free invalid pointer";
3496 goto fail;
3497 }
3498
Victor Stinner9ed83c42017-10-31 12:18:10 -07003499 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02003500 nelem = 2;
3501 elsize = 5;
3502 switch(domain)
3503 {
3504 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3505 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3506 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3507 default: ptr = NULL; break;
3508 }
3509
3510 if (ptr == NULL) {
3511 error_msg = "calloc failed";
3512 goto fail;
3513 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003514 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02003515 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3516 error_msg = "calloc invalid nelem or elsize";
3517 goto fail;
3518 }
3519
Victor Stinner9ed83c42017-10-31 12:18:10 -07003520 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003521 switch(domain)
3522 {
3523 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3524 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3525 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3526 }
3527
Victor Stinner9ed83c42017-10-31 12:18:10 -07003528 CHECK_CTX("calloc free");
3529 if (hook.free_ptr != ptr) {
3530 error_msg = "calloc free invalid pointer";
3531 goto fail;
3532 }
3533
Victor Stinner0507bf52013-07-07 02:05:46 +02003534 Py_INCREF(Py_None);
3535 res = Py_None;
3536 goto finally;
3537
3538fail:
3539 PyErr_SetString(PyExc_RuntimeError, error_msg);
3540
3541finally:
3542 PyMem_SetAllocator(domain, &hook.alloc);
3543 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003544
3545#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02003546}
3547
3548static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303549test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003550{
3551 return test_setallocators(PYMEM_DOMAIN_RAW);
3552}
3553
3554static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303555test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003556{
3557 return test_setallocators(PYMEM_DOMAIN_MEM);
3558}
3559
3560static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303561test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003562{
3563 return test_setallocators(PYMEM_DOMAIN_OBJ);
3564}
3565
xdegaye85f64302017-07-01 14:14:45 +02003566/* Most part of the following code is inherited from the pyfailmalloc project
3567 * written by Victor Stinner. */
3568static struct {
3569 int installed;
3570 PyMemAllocatorEx raw;
3571 PyMemAllocatorEx mem;
3572 PyMemAllocatorEx obj;
3573} FmHook;
3574
3575static struct {
3576 int start;
3577 int stop;
3578 Py_ssize_t count;
3579} FmData;
3580
3581static int
3582fm_nomemory(void)
3583{
3584 FmData.count++;
3585 if (FmData.count > FmData.start &&
3586 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
3587 return 1;
3588 }
3589 return 0;
3590}
3591
3592static void *
3593hook_fmalloc(void *ctx, size_t size)
3594{
3595 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3596 if (fm_nomemory()) {
3597 return NULL;
3598 }
3599 return alloc->malloc(alloc->ctx, size);
3600}
3601
3602static void *
3603hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
3604{
3605 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3606 if (fm_nomemory()) {
3607 return NULL;
3608 }
3609 return alloc->calloc(alloc->ctx, nelem, elsize);
3610}
3611
3612static void *
3613hook_frealloc(void *ctx, void *ptr, size_t new_size)
3614{
3615 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3616 if (fm_nomemory()) {
3617 return NULL;
3618 }
3619 return alloc->realloc(alloc->ctx, ptr, new_size);
3620}
3621
3622static void
3623hook_ffree(void *ctx, void *ptr)
3624{
3625 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3626 alloc->free(alloc->ctx, ptr);
3627}
3628
3629static void
3630fm_setup_hooks(void)
3631{
3632 PyMemAllocatorEx alloc;
3633
3634 if (FmHook.installed) {
3635 return;
3636 }
3637 FmHook.installed = 1;
3638
3639 alloc.malloc = hook_fmalloc;
3640 alloc.calloc = hook_fcalloc;
3641 alloc.realloc = hook_frealloc;
3642 alloc.free = hook_ffree;
3643 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3644 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3645 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3646
3647 alloc.ctx = &FmHook.raw;
3648 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
3649
3650 alloc.ctx = &FmHook.mem;
3651 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
3652
3653 alloc.ctx = &FmHook.obj;
3654 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
3655}
3656
3657static void
3658fm_remove_hooks(void)
3659{
3660 if (FmHook.installed) {
3661 FmHook.installed = 0;
3662 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3663 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3664 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3665 }
3666}
3667
3668static PyObject*
3669set_nomemory(PyObject *self, PyObject *args)
3670{
3671 /* Memory allocation fails after 'start' allocation requests, and until
3672 * 'stop' allocation requests except when 'stop' is negative or equal
3673 * to 0 (default) in which case allocation failures never stop. */
3674 FmData.count = 0;
3675 FmData.stop = 0;
3676 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
3677 return NULL;
3678 }
3679 fm_setup_hooks();
3680 Py_RETURN_NONE;
3681}
3682
3683static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303684remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02003685{
3686 fm_remove_hooks();
3687 Py_RETURN_NONE;
3688}
3689
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003690PyDoc_STRVAR(docstring_empty,
3691""
3692);
3693
3694PyDoc_STRVAR(docstring_no_signature,
3695"This docstring has no signature."
3696);
3697
3698PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003699"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003700"\n"
3701"This docstring has an invalid signature."
3702);
3703
Larry Hastings2623c8c2014-02-08 22:15:29 -08003704PyDoc_STRVAR(docstring_with_invalid_signature2,
3705"docstring_with_invalid_signature2($module, /, boo)\n"
3706"\n"
3707"--\n"
3708"\n"
3709"This docstring also has an invalid signature."
3710);
3711
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003712PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003713"docstring_with_signature($module, /, sig)\n"
3714"--\n"
3715"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003716"This docstring has a valid signature."
3717);
3718
Zachary Ware8ef887c2015-04-13 18:22:35 -05003719PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3720"docstring_with_signature_but_no_doc($module, /, sig)\n"
3721"--\n"
3722"\n"
3723);
3724
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003725PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003726"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3727"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003728"\n"
3729"\n"
3730"This docstring has a valid signature and some extra newlines."
3731);
3732
Larry Hastings16c51912014-01-07 11:53:01 -08003733PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003734"docstring_with_signature_with_defaults(module, s='avocado',\n"
3735" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3736" local=the_number_three, sys=sys.maxsize,\n"
3737" exp=sys.maxsize - 1)\n"
3738"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003739"\n"
3740"\n"
3741"\n"
3742"This docstring has a valid signature with parameters,\n"
3743"and the parameters take defaults of varying types."
3744);
3745
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003746typedef struct {
3747 PyThread_type_lock start_event;
3748 PyThread_type_lock exit_event;
3749 PyObject *callback;
3750} test_c_thread_t;
3751
3752static void
3753temporary_c_thread(void *data)
3754{
3755 test_c_thread_t *test_c_thread = data;
3756 PyGILState_STATE state;
3757 PyObject *res;
3758
3759 PyThread_release_lock(test_c_thread->start_event);
3760
3761 /* Allocate a Python thread state for this thread */
3762 state = PyGILState_Ensure();
3763
Victor Stinner3466bde2016-09-05 18:16:01 -07003764 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003765 Py_CLEAR(test_c_thread->callback);
3766
3767 if (res == NULL) {
3768 PyErr_Print();
3769 }
3770 else {
3771 Py_DECREF(res);
3772 }
3773
3774 /* Destroy the Python thread state for this thread */
3775 PyGILState_Release(state);
3776
3777 PyThread_release_lock(test_c_thread->exit_event);
3778
3779 PyThread_exit_thread();
3780}
3781
3782static PyObject *
3783call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3784{
3785 PyObject *res = NULL;
3786 test_c_thread_t test_c_thread;
3787 long thread;
3788
3789 PyEval_InitThreads();
3790
3791 test_c_thread.start_event = PyThread_allocate_lock();
3792 test_c_thread.exit_event = PyThread_allocate_lock();
3793 test_c_thread.callback = NULL;
3794 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3795 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3796 goto exit;
3797 }
3798
3799 Py_INCREF(callback);
3800 test_c_thread.callback = callback;
3801
3802 PyThread_acquire_lock(test_c_thread.start_event, 1);
3803 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3804
3805 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3806 if (thread == -1) {
3807 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3808 PyThread_release_lock(test_c_thread.start_event);
3809 PyThread_release_lock(test_c_thread.exit_event);
3810 goto exit;
3811 }
3812
3813 PyThread_acquire_lock(test_c_thread.start_event, 1);
3814 PyThread_release_lock(test_c_thread.start_event);
3815
3816 Py_BEGIN_ALLOW_THREADS
3817 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3818 PyThread_release_lock(test_c_thread.exit_event);
3819 Py_END_ALLOW_THREADS
3820
3821 Py_INCREF(Py_None);
3822 res = Py_None;
3823
3824exit:
3825 Py_CLEAR(test_c_thread.callback);
3826 if (test_c_thread.start_event)
3827 PyThread_free_lock(test_c_thread.start_event);
3828 if (test_c_thread.exit_event)
3829 PyThread_free_lock(test_c_thread.exit_event);
3830 return res;
3831}
Victor Stinner13105102013-12-13 02:17:29 +01003832
Victor Stinner56e8c292014-07-21 12:30:22 +02003833static PyObject*
3834test_raise_signal(PyObject* self, PyObject *args)
3835{
3836 int signum, err;
3837
Oren Milmanba7d7362017-08-29 11:58:27 +03003838 if (!PyArg_ParseTuple(args, "i:raise_signal", &signum)) {
Victor Stinner56e8c292014-07-21 12:30:22 +02003839 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03003840 }
Victor Stinner56e8c292014-07-21 12:30:22 +02003841
3842 err = raise(signum);
3843 if (err)
3844 return PyErr_SetFromErrno(PyExc_OSError);
3845
3846 if (PyErr_CheckSignals() < 0)
3847 return NULL;
3848
3849 Py_RETURN_NONE;
3850}
3851
Serhiy Storchakab5181342015-02-06 08:58:56 +02003852/* marshal */
3853
3854static PyObject*
3855pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3856{
3857 long value;
3858 char *filename;
3859 int version;
3860 FILE *fp;
3861
3862 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3863 &value, &filename, &version))
3864 return NULL;
3865
3866 fp = fopen(filename, "wb");
3867 if (fp == NULL) {
3868 PyErr_SetFromErrno(PyExc_OSError);
3869 return NULL;
3870 }
3871
3872 PyMarshal_WriteLongToFile(value, fp, version);
3873
3874 fclose(fp);
3875 if (PyErr_Occurred())
3876 return NULL;
3877 Py_RETURN_NONE;
3878}
3879
3880static PyObject*
3881pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3882{
3883 PyObject *obj;
3884 char *filename;
3885 int version;
3886 FILE *fp;
3887
3888 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3889 &obj, &filename, &version))
3890 return NULL;
3891
3892 fp = fopen(filename, "wb");
3893 if (fp == NULL) {
3894 PyErr_SetFromErrno(PyExc_OSError);
3895 return NULL;
3896 }
3897
3898 PyMarshal_WriteObjectToFile(obj, fp, version);
3899
3900 fclose(fp);
3901 if (PyErr_Occurred())
3902 return NULL;
3903 Py_RETURN_NONE;
3904}
3905
3906static PyObject*
3907pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3908{
3909 int value;
3910 long pos;
3911 char *filename;
3912 FILE *fp;
3913
3914 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3915 return NULL;
3916
3917 fp = fopen(filename, "rb");
3918 if (fp == NULL) {
3919 PyErr_SetFromErrno(PyExc_OSError);
3920 return NULL;
3921 }
3922
3923 value = PyMarshal_ReadShortFromFile(fp);
3924 pos = ftell(fp);
3925
3926 fclose(fp);
3927 if (PyErr_Occurred())
3928 return NULL;
3929 return Py_BuildValue("il", value, pos);
3930}
3931
3932static PyObject*
3933pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3934{
3935 long value, pos;
3936 char *filename;
3937 FILE *fp;
3938
3939 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3940 return NULL;
3941
3942 fp = fopen(filename, "rb");
3943 if (fp == NULL) {
3944 PyErr_SetFromErrno(PyExc_OSError);
3945 return NULL;
3946 }
3947
3948 value = PyMarshal_ReadLongFromFile(fp);
3949 pos = ftell(fp);
3950
3951 fclose(fp);
3952 if (PyErr_Occurred())
3953 return NULL;
3954 return Py_BuildValue("ll", value, pos);
3955}
3956
3957static PyObject*
3958pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3959{
3960 PyObject *obj;
3961 long pos;
3962 char *filename;
3963 FILE *fp;
3964
3965 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3966 return NULL;
3967
3968 fp = fopen(filename, "rb");
3969 if (fp == NULL) {
3970 PyErr_SetFromErrno(PyExc_OSError);
3971 return NULL;
3972 }
3973
3974 obj = PyMarshal_ReadLastObjectFromFile(fp);
3975 pos = ftell(fp);
3976
3977 fclose(fp);
3978 return Py_BuildValue("Nl", obj, pos);
3979}
3980
3981static PyObject*
3982pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3983{
3984 PyObject *obj;
3985 long pos;
3986 char *filename;
3987 FILE *fp;
3988
3989 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3990 return NULL;
3991
3992 fp = fopen(filename, "rb");
3993 if (fp == NULL) {
3994 PyErr_SetFromErrno(PyExc_OSError);
3995 return NULL;
3996 }
3997
3998 obj = PyMarshal_ReadObjectFromFile(fp);
3999 pos = ftell(fp);
4000
4001 fclose(fp);
4002 return Py_BuildValue("Nl", obj, pos);
4003}
4004
Victor Stinnerefde1462015-03-21 15:04:43 +01004005static PyObject*
4006return_null_without_error(PyObject *self, PyObject *args)
4007{
4008 /* invalid call: return NULL without setting an error,
4009 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4010 PyErr_Clear();
4011 return NULL;
4012}
4013
4014static PyObject*
4015return_result_with_error(PyObject *self, PyObject *args)
4016{
4017 /* invalid call: return a result with an error set,
4018 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4019 PyErr_SetNone(PyExc_ValueError);
4020 Py_RETURN_NONE;
4021}
4022
Victor Stinner992c43f2015-03-27 17:12:45 +01004023static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004024test_pytime_fromseconds(PyObject *self, PyObject *args)
4025{
4026 int seconds;
4027 _PyTime_t ts;
4028
4029 if (!PyArg_ParseTuple(args, "i", &seconds))
4030 return NULL;
4031 ts = _PyTime_FromSeconds(seconds);
4032 return _PyTime_AsNanosecondsObject(ts);
4033}
4034
4035static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004036test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4037{
4038 PyObject *obj;
4039 int round;
4040 _PyTime_t ts;
4041
4042 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4043 return NULL;
4044 if (check_time_rounding(round) < 0)
4045 return NULL;
4046 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4047 return NULL;
4048 return _PyTime_AsNanosecondsObject(ts);
4049}
4050
Victor Stinner4bfb4602015-03-27 22:27:24 +01004051static PyObject *
4052test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4053{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004054 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004055 _PyTime_t ts;
4056 double d;
4057
Victor Stinnerc29b5852017-11-02 07:28:27 -07004058 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004059 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004060 }
4061 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4062 return NULL;
4063 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004064 d = _PyTime_AsSecondsDouble(ts);
4065 return PyFloat_FromDouble(d);
4066}
4067
Victor Stinner95e9cef2015-03-28 01:26:47 +01004068static PyObject *
4069test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4070{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004071 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004072 int round;
4073 _PyTime_t t;
4074 struct timeval tv;
4075 PyObject *seconds;
4076
Victor Stinnerc29b5852017-11-02 07:28:27 -07004077 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004078 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004079 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004080 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004081 }
4082 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004083 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004084 }
4085 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4086 return NULL;
4087 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004088
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004089 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004090 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004091 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004092 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004093 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4094}
4095
Victor Stinner34dc0f42015-03-27 18:19:03 +01004096#ifdef HAVE_CLOCK_GETTIME
4097static PyObject *
4098test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4099{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004100 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004101 _PyTime_t t;
4102 struct timespec ts;
4103
Victor Stinnerc29b5852017-11-02 07:28:27 -07004104 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004105 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004106 }
4107 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004108 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004109 }
4110 if (_PyTime_AsTimespec(t, &ts) == -1) {
4111 return NULL;
4112 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004113 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4114}
4115#endif
4116
Victor Stinner62d1c702015-04-01 17:47:07 +02004117static PyObject *
4118test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4119{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004120 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004121 int round;
4122 _PyTime_t t, ms;
4123
Victor Stinnerc29b5852017-11-02 07:28:27 -07004124 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004125 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004126 }
4127 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004128 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004129 }
4130 if (check_time_rounding(round) < 0) {
4131 return NULL;
4132 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004133 ms = _PyTime_AsMilliseconds(t, round);
4134 /* This conversion rely on the fact that _PyTime_t is a number of
4135 nanoseconds */
4136 return _PyTime_AsNanosecondsObject(ms);
4137}
4138
4139static PyObject *
4140test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4141{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004142 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004143 int round;
4144 _PyTime_t t, ms;
4145
Victor Stinnerc29b5852017-11-02 07:28:27 -07004146 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004147 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004148 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004149 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004150 }
4151 if (check_time_rounding(round) < 0) {
4152 return NULL;
4153 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004154 ms = _PyTime_AsMicroseconds(t, round);
4155 /* This conversion rely on the fact that _PyTime_t is a number of
4156 nanoseconds */
4157 return _PyTime_AsNanosecondsObject(ms);
4158}
4159
Victor Stinner50856d52015-10-13 00:11:21 +02004160static PyObject*
4161get_recursion_depth(PyObject *self, PyObject *args)
4162{
4163 PyThreadState *tstate = PyThreadState_GET();
4164
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07004165 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02004166 return PyLong_FromLong(tstate->recursion_depth - 1);
4167}
4168
Victor Stinner34be8072016-03-14 12:04:26 +01004169static PyObject*
4170pymem_buffer_overflow(PyObject *self, PyObject *args)
4171{
4172 char *buffer;
4173
4174 /* Deliberate buffer overflow to check that PyMem_Free() detects
4175 the overflow when debug hooks are installed. */
4176 buffer = PyMem_Malloc(16);
4177 buffer[16] = 'x';
4178 PyMem_Free(buffer);
4179
4180 Py_RETURN_NONE;
4181}
4182
4183static PyObject*
4184pymem_api_misuse(PyObject *self, PyObject *args)
4185{
4186 char *buffer;
4187
4188 /* Deliberate misusage of Python allocators:
4189 allococate with PyMem but release with PyMem_Raw. */
4190 buffer = PyMem_Malloc(16);
4191 PyMem_RawFree(buffer);
4192
4193 Py_RETURN_NONE;
4194}
4195
Victor Stinnerc4aec362016-03-14 22:26:53 +01004196static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004197pymem_malloc_without_gil(PyObject *self, PyObject *args)
4198{
4199 char *buffer;
4200
4201 /* Deliberate bug to test debug hooks on Python memory allocators:
4202 call PyMem_Malloc() without holding the GIL */
4203 Py_BEGIN_ALLOW_THREADS
4204 buffer = PyMem_Malloc(10);
4205 Py_END_ALLOW_THREADS
4206
4207 PyMem_Free(buffer);
4208
4209 Py_RETURN_NONE;
4210}
4211
Victor Stinner5d39e042017-11-29 17:20:38 +01004212
4213static PyObject*
4214test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4215{
4216 const char *name = _PyMem_GetAllocatorsName();
4217 if (name == NULL) {
4218 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4219 return NULL;
4220 }
4221 return PyUnicode_FromString(name);
4222}
4223
4224
Victor Stinnerad524372016-03-16 12:12:53 +01004225static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004226pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4227{
4228 char *buffer;
4229
Victor Stinnerad524372016-03-16 12:12:53 +01004230 /* Deliberate bug to test debug hooks on Python memory allocators:
4231 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004232 Py_BEGIN_ALLOW_THREADS
4233 buffer = PyObject_Malloc(10);
4234 Py_END_ALLOW_THREADS
4235
4236 PyObject_Free(buffer);
4237
4238 Py_RETURN_NONE;
4239}
4240
Victor Stinner10b73e12016-03-22 13:39:05 +01004241static PyObject *
4242tracemalloc_track(PyObject *self, PyObject *args)
4243{
4244 unsigned int domain;
4245 PyObject *ptr_obj;
4246 void *ptr;
4247 Py_ssize_t size;
4248 int release_gil = 0;
4249 int res;
4250
4251 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4252 return NULL;
4253 ptr = PyLong_AsVoidPtr(ptr_obj);
4254 if (PyErr_Occurred())
4255 return NULL;
4256
4257 if (release_gil) {
4258 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004259 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004260 Py_END_ALLOW_THREADS
4261 }
4262 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004263 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004264 }
4265
4266 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004267 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004268 return NULL;
4269 }
4270
4271 Py_RETURN_NONE;
4272}
4273
4274static PyObject *
4275tracemalloc_untrack(PyObject *self, PyObject *args)
4276{
4277 unsigned int domain;
4278 PyObject *ptr_obj;
4279 void *ptr;
4280 int res;
4281
4282 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4283 return NULL;
4284 ptr = PyLong_AsVoidPtr(ptr_obj);
4285 if (PyErr_Occurred())
4286 return NULL;
4287
Victor Stinner5ea4c062017-06-20 17:46:36 +02004288 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004289 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004290 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004291 return NULL;
4292 }
4293
4294 Py_RETURN_NONE;
4295}
4296
4297static PyObject *
4298tracemalloc_get_traceback(PyObject *self, PyObject *args)
4299{
4300 unsigned int domain;
4301 PyObject *ptr_obj;
4302 void *ptr;
4303
4304 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4305 return NULL;
4306 ptr = PyLong_AsVoidPtr(ptr_obj);
4307 if (PyErr_Occurred())
4308 return NULL;
4309
Benjamin Petersonca470632016-09-06 13:47:26 -07004310 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004311}
4312
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004313static PyObject *
4314dict_get_version(PyObject *self, PyObject *args)
4315{
4316 PyDictObject *dict;
4317 uint64_t version;
4318
4319 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4320 return NULL;
4321
4322 version = dict->ma_version_tag;
4323
4324 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4325 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4326}
4327
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004328
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004329static PyObject *
4330raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4331{
4332 PyGenObject *gen;
4333
4334 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4335 return NULL;
4336
4337 /* This is used in a test to check what happens if a signal arrives just
4338 as we're in the process of entering a yield from chain (see
4339 bpo-30039).
4340
4341 Needs to be done in C, because:
4342 - we don't have a Python wrapper for raise()
4343 - we need to make sure that the Python-level signal handler doesn't run
4344 *before* we enter the generator frame, which is impossible in Python
4345 because we check for signals before every bytecode operation.
4346 */
4347 raise(SIGINT);
4348 return _PyGen_Send(gen, Py_None);
4349}
4350
4351
Victor Stinner3b5cf852017-06-09 16:48:45 +02004352static int
4353fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4354{
4355 if (args == Py_None) {
4356 *stack = NULL;
4357 *nargs = 0;
4358 }
4359 else if (PyTuple_Check(args)) {
4360 *stack = &PyTuple_GET_ITEM(args, 0);
4361 *nargs = PyTuple_GET_SIZE(args);
4362 }
4363 else {
4364 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4365 return -1;
4366 }
4367 return 0;
4368}
4369
4370
4371static PyObject *
4372test_pyobject_fastcall(PyObject *self, PyObject *args)
4373{
4374 PyObject *func, *func_args;
4375 PyObject **stack;
4376 Py_ssize_t nargs;
4377
4378 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4379 return NULL;
4380 }
4381
4382 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4383 return NULL;
4384 }
4385 return _PyObject_FastCall(func, stack, nargs);
4386}
4387
4388
4389static PyObject *
4390test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4391{
4392 PyObject *func, *func_args, *kwargs;
4393 PyObject **stack;
4394 Py_ssize_t nargs;
4395
4396 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4397 return NULL;
4398 }
4399
4400 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4401 return NULL;
4402 }
4403
4404 if (kwargs == Py_None) {
4405 kwargs = NULL;
4406 }
4407 else if (!PyDict_Check(kwargs)) {
4408 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4409 return NULL;
4410 }
4411
4412 return _PyObject_FastCallDict(func, stack, nargs, kwargs);
4413}
4414
4415
4416static PyObject *
4417test_pyobject_fastcallkeywords(PyObject *self, PyObject *args)
4418{
4419 PyObject *func, *func_args, *kwnames = NULL;
4420 PyObject **stack;
4421 Py_ssize_t nargs, nkw;
4422
4423 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4424 return NULL;
4425 }
4426
4427 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4428 return NULL;
4429 }
4430
4431 if (kwnames == Py_None) {
4432 kwnames = NULL;
4433 }
4434 else if (PyTuple_Check(kwnames)) {
4435 nkw = PyTuple_GET_SIZE(kwnames);
4436 if (nargs < nkw) {
4437 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4438 return NULL;
4439 }
4440 nargs -= nkw;
4441 }
4442 else {
4443 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4444 return NULL;
4445 }
4446 return _PyObject_FastCallKeywords(func, stack, nargs, kwnames);
4447}
4448
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004449
Victor Stinner64fa4492017-07-10 14:37:49 +02004450static PyObject*
4451stack_pointer(PyObject *self, PyObject *args)
4452{
4453 int v = 5;
4454 return PyLong_FromVoidPtr(&v);
4455}
4456
Victor Stinner3b5cf852017-06-09 16:48:45 +02004457
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004458#ifdef W_STOPCODE
4459static PyObject*
4460py_w_stopcode(PyObject *self, PyObject *args)
4461{
4462 int sig, status;
4463 if (!PyArg_ParseTuple(args, "i", &sig)) {
4464 return NULL;
4465 }
4466 status = W_STOPCODE(sig);
4467 return PyLong_FromLong(status);
4468}
4469#endif
4470
4471
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004472static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03004473get_mapping_keys(PyObject* self, PyObject *obj)
4474{
4475 return PyMapping_Keys(obj);
4476}
4477
4478static PyObject *
4479get_mapping_values(PyObject* self, PyObject *obj)
4480{
4481 return PyMapping_Values(obj);
4482}
4483
4484static PyObject *
4485get_mapping_items(PyObject* self, PyObject *obj)
4486{
4487 return PyMapping_Items(obj);
4488}
4489
4490
4491static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004492test_pythread_tss_key_state(PyObject *self, PyObject *args)
4493{
4494 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
4495 if (PyThread_tss_is_created(&tss_key)) {
4496 return raiseTestError("test_pythread_tss_key_state",
4497 "TSS key not in an uninitialized state at "
4498 "creation time");
4499 }
4500 if (PyThread_tss_create(&tss_key) != 0) {
4501 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
4502 return NULL;
4503 }
4504 if (!PyThread_tss_is_created(&tss_key)) {
4505 return raiseTestError("test_pythread_tss_key_state",
4506 "PyThread_tss_create succeeded, "
4507 "but with TSS key in an uninitialized state");
4508 }
4509 if (PyThread_tss_create(&tss_key) != 0) {
4510 return raiseTestError("test_pythread_tss_key_state",
4511 "PyThread_tss_create unsuccessful with "
4512 "an already initialized key");
4513 }
4514#define CHECK_TSS_API(expr) \
4515 (void)(expr); \
4516 if (!PyThread_tss_is_created(&tss_key)) { \
4517 return raiseTestError("test_pythread_tss_key_state", \
4518 "TSS key initialization state was not " \
4519 "preserved after calling " #expr); }
4520 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
4521 CHECK_TSS_API(PyThread_tss_get(&tss_key));
4522#undef CHECK_TSS_API
4523 PyThread_tss_delete(&tss_key);
4524 if (PyThread_tss_is_created(&tss_key)) {
4525 return raiseTestError("test_pythread_tss_key_state",
4526 "PyThread_tss_delete called, but did not "
4527 "set the key state to uninitialized");
4528 }
4529
4530 Py_tss_t *ptr_key = PyThread_tss_alloc();
4531 if (ptr_key == NULL) {
4532 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
4533 return NULL;
4534 }
4535 if (PyThread_tss_is_created(ptr_key)) {
4536 return raiseTestError("test_pythread_tss_key_state",
4537 "TSS key not in an uninitialized state at "
4538 "allocation time");
4539 }
4540 PyThread_tss_free(ptr_key);
4541 ptr_key = NULL;
4542 Py_RETURN_NONE;
4543}
4544
4545
Yury Selivanovf23746a2018-01-22 19:11:18 -05004546static PyObject*
4547new_hamt(PyObject *self, PyObject *args)
4548{
4549 return _PyContext_NewHamtForTests();
4550}
4551
4552
Victor Stinner3d4226a2018-08-29 22:21:32 +02004553static PyObject *
4554encode_locale_ex(PyObject *self, PyObject *args)
4555{
4556 PyObject *unicode;
4557 int current_locale = 0;
4558 wchar_t *wstr;
4559 PyObject *res = NULL;
4560 const char *errors = NULL;
4561
4562 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
4563 return NULL;
4564 }
4565 wstr = PyUnicode_AsWideCharString(unicode, NULL);
4566 if (wstr == NULL) {
4567 return NULL;
4568 }
4569 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
4570
4571 char *str = NULL;
4572 size_t error_pos;
4573 const char *reason = NULL;
4574 int ret = _Py_EncodeLocaleEx(wstr,
4575 &str, &error_pos, &reason,
4576 current_locale, error_handler);
4577 PyMem_Free(wstr);
4578
4579 switch(ret) {
4580 case 0:
4581 res = PyBytes_FromString(str);
4582 PyMem_RawFree(str);
4583 break;
4584 case -1:
4585 PyErr_NoMemory();
4586 break;
4587 case -2:
4588 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
4589 error_pos, reason);
4590 break;
4591 case -3:
4592 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
4593 break;
4594 default:
4595 PyErr_SetString(PyExc_ValueError, "unknow error code");
4596 break;
4597 }
4598 return res;
4599}
4600
4601
4602static PyObject *
4603decode_locale_ex(PyObject *self, PyObject *args)
4604{
4605 char *str;
4606 int current_locale = 0;
4607 PyObject *res = NULL;
4608 const char *errors = NULL;
4609
4610 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
4611 return NULL;
4612 }
4613 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
4614
4615 wchar_t *wstr = NULL;
4616 size_t wlen = 0;
4617 const char *reason = NULL;
4618 int ret = _Py_DecodeLocaleEx(str,
4619 &wstr, &wlen, &reason,
4620 current_locale, error_handler);
4621
4622 switch(ret) {
4623 case 0:
4624 res = PyUnicode_FromWideChar(wstr, wlen);
4625 PyMem_RawFree(wstr);
4626 break;
4627 case -1:
4628 PyErr_NoMemory();
4629 break;
4630 case -2:
4631 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
4632 wlen, reason);
4633 break;
4634 case -3:
4635 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
4636 break;
4637 default:
4638 PyErr_SetString(PyExc_ValueError, "unknow error code");
4639 break;
4640 }
4641 return res;
4642}
4643
4644
Victor Stinner2094c2b2018-09-03 17:06:39 +02004645static PyObject *
4646get_coreconfig(PyObject *self, PyObject *Py_UNUSED(args))
4647{
4648 PyInterpreterState *interp = _PyInterpreterState_Get();
4649 const _PyCoreConfig *config = &interp->core_config;
4650 PyObject *dict, *obj;
4651
4652 dict = PyDict_New();
4653 if (dict == NULL) {
4654 return NULL;
4655 }
4656
4657#define FROM_STRING(STR) \
4658 ((STR != NULL) ? \
4659 PyUnicode_FromString(STR) \
4660 : (Py_INCREF(Py_None), Py_None))
4661#define FROM_WSTRING(STR) \
4662 ((STR != NULL) ? \
4663 PyUnicode_FromWideChar(STR, -1) \
4664 : (Py_INCREF(Py_None), Py_None))
4665#define SET_ITEM(KEY, EXPR) \
4666 do { \
4667 obj = (EXPR); \
4668 if (obj == NULL) { \
4669 return NULL; \
4670 } \
4671 int res = PyDict_SetItemString(dict, (KEY), obj); \
4672 Py_DECREF(obj); \
4673 if (res < 0) { \
4674 goto fail; \
4675 } \
4676 } while (0)
4677
4678 SET_ITEM("install_signal_handlers",
4679 PyLong_FromLong(config->install_signal_handlers));
4680 SET_ITEM("use_environment",
4681 PyLong_FromLong(config->use_environment));
4682 SET_ITEM("use_hash_seed",
4683 PyLong_FromLong(config->use_hash_seed));
4684 SET_ITEM("hash_seed",
4685 PyLong_FromUnsignedLong(config->hash_seed));
4686 SET_ITEM("allocator",
4687 FROM_STRING(config->allocator));
4688 SET_ITEM("dev_mode",
4689 PyLong_FromLong(config->dev_mode));
4690 SET_ITEM("faulthandler",
4691 PyLong_FromLong(config->faulthandler));
4692 SET_ITEM("tracemalloc",
4693 PyLong_FromLong(config->tracemalloc));
4694 SET_ITEM("import_time",
4695 PyLong_FromLong(config->import_time));
4696 SET_ITEM("show_ref_count",
4697 PyLong_FromLong(config->show_ref_count));
4698 SET_ITEM("show_alloc_count",
4699 PyLong_FromLong(config->show_alloc_count));
4700 SET_ITEM("dump_refs",
4701 PyLong_FromLong(config->dump_refs));
4702 SET_ITEM("malloc_stats",
4703 PyLong_FromLong(config->malloc_stats));
4704 SET_ITEM("coerce_c_locale",
4705 PyLong_FromLong(config->coerce_c_locale));
4706 SET_ITEM("coerce_c_locale_warn",
4707 PyLong_FromLong(config->coerce_c_locale_warn));
4708 SET_ITEM("filesystem_encoding",
4709 FROM_STRING(config->filesystem_encoding));
4710 SET_ITEM("filesystem_errors",
4711 FROM_STRING(config->filesystem_errors));
4712 SET_ITEM("stdio_encoding",
4713 FROM_STRING(config->stdio_encoding));
4714 SET_ITEM("utf8_mode",
4715 PyLong_FromLong(config->utf8_mode));
4716 SET_ITEM("pycache_prefix",
4717 FROM_WSTRING(config->pycache_prefix));
4718 SET_ITEM("program_name",
4719 FROM_WSTRING(config->program_name));
4720 SET_ITEM("argv",
4721 _Py_wstrlist_as_pylist(config->argc, config->argv));
4722 SET_ITEM("program",
4723 FROM_WSTRING(config->program));
4724 SET_ITEM("warnoptions",
4725 _Py_wstrlist_as_pylist(config->nwarnoption, config->warnoptions));
4726 SET_ITEM("module_search_path_env",
4727 FROM_WSTRING(config->module_search_path_env));
4728 SET_ITEM("home",
4729 FROM_WSTRING(config->home));
4730 SET_ITEM("module_search_paths",
4731 _Py_wstrlist_as_pylist(config->nmodule_search_path, config->module_search_paths));
4732 SET_ITEM("executable",
4733 FROM_WSTRING(config->executable));
4734 SET_ITEM("prefix",
4735 FROM_WSTRING(config->prefix));
4736 SET_ITEM("base_prefix",
4737 FROM_WSTRING(config->base_prefix));
4738 SET_ITEM("exec_prefix",
4739 FROM_WSTRING(config->exec_prefix));
4740 SET_ITEM("base_exec_prefix",
4741 FROM_WSTRING(config->base_exec_prefix));
4742#ifdef MS_WINDOWS
4743 SET_ITEM("dll_path",
4744 FROM_WSTRING(config->dll_path));
4745#endif
4746 SET_ITEM("isolated",
4747 PyLong_FromLong(config->isolated));
4748 SET_ITEM("site_import",
4749 PyLong_FromLong(config->site_import));
4750 SET_ITEM("bytes_warning",
4751 PyLong_FromLong(config->bytes_warning));
4752 SET_ITEM("inspect",
4753 PyLong_FromLong(config->inspect));
4754 SET_ITEM("interactive",
4755 PyLong_FromLong(config->interactive));
4756 SET_ITEM("optimization_level",
4757 PyLong_FromLong(config->optimization_level));
4758 SET_ITEM("parser_debug",
4759 PyLong_FromLong(config->parser_debug));
4760 SET_ITEM("write_bytecode",
4761 PyLong_FromLong(config->write_bytecode));
4762 SET_ITEM("verbose",
4763 PyLong_FromLong(config->verbose));
4764 SET_ITEM("quiet",
4765 PyLong_FromLong(config->quiet));
4766 SET_ITEM("user_site_directory",
4767 PyLong_FromLong(config->user_site_directory));
4768 SET_ITEM("buffered_stdio",
4769 PyLong_FromLong(config->buffered_stdio));
4770 SET_ITEM("stdio_encoding",
4771 FROM_STRING(config->stdio_encoding));
4772 SET_ITEM("stdio_errors",
4773 FROM_STRING(config->stdio_errors));
4774#ifdef MS_WINDOWS
4775 SET_ITEM("legacy_windows_fs_encoding",
4776 PyLong_FromLong(config->legacy_windows_fs_encoding));
4777 SET_ITEM("legacy_windows_stdio",
4778 PyLong_FromLong(config->legacy_windows_stdio));
4779#endif
4780 SET_ITEM("_install_importlib",
4781 PyLong_FromLong(config->_install_importlib));
4782 SET_ITEM("_check_hash_pycs_mode",
4783 FROM_STRING(config->_check_hash_pycs_mode));
4784 SET_ITEM("_frozen",
4785 PyLong_FromLong(config->_frozen));
4786
4787 return dict;
4788
4789fail:
4790 Py_DECREF(dict);
4791 return NULL;
4792
4793#undef FROM_STRING
4794#undef FROM_WSTRING
4795#undef SET_ITEM
4796}
4797
4798
Tim Peters9ea17ac2001-02-02 05:57:15 +00004799static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004800 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304801 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02004802 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304803 {"test_config", test_config, METH_NOARGS},
4804 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004805 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05004806 {"datetime_check_date", datetime_check_date, METH_VARARGS},
4807 {"datetime_check_time", datetime_check_time, METH_VARARGS},
4808 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
4809 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
4810 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
4811 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05004812 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05004813 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304814 {"test_list_api", test_list_api, METH_NOARGS},
4815 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02004816 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01004817 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304818 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
4819 {"test_long_api", test_long_api, METH_NOARGS},
4820 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
4821 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
4822 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
4823 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
4824 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
4825 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
4826 {"test_long_as_double", test_long_as_double, METH_NOARGS},
4827 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
4828 {"test_long_numbits", test_long_numbits, METH_NOARGS},
4829 {"test_k_code", test_k_code, METH_NOARGS},
4830 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07004831 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304832 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004833 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304834 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004835 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304836 {"test_string_to_double", test_string_to_double, METH_NOARGS},
4837 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
4838 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004839 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01004840 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004841#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01004842 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004843#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01004844 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03004845 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03004846 {"get_args", get_args, METH_VARARGS},
4847 {"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004848 {"getargs_tuple", getargs_tuple, METH_VARARGS},
4849 {"getargs_keywords", (PyCFunction)getargs_keywords,
4850 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00004851 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
4852 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03004853 {"getargs_positional_only_and_keywords",
4854 (PyCFunction)getargs_positional_only_and_keywords,
4855 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004856 {"getargs_b", getargs_b, METH_VARARGS},
4857 {"getargs_B", getargs_B, METH_VARARGS},
4858 {"getargs_h", getargs_h, METH_VARARGS},
4859 {"getargs_H", getargs_H, METH_VARARGS},
4860 {"getargs_I", getargs_I, METH_VARARGS},
4861 {"getargs_k", getargs_k, METH_VARARGS},
4862 {"getargs_i", getargs_i, METH_VARARGS},
4863 {"getargs_l", getargs_l, METH_VARARGS},
4864 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07004865 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004866 {"getargs_L", getargs_L, METH_VARARGS},
4867 {"getargs_K", getargs_K, METH_VARARGS},
4868 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304869 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
4870 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03004871 {"getargs_f", getargs_f, METH_VARARGS},
4872 {"getargs_d", getargs_d, METH_VARARGS},
4873 {"getargs_D", getargs_D, METH_VARARGS},
4874 {"getargs_S", getargs_S, METH_VARARGS},
4875 {"getargs_Y", getargs_Y, METH_VARARGS},
4876 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03004877 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004878 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00004879 {"getargs_s", getargs_s, METH_VARARGS},
4880 {"getargs_s_star", getargs_s_star, METH_VARARGS},
4881 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
4882 {"getargs_z", getargs_z, METH_VARARGS},
4883 {"getargs_z_star", getargs_z_star, METH_VARARGS},
4884 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
4885 {"getargs_y", getargs_y, METH_VARARGS},
4886 {"getargs_y_star", getargs_y_star, METH_VARARGS},
4887 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
4888 {"getargs_u", getargs_u, METH_VARARGS},
4889 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
4890 {"getargs_Z", getargs_Z, METH_VARARGS},
4891 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00004892 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004893 {"getargs_es", getargs_es, METH_VARARGS},
4894 {"getargs_et", getargs_et, METH_VARARGS},
4895 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
4896 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004897 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004898 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004899 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004900 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304901 {"test_s_code", test_s_code, METH_NOARGS},
4902 {"test_u_code", test_u_code, METH_NOARGS},
4903 {"test_Z_code", test_Z_code, METH_NOARGS},
4904 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004905 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
4906 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03004907 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08004908 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03004909 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004910 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
4911 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01004912 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004913 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004915#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00004916 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004917#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00004918 {"traceback_print", traceback_print, METH_VARARGS},
4919 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02004920 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004921 {"argparsing", argparsing, METH_VARARGS},
4922 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004923 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
4924 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304925 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00004926 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304927 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004928 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01004929 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
4930 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01004931 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02004932 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04004933 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304934 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
4935 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
4936 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
4937 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02004938 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
4939 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304940 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02004941 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004942 {"no_docstring",
4943 (PyCFunction)test_with_docstring, METH_NOARGS},
4944 {"docstring_empty",
4945 (PyCFunction)test_with_docstring, METH_NOARGS,
4946 docstring_empty},
4947 {"docstring_no_signature",
4948 (PyCFunction)test_with_docstring, METH_NOARGS,
4949 docstring_no_signature},
4950 {"docstring_with_invalid_signature",
4951 (PyCFunction)test_with_docstring, METH_NOARGS,
4952 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004953 {"docstring_with_invalid_signature2",
4954 (PyCFunction)test_with_docstring, METH_NOARGS,
4955 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004956 {"docstring_with_signature",
4957 (PyCFunction)test_with_docstring, METH_NOARGS,
4958 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004959 {"docstring_with_signature_but_no_doc",
4960 (PyCFunction)test_with_docstring, METH_NOARGS,
4961 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004962 {"docstring_with_signature_and_extra_newlines",
4963 (PyCFunction)test_with_docstring, METH_NOARGS,
4964 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004965 {"docstring_with_signature_with_defaults",
4966 (PyCFunction)test_with_docstring, METH_NOARGS,
4967 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02004968 {"raise_signal",
4969 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004970 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4971 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02004972 {"pymarshal_write_long_to_file",
4973 pymarshal_write_long_to_file, METH_VARARGS},
4974 {"pymarshal_write_object_to_file",
4975 pymarshal_write_object_to_file, METH_VARARGS},
4976 {"pymarshal_read_short_from_file",
4977 pymarshal_read_short_from_file, METH_VARARGS},
4978 {"pymarshal_read_long_from_file",
4979 pymarshal_read_long_from_file, METH_VARARGS},
4980 {"pymarshal_read_last_object_from_file",
4981 pymarshal_read_last_object_from_file, METH_VARARGS},
4982 {"pymarshal_read_object_from_file",
4983 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004984 {"return_null_without_error",
4985 return_null_without_error, METH_NOARGS},
4986 {"return_result_with_error",
4987 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004988 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004989 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4990 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004991 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004992#ifdef HAVE_CLOCK_GETTIME
4993 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4994#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004995 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4996 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004997 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be8072016-03-14 12:04:26 +01004998 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
4999 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005000 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005001 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005002 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005003 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5004 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5005 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005006 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005007 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005008 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5009 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
5010 {"pyobject_fastcallkeywords", test_pyobject_fastcallkeywords, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005011 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005012#ifdef W_STOPCODE
5013 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5014#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005015 {"get_mapping_keys", get_mapping_keys, METH_O},
5016 {"get_mapping_values", get_mapping_values, METH_O},
5017 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005018 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005019 {"hamt", new_hamt, METH_NOARGS},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005020 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5021 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner2094c2b2018-09-03 17:06:39 +02005022 {"get_coreconfig", get_coreconfig, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005023 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005024};
5025
Thomas Hellera4ea6032003-04-17 18:55:45 +00005026#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5027
Thomas Wouters89f507f2006-12-13 04:49:30 +00005028typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005029 char bool_member;
5030 char byte_member;
5031 unsigned char ubyte_member;
5032 short short_member;
5033 unsigned short ushort_member;
5034 int int_member;
5035 unsigned int uint_member;
5036 long long_member;
5037 unsigned long ulong_member;
5038 Py_ssize_t pyssizet_member;
5039 float float_member;
5040 double double_member;
5041 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005042 long long longlong_member;
5043 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005044} all_structmembers;
5045
5046typedef struct {
5047 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005048 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005049} test_structmembers;
5050
5051static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005052 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5053 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5054 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5055 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5056 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5057 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5058 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5059 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5060 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5061 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5062 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5063 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5064 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5066 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005067 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005068};
5069
5070
Christian Heimes1af737c2008-01-23 08:24:23 +00005071static PyObject *
5072test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074 static char *keywords[] = {
5075 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5076 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5077 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005079 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005080 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 test_structmembers *ob;
5082 const char *s = NULL;
5083 Py_ssize_t string_len = 0;
5084 ob = PyObject_New(test_structmembers, type);
5085 if (ob == NULL)
5086 return NULL;
5087 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5088 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5089 &ob->structmembers.bool_member,
5090 &ob->structmembers.byte_member,
5091 &ob->structmembers.ubyte_member,
5092 &ob->structmembers.short_member,
5093 &ob->structmembers.ushort_member,
5094 &ob->structmembers.int_member,
5095 &ob->structmembers.uint_member,
5096 &ob->structmembers.long_member,
5097 &ob->structmembers.ulong_member,
5098 &ob->structmembers.pyssizet_member,
5099 &ob->structmembers.float_member,
5100 &ob->structmembers.double_member,
5101 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102 , &ob->structmembers.longlong_member,
5103 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 )) {
5105 Py_DECREF(ob);
5106 return NULL;
5107 }
5108 if (s != NULL) {
5109 if (string_len > 5) {
5110 Py_DECREF(ob);
5111 PyErr_SetString(PyExc_ValueError, "string too long");
5112 return NULL;
5113 }
5114 strcpy(ob->structmembers.inplace_member, s);
5115 }
5116 else {
5117 strcpy(ob->structmembers.inplace_member, "");
5118 }
5119 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005120}
5121
Christian Heimes1af737c2008-01-23 08:24:23 +00005122static void
5123test_structmembers_free(PyObject *ob)
5124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005125 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005126}
5127
5128static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005129 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005130 "test_structmembersType",
5131 sizeof(test_structmembers), /* tp_basicsize */
5132 0, /* tp_itemsize */
5133 test_structmembers_free, /* destructor tp_dealloc */
5134 0, /* tp_print */
5135 0, /* tp_getattr */
5136 0, /* tp_setattr */
5137 0, /* tp_reserved */
5138 0, /* tp_repr */
5139 0, /* tp_as_number */
5140 0, /* tp_as_sequence */
5141 0, /* tp_as_mapping */
5142 0, /* tp_hash */
5143 0, /* tp_call */
5144 0, /* tp_str */
5145 PyObject_GenericGetAttr, /* tp_getattro */
5146 PyObject_GenericSetAttr, /* tp_setattro */
5147 0, /* tp_as_buffer */
5148 0, /* tp_flags */
5149 "Type containing all structmember types",
5150 0, /* traverseproc tp_traverse */
5151 0, /* tp_clear */
5152 0, /* tp_richcompare */
5153 0, /* tp_weaklistoffset */
5154 0, /* tp_iter */
5155 0, /* tp_iternext */
5156 0, /* tp_methods */
5157 test_members, /* tp_members */
5158 0,
5159 0,
5160 0,
5161 0,
5162 0,
5163 0,
5164 0,
5165 0,
5166 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005167};
5168
5169
Benjamin Petersond51374e2014-04-09 23:55:56 -04005170typedef struct {
5171 PyObject_HEAD
5172} matmulObject;
5173
5174static PyObject *
5175matmulType_matmul(PyObject *self, PyObject *other)
5176{
5177 return Py_BuildValue("(sOO)", "matmul", self, other);
5178}
5179
5180static PyObject *
5181matmulType_imatmul(PyObject *self, PyObject *other)
5182{
5183 return Py_BuildValue("(sOO)", "imatmul", self, other);
5184}
5185
5186static void
5187matmulType_dealloc(PyObject *self)
5188{
Zachary Ware420dc562014-04-23 13:51:27 -05005189 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005190}
5191
5192static PyNumberMethods matmulType_as_number = {
5193 0, /* nb_add */
5194 0, /* nb_subtract */
5195 0, /* nb_multiply */
5196 0, /* nb_remainde r*/
5197 0, /* nb_divmod */
5198 0, /* nb_power */
5199 0, /* nb_negative */
5200 0, /* tp_positive */
5201 0, /* tp_absolute */
5202 0, /* tp_bool */
5203 0, /* nb_invert */
5204 0, /* nb_lshift */
5205 0, /* nb_rshift */
5206 0, /* nb_and */
5207 0, /* nb_xor */
5208 0, /* nb_or */
5209 0, /* nb_int */
5210 0, /* nb_reserved */
5211 0, /* nb_float */
5212 0, /* nb_inplace_add */
5213 0, /* nb_inplace_subtract */
5214 0, /* nb_inplace_multiply */
5215 0, /* nb_inplace_remainder */
5216 0, /* nb_inplace_power */
5217 0, /* nb_inplace_lshift */
5218 0, /* nb_inplace_rshift */
5219 0, /* nb_inplace_and */
5220 0, /* nb_inplace_xor */
5221 0, /* nb_inplace_or */
5222 0, /* nb_floor_divide */
5223 0, /* nb_true_divide */
5224 0, /* nb_inplace_floor_divide */
5225 0, /* nb_inplace_true_divide */
5226 0, /* nb_index */
5227 matmulType_matmul, /* nb_matrix_multiply */
5228 matmulType_imatmul /* nb_matrix_inplace_multiply */
5229};
5230
5231static PyTypeObject matmulType = {
5232 PyVarObject_HEAD_INIT(NULL, 0)
5233 "matmulType",
5234 sizeof(matmulObject), /* tp_basicsize */
5235 0, /* tp_itemsize */
5236 matmulType_dealloc, /* destructor tp_dealloc */
5237 0, /* tp_print */
5238 0, /* tp_getattr */
5239 0, /* tp_setattr */
5240 0, /* tp_reserved */
5241 0, /* tp_repr */
5242 &matmulType_as_number, /* tp_as_number */
5243 0, /* tp_as_sequence */
5244 0, /* tp_as_mapping */
5245 0, /* tp_hash */
5246 0, /* tp_call */
5247 0, /* tp_str */
5248 PyObject_GenericGetAttr, /* tp_getattro */
5249 PyObject_GenericSetAttr, /* tp_setattro */
5250 0, /* tp_as_buffer */
5251 0, /* tp_flags */
5252 "C level type with matrix operations defined",
5253 0, /* traverseproc tp_traverse */
5254 0, /* tp_clear */
5255 0, /* tp_richcompare */
5256 0, /* tp_weaklistoffset */
5257 0, /* tp_iter */
5258 0, /* tp_iternext */
5259 0, /* tp_methods */
5260 0, /* tp_members */
5261 0,
5262 0,
5263 0,
5264 0,
5265 0,
5266 0,
5267 0,
5268 0,
5269 PyType_GenericNew, /* tp_new */
5270 PyObject_Del, /* tp_free */
5271};
5272
Martin v. Löwis1a214512008-06-11 05:26:20 +00005273
Yury Selivanov75445082015-05-11 22:57:16 -04005274typedef struct {
5275 PyObject_HEAD
5276 PyObject *ao_iterator;
5277} awaitObject;
5278
5279
5280static PyObject *
5281awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5282{
5283 PyObject *v;
5284 awaitObject *ao;
5285
5286 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
5287 return NULL;
5288
5289 ao = (awaitObject *)type->tp_alloc(type, 0);
5290 if (ao == NULL) {
5291 return NULL;
5292 }
5293
5294 Py_INCREF(v);
5295 ao->ao_iterator = v;
5296
5297 return (PyObject *)ao;
5298}
5299
5300
5301static void
5302awaitObject_dealloc(awaitObject *ao)
5303{
5304 Py_CLEAR(ao->ao_iterator);
5305 Py_TYPE(ao)->tp_free(ao);
5306}
5307
5308
5309static PyObject *
5310awaitObject_await(awaitObject *ao)
5311{
5312 Py_INCREF(ao->ao_iterator);
5313 return ao->ao_iterator;
5314}
5315
5316static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04005317 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04005318 0, /* am_aiter */
5319 0 /* am_anext */
5320};
5321
5322
5323static PyTypeObject awaitType = {
5324 PyVarObject_HEAD_INIT(NULL, 0)
5325 "awaitType",
5326 sizeof(awaitObject), /* tp_basicsize */
5327 0, /* tp_itemsize */
5328 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
5329 0, /* tp_print */
5330 0, /* tp_getattr */
5331 0, /* tp_setattr */
5332 &awaitType_as_async, /* tp_as_async */
5333 0, /* tp_repr */
5334 0, /* tp_as_number */
5335 0, /* tp_as_sequence */
5336 0, /* tp_as_mapping */
5337 0, /* tp_hash */
5338 0, /* tp_call */
5339 0, /* tp_str */
5340 PyObject_GenericGetAttr, /* tp_getattro */
5341 PyObject_GenericSetAttr, /* tp_setattro */
5342 0, /* tp_as_buffer */
5343 0, /* tp_flags */
5344 "C level type with tp_as_async",
5345 0, /* traverseproc tp_traverse */
5346 0, /* tp_clear */
5347 0, /* tp_richcompare */
5348 0, /* tp_weaklistoffset */
5349 0, /* tp_iter */
5350 0, /* tp_iternext */
5351 0, /* tp_methods */
5352 0, /* tp_members */
5353 0,
5354 0,
5355 0,
5356 0,
5357 0,
5358 0,
5359 0,
5360 0,
5361 awaitObject_new, /* tp_new */
5362 PyObject_Del, /* tp_free */
5363};
5364
5365
xdegaye56d1f5c2017-10-26 15:09:06 +02005366static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
5367
5368static PyTypeObject PyRecursingInfinitelyError_Type = {
5369 PyVarObject_HEAD_INIT(NULL, 0)
5370 "RecursingInfinitelyError", /* tp_name */
5371 sizeof(PyBaseExceptionObject), /* tp_basicsize */
5372 0, /* tp_itemsize */
5373 0, /* tp_dealloc */
5374 0, /* tp_print */
5375 0, /* tp_getattr */
5376 0, /* tp_setattr */
5377 0, /* tp_reserved */
5378 0, /* tp_repr */
5379 0, /* tp_as_number */
5380 0, /* tp_as_sequence */
5381 0, /* tp_as_mapping */
5382 0, /* tp_hash */
5383 0, /* tp_call */
5384 0, /* tp_str */
5385 0, /* tp_getattro */
5386 0, /* tp_setattro */
5387 0, /* tp_as_buffer */
5388 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5389 "Instantiating this exception starts infinite recursion.", /* tp_doc */
5390 0, /* tp_traverse */
5391 0, /* tp_clear */
5392 0, /* tp_richcompare */
5393 0, /* tp_weaklistoffset */
5394 0, /* tp_iter */
5395 0, /* tp_iternext */
5396 0, /* tp_methods */
5397 0, /* tp_members */
5398 0, /* tp_getset */
5399 0, /* tp_base */
5400 0, /* tp_dict */
5401 0, /* tp_descr_get */
5402 0, /* tp_descr_set */
5403 0, /* tp_dictoffset */
5404 (initproc)recurse_infinitely_error_init, /* tp_init */
5405 0, /* tp_alloc */
5406 0, /* tp_new */
5407};
5408
5409static int
5410recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
5411{
5412 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
5413
5414 /* Instantiating this exception starts infinite recursion. */
5415 Py_INCREF(type);
5416 PyErr_SetObject(type, NULL);
5417 return -1;
5418}
5419
5420
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005421/* Test PEP 560 */
5422
5423typedef struct {
5424 PyObject_HEAD
5425 PyObject *item;
5426} PyGenericAliasObject;
5427
5428static void
5429generic_alias_dealloc(PyGenericAliasObject *self)
5430{
5431 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01005432 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005433}
5434
5435static PyObject *
5436generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
5437{
5438 return PyTuple_Pack(1, self->item);
5439}
5440
5441static PyMethodDef generic_alias_methods[] = {
5442 {"__mro_entries__", (PyCFunction) generic_alias_mro_entries, METH_O, NULL},
5443 {NULL} /* sentinel */
5444};
5445
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07005446static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005447 PyVarObject_HEAD_INIT(NULL, 0)
5448 "GenericAlias",
5449 sizeof(PyGenericAliasObject),
5450 0,
5451 .tp_dealloc = (destructor)generic_alias_dealloc,
5452 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5453 .tp_methods = generic_alias_methods,
5454};
5455
5456static PyObject *
5457generic_alias_new(PyObject *item)
5458{
5459 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
5460 if (o == NULL) {
5461 return NULL;
5462 }
5463 Py_INCREF(item);
5464 o->item = item;
5465 return (PyObject*) o;
5466}
5467
5468typedef struct {
5469 PyObject_HEAD
5470} PyGenericObject;
5471
5472static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005473generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005474{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005475 return generic_alias_new(item);
5476}
5477
5478static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005479 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005480 {NULL} /* sentinel */
5481};
5482
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07005483static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005484 PyVarObject_HEAD_INIT(NULL, 0)
5485 "Generic",
5486 sizeof(PyGenericObject),
5487 0,
5488 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5489 .tp_methods = generic_methods,
5490};
5491
5492
Martin v. Löwis1a214512008-06-11 05:26:20 +00005493static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005494 PyModuleDef_HEAD_INIT,
5495 "_testcapi",
5496 NULL,
5497 -1,
5498 TestMethods,
5499 NULL,
5500 NULL,
5501 NULL,
5502 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005503};
5504
Nick Coghland5cacbb2015-05-23 22:24:10 +10005505/* Per PEP 489, this module will not be converted to multi-phase initialization
5506 */
5507
Mark Hammond62b1ab12002-07-23 06:31:15 +00005508PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005509PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00005510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005513 m = PyModule_Create(&_testcapimodule);
5514 if (m == NULL)
5515 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00005518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 Py_TYPE(&test_structmembersType)=&PyType_Type;
5520 Py_INCREF(&test_structmembersType);
5521 /* don't use a name starting with "test", since we don't want
5522 test_capi to automatically call this */
5523 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005524 if (PyType_Ready(&matmulType) < 0)
5525 return NULL;
5526 Py_INCREF(&matmulType);
5527 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005528
Yury Selivanov75445082015-05-11 22:57:16 -04005529 if (PyType_Ready(&awaitType) < 0)
5530 return NULL;
5531 Py_INCREF(&awaitType);
5532 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
5533
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005534 if (PyType_Ready(&GenericAlias_Type) < 0)
5535 return NULL;
5536 Py_INCREF(&GenericAlias_Type);
5537 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
5538
5539 if (PyType_Ready(&Generic_Type) < 0)
5540 return NULL;
5541 Py_INCREF(&Generic_Type);
5542 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
5543
xdegaye56d1f5c2017-10-26 15:09:06 +02005544 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
5545 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
5546 return NULL;
5547 }
5548 Py_INCREF(&PyRecursingInfinitelyError_Type);
5549 PyModule_AddObject(m, "RecursingInfinitelyError",
5550 (PyObject *)&PyRecursingInfinitelyError_Type);
5551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005552 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
5553 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
5554 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
5555 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
5556 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
5557 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
5558 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
5559 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
5560 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
5561 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
5562 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
5563 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
5564 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
5565 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
5566 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
5567 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
5568 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
5569 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
5570 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
5571 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
5572 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
5573 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02005574 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 Py_INCREF(&PyInstanceMethod_Type);
5576 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00005577
Larry Hastings2a727912014-01-16 11:32:01 -08005578 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner5d39e042017-11-29 17:20:38 +01005579#ifdef WITH_PYMALLOC
5580 PyModule_AddObject(m, "WITH_PYMALLOC", Py_True);
5581#else
5582 PyModule_AddObject(m, "WITH_PYMALLOC", Py_False);
5583#endif
Larry Hastings2a727912014-01-16 11:32:01 -08005584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005585 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
5586 Py_INCREF(TestError);
5587 PyModule_AddObject(m, "error", TestError);
5588 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005589}