blob: ef5f9d4d13cedf5d7b4e08080d9f648a1e8f21ff [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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 Py_INCREF(Py_None);
68 return Py_None;
Tim Peters9ea17ac2001-02-02 05:57:15 +000069}
70
Tim Peters5c4d5bf2001-02-12 22:13:26 +000071static PyObject*
Victor Stinner01076552013-10-29 19:39:52 +010072test_sizeof_c_types(PyObject *self)
73{
Ned Deilye37a1942015-03-05 15:47:10 -080074#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020075#pragma GCC diagnostic push
76#pragma GCC diagnostic ignored "-Wtype-limits"
77#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010078#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010079 if (EXPECTED != sizeof(TYPE)) { \
80 PyErr_Format(TestError, \
81 "sizeof(%s) = %u instead of %u", \
82 #TYPE, sizeof(TYPE), EXPECTED); \
83 return (PyObject*)NULL; \
84 }
Victor Stinnerf866f972013-10-29 19:59:31 +010085#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
86#define CHECK_SIGNNESS(TYPE, SIGNED) \
87 if (IS_SIGNED(TYPE) != SIGNED) { \
88 PyErr_Format(TestError, \
89 "%s signness is, instead of %i", \
90 #TYPE, IS_SIGNED(TYPE), SIGNED); \
91 return (PyObject*)NULL; \
92 }
Victor Stinner01076552013-10-29 19:39:52 +010093
94 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +010095 CHECK_SIZEOF(Py_UCS1, 1);
96 CHECK_SIZEOF(Py_UCS2, 2);
97 CHECK_SIZEOF(Py_UCS4, 4);
98 CHECK_SIGNNESS(Py_UCS1, 0);
99 CHECK_SIGNNESS(Py_UCS2, 0);
100 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700101 CHECK_SIZEOF(int32_t, 4);
102 CHECK_SIGNNESS(int32_t, 1);
103 CHECK_SIZEOF(uint32_t, 4);
104 CHECK_SIGNNESS(uint32_t, 0);
105 CHECK_SIZEOF(int64_t, 8);
106 CHECK_SIGNNESS(int64_t, 1);
107 CHECK_SIZEOF(uint64_t, 8);
108 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100109
110 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100111 CHECK_SIZEOF(size_t, sizeof(void *));
112 CHECK_SIGNNESS(size_t, 0);
113 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
114 CHECK_SIGNNESS(Py_ssize_t, 1);
115
Benjamin Petersonca470632016-09-06 13:47:26 -0700116 CHECK_SIZEOF(uintptr_t, sizeof(void *));
117 CHECK_SIGNNESS(uintptr_t, 0);
118 CHECK_SIZEOF(intptr_t, sizeof(void *));
119 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100120
121 Py_INCREF(Py_None);
122 return Py_None;
123
Victor Stinnerf866f972013-10-29 19:59:31 +0100124#undef IS_SIGNED
125#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100126#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800127#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200128#pragma GCC diagnostic pop
129#endif
Victor Stinner01076552013-10-29 19:39:52 +0100130}
131
132
133static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000134test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 PyObject* list;
137 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000140#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 list = PyList_New(NLIST);
142 if (list == (PyObject*)NULL)
143 return (PyObject*)NULL;
144 /* list = range(NLIST) */
145 for (i = 0; i < NLIST; ++i) {
146 PyObject* anint = PyLong_FromLong(i);
147 if (anint == (PyObject*)NULL) {
148 Py_DECREF(list);
149 return (PyObject*)NULL;
150 }
151 PyList_SET_ITEM(list, i, anint);
152 }
153 /* list.reverse(), via PyList_Reverse() */
154 i = PyList_Reverse(list); /* should not blow up! */
155 if (i != 0) {
156 Py_DECREF(list);
157 return (PyObject*)NULL;
158 }
159 /* Check that list == range(29, -1, -1) now */
160 for (i = 0; i < NLIST; ++i) {
161 PyObject* anint = PyList_GET_ITEM(list, i);
162 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
163 PyErr_SetString(TestError,
164 "test_list_api: reverse screwed up");
165 Py_DECREF(list);
166 return (PyObject*)NULL;
167 }
168 }
169 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000170#undef NLIST
171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 Py_INCREF(Py_None);
173 return Py_None;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000174}
175
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000176static int
177test_dict_inner(int count)
178{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 Py_ssize_t pos = 0, iterations = 0;
180 int i;
181 PyObject *dict = PyDict_New();
182 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 if (dict == NULL)
185 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 for (i = 0; i < count; i++) {
188 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200189 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200190 return -1;
191 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200192 if (PyDict_SetItem(dict, v, v) < 0) {
193 Py_DECREF(v);
194 return -1;
195 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000196 Py_DECREF(v);
197 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 while (PyDict_Next(dict, &pos, &k, &v)) {
200 PyObject *o;
201 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 i = PyLong_AS_LONG(v) + 1;
204 o = PyLong_FromLong(i);
205 if (o == NULL)
206 return -1;
207 if (PyDict_SetItem(dict, k, o) < 0) {
208 Py_DECREF(o);
209 return -1;
210 }
211 Py_DECREF(o);
212 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000216 if (iterations != count) {
217 PyErr_SetString(
218 TestError,
219 "test_dict_iteration: dict iteration went wrong ");
220 return -1;
221 } else {
222 return 0;
223 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000224}
225
226static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000227test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 for (i = 0; i < 200; i++) {
232 if (test_dict_inner(i) < 0) {
233 return NULL;
234 }
235 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 Py_INCREF(Py_None);
238 return Py_None;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000239}
240
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200241static PyObject*
242dict_getitem_knownhash(PyObject *self, PyObject *args)
243{
244 PyObject *mp, *key, *result;
245 Py_ssize_t hash;
246
247 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
248 &mp, &key, &hash)) {
249 return NULL;
250 }
251
252 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
253 if (result == NULL && !PyErr_Occurred()) {
254 _PyErr_SetKeyError(key);
255 return NULL;
256 }
257
258 Py_XINCREF(result);
259 return result;
260}
Tim Peters91621db2001-06-12 20:10:01 +0000261
Victor Stinner3d3f2642016-12-15 17:21:23 +0100262static PyObject*
263dict_hassplittable(PyObject *self, PyObject *arg)
264{
265 if (!PyDict_Check(arg)) {
266 PyErr_Format(PyExc_TypeError,
267 "dict_hassplittable() argument must be dict, not '%s'",
268 arg->ob_type->tp_name);
269 return NULL;
270 }
271
272 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
273}
274
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000275/* Issue #4701: Check that PyObject_Hash implicitly calls
276 * PyType_Ready if it hasn't already been called
277 */
278static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 PyVarObject_HEAD_INIT(NULL, 0)
280 "hashinheritancetester", /* Name of this type */
281 sizeof(PyObject), /* Basic object size */
282 0, /* Item size for varobject */
283 (destructor)PyObject_Del, /* tp_dealloc */
284 0, /* tp_print */
285 0, /* tp_getattr */
286 0, /* tp_setattr */
287 0, /* tp_reserved */
288 0, /* tp_repr */
289 0, /* tp_as_number */
290 0, /* tp_as_sequence */
291 0, /* tp_as_mapping */
292 0, /* tp_hash */
293 0, /* tp_call */
294 0, /* tp_str */
295 PyObject_GenericGetAttr, /* tp_getattro */
296 0, /* tp_setattro */
297 0, /* tp_as_buffer */
298 Py_TPFLAGS_DEFAULT, /* tp_flags */
299 0, /* tp_doc */
300 0, /* tp_traverse */
301 0, /* tp_clear */
302 0, /* tp_richcompare */
303 0, /* tp_weaklistoffset */
304 0, /* tp_iter */
305 0, /* tp_iternext */
306 0, /* tp_methods */
307 0, /* tp_members */
308 0, /* tp_getset */
309 0, /* tp_base */
310 0, /* tp_dict */
311 0, /* tp_descr_get */
312 0, /* tp_descr_set */
313 0, /* tp_dictoffset */
314 0, /* tp_init */
315 0, /* tp_alloc */
316 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000317};
318
319static PyObject*
320test_lazy_hash_inheritance(PyObject* self)
321{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 PyTypeObject *type;
323 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000324 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 if (type->tp_dict != NULL)
329 /* The type has already been initialized. This probably means
330 -R is being used. */
331 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000332
333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 obj = PyObject_New(PyObject, type);
335 if (obj == NULL) {
336 PyErr_Clear();
337 PyErr_SetString(
338 TestError,
339 "test_lazy_hash_inheritance: failed to create object");
340 return NULL;
341 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 if (type->tp_dict != NULL) {
344 PyErr_SetString(
345 TestError,
346 "test_lazy_hash_inheritance: type initialised too soon");
347 Py_DECREF(obj);
348 return NULL;
349 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 hash = PyObject_Hash(obj);
352 if ((hash == -1) && PyErr_Occurred()) {
353 PyErr_Clear();
354 PyErr_SetString(
355 TestError,
356 "test_lazy_hash_inheritance: could not hash object");
357 Py_DECREF(obj);
358 return NULL;
359 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 if (type->tp_dict == NULL) {
362 PyErr_SetString(
363 TestError,
364 "test_lazy_hash_inheritance: type not initialised by hash()");
365 Py_DECREF(obj);
366 return NULL;
367 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 if (type->tp_hash != PyType_Type.tp_hash) {
370 PyErr_SetString(
371 TestError,
372 "test_lazy_hash_inheritance: unexpected hash function");
373 Py_DECREF(obj);
374 return NULL;
375 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000380}
381
382
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700383/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000384 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000385
386 Note that the meat of the test is contained in testcapi_long.h.
387 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700388 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000389 dependence on type names makes it impossible to use a parameterized
390 function. A giant macro would be even worse than this. A C++ template
391 would be perfect.
392
393 The "report an error" functions are deliberately not part of the #include
394 file: if the test fails, you can set a breakpoint in the appropriate
395 error function directly, and crawl back from there in the debugger.
396*/
397
398#define UNBIND(X) Py_DECREF(X); (X) = NULL
399
400static PyObject *
401raise_test_long_error(const char* msg)
402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000404}
405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406#define TESTNAME test_long_api_inner
407#define TYPENAME long
408#define F_S_TO_PY PyLong_FromLong
409#define F_PY_TO_S PyLong_AsLong
410#define F_U_TO_PY PyLong_FromUnsignedLong
411#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000412
413#include "testcapi_long.h"
414
415static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000416test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000417{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000419}
420
421#undef TESTNAME
422#undef TYPENAME
423#undef F_S_TO_PY
424#undef F_PY_TO_S
425#undef F_U_TO_PY
426#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000427
Tim Peters91621db2001-06-12 20:10:01 +0000428static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000429raise_test_longlong_error(const char* msg)
430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000432}
433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700435#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436#define F_S_TO_PY PyLong_FromLongLong
437#define F_PY_TO_S PyLong_AsLongLong
438#define F_U_TO_PY PyLong_FromUnsignedLongLong
439#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000440
441#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000442
443static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000444test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000445{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000447}
448
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000449#undef TESTNAME
450#undef TYPENAME
451#undef F_S_TO_PY
452#undef F_PY_TO_S
453#undef F_U_TO_PY
454#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000455
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000456/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
457 is tested by test_long_api_inner. This test will concentrate on proper
458 handling of overflow.
459*/
460
461static PyObject *
462test_long_and_overflow(PyObject *self)
463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 PyObject *num, *one, *temp;
465 long value;
466 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 /* Test that overflow is set properly for a large value. */
469 /* num is a number larger than LONG_MAX even on 64-bit platforms */
470 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
471 if (num == NULL)
472 return NULL;
473 overflow = 1234;
474 value = PyLong_AsLongAndOverflow(num, &overflow);
475 Py_DECREF(num);
476 if (value == -1 && PyErr_Occurred())
477 return NULL;
478 if (value != -1)
479 return raiseTestError("test_long_and_overflow",
480 "return value was not set to -1");
481 if (overflow != 1)
482 return raiseTestError("test_long_and_overflow",
483 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 /* Same again, with num = LONG_MAX + 1 */
486 num = PyLong_FromLong(LONG_MAX);
487 if (num == NULL)
488 return NULL;
489 one = PyLong_FromLong(1L);
490 if (one == NULL) {
491 Py_DECREF(num);
492 return NULL;
493 }
494 temp = PyNumber_Add(num, one);
495 Py_DECREF(one);
496 Py_DECREF(num);
497 num = temp;
498 if (num == NULL)
499 return NULL;
500 overflow = 0;
501 value = PyLong_AsLongAndOverflow(num, &overflow);
502 Py_DECREF(num);
503 if (value == -1 && PyErr_Occurred())
504 return NULL;
505 if (value != -1)
506 return raiseTestError("test_long_and_overflow",
507 "return value was not set to -1");
508 if (overflow != 1)
509 return raiseTestError("test_long_and_overflow",
510 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 /* Test that overflow is set properly for a large negative value. */
513 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
514 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
515 if (num == NULL)
516 return NULL;
517 overflow = 1234;
518 value = PyLong_AsLongAndOverflow(num, &overflow);
519 Py_DECREF(num);
520 if (value == -1 && PyErr_Occurred())
521 return NULL;
522 if (value != -1)
523 return raiseTestError("test_long_and_overflow",
524 "return value was not set to -1");
525 if (overflow != -1)
526 return raiseTestError("test_long_and_overflow",
527 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 /* Same again, with num = LONG_MIN - 1 */
530 num = PyLong_FromLong(LONG_MIN);
531 if (num == NULL)
532 return NULL;
533 one = PyLong_FromLong(1L);
534 if (one == NULL) {
535 Py_DECREF(num);
536 return NULL;
537 }
538 temp = PyNumber_Subtract(num, one);
539 Py_DECREF(one);
540 Py_DECREF(num);
541 num = temp;
542 if (num == NULL)
543 return NULL;
544 overflow = 0;
545 value = PyLong_AsLongAndOverflow(num, &overflow);
546 Py_DECREF(num);
547 if (value == -1 && PyErr_Occurred())
548 return NULL;
549 if (value != -1)
550 return raiseTestError("test_long_and_overflow",
551 "return value was not set to -1");
552 if (overflow != -1)
553 return raiseTestError("test_long_and_overflow",
554 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 /* Test that overflow is cleared properly for small values. */
557 num = PyLong_FromString("FF", NULL, 16);
558 if (num == NULL)
559 return NULL;
560 overflow = 1234;
561 value = PyLong_AsLongAndOverflow(num, &overflow);
562 Py_DECREF(num);
563 if (value == -1 && PyErr_Occurred())
564 return NULL;
565 if (value != 0xFF)
566 return raiseTestError("test_long_and_overflow",
567 "expected return value 0xFF");
568 if (overflow != 0)
569 return raiseTestError("test_long_and_overflow",
570 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 num = PyLong_FromString("-FF", NULL, 16);
573 if (num == NULL)
574 return NULL;
575 overflow = 0;
576 value = PyLong_AsLongAndOverflow(num, &overflow);
577 Py_DECREF(num);
578 if (value == -1 && PyErr_Occurred())
579 return NULL;
580 if (value != -0xFF)
581 return raiseTestError("test_long_and_overflow",
582 "expected return value 0xFF");
583 if (overflow != 0)
584 return raiseTestError("test_long_and_overflow",
585 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 num = PyLong_FromLong(LONG_MAX);
588 if (num == NULL)
589 return NULL;
590 overflow = 1234;
591 value = PyLong_AsLongAndOverflow(num, &overflow);
592 Py_DECREF(num);
593 if (value == -1 && PyErr_Occurred())
594 return NULL;
595 if (value != LONG_MAX)
596 return raiseTestError("test_long_and_overflow",
597 "expected return value LONG_MAX");
598 if (overflow != 0)
599 return raiseTestError("test_long_and_overflow",
600 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 num = PyLong_FromLong(LONG_MIN);
603 if (num == NULL)
604 return NULL;
605 overflow = 0;
606 value = PyLong_AsLongAndOverflow(num, &overflow);
607 Py_DECREF(num);
608 if (value == -1 && PyErr_Occurred())
609 return NULL;
610 if (value != LONG_MIN)
611 return raiseTestError("test_long_and_overflow",
612 "expected return value LONG_MIN");
613 if (overflow != 0)
614 return raiseTestError("test_long_and_overflow",
615 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 Py_INCREF(Py_None);
618 return Py_None;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000619}
620
Mark Dickinson93f562c2010-01-30 10:30:15 +0000621/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700622 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000623 concentrate on proper handling of overflow.
624*/
625
626static PyObject *
627test_long_long_and_overflow(PyObject *self)
628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700630 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 /* Test that overflow is set properly for a large value. */
634 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
635 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
636 if (num == NULL)
637 return NULL;
638 overflow = 1234;
639 value = PyLong_AsLongLongAndOverflow(num, &overflow);
640 Py_DECREF(num);
641 if (value == -1 && PyErr_Occurred())
642 return NULL;
643 if (value != -1)
644 return raiseTestError("test_long_long_and_overflow",
645 "return value was not set to -1");
646 if (overflow != 1)
647 return raiseTestError("test_long_long_and_overflow",
648 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 /* Same again, with num = PY_LLONG_MAX + 1 */
651 num = PyLong_FromLongLong(PY_LLONG_MAX);
652 if (num == NULL)
653 return NULL;
654 one = PyLong_FromLong(1L);
655 if (one == NULL) {
656 Py_DECREF(num);
657 return NULL;
658 }
659 temp = PyNumber_Add(num, one);
660 Py_DECREF(one);
661 Py_DECREF(num);
662 num = temp;
663 if (num == NULL)
664 return NULL;
665 overflow = 0;
666 value = PyLong_AsLongLongAndOverflow(num, &overflow);
667 Py_DECREF(num);
668 if (value == -1 && PyErr_Occurred())
669 return NULL;
670 if (value != -1)
671 return raiseTestError("test_long_long_and_overflow",
672 "return value was not set to -1");
673 if (overflow != 1)
674 return raiseTestError("test_long_long_and_overflow",
675 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 /* Test that overflow is set properly for a large negative value. */
678 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
679 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
680 if (num == NULL)
681 return NULL;
682 overflow = 1234;
683 value = PyLong_AsLongLongAndOverflow(num, &overflow);
684 Py_DECREF(num);
685 if (value == -1 && PyErr_Occurred())
686 return NULL;
687 if (value != -1)
688 return raiseTestError("test_long_long_and_overflow",
689 "return value was not set to -1");
690 if (overflow != -1)
691 return raiseTestError("test_long_long_and_overflow",
692 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 /* Same again, with num = PY_LLONG_MIN - 1 */
695 num = PyLong_FromLongLong(PY_LLONG_MIN);
696 if (num == NULL)
697 return NULL;
698 one = PyLong_FromLong(1L);
699 if (one == NULL) {
700 Py_DECREF(num);
701 return NULL;
702 }
703 temp = PyNumber_Subtract(num, one);
704 Py_DECREF(one);
705 Py_DECREF(num);
706 num = temp;
707 if (num == NULL)
708 return NULL;
709 overflow = 0;
710 value = PyLong_AsLongLongAndOverflow(num, &overflow);
711 Py_DECREF(num);
712 if (value == -1 && PyErr_Occurred())
713 return NULL;
714 if (value != -1)
715 return raiseTestError("test_long_long_and_overflow",
716 "return value was not set to -1");
717 if (overflow != -1)
718 return raiseTestError("test_long_long_and_overflow",
719 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 /* Test that overflow is cleared properly for small values. */
722 num = PyLong_FromString("FF", NULL, 16);
723 if (num == NULL)
724 return NULL;
725 overflow = 1234;
726 value = PyLong_AsLongLongAndOverflow(num, &overflow);
727 Py_DECREF(num);
728 if (value == -1 && PyErr_Occurred())
729 return NULL;
730 if (value != 0xFF)
731 return raiseTestError("test_long_long_and_overflow",
732 "expected return value 0xFF");
733 if (overflow != 0)
734 return raiseTestError("test_long_long_and_overflow",
735 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 num = PyLong_FromString("-FF", NULL, 16);
738 if (num == NULL)
739 return NULL;
740 overflow = 0;
741 value = PyLong_AsLongLongAndOverflow(num, &overflow);
742 Py_DECREF(num);
743 if (value == -1 && PyErr_Occurred())
744 return NULL;
745 if (value != -0xFF)
746 return raiseTestError("test_long_long_and_overflow",
747 "expected return value 0xFF");
748 if (overflow != 0)
749 return raiseTestError("test_long_long_and_overflow",
750 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 num = PyLong_FromLongLong(PY_LLONG_MAX);
753 if (num == NULL)
754 return NULL;
755 overflow = 1234;
756 value = PyLong_AsLongLongAndOverflow(num, &overflow);
757 Py_DECREF(num);
758 if (value == -1 && PyErr_Occurred())
759 return NULL;
760 if (value != PY_LLONG_MAX)
761 return raiseTestError("test_long_long_and_overflow",
762 "expected return value PY_LLONG_MAX");
763 if (overflow != 0)
764 return raiseTestError("test_long_long_and_overflow",
765 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 num = PyLong_FromLongLong(PY_LLONG_MIN);
768 if (num == NULL)
769 return NULL;
770 overflow = 0;
771 value = PyLong_AsLongLongAndOverflow(num, &overflow);
772 Py_DECREF(num);
773 if (value == -1 && PyErr_Occurred())
774 return NULL;
775 if (value != PY_LLONG_MIN)
776 return raiseTestError("test_long_long_and_overflow",
777 "expected return value PY_LLONG_MIN");
778 if (overflow != 0)
779 return raiseTestError("test_long_long_and_overflow",
780 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 Py_INCREF(Py_None);
783 return Py_None;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000784}
785
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200786/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
787 non-integer arguments are handled correctly. It should be extended to
788 test overflow handling.
789 */
790
791static PyObject *
792test_long_as_size_t(PyObject *self)
793{
794 size_t out_u;
795 Py_ssize_t out_s;
796
797 Py_INCREF(Py_None);
798
799 out_u = PyLong_AsSize_t(Py_None);
800 if (out_u != (size_t)-1 || !PyErr_Occurred())
801 return raiseTestError("test_long_as_size_t",
802 "PyLong_AsSize_t(None) didn't complain");
803 if (!PyErr_ExceptionMatches(PyExc_TypeError))
804 return raiseTestError("test_long_as_size_t",
805 "PyLong_AsSize_t(None) raised "
806 "something other than TypeError");
807 PyErr_Clear();
808
809 out_s = PyLong_AsSsize_t(Py_None);
810 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
811 return raiseTestError("test_long_as_size_t",
812 "PyLong_AsSsize_t(None) didn't complain");
813 if (!PyErr_ExceptionMatches(PyExc_TypeError))
814 return raiseTestError("test_long_as_size_t",
815 "PyLong_AsSsize_t(None) raised "
816 "something other than TypeError");
817 PyErr_Clear();
818
819 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
820 return Py_None;
821}
822
823/* Test the PyLong_AsDouble API. At present this just tests that
824 non-integer arguments are handled correctly.
825 */
826
827static PyObject *
828test_long_as_double(PyObject *self)
829{
830 double out;
831
832 Py_INCREF(Py_None);
833
834 out = PyLong_AsDouble(Py_None);
835 if (out != -1.0 || !PyErr_Occurred())
836 return raiseTestError("test_long_as_double",
837 "PyLong_AsDouble(None) didn't complain");
838 if (!PyErr_ExceptionMatches(PyExc_TypeError))
839 return raiseTestError("test_long_as_double",
840 "PyLong_AsDouble(None) raised "
841 "something other than TypeError");
842 PyErr_Clear();
843
844 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
845 return Py_None;
846}
847
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700848/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000849 for both long and int arguments. The test may leak a little memory if
850 it fails.
851*/
852static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000853test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700856 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 tuple = PyTuple_New(1);
859 if (tuple == NULL)
860 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 num = PyLong_FromLong(42);
863 if (num == NULL)
864 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 value = -1;
869 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
870 return NULL;
871 if (value != 42)
872 return raiseTestError("test_L_code",
873 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 Py_DECREF(num);
876 num = PyLong_FromLong(42);
877 if (num == NULL)
878 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 value = -1;
883 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
884 return NULL;
885 if (value != 42)
886 return raiseTestError("test_L_code",
887 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 Py_DECREF(tuple);
890 Py_INCREF(Py_None);
891 return Py_None;
Tim Petersd38b1c72001-09-30 05:09:37 +0000892}
893
Serhiy Storchakace412872016-05-08 23:36:44 +0300894static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300895return_none(void *unused)
896{
897 Py_RETURN_NONE;
898}
899
900static PyObject *
901raise_error(void *unused)
902{
903 PyErr_SetNone(PyExc_ValueError);
904 return NULL;
905}
906
907static int
908test_buildvalue_N_error(const char *fmt)
909{
910 PyObject *arg, *res;
911
912 arg = PyList_New(0);
913 if (arg == NULL) {
914 return -1;
915 }
916
917 Py_INCREF(arg);
918 res = Py_BuildValue(fmt, return_none, NULL, arg);
919 if (res == NULL) {
920 return -1;
921 }
922 Py_DECREF(res);
923 if (Py_REFCNT(arg) != 1) {
924 PyErr_Format(TestError, "test_buildvalue_N: "
925 "arg was not decrefed in successful "
926 "Py_BuildValue(\"%s\")", fmt);
927 return -1;
928 }
929
930 Py_INCREF(arg);
931 res = Py_BuildValue(fmt, raise_error, NULL, arg);
932 if (res != NULL || !PyErr_Occurred()) {
933 PyErr_Format(TestError, "test_buildvalue_N: "
934 "Py_BuildValue(\"%s\") didn't complain", fmt);
935 return -1;
936 }
937 PyErr_Clear();
938 if (Py_REFCNT(arg) != 1) {
939 PyErr_Format(TestError, "test_buildvalue_N: "
940 "arg was not decrefed in failed "
941 "Py_BuildValue(\"%s\")", fmt);
942 return -1;
943 }
944 Py_DECREF(arg);
945 return 0;
946}
947
948static PyObject *
949test_buildvalue_N(PyObject *self, PyObject *noargs)
950{
951 PyObject *arg, *res;
952
953 arg = PyList_New(0);
954 if (arg == NULL) {
955 return NULL;
956 }
957 Py_INCREF(arg);
958 res = Py_BuildValue("N", arg);
959 if (res == NULL) {
960 return NULL;
961 }
962 if (res != arg) {
963 return raiseTestError("test_buildvalue_N",
964 "Py_BuildValue(\"N\") returned wrong result");
965 }
966 if (Py_REFCNT(arg) != 2) {
967 return raiseTestError("test_buildvalue_N",
968 "arg was not decrefed in Py_BuildValue(\"N\")");
969 }
970 Py_DECREF(res);
971 Py_DECREF(arg);
972
973 if (test_buildvalue_N_error("O&N") < 0)
974 return NULL;
975 if (test_buildvalue_N_error("(O&N)") < 0)
976 return NULL;
977 if (test_buildvalue_N_error("[O&N]") < 0)
978 return NULL;
979 if (test_buildvalue_N_error("{O&N}") < 0)
980 return NULL;
981 if (test_buildvalue_N_error("{()O&(())N}") < 0)
982 return NULL;
983
984 Py_RETURN_NONE;
985}
986
987
988static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +0300989get_args(PyObject *self, PyObject *args)
990{
991 if (args == NULL) {
992 args = Py_None;
993 }
994 Py_INCREF(args);
995 return args;
996}
997
998static PyObject *
999get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1000{
1001 if (kwargs == NULL) {
1002 kwargs = Py_None;
1003 }
1004 Py_INCREF(kwargs);
1005 return kwargs;
1006}
1007
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001008/* Test tuple argument processing */
1009static PyObject *
1010getargs_tuple(PyObject *self, PyObject *args)
1011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 int a, b, c;
1013 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1014 return NULL;
1015 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001016}
1017
Christian Heimes380f7f22008-02-28 11:19:05 +00001018/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001019static PyObject *
1020getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001021{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001023 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1027 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1028 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1029 return NULL;
1030 return Py_BuildValue("iiiiiiiiii",
1031 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1032 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001033}
1034
Larry Hastings83a9f482012-03-20 20:06:16 +00001035/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1036static PyObject *
1037getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1038{
1039 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1040 int required = -1;
1041 int optional = -1;
1042 int keyword_only = -1;
1043
1044 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1045 &required, &optional, &keyword_only))
1046 return NULL;
1047 return Py_BuildValue("iii", required, optional, keyword_only);
1048}
1049
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001050/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1051static PyObject *
1052getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1053{
1054 static char *keywords[] = {"", "", "keyword", NULL};
1055 int required = -1;
1056 int optional = -1;
1057 int keyword = -1;
1058
1059 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1060 &required, &optional, &keyword))
1061 return NULL;
1062 return Py_BuildValue("iii", required, optional, keyword);
1063}
1064
Thomas Heller3457e4b2003-04-24 16:14:27 +00001065/* Functions to call PyArg_ParseTuple with integer format codes,
1066 and return the result.
1067*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001068static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001069getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001070{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 unsigned char value;
1072 if (!PyArg_ParseTuple(args, "b", &value))
1073 return NULL;
1074 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001075}
1076
Thomas Heller3457e4b2003-04-24 16:14:27 +00001077static PyObject *
1078getargs_B(PyObject *self, PyObject *args)
1079{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 unsigned char value;
1081 if (!PyArg_ParseTuple(args, "B", &value))
1082 return NULL;
1083 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001084}
1085
1086static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001087getargs_h(PyObject *self, PyObject *args)
1088{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 short value;
1090 if (!PyArg_ParseTuple(args, "h", &value))
1091 return NULL;
1092 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001093}
1094
1095static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001096getargs_H(PyObject *self, PyObject *args)
1097{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 unsigned short value;
1099 if (!PyArg_ParseTuple(args, "H", &value))
1100 return NULL;
1101 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001102}
1103
1104static PyObject *
1105getargs_I(PyObject *self, PyObject *args)
1106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 unsigned int value;
1108 if (!PyArg_ParseTuple(args, "I", &value))
1109 return NULL;
1110 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001111}
1112
1113static PyObject *
1114getargs_k(PyObject *self, PyObject *args)
1115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 unsigned long value;
1117 if (!PyArg_ParseTuple(args, "k", &value))
1118 return NULL;
1119 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001120}
1121
1122static PyObject *
1123getargs_i(PyObject *self, PyObject *args)
1124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 int value;
1126 if (!PyArg_ParseTuple(args, "i", &value))
1127 return NULL;
1128 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001129}
1130
Thomas Hellera4ea6032003-04-17 18:55:45 +00001131static PyObject *
1132getargs_l(PyObject *self, PyObject *args)
1133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 long value;
1135 if (!PyArg_ParseTuple(args, "l", &value))
1136 return NULL;
1137 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001138}
1139
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001140static PyObject *
1141getargs_n(PyObject *self, PyObject *args)
1142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 Py_ssize_t value;
1144 if (!PyArg_ParseTuple(args, "n", &value))
1145 return NULL;
1146 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001147}
1148
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001149static PyObject *
1150getargs_p(PyObject *self, PyObject *args)
1151{
1152 int value;
1153 if (!PyArg_ParseTuple(args, "p", &value))
1154 return NULL;
1155 return PyLong_FromLong(value);
1156}
1157
Thomas Hellera4ea6032003-04-17 18:55:45 +00001158static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001159getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001160{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001161 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 if (!PyArg_ParseTuple(args, "L", &value))
1163 return NULL;
1164 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001165}
1166
Thomas Hellera4ea6032003-04-17 18:55:45 +00001167static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001168getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001169{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001170 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 if (!PyArg_ParseTuple(args, "K", &value))
1172 return NULL;
1173 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001174}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001175
1176/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +00001177 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001178static PyObject *
1179test_k_code(PyObject *self)
1180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 PyObject *tuple, *num;
1182 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 tuple = PyTuple_New(1);
1185 if (tuple == NULL)
1186 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 /* a number larger than ULONG_MAX even on 64-bit platforms */
1189 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1190 if (num == NULL)
1191 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 value = PyLong_AsUnsignedLongMask(num);
1194 if (value != ULONG_MAX)
1195 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001196 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 value = 0;
1201 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1202 return NULL;
1203 if (value != ULONG_MAX)
1204 return raiseTestError("test_k_code",
1205 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 Py_DECREF(num);
1208 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1209 if (num == NULL)
1210 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 value = PyLong_AsUnsignedLongMask(num);
1213 if (value != (unsigned long)-0x42)
1214 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001215 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 value = 0;
1220 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1221 return NULL;
1222 if (value != (unsigned long)-0x42)
1223 return raiseTestError("test_k_code",
1224 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 Py_DECREF(tuple);
1227 Py_INCREF(Py_None);
1228 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001229}
1230
Victor Stinner06e49dd2010-06-13 18:21:50 +00001231static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001232getargs_f(PyObject *self, PyObject *args)
1233{
1234 float f;
1235 if (!PyArg_ParseTuple(args, "f", &f))
1236 return NULL;
1237 return PyFloat_FromDouble(f);
1238}
1239
1240static PyObject *
1241getargs_d(PyObject *self, PyObject *args)
1242{
1243 double d;
1244 if (!PyArg_ParseTuple(args, "d", &d))
1245 return NULL;
1246 return PyFloat_FromDouble(d);
1247}
1248
1249static PyObject *
1250getargs_D(PyObject *self, PyObject *args)
1251{
1252 Py_complex cval;
1253 if (!PyArg_ParseTuple(args, "D", &cval))
1254 return NULL;
1255 return PyComplex_FromCComplex(cval);
1256}
1257
1258static PyObject *
1259getargs_S(PyObject *self, PyObject *args)
1260{
1261 PyObject *obj;
1262 if (!PyArg_ParseTuple(args, "S", &obj))
1263 return NULL;
1264 Py_INCREF(obj);
1265 return obj;
1266}
1267
1268static PyObject *
1269getargs_Y(PyObject *self, PyObject *args)
1270{
1271 PyObject *obj;
1272 if (!PyArg_ParseTuple(args, "Y", &obj))
1273 return NULL;
1274 Py_INCREF(obj);
1275 return obj;
1276}
1277
1278static PyObject *
1279getargs_U(PyObject *self, PyObject *args)
1280{
1281 PyObject *obj;
1282 if (!PyArg_ParseTuple(args, "U", &obj))
1283 return NULL;
1284 Py_INCREF(obj);
1285 return obj;
1286}
1287
1288static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001289getargs_c(PyObject *self, PyObject *args)
1290{
1291 char c;
1292 if (!PyArg_ParseTuple(args, "c", &c))
1293 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001294 return PyLong_FromLong((unsigned char)c);
1295}
1296
1297static PyObject *
1298getargs_C(PyObject *self, PyObject *args)
1299{
1300 int c;
1301 if (!PyArg_ParseTuple(args, "C", &c))
1302 return NULL;
1303 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001304}
1305
1306static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001307getargs_s(PyObject *self, PyObject *args)
1308{
1309 char *str;
1310 if (!PyArg_ParseTuple(args, "s", &str))
1311 return NULL;
1312 return PyBytes_FromString(str);
1313}
1314
1315static PyObject *
1316getargs_s_star(PyObject *self, PyObject *args)
1317{
1318 Py_buffer buffer;
1319 PyObject *bytes;
1320 if (!PyArg_ParseTuple(args, "s*", &buffer))
1321 return NULL;
1322 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1323 PyBuffer_Release(&buffer);
1324 return bytes;
1325}
1326
1327static PyObject *
1328getargs_s_hash(PyObject *self, PyObject *args)
1329{
1330 char *str;
1331 Py_ssize_t size;
1332 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1333 return NULL;
1334 return PyBytes_FromStringAndSize(str, size);
1335}
1336
1337static PyObject *
1338getargs_z(PyObject *self, PyObject *args)
1339{
1340 char *str;
1341 if (!PyArg_ParseTuple(args, "z", &str))
1342 return NULL;
1343 if (str != NULL)
1344 return PyBytes_FromString(str);
1345 else
1346 Py_RETURN_NONE;
1347}
1348
1349static PyObject *
1350getargs_z_star(PyObject *self, PyObject *args)
1351{
1352 Py_buffer buffer;
1353 PyObject *bytes;
1354 if (!PyArg_ParseTuple(args, "z*", &buffer))
1355 return NULL;
1356 if (buffer.buf != NULL)
1357 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1358 else {
1359 Py_INCREF(Py_None);
1360 bytes = Py_None;
1361 }
1362 PyBuffer_Release(&buffer);
1363 return bytes;
1364}
1365
1366static PyObject *
1367getargs_z_hash(PyObject *self, PyObject *args)
1368{
1369 char *str;
1370 Py_ssize_t size;
1371 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1372 return NULL;
1373 if (str != NULL)
1374 return PyBytes_FromStringAndSize(str, size);
1375 else
1376 Py_RETURN_NONE;
1377}
1378
1379static PyObject *
1380getargs_y(PyObject *self, PyObject *args)
1381{
1382 char *str;
1383 if (!PyArg_ParseTuple(args, "y", &str))
1384 return NULL;
1385 return PyBytes_FromString(str);
1386}
1387
1388static PyObject *
1389getargs_y_star(PyObject *self, PyObject *args)
1390{
1391 Py_buffer buffer;
1392 PyObject *bytes;
1393 if (!PyArg_ParseTuple(args, "y*", &buffer))
1394 return NULL;
1395 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1396 PyBuffer_Release(&buffer);
1397 return bytes;
1398}
1399
1400static PyObject *
1401getargs_y_hash(PyObject *self, PyObject *args)
1402{
1403 char *str;
1404 Py_ssize_t size;
1405 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1406 return NULL;
1407 return PyBytes_FromStringAndSize(str, size);
1408}
1409
1410static PyObject *
1411getargs_u(PyObject *self, PyObject *args)
1412{
1413 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001414 if (!PyArg_ParseTuple(args, "u", &str))
1415 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001416 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001417}
1418
1419static PyObject *
1420getargs_u_hash(PyObject *self, PyObject *args)
1421{
1422 Py_UNICODE *str;
1423 Py_ssize_t size;
1424 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1425 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001426 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001427}
1428
1429static PyObject *
1430getargs_Z(PyObject *self, PyObject *args)
1431{
1432 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001433 if (!PyArg_ParseTuple(args, "Z", &str))
1434 return NULL;
1435 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001436 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001437 } else
1438 Py_RETURN_NONE;
1439}
1440
1441static PyObject *
1442getargs_Z_hash(PyObject *self, PyObject *args)
1443{
1444 Py_UNICODE *str;
1445 Py_ssize_t size;
1446 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1447 return NULL;
1448 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001449 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001450 else
1451 Py_RETURN_NONE;
1452}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001453
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001454static PyObject *
1455getargs_es(PyObject *self, PyObject *args)
1456{
1457 PyObject *arg, *result;
1458 const char *encoding = NULL;
1459 char *str;
1460
1461 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1462 return NULL;
1463 if (!PyArg_Parse(arg, "es", encoding, &str))
1464 return NULL;
1465 result = PyBytes_FromString(str);
1466 PyMem_Free(str);
1467 return result;
1468}
1469
1470static PyObject *
1471getargs_et(PyObject *self, PyObject *args)
1472{
1473 PyObject *arg, *result;
1474 const char *encoding = NULL;
1475 char *str;
1476
1477 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1478 return NULL;
1479 if (!PyArg_Parse(arg, "et", encoding, &str))
1480 return NULL;
1481 result = PyBytes_FromString(str);
1482 PyMem_Free(str);
1483 return result;
1484}
1485
1486static PyObject *
1487getargs_es_hash(PyObject *self, PyObject *args)
1488{
1489 PyObject *arg, *result;
1490 const char *encoding = NULL;
1491 PyByteArrayObject *buffer = NULL;
1492 char *str = NULL;
1493 Py_ssize_t size;
1494
1495 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1496 return NULL;
1497 if (buffer != NULL) {
1498 str = PyByteArray_AS_STRING(buffer);
1499 size = PyByteArray_GET_SIZE(buffer);
1500 }
1501 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1502 return NULL;
1503 result = PyBytes_FromStringAndSize(str, size);
1504 if (buffer == NULL)
1505 PyMem_Free(str);
1506 return result;
1507}
1508
1509static PyObject *
1510getargs_et_hash(PyObject *self, PyObject *args)
1511{
1512 PyObject *arg, *result;
1513 const char *encoding = NULL;
1514 PyByteArrayObject *buffer = NULL;
1515 char *str = NULL;
1516 Py_ssize_t size;
1517
1518 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1519 return NULL;
1520 if (buffer != NULL) {
1521 str = PyByteArray_AS_STRING(buffer);
1522 size = PyByteArray_GET_SIZE(buffer);
1523 }
1524 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1525 return NULL;
1526 result = PyBytes_FromStringAndSize(str, size);
1527 if (buffer == NULL)
1528 PyMem_Free(str);
1529 return result;
1530}
1531
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001532/* Test the s and z codes for PyArg_ParseTuple.
1533*/
1534static PyObject *
1535test_s_code(PyObject *self)
1536{
1537 /* Unicode strings should be accepted */
1538 PyObject *tuple, *obj;
1539 char *value;
1540
1541 tuple = PyTuple_New(1);
1542 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001544
1545 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001547 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001549
1550 PyTuple_SET_ITEM(tuple, 0, obj);
1551
1552 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001554 */
1555 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001557
1558 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001560
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001561 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001562 Py_RETURN_NONE;
1563}
1564
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001565static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001566parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001567{
Larry Hastings8f904da2012-06-22 03:56:29 -07001568 PyObject *sub_args;
1569 PyObject *sub_kwargs;
1570 char *sub_format;
1571 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001572
Larry Hastings8f904da2012-06-22 03:56:29 -07001573 Py_ssize_t i, size;
1574 char *keywords[8 + 1]; /* space for NULL at end */
1575 PyObject *o;
1576 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001577
Larry Hastings8f904da2012-06-22 03:56:29 -07001578 int result;
1579 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001580
Larry Hastings22701e82012-08-08 14:52:22 -07001581 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001582
Larry Hastings8f904da2012-06-22 03:56:29 -07001583 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1584 &sub_args, &sub_kwargs,
1585 &sub_format, &sub_keywords))
1586 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001587
Larry Hastings8f904da2012-06-22 03:56:29 -07001588 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1589 PyErr_SetString(PyExc_ValueError,
1590 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1591 return NULL;
1592 }
1593
1594 memset(buffers, 0, sizeof(buffers));
1595 memset(converted, 0, sizeof(converted));
1596 memset(keywords, 0, sizeof(keywords));
1597
1598 size = PySequence_Fast_GET_SIZE(sub_keywords);
1599 if (size > 8) {
1600 PyErr_SetString(PyExc_ValueError,
1601 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1602 goto exit;
1603 }
1604
1605 for (i = 0; i < size; i++) {
1606 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1607 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1608 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001609 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001610 goto exit;
1611 }
1612 keywords[i] = PyBytes_AS_STRING(converted[i]);
1613 }
1614
1615 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1616 sub_format, keywords,
1617 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1618 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1619
1620 if (result) {
1621 return_value = Py_None;
1622 Py_INCREF(Py_None);
1623 }
1624
1625exit:
1626 size = sizeof(converted) / sizeof(converted[0]);
1627 for (i = 0; i < size; i++) {
1628 Py_XDECREF(converted[i]);
1629 }
1630 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001631}
1632
Benjamin Peterson92035012008-12-27 16:00:54 +00001633static volatile int x;
1634
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001635/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1636 of an error.
1637*/
1638static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001639test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001640{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 PyObject *tuple, *obj;
1642 Py_UNICODE *value;
1643 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1646 /* Just use the macro and check that it compiles */
1647 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 tuple = PyTuple_New(1);
1650 if (tuple == NULL)
1651 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 obj = PyUnicode_Decode("test", strlen("test"),
1654 "ascii", NULL);
1655 if (obj == NULL)
1656 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 value = 0;
1661 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1662 return NULL;
1663 if (value != PyUnicode_AS_UNICODE(obj))
1664 return raiseTestError("test_u_code",
1665 "u code returned wrong value for u'test'");
1666 value = 0;
1667 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1668 return NULL;
1669 if (value != PyUnicode_AS_UNICODE(obj) ||
1670 len != PyUnicode_GET_SIZE(obj))
1671 return raiseTestError("test_u_code",
1672 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 Py_DECREF(tuple);
1675 Py_INCREF(Py_None);
1676 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001677}
1678
Guido van Rossumfb67be22007-08-29 18:38:11 +00001679/* Test Z and Z# codes for PyArg_ParseTuple */
1680static PyObject *
1681test_Z_code(PyObject *self)
1682{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001684 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 tuple = PyTuple_New(2);
1688 if (tuple == NULL)
1689 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 obj = PyUnicode_FromString("test");
1692 PyTuple_SET_ITEM(tuple, 0, obj);
1693 Py_INCREF(Py_None);
1694 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 /* swap values on purpose */
1697 value1 = NULL;
1698 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 /* Test Z for both values */
1701 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1702 return NULL;
1703 if (value1 != PyUnicode_AS_UNICODE(obj))
1704 return raiseTestError("test_Z_code",
1705 "Z code returned wrong value for 'test'");
1706 if (value2 != NULL)
1707 return raiseTestError("test_Z_code",
1708 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 value1 = NULL;
1711 value2 = PyUnicode_AS_UNICODE(obj);
1712 len1 = -1;
1713 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 /* Test Z# for both values */
1716 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1717 &value2, &len2) < 0)
1718 return NULL;
1719 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1720 len1 != PyUnicode_GET_SIZE(obj))
1721 return raiseTestError("test_Z_code",
1722 "Z# code returned wrong values for 'test'");
1723 if (value2 != NULL ||
1724 len2 != 0)
1725 return raiseTestError("test_Z_code",
1726 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 Py_DECREF(tuple);
1729 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001730}
1731
Thomas Wouters477c8d52006-05-27 19:21:47 +00001732static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001733test_widechar(PyObject *self)
1734{
1735#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1737 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001738 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001739#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1741 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001742#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1746 if (wide == NULL)
1747 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1750 if (utf8 == NULL) {
1751 Py_DECREF(wide);
1752 return NULL;
1753 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001754
Victor Stinner8ef18872011-11-21 02:06:57 +01001755 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 Py_DECREF(wide);
1757 Py_DECREF(utf8);
1758 return raiseTestError("test_widechar",
1759 "wide string and utf8 string "
1760 "have different length");
1761 }
1762 if (PyUnicode_Compare(wide, utf8)) {
1763 Py_DECREF(wide);
1764 Py_DECREF(utf8);
1765 if (PyErr_Occurred())
1766 return NULL;
1767 return raiseTestError("test_widechar",
1768 "wide string and utf8 string "
1769 "are different");
1770 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 Py_DECREF(wide);
1773 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001774
1775#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1776 wide = PyUnicode_FromWideChar(invalid, 1);
1777 if (wide == NULL)
1778 PyErr_Clear();
1779 else
1780 return raiseTestError("test_widechar",
1781 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1782
1783 wide = PyUnicode_FromUnicode(invalid, 1);
1784 if (wide == NULL)
1785 PyErr_Clear();
1786 else
1787 return raiseTestError("test_widechar",
1788 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001789
1790 wide = PyUnicode_FromUnicode(NULL, 1);
1791 if (wide == NULL)
1792 return NULL;
1793 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001794 if (_PyUnicode_Ready(wide) < 0) {
1795 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001796 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001797 }
1798 else {
1799 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001800 return raiseTestError("test_widechar",
1801 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001802 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001803#endif
1804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001806}
1807
1808static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001809unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001810{
1811 PyObject *unicode, *result;
1812 Py_ssize_t buflen, size;
1813 wchar_t *buffer;
1814
1815 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1816 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001817 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001818 if (buffer == NULL)
1819 return PyErr_NoMemory();
1820
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001821 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001822 if (size == -1) {
1823 PyMem_Free(buffer);
1824 return NULL;
1825 }
1826
1827 if (size < buflen)
1828 buflen = size + 1;
1829 else
1830 buflen = size;
1831 result = PyUnicode_FromWideChar(buffer, buflen);
1832 PyMem_Free(buffer);
1833 if (result == NULL)
1834 return NULL;
1835
1836 return Py_BuildValue("(Nn)", result, size);
1837}
1838
1839static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001840unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001841{
1842 PyObject *unicode, *result;
1843 Py_ssize_t size;
1844 wchar_t *buffer;
1845
1846 if (!PyArg_ParseTuple(args, "U", &unicode))
1847 return NULL;
1848
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001849 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001850 if (buffer == NULL)
1851 return NULL;
1852
1853 result = PyUnicode_FromWideChar(buffer, size + 1);
1854 PyMem_Free(buffer);
1855 if (result == NULL)
1856 return NULL;
1857 return Py_BuildValue("(Nn)", result, size);
1858}
1859
1860static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001861unicode_asucs4(PyObject *self, PyObject *args)
1862{
1863 PyObject *unicode, *result;
1864 Py_UCS4 *buffer;
1865 int copy_null;
1866 Py_ssize_t str_len, buf_len;
1867
1868 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1869 return NULL;
1870 }
1871
1872 buf_len = str_len + 1;
1873 buffer = PyMem_NEW(Py_UCS4, buf_len);
1874 if (buffer == NULL) {
1875 return PyErr_NoMemory();
1876 }
1877 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1878 buffer[str_len] = 0xffffU;
1879
1880 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1881 PyMem_FREE(buffer);
1882 return NULL;
1883 }
1884
1885 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1886 PyMem_FREE(buffer);
1887 return result;
1888}
1889
1890static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001891unicode_findchar(PyObject *self, PyObject *args)
1892{
1893 PyObject *str;
1894 int direction;
1895 unsigned int ch;
1896 Py_ssize_t result;
1897 Py_ssize_t start, end;
1898
1899 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1900 &start, &end, &direction)) {
1901 return NULL;
1902 }
1903
1904 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
1905 if (result == -2)
1906 return NULL;
1907 else
1908 return PyLong_FromSsize_t(result);
1909}
1910
1911static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001912unicode_copycharacters(PyObject *self, PyObject *args)
1913{
1914 PyObject *from, *to, *to_copy;
1915 Py_ssize_t from_start, to_start, how_many, copied;
1916
1917 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1918 &from, &from_start, &how_many)) {
1919 return NULL;
1920 }
1921
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001922 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1923 PyUnicode_MAX_CHAR_VALUE(to)))) {
1924 return NULL;
1925 }
1926 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
1927 Py_DECREF(to_copy);
1928 return NULL;
1929 }
1930
1931 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
1932 from_start, how_many)) < 0) {
1933 Py_DECREF(to_copy);
1934 return NULL;
1935 }
1936
1937 return Py_BuildValue("(Nn)", to_copy, copied);
1938}
1939
1940static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001941unicode_encodedecimal(PyObject *self, PyObject *args)
1942{
1943 Py_UNICODE *unicode;
1944 Py_ssize_t length;
1945 char *errors = NULL;
1946 PyObject *decimal;
1947 Py_ssize_t decimal_length, new_length;
1948 int res;
1949
1950 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1951 return NULL;
1952
1953 decimal_length = length * 7; /* len('&#8364;') */
1954 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1955 if (decimal == NULL)
1956 return NULL;
1957
1958 res = PyUnicode_EncodeDecimal(unicode, length,
1959 PyBytes_AS_STRING(decimal),
1960 errors);
1961 if (res < 0) {
1962 Py_DECREF(decimal);
1963 return NULL;
1964 }
1965
1966 new_length = strlen(PyBytes_AS_STRING(decimal));
1967 assert(new_length <= decimal_length);
1968 res = _PyBytes_Resize(&decimal, new_length);
1969 if (res < 0)
1970 return NULL;
1971
1972 return decimal;
1973}
1974
1975static PyObject *
1976unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1977{
1978 Py_UNICODE *unicode;
1979 Py_ssize_t length;
1980 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1981 return NULL;
1982 return PyUnicode_TransformDecimalToASCII(unicode, length);
1983}
1984
1985static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001986unicode_legacy_string(PyObject *self, PyObject *args)
1987{
1988 Py_UNICODE *data;
1989 Py_ssize_t len;
1990 PyObject *u;
1991
1992 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1993 return NULL;
1994
1995 u = PyUnicode_FromUnicode(NULL, len);
1996 if (u == NULL)
1997 return NULL;
1998
1999 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2000
2001 if (len > 0) { /* The empty string is always ready. */
2002 assert(!PyUnicode_IS_READY(u));
2003 }
2004
2005 return u;
2006}
2007
2008static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002009getargs_w_star(PyObject *self, PyObject *args)
2010{
2011 Py_buffer buffer;
2012 PyObject *result;
2013 char *str;
2014
2015 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2016 return NULL;
2017
2018 if (2 <= buffer.len) {
2019 str = buffer.buf;
2020 str[0] = '[';
2021 str[buffer.len-1] = ']';
2022 }
2023
2024 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2025 PyBuffer_Release(&buffer);
2026 return result;
2027}
2028
2029
2030static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00002031test_empty_argparse(PyObject *self)
2032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 /* Test that formats can begin with '|'. See issue #4720. */
2034 PyObject *tuple, *dict = NULL;
2035 static char *kwlist[] = {NULL};
2036 int result;
2037 tuple = PyTuple_New(0);
2038 if (!tuple)
2039 return NULL;
2040 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
2041 goto done;
2042 dict = PyDict_New();
2043 if (!dict)
2044 goto done;
2045 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002046 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 Py_DECREF(tuple);
2048 Py_XDECREF(dict);
2049 if (result < 0)
2050 return NULL;
2051 else {
2052 Py_RETURN_NONE;
2053 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002054}
2055
2056static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002057codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002058{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 const char *encoding, *errors = NULL;
2060 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2061 &encoding, &errors))
2062 return NULL;
2063 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002064}
2065
Thomas Wouters477c8d52006-05-27 19:21:47 +00002066static PyObject *
2067codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 const char *encoding, *errors = NULL;
2070 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2071 &encoding, &errors))
2072 return NULL;
2073 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002074}
2075
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002076
Tim Peters5b8132f2003-01-31 15:52:05 +00002077/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002078static PyObject *
2079test_long_numbits(PyObject *self)
2080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 struct triple {
2082 long input;
2083 size_t nbits;
2084 int sign;
2085 } testcases[] = {{0, 0, 0},
2086 {1L, 1, 1},
2087 {-1L, 1, -1},
2088 {2L, 2, 1},
2089 {-2L, 2, -1},
2090 {3L, 2, 1},
2091 {-3L, 2, -1},
2092 {4L, 3, 1},
2093 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002094 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 {-0x7fffL, 15, -1},
2096 {0xffffL, 16, 1},
2097 {-0xffffL, 16, -1},
2098 {0xfffffffL, 28, 1},
2099 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002100 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002101
Victor Stinner63941882011-09-29 00:42:28 +02002102 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002103 size_t nbits;
2104 int sign;
2105 PyObject *plong;
2106
2107 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002108 if (plong == NULL)
2109 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002110 nbits = _PyLong_NumBits(plong);
2111 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 Py_DECREF(plong);
2114 if (nbits != testcases[i].nbits)
2115 return raiseTestError("test_long_numbits",
2116 "wrong result for _PyLong_NumBits");
2117 if (sign != testcases[i].sign)
2118 return raiseTestError("test_long_numbits",
2119 "wrong result for _PyLong_Sign");
2120 }
2121 Py_INCREF(Py_None);
2122 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002123}
2124
Thomas Heller519a0422007-11-15 20:48:54 +00002125/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002126
2127static PyObject *
2128test_null_strings(PyObject *self)
2129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2131 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2132 Py_XDECREF(o1);
2133 Py_XDECREF(o2);
2134 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002135}
2136
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002137static PyObject *
2138raise_exception(PyObject *self, PyObject *args)
2139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 PyObject *exc;
2141 PyObject *exc_args, *v;
2142 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2145 &exc, &num_args))
2146 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 exc_args = PyTuple_New(num_args);
2149 if (exc_args == NULL)
2150 return NULL;
2151 for (i = 0; i < num_args; ++i) {
2152 v = PyLong_FromLong(i);
2153 if (v == NULL) {
2154 Py_DECREF(exc_args);
2155 return NULL;
2156 }
2157 PyTuple_SET_ITEM(exc_args, i, v);
2158 }
2159 PyErr_SetObject(exc, exc_args);
2160 Py_DECREF(exc_args);
2161 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002162}
Tim Peters91621db2001-06-12 20:10:01 +00002163
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002164static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002165set_errno(PyObject *self, PyObject *args)
2166{
2167 int new_errno;
2168
2169 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2170 return NULL;
2171
2172 errno = new_errno;
2173 Py_RETURN_NONE;
2174}
2175
2176static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002177test_set_exc_info(PyObject *self, PyObject *args)
2178{
2179 PyObject *orig_exc;
2180 PyObject *new_type, *new_value, *new_tb;
2181 PyObject *type, *value, *tb;
2182 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2183 &new_type, &new_value, &new_tb))
2184 return NULL;
2185
2186 PyErr_GetExcInfo(&type, &value, &tb);
2187
2188 Py_INCREF(new_type);
2189 Py_INCREF(new_value);
2190 Py_INCREF(new_tb);
2191 PyErr_SetExcInfo(new_type, new_value, new_tb);
2192
2193 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2194 Py_XDECREF(type);
2195 Py_XDECREF(value);
2196 Py_XDECREF(tb);
2197 return orig_exc;
2198}
Benjamin Peterson16323982010-02-03 01:13:41 +00002199
2200static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002201
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002202static PyObject *
2203test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 if (PyDateTimeAPI) {
2205 if (test_run_counter) {
2206 /* Probably regrtest.py -R */
2207 Py_RETURN_NONE;
2208 }
2209 else {
2210 PyErr_SetString(PyExc_AssertionError,
2211 "PyDateTime_CAPI somehow initialized");
2212 return NULL;
2213 }
2214 }
2215 test_run_counter++;
2216 PyDateTime_IMPORT;
2217 if (PyDateTimeAPI)
2218 Py_RETURN_NONE;
2219 else
2220 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002221}
2222
Benjamin Peterson16323982010-02-03 01:13:41 +00002223
2224#ifdef WITH_THREAD
2225
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002226/* test_thread_state spawns a thread of its own, and that thread releases
2227 * `thread_done` when it's finished. The driver code has to know when the
2228 * thread finishes, because the thread uses a PyObject (the callable) that
2229 * may go away when the driver finishes. The former lack of this explicit
2230 * synchronization caused rare segfaults, so rare that they were seen only
2231 * on a Mac buildbot (although they were possible on any box).
2232 */
2233static PyThread_type_lock thread_done = NULL;
2234
Benjamin Petersona786b022008-08-25 21:05:21 +00002235static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002236_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 PyObject *rc;
2239 int success;
2240 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002241 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242 success = (rc != NULL);
2243 Py_XDECREF(rc);
2244 PyGILState_Release(s);
2245 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002246}
2247
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002248/* Same thing, but releases `thread_done` when it returns. This variant
2249 * should be called only from threads spawned by test_thread_state().
2250 */
2251static void
2252_make_call_from_thread(void *callable)
2253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 _make_call(callable);
2255 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002256}
2257
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002258static PyObject *
2259test_thread_state(PyObject *self, PyObject *args)
2260{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 PyObject *fn;
2262 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2265 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 if (!PyCallable_Check(fn)) {
2268 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2269 fn->ob_type->tp_name);
2270 return NULL;
2271 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 /* Ensure Python is set up for threading */
2274 PyEval_InitThreads();
2275 thread_done = PyThread_allocate_lock();
2276 if (thread_done == NULL)
2277 return PyErr_NoMemory();
2278 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 /* Start a new thread with our callback. */
2281 PyThread_start_new_thread(_make_call_from_thread, fn);
2282 /* Make the callback with the thread lock held by this thread */
2283 success &= _make_call(fn);
2284 /* Do it all again, but this time with the thread-lock released */
2285 Py_BEGIN_ALLOW_THREADS
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 /* And once more with and without a thread
2291 XXX - should use a lock and work out exactly what we are trying
2292 to test <wink>
2293 */
2294 Py_BEGIN_ALLOW_THREADS
2295 PyThread_start_new_thread(_make_call_from_thread, fn);
2296 success &= _make_call(fn);
2297 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2298 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 /* Release lock we acquired above. This is required on HP-UX. */
2301 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 PyThread_free_lock(thread_done);
2304 if (!success)
2305 return NULL;
2306 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002307}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002308
2309/* test Py_AddPendingCalls using threads */
2310static int _pending_callback(void *arg)
2311{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 /* we assume the argument is callable object to which we own a reference */
2313 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002314 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 Py_DECREF(callable);
2316 Py_XDECREF(r);
2317 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002318}
2319
2320/* The following requests n callbacks to _pending_callback. It can be
2321 * run from any python thread.
2322 */
2323PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
2324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 PyObject *callable;
2326 int r;
2327 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2328 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 /* create the reference for the callbackwhile we hold the lock */
2331 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002333 Py_BEGIN_ALLOW_THREADS
2334 r = Py_AddPendingCall(&_pending_callback, callable);
2335 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 if (r<0) {
2338 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
2339 Py_INCREF(Py_False);
2340 return Py_False;
2341 }
2342 Py_INCREF(Py_True);
2343 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002344}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002345#endif
2346
Neal Norwitzb0d26332007-08-25 00:49:05 +00002347/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002348static PyObject *
2349test_string_from_format(PyObject *self, PyObject *args)
2350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 PyObject *result;
2352 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002353
Alexander Belopolskye239d232010-12-08 23:31:48 +00002354#define CHECK_1_FORMAT(FORMAT, TYPE) \
2355 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2356 if (result == NULL) \
2357 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002358 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002359 msg = FORMAT " failed at 1"; \
2360 goto Fail; \
2361 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 CHECK_1_FORMAT("%d", int);
2365 CHECK_1_FORMAT("%ld", long);
2366 /* The z width modifier was added in Python 2.5. */
2367 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 /* The u type code was added in Python 2.5. */
2370 CHECK_1_FORMAT("%u", unsigned int);
2371 CHECK_1_FORMAT("%lu", unsigned long);
2372 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002375 CHECK_1_FORMAT("%llu", unsigned long long);
2376 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002379
2380 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 Py_XDECREF(result);
2382 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002383
2384#undef CHECK_1_FORMAT
2385}
2386
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002387
2388static PyObject *
2389test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2391 int result;
2392 if (py_s == NULL)
2393 return NULL;
2394 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2395 Py_DECREF(py_s);
2396 if (!result) {
2397 PyErr_SetString(TestError, "Python string ending in NULL "
2398 "should not compare equal to c string.");
2399 return NULL;
2400 }
2401 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002402}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002403
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002404/* This is here to provide a docstring for test_descr. */
2405static PyObject *
2406test_with_docstring(PyObject *self)
2407{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002408 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002409}
2410
Mark Dickinson725bfd82009-05-03 20:33:40 +00002411/* Test PyOS_string_to_double. */
2412static PyObject *
2413test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414 double result;
2415 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417#define CHECK_STRING(STR, expected) \
2418 result = PyOS_string_to_double(STR, NULL, NULL); \
2419 if (result == -1.0 && PyErr_Occurred()) \
2420 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002421 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 msg = "conversion of " STR " to float failed"; \
2423 goto fail; \
2424 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426#define CHECK_INVALID(STR) \
2427 result = PyOS_string_to_double(STR, NULL, NULL); \
2428 if (result == -1.0 && PyErr_Occurred()) { \
2429 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2430 PyErr_Clear(); \
2431 else \
2432 return NULL; \
2433 } \
2434 else { \
2435 msg = "conversion of " STR " didn't raise ValueError"; \
2436 goto fail; \
2437 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 CHECK_STRING("0.1", 0.1);
2440 CHECK_STRING("1.234", 1.234);
2441 CHECK_STRING("-1.35", -1.35);
2442 CHECK_STRING(".1e01", 1.0);
2443 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 CHECK_INVALID(" 0.1");
2446 CHECK_INVALID("\t\n-3");
2447 CHECK_INVALID(".123 ");
2448 CHECK_INVALID("3\n");
2449 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002452 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002454#undef CHECK_STRING
2455#undef CHECK_INVALID
2456}
2457
2458
Benjamin Petersonb173f782009-05-05 22:31:58 +00002459/* Coverage testing of capsule objects. */
2460
2461static const char *capsule_name = "capsule name";
2462static char *capsule_pointer = "capsule pointer";
2463static char *capsule_context = "capsule context";
2464static const char *capsule_error = NULL;
2465static int
2466capsule_destructor_call_count = 0;
2467
2468static void
2469capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 capsule_destructor_call_count++;
2471 if (PyCapsule_GetContext(o) != capsule_context) {
2472 capsule_error = "context did not match in destructor!";
2473 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2474 capsule_error = "destructor did not match in destructor! (woah!)";
2475 } else if (PyCapsule_GetName(o) != capsule_name) {
2476 capsule_error = "name did not match in destructor!";
2477 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2478 capsule_error = "pointer did not match in destructor!";
2479 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002480}
2481
2482typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 char *name;
2484 char *module;
2485 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002486} known_capsule;
2487
2488static PyObject *
2489test_capsule(PyObject *self, PyObject *args)
2490{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 PyObject *object;
2492 const char *error = NULL;
2493 void *pointer;
2494 void *pointer2;
2495 known_capsule known_capsules[] = {
2496 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2497 KNOWN_CAPSULE("_socket", "CAPI"),
2498 KNOWN_CAPSULE("_curses", "_C_API"),
2499 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2500 { NULL, NULL },
2501 };
2502 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002503
2504#define FAIL(x) { error = (x); goto exit; }
2505
2506#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 if (capsule_error) { \
2508 FAIL(capsule_error); \
2509 } \
2510 else if (!capsule_destructor_call_count) { \
2511 FAIL("destructor not called!"); \
2512 } \
2513 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2516 PyCapsule_SetContext(object, capsule_context);
2517 capsule_destructor(object);
2518 CHECK_DESTRUCTOR;
2519 Py_DECREF(object);
2520 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522 object = PyCapsule_New(known, "ignored", NULL);
2523 PyCapsule_SetPointer(object, capsule_pointer);
2524 PyCapsule_SetName(object, capsule_name);
2525 PyCapsule_SetDestructor(object, capsule_destructor);
2526 PyCapsule_SetContext(object, capsule_context);
2527 capsule_destructor(object);
2528 CHECK_DESTRUCTOR;
2529 /* intentionally access using the wrong name */
2530 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2531 if (!PyErr_Occurred()) {
2532 FAIL("PyCapsule_GetPointer should have failed but did not!");
2533 }
2534 PyErr_Clear();
2535 if (pointer2) {
2536 if (pointer2 == capsule_pointer) {
2537 FAIL("PyCapsule_GetPointer should not have"
2538 " returned the internal pointer!");
2539 } else {
2540 FAIL("PyCapsule_GetPointer should have "
2541 "returned NULL pointer but did not!");
2542 }
2543 }
2544 PyCapsule_SetDestructor(object, NULL);
2545 Py_DECREF(object);
2546 if (capsule_destructor_call_count) {
2547 FAIL("destructor called when it should not have been!");
2548 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 for (known = &known_capsules[0]; known->module != NULL; known++) {
2551 /* yeah, ordinarily I wouldn't do this either,
2552 but it's fine for this test harness.
2553 */
2554 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002555#undef FAIL
2556#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 { \
2558 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2559 x, known->module, known->attribute); \
2560 error = buffer; \
2561 goto exit; \
2562 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 PyObject *module = PyImport_ImportModule(known->module);
2565 if (module) {
2566 pointer = PyCapsule_Import(known->name, 0);
2567 if (!pointer) {
2568 Py_DECREF(module);
2569 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2570 }
2571 object = PyObject_GetAttrString(module, known->attribute);
2572 if (!object) {
2573 Py_DECREF(module);
2574 return NULL;
2575 }
2576 pointer2 = PyCapsule_GetPointer(object,
2577 "weebles wobble but they don't fall down");
2578 if (!PyErr_Occurred()) {
2579 Py_DECREF(object);
2580 Py_DECREF(module);
2581 FAIL("PyCapsule_GetPointer should have failed but did not!");
2582 }
2583 PyErr_Clear();
2584 if (pointer2) {
2585 Py_DECREF(module);
2586 Py_DECREF(object);
2587 if (pointer2 == pointer) {
2588 FAIL("PyCapsule_GetPointer should not have"
2589 " returned its internal pointer!");
2590 } else {
2591 FAIL("PyCapsule_GetPointer should have"
2592 " returned NULL pointer but did not!");
2593 }
2594 }
2595 Py_DECREF(object);
2596 Py_DECREF(module);
2597 }
2598 else
2599 PyErr_Clear();
2600 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002601
2602 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 if (error) {
2604 return raiseTestError("test_capsule", error);
2605 }
2606 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002607#undef FAIL
2608}
2609
Guido van Rossumddefaf32007-01-14 03:31:43 +00002610#ifdef HAVE_GETTIMEOFDAY
2611/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002612static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 e->tv_sec -= s->tv_sec;
2615 e->tv_usec -= s->tv_usec;
2616 if (e->tv_usec < 0) {
2617 e->tv_sec -=1;
2618 e->tv_usec += 1000000;
2619 }
2620 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002621}
2622
2623static PyObject *
2624profile_int(PyObject *self, PyObject* args)
2625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002626 int i, k;
2627 struct timeval start, stop;
2628 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 /* Test 1: Allocate and immediately deallocate
2631 many small integers */
2632 gettimeofday(&start, NULL);
2633 for(k=0; k < 20000; k++)
2634 for(i=0; i < 1000; i++) {
2635 single = PyLong_FromLong(i);
2636 Py_DECREF(single);
2637 }
2638 gettimeofday(&stop, NULL);
2639 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002641 /* Test 2: Allocate and immediately deallocate
2642 many large integers */
2643 gettimeofday(&start, NULL);
2644 for(k=0; k < 20000; k++)
2645 for(i=0; i < 1000; i++) {
2646 single = PyLong_FromLong(i+1000000);
2647 Py_DECREF(single);
2648 }
2649 gettimeofday(&stop, NULL);
2650 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 /* Test 3: Allocate a few integers, then release
2653 them all simultaneously. */
2654 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002655 if (multiple == NULL)
2656 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 gettimeofday(&start, NULL);
2658 for(k=0; k < 20000; k++) {
2659 for(i=0; i < 1000; i++) {
2660 multiple[i] = PyLong_FromLong(i+1000000);
2661 }
2662 for(i=0; i < 1000; i++) {
2663 Py_DECREF(multiple[i]);
2664 }
2665 }
2666 gettimeofday(&stop, NULL);
2667 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002668 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 /* Test 4: Allocate many integers, then release
2671 them all simultaneously. */
2672 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002673 if (multiple == NULL)
2674 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 gettimeofday(&start, NULL);
2676 for(k=0; k < 20; k++) {
2677 for(i=0; i < 1000000; i++) {
2678 multiple[i] = PyLong_FromLong(i+1000000);
2679 }
2680 for(i=0; i < 1000000; i++) {
2681 Py_DECREF(multiple[i]);
2682 }
2683 }
2684 gettimeofday(&stop, NULL);
2685 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002686 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 /* Test 5: Allocate many integers < 32000 */
2689 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002690 if (multiple == NULL)
2691 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692 gettimeofday(&start, NULL);
2693 for(k=0; k < 10; k++) {
2694 for(i=0; i < 1000000; i++) {
2695 multiple[i] = PyLong_FromLong(i+1000);
2696 }
2697 for(i=0; i < 1000000; i++) {
2698 Py_DECREF(multiple[i]);
2699 }
2700 }
2701 gettimeofday(&stop, NULL);
2702 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002703 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 /* Test 6: Perform small int addition */
2706 op1 = PyLong_FromLong(1);
2707 gettimeofday(&start, NULL);
2708 for(i=0; i < 10000000; i++) {
2709 result = PyNumber_Add(op1, op1);
2710 Py_DECREF(result);
2711 }
2712 gettimeofday(&stop, NULL);
2713 Py_DECREF(op1);
2714 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 /* Test 7: Perform medium int addition */
2717 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002718 if (op1 == NULL)
2719 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 gettimeofday(&start, NULL);
2721 for(i=0; i < 10000000; i++) {
2722 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002723 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 }
2725 gettimeofday(&stop, NULL);
2726 Py_DECREF(op1);
2727 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 Py_INCREF(Py_None);
2730 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002731}
2732#endif
2733
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002734/* To test the format of tracebacks as printed out. */
2735static PyObject *
2736traceback_print(PyObject *self, PyObject *args)
2737{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 PyObject *file;
2739 PyObject *traceback;
2740 int result;
2741
2742 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2743 &traceback, &file))
2744 return NULL;
2745
2746 result = PyTraceBack_Print(traceback, file);
2747 if (result < 0)
2748 return NULL;
2749 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002750}
2751
Benjamin Petersone6528212008-07-15 15:32:09 +00002752/* To test the format of exceptions as printed out. */
2753static PyObject *
2754exception_print(PyObject *self, PyObject *args)
2755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 PyObject *value;
2757 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 if (!PyArg_ParseTuple(args, "O:exception_print",
2760 &value))
2761 return NULL;
2762 if (!PyExceptionInstance_Check(value)) {
2763 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2764 return NULL;
2765 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 tb = PyException_GetTraceback(value);
2768 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2769 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002772}
2773
2774
2775
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002776
2777/* reliably raise a MemoryError */
2778static PyObject *
2779raise_memoryerror(PyObject *self)
2780{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 PyErr_NoMemory();
2782 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002783}
2784
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002785/* Issue 6012 */
2786static PyObject *str1, *str2;
2787static int
2788failing_converter(PyObject *obj, void *arg)
2789{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 /* Clone str1, then let the conversion fail. */
2791 assert(str1);
2792 str2 = str1;
2793 Py_INCREF(str2);
2794 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002795}
2796static PyObject*
2797argparsing(PyObject *o, PyObject *args)
2798{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 PyObject *res;
2800 str1 = str2 = NULL;
2801 if (!PyArg_ParseTuple(args, "O&O&",
2802 PyUnicode_FSConverter, &str1,
2803 failing_converter, &str2)) {
2804 if (!str2)
2805 /* argument converter not called? */
2806 return NULL;
2807 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002808 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002809 Py_DECREF(str2);
2810 PyErr_Clear();
2811 return res;
2812 }
2813 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002814}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002815
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002816/* To test that the result of PyCode_NewEmpty has the right members. */
2817static PyObject *
2818code_newempty(PyObject *self, PyObject *args)
2819{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 const char *filename;
2821 const char *funcname;
2822 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2825 &filename, &funcname, &firstlineno))
2826 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002829}
2830
Georg Brandl1e28a272009-12-28 08:41:01 +00002831/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2832 Run via Lib/test/test_exceptions.py */
2833static PyObject *
2834make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 const char *name;
2837 const char *doc = NULL;
2838 PyObject *base = NULL;
2839 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002843 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2844 "s|sOO:make_exception_with_doc", kwlist,
2845 &name, &doc, &base, &dict))
2846 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002849}
2850
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002851static PyObject *
2852make_memoryview_from_NULL_pointer(PyObject *self)
2853{
2854 Py_buffer info;
2855 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2856 return NULL;
2857 return PyMemoryView_FromBuffer(&info);
2858}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002859
Stefan Krah7213fcc2015-02-01 16:19:23 +01002860static PyObject *
2861test_from_contiguous(PyObject* self, PyObject *noargs)
2862{
2863 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2864 int init[5] = {0, 1, 2, 3, 4};
2865 Py_ssize_t itemsize = sizeof(int);
2866 Py_ssize_t shape = 5;
2867 Py_ssize_t strides = 2 * itemsize;
2868 Py_buffer view = {
2869 data,
2870 NULL,
2871 5 * itemsize,
2872 itemsize,
2873 1,
2874 1,
2875 NULL,
2876 &shape,
2877 &strides,
2878 NULL,
2879 NULL
2880 };
2881 int *ptr;
2882 int i;
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 view.buf = &data[8];
2895 view.strides[0] = -2 * itemsize;
2896
2897 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2898 ptr = view.buf;
2899 for (i = 0; i < 5; i++) {
2900 if (*(ptr-2*i) != i) {
2901 PyErr_SetString(TestError,
2902 "test_from_contiguous: incorrect result");
2903 return NULL;
2904 }
2905 }
2906
2907 Py_RETURN_NONE;
2908}
Stefan Krah650c1e82015-02-03 21:43:23 +01002909
Stefan Kraha7559c02015-02-03 22:27:21 +01002910#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01002911extern PyTypeObject _PyBytesIOBuffer_Type;
2912
Stefan Krah5178d912015-02-03 16:57:21 +01002913static PyObject *
2914test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
2915{
Stefan Krah650c1e82015-02-03 21:43:23 +01002916 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01002917 PyObject *b;
2918 char *dummy[1];
2919 int ret, match;
2920
Stefan Krah650c1e82015-02-03 21:43:23 +01002921 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01002922 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
2923 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2924 PyErr_Clear();
2925 if (ret != -1 || match == 0)
2926 goto error;
2927
Stefan Krah650c1e82015-02-03 21:43:23 +01002928 /* bytesiobuf_getbuffer() */
2929 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01002930 if (b == NULL) {
2931 return NULL;
2932 }
2933
2934 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
2935 Py_DECREF(b);
2936 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2937 PyErr_Clear();
2938 if (ret != -1 || match == 0)
2939 goto error;
2940
2941 Py_RETURN_NONE;
2942
2943error:
2944 PyErr_SetString(TestError,
2945 "test_pep3118_obsolete_write_locks: failure");
2946 return NULL;
2947}
Stefan Kraha7559c02015-02-03 22:27:21 +01002948#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002949
Stefan Krah650c1e82015-02-03 21:43:23 +01002950/* This tests functions that historically supported write locks. It is
2951 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
2952 is entitled to segfault in that case. */
2953static PyObject *
2954getbuffer_with_null_view(PyObject* self, PyObject *obj)
2955{
2956 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
2957 return NULL;
2958
2959 Py_RETURN_NONE;
2960}
2961
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002962/* Test that the fatal error from not having a current thread doesn't
2963 cause an infinite loop. Run via Lib/test/test_capi.py */
2964static PyObject *
2965crash_no_current_thread(PyObject *self)
2966{
2967 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002968 /* Using PyThreadState_Get() directly allows the test to pass in
2969 !pydebug mode. However, the test only actually tests anything
2970 in pydebug mode, since that's where the infinite loop was in
2971 the first place. */
2972 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002973 Py_END_ALLOW_THREADS
2974 return NULL;
2975}
2976
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002977/* To run some code in a sub-interpreter. */
2978static PyObject *
2979run_in_subinterp(PyObject *self, PyObject *args)
2980{
2981 const char *code;
2982 int r;
2983 PyThreadState *substate, *mainstate;
2984
2985 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2986 &code))
2987 return NULL;
2988
2989 mainstate = PyThreadState_Get();
2990
2991 PyThreadState_Swap(NULL);
2992
2993 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002994 if (substate == NULL) {
2995 /* Since no new thread state was created, there is no exception to
2996 propagate; raise a fresh one after swapping in the old thread
2997 state. */
2998 PyThreadState_Swap(mainstate);
2999 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3000 return NULL;
3001 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003002 r = PyRun_SimpleString(code);
3003 Py_EndInterpreter(substate);
3004
3005 PyThreadState_Swap(mainstate);
3006
3007 return PyLong_FromLong(r);
3008}
3009
Victor Stinner3c1b3792014-02-17 00:02:43 +01003010static int
3011check_time_rounding(int round)
3012{
Victor Stinner74474232015-09-02 01:43:56 +02003013 if (round != _PyTime_ROUND_FLOOR
3014 && round != _PyTime_ROUND_CEILING
Victor Stinner7667f582015-09-09 01:02:23 +02003015 && round != _PyTime_ROUND_HALF_EVEN) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003016 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3017 return -1;
3018 }
3019 return 0;
3020}
3021
Victor Stinner5d272cc2012-03-13 13:35:55 +01003022static PyObject *
3023test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3024{
3025 PyObject *obj;
3026 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003027 int round;
3028 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003029 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003030 if (check_time_rounding(round) < 0)
3031 return NULL;
3032 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003033 return NULL;
3034 return _PyLong_FromTime_t(sec);
3035}
3036
3037static PyObject *
3038test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3039{
3040 PyObject *obj;
3041 time_t sec;
3042 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003043 int round;
3044 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003045 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003046 if (check_time_rounding(round) < 0)
3047 return NULL;
3048 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003049 return NULL;
3050 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3051}
3052
Victor Stinner643cd682012-03-02 22:54:03 +01003053static PyObject *
3054test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3055{
3056 PyObject *obj;
3057 time_t sec;
3058 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003059 int round;
3060 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003061 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003062 if (check_time_rounding(round) < 0)
3063 return NULL;
3064 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003065 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003066 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003067}
3068
Antoine Pitrou796564c2013-07-30 19:59:21 +02003069static void
3070slot_tp_del(PyObject *self)
3071{
3072 _Py_IDENTIFIER(__tp_del__);
3073 PyObject *del, *res;
3074 PyObject *error_type, *error_value, *error_traceback;
3075
3076 /* Temporarily resurrect the object. */
3077 assert(self->ob_refcnt == 0);
3078 self->ob_refcnt = 1;
3079
3080 /* Save the current exception, if any. */
3081 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3082
3083 /* Execute __del__ method, if any. */
3084 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3085 if (del != NULL) {
3086 res = PyEval_CallObject(del, NULL);
3087 if (res == NULL)
3088 PyErr_WriteUnraisable(del);
3089 else
3090 Py_DECREF(res);
3091 Py_DECREF(del);
3092 }
3093
3094 /* Restore the saved exception. */
3095 PyErr_Restore(error_type, error_value, error_traceback);
3096
3097 /* Undo the temporary resurrection; can't use DECREF here, it would
3098 * cause a recursive call.
3099 */
3100 assert(self->ob_refcnt > 0);
3101 if (--self->ob_refcnt == 0)
3102 return; /* this is the normal path out */
3103
3104 /* __del__ resurrected it! Make it look like the original Py_DECREF
3105 * never happened.
3106 */
3107 {
3108 Py_ssize_t refcnt = self->ob_refcnt;
3109 _Py_NewReference(self);
3110 self->ob_refcnt = refcnt;
3111 }
3112 assert(!PyType_IS_GC(Py_TYPE(self)) ||
3113 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
3114 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3115 * we need to undo that. */
3116 _Py_DEC_REFTOTAL;
3117 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3118 * chain, so no more to do there.
3119 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3120 * _Py_NewReference bumped tp_allocs: both of those need to be
3121 * undone.
3122 */
3123#ifdef COUNT_ALLOCS
3124 --Py_TYPE(self)->tp_frees;
3125 --Py_TYPE(self)->tp_allocs;
3126#endif
3127}
3128
3129static PyObject *
3130with_tp_del(PyObject *self, PyObject *args)
3131{
3132 PyObject *obj;
3133 PyTypeObject *tp;
3134
3135 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3136 return NULL;
3137 tp = (PyTypeObject *) obj;
3138 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3139 PyErr_Format(PyExc_TypeError,
3140 "heap type expected, got %R", obj);
3141 return NULL;
3142 }
3143 tp->tp_del = slot_tp_del;
3144 Py_INCREF(obj);
3145 return obj;
3146}
3147
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003148static PyMethodDef ml;
3149
3150static PyObject *
3151create_cfunction(PyObject *self, PyObject *args)
3152{
3153 return PyCFunction_NewEx(&ml, self, NULL);
3154}
3155
3156static PyMethodDef ml = {
3157 "create_cfunction",
3158 create_cfunction,
3159 METH_NOARGS,
3160 NULL
3161};
3162
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003163static PyObject *
3164_test_incref(PyObject *ob)
3165{
3166 Py_INCREF(ob);
3167 return ob;
3168}
3169
3170static PyObject *
3171test_xincref_doesnt_leak(PyObject *ob)
3172{
3173 PyObject *obj = PyLong_FromLong(0);
3174 Py_XINCREF(_test_incref(obj));
3175 Py_DECREF(obj);
3176 Py_DECREF(obj);
3177 Py_DECREF(obj);
3178 Py_RETURN_NONE;
3179}
3180
3181static PyObject *
3182test_incref_doesnt_leak(PyObject *ob)
3183{
3184 PyObject *obj = PyLong_FromLong(0);
3185 Py_INCREF(_test_incref(obj));
3186 Py_DECREF(obj);
3187 Py_DECREF(obj);
3188 Py_DECREF(obj);
3189 Py_RETURN_NONE;
3190}
3191
3192static PyObject *
3193test_xdecref_doesnt_leak(PyObject *ob)
3194{
3195 Py_XDECREF(PyLong_FromLong(0));
3196 Py_RETURN_NONE;
3197}
3198
3199static PyObject *
3200test_decref_doesnt_leak(PyObject *ob)
3201{
3202 Py_DECREF(PyLong_FromLong(0));
3203 Py_RETURN_NONE;
3204}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003205
Victor Stinner0507bf52013-07-07 02:05:46 +02003206static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02003207test_incref_decref_API(PyObject *ob)
3208{
3209 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003210 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003211 Py_DecRef(obj);
3212 Py_DecRef(obj);
3213 Py_RETURN_NONE;
3214}
3215
3216static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02003217test_pymem_alloc0(PyObject *self)
3218{
3219 void *ptr;
3220
Victor Stinnerdb067af2014-05-02 22:31:14 +02003221 ptr = PyMem_RawMalloc(0);
3222 if (ptr == NULL) {
3223 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3224 return NULL;
3225 }
3226 PyMem_RawFree(ptr);
3227
3228 ptr = PyMem_RawCalloc(0, 0);
3229 if (ptr == NULL) {
3230 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3231 return NULL;
3232 }
3233 PyMem_RawFree(ptr);
3234
Victor Stinner0507bf52013-07-07 02:05:46 +02003235 ptr = PyMem_Malloc(0);
3236 if (ptr == NULL) {
3237 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3238 return NULL;
3239 }
3240 PyMem_Free(ptr);
3241
Victor Stinnerdb067af2014-05-02 22:31:14 +02003242 ptr = PyMem_Calloc(0, 0);
3243 if (ptr == NULL) {
3244 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3245 return NULL;
3246 }
3247 PyMem_Free(ptr);
3248
Victor Stinner0507bf52013-07-07 02:05:46 +02003249 ptr = PyObject_Malloc(0);
3250 if (ptr == NULL) {
3251 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3252 return NULL;
3253 }
3254 PyObject_Free(ptr);
3255
Victor Stinnerdb067af2014-05-02 22:31:14 +02003256 ptr = PyObject_Calloc(0, 0);
3257 if (ptr == NULL) {
3258 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3259 return NULL;
3260 }
3261 PyObject_Free(ptr);
3262
Victor Stinner0507bf52013-07-07 02:05:46 +02003263 Py_RETURN_NONE;
3264}
3265
3266typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003267 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003268
3269 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003270 size_t calloc_nelem;
3271 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003272 void *realloc_ptr;
3273 size_t realloc_new_size;
3274 void *free_ptr;
3275} alloc_hook_t;
3276
3277static void* hook_malloc (void* ctx, size_t size)
3278{
3279 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3280 hook->malloc_size = size;
3281 return hook->alloc.malloc(hook->alloc.ctx, size);
3282}
3283
Victor Stinnerdb067af2014-05-02 22:31:14 +02003284static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
3285{
3286 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3287 hook->calloc_nelem = nelem;
3288 hook->calloc_elsize = elsize;
3289 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3290}
3291
Victor Stinner0507bf52013-07-07 02:05:46 +02003292static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
3293{
3294 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3295 hook->realloc_ptr = ptr;
3296 hook->realloc_new_size = new_size;
3297 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3298}
3299
3300static void hook_free (void *ctx, void *ptr)
3301{
3302 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3303 hook->free_ptr = ptr;
3304 hook->alloc.free(hook->alloc.ctx, ptr);
3305}
3306
3307static PyObject *
3308test_setallocators(PyMemAllocatorDomain domain)
3309{
3310 PyObject *res = NULL;
3311 const char *error_msg;
3312 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003313 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003314 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003315 void *ptr, *ptr2;
3316
Victor Stinnerdb067af2014-05-02 22:31:14 +02003317 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003318
3319 alloc.ctx = &hook;
3320 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003321 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003322 alloc.realloc = &hook_realloc;
3323 alloc.free = &hook_free;
3324 PyMem_GetAllocator(domain, &hook.alloc);
3325 PyMem_SetAllocator(domain, &alloc);
3326
3327 size = 42;
3328 switch(domain)
3329 {
3330 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3331 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3332 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3333 default: ptr = NULL; break;
3334 }
3335
3336 if (ptr == NULL) {
3337 error_msg = "malloc failed";
3338 goto fail;
3339 }
3340
3341 if (hook.malloc_size != size) {
3342 error_msg = "malloc invalid size";
3343 goto fail;
3344 }
3345
3346 size2 = 200;
3347 switch(domain)
3348 {
3349 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3350 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3351 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003352 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003353 }
3354
3355 if (ptr2 == NULL) {
3356 error_msg = "realloc failed";
3357 goto fail;
3358 }
3359
3360 if (hook.realloc_ptr != ptr
3361 || hook.realloc_new_size != size2) {
3362 error_msg = "realloc invalid parameters";
3363 goto fail;
3364 }
3365
3366 switch(domain)
3367 {
3368 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3369 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3370 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3371 }
3372
3373 if (hook.free_ptr != ptr2) {
3374 error_msg = "free invalid pointer";
3375 goto fail;
3376 }
3377
Victor Stinnerdb067af2014-05-02 22:31:14 +02003378 nelem = 2;
3379 elsize = 5;
3380 switch(domain)
3381 {
3382 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3383 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3384 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3385 default: ptr = NULL; break;
3386 }
3387
3388 if (ptr == NULL) {
3389 error_msg = "calloc failed";
3390 goto fail;
3391 }
3392
3393 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3394 error_msg = "calloc invalid nelem or elsize";
3395 goto fail;
3396 }
3397
3398 switch(domain)
3399 {
3400 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3401 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3402 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3403 }
3404
Victor Stinner0507bf52013-07-07 02:05:46 +02003405 Py_INCREF(Py_None);
3406 res = Py_None;
3407 goto finally;
3408
3409fail:
3410 PyErr_SetString(PyExc_RuntimeError, error_msg);
3411
3412finally:
3413 PyMem_SetAllocator(domain, &hook.alloc);
3414 return res;
3415}
3416
3417static PyObject *
3418test_pymem_setrawallocators(PyObject *self)
3419{
3420 return test_setallocators(PYMEM_DOMAIN_RAW);
3421}
3422
3423static PyObject *
3424test_pymem_setallocators(PyObject *self)
3425{
3426 return test_setallocators(PYMEM_DOMAIN_MEM);
3427}
3428
3429static PyObject *
3430test_pyobject_setallocators(PyObject *self)
3431{
3432 return test_setallocators(PYMEM_DOMAIN_OBJ);
3433}
3434
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003435PyDoc_STRVAR(docstring_empty,
3436""
3437);
3438
3439PyDoc_STRVAR(docstring_no_signature,
3440"This docstring has no signature."
3441);
3442
3443PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003444"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003445"\n"
3446"This docstring has an invalid signature."
3447);
3448
Larry Hastings2623c8c2014-02-08 22:15:29 -08003449PyDoc_STRVAR(docstring_with_invalid_signature2,
3450"docstring_with_invalid_signature2($module, /, boo)\n"
3451"\n"
3452"--\n"
3453"\n"
3454"This docstring also has an invalid signature."
3455);
3456
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003457PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003458"docstring_with_signature($module, /, sig)\n"
3459"--\n"
3460"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003461"This docstring has a valid signature."
3462);
3463
Zachary Ware8ef887c2015-04-13 18:22:35 -05003464PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3465"docstring_with_signature_but_no_doc($module, /, sig)\n"
3466"--\n"
3467"\n"
3468);
3469
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003470PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003471"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3472"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003473"\n"
3474"\n"
3475"This docstring has a valid signature and some extra newlines."
3476);
3477
Larry Hastings16c51912014-01-07 11:53:01 -08003478PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003479"docstring_with_signature_with_defaults(module, s='avocado',\n"
3480" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3481" local=the_number_three, sys=sys.maxsize,\n"
3482" exp=sys.maxsize - 1)\n"
3483"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003484"\n"
3485"\n"
3486"\n"
3487"This docstring has a valid signature with parameters,\n"
3488"and the parameters take defaults of varying types."
3489);
3490
Victor Stinner258e4d32013-12-13 02:30:12 +01003491#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003492typedef struct {
3493 PyThread_type_lock start_event;
3494 PyThread_type_lock exit_event;
3495 PyObject *callback;
3496} test_c_thread_t;
3497
3498static void
3499temporary_c_thread(void *data)
3500{
3501 test_c_thread_t *test_c_thread = data;
3502 PyGILState_STATE state;
3503 PyObject *res;
3504
3505 PyThread_release_lock(test_c_thread->start_event);
3506
3507 /* Allocate a Python thread state for this thread */
3508 state = PyGILState_Ensure();
3509
Victor Stinner3466bde2016-09-05 18:16:01 -07003510 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003511 Py_CLEAR(test_c_thread->callback);
3512
3513 if (res == NULL) {
3514 PyErr_Print();
3515 }
3516 else {
3517 Py_DECREF(res);
3518 }
3519
3520 /* Destroy the Python thread state for this thread */
3521 PyGILState_Release(state);
3522
3523 PyThread_release_lock(test_c_thread->exit_event);
3524
3525 PyThread_exit_thread();
3526}
3527
3528static PyObject *
3529call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3530{
3531 PyObject *res = NULL;
3532 test_c_thread_t test_c_thread;
3533 long thread;
3534
3535 PyEval_InitThreads();
3536
3537 test_c_thread.start_event = PyThread_allocate_lock();
3538 test_c_thread.exit_event = PyThread_allocate_lock();
3539 test_c_thread.callback = NULL;
3540 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3541 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3542 goto exit;
3543 }
3544
3545 Py_INCREF(callback);
3546 test_c_thread.callback = callback;
3547
3548 PyThread_acquire_lock(test_c_thread.start_event, 1);
3549 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3550
3551 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3552 if (thread == -1) {
3553 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3554 PyThread_release_lock(test_c_thread.start_event);
3555 PyThread_release_lock(test_c_thread.exit_event);
3556 goto exit;
3557 }
3558
3559 PyThread_acquire_lock(test_c_thread.start_event, 1);
3560 PyThread_release_lock(test_c_thread.start_event);
3561
3562 Py_BEGIN_ALLOW_THREADS
3563 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3564 PyThread_release_lock(test_c_thread.exit_event);
3565 Py_END_ALLOW_THREADS
3566
3567 Py_INCREF(Py_None);
3568 res = Py_None;
3569
3570exit:
3571 Py_CLEAR(test_c_thread.callback);
3572 if (test_c_thread.start_event)
3573 PyThread_free_lock(test_c_thread.start_event);
3574 if (test_c_thread.exit_event)
3575 PyThread_free_lock(test_c_thread.exit_event);
3576 return res;
3577}
Victor Stinner258e4d32013-12-13 02:30:12 +01003578#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003579
Victor Stinner56e8c292014-07-21 12:30:22 +02003580static PyObject*
3581test_raise_signal(PyObject* self, PyObject *args)
3582{
3583 int signum, err;
3584
3585 if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0)
3586 return NULL;
3587
3588 err = raise(signum);
3589 if (err)
3590 return PyErr_SetFromErrno(PyExc_OSError);
3591
3592 if (PyErr_CheckSignals() < 0)
3593 return NULL;
3594
3595 Py_RETURN_NONE;
3596}
3597
Serhiy Storchakab5181342015-02-06 08:58:56 +02003598/* marshal */
3599
3600static PyObject*
3601pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3602{
3603 long value;
3604 char *filename;
3605 int version;
3606 FILE *fp;
3607
3608 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3609 &value, &filename, &version))
3610 return NULL;
3611
3612 fp = fopen(filename, "wb");
3613 if (fp == NULL) {
3614 PyErr_SetFromErrno(PyExc_OSError);
3615 return NULL;
3616 }
3617
3618 PyMarshal_WriteLongToFile(value, fp, version);
3619
3620 fclose(fp);
3621 if (PyErr_Occurred())
3622 return NULL;
3623 Py_RETURN_NONE;
3624}
3625
3626static PyObject*
3627pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3628{
3629 PyObject *obj;
3630 char *filename;
3631 int version;
3632 FILE *fp;
3633
3634 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3635 &obj, &filename, &version))
3636 return NULL;
3637
3638 fp = fopen(filename, "wb");
3639 if (fp == NULL) {
3640 PyErr_SetFromErrno(PyExc_OSError);
3641 return NULL;
3642 }
3643
3644 PyMarshal_WriteObjectToFile(obj, fp, version);
3645
3646 fclose(fp);
3647 if (PyErr_Occurred())
3648 return NULL;
3649 Py_RETURN_NONE;
3650}
3651
3652static PyObject*
3653pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3654{
3655 int value;
3656 long pos;
3657 char *filename;
3658 FILE *fp;
3659
3660 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3661 return NULL;
3662
3663 fp = fopen(filename, "rb");
3664 if (fp == NULL) {
3665 PyErr_SetFromErrno(PyExc_OSError);
3666 return NULL;
3667 }
3668
3669 value = PyMarshal_ReadShortFromFile(fp);
3670 pos = ftell(fp);
3671
3672 fclose(fp);
3673 if (PyErr_Occurred())
3674 return NULL;
3675 return Py_BuildValue("il", value, pos);
3676}
3677
3678static PyObject*
3679pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3680{
3681 long value, pos;
3682 char *filename;
3683 FILE *fp;
3684
3685 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3686 return NULL;
3687
3688 fp = fopen(filename, "rb");
3689 if (fp == NULL) {
3690 PyErr_SetFromErrno(PyExc_OSError);
3691 return NULL;
3692 }
3693
3694 value = PyMarshal_ReadLongFromFile(fp);
3695 pos = ftell(fp);
3696
3697 fclose(fp);
3698 if (PyErr_Occurred())
3699 return NULL;
3700 return Py_BuildValue("ll", value, pos);
3701}
3702
3703static PyObject*
3704pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3705{
3706 PyObject *obj;
3707 long pos;
3708 char *filename;
3709 FILE *fp;
3710
3711 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3712 return NULL;
3713
3714 fp = fopen(filename, "rb");
3715 if (fp == NULL) {
3716 PyErr_SetFromErrno(PyExc_OSError);
3717 return NULL;
3718 }
3719
3720 obj = PyMarshal_ReadLastObjectFromFile(fp);
3721 pos = ftell(fp);
3722
3723 fclose(fp);
3724 return Py_BuildValue("Nl", obj, pos);
3725}
3726
3727static PyObject*
3728pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3729{
3730 PyObject *obj;
3731 long pos;
3732 char *filename;
3733 FILE *fp;
3734
3735 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3736 return NULL;
3737
3738 fp = fopen(filename, "rb");
3739 if (fp == NULL) {
3740 PyErr_SetFromErrno(PyExc_OSError);
3741 return NULL;
3742 }
3743
3744 obj = PyMarshal_ReadObjectFromFile(fp);
3745 pos = ftell(fp);
3746
3747 fclose(fp);
3748 return Py_BuildValue("Nl", obj, pos);
3749}
3750
Victor Stinnerefde1462015-03-21 15:04:43 +01003751static PyObject*
3752return_null_without_error(PyObject *self, PyObject *args)
3753{
3754 /* invalid call: return NULL without setting an error,
3755 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3756 PyErr_Clear();
3757 return NULL;
3758}
3759
3760static PyObject*
3761return_result_with_error(PyObject *self, PyObject *args)
3762{
3763 /* invalid call: return a result with an error set,
3764 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3765 PyErr_SetNone(PyExc_ValueError);
3766 Py_RETURN_NONE;
3767}
3768
Victor Stinner992c43f2015-03-27 17:12:45 +01003769static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02003770test_pytime_fromseconds(PyObject *self, PyObject *args)
3771{
3772 int seconds;
3773 _PyTime_t ts;
3774
3775 if (!PyArg_ParseTuple(args, "i", &seconds))
3776 return NULL;
3777 ts = _PyTime_FromSeconds(seconds);
3778 return _PyTime_AsNanosecondsObject(ts);
3779}
3780
3781static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01003782test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
3783{
3784 PyObject *obj;
3785 int round;
3786 _PyTime_t ts;
3787
3788 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
3789 return NULL;
3790 if (check_time_rounding(round) < 0)
3791 return NULL;
3792 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
3793 return NULL;
3794 return _PyTime_AsNanosecondsObject(ts);
3795}
3796
Victor Stinner4bfb4602015-03-27 22:27:24 +01003797static PyObject *
3798test_pytime_assecondsdouble(PyObject *self, PyObject *args)
3799{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003800 long long ns;
Victor Stinner4bfb4602015-03-27 22:27:24 +01003801 _PyTime_t ts;
3802 double d;
3803
3804 if (!PyArg_ParseTuple(args, "L", &ns))
3805 return NULL;
3806 ts = _PyTime_FromNanoseconds(ns);
3807 d = _PyTime_AsSecondsDouble(ts);
3808 return PyFloat_FromDouble(d);
3809}
3810
Victor Stinner95e9cef2015-03-28 01:26:47 +01003811static PyObject *
3812test_PyTime_AsTimeval(PyObject *self, PyObject *args)
3813{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003814 long long ns;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003815 int round;
3816 _PyTime_t t;
3817 struct timeval tv;
3818 PyObject *seconds;
3819
3820 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3821 return NULL;
3822 if (check_time_rounding(round) < 0)
3823 return NULL;
3824 t = _PyTime_FromNanoseconds(ns);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +02003825 if (_PyTime_AsTimeval(t, &tv, round) < 0)
Victor Stinner95e9cef2015-03-28 01:26:47 +01003826 return NULL;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003827
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003828 seconds = PyLong_FromLong((long long)tv.tv_sec);
Victor Stinner95e9cef2015-03-28 01:26:47 +01003829 if (seconds == NULL)
3830 return NULL;
3831 return Py_BuildValue("Nl", seconds, tv.tv_usec);
3832}
3833
Victor Stinner34dc0f42015-03-27 18:19:03 +01003834#ifdef HAVE_CLOCK_GETTIME
3835static PyObject *
3836test_PyTime_AsTimespec(PyObject *self, PyObject *args)
3837{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003838 long long ns;
Victor Stinner34dc0f42015-03-27 18:19:03 +01003839 _PyTime_t t;
3840 struct timespec ts;
3841
3842 if (!PyArg_ParseTuple(args, "L", &ns))
3843 return NULL;
3844 t = _PyTime_FromNanoseconds(ns);
3845 if (_PyTime_AsTimespec(t, &ts) == -1)
3846 return NULL;
3847 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
3848}
3849#endif
3850
Victor Stinner62d1c702015-04-01 17:47:07 +02003851static PyObject *
3852test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
3853{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003854 long long ns;
Victor Stinner62d1c702015-04-01 17:47:07 +02003855 int round;
3856 _PyTime_t t, ms;
3857
3858 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3859 return NULL;
3860 if (check_time_rounding(round) < 0)
3861 return NULL;
3862 t = _PyTime_FromNanoseconds(ns);
3863 ms = _PyTime_AsMilliseconds(t, round);
3864 /* This conversion rely on the fact that _PyTime_t is a number of
3865 nanoseconds */
3866 return _PyTime_AsNanosecondsObject(ms);
3867}
3868
3869static PyObject *
3870test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
3871{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003872 long long ns;
Victor Stinner62d1c702015-04-01 17:47:07 +02003873 int round;
3874 _PyTime_t t, ms;
3875
3876 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3877 return NULL;
3878 if (check_time_rounding(round) < 0)
3879 return NULL;
3880 t = _PyTime_FromNanoseconds(ns);
3881 ms = _PyTime_AsMicroseconds(t, round);
3882 /* This conversion rely on the fact that _PyTime_t is a number of
3883 nanoseconds */
3884 return _PyTime_AsNanosecondsObject(ms);
3885}
3886
Victor Stinner50856d52015-10-13 00:11:21 +02003887static PyObject*
3888get_recursion_depth(PyObject *self, PyObject *args)
3889{
3890 PyThreadState *tstate = PyThreadState_GET();
3891
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07003892 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02003893 return PyLong_FromLong(tstate->recursion_depth - 1);
3894}
3895
Victor Stinner34be8072016-03-14 12:04:26 +01003896static PyObject*
3897pymem_buffer_overflow(PyObject *self, PyObject *args)
3898{
3899 char *buffer;
3900
3901 /* Deliberate buffer overflow to check that PyMem_Free() detects
3902 the overflow when debug hooks are installed. */
3903 buffer = PyMem_Malloc(16);
3904 buffer[16] = 'x';
3905 PyMem_Free(buffer);
3906
3907 Py_RETURN_NONE;
3908}
3909
3910static PyObject*
3911pymem_api_misuse(PyObject *self, PyObject *args)
3912{
3913 char *buffer;
3914
3915 /* Deliberate misusage of Python allocators:
3916 allococate with PyMem but release with PyMem_Raw. */
3917 buffer = PyMem_Malloc(16);
3918 PyMem_RawFree(buffer);
3919
3920 Py_RETURN_NONE;
3921}
3922
Victor Stinnerc4aec362016-03-14 22:26:53 +01003923static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01003924pymem_malloc_without_gil(PyObject *self, PyObject *args)
3925{
3926 char *buffer;
3927
3928 /* Deliberate bug to test debug hooks on Python memory allocators:
3929 call PyMem_Malloc() without holding the GIL */
3930 Py_BEGIN_ALLOW_THREADS
3931 buffer = PyMem_Malloc(10);
3932 Py_END_ALLOW_THREADS
3933
3934 PyMem_Free(buffer);
3935
3936 Py_RETURN_NONE;
3937}
3938
3939static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01003940pyobject_malloc_without_gil(PyObject *self, PyObject *args)
3941{
3942 char *buffer;
3943
Victor Stinnerad524372016-03-16 12:12:53 +01003944 /* Deliberate bug to test debug hooks on Python memory allocators:
3945 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01003946 Py_BEGIN_ALLOW_THREADS
3947 buffer = PyObject_Malloc(10);
3948 Py_END_ALLOW_THREADS
3949
3950 PyObject_Free(buffer);
3951
3952 Py_RETURN_NONE;
3953}
3954
Victor Stinner10b73e12016-03-22 13:39:05 +01003955static PyObject *
3956tracemalloc_track(PyObject *self, PyObject *args)
3957{
3958 unsigned int domain;
3959 PyObject *ptr_obj;
3960 void *ptr;
3961 Py_ssize_t size;
3962 int release_gil = 0;
3963 int res;
3964
3965 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
3966 return NULL;
3967 ptr = PyLong_AsVoidPtr(ptr_obj);
3968 if (PyErr_Occurred())
3969 return NULL;
3970
3971 if (release_gil) {
3972 Py_BEGIN_ALLOW_THREADS
Benjamin Petersonca470632016-09-06 13:47:26 -07003973 res = _PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01003974 Py_END_ALLOW_THREADS
3975 }
3976 else {
Benjamin Petersonca470632016-09-06 13:47:26 -07003977 res = _PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01003978 }
3979
3980 if (res < 0) {
3981 PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
3982 return NULL;
3983 }
3984
3985 Py_RETURN_NONE;
3986}
3987
3988static PyObject *
3989tracemalloc_untrack(PyObject *self, PyObject *args)
3990{
3991 unsigned int domain;
3992 PyObject *ptr_obj;
3993 void *ptr;
3994 int res;
3995
3996 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
3997 return NULL;
3998 ptr = PyLong_AsVoidPtr(ptr_obj);
3999 if (PyErr_Occurred())
4000 return NULL;
4001
Benjamin Petersonca470632016-09-06 13:47:26 -07004002 res = _PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004003 if (res < 0) {
4004 PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
4005 return NULL;
4006 }
4007
4008 Py_RETURN_NONE;
4009}
4010
4011static PyObject *
4012tracemalloc_get_traceback(PyObject *self, PyObject *args)
4013{
4014 unsigned int domain;
4015 PyObject *ptr_obj;
4016 void *ptr;
4017
4018 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4019 return NULL;
4020 ptr = PyLong_AsVoidPtr(ptr_obj);
4021 if (PyErr_Occurred())
4022 return NULL;
4023
Benjamin Petersonca470632016-09-06 13:47:26 -07004024 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004025}
4026
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004027static PyObject *
4028dict_get_version(PyObject *self, PyObject *args)
4029{
4030 PyDictObject *dict;
4031 uint64_t version;
4032
4033 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4034 return NULL;
4035
4036 version = dict->ma_version_tag;
4037
4038 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4039 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4040}
4041
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004042
Tim Peters9ea17ac2001-02-02 05:57:15 +00004043static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004044 {"raise_exception", raise_exception, METH_VARARGS},
4045 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02004046 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004047 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01004048 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004049 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
4050 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
4051 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02004052 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01004053 {"dict_hassplittable", dict_hassplittable, METH_O},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004054 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004055 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07004056 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
4057 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
4058 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
4059 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02004060 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004061 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
4062 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02004063 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
4064 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004065 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
4066 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
4067 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07004068 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004069 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
4070 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
4071 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
4072 PyDoc_STR("This is a pretty normal docstring.")},
4073 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
4074 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
4075 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01004076 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004077#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01004078 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004079#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01004080 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03004081 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03004082 {"get_args", get_args, METH_VARARGS},
4083 {"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004084 {"getargs_tuple", getargs_tuple, METH_VARARGS},
4085 {"getargs_keywords", (PyCFunction)getargs_keywords,
4086 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00004087 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
4088 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03004089 {"getargs_positional_only_and_keywords",
4090 (PyCFunction)getargs_positional_only_and_keywords,
4091 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004092 {"getargs_b", getargs_b, METH_VARARGS},
4093 {"getargs_B", getargs_B, METH_VARARGS},
4094 {"getargs_h", getargs_h, METH_VARARGS},
4095 {"getargs_H", getargs_H, METH_VARARGS},
4096 {"getargs_I", getargs_I, METH_VARARGS},
4097 {"getargs_k", getargs_k, METH_VARARGS},
4098 {"getargs_i", getargs_i, METH_VARARGS},
4099 {"getargs_l", getargs_l, METH_VARARGS},
4100 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07004101 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004102 {"getargs_L", getargs_L, METH_VARARGS},
4103 {"getargs_K", getargs_K, METH_VARARGS},
4104 {"test_longlong_api", test_longlong_api, METH_NOARGS},
4105 {"test_long_long_and_overflow",
4106 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
4107 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03004108 {"getargs_f", getargs_f, METH_VARARGS},
4109 {"getargs_d", getargs_d, METH_VARARGS},
4110 {"getargs_D", getargs_D, METH_VARARGS},
4111 {"getargs_S", getargs_S, METH_VARARGS},
4112 {"getargs_Y", getargs_Y, METH_VARARGS},
4113 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03004114 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004115 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00004116 {"getargs_s", getargs_s, METH_VARARGS},
4117 {"getargs_s_star", getargs_s_star, METH_VARARGS},
4118 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
4119 {"getargs_z", getargs_z, METH_VARARGS},
4120 {"getargs_z_star", getargs_z_star, METH_VARARGS},
4121 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
4122 {"getargs_y", getargs_y, METH_VARARGS},
4123 {"getargs_y_star", getargs_y_star, METH_VARARGS},
4124 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
4125 {"getargs_u", getargs_u, METH_VARARGS},
4126 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
4127 {"getargs_Z", getargs_Z, METH_VARARGS},
4128 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00004129 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004130 {"getargs_es", getargs_es, METH_VARARGS},
4131 {"getargs_et", getargs_et, METH_VARARGS},
4132 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
4133 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004134 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004135 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004136 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004137 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004138 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
4139 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
4140 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
4141 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004142 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
4143 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03004144 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08004145 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03004146 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004147 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
4148 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01004149 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004150#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00004151 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004152 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004153#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00004154#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00004155 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004156#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00004157 {"traceback_print", traceback_print, METH_VARARGS},
4158 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02004159 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004160 {"argparsing", argparsing, METH_VARARGS},
4161 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004162 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
4163 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00004164 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
4165 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00004166 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004167 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01004168 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
4169 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01004170 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02004171 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04004172 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02004173 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02004174 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
4175 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02004176 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
4177 {"test_pymem_setallocators",
4178 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
4179 {"test_pyobject_setallocators",
4180 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004181 {"no_docstring",
4182 (PyCFunction)test_with_docstring, METH_NOARGS},
4183 {"docstring_empty",
4184 (PyCFunction)test_with_docstring, METH_NOARGS,
4185 docstring_empty},
4186 {"docstring_no_signature",
4187 (PyCFunction)test_with_docstring, METH_NOARGS,
4188 docstring_no_signature},
4189 {"docstring_with_invalid_signature",
4190 (PyCFunction)test_with_docstring, METH_NOARGS,
4191 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004192 {"docstring_with_invalid_signature2",
4193 (PyCFunction)test_with_docstring, METH_NOARGS,
4194 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004195 {"docstring_with_signature",
4196 (PyCFunction)test_with_docstring, METH_NOARGS,
4197 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004198 {"docstring_with_signature_but_no_doc",
4199 (PyCFunction)test_with_docstring, METH_NOARGS,
4200 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004201 {"docstring_with_signature_and_extra_newlines",
4202 (PyCFunction)test_with_docstring, METH_NOARGS,
4203 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004204 {"docstring_with_signature_with_defaults",
4205 (PyCFunction)test_with_docstring, METH_NOARGS,
4206 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02004207 {"raise_signal",
4208 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01004209#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004210 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4211 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01004212#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02004213 {"pymarshal_write_long_to_file",
4214 pymarshal_write_long_to_file, METH_VARARGS},
4215 {"pymarshal_write_object_to_file",
4216 pymarshal_write_object_to_file, METH_VARARGS},
4217 {"pymarshal_read_short_from_file",
4218 pymarshal_read_short_from_file, METH_VARARGS},
4219 {"pymarshal_read_long_from_file",
4220 pymarshal_read_long_from_file, METH_VARARGS},
4221 {"pymarshal_read_last_object_from_file",
4222 pymarshal_read_last_object_from_file, METH_VARARGS},
4223 {"pymarshal_read_object_from_file",
4224 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004225 {"return_null_without_error",
4226 return_null_without_error, METH_NOARGS},
4227 {"return_result_with_error",
4228 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004229 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004230 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4231 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004232 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004233#ifdef HAVE_CLOCK_GETTIME
4234 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4235#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004236 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4237 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004238 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be8072016-03-14 12:04:26 +01004239 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
4240 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01004241 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01004242 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01004243 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
4244 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
4245 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004246 {"dict_get_version", dict_get_version, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004247 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00004248};
4249
Thomas Hellera4ea6032003-04-17 18:55:45 +00004250#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
4251
Thomas Wouters89f507f2006-12-13 04:49:30 +00004252typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004253 char bool_member;
4254 char byte_member;
4255 unsigned char ubyte_member;
4256 short short_member;
4257 unsigned short ushort_member;
4258 int int_member;
4259 unsigned int uint_member;
4260 long long_member;
4261 unsigned long ulong_member;
4262 Py_ssize_t pyssizet_member;
4263 float float_member;
4264 double double_member;
4265 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07004266 long long longlong_member;
4267 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004268} all_structmembers;
4269
4270typedef struct {
4271 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004273} test_structmembers;
4274
4275static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004276 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
4277 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
4278 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
4279 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
4280 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
4281 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
4282 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
4283 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
4284 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
4285 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
4286 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
4287 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
4288 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004289 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
4290 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004291 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00004292};
4293
4294
Christian Heimes1af737c2008-01-23 08:24:23 +00004295static PyObject *
4296test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
4297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 static char *keywords[] = {
4299 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
4300 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
4301 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004302 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004303 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07004304 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004305 test_structmembers *ob;
4306 const char *s = NULL;
4307 Py_ssize_t string_len = 0;
4308 ob = PyObject_New(test_structmembers, type);
4309 if (ob == NULL)
4310 return NULL;
4311 memset(&ob->structmembers, 0, sizeof(all_structmembers));
4312 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
4313 &ob->structmembers.bool_member,
4314 &ob->structmembers.byte_member,
4315 &ob->structmembers.ubyte_member,
4316 &ob->structmembers.short_member,
4317 &ob->structmembers.ushort_member,
4318 &ob->structmembers.int_member,
4319 &ob->structmembers.uint_member,
4320 &ob->structmembers.long_member,
4321 &ob->structmembers.ulong_member,
4322 &ob->structmembers.pyssizet_member,
4323 &ob->structmembers.float_member,
4324 &ob->structmembers.double_member,
4325 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004326 , &ob->structmembers.longlong_member,
4327 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004328 )) {
4329 Py_DECREF(ob);
4330 return NULL;
4331 }
4332 if (s != NULL) {
4333 if (string_len > 5) {
4334 Py_DECREF(ob);
4335 PyErr_SetString(PyExc_ValueError, "string too long");
4336 return NULL;
4337 }
4338 strcpy(ob->structmembers.inplace_member, s);
4339 }
4340 else {
4341 strcpy(ob->structmembers.inplace_member, "");
4342 }
4343 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004344}
4345
Christian Heimes1af737c2008-01-23 08:24:23 +00004346static void
4347test_structmembers_free(PyObject *ob)
4348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004349 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004350}
4351
4352static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004353 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004354 "test_structmembersType",
4355 sizeof(test_structmembers), /* tp_basicsize */
4356 0, /* tp_itemsize */
4357 test_structmembers_free, /* destructor tp_dealloc */
4358 0, /* tp_print */
4359 0, /* tp_getattr */
4360 0, /* tp_setattr */
4361 0, /* tp_reserved */
4362 0, /* tp_repr */
4363 0, /* tp_as_number */
4364 0, /* tp_as_sequence */
4365 0, /* tp_as_mapping */
4366 0, /* tp_hash */
4367 0, /* tp_call */
4368 0, /* tp_str */
4369 PyObject_GenericGetAttr, /* tp_getattro */
4370 PyObject_GenericSetAttr, /* tp_setattro */
4371 0, /* tp_as_buffer */
4372 0, /* tp_flags */
4373 "Type containing all structmember types",
4374 0, /* traverseproc tp_traverse */
4375 0, /* tp_clear */
4376 0, /* tp_richcompare */
4377 0, /* tp_weaklistoffset */
4378 0, /* tp_iter */
4379 0, /* tp_iternext */
4380 0, /* tp_methods */
4381 test_members, /* tp_members */
4382 0,
4383 0,
4384 0,
4385 0,
4386 0,
4387 0,
4388 0,
4389 0,
4390 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004391};
4392
4393
Benjamin Petersond51374e2014-04-09 23:55:56 -04004394typedef struct {
4395 PyObject_HEAD
4396} matmulObject;
4397
4398static PyObject *
4399matmulType_matmul(PyObject *self, PyObject *other)
4400{
4401 return Py_BuildValue("(sOO)", "matmul", self, other);
4402}
4403
4404static PyObject *
4405matmulType_imatmul(PyObject *self, PyObject *other)
4406{
4407 return Py_BuildValue("(sOO)", "imatmul", self, other);
4408}
4409
4410static void
4411matmulType_dealloc(PyObject *self)
4412{
Zachary Ware420dc562014-04-23 13:51:27 -05004413 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004414}
4415
4416static PyNumberMethods matmulType_as_number = {
4417 0, /* nb_add */
4418 0, /* nb_subtract */
4419 0, /* nb_multiply */
4420 0, /* nb_remainde r*/
4421 0, /* nb_divmod */
4422 0, /* nb_power */
4423 0, /* nb_negative */
4424 0, /* tp_positive */
4425 0, /* tp_absolute */
4426 0, /* tp_bool */
4427 0, /* nb_invert */
4428 0, /* nb_lshift */
4429 0, /* nb_rshift */
4430 0, /* nb_and */
4431 0, /* nb_xor */
4432 0, /* nb_or */
4433 0, /* nb_int */
4434 0, /* nb_reserved */
4435 0, /* nb_float */
4436 0, /* nb_inplace_add */
4437 0, /* nb_inplace_subtract */
4438 0, /* nb_inplace_multiply */
4439 0, /* nb_inplace_remainder */
4440 0, /* nb_inplace_power */
4441 0, /* nb_inplace_lshift */
4442 0, /* nb_inplace_rshift */
4443 0, /* nb_inplace_and */
4444 0, /* nb_inplace_xor */
4445 0, /* nb_inplace_or */
4446 0, /* nb_floor_divide */
4447 0, /* nb_true_divide */
4448 0, /* nb_inplace_floor_divide */
4449 0, /* nb_inplace_true_divide */
4450 0, /* nb_index */
4451 matmulType_matmul, /* nb_matrix_multiply */
4452 matmulType_imatmul /* nb_matrix_inplace_multiply */
4453};
4454
4455static PyTypeObject matmulType = {
4456 PyVarObject_HEAD_INIT(NULL, 0)
4457 "matmulType",
4458 sizeof(matmulObject), /* tp_basicsize */
4459 0, /* tp_itemsize */
4460 matmulType_dealloc, /* destructor tp_dealloc */
4461 0, /* tp_print */
4462 0, /* tp_getattr */
4463 0, /* tp_setattr */
4464 0, /* tp_reserved */
4465 0, /* tp_repr */
4466 &matmulType_as_number, /* tp_as_number */
4467 0, /* tp_as_sequence */
4468 0, /* tp_as_mapping */
4469 0, /* tp_hash */
4470 0, /* tp_call */
4471 0, /* tp_str */
4472 PyObject_GenericGetAttr, /* tp_getattro */
4473 PyObject_GenericSetAttr, /* tp_setattro */
4474 0, /* tp_as_buffer */
4475 0, /* tp_flags */
4476 "C level type with matrix operations defined",
4477 0, /* traverseproc tp_traverse */
4478 0, /* tp_clear */
4479 0, /* tp_richcompare */
4480 0, /* tp_weaklistoffset */
4481 0, /* tp_iter */
4482 0, /* tp_iternext */
4483 0, /* tp_methods */
4484 0, /* tp_members */
4485 0,
4486 0,
4487 0,
4488 0,
4489 0,
4490 0,
4491 0,
4492 0,
4493 PyType_GenericNew, /* tp_new */
4494 PyObject_Del, /* tp_free */
4495};
4496
Martin v. Löwis1a214512008-06-11 05:26:20 +00004497
Yury Selivanov75445082015-05-11 22:57:16 -04004498typedef struct {
4499 PyObject_HEAD
4500 PyObject *ao_iterator;
4501} awaitObject;
4502
4503
4504static PyObject *
4505awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4506{
4507 PyObject *v;
4508 awaitObject *ao;
4509
4510 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
4511 return NULL;
4512
4513 ao = (awaitObject *)type->tp_alloc(type, 0);
4514 if (ao == NULL) {
4515 return NULL;
4516 }
4517
4518 Py_INCREF(v);
4519 ao->ao_iterator = v;
4520
4521 return (PyObject *)ao;
4522}
4523
4524
4525static void
4526awaitObject_dealloc(awaitObject *ao)
4527{
4528 Py_CLEAR(ao->ao_iterator);
4529 Py_TYPE(ao)->tp_free(ao);
4530}
4531
4532
4533static PyObject *
4534awaitObject_await(awaitObject *ao)
4535{
4536 Py_INCREF(ao->ao_iterator);
4537 return ao->ao_iterator;
4538}
4539
4540static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04004541 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04004542 0, /* am_aiter */
4543 0 /* am_anext */
4544};
4545
4546
4547static PyTypeObject awaitType = {
4548 PyVarObject_HEAD_INIT(NULL, 0)
4549 "awaitType",
4550 sizeof(awaitObject), /* tp_basicsize */
4551 0, /* tp_itemsize */
4552 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
4553 0, /* tp_print */
4554 0, /* tp_getattr */
4555 0, /* tp_setattr */
4556 &awaitType_as_async, /* tp_as_async */
4557 0, /* tp_repr */
4558 0, /* tp_as_number */
4559 0, /* tp_as_sequence */
4560 0, /* tp_as_mapping */
4561 0, /* tp_hash */
4562 0, /* tp_call */
4563 0, /* tp_str */
4564 PyObject_GenericGetAttr, /* tp_getattro */
4565 PyObject_GenericSetAttr, /* tp_setattro */
4566 0, /* tp_as_buffer */
4567 0, /* tp_flags */
4568 "C level type with tp_as_async",
4569 0, /* traverseproc tp_traverse */
4570 0, /* tp_clear */
4571 0, /* tp_richcompare */
4572 0, /* tp_weaklistoffset */
4573 0, /* tp_iter */
4574 0, /* tp_iternext */
4575 0, /* tp_methods */
4576 0, /* tp_members */
4577 0,
4578 0,
4579 0,
4580 0,
4581 0,
4582 0,
4583 0,
4584 0,
4585 awaitObject_new, /* tp_new */
4586 PyObject_Del, /* tp_free */
4587};
4588
4589
Martin v. Löwis1a214512008-06-11 05:26:20 +00004590static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004591 PyModuleDef_HEAD_INIT,
4592 "_testcapi",
4593 NULL,
4594 -1,
4595 TestMethods,
4596 NULL,
4597 NULL,
4598 NULL,
4599 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004600};
4601
Nick Coghland5cacbb2015-05-23 22:24:10 +10004602/* Per PEP 489, this module will not be converted to multi-phase initialization
4603 */
4604
Mark Hammond62b1ab12002-07-23 06:31:15 +00004605PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004606PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00004607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004608 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004610 m = PyModule_Create(&_testcapimodule);
4611 if (m == NULL)
4612 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00004615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004616 Py_TYPE(&test_structmembersType)=&PyType_Type;
4617 Py_INCREF(&test_structmembersType);
4618 /* don't use a name starting with "test", since we don't want
4619 test_capi to automatically call this */
4620 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004621 if (PyType_Ready(&matmulType) < 0)
4622 return NULL;
4623 Py_INCREF(&matmulType);
4624 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004625
Yury Selivanov75445082015-05-11 22:57:16 -04004626 if (PyType_Ready(&awaitType) < 0)
4627 return NULL;
4628 Py_INCREF(&awaitType);
4629 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
4630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004631 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
4632 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
4633 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
4634 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
4635 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
4636 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
4637 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
4638 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
4639 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
4640 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
4641 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
4642 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
4643 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
4644 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
4645 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
4646 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
4647 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
4648 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
4649 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
4650 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
4651 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
4652 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02004653 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 Py_INCREF(&PyInstanceMethod_Type);
4655 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00004656
Larry Hastings2a727912014-01-16 11:32:01 -08004657 PyModule_AddIntConstant(m, "the_number_three", 3);
4658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004659 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
4660 Py_INCREF(TestError);
4661 PyModule_AddObject(m, "error", TestError);
4662 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004663}