blob: 03a4acbc798475753a255966e6435a31413fc4fb [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
Mark Hammond8d98d2c2003-04-19 15:41:53 +000021#ifdef WITH_THREAD
22#include "pythread.h"
23#endif /* WITH_THREAD */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000024static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000025
Tim Peters91621db2001-06-12 20:10:01 +000026/* Raise TestError with test_name + ": " + msg, and return NULL. */
27
28static PyObject *
29raiseTestError(const char* test_name, const char* msg)
30{
Victor Stinner6ced7c42011-03-21 18:15:42 +010031 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000032 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000033}
34
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000035/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000036
37 The ones derived from autoconf on the UNIX-like OSes can be relied
38 upon (in the absence of sloppy cross-compiling), but the Windows
39 platforms have these hardcoded. Better safe than sorry.
40*/
41static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000042sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000044{
Victor Stinner499dfcf2011-03-21 13:26:24 +010045 PyErr_Format(TestError,
46 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000049}
50
51static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000052test_config(PyObject *self)
Tim Peters9ea17ac2001-02-02 05:57:15 +000053{
Tim Peters9ea17ac2001-02-02 05:57:15 +000054#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000055 if (FATNAME != sizeof(TYPE)) \
56 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 CHECK_SIZEOF(SIZEOF_SHORT, short);
59 CHECK_SIZEOF(SIZEOF_INT, int);
60 CHECK_SIZEOF(SIZEOF_LONG, long);
61 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
62 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Benjamin Petersonaf580df2016-09-06 10:46:49 -070063 CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
Tim Peters9ea17ac2001-02-02 05:57:15 +000064
65#undef CHECK_SIZEOF
66
Serhiy Storchaka228b12e2017-01-23 09:47:21 +020067 Py_RETURN_NONE;
Tim Peters9ea17ac2001-02-02 05:57:15 +000068}
69
Tim Peters5c4d5bf2001-02-12 22:13:26 +000070static PyObject*
Victor Stinner01076552013-10-29 19:39:52 +010071test_sizeof_c_types(PyObject *self)
72{
Ned Deilye37a1942015-03-05 15:47:10 -080073#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020074#pragma GCC diagnostic push
75#pragma GCC diagnostic ignored "-Wtype-limits"
76#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010077#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010078 if (EXPECTED != sizeof(TYPE)) { \
79 PyErr_Format(TestError, \
80 "sizeof(%s) = %u instead of %u", \
81 #TYPE, sizeof(TYPE), EXPECTED); \
82 return (PyObject*)NULL; \
83 }
Victor Stinnerf866f972013-10-29 19:59:31 +010084#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
85#define CHECK_SIGNNESS(TYPE, SIGNED) \
86 if (IS_SIGNED(TYPE) != SIGNED) { \
87 PyErr_Format(TestError, \
88 "%s signness is, instead of %i", \
89 #TYPE, IS_SIGNED(TYPE), SIGNED); \
90 return (PyObject*)NULL; \
91 }
Victor Stinner01076552013-10-29 19:39:52 +010092
93 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +010094 CHECK_SIZEOF(Py_UCS1, 1);
95 CHECK_SIZEOF(Py_UCS2, 2);
96 CHECK_SIZEOF(Py_UCS4, 4);
97 CHECK_SIGNNESS(Py_UCS1, 0);
98 CHECK_SIGNNESS(Py_UCS2, 0);
99 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700100 CHECK_SIZEOF(int32_t, 4);
101 CHECK_SIGNNESS(int32_t, 1);
102 CHECK_SIZEOF(uint32_t, 4);
103 CHECK_SIGNNESS(uint32_t, 0);
104 CHECK_SIZEOF(int64_t, 8);
105 CHECK_SIGNNESS(int64_t, 1);
106 CHECK_SIZEOF(uint64_t, 8);
107 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100108
109 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100110 CHECK_SIZEOF(size_t, sizeof(void *));
111 CHECK_SIGNNESS(size_t, 0);
112 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
113 CHECK_SIGNNESS(Py_ssize_t, 1);
114
Benjamin Petersonca470632016-09-06 13:47:26 -0700115 CHECK_SIZEOF(uintptr_t, sizeof(void *));
116 CHECK_SIGNNESS(uintptr_t, 0);
117 CHECK_SIZEOF(intptr_t, sizeof(void *));
118 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100119
Serhiy Storchakad1302c02017-01-23 10:23:58 +0200120 Py_RETURN_NONE;
Victor Stinner01076552013-10-29 19:39:52 +0100121
Victor Stinnerf866f972013-10-29 19:59:31 +0100122#undef IS_SIGNED
123#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100124#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800125#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200126#pragma GCC diagnostic pop
127#endif
Victor Stinner01076552013-10-29 19:39:52 +0100128}
129
130
131static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000132test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 PyObject* list;
135 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000138#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 list = PyList_New(NLIST);
140 if (list == (PyObject*)NULL)
141 return (PyObject*)NULL;
142 /* list = range(NLIST) */
143 for (i = 0; i < NLIST; ++i) {
144 PyObject* anint = PyLong_FromLong(i);
145 if (anint == (PyObject*)NULL) {
146 Py_DECREF(list);
147 return (PyObject*)NULL;
148 }
149 PyList_SET_ITEM(list, i, anint);
150 }
151 /* list.reverse(), via PyList_Reverse() */
152 i = PyList_Reverse(list); /* should not blow up! */
153 if (i != 0) {
154 Py_DECREF(list);
155 return (PyObject*)NULL;
156 }
157 /* Check that list == range(29, -1, -1) now */
158 for (i = 0; i < NLIST; ++i) {
159 PyObject* anint = PyList_GET_ITEM(list, i);
160 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
161 PyErr_SetString(TestError,
162 "test_list_api: reverse screwed up");
163 Py_DECREF(list);
164 return (PyObject*)NULL;
165 }
166 }
167 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000168#undef NLIST
169
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200170 Py_RETURN_NONE;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000171}
172
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000173static int
174test_dict_inner(int count)
175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 Py_ssize_t pos = 0, iterations = 0;
177 int i;
178 PyObject *dict = PyDict_New();
179 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 if (dict == NULL)
182 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 for (i = 0; i < count; i++) {
185 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200186 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200187 return -1;
188 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200189 if (PyDict_SetItem(dict, v, v) < 0) {
190 Py_DECREF(v);
191 return -1;
192 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193 Py_DECREF(v);
194 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000196 while (PyDict_Next(dict, &pos, &k, &v)) {
197 PyObject *o;
198 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 i = PyLong_AS_LONG(v) + 1;
201 o = PyLong_FromLong(i);
202 if (o == NULL)
203 return -1;
204 if (PyDict_SetItem(dict, k, o) < 0) {
205 Py_DECREF(o);
206 return -1;
207 }
208 Py_DECREF(o);
209 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 if (iterations != count) {
214 PyErr_SetString(
215 TestError,
216 "test_dict_iteration: dict iteration went wrong ");
217 return -1;
218 } else {
219 return 0;
220 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000221}
222
223static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000224test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 for (i = 0; i < 200; i++) {
229 if (test_dict_inner(i) < 0) {
230 return NULL;
231 }
232 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000233
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200234 Py_RETURN_NONE;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000235}
236
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200237static PyObject*
238dict_getitem_knownhash(PyObject *self, PyObject *args)
239{
240 PyObject *mp, *key, *result;
241 Py_ssize_t hash;
242
243 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
244 &mp, &key, &hash)) {
245 return NULL;
246 }
247
248 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
249 if (result == NULL && !PyErr_Occurred()) {
250 _PyErr_SetKeyError(key);
251 return NULL;
252 }
253
254 Py_XINCREF(result);
255 return result;
256}
Tim Peters91621db2001-06-12 20:10:01 +0000257
Victor Stinner3d3f2642016-12-15 17:21:23 +0100258static PyObject*
259dict_hassplittable(PyObject *self, PyObject *arg)
260{
261 if (!PyDict_Check(arg)) {
262 PyErr_Format(PyExc_TypeError,
263 "dict_hassplittable() argument must be dict, not '%s'",
264 arg->ob_type->tp_name);
265 return NULL;
266 }
267
268 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
269}
270
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000271/* Issue #4701: Check that PyObject_Hash implicitly calls
272 * PyType_Ready if it hasn't already been called
273 */
274static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 PyVarObject_HEAD_INIT(NULL, 0)
276 "hashinheritancetester", /* Name of this type */
277 sizeof(PyObject), /* Basic object size */
278 0, /* Item size for varobject */
279 (destructor)PyObject_Del, /* tp_dealloc */
280 0, /* tp_print */
281 0, /* tp_getattr */
282 0, /* tp_setattr */
283 0, /* tp_reserved */
284 0, /* tp_repr */
285 0, /* tp_as_number */
286 0, /* tp_as_sequence */
287 0, /* tp_as_mapping */
288 0, /* tp_hash */
289 0, /* tp_call */
290 0, /* tp_str */
291 PyObject_GenericGetAttr, /* tp_getattro */
292 0, /* tp_setattro */
293 0, /* tp_as_buffer */
294 Py_TPFLAGS_DEFAULT, /* tp_flags */
295 0, /* tp_doc */
296 0, /* tp_traverse */
297 0, /* tp_clear */
298 0, /* tp_richcompare */
299 0, /* tp_weaklistoffset */
300 0, /* tp_iter */
301 0, /* tp_iternext */
302 0, /* tp_methods */
303 0, /* tp_members */
304 0, /* tp_getset */
305 0, /* tp_base */
306 0, /* tp_dict */
307 0, /* tp_descr_get */
308 0, /* tp_descr_set */
309 0, /* tp_dictoffset */
310 0, /* tp_init */
311 0, /* tp_alloc */
312 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000313};
314
315static PyObject*
316test_lazy_hash_inheritance(PyObject* self)
317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 PyTypeObject *type;
319 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000320 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 if (type->tp_dict != NULL)
325 /* The type has already been initialized. This probably means
326 -R is being used. */
327 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000328
329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 obj = PyObject_New(PyObject, type);
331 if (obj == NULL) {
332 PyErr_Clear();
333 PyErr_SetString(
334 TestError,
335 "test_lazy_hash_inheritance: failed to create object");
336 return NULL;
337 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 if (type->tp_dict != NULL) {
340 PyErr_SetString(
341 TestError,
342 "test_lazy_hash_inheritance: type initialised too soon");
343 Py_DECREF(obj);
344 return NULL;
345 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 hash = PyObject_Hash(obj);
348 if ((hash == -1) && PyErr_Occurred()) {
349 PyErr_Clear();
350 PyErr_SetString(
351 TestError,
352 "test_lazy_hash_inheritance: could not hash object");
353 Py_DECREF(obj);
354 return NULL;
355 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 if (type->tp_dict == NULL) {
358 PyErr_SetString(
359 TestError,
360 "test_lazy_hash_inheritance: type not initialised by hash()");
361 Py_DECREF(obj);
362 return NULL;
363 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 if (type->tp_hash != PyType_Type.tp_hash) {
366 PyErr_SetString(
367 TestError,
368 "test_lazy_hash_inheritance: unexpected hash function");
369 Py_DECREF(obj);
370 return NULL;
371 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000373 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000376}
377
378
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700379/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000380 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000381
382 Note that the meat of the test is contained in testcapi_long.h.
383 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700384 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000385 dependence on type names makes it impossible to use a parameterized
386 function. A giant macro would be even worse than this. A C++ template
387 would be perfect.
388
389 The "report an error" functions are deliberately not part of the #include
390 file: if the test fails, you can set a breakpoint in the appropriate
391 error function directly, and crawl back from there in the debugger.
392*/
393
394#define UNBIND(X) Py_DECREF(X); (X) = NULL
395
396static PyObject *
397raise_test_long_error(const char* msg)
398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000400}
401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402#define TESTNAME test_long_api_inner
403#define TYPENAME long
404#define F_S_TO_PY PyLong_FromLong
405#define F_PY_TO_S PyLong_AsLong
406#define F_U_TO_PY PyLong_FromUnsignedLong
407#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000408
409#include "testcapi_long.h"
410
411static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000412test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000415}
416
417#undef TESTNAME
418#undef TYPENAME
419#undef F_S_TO_PY
420#undef F_PY_TO_S
421#undef F_U_TO_PY
422#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000423
Tim Peters91621db2001-06-12 20:10:01 +0000424static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000425raise_test_longlong_error(const char* msg)
426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000428}
429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700431#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432#define F_S_TO_PY PyLong_FromLongLong
433#define F_PY_TO_S PyLong_AsLongLong
434#define F_U_TO_PY PyLong_FromUnsignedLongLong
435#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000436
437#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000438
439static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000440test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000441{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000443}
444
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000445#undef TESTNAME
446#undef TYPENAME
447#undef F_S_TO_PY
448#undef F_PY_TO_S
449#undef F_U_TO_PY
450#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000451
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000452/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
453 is tested by test_long_api_inner. This test will concentrate on proper
454 handling of overflow.
455*/
456
457static PyObject *
458test_long_and_overflow(PyObject *self)
459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 PyObject *num, *one, *temp;
461 long value;
462 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 /* Test that overflow is set properly for a large value. */
465 /* num is a number larger than LONG_MAX even on 64-bit platforms */
466 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
467 if (num == NULL)
468 return NULL;
469 overflow = 1234;
470 value = PyLong_AsLongAndOverflow(num, &overflow);
471 Py_DECREF(num);
472 if (value == -1 && PyErr_Occurred())
473 return NULL;
474 if (value != -1)
475 return raiseTestError("test_long_and_overflow",
476 "return value was not set to -1");
477 if (overflow != 1)
478 return raiseTestError("test_long_and_overflow",
479 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 /* Same again, with num = LONG_MAX + 1 */
482 num = PyLong_FromLong(LONG_MAX);
483 if (num == NULL)
484 return NULL;
485 one = PyLong_FromLong(1L);
486 if (one == NULL) {
487 Py_DECREF(num);
488 return NULL;
489 }
490 temp = PyNumber_Add(num, one);
491 Py_DECREF(one);
492 Py_DECREF(num);
493 num = temp;
494 if (num == NULL)
495 return NULL;
496 overflow = 0;
497 value = PyLong_AsLongAndOverflow(num, &overflow);
498 Py_DECREF(num);
499 if (value == -1 && PyErr_Occurred())
500 return NULL;
501 if (value != -1)
502 return raiseTestError("test_long_and_overflow",
503 "return value was not set to -1");
504 if (overflow != 1)
505 return raiseTestError("test_long_and_overflow",
506 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 /* Test that overflow is set properly for a large negative value. */
509 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
510 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
511 if (num == NULL)
512 return NULL;
513 overflow = 1234;
514 value = PyLong_AsLongAndOverflow(num, &overflow);
515 Py_DECREF(num);
516 if (value == -1 && PyErr_Occurred())
517 return NULL;
518 if (value != -1)
519 return raiseTestError("test_long_and_overflow",
520 "return value was not set to -1");
521 if (overflow != -1)
522 return raiseTestError("test_long_and_overflow",
523 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 /* Same again, with num = LONG_MIN - 1 */
526 num = PyLong_FromLong(LONG_MIN);
527 if (num == NULL)
528 return NULL;
529 one = PyLong_FromLong(1L);
530 if (one == NULL) {
531 Py_DECREF(num);
532 return NULL;
533 }
534 temp = PyNumber_Subtract(num, one);
535 Py_DECREF(one);
536 Py_DECREF(num);
537 num = temp;
538 if (num == NULL)
539 return NULL;
540 overflow = 0;
541 value = PyLong_AsLongAndOverflow(num, &overflow);
542 Py_DECREF(num);
543 if (value == -1 && PyErr_Occurred())
544 return NULL;
545 if (value != -1)
546 return raiseTestError("test_long_and_overflow",
547 "return value was not set to -1");
548 if (overflow != -1)
549 return raiseTestError("test_long_and_overflow",
550 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 /* Test that overflow is cleared properly for small values. */
553 num = PyLong_FromString("FF", NULL, 16);
554 if (num == NULL)
555 return NULL;
556 overflow = 1234;
557 value = PyLong_AsLongAndOverflow(num, &overflow);
558 Py_DECREF(num);
559 if (value == -1 && PyErr_Occurred())
560 return NULL;
561 if (value != 0xFF)
562 return raiseTestError("test_long_and_overflow",
563 "expected return value 0xFF");
564 if (overflow != 0)
565 return raiseTestError("test_long_and_overflow",
566 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 num = PyLong_FromString("-FF", NULL, 16);
569 if (num == NULL)
570 return NULL;
571 overflow = 0;
572 value = PyLong_AsLongAndOverflow(num, &overflow);
573 Py_DECREF(num);
574 if (value == -1 && PyErr_Occurred())
575 return NULL;
576 if (value != -0xFF)
577 return raiseTestError("test_long_and_overflow",
578 "expected return value 0xFF");
579 if (overflow != 0)
580 return raiseTestError("test_long_and_overflow",
581 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 num = PyLong_FromLong(LONG_MAX);
584 if (num == NULL)
585 return NULL;
586 overflow = 1234;
587 value = PyLong_AsLongAndOverflow(num, &overflow);
588 Py_DECREF(num);
589 if (value == -1 && PyErr_Occurred())
590 return NULL;
591 if (value != LONG_MAX)
592 return raiseTestError("test_long_and_overflow",
593 "expected return value LONG_MAX");
594 if (overflow != 0)
595 return raiseTestError("test_long_and_overflow",
596 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 num = PyLong_FromLong(LONG_MIN);
599 if (num == NULL)
600 return NULL;
601 overflow = 0;
602 value = PyLong_AsLongAndOverflow(num, &overflow);
603 Py_DECREF(num);
604 if (value == -1 && PyErr_Occurred())
605 return NULL;
606 if (value != LONG_MIN)
607 return raiseTestError("test_long_and_overflow",
608 "expected return value LONG_MIN");
609 if (overflow != 0)
610 return raiseTestError("test_long_and_overflow",
611 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000612
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200613 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000614}
615
Mark Dickinson93f562c2010-01-30 10:30:15 +0000616/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700617 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000618 concentrate on proper handling of overflow.
619*/
620
621static PyObject *
622test_long_long_and_overflow(PyObject *self)
623{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700625 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 /* Test that overflow is set properly for a large value. */
629 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
630 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
631 if (num == NULL)
632 return NULL;
633 overflow = 1234;
634 value = PyLong_AsLongLongAndOverflow(num, &overflow);
635 Py_DECREF(num);
636 if (value == -1 && PyErr_Occurred())
637 return NULL;
638 if (value != -1)
639 return raiseTestError("test_long_long_and_overflow",
640 "return value was not set to -1");
641 if (overflow != 1)
642 return raiseTestError("test_long_long_and_overflow",
643 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 /* Same again, with num = PY_LLONG_MAX + 1 */
646 num = PyLong_FromLongLong(PY_LLONG_MAX);
647 if (num == NULL)
648 return NULL;
649 one = PyLong_FromLong(1L);
650 if (one == NULL) {
651 Py_DECREF(num);
652 return NULL;
653 }
654 temp = PyNumber_Add(num, one);
655 Py_DECREF(one);
656 Py_DECREF(num);
657 num = temp;
658 if (num == NULL)
659 return NULL;
660 overflow = 0;
661 value = PyLong_AsLongLongAndOverflow(num, &overflow);
662 Py_DECREF(num);
663 if (value == -1 && PyErr_Occurred())
664 return NULL;
665 if (value != -1)
666 return raiseTestError("test_long_long_and_overflow",
667 "return value was not set to -1");
668 if (overflow != 1)
669 return raiseTestError("test_long_long_and_overflow",
670 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 /* Test that overflow is set properly for a large negative value. */
673 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
674 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
675 if (num == NULL)
676 return NULL;
677 overflow = 1234;
678 value = PyLong_AsLongLongAndOverflow(num, &overflow);
679 Py_DECREF(num);
680 if (value == -1 && PyErr_Occurred())
681 return NULL;
682 if (value != -1)
683 return raiseTestError("test_long_long_and_overflow",
684 "return value was not set to -1");
685 if (overflow != -1)
686 return raiseTestError("test_long_long_and_overflow",
687 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 /* Same again, with num = PY_LLONG_MIN - 1 */
690 num = PyLong_FromLongLong(PY_LLONG_MIN);
691 if (num == NULL)
692 return NULL;
693 one = PyLong_FromLong(1L);
694 if (one == NULL) {
695 Py_DECREF(num);
696 return NULL;
697 }
698 temp = PyNumber_Subtract(num, one);
699 Py_DECREF(one);
700 Py_DECREF(num);
701 num = temp;
702 if (num == NULL)
703 return NULL;
704 overflow = 0;
705 value = PyLong_AsLongLongAndOverflow(num, &overflow);
706 Py_DECREF(num);
707 if (value == -1 && PyErr_Occurred())
708 return NULL;
709 if (value != -1)
710 return raiseTestError("test_long_long_and_overflow",
711 "return value was not set to -1");
712 if (overflow != -1)
713 return raiseTestError("test_long_long_and_overflow",
714 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 /* Test that overflow is cleared properly for small values. */
717 num = PyLong_FromString("FF", NULL, 16);
718 if (num == NULL)
719 return NULL;
720 overflow = 1234;
721 value = PyLong_AsLongLongAndOverflow(num, &overflow);
722 Py_DECREF(num);
723 if (value == -1 && PyErr_Occurred())
724 return NULL;
725 if (value != 0xFF)
726 return raiseTestError("test_long_long_and_overflow",
727 "expected return value 0xFF");
728 if (overflow != 0)
729 return raiseTestError("test_long_long_and_overflow",
730 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 num = PyLong_FromString("-FF", NULL, 16);
733 if (num == NULL)
734 return NULL;
735 overflow = 0;
736 value = PyLong_AsLongLongAndOverflow(num, &overflow);
737 Py_DECREF(num);
738 if (value == -1 && PyErr_Occurred())
739 return NULL;
740 if (value != -0xFF)
741 return raiseTestError("test_long_long_and_overflow",
742 "expected return value 0xFF");
743 if (overflow != 0)
744 return raiseTestError("test_long_long_and_overflow",
745 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 num = PyLong_FromLongLong(PY_LLONG_MAX);
748 if (num == NULL)
749 return NULL;
750 overflow = 1234;
751 value = PyLong_AsLongLongAndOverflow(num, &overflow);
752 Py_DECREF(num);
753 if (value == -1 && PyErr_Occurred())
754 return NULL;
755 if (value != PY_LLONG_MAX)
756 return raiseTestError("test_long_long_and_overflow",
757 "expected return value PY_LLONG_MAX");
758 if (overflow != 0)
759 return raiseTestError("test_long_long_and_overflow",
760 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 num = PyLong_FromLongLong(PY_LLONG_MIN);
763 if (num == NULL)
764 return NULL;
765 overflow = 0;
766 value = PyLong_AsLongLongAndOverflow(num, &overflow);
767 Py_DECREF(num);
768 if (value == -1 && PyErr_Occurred())
769 return NULL;
770 if (value != PY_LLONG_MIN)
771 return raiseTestError("test_long_long_and_overflow",
772 "expected return value PY_LLONG_MIN");
773 if (overflow != 0)
774 return raiseTestError("test_long_long_and_overflow",
775 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000776
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200777 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000778}
779
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200780/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
781 non-integer arguments are handled correctly. It should be extended to
782 test overflow handling.
783 */
784
785static PyObject *
786test_long_as_size_t(PyObject *self)
787{
788 size_t out_u;
789 Py_ssize_t out_s;
790
791 Py_INCREF(Py_None);
792
793 out_u = PyLong_AsSize_t(Py_None);
794 if (out_u != (size_t)-1 || !PyErr_Occurred())
795 return raiseTestError("test_long_as_size_t",
796 "PyLong_AsSize_t(None) didn't complain");
797 if (!PyErr_ExceptionMatches(PyExc_TypeError))
798 return raiseTestError("test_long_as_size_t",
799 "PyLong_AsSize_t(None) raised "
800 "something other than TypeError");
801 PyErr_Clear();
802
803 out_s = PyLong_AsSsize_t(Py_None);
804 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
805 return raiseTestError("test_long_as_size_t",
806 "PyLong_AsSsize_t(None) didn't complain");
807 if (!PyErr_ExceptionMatches(PyExc_TypeError))
808 return raiseTestError("test_long_as_size_t",
809 "PyLong_AsSsize_t(None) raised "
810 "something other than TypeError");
811 PyErr_Clear();
812
813 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
814 return Py_None;
815}
816
817/* Test the PyLong_AsDouble API. At present this just tests that
818 non-integer arguments are handled correctly.
819 */
820
821static PyObject *
822test_long_as_double(PyObject *self)
823{
824 double out;
825
826 Py_INCREF(Py_None);
827
828 out = PyLong_AsDouble(Py_None);
829 if (out != -1.0 || !PyErr_Occurred())
830 return raiseTestError("test_long_as_double",
831 "PyLong_AsDouble(None) didn't complain");
832 if (!PyErr_ExceptionMatches(PyExc_TypeError))
833 return raiseTestError("test_long_as_double",
834 "PyLong_AsDouble(None) raised "
835 "something other than TypeError");
836 PyErr_Clear();
837
838 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
839 return Py_None;
840}
841
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700842/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000843 for both long and int arguments. The test may leak a little memory if
844 it fails.
845*/
846static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000847test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000848{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700850 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 tuple = PyTuple_New(1);
853 if (tuple == NULL)
854 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 num = PyLong_FromLong(42);
857 if (num == NULL)
858 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 value = -1;
863 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
864 return NULL;
865 if (value != 42)
866 return raiseTestError("test_L_code",
867 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 Py_DECREF(num);
870 num = PyLong_FromLong(42);
871 if (num == NULL)
872 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 value = -1;
877 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
878 return NULL;
879 if (value != 42)
880 return raiseTestError("test_L_code",
881 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200884 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000885}
886
Serhiy Storchakace412872016-05-08 23:36:44 +0300887static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300888return_none(void *unused)
889{
890 Py_RETURN_NONE;
891}
892
893static PyObject *
894raise_error(void *unused)
895{
896 PyErr_SetNone(PyExc_ValueError);
897 return NULL;
898}
899
900static int
901test_buildvalue_N_error(const char *fmt)
902{
903 PyObject *arg, *res;
904
905 arg = PyList_New(0);
906 if (arg == NULL) {
907 return -1;
908 }
909
910 Py_INCREF(arg);
911 res = Py_BuildValue(fmt, return_none, NULL, arg);
912 if (res == NULL) {
913 return -1;
914 }
915 Py_DECREF(res);
916 if (Py_REFCNT(arg) != 1) {
917 PyErr_Format(TestError, "test_buildvalue_N: "
918 "arg was not decrefed in successful "
919 "Py_BuildValue(\"%s\")", fmt);
920 return -1;
921 }
922
923 Py_INCREF(arg);
924 res = Py_BuildValue(fmt, raise_error, NULL, arg);
925 if (res != NULL || !PyErr_Occurred()) {
926 PyErr_Format(TestError, "test_buildvalue_N: "
927 "Py_BuildValue(\"%s\") didn't complain", fmt);
928 return -1;
929 }
930 PyErr_Clear();
931 if (Py_REFCNT(arg) != 1) {
932 PyErr_Format(TestError, "test_buildvalue_N: "
933 "arg was not decrefed in failed "
934 "Py_BuildValue(\"%s\")", fmt);
935 return -1;
936 }
937 Py_DECREF(arg);
938 return 0;
939}
940
941static PyObject *
942test_buildvalue_N(PyObject *self, PyObject *noargs)
943{
944 PyObject *arg, *res;
945
946 arg = PyList_New(0);
947 if (arg == NULL) {
948 return NULL;
949 }
950 Py_INCREF(arg);
951 res = Py_BuildValue("N", arg);
952 if (res == NULL) {
953 return NULL;
954 }
955 if (res != arg) {
956 return raiseTestError("test_buildvalue_N",
957 "Py_BuildValue(\"N\") returned wrong result");
958 }
959 if (Py_REFCNT(arg) != 2) {
960 return raiseTestError("test_buildvalue_N",
961 "arg was not decrefed in Py_BuildValue(\"N\")");
962 }
963 Py_DECREF(res);
964 Py_DECREF(arg);
965
966 if (test_buildvalue_N_error("O&N") < 0)
967 return NULL;
968 if (test_buildvalue_N_error("(O&N)") < 0)
969 return NULL;
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
977 Py_RETURN_NONE;
978}
979
980
981static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +0300982get_args(PyObject *self, PyObject *args)
983{
984 if (args == NULL) {
985 args = Py_None;
986 }
987 Py_INCREF(args);
988 return args;
989}
990
991static PyObject *
992get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
993{
994 if (kwargs == NULL) {
995 kwargs = Py_None;
996 }
997 Py_INCREF(kwargs);
998 return kwargs;
999}
1000
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001001/* Test tuple argument processing */
1002static PyObject *
1003getargs_tuple(PyObject *self, PyObject *args)
1004{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 int a, b, c;
1006 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1007 return NULL;
1008 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001009}
1010
Christian Heimes380f7f22008-02-28 11:19:05 +00001011/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001012static PyObject *
1013getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001016 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1020 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1021 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1022 return NULL;
1023 return Py_BuildValue("iiiiiiiiii",
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]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001026}
1027
Larry Hastings83a9f482012-03-20 20:06:16 +00001028/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1029static PyObject *
1030getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1031{
1032 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1033 int required = -1;
1034 int optional = -1;
1035 int keyword_only = -1;
1036
1037 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1038 &required, &optional, &keyword_only))
1039 return NULL;
1040 return Py_BuildValue("iii", required, optional, keyword_only);
1041}
1042
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001043/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1044static PyObject *
1045getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1046{
1047 static char *keywords[] = {"", "", "keyword", NULL};
1048 int required = -1;
1049 int optional = -1;
1050 int keyword = -1;
1051
1052 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1053 &required, &optional, &keyword))
1054 return NULL;
1055 return Py_BuildValue("iii", required, optional, keyword);
1056}
1057
Thomas Heller3457e4b2003-04-24 16:14:27 +00001058/* Functions to call PyArg_ParseTuple with integer format codes,
1059 and return the result.
1060*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001061static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001062getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001063{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 unsigned char value;
1065 if (!PyArg_ParseTuple(args, "b", &value))
1066 return NULL;
1067 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001068}
1069
Thomas Heller3457e4b2003-04-24 16:14:27 +00001070static PyObject *
1071getargs_B(PyObject *self, PyObject *args)
1072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 unsigned char value;
1074 if (!PyArg_ParseTuple(args, "B", &value))
1075 return NULL;
1076 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001077}
1078
1079static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001080getargs_h(PyObject *self, PyObject *args)
1081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 short value;
1083 if (!PyArg_ParseTuple(args, "h", &value))
1084 return NULL;
1085 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001086}
1087
1088static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001089getargs_H(PyObject *self, PyObject *args)
1090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 unsigned short value;
1092 if (!PyArg_ParseTuple(args, "H", &value))
1093 return NULL;
1094 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001095}
1096
1097static PyObject *
1098getargs_I(PyObject *self, PyObject *args)
1099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 unsigned int value;
1101 if (!PyArg_ParseTuple(args, "I", &value))
1102 return NULL;
1103 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001104}
1105
1106static PyObject *
1107getargs_k(PyObject *self, PyObject *args)
1108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 unsigned long value;
1110 if (!PyArg_ParseTuple(args, "k", &value))
1111 return NULL;
1112 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001113}
1114
1115static PyObject *
1116getargs_i(PyObject *self, PyObject *args)
1117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 int value;
1119 if (!PyArg_ParseTuple(args, "i", &value))
1120 return NULL;
1121 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001122}
1123
Thomas Hellera4ea6032003-04-17 18:55:45 +00001124static PyObject *
1125getargs_l(PyObject *self, PyObject *args)
1126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 long value;
1128 if (!PyArg_ParseTuple(args, "l", &value))
1129 return NULL;
1130 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001131}
1132
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001133static PyObject *
1134getargs_n(PyObject *self, PyObject *args)
1135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 Py_ssize_t value;
1137 if (!PyArg_ParseTuple(args, "n", &value))
1138 return NULL;
1139 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001140}
1141
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001142static PyObject *
1143getargs_p(PyObject *self, PyObject *args)
1144{
1145 int value;
1146 if (!PyArg_ParseTuple(args, "p", &value))
1147 return NULL;
1148 return PyLong_FromLong(value);
1149}
1150
Thomas Hellera4ea6032003-04-17 18:55:45 +00001151static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001152getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001153{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001154 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 if (!PyArg_ParseTuple(args, "L", &value))
1156 return NULL;
1157 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001158}
1159
Thomas Hellera4ea6032003-04-17 18:55:45 +00001160static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001161getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001162{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001163 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 if (!PyArg_ParseTuple(args, "K", &value))
1165 return NULL;
1166 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001167}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001168
1169/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +00001170 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001171static PyObject *
1172test_k_code(PyObject *self)
1173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 PyObject *tuple, *num;
1175 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 tuple = PyTuple_New(1);
1178 if (tuple == NULL)
1179 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 /* a number larger than ULONG_MAX even on 64-bit platforms */
1182 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1183 if (num == NULL)
1184 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 value = PyLong_AsUnsignedLongMask(num);
1187 if (value != ULONG_MAX)
1188 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001189 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 value = 0;
1194 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1195 return NULL;
1196 if (value != ULONG_MAX)
1197 return raiseTestError("test_k_code",
1198 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 Py_DECREF(num);
1201 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1202 if (num == NULL)
1203 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 value = PyLong_AsUnsignedLongMask(num);
1206 if (value != (unsigned long)-0x42)
1207 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001208 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 value = 0;
1213 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1214 return NULL;
1215 if (value != (unsigned long)-0x42)
1216 return raiseTestError("test_k_code",
1217 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001220 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001221}
1222
Victor Stinner06e49dd2010-06-13 18:21:50 +00001223static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001224getargs_f(PyObject *self, PyObject *args)
1225{
1226 float f;
1227 if (!PyArg_ParseTuple(args, "f", &f))
1228 return NULL;
1229 return PyFloat_FromDouble(f);
1230}
1231
1232static PyObject *
1233getargs_d(PyObject *self, PyObject *args)
1234{
1235 double d;
1236 if (!PyArg_ParseTuple(args, "d", &d))
1237 return NULL;
1238 return PyFloat_FromDouble(d);
1239}
1240
1241static PyObject *
1242getargs_D(PyObject *self, PyObject *args)
1243{
1244 Py_complex cval;
1245 if (!PyArg_ParseTuple(args, "D", &cval))
1246 return NULL;
1247 return PyComplex_FromCComplex(cval);
1248}
1249
1250static PyObject *
1251getargs_S(PyObject *self, PyObject *args)
1252{
1253 PyObject *obj;
1254 if (!PyArg_ParseTuple(args, "S", &obj))
1255 return NULL;
1256 Py_INCREF(obj);
1257 return obj;
1258}
1259
1260static PyObject *
1261getargs_Y(PyObject *self, PyObject *args)
1262{
1263 PyObject *obj;
1264 if (!PyArg_ParseTuple(args, "Y", &obj))
1265 return NULL;
1266 Py_INCREF(obj);
1267 return obj;
1268}
1269
1270static PyObject *
1271getargs_U(PyObject *self, PyObject *args)
1272{
1273 PyObject *obj;
1274 if (!PyArg_ParseTuple(args, "U", &obj))
1275 return NULL;
1276 Py_INCREF(obj);
1277 return obj;
1278}
1279
1280static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001281getargs_c(PyObject *self, PyObject *args)
1282{
1283 char c;
1284 if (!PyArg_ParseTuple(args, "c", &c))
1285 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001286 return PyLong_FromLong((unsigned char)c);
1287}
1288
1289static PyObject *
1290getargs_C(PyObject *self, PyObject *args)
1291{
1292 int c;
1293 if (!PyArg_ParseTuple(args, "C", &c))
1294 return NULL;
1295 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001296}
1297
1298static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001299getargs_s(PyObject *self, PyObject *args)
1300{
1301 char *str;
1302 if (!PyArg_ParseTuple(args, "s", &str))
1303 return NULL;
1304 return PyBytes_FromString(str);
1305}
1306
1307static PyObject *
1308getargs_s_star(PyObject *self, PyObject *args)
1309{
1310 Py_buffer buffer;
1311 PyObject *bytes;
1312 if (!PyArg_ParseTuple(args, "s*", &buffer))
1313 return NULL;
1314 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1315 PyBuffer_Release(&buffer);
1316 return bytes;
1317}
1318
1319static PyObject *
1320getargs_s_hash(PyObject *self, PyObject *args)
1321{
1322 char *str;
1323 Py_ssize_t size;
1324 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1325 return NULL;
1326 return PyBytes_FromStringAndSize(str, size);
1327}
1328
1329static PyObject *
1330getargs_z(PyObject *self, PyObject *args)
1331{
1332 char *str;
1333 if (!PyArg_ParseTuple(args, "z", &str))
1334 return NULL;
1335 if (str != NULL)
1336 return PyBytes_FromString(str);
1337 else
1338 Py_RETURN_NONE;
1339}
1340
1341static PyObject *
1342getargs_z_star(PyObject *self, PyObject *args)
1343{
1344 Py_buffer buffer;
1345 PyObject *bytes;
1346 if (!PyArg_ParseTuple(args, "z*", &buffer))
1347 return NULL;
1348 if (buffer.buf != NULL)
1349 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1350 else {
1351 Py_INCREF(Py_None);
1352 bytes = Py_None;
1353 }
1354 PyBuffer_Release(&buffer);
1355 return bytes;
1356}
1357
1358static PyObject *
1359getargs_z_hash(PyObject *self, PyObject *args)
1360{
1361 char *str;
1362 Py_ssize_t size;
1363 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1364 return NULL;
1365 if (str != NULL)
1366 return PyBytes_FromStringAndSize(str, size);
1367 else
1368 Py_RETURN_NONE;
1369}
1370
1371static PyObject *
1372getargs_y(PyObject *self, PyObject *args)
1373{
1374 char *str;
1375 if (!PyArg_ParseTuple(args, "y", &str))
1376 return NULL;
1377 return PyBytes_FromString(str);
1378}
1379
1380static PyObject *
1381getargs_y_star(PyObject *self, PyObject *args)
1382{
1383 Py_buffer buffer;
1384 PyObject *bytes;
1385 if (!PyArg_ParseTuple(args, "y*", &buffer))
1386 return NULL;
1387 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1388 PyBuffer_Release(&buffer);
1389 return bytes;
1390}
1391
1392static PyObject *
1393getargs_y_hash(PyObject *self, PyObject *args)
1394{
1395 char *str;
1396 Py_ssize_t size;
1397 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1398 return NULL;
1399 return PyBytes_FromStringAndSize(str, size);
1400}
1401
1402static PyObject *
1403getargs_u(PyObject *self, PyObject *args)
1404{
1405 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001406 if (!PyArg_ParseTuple(args, "u", &str))
1407 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001408 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001409}
1410
1411static PyObject *
1412getargs_u_hash(PyObject *self, PyObject *args)
1413{
1414 Py_UNICODE *str;
1415 Py_ssize_t size;
1416 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1417 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001418 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001419}
1420
1421static PyObject *
1422getargs_Z(PyObject *self, PyObject *args)
1423{
1424 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001425 if (!PyArg_ParseTuple(args, "Z", &str))
1426 return NULL;
1427 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001428 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001429 } else
1430 Py_RETURN_NONE;
1431}
1432
1433static PyObject *
1434getargs_Z_hash(PyObject *self, PyObject *args)
1435{
1436 Py_UNICODE *str;
1437 Py_ssize_t size;
1438 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1439 return NULL;
1440 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001441 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001442 else
1443 Py_RETURN_NONE;
1444}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001445
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001446static PyObject *
1447getargs_es(PyObject *self, PyObject *args)
1448{
1449 PyObject *arg, *result;
1450 const char *encoding = NULL;
1451 char *str;
1452
1453 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1454 return NULL;
1455 if (!PyArg_Parse(arg, "es", encoding, &str))
1456 return NULL;
1457 result = PyBytes_FromString(str);
1458 PyMem_Free(str);
1459 return result;
1460}
1461
1462static PyObject *
1463getargs_et(PyObject *self, PyObject *args)
1464{
1465 PyObject *arg, *result;
1466 const char *encoding = NULL;
1467 char *str;
1468
1469 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1470 return NULL;
1471 if (!PyArg_Parse(arg, "et", encoding, &str))
1472 return NULL;
1473 result = PyBytes_FromString(str);
1474 PyMem_Free(str);
1475 return result;
1476}
1477
1478static PyObject *
1479getargs_es_hash(PyObject *self, PyObject *args)
1480{
1481 PyObject *arg, *result;
1482 const char *encoding = NULL;
1483 PyByteArrayObject *buffer = NULL;
1484 char *str = NULL;
1485 Py_ssize_t size;
1486
1487 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1488 return NULL;
1489 if (buffer != NULL) {
1490 str = PyByteArray_AS_STRING(buffer);
1491 size = PyByteArray_GET_SIZE(buffer);
1492 }
1493 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1494 return NULL;
1495 result = PyBytes_FromStringAndSize(str, size);
1496 if (buffer == NULL)
1497 PyMem_Free(str);
1498 return result;
1499}
1500
1501static PyObject *
1502getargs_et_hash(PyObject *self, PyObject *args)
1503{
1504 PyObject *arg, *result;
1505 const char *encoding = NULL;
1506 PyByteArrayObject *buffer = NULL;
1507 char *str = NULL;
1508 Py_ssize_t size;
1509
1510 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1511 return NULL;
1512 if (buffer != NULL) {
1513 str = PyByteArray_AS_STRING(buffer);
1514 size = PyByteArray_GET_SIZE(buffer);
1515 }
1516 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1517 return NULL;
1518 result = PyBytes_FromStringAndSize(str, size);
1519 if (buffer == NULL)
1520 PyMem_Free(str);
1521 return result;
1522}
1523
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001524/* Test the s and z codes for PyArg_ParseTuple.
1525*/
1526static PyObject *
1527test_s_code(PyObject *self)
1528{
1529 /* Unicode strings should be accepted */
1530 PyObject *tuple, *obj;
1531 char *value;
1532
1533 tuple = PyTuple_New(1);
1534 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001536
1537 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001539 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001541
1542 PyTuple_SET_ITEM(tuple, 0, obj);
1543
1544 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001546 */
1547 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001549
1550 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001552
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001553 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001554 Py_RETURN_NONE;
1555}
1556
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001557static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001558parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001559{
Larry Hastings8f904da2012-06-22 03:56:29 -07001560 PyObject *sub_args;
1561 PyObject *sub_kwargs;
1562 char *sub_format;
1563 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001564
Larry Hastings8f904da2012-06-22 03:56:29 -07001565 Py_ssize_t i, size;
1566 char *keywords[8 + 1]; /* space for NULL at end */
1567 PyObject *o;
1568 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001569
Larry Hastings8f904da2012-06-22 03:56:29 -07001570 int result;
1571 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001572
Larry Hastings22701e82012-08-08 14:52:22 -07001573 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001574
Larry Hastings8f904da2012-06-22 03:56:29 -07001575 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1576 &sub_args, &sub_kwargs,
1577 &sub_format, &sub_keywords))
1578 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001579
Larry Hastings8f904da2012-06-22 03:56:29 -07001580 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1581 PyErr_SetString(PyExc_ValueError,
1582 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1583 return NULL;
1584 }
1585
1586 memset(buffers, 0, sizeof(buffers));
1587 memset(converted, 0, sizeof(converted));
1588 memset(keywords, 0, sizeof(keywords));
1589
1590 size = PySequence_Fast_GET_SIZE(sub_keywords);
1591 if (size > 8) {
1592 PyErr_SetString(PyExc_ValueError,
1593 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1594 goto exit;
1595 }
1596
1597 for (i = 0; i < size; i++) {
1598 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1599 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1600 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001601 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001602 goto exit;
1603 }
1604 keywords[i] = PyBytes_AS_STRING(converted[i]);
1605 }
1606
1607 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1608 sub_format, keywords,
1609 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1610 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1611
1612 if (result) {
1613 return_value = Py_None;
1614 Py_INCREF(Py_None);
1615 }
1616
1617exit:
1618 size = sizeof(converted) / sizeof(converted[0]);
1619 for (i = 0; i < size; i++) {
1620 Py_XDECREF(converted[i]);
1621 }
1622 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001623}
1624
Benjamin Peterson92035012008-12-27 16:00:54 +00001625static volatile int x;
1626
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001627/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1628 of an error.
1629*/
1630static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001631test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 PyObject *tuple, *obj;
1634 Py_UNICODE *value;
1635 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1638 /* Just use the macro and check that it compiles */
1639 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 tuple = PyTuple_New(1);
1642 if (tuple == NULL)
1643 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 obj = PyUnicode_Decode("test", strlen("test"),
1646 "ascii", NULL);
1647 if (obj == NULL)
1648 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 value = 0;
1653 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1654 return NULL;
1655 if (value != PyUnicode_AS_UNICODE(obj))
1656 return raiseTestError("test_u_code",
1657 "u code returned wrong value for u'test'");
1658 value = 0;
1659 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1660 return NULL;
1661 if (value != PyUnicode_AS_UNICODE(obj) ||
1662 len != PyUnicode_GET_SIZE(obj))
1663 return raiseTestError("test_u_code",
1664 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001667 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001668}
1669
Guido van Rossumfb67be22007-08-29 18:38:11 +00001670/* Test Z and Z# codes for PyArg_ParseTuple */
1671static PyObject *
1672test_Z_code(PyObject *self)
1673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001675 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 tuple = PyTuple_New(2);
1679 if (tuple == NULL)
1680 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 obj = PyUnicode_FromString("test");
1683 PyTuple_SET_ITEM(tuple, 0, obj);
1684 Py_INCREF(Py_None);
1685 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 /* swap values on purpose */
1688 value1 = NULL;
1689 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 /* Test Z for both values */
1692 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1693 return NULL;
1694 if (value1 != PyUnicode_AS_UNICODE(obj))
1695 return raiseTestError("test_Z_code",
1696 "Z code returned wrong value for 'test'");
1697 if (value2 != NULL)
1698 return raiseTestError("test_Z_code",
1699 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 value1 = NULL;
1702 value2 = PyUnicode_AS_UNICODE(obj);
1703 len1 = -1;
1704 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 /* Test Z# for both values */
1707 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1708 &value2, &len2) < 0)
1709 return NULL;
1710 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1711 len1 != PyUnicode_GET_SIZE(obj))
1712 return raiseTestError("test_Z_code",
1713 "Z# code returned wrong values for 'test'");
1714 if (value2 != NULL ||
1715 len2 != 0)
1716 return raiseTestError("test_Z_code",
1717 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 Py_DECREF(tuple);
1720 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001721}
1722
Thomas Wouters477c8d52006-05-27 19:21:47 +00001723static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001724test_widechar(PyObject *self)
1725{
1726#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1728 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001729 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001730#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1732 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001733#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1737 if (wide == NULL)
1738 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1741 if (utf8 == NULL) {
1742 Py_DECREF(wide);
1743 return NULL;
1744 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001745
Victor Stinner8ef18872011-11-21 02:06:57 +01001746 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 Py_DECREF(wide);
1748 Py_DECREF(utf8);
1749 return raiseTestError("test_widechar",
1750 "wide string and utf8 string "
1751 "have different length");
1752 }
1753 if (PyUnicode_Compare(wide, utf8)) {
1754 Py_DECREF(wide);
1755 Py_DECREF(utf8);
1756 if (PyErr_Occurred())
1757 return NULL;
1758 return raiseTestError("test_widechar",
1759 "wide string and utf8 string "
1760 "are different");
1761 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 Py_DECREF(wide);
1764 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001765
1766#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1767 wide = PyUnicode_FromWideChar(invalid, 1);
1768 if (wide == NULL)
1769 PyErr_Clear();
1770 else
1771 return raiseTestError("test_widechar",
1772 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1773
1774 wide = PyUnicode_FromUnicode(invalid, 1);
1775 if (wide == NULL)
1776 PyErr_Clear();
1777 else
1778 return raiseTestError("test_widechar",
1779 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001780
1781 wide = PyUnicode_FromUnicode(NULL, 1);
1782 if (wide == NULL)
1783 return NULL;
1784 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001785 if (_PyUnicode_Ready(wide) < 0) {
1786 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001787 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001788 }
1789 else {
1790 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001791 return raiseTestError("test_widechar",
1792 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001793 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001794#endif
1795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001797}
1798
1799static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001800unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001801{
1802 PyObject *unicode, *result;
1803 Py_ssize_t buflen, size;
1804 wchar_t *buffer;
1805
1806 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1807 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001808 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001809 if (buffer == NULL)
1810 return PyErr_NoMemory();
1811
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001812 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001813 if (size == -1) {
1814 PyMem_Free(buffer);
1815 return NULL;
1816 }
1817
1818 if (size < buflen)
1819 buflen = size + 1;
1820 else
1821 buflen = size;
1822 result = PyUnicode_FromWideChar(buffer, buflen);
1823 PyMem_Free(buffer);
1824 if (result == NULL)
1825 return NULL;
1826
1827 return Py_BuildValue("(Nn)", result, size);
1828}
1829
1830static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001831unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001832{
1833 PyObject *unicode, *result;
1834 Py_ssize_t size;
1835 wchar_t *buffer;
1836
1837 if (!PyArg_ParseTuple(args, "U", &unicode))
1838 return NULL;
1839
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001840 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001841 if (buffer == NULL)
1842 return NULL;
1843
1844 result = PyUnicode_FromWideChar(buffer, size + 1);
1845 PyMem_Free(buffer);
1846 if (result == NULL)
1847 return NULL;
1848 return Py_BuildValue("(Nn)", result, size);
1849}
1850
1851static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001852unicode_asucs4(PyObject *self, PyObject *args)
1853{
1854 PyObject *unicode, *result;
1855 Py_UCS4 *buffer;
1856 int copy_null;
1857 Py_ssize_t str_len, buf_len;
1858
1859 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1860 return NULL;
1861 }
1862
1863 buf_len = str_len + 1;
1864 buffer = PyMem_NEW(Py_UCS4, buf_len);
1865 if (buffer == NULL) {
1866 return PyErr_NoMemory();
1867 }
1868 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1869 buffer[str_len] = 0xffffU;
1870
1871 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1872 PyMem_FREE(buffer);
1873 return NULL;
1874 }
1875
1876 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1877 PyMem_FREE(buffer);
1878 return result;
1879}
1880
1881static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001882unicode_findchar(PyObject *self, PyObject *args)
1883{
1884 PyObject *str;
1885 int direction;
1886 unsigned int ch;
1887 Py_ssize_t result;
1888 Py_ssize_t start, end;
1889
1890 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1891 &start, &end, &direction)) {
1892 return NULL;
1893 }
1894
1895 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
1896 if (result == -2)
1897 return NULL;
1898 else
1899 return PyLong_FromSsize_t(result);
1900}
1901
1902static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001903unicode_copycharacters(PyObject *self, PyObject *args)
1904{
1905 PyObject *from, *to, *to_copy;
1906 Py_ssize_t from_start, to_start, how_many, copied;
1907
1908 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1909 &from, &from_start, &how_many)) {
1910 return NULL;
1911 }
1912
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001913 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1914 PyUnicode_MAX_CHAR_VALUE(to)))) {
1915 return NULL;
1916 }
1917 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
1918 Py_DECREF(to_copy);
1919 return NULL;
1920 }
1921
1922 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
1923 from_start, how_many)) < 0) {
1924 Py_DECREF(to_copy);
1925 return NULL;
1926 }
1927
1928 return Py_BuildValue("(Nn)", to_copy, copied);
1929}
1930
1931static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001932unicode_encodedecimal(PyObject *self, PyObject *args)
1933{
1934 Py_UNICODE *unicode;
1935 Py_ssize_t length;
1936 char *errors = NULL;
1937 PyObject *decimal;
1938 Py_ssize_t decimal_length, new_length;
1939 int res;
1940
1941 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1942 return NULL;
1943
1944 decimal_length = length * 7; /* len('&#8364;') */
1945 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1946 if (decimal == NULL)
1947 return NULL;
1948
1949 res = PyUnicode_EncodeDecimal(unicode, length,
1950 PyBytes_AS_STRING(decimal),
1951 errors);
1952 if (res < 0) {
1953 Py_DECREF(decimal);
1954 return NULL;
1955 }
1956
1957 new_length = strlen(PyBytes_AS_STRING(decimal));
1958 assert(new_length <= decimal_length);
1959 res = _PyBytes_Resize(&decimal, new_length);
1960 if (res < 0)
1961 return NULL;
1962
1963 return decimal;
1964}
1965
1966static PyObject *
1967unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1968{
1969 Py_UNICODE *unicode;
1970 Py_ssize_t length;
1971 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1972 return NULL;
1973 return PyUnicode_TransformDecimalToASCII(unicode, length);
1974}
1975
1976static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001977unicode_legacy_string(PyObject *self, PyObject *args)
1978{
1979 Py_UNICODE *data;
1980 Py_ssize_t len;
1981 PyObject *u;
1982
1983 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1984 return NULL;
1985
1986 u = PyUnicode_FromUnicode(NULL, len);
1987 if (u == NULL)
1988 return NULL;
1989
1990 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1991
1992 if (len > 0) { /* The empty string is always ready. */
1993 assert(!PyUnicode_IS_READY(u));
1994 }
1995
1996 return u;
1997}
1998
1999static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002000getargs_w_star(PyObject *self, PyObject *args)
2001{
2002 Py_buffer buffer;
2003 PyObject *result;
2004 char *str;
2005
2006 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2007 return NULL;
2008
2009 if (2 <= buffer.len) {
2010 str = buffer.buf;
2011 str[0] = '[';
2012 str[buffer.len-1] = ']';
2013 }
2014
2015 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2016 PyBuffer_Release(&buffer);
2017 return result;
2018}
2019
2020
2021static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00002022test_empty_argparse(PyObject *self)
2023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 /* Test that formats can begin with '|'. See issue #4720. */
2025 PyObject *tuple, *dict = NULL;
2026 static char *kwlist[] = {NULL};
2027 int result;
2028 tuple = PyTuple_New(0);
2029 if (!tuple)
2030 return NULL;
2031 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
2032 goto done;
2033 dict = PyDict_New();
2034 if (!dict)
2035 goto done;
2036 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002037 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 Py_DECREF(tuple);
2039 Py_XDECREF(dict);
2040 if (result < 0)
2041 return NULL;
2042 else {
2043 Py_RETURN_NONE;
2044 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002045}
2046
2047static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002048codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002049{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 const char *encoding, *errors = NULL;
2051 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2052 &encoding, &errors))
2053 return NULL;
2054 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002055}
2056
Thomas Wouters477c8d52006-05-27 19:21:47 +00002057static PyObject *
2058codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002059{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 const char *encoding, *errors = NULL;
2061 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2062 &encoding, &errors))
2063 return NULL;
2064 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002065}
2066
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002067
Tim Peters5b8132f2003-01-31 15:52:05 +00002068/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002069static PyObject *
2070test_long_numbits(PyObject *self)
2071{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 struct triple {
2073 long input;
2074 size_t nbits;
2075 int sign;
2076 } testcases[] = {{0, 0, 0},
2077 {1L, 1, 1},
2078 {-1L, 1, -1},
2079 {2L, 2, 1},
2080 {-2L, 2, -1},
2081 {3L, 2, 1},
2082 {-3L, 2, -1},
2083 {4L, 3, 1},
2084 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002085 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 {-0x7fffL, 15, -1},
2087 {0xffffL, 16, 1},
2088 {-0xffffL, 16, -1},
2089 {0xfffffffL, 28, 1},
2090 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002091 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002092
Victor Stinner63941882011-09-29 00:42:28 +02002093 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002094 size_t nbits;
2095 int sign;
2096 PyObject *plong;
2097
2098 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002099 if (plong == NULL)
2100 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002101 nbits = _PyLong_NumBits(plong);
2102 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 Py_DECREF(plong);
2105 if (nbits != testcases[i].nbits)
2106 return raiseTestError("test_long_numbits",
2107 "wrong result for _PyLong_NumBits");
2108 if (sign != testcases[i].sign)
2109 return raiseTestError("test_long_numbits",
2110 "wrong result for _PyLong_Sign");
2111 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002112 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002113}
2114
Thomas Heller519a0422007-11-15 20:48:54 +00002115/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002116
2117static PyObject *
2118test_null_strings(PyObject *self)
2119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2121 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2122 Py_XDECREF(o1);
2123 Py_XDECREF(o2);
2124 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002125}
2126
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002127static PyObject *
2128raise_exception(PyObject *self, PyObject *args)
2129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 PyObject *exc;
2131 PyObject *exc_args, *v;
2132 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002134 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2135 &exc, &num_args))
2136 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 exc_args = PyTuple_New(num_args);
2139 if (exc_args == NULL)
2140 return NULL;
2141 for (i = 0; i < num_args; ++i) {
2142 v = PyLong_FromLong(i);
2143 if (v == NULL) {
2144 Py_DECREF(exc_args);
2145 return NULL;
2146 }
2147 PyTuple_SET_ITEM(exc_args, i, v);
2148 }
2149 PyErr_SetObject(exc, exc_args);
2150 Py_DECREF(exc_args);
2151 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002152}
Tim Peters91621db2001-06-12 20:10:01 +00002153
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002154static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002155set_errno(PyObject *self, PyObject *args)
2156{
2157 int new_errno;
2158
2159 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2160 return NULL;
2161
2162 errno = new_errno;
2163 Py_RETURN_NONE;
2164}
2165
2166static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002167test_set_exc_info(PyObject *self, PyObject *args)
2168{
2169 PyObject *orig_exc;
2170 PyObject *new_type, *new_value, *new_tb;
2171 PyObject *type, *value, *tb;
2172 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2173 &new_type, &new_value, &new_tb))
2174 return NULL;
2175
2176 PyErr_GetExcInfo(&type, &value, &tb);
2177
2178 Py_INCREF(new_type);
2179 Py_INCREF(new_value);
2180 Py_INCREF(new_tb);
2181 PyErr_SetExcInfo(new_type, new_value, new_tb);
2182
2183 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2184 Py_XDECREF(type);
2185 Py_XDECREF(value);
2186 Py_XDECREF(tb);
2187 return orig_exc;
2188}
Benjamin Peterson16323982010-02-03 01:13:41 +00002189
2190static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002191
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002192static PyObject *
2193test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 if (PyDateTimeAPI) {
2195 if (test_run_counter) {
2196 /* Probably regrtest.py -R */
2197 Py_RETURN_NONE;
2198 }
2199 else {
2200 PyErr_SetString(PyExc_AssertionError,
2201 "PyDateTime_CAPI somehow initialized");
2202 return NULL;
2203 }
2204 }
2205 test_run_counter++;
2206 PyDateTime_IMPORT;
2207 if (PyDateTimeAPI)
2208 Py_RETURN_NONE;
2209 else
2210 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002211}
2212
Benjamin Peterson16323982010-02-03 01:13:41 +00002213
2214#ifdef WITH_THREAD
2215
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002216/* test_thread_state spawns a thread of its own, and that thread releases
2217 * `thread_done` when it's finished. The driver code has to know when the
2218 * thread finishes, because the thread uses a PyObject (the callable) that
2219 * may go away when the driver finishes. The former lack of this explicit
2220 * synchronization caused rare segfaults, so rare that they were seen only
2221 * on a Mac buildbot (although they were possible on any box).
2222 */
2223static PyThread_type_lock thread_done = NULL;
2224
Benjamin Petersona786b022008-08-25 21:05:21 +00002225static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002226_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228 PyObject *rc;
2229 int success;
2230 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002231 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232 success = (rc != NULL);
2233 Py_XDECREF(rc);
2234 PyGILState_Release(s);
2235 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002236}
2237
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002238/* Same thing, but releases `thread_done` when it returns. This variant
2239 * should be called only from threads spawned by test_thread_state().
2240 */
2241static void
2242_make_call_from_thread(void *callable)
2243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 _make_call(callable);
2245 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002246}
2247
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002248static PyObject *
2249test_thread_state(PyObject *self, PyObject *args)
2250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 PyObject *fn;
2252 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2255 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 if (!PyCallable_Check(fn)) {
2258 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2259 fn->ob_type->tp_name);
2260 return NULL;
2261 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 /* Ensure Python is set up for threading */
2264 PyEval_InitThreads();
2265 thread_done = PyThread_allocate_lock();
2266 if (thread_done == NULL)
2267 return PyErr_NoMemory();
2268 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 /* Start a new thread with our callback. */
2271 PyThread_start_new_thread(_make_call_from_thread, fn);
2272 /* Make the callback with the thread lock held by this thread */
2273 success &= _make_call(fn);
2274 /* Do it all again, but this time with the thread-lock released */
2275 Py_BEGIN_ALLOW_THREADS
2276 success &= _make_call(fn);
2277 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2278 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 /* And once more with and without a thread
2281 XXX - should use a lock and work out exactly what we are trying
2282 to test <wink>
2283 */
2284 Py_BEGIN_ALLOW_THREADS
2285 PyThread_start_new_thread(_make_call_from_thread, fn);
2286 success &= _make_call(fn);
2287 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2288 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 /* Release lock we acquired above. This is required on HP-UX. */
2291 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002293 PyThread_free_lock(thread_done);
2294 if (!success)
2295 return NULL;
2296 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002297}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002298
2299/* test Py_AddPendingCalls using threads */
2300static int _pending_callback(void *arg)
2301{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 /* we assume the argument is callable object to which we own a reference */
2303 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002304 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 Py_DECREF(callable);
2306 Py_XDECREF(r);
2307 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002308}
2309
2310/* The following requests n callbacks to _pending_callback. It can be
2311 * run from any python thread.
2312 */
2313PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
2314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 PyObject *callable;
2316 int r;
2317 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2318 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 /* create the reference for the callbackwhile we hold the lock */
2321 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 Py_BEGIN_ALLOW_THREADS
2324 r = Py_AddPendingCall(&_pending_callback, callable);
2325 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 if (r<0) {
2328 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002329 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002331 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002332}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002333#endif
2334
Neal Norwitzb0d26332007-08-25 00:49:05 +00002335/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002336static PyObject *
2337test_string_from_format(PyObject *self, PyObject *args)
2338{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 PyObject *result;
2340 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002341
Alexander Belopolskye239d232010-12-08 23:31:48 +00002342#define CHECK_1_FORMAT(FORMAT, TYPE) \
2343 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2344 if (result == NULL) \
2345 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002346 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002347 msg = FORMAT " failed at 1"; \
2348 goto Fail; \
2349 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 CHECK_1_FORMAT("%d", int);
2353 CHECK_1_FORMAT("%ld", long);
2354 /* The z width modifier was added in Python 2.5. */
2355 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 /* The u type code was added in Python 2.5. */
2358 CHECK_1_FORMAT("%u", unsigned int);
2359 CHECK_1_FORMAT("%lu", unsigned long);
2360 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002363 CHECK_1_FORMAT("%llu", unsigned long long);
2364 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002367
2368 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 Py_XDECREF(result);
2370 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002371
2372#undef CHECK_1_FORMAT
2373}
2374
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002375
2376static PyObject *
2377test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2379 int result;
2380 if (py_s == NULL)
2381 return NULL;
2382 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2383 Py_DECREF(py_s);
2384 if (!result) {
2385 PyErr_SetString(TestError, "Python string ending in NULL "
2386 "should not compare equal to c string.");
2387 return NULL;
2388 }
2389 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002390}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002391
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002392/* This is here to provide a docstring for test_descr. */
2393static PyObject *
2394test_with_docstring(PyObject *self)
2395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002397}
2398
Mark Dickinson725bfd82009-05-03 20:33:40 +00002399/* Test PyOS_string_to_double. */
2400static PyObject *
2401test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 double result;
2403 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405#define CHECK_STRING(STR, expected) \
2406 result = PyOS_string_to_double(STR, NULL, NULL); \
2407 if (result == -1.0 && PyErr_Occurred()) \
2408 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002409 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 msg = "conversion of " STR " to float failed"; \
2411 goto fail; \
2412 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414#define CHECK_INVALID(STR) \
2415 result = PyOS_string_to_double(STR, NULL, NULL); \
2416 if (result == -1.0 && PyErr_Occurred()) { \
2417 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2418 PyErr_Clear(); \
2419 else \
2420 return NULL; \
2421 } \
2422 else { \
2423 msg = "conversion of " STR " didn't raise ValueError"; \
2424 goto fail; \
2425 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 CHECK_STRING("0.1", 0.1);
2428 CHECK_STRING("1.234", 1.234);
2429 CHECK_STRING("-1.35", -1.35);
2430 CHECK_STRING(".1e01", 1.0);
2431 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 CHECK_INVALID(" 0.1");
2434 CHECK_INVALID("\t\n-3");
2435 CHECK_INVALID(".123 ");
2436 CHECK_INVALID("3\n");
2437 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002440 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002442#undef CHECK_STRING
2443#undef CHECK_INVALID
2444}
2445
2446
Benjamin Petersonb173f782009-05-05 22:31:58 +00002447/* Coverage testing of capsule objects. */
2448
2449static const char *capsule_name = "capsule name";
2450static char *capsule_pointer = "capsule pointer";
2451static char *capsule_context = "capsule context";
2452static const char *capsule_error = NULL;
2453static int
2454capsule_destructor_call_count = 0;
2455
2456static void
2457capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 capsule_destructor_call_count++;
2459 if (PyCapsule_GetContext(o) != capsule_context) {
2460 capsule_error = "context did not match in destructor!";
2461 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2462 capsule_error = "destructor did not match in destructor! (woah!)";
2463 } else if (PyCapsule_GetName(o) != capsule_name) {
2464 capsule_error = "name did not match in destructor!";
2465 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2466 capsule_error = "pointer did not match in destructor!";
2467 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002468}
2469
2470typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 char *name;
2472 char *module;
2473 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002474} known_capsule;
2475
2476static PyObject *
2477test_capsule(PyObject *self, PyObject *args)
2478{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 PyObject *object;
2480 const char *error = NULL;
2481 void *pointer;
2482 void *pointer2;
2483 known_capsule known_capsules[] = {
2484 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2485 KNOWN_CAPSULE("_socket", "CAPI"),
2486 KNOWN_CAPSULE("_curses", "_C_API"),
2487 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2488 { NULL, NULL },
2489 };
2490 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002491
2492#define FAIL(x) { error = (x); goto exit; }
2493
2494#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002495 if (capsule_error) { \
2496 FAIL(capsule_error); \
2497 } \
2498 else if (!capsule_destructor_call_count) { \
2499 FAIL("destructor not called!"); \
2500 } \
2501 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2504 PyCapsule_SetContext(object, capsule_context);
2505 capsule_destructor(object);
2506 CHECK_DESTRUCTOR;
2507 Py_DECREF(object);
2508 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 object = PyCapsule_New(known, "ignored", NULL);
2511 PyCapsule_SetPointer(object, capsule_pointer);
2512 PyCapsule_SetName(object, capsule_name);
2513 PyCapsule_SetDestructor(object, capsule_destructor);
2514 PyCapsule_SetContext(object, capsule_context);
2515 capsule_destructor(object);
2516 CHECK_DESTRUCTOR;
2517 /* intentionally access using the wrong name */
2518 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2519 if (!PyErr_Occurred()) {
2520 FAIL("PyCapsule_GetPointer should have failed but did not!");
2521 }
2522 PyErr_Clear();
2523 if (pointer2) {
2524 if (pointer2 == capsule_pointer) {
2525 FAIL("PyCapsule_GetPointer should not have"
2526 " returned the internal pointer!");
2527 } else {
2528 FAIL("PyCapsule_GetPointer should have "
2529 "returned NULL pointer but did not!");
2530 }
2531 }
2532 PyCapsule_SetDestructor(object, NULL);
2533 Py_DECREF(object);
2534 if (capsule_destructor_call_count) {
2535 FAIL("destructor called when it should not have been!");
2536 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 for (known = &known_capsules[0]; known->module != NULL; known++) {
2539 /* yeah, ordinarily I wouldn't do this either,
2540 but it's fine for this test harness.
2541 */
2542 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002543#undef FAIL
2544#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 { \
2546 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2547 x, known->module, known->attribute); \
2548 error = buffer; \
2549 goto exit; \
2550 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 PyObject *module = PyImport_ImportModule(known->module);
2553 if (module) {
2554 pointer = PyCapsule_Import(known->name, 0);
2555 if (!pointer) {
2556 Py_DECREF(module);
2557 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2558 }
2559 object = PyObject_GetAttrString(module, known->attribute);
2560 if (!object) {
2561 Py_DECREF(module);
2562 return NULL;
2563 }
2564 pointer2 = PyCapsule_GetPointer(object,
2565 "weebles wobble but they don't fall down");
2566 if (!PyErr_Occurred()) {
2567 Py_DECREF(object);
2568 Py_DECREF(module);
2569 FAIL("PyCapsule_GetPointer should have failed but did not!");
2570 }
2571 PyErr_Clear();
2572 if (pointer2) {
2573 Py_DECREF(module);
2574 Py_DECREF(object);
2575 if (pointer2 == pointer) {
2576 FAIL("PyCapsule_GetPointer should not have"
2577 " returned its internal pointer!");
2578 } else {
2579 FAIL("PyCapsule_GetPointer should have"
2580 " returned NULL pointer but did not!");
2581 }
2582 }
2583 Py_DECREF(object);
2584 Py_DECREF(module);
2585 }
2586 else
2587 PyErr_Clear();
2588 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002589
2590 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 if (error) {
2592 return raiseTestError("test_capsule", error);
2593 }
2594 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002595#undef FAIL
2596}
2597
Guido van Rossumddefaf32007-01-14 03:31:43 +00002598#ifdef HAVE_GETTIMEOFDAY
2599/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002600static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 e->tv_sec -= s->tv_sec;
2603 e->tv_usec -= s->tv_usec;
2604 if (e->tv_usec < 0) {
2605 e->tv_sec -=1;
2606 e->tv_usec += 1000000;
2607 }
2608 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002609}
2610
2611static PyObject *
2612profile_int(PyObject *self, PyObject* args)
2613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 int i, k;
2615 struct timeval start, stop;
2616 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 /* Test 1: Allocate and immediately deallocate
2619 many small integers */
2620 gettimeofday(&start, NULL);
2621 for(k=0; k < 20000; k++)
2622 for(i=0; i < 1000; i++) {
2623 single = PyLong_FromLong(i);
2624 Py_DECREF(single);
2625 }
2626 gettimeofday(&stop, NULL);
2627 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 /* Test 2: Allocate and immediately deallocate
2630 many large integers */
2631 gettimeofday(&start, NULL);
2632 for(k=0; k < 20000; k++)
2633 for(i=0; i < 1000; i++) {
2634 single = PyLong_FromLong(i+1000000);
2635 Py_DECREF(single);
2636 }
2637 gettimeofday(&stop, NULL);
2638 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 /* Test 3: Allocate a few integers, then release
2641 them all simultaneously. */
2642 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002643 if (multiple == NULL)
2644 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002645 gettimeofday(&start, NULL);
2646 for(k=0; k < 20000; k++) {
2647 for(i=0; i < 1000; i++) {
2648 multiple[i] = PyLong_FromLong(i+1000000);
2649 }
2650 for(i=0; i < 1000; i++) {
2651 Py_DECREF(multiple[i]);
2652 }
2653 }
2654 gettimeofday(&stop, NULL);
2655 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002656 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 /* Test 4: Allocate many integers, then release
2659 them all simultaneously. */
2660 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002661 if (multiple == NULL)
2662 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002663 gettimeofday(&start, NULL);
2664 for(k=0; k < 20; k++) {
2665 for(i=0; i < 1000000; i++) {
2666 multiple[i] = PyLong_FromLong(i+1000000);
2667 }
2668 for(i=0; i < 1000000; i++) {
2669 Py_DECREF(multiple[i]);
2670 }
2671 }
2672 gettimeofday(&stop, NULL);
2673 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002674 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002676 /* Test 5: Allocate many integers < 32000 */
2677 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002678 if (multiple == NULL)
2679 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 gettimeofday(&start, NULL);
2681 for(k=0; k < 10; k++) {
2682 for(i=0; i < 1000000; i++) {
2683 multiple[i] = PyLong_FromLong(i+1000);
2684 }
2685 for(i=0; i < 1000000; i++) {
2686 Py_DECREF(multiple[i]);
2687 }
2688 }
2689 gettimeofday(&stop, NULL);
2690 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002691 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 /* Test 6: Perform small int addition */
2694 op1 = PyLong_FromLong(1);
2695 gettimeofday(&start, NULL);
2696 for(i=0; i < 10000000; i++) {
2697 result = PyNumber_Add(op1, op1);
2698 Py_DECREF(result);
2699 }
2700 gettimeofday(&stop, NULL);
2701 Py_DECREF(op1);
2702 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 /* Test 7: Perform medium int addition */
2705 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002706 if (op1 == NULL)
2707 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 gettimeofday(&start, NULL);
2709 for(i=0; i < 10000000; i++) {
2710 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002711 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 }
2713 gettimeofday(&stop, NULL);
2714 Py_DECREF(op1);
2715 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002716
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002717 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002718}
2719#endif
2720
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002721/* To test the format of tracebacks as printed out. */
2722static PyObject *
2723traceback_print(PyObject *self, PyObject *args)
2724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 PyObject *file;
2726 PyObject *traceback;
2727 int result;
2728
2729 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2730 &traceback, &file))
2731 return NULL;
2732
2733 result = PyTraceBack_Print(traceback, file);
2734 if (result < 0)
2735 return NULL;
2736 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002737}
2738
Benjamin Petersone6528212008-07-15 15:32:09 +00002739/* To test the format of exceptions as printed out. */
2740static PyObject *
2741exception_print(PyObject *self, PyObject *args)
2742{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 PyObject *value;
2744 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 if (!PyArg_ParseTuple(args, "O:exception_print",
2747 &value))
2748 return NULL;
2749 if (!PyExceptionInstance_Check(value)) {
2750 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2751 return NULL;
2752 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 tb = PyException_GetTraceback(value);
2755 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2756 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002759}
2760
2761
2762
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002763
2764/* reliably raise a MemoryError */
2765static PyObject *
2766raise_memoryerror(PyObject *self)
2767{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 PyErr_NoMemory();
2769 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002770}
2771
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002772/* Issue 6012 */
2773static PyObject *str1, *str2;
2774static int
2775failing_converter(PyObject *obj, void *arg)
2776{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 /* Clone str1, then let the conversion fail. */
2778 assert(str1);
2779 str2 = str1;
2780 Py_INCREF(str2);
2781 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002782}
2783static PyObject*
2784argparsing(PyObject *o, PyObject *args)
2785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 PyObject *res;
2787 str1 = str2 = NULL;
2788 if (!PyArg_ParseTuple(args, "O&O&",
2789 PyUnicode_FSConverter, &str1,
2790 failing_converter, &str2)) {
2791 if (!str2)
2792 /* argument converter not called? */
2793 return NULL;
2794 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002795 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 Py_DECREF(str2);
2797 PyErr_Clear();
2798 return res;
2799 }
2800 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002801}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002802
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002803/* To test that the result of PyCode_NewEmpty has the right members. */
2804static PyObject *
2805code_newempty(PyObject *self, PyObject *args)
2806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 const char *filename;
2808 const char *funcname;
2809 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2812 &filename, &funcname, &firstlineno))
2813 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002815 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002816}
2817
Georg Brandl1e28a272009-12-28 08:41:01 +00002818/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2819 Run via Lib/test/test_exceptions.py */
2820static PyObject *
2821make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2822{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 const char *name;
2824 const char *doc = NULL;
2825 PyObject *base = NULL;
2826 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2831 "s|sOO:make_exception_with_doc", kwlist,
2832 &name, &doc, &base, &dict))
2833 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002836}
2837
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002838static PyObject *
2839make_memoryview_from_NULL_pointer(PyObject *self)
2840{
2841 Py_buffer info;
2842 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2843 return NULL;
2844 return PyMemoryView_FromBuffer(&info);
2845}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002846
Stefan Krah7213fcc2015-02-01 16:19:23 +01002847static PyObject *
2848test_from_contiguous(PyObject* self, PyObject *noargs)
2849{
2850 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2851 int init[5] = {0, 1, 2, 3, 4};
2852 Py_ssize_t itemsize = sizeof(int);
2853 Py_ssize_t shape = 5;
2854 Py_ssize_t strides = 2 * itemsize;
2855 Py_buffer view = {
2856 data,
2857 NULL,
2858 5 * itemsize,
2859 itemsize,
2860 1,
2861 1,
2862 NULL,
2863 &shape,
2864 &strides,
2865 NULL,
2866 NULL
2867 };
2868 int *ptr;
2869 int i;
2870
2871 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2872 ptr = view.buf;
2873 for (i = 0; i < 5; i++) {
2874 if (ptr[2*i] != i) {
2875 PyErr_SetString(TestError,
2876 "test_from_contiguous: incorrect result");
2877 return NULL;
2878 }
2879 }
2880
2881 view.buf = &data[8];
2882 view.strides[0] = -2 * itemsize;
2883
2884 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2885 ptr = view.buf;
2886 for (i = 0; i < 5; i++) {
2887 if (*(ptr-2*i) != i) {
2888 PyErr_SetString(TestError,
2889 "test_from_contiguous: incorrect result");
2890 return NULL;
2891 }
2892 }
2893
2894 Py_RETURN_NONE;
2895}
Stefan Krah650c1e82015-02-03 21:43:23 +01002896
Stefan Kraha7559c02015-02-03 22:27:21 +01002897#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01002898extern PyTypeObject _PyBytesIOBuffer_Type;
2899
Stefan Krah5178d912015-02-03 16:57:21 +01002900static PyObject *
2901test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
2902{
Stefan Krah650c1e82015-02-03 21:43:23 +01002903 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01002904 PyObject *b;
2905 char *dummy[1];
2906 int ret, match;
2907
Stefan Krah650c1e82015-02-03 21:43:23 +01002908 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01002909 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
2910 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2911 PyErr_Clear();
2912 if (ret != -1 || match == 0)
2913 goto error;
2914
Stefan Krah650c1e82015-02-03 21:43:23 +01002915 /* bytesiobuf_getbuffer() */
2916 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01002917 if (b == NULL) {
2918 return NULL;
2919 }
2920
2921 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
2922 Py_DECREF(b);
2923 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2924 PyErr_Clear();
2925 if (ret != -1 || match == 0)
2926 goto error;
2927
2928 Py_RETURN_NONE;
2929
2930error:
2931 PyErr_SetString(TestError,
2932 "test_pep3118_obsolete_write_locks: failure");
2933 return NULL;
2934}
Stefan Kraha7559c02015-02-03 22:27:21 +01002935#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002936
Stefan Krah650c1e82015-02-03 21:43:23 +01002937/* This tests functions that historically supported write locks. It is
2938 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
2939 is entitled to segfault in that case. */
2940static PyObject *
2941getbuffer_with_null_view(PyObject* self, PyObject *obj)
2942{
2943 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
2944 return NULL;
2945
2946 Py_RETURN_NONE;
2947}
2948
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002949/* Test that the fatal error from not having a current thread doesn't
2950 cause an infinite loop. Run via Lib/test/test_capi.py */
2951static PyObject *
2952crash_no_current_thread(PyObject *self)
2953{
2954 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002955 /* Using PyThreadState_Get() directly allows the test to pass in
2956 !pydebug mode. However, the test only actually tests anything
2957 in pydebug mode, since that's where the infinite loop was in
2958 the first place. */
2959 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002960 Py_END_ALLOW_THREADS
2961 return NULL;
2962}
2963
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002964/* To run some code in a sub-interpreter. */
2965static PyObject *
2966run_in_subinterp(PyObject *self, PyObject *args)
2967{
2968 const char *code;
2969 int r;
2970 PyThreadState *substate, *mainstate;
2971
2972 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2973 &code))
2974 return NULL;
2975
2976 mainstate = PyThreadState_Get();
2977
2978 PyThreadState_Swap(NULL);
2979
2980 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002981 if (substate == NULL) {
2982 /* Since no new thread state was created, there is no exception to
2983 propagate; raise a fresh one after swapping in the old thread
2984 state. */
2985 PyThreadState_Swap(mainstate);
2986 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2987 return NULL;
2988 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002989 r = PyRun_SimpleString(code);
2990 Py_EndInterpreter(substate);
2991
2992 PyThreadState_Swap(mainstate);
2993
2994 return PyLong_FromLong(r);
2995}
2996
Victor Stinner3c1b3792014-02-17 00:02:43 +01002997static int
2998check_time_rounding(int round)
2999{
Victor Stinner74474232015-09-02 01:43:56 +02003000 if (round != _PyTime_ROUND_FLOOR
3001 && round != _PyTime_ROUND_CEILING
Victor Stinner7667f582015-09-09 01:02:23 +02003002 && round != _PyTime_ROUND_HALF_EVEN) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003003 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3004 return -1;
3005 }
3006 return 0;
3007}
3008
Victor Stinner5d272cc2012-03-13 13:35:55 +01003009static PyObject *
3010test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3011{
3012 PyObject *obj;
3013 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003014 int round;
3015 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003016 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003017 if (check_time_rounding(round) < 0)
3018 return NULL;
3019 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003020 return NULL;
3021 return _PyLong_FromTime_t(sec);
3022}
3023
3024static PyObject *
3025test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3026{
3027 PyObject *obj;
3028 time_t sec;
3029 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003030 int round;
3031 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003032 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003033 if (check_time_rounding(round) < 0)
3034 return NULL;
3035 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003036 return NULL;
3037 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3038}
3039
Victor Stinner643cd682012-03-02 22:54:03 +01003040static PyObject *
3041test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3042{
3043 PyObject *obj;
3044 time_t sec;
3045 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003046 int round;
3047 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003048 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003049 if (check_time_rounding(round) < 0)
3050 return NULL;
3051 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003052 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003053 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003054}
3055
Antoine Pitrou796564c2013-07-30 19:59:21 +02003056static void
3057slot_tp_del(PyObject *self)
3058{
3059 _Py_IDENTIFIER(__tp_del__);
3060 PyObject *del, *res;
3061 PyObject *error_type, *error_value, *error_traceback;
3062
3063 /* Temporarily resurrect the object. */
3064 assert(self->ob_refcnt == 0);
3065 self->ob_refcnt = 1;
3066
3067 /* Save the current exception, if any. */
3068 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3069
3070 /* Execute __del__ method, if any. */
3071 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3072 if (del != NULL) {
3073 res = PyEval_CallObject(del, NULL);
3074 if (res == NULL)
3075 PyErr_WriteUnraisable(del);
3076 else
3077 Py_DECREF(res);
3078 Py_DECREF(del);
3079 }
3080
3081 /* Restore the saved exception. */
3082 PyErr_Restore(error_type, error_value, error_traceback);
3083
3084 /* Undo the temporary resurrection; can't use DECREF here, it would
3085 * cause a recursive call.
3086 */
3087 assert(self->ob_refcnt > 0);
3088 if (--self->ob_refcnt == 0)
3089 return; /* this is the normal path out */
3090
3091 /* __del__ resurrected it! Make it look like the original Py_DECREF
3092 * never happened.
3093 */
3094 {
3095 Py_ssize_t refcnt = self->ob_refcnt;
3096 _Py_NewReference(self);
3097 self->ob_refcnt = refcnt;
3098 }
3099 assert(!PyType_IS_GC(Py_TYPE(self)) ||
3100 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
3101 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3102 * we need to undo that. */
3103 _Py_DEC_REFTOTAL;
3104 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3105 * chain, so no more to do there.
3106 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3107 * _Py_NewReference bumped tp_allocs: both of those need to be
3108 * undone.
3109 */
3110#ifdef COUNT_ALLOCS
3111 --Py_TYPE(self)->tp_frees;
3112 --Py_TYPE(self)->tp_allocs;
3113#endif
3114}
3115
3116static PyObject *
3117with_tp_del(PyObject *self, PyObject *args)
3118{
3119 PyObject *obj;
3120 PyTypeObject *tp;
3121
3122 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3123 return NULL;
3124 tp = (PyTypeObject *) obj;
3125 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3126 PyErr_Format(PyExc_TypeError,
3127 "heap type expected, got %R", obj);
3128 return NULL;
3129 }
3130 tp->tp_del = slot_tp_del;
3131 Py_INCREF(obj);
3132 return obj;
3133}
3134
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003135static PyMethodDef ml;
3136
3137static PyObject *
3138create_cfunction(PyObject *self, PyObject *args)
3139{
3140 return PyCFunction_NewEx(&ml, self, NULL);
3141}
3142
3143static PyMethodDef ml = {
3144 "create_cfunction",
3145 create_cfunction,
3146 METH_NOARGS,
3147 NULL
3148};
3149
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003150static PyObject *
3151_test_incref(PyObject *ob)
3152{
3153 Py_INCREF(ob);
3154 return ob;
3155}
3156
3157static PyObject *
3158test_xincref_doesnt_leak(PyObject *ob)
3159{
3160 PyObject *obj = PyLong_FromLong(0);
3161 Py_XINCREF(_test_incref(obj));
3162 Py_DECREF(obj);
3163 Py_DECREF(obj);
3164 Py_DECREF(obj);
3165 Py_RETURN_NONE;
3166}
3167
3168static PyObject *
3169test_incref_doesnt_leak(PyObject *ob)
3170{
3171 PyObject *obj = PyLong_FromLong(0);
3172 Py_INCREF(_test_incref(obj));
3173 Py_DECREF(obj);
3174 Py_DECREF(obj);
3175 Py_DECREF(obj);
3176 Py_RETURN_NONE;
3177}
3178
3179static PyObject *
3180test_xdecref_doesnt_leak(PyObject *ob)
3181{
3182 Py_XDECREF(PyLong_FromLong(0));
3183 Py_RETURN_NONE;
3184}
3185
3186static PyObject *
3187test_decref_doesnt_leak(PyObject *ob)
3188{
3189 Py_DECREF(PyLong_FromLong(0));
3190 Py_RETURN_NONE;
3191}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003192
Victor Stinner0507bf52013-07-07 02:05:46 +02003193static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02003194test_incref_decref_API(PyObject *ob)
3195{
3196 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003197 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003198 Py_DecRef(obj);
3199 Py_DecRef(obj);
3200 Py_RETURN_NONE;
3201}
3202
3203static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02003204test_pymem_alloc0(PyObject *self)
3205{
3206 void *ptr;
3207
Victor Stinnerdb067af2014-05-02 22:31:14 +02003208 ptr = PyMem_RawMalloc(0);
3209 if (ptr == NULL) {
3210 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3211 return NULL;
3212 }
3213 PyMem_RawFree(ptr);
3214
3215 ptr = PyMem_RawCalloc(0, 0);
3216 if (ptr == NULL) {
3217 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3218 return NULL;
3219 }
3220 PyMem_RawFree(ptr);
3221
Victor Stinner0507bf52013-07-07 02:05:46 +02003222 ptr = PyMem_Malloc(0);
3223 if (ptr == NULL) {
3224 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3225 return NULL;
3226 }
3227 PyMem_Free(ptr);
3228
Victor Stinnerdb067af2014-05-02 22:31:14 +02003229 ptr = PyMem_Calloc(0, 0);
3230 if (ptr == NULL) {
3231 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3232 return NULL;
3233 }
3234 PyMem_Free(ptr);
3235
Victor Stinner0507bf52013-07-07 02:05:46 +02003236 ptr = PyObject_Malloc(0);
3237 if (ptr == NULL) {
3238 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3239 return NULL;
3240 }
3241 PyObject_Free(ptr);
3242
Victor Stinnerdb067af2014-05-02 22:31:14 +02003243 ptr = PyObject_Calloc(0, 0);
3244 if (ptr == NULL) {
3245 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3246 return NULL;
3247 }
3248 PyObject_Free(ptr);
3249
Victor Stinner0507bf52013-07-07 02:05:46 +02003250 Py_RETURN_NONE;
3251}
3252
3253typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003254 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003255
3256 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003257 size_t calloc_nelem;
3258 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003259 void *realloc_ptr;
3260 size_t realloc_new_size;
3261 void *free_ptr;
3262} alloc_hook_t;
3263
3264static void* hook_malloc (void* ctx, size_t size)
3265{
3266 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3267 hook->malloc_size = size;
3268 return hook->alloc.malloc(hook->alloc.ctx, size);
3269}
3270
Victor Stinnerdb067af2014-05-02 22:31:14 +02003271static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
3272{
3273 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3274 hook->calloc_nelem = nelem;
3275 hook->calloc_elsize = elsize;
3276 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3277}
3278
Victor Stinner0507bf52013-07-07 02:05:46 +02003279static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
3280{
3281 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3282 hook->realloc_ptr = ptr;
3283 hook->realloc_new_size = new_size;
3284 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3285}
3286
3287static void hook_free (void *ctx, void *ptr)
3288{
3289 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3290 hook->free_ptr = ptr;
3291 hook->alloc.free(hook->alloc.ctx, ptr);
3292}
3293
3294static PyObject *
3295test_setallocators(PyMemAllocatorDomain domain)
3296{
3297 PyObject *res = NULL;
3298 const char *error_msg;
3299 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003300 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003301 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003302 void *ptr, *ptr2;
3303
Victor Stinnerdb067af2014-05-02 22:31:14 +02003304 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003305
3306 alloc.ctx = &hook;
3307 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003308 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003309 alloc.realloc = &hook_realloc;
3310 alloc.free = &hook_free;
3311 PyMem_GetAllocator(domain, &hook.alloc);
3312 PyMem_SetAllocator(domain, &alloc);
3313
3314 size = 42;
3315 switch(domain)
3316 {
3317 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3318 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3319 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3320 default: ptr = NULL; break;
3321 }
3322
3323 if (ptr == NULL) {
3324 error_msg = "malloc failed";
3325 goto fail;
3326 }
3327
3328 if (hook.malloc_size != size) {
3329 error_msg = "malloc invalid size";
3330 goto fail;
3331 }
3332
3333 size2 = 200;
3334 switch(domain)
3335 {
3336 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3337 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3338 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003339 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003340 }
3341
3342 if (ptr2 == NULL) {
3343 error_msg = "realloc failed";
3344 goto fail;
3345 }
3346
3347 if (hook.realloc_ptr != ptr
3348 || hook.realloc_new_size != size2) {
3349 error_msg = "realloc invalid parameters";
3350 goto fail;
3351 }
3352
3353 switch(domain)
3354 {
3355 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3356 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3357 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3358 }
3359
3360 if (hook.free_ptr != ptr2) {
3361 error_msg = "free invalid pointer";
3362 goto fail;
3363 }
3364
Victor Stinnerdb067af2014-05-02 22:31:14 +02003365 nelem = 2;
3366 elsize = 5;
3367 switch(domain)
3368 {
3369 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3370 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3371 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3372 default: ptr = NULL; break;
3373 }
3374
3375 if (ptr == NULL) {
3376 error_msg = "calloc failed";
3377 goto fail;
3378 }
3379
3380 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3381 error_msg = "calloc invalid nelem or elsize";
3382 goto fail;
3383 }
3384
3385 switch(domain)
3386 {
3387 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3388 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3389 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3390 }
3391
Victor Stinner0507bf52013-07-07 02:05:46 +02003392 Py_INCREF(Py_None);
3393 res = Py_None;
3394 goto finally;
3395
3396fail:
3397 PyErr_SetString(PyExc_RuntimeError, error_msg);
3398
3399finally:
3400 PyMem_SetAllocator(domain, &hook.alloc);
3401 return res;
3402}
3403
3404static PyObject *
3405test_pymem_setrawallocators(PyObject *self)
3406{
3407 return test_setallocators(PYMEM_DOMAIN_RAW);
3408}
3409
3410static PyObject *
3411test_pymem_setallocators(PyObject *self)
3412{
3413 return test_setallocators(PYMEM_DOMAIN_MEM);
3414}
3415
3416static PyObject *
3417test_pyobject_setallocators(PyObject *self)
3418{
3419 return test_setallocators(PYMEM_DOMAIN_OBJ);
3420}
3421
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003422PyDoc_STRVAR(docstring_empty,
3423""
3424);
3425
3426PyDoc_STRVAR(docstring_no_signature,
3427"This docstring has no signature."
3428);
3429
3430PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003431"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003432"\n"
3433"This docstring has an invalid signature."
3434);
3435
Larry Hastings2623c8c2014-02-08 22:15:29 -08003436PyDoc_STRVAR(docstring_with_invalid_signature2,
3437"docstring_with_invalid_signature2($module, /, boo)\n"
3438"\n"
3439"--\n"
3440"\n"
3441"This docstring also has an invalid signature."
3442);
3443
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003444PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003445"docstring_with_signature($module, /, sig)\n"
3446"--\n"
3447"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003448"This docstring has a valid signature."
3449);
3450
Zachary Ware8ef887c2015-04-13 18:22:35 -05003451PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3452"docstring_with_signature_but_no_doc($module, /, sig)\n"
3453"--\n"
3454"\n"
3455);
3456
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003457PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003458"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3459"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003460"\n"
3461"\n"
3462"This docstring has a valid signature and some extra newlines."
3463);
3464
Larry Hastings16c51912014-01-07 11:53:01 -08003465PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003466"docstring_with_signature_with_defaults(module, s='avocado',\n"
3467" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3468" local=the_number_three, sys=sys.maxsize,\n"
3469" exp=sys.maxsize - 1)\n"
3470"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003471"\n"
3472"\n"
3473"\n"
3474"This docstring has a valid signature with parameters,\n"
3475"and the parameters take defaults of varying types."
3476);
3477
Victor Stinner258e4d32013-12-13 02:30:12 +01003478#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003479typedef struct {
3480 PyThread_type_lock start_event;
3481 PyThread_type_lock exit_event;
3482 PyObject *callback;
3483} test_c_thread_t;
3484
3485static void
3486temporary_c_thread(void *data)
3487{
3488 test_c_thread_t *test_c_thread = data;
3489 PyGILState_STATE state;
3490 PyObject *res;
3491
3492 PyThread_release_lock(test_c_thread->start_event);
3493
3494 /* Allocate a Python thread state for this thread */
3495 state = PyGILState_Ensure();
3496
Victor Stinner3466bde2016-09-05 18:16:01 -07003497 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003498 Py_CLEAR(test_c_thread->callback);
3499
3500 if (res == NULL) {
3501 PyErr_Print();
3502 }
3503 else {
3504 Py_DECREF(res);
3505 }
3506
3507 /* Destroy the Python thread state for this thread */
3508 PyGILState_Release(state);
3509
3510 PyThread_release_lock(test_c_thread->exit_event);
3511
3512 PyThread_exit_thread();
3513}
3514
3515static PyObject *
3516call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3517{
3518 PyObject *res = NULL;
3519 test_c_thread_t test_c_thread;
3520 long thread;
3521
3522 PyEval_InitThreads();
3523
3524 test_c_thread.start_event = PyThread_allocate_lock();
3525 test_c_thread.exit_event = PyThread_allocate_lock();
3526 test_c_thread.callback = NULL;
3527 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3528 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3529 goto exit;
3530 }
3531
3532 Py_INCREF(callback);
3533 test_c_thread.callback = callback;
3534
3535 PyThread_acquire_lock(test_c_thread.start_event, 1);
3536 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3537
3538 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3539 if (thread == -1) {
3540 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3541 PyThread_release_lock(test_c_thread.start_event);
3542 PyThread_release_lock(test_c_thread.exit_event);
3543 goto exit;
3544 }
3545
3546 PyThread_acquire_lock(test_c_thread.start_event, 1);
3547 PyThread_release_lock(test_c_thread.start_event);
3548
3549 Py_BEGIN_ALLOW_THREADS
3550 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3551 PyThread_release_lock(test_c_thread.exit_event);
3552 Py_END_ALLOW_THREADS
3553
3554 Py_INCREF(Py_None);
3555 res = Py_None;
3556
3557exit:
3558 Py_CLEAR(test_c_thread.callback);
3559 if (test_c_thread.start_event)
3560 PyThread_free_lock(test_c_thread.start_event);
3561 if (test_c_thread.exit_event)
3562 PyThread_free_lock(test_c_thread.exit_event);
3563 return res;
3564}
Victor Stinner258e4d32013-12-13 02:30:12 +01003565#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003566
Victor Stinner56e8c292014-07-21 12:30:22 +02003567static PyObject*
3568test_raise_signal(PyObject* self, PyObject *args)
3569{
3570 int signum, err;
3571
3572 if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0)
3573 return NULL;
3574
3575 err = raise(signum);
3576 if (err)
3577 return PyErr_SetFromErrno(PyExc_OSError);
3578
3579 if (PyErr_CheckSignals() < 0)
3580 return NULL;
3581
3582 Py_RETURN_NONE;
3583}
3584
Serhiy Storchakab5181342015-02-06 08:58:56 +02003585/* marshal */
3586
3587static PyObject*
3588pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3589{
3590 long value;
3591 char *filename;
3592 int version;
3593 FILE *fp;
3594
3595 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3596 &value, &filename, &version))
3597 return NULL;
3598
3599 fp = fopen(filename, "wb");
3600 if (fp == NULL) {
3601 PyErr_SetFromErrno(PyExc_OSError);
3602 return NULL;
3603 }
3604
3605 PyMarshal_WriteLongToFile(value, fp, version);
3606
3607 fclose(fp);
3608 if (PyErr_Occurred())
3609 return NULL;
3610 Py_RETURN_NONE;
3611}
3612
3613static PyObject*
3614pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3615{
3616 PyObject *obj;
3617 char *filename;
3618 int version;
3619 FILE *fp;
3620
3621 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3622 &obj, &filename, &version))
3623 return NULL;
3624
3625 fp = fopen(filename, "wb");
3626 if (fp == NULL) {
3627 PyErr_SetFromErrno(PyExc_OSError);
3628 return NULL;
3629 }
3630
3631 PyMarshal_WriteObjectToFile(obj, fp, version);
3632
3633 fclose(fp);
3634 if (PyErr_Occurred())
3635 return NULL;
3636 Py_RETURN_NONE;
3637}
3638
3639static PyObject*
3640pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3641{
3642 int value;
3643 long pos;
3644 char *filename;
3645 FILE *fp;
3646
3647 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3648 return NULL;
3649
3650 fp = fopen(filename, "rb");
3651 if (fp == NULL) {
3652 PyErr_SetFromErrno(PyExc_OSError);
3653 return NULL;
3654 }
3655
3656 value = PyMarshal_ReadShortFromFile(fp);
3657 pos = ftell(fp);
3658
3659 fclose(fp);
3660 if (PyErr_Occurred())
3661 return NULL;
3662 return Py_BuildValue("il", value, pos);
3663}
3664
3665static PyObject*
3666pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3667{
3668 long value, pos;
3669 char *filename;
3670 FILE *fp;
3671
3672 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3673 return NULL;
3674
3675 fp = fopen(filename, "rb");
3676 if (fp == NULL) {
3677 PyErr_SetFromErrno(PyExc_OSError);
3678 return NULL;
3679 }
3680
3681 value = PyMarshal_ReadLongFromFile(fp);
3682 pos = ftell(fp);
3683
3684 fclose(fp);
3685 if (PyErr_Occurred())
3686 return NULL;
3687 return Py_BuildValue("ll", value, pos);
3688}
3689
3690static PyObject*
3691pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3692{
3693 PyObject *obj;
3694 long pos;
3695 char *filename;
3696 FILE *fp;
3697
3698 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3699 return NULL;
3700
3701 fp = fopen(filename, "rb");
3702 if (fp == NULL) {
3703 PyErr_SetFromErrno(PyExc_OSError);
3704 return NULL;
3705 }
3706
3707 obj = PyMarshal_ReadLastObjectFromFile(fp);
3708 pos = ftell(fp);
3709
3710 fclose(fp);
3711 return Py_BuildValue("Nl", obj, pos);
3712}
3713
3714static PyObject*
3715pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3716{
3717 PyObject *obj;
3718 long pos;
3719 char *filename;
3720 FILE *fp;
3721
3722 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3723 return NULL;
3724
3725 fp = fopen(filename, "rb");
3726 if (fp == NULL) {
3727 PyErr_SetFromErrno(PyExc_OSError);
3728 return NULL;
3729 }
3730
3731 obj = PyMarshal_ReadObjectFromFile(fp);
3732 pos = ftell(fp);
3733
3734 fclose(fp);
3735 return Py_BuildValue("Nl", obj, pos);
3736}
3737
Victor Stinnerefde1462015-03-21 15:04:43 +01003738static PyObject*
3739return_null_without_error(PyObject *self, PyObject *args)
3740{
3741 /* invalid call: return NULL without setting an error,
3742 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3743 PyErr_Clear();
3744 return NULL;
3745}
3746
3747static PyObject*
3748return_result_with_error(PyObject *self, PyObject *args)
3749{
3750 /* invalid call: return a result with an error set,
3751 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3752 PyErr_SetNone(PyExc_ValueError);
3753 Py_RETURN_NONE;
3754}
3755
Victor Stinner992c43f2015-03-27 17:12:45 +01003756static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02003757test_pytime_fromseconds(PyObject *self, PyObject *args)
3758{
3759 int seconds;
3760 _PyTime_t ts;
3761
3762 if (!PyArg_ParseTuple(args, "i", &seconds))
3763 return NULL;
3764 ts = _PyTime_FromSeconds(seconds);
3765 return _PyTime_AsNanosecondsObject(ts);
3766}
3767
3768static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01003769test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
3770{
3771 PyObject *obj;
3772 int round;
3773 _PyTime_t ts;
3774
3775 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
3776 return NULL;
3777 if (check_time_rounding(round) < 0)
3778 return NULL;
3779 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
3780 return NULL;
3781 return _PyTime_AsNanosecondsObject(ts);
3782}
3783
Victor Stinner4bfb4602015-03-27 22:27:24 +01003784static PyObject *
3785test_pytime_assecondsdouble(PyObject *self, PyObject *args)
3786{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003787 long long ns;
Victor Stinner4bfb4602015-03-27 22:27:24 +01003788 _PyTime_t ts;
3789 double d;
3790
3791 if (!PyArg_ParseTuple(args, "L", &ns))
3792 return NULL;
3793 ts = _PyTime_FromNanoseconds(ns);
3794 d = _PyTime_AsSecondsDouble(ts);
3795 return PyFloat_FromDouble(d);
3796}
3797
Victor Stinner95e9cef2015-03-28 01:26:47 +01003798static PyObject *
3799test_PyTime_AsTimeval(PyObject *self, PyObject *args)
3800{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003801 long long ns;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003802 int round;
3803 _PyTime_t t;
3804 struct timeval tv;
3805 PyObject *seconds;
3806
3807 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3808 return NULL;
3809 if (check_time_rounding(round) < 0)
3810 return NULL;
3811 t = _PyTime_FromNanoseconds(ns);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +02003812 if (_PyTime_AsTimeval(t, &tv, round) < 0)
Victor Stinner95e9cef2015-03-28 01:26:47 +01003813 return NULL;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003814
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003815 seconds = PyLong_FromLong((long long)tv.tv_sec);
Victor Stinner95e9cef2015-03-28 01:26:47 +01003816 if (seconds == NULL)
3817 return NULL;
3818 return Py_BuildValue("Nl", seconds, tv.tv_usec);
3819}
3820
Victor Stinner34dc0f42015-03-27 18:19:03 +01003821#ifdef HAVE_CLOCK_GETTIME
3822static PyObject *
3823test_PyTime_AsTimespec(PyObject *self, PyObject *args)
3824{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003825 long long ns;
Victor Stinner34dc0f42015-03-27 18:19:03 +01003826 _PyTime_t t;
3827 struct timespec ts;
3828
3829 if (!PyArg_ParseTuple(args, "L", &ns))
3830 return NULL;
3831 t = _PyTime_FromNanoseconds(ns);
3832 if (_PyTime_AsTimespec(t, &ts) == -1)
3833 return NULL;
3834 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
3835}
3836#endif
3837
Victor Stinner62d1c702015-04-01 17:47:07 +02003838static PyObject *
3839test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
3840{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003841 long long ns;
Victor Stinner62d1c702015-04-01 17:47:07 +02003842 int round;
3843 _PyTime_t t, ms;
3844
3845 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3846 return NULL;
3847 if (check_time_rounding(round) < 0)
3848 return NULL;
3849 t = _PyTime_FromNanoseconds(ns);
3850 ms = _PyTime_AsMilliseconds(t, round);
3851 /* This conversion rely on the fact that _PyTime_t is a number of
3852 nanoseconds */
3853 return _PyTime_AsNanosecondsObject(ms);
3854}
3855
3856static PyObject *
3857test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
3858{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003859 long long ns;
Victor Stinner62d1c702015-04-01 17:47:07 +02003860 int round;
3861 _PyTime_t t, ms;
3862
3863 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3864 return NULL;
3865 if (check_time_rounding(round) < 0)
3866 return NULL;
3867 t = _PyTime_FromNanoseconds(ns);
3868 ms = _PyTime_AsMicroseconds(t, round);
3869 /* This conversion rely on the fact that _PyTime_t is a number of
3870 nanoseconds */
3871 return _PyTime_AsNanosecondsObject(ms);
3872}
3873
Victor Stinner50856d52015-10-13 00:11:21 +02003874static PyObject*
3875get_recursion_depth(PyObject *self, PyObject *args)
3876{
3877 PyThreadState *tstate = PyThreadState_GET();
3878
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07003879 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02003880 return PyLong_FromLong(tstate->recursion_depth - 1);
3881}
3882
Victor Stinner34be8072016-03-14 12:04:26 +01003883static PyObject*
3884pymem_buffer_overflow(PyObject *self, PyObject *args)
3885{
3886 char *buffer;
3887
3888 /* Deliberate buffer overflow to check that PyMem_Free() detects
3889 the overflow when debug hooks are installed. */
3890 buffer = PyMem_Malloc(16);
3891 buffer[16] = 'x';
3892 PyMem_Free(buffer);
3893
3894 Py_RETURN_NONE;
3895}
3896
3897static PyObject*
3898pymem_api_misuse(PyObject *self, PyObject *args)
3899{
3900 char *buffer;
3901
3902 /* Deliberate misusage of Python allocators:
3903 allococate with PyMem but release with PyMem_Raw. */
3904 buffer = PyMem_Malloc(16);
3905 PyMem_RawFree(buffer);
3906
3907 Py_RETURN_NONE;
3908}
3909
Victor Stinnerc4aec362016-03-14 22:26:53 +01003910static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01003911pymem_malloc_without_gil(PyObject *self, PyObject *args)
3912{
3913 char *buffer;
3914
3915 /* Deliberate bug to test debug hooks on Python memory allocators:
3916 call PyMem_Malloc() without holding the GIL */
3917 Py_BEGIN_ALLOW_THREADS
3918 buffer = PyMem_Malloc(10);
3919 Py_END_ALLOW_THREADS
3920
3921 PyMem_Free(buffer);
3922
3923 Py_RETURN_NONE;
3924}
3925
3926static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01003927pyobject_malloc_without_gil(PyObject *self, PyObject *args)
3928{
3929 char *buffer;
3930
Victor Stinnerad524372016-03-16 12:12:53 +01003931 /* Deliberate bug to test debug hooks on Python memory allocators:
3932 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01003933 Py_BEGIN_ALLOW_THREADS
3934 buffer = PyObject_Malloc(10);
3935 Py_END_ALLOW_THREADS
3936
3937 PyObject_Free(buffer);
3938
3939 Py_RETURN_NONE;
3940}
3941
Victor Stinner10b73e12016-03-22 13:39:05 +01003942static PyObject *
3943tracemalloc_track(PyObject *self, PyObject *args)
3944{
3945 unsigned int domain;
3946 PyObject *ptr_obj;
3947 void *ptr;
3948 Py_ssize_t size;
3949 int release_gil = 0;
3950 int res;
3951
3952 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
3953 return NULL;
3954 ptr = PyLong_AsVoidPtr(ptr_obj);
3955 if (PyErr_Occurred())
3956 return NULL;
3957
3958 if (release_gil) {
3959 Py_BEGIN_ALLOW_THREADS
Benjamin Petersonca470632016-09-06 13:47:26 -07003960 res = _PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01003961 Py_END_ALLOW_THREADS
3962 }
3963 else {
Benjamin Petersonca470632016-09-06 13:47:26 -07003964 res = _PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01003965 }
3966
3967 if (res < 0) {
3968 PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
3969 return NULL;
3970 }
3971
3972 Py_RETURN_NONE;
3973}
3974
3975static PyObject *
3976tracemalloc_untrack(PyObject *self, PyObject *args)
3977{
3978 unsigned int domain;
3979 PyObject *ptr_obj;
3980 void *ptr;
3981 int res;
3982
3983 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
3984 return NULL;
3985 ptr = PyLong_AsVoidPtr(ptr_obj);
3986 if (PyErr_Occurred())
3987 return NULL;
3988
Benjamin Petersonca470632016-09-06 13:47:26 -07003989 res = _PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01003990 if (res < 0) {
3991 PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
3992 return NULL;
3993 }
3994
3995 Py_RETURN_NONE;
3996}
3997
3998static PyObject *
3999tracemalloc_get_traceback(PyObject *self, PyObject *args)
4000{
4001 unsigned int domain;
4002 PyObject *ptr_obj;
4003 void *ptr;
4004
4005 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4006 return NULL;
4007 ptr = PyLong_AsVoidPtr(ptr_obj);
4008 if (PyErr_Occurred())
4009 return NULL;
4010
Benjamin Petersonca470632016-09-06 13:47:26 -07004011 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004012}
4013
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004014static PyObject *
4015dict_get_version(PyObject *self, PyObject *args)
4016{
4017 PyDictObject *dict;
4018 uint64_t version;
4019
4020 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4021 return NULL;
4022
4023 version = dict->ma_version_tag;
4024
4025 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4026 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4027}
4028
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004029
Tim Peters9ea17ac2001-02-02 05:57:15 +00004030static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004031 {"raise_exception", raise_exception, METH_VARARGS},
4032 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02004033 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004034 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01004035 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004036 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
4037 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
4038 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02004039 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01004040 {"dict_hassplittable", dict_hassplittable, METH_O},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004041 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004042 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07004043 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
4044 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
4045 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
4046 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02004047 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004048 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
4049 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02004050 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
4051 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004052 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
4053 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
4054 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07004055 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004056 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
4057 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
4058 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
4059 PyDoc_STR("This is a pretty normal docstring.")},
4060 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
4061 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
4062 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01004063 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004064#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01004065 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004066#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01004067 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03004068 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03004069 {"get_args", get_args, METH_VARARGS},
4070 {"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004071 {"getargs_tuple", getargs_tuple, METH_VARARGS},
4072 {"getargs_keywords", (PyCFunction)getargs_keywords,
4073 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00004074 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
4075 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03004076 {"getargs_positional_only_and_keywords",
4077 (PyCFunction)getargs_positional_only_and_keywords,
4078 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004079 {"getargs_b", getargs_b, METH_VARARGS},
4080 {"getargs_B", getargs_B, METH_VARARGS},
4081 {"getargs_h", getargs_h, METH_VARARGS},
4082 {"getargs_H", getargs_H, METH_VARARGS},
4083 {"getargs_I", getargs_I, METH_VARARGS},
4084 {"getargs_k", getargs_k, METH_VARARGS},
4085 {"getargs_i", getargs_i, METH_VARARGS},
4086 {"getargs_l", getargs_l, METH_VARARGS},
4087 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07004088 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004089 {"getargs_L", getargs_L, METH_VARARGS},
4090 {"getargs_K", getargs_K, METH_VARARGS},
4091 {"test_longlong_api", test_longlong_api, METH_NOARGS},
4092 {"test_long_long_and_overflow",
4093 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
4094 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03004095 {"getargs_f", getargs_f, METH_VARARGS},
4096 {"getargs_d", getargs_d, METH_VARARGS},
4097 {"getargs_D", getargs_D, METH_VARARGS},
4098 {"getargs_S", getargs_S, METH_VARARGS},
4099 {"getargs_Y", getargs_Y, METH_VARARGS},
4100 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03004101 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004102 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00004103 {"getargs_s", getargs_s, METH_VARARGS},
4104 {"getargs_s_star", getargs_s_star, METH_VARARGS},
4105 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
4106 {"getargs_z", getargs_z, METH_VARARGS},
4107 {"getargs_z_star", getargs_z_star, METH_VARARGS},
4108 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
4109 {"getargs_y", getargs_y, METH_VARARGS},
4110 {"getargs_y_star", getargs_y_star, METH_VARARGS},
4111 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
4112 {"getargs_u", getargs_u, METH_VARARGS},
4113 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
4114 {"getargs_Z", getargs_Z, METH_VARARGS},
4115 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00004116 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004117 {"getargs_es", getargs_es, METH_VARARGS},
4118 {"getargs_et", getargs_et, METH_VARARGS},
4119 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
4120 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004121 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004122 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004123 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004124 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
4126 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
4127 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
4128 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004129 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
4130 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03004131 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08004132 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03004133 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004134 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
4135 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01004136 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004137#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00004138 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004139 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004140#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00004141#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00004142 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004143#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00004144 {"traceback_print", traceback_print, METH_VARARGS},
4145 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02004146 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004147 {"argparsing", argparsing, METH_VARARGS},
4148 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004149 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
4150 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00004151 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
4152 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00004153 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004154 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01004155 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
4156 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01004157 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02004158 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04004159 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02004160 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02004161 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
4162 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02004163 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
4164 {"test_pymem_setallocators",
4165 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
4166 {"test_pyobject_setallocators",
4167 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004168 {"no_docstring",
4169 (PyCFunction)test_with_docstring, METH_NOARGS},
4170 {"docstring_empty",
4171 (PyCFunction)test_with_docstring, METH_NOARGS,
4172 docstring_empty},
4173 {"docstring_no_signature",
4174 (PyCFunction)test_with_docstring, METH_NOARGS,
4175 docstring_no_signature},
4176 {"docstring_with_invalid_signature",
4177 (PyCFunction)test_with_docstring, METH_NOARGS,
4178 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004179 {"docstring_with_invalid_signature2",
4180 (PyCFunction)test_with_docstring, METH_NOARGS,
4181 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004182 {"docstring_with_signature",
4183 (PyCFunction)test_with_docstring, METH_NOARGS,
4184 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004185 {"docstring_with_signature_but_no_doc",
4186 (PyCFunction)test_with_docstring, METH_NOARGS,
4187 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004188 {"docstring_with_signature_and_extra_newlines",
4189 (PyCFunction)test_with_docstring, METH_NOARGS,
4190 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004191 {"docstring_with_signature_with_defaults",
4192 (PyCFunction)test_with_docstring, METH_NOARGS,
4193 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02004194 {"raise_signal",
4195 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01004196#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004197 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4198 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01004199#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02004200 {"pymarshal_write_long_to_file",
4201 pymarshal_write_long_to_file, METH_VARARGS},
4202 {"pymarshal_write_object_to_file",
4203 pymarshal_write_object_to_file, METH_VARARGS},
4204 {"pymarshal_read_short_from_file",
4205 pymarshal_read_short_from_file, METH_VARARGS},
4206 {"pymarshal_read_long_from_file",
4207 pymarshal_read_long_from_file, METH_VARARGS},
4208 {"pymarshal_read_last_object_from_file",
4209 pymarshal_read_last_object_from_file, METH_VARARGS},
4210 {"pymarshal_read_object_from_file",
4211 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004212 {"return_null_without_error",
4213 return_null_without_error, METH_NOARGS},
4214 {"return_result_with_error",
4215 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004216 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004217 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4218 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004219 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004220#ifdef HAVE_CLOCK_GETTIME
4221 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4222#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004223 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4224 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004225 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be8072016-03-14 12:04:26 +01004226 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
4227 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01004228 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01004229 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01004230 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
4231 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
4232 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004233 {"dict_get_version", dict_get_version, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004234 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00004235};
4236
Thomas Hellera4ea6032003-04-17 18:55:45 +00004237#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
4238
Thomas Wouters89f507f2006-12-13 04:49:30 +00004239typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004240 char bool_member;
4241 char byte_member;
4242 unsigned char ubyte_member;
4243 short short_member;
4244 unsigned short ushort_member;
4245 int int_member;
4246 unsigned int uint_member;
4247 long long_member;
4248 unsigned long ulong_member;
4249 Py_ssize_t pyssizet_member;
4250 float float_member;
4251 double double_member;
4252 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07004253 long long longlong_member;
4254 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004255} all_structmembers;
4256
4257typedef struct {
4258 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004259 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004260} test_structmembers;
4261
4262static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004263 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
4264 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
4265 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
4266 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
4267 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
4268 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
4269 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
4270 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
4271 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
4272 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
4273 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
4274 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
4275 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004276 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
4277 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004278 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00004279};
4280
4281
Christian Heimes1af737c2008-01-23 08:24:23 +00004282static PyObject *
4283test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
4284{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004285 static char *keywords[] = {
4286 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
4287 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
4288 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004289 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004290 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07004291 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 test_structmembers *ob;
4293 const char *s = NULL;
4294 Py_ssize_t string_len = 0;
4295 ob = PyObject_New(test_structmembers, type);
4296 if (ob == NULL)
4297 return NULL;
4298 memset(&ob->structmembers, 0, sizeof(all_structmembers));
4299 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
4300 &ob->structmembers.bool_member,
4301 &ob->structmembers.byte_member,
4302 &ob->structmembers.ubyte_member,
4303 &ob->structmembers.short_member,
4304 &ob->structmembers.ushort_member,
4305 &ob->structmembers.int_member,
4306 &ob->structmembers.uint_member,
4307 &ob->structmembers.long_member,
4308 &ob->structmembers.ulong_member,
4309 &ob->structmembers.pyssizet_member,
4310 &ob->structmembers.float_member,
4311 &ob->structmembers.double_member,
4312 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004313 , &ob->structmembers.longlong_member,
4314 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004315 )) {
4316 Py_DECREF(ob);
4317 return NULL;
4318 }
4319 if (s != NULL) {
4320 if (string_len > 5) {
4321 Py_DECREF(ob);
4322 PyErr_SetString(PyExc_ValueError, "string too long");
4323 return NULL;
4324 }
4325 strcpy(ob->structmembers.inplace_member, s);
4326 }
4327 else {
4328 strcpy(ob->structmembers.inplace_member, "");
4329 }
4330 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004331}
4332
Christian Heimes1af737c2008-01-23 08:24:23 +00004333static void
4334test_structmembers_free(PyObject *ob)
4335{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004336 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004337}
4338
4339static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004340 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004341 "test_structmembersType",
4342 sizeof(test_structmembers), /* tp_basicsize */
4343 0, /* tp_itemsize */
4344 test_structmembers_free, /* destructor tp_dealloc */
4345 0, /* tp_print */
4346 0, /* tp_getattr */
4347 0, /* tp_setattr */
4348 0, /* tp_reserved */
4349 0, /* tp_repr */
4350 0, /* tp_as_number */
4351 0, /* tp_as_sequence */
4352 0, /* tp_as_mapping */
4353 0, /* tp_hash */
4354 0, /* tp_call */
4355 0, /* tp_str */
4356 PyObject_GenericGetAttr, /* tp_getattro */
4357 PyObject_GenericSetAttr, /* tp_setattro */
4358 0, /* tp_as_buffer */
4359 0, /* tp_flags */
4360 "Type containing all structmember types",
4361 0, /* traverseproc tp_traverse */
4362 0, /* tp_clear */
4363 0, /* tp_richcompare */
4364 0, /* tp_weaklistoffset */
4365 0, /* tp_iter */
4366 0, /* tp_iternext */
4367 0, /* tp_methods */
4368 test_members, /* tp_members */
4369 0,
4370 0,
4371 0,
4372 0,
4373 0,
4374 0,
4375 0,
4376 0,
4377 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004378};
4379
4380
Benjamin Petersond51374e2014-04-09 23:55:56 -04004381typedef struct {
4382 PyObject_HEAD
4383} matmulObject;
4384
4385static PyObject *
4386matmulType_matmul(PyObject *self, PyObject *other)
4387{
4388 return Py_BuildValue("(sOO)", "matmul", self, other);
4389}
4390
4391static PyObject *
4392matmulType_imatmul(PyObject *self, PyObject *other)
4393{
4394 return Py_BuildValue("(sOO)", "imatmul", self, other);
4395}
4396
4397static void
4398matmulType_dealloc(PyObject *self)
4399{
Zachary Ware420dc562014-04-23 13:51:27 -05004400 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004401}
4402
4403static PyNumberMethods matmulType_as_number = {
4404 0, /* nb_add */
4405 0, /* nb_subtract */
4406 0, /* nb_multiply */
4407 0, /* nb_remainde r*/
4408 0, /* nb_divmod */
4409 0, /* nb_power */
4410 0, /* nb_negative */
4411 0, /* tp_positive */
4412 0, /* tp_absolute */
4413 0, /* tp_bool */
4414 0, /* nb_invert */
4415 0, /* nb_lshift */
4416 0, /* nb_rshift */
4417 0, /* nb_and */
4418 0, /* nb_xor */
4419 0, /* nb_or */
4420 0, /* nb_int */
4421 0, /* nb_reserved */
4422 0, /* nb_float */
4423 0, /* nb_inplace_add */
4424 0, /* nb_inplace_subtract */
4425 0, /* nb_inplace_multiply */
4426 0, /* nb_inplace_remainder */
4427 0, /* nb_inplace_power */
4428 0, /* nb_inplace_lshift */
4429 0, /* nb_inplace_rshift */
4430 0, /* nb_inplace_and */
4431 0, /* nb_inplace_xor */
4432 0, /* nb_inplace_or */
4433 0, /* nb_floor_divide */
4434 0, /* nb_true_divide */
4435 0, /* nb_inplace_floor_divide */
4436 0, /* nb_inplace_true_divide */
4437 0, /* nb_index */
4438 matmulType_matmul, /* nb_matrix_multiply */
4439 matmulType_imatmul /* nb_matrix_inplace_multiply */
4440};
4441
4442static PyTypeObject matmulType = {
4443 PyVarObject_HEAD_INIT(NULL, 0)
4444 "matmulType",
4445 sizeof(matmulObject), /* tp_basicsize */
4446 0, /* tp_itemsize */
4447 matmulType_dealloc, /* destructor tp_dealloc */
4448 0, /* tp_print */
4449 0, /* tp_getattr */
4450 0, /* tp_setattr */
4451 0, /* tp_reserved */
4452 0, /* tp_repr */
4453 &matmulType_as_number, /* tp_as_number */
4454 0, /* tp_as_sequence */
4455 0, /* tp_as_mapping */
4456 0, /* tp_hash */
4457 0, /* tp_call */
4458 0, /* tp_str */
4459 PyObject_GenericGetAttr, /* tp_getattro */
4460 PyObject_GenericSetAttr, /* tp_setattro */
4461 0, /* tp_as_buffer */
4462 0, /* tp_flags */
4463 "C level type with matrix operations defined",
4464 0, /* traverseproc tp_traverse */
4465 0, /* tp_clear */
4466 0, /* tp_richcompare */
4467 0, /* tp_weaklistoffset */
4468 0, /* tp_iter */
4469 0, /* tp_iternext */
4470 0, /* tp_methods */
4471 0, /* tp_members */
4472 0,
4473 0,
4474 0,
4475 0,
4476 0,
4477 0,
4478 0,
4479 0,
4480 PyType_GenericNew, /* tp_new */
4481 PyObject_Del, /* tp_free */
4482};
4483
Martin v. Löwis1a214512008-06-11 05:26:20 +00004484
Yury Selivanov75445082015-05-11 22:57:16 -04004485typedef struct {
4486 PyObject_HEAD
4487 PyObject *ao_iterator;
4488} awaitObject;
4489
4490
4491static PyObject *
4492awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4493{
4494 PyObject *v;
4495 awaitObject *ao;
4496
4497 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
4498 return NULL;
4499
4500 ao = (awaitObject *)type->tp_alloc(type, 0);
4501 if (ao == NULL) {
4502 return NULL;
4503 }
4504
4505 Py_INCREF(v);
4506 ao->ao_iterator = v;
4507
4508 return (PyObject *)ao;
4509}
4510
4511
4512static void
4513awaitObject_dealloc(awaitObject *ao)
4514{
4515 Py_CLEAR(ao->ao_iterator);
4516 Py_TYPE(ao)->tp_free(ao);
4517}
4518
4519
4520static PyObject *
4521awaitObject_await(awaitObject *ao)
4522{
4523 Py_INCREF(ao->ao_iterator);
4524 return ao->ao_iterator;
4525}
4526
4527static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04004528 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04004529 0, /* am_aiter */
4530 0 /* am_anext */
4531};
4532
4533
4534static PyTypeObject awaitType = {
4535 PyVarObject_HEAD_INIT(NULL, 0)
4536 "awaitType",
4537 sizeof(awaitObject), /* tp_basicsize */
4538 0, /* tp_itemsize */
4539 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
4540 0, /* tp_print */
4541 0, /* tp_getattr */
4542 0, /* tp_setattr */
4543 &awaitType_as_async, /* tp_as_async */
4544 0, /* tp_repr */
4545 0, /* tp_as_number */
4546 0, /* tp_as_sequence */
4547 0, /* tp_as_mapping */
4548 0, /* tp_hash */
4549 0, /* tp_call */
4550 0, /* tp_str */
4551 PyObject_GenericGetAttr, /* tp_getattro */
4552 PyObject_GenericSetAttr, /* tp_setattro */
4553 0, /* tp_as_buffer */
4554 0, /* tp_flags */
4555 "C level type with tp_as_async",
4556 0, /* traverseproc tp_traverse */
4557 0, /* tp_clear */
4558 0, /* tp_richcompare */
4559 0, /* tp_weaklistoffset */
4560 0, /* tp_iter */
4561 0, /* tp_iternext */
4562 0, /* tp_methods */
4563 0, /* tp_members */
4564 0,
4565 0,
4566 0,
4567 0,
4568 0,
4569 0,
4570 0,
4571 0,
4572 awaitObject_new, /* tp_new */
4573 PyObject_Del, /* tp_free */
4574};
4575
4576
Martin v. Löwis1a214512008-06-11 05:26:20 +00004577static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004578 PyModuleDef_HEAD_INIT,
4579 "_testcapi",
4580 NULL,
4581 -1,
4582 TestMethods,
4583 NULL,
4584 NULL,
4585 NULL,
4586 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004587};
4588
Nick Coghland5cacbb2015-05-23 22:24:10 +10004589/* Per PEP 489, this module will not be converted to multi-phase initialization
4590 */
4591
Mark Hammond62b1ab12002-07-23 06:31:15 +00004592PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004593PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00004594{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004595 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004597 m = PyModule_Create(&_testcapimodule);
4598 if (m == NULL)
4599 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00004602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004603 Py_TYPE(&test_structmembersType)=&PyType_Type;
4604 Py_INCREF(&test_structmembersType);
4605 /* don't use a name starting with "test", since we don't want
4606 test_capi to automatically call this */
4607 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004608 if (PyType_Ready(&matmulType) < 0)
4609 return NULL;
4610 Py_INCREF(&matmulType);
4611 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004612
Yury Selivanov75445082015-05-11 22:57:16 -04004613 if (PyType_Ready(&awaitType) < 0)
4614 return NULL;
4615 Py_INCREF(&awaitType);
4616 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
4617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004618 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
4619 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
4620 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
4621 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
4622 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
4623 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
4624 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
4625 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
4626 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
4627 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
4628 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
4629 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
4630 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
4631 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
4632 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
4633 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
4634 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
4635 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
4636 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
4637 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
4638 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
4639 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02004640 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004641 Py_INCREF(&PyInstanceMethod_Type);
4642 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00004643
Larry Hastings2a727912014-01-16 11:32:01 -08004644 PyModule_AddIntConstant(m, "the_number_three", 3);
4645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
4647 Py_INCREF(TestError);
4648 PyModule_AddObject(m, "error", TestError);
4649 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004650}