blob: f09205f63cc5abca192e3e57bfeba3f57ab260a0 [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;
1414 Py_ssize_t size;
1415 if (!PyArg_ParseTuple(args, "u", &str))
1416 return NULL;
1417 size = Py_UNICODE_strlen(str);
1418 return PyUnicode_FromUnicode(str, size);
1419}
1420
1421static PyObject *
1422getargs_u_hash(PyObject *self, PyObject *args)
1423{
1424 Py_UNICODE *str;
1425 Py_ssize_t size;
1426 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1427 return NULL;
1428 return PyUnicode_FromUnicode(str, size);
1429}
1430
1431static PyObject *
1432getargs_Z(PyObject *self, PyObject *args)
1433{
1434 Py_UNICODE *str;
1435 Py_ssize_t size;
1436 if (!PyArg_ParseTuple(args, "Z", &str))
1437 return NULL;
1438 if (str != NULL) {
1439 size = Py_UNICODE_strlen(str);
1440 return PyUnicode_FromUnicode(str, size);
1441 } else
1442 Py_RETURN_NONE;
1443}
1444
1445static PyObject *
1446getargs_Z_hash(PyObject *self, PyObject *args)
1447{
1448 Py_UNICODE *str;
1449 Py_ssize_t size;
1450 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1451 return NULL;
1452 if (str != NULL)
1453 return PyUnicode_FromUnicode(str, size);
1454 else
1455 Py_RETURN_NONE;
1456}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001457
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001458static PyObject *
1459getargs_es(PyObject *self, PyObject *args)
1460{
1461 PyObject *arg, *result;
1462 const char *encoding = NULL;
1463 char *str;
1464
1465 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1466 return NULL;
1467 if (!PyArg_Parse(arg, "es", encoding, &str))
1468 return NULL;
1469 result = PyBytes_FromString(str);
1470 PyMem_Free(str);
1471 return result;
1472}
1473
1474static PyObject *
1475getargs_et(PyObject *self, PyObject *args)
1476{
1477 PyObject *arg, *result;
1478 const char *encoding = NULL;
1479 char *str;
1480
1481 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1482 return NULL;
1483 if (!PyArg_Parse(arg, "et", encoding, &str))
1484 return NULL;
1485 result = PyBytes_FromString(str);
1486 PyMem_Free(str);
1487 return result;
1488}
1489
1490static PyObject *
1491getargs_es_hash(PyObject *self, PyObject *args)
1492{
1493 PyObject *arg, *result;
1494 const char *encoding = NULL;
1495 PyByteArrayObject *buffer = NULL;
1496 char *str = NULL;
1497 Py_ssize_t size;
1498
1499 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1500 return NULL;
1501 if (buffer != NULL) {
1502 str = PyByteArray_AS_STRING(buffer);
1503 size = PyByteArray_GET_SIZE(buffer);
1504 }
1505 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1506 return NULL;
1507 result = PyBytes_FromStringAndSize(str, size);
1508 if (buffer == NULL)
1509 PyMem_Free(str);
1510 return result;
1511}
1512
1513static PyObject *
1514getargs_et_hash(PyObject *self, PyObject *args)
1515{
1516 PyObject *arg, *result;
1517 const char *encoding = NULL;
1518 PyByteArrayObject *buffer = NULL;
1519 char *str = NULL;
1520 Py_ssize_t size;
1521
1522 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1523 return NULL;
1524 if (buffer != NULL) {
1525 str = PyByteArray_AS_STRING(buffer);
1526 size = PyByteArray_GET_SIZE(buffer);
1527 }
1528 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1529 return NULL;
1530 result = PyBytes_FromStringAndSize(str, size);
1531 if (buffer == NULL)
1532 PyMem_Free(str);
1533 return result;
1534}
1535
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001536/* Test the s and z codes for PyArg_ParseTuple.
1537*/
1538static PyObject *
1539test_s_code(PyObject *self)
1540{
1541 /* Unicode strings should be accepted */
1542 PyObject *tuple, *obj;
1543 char *value;
1544
1545 tuple = PyTuple_New(1);
1546 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001548
1549 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001551 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001553
1554 PyTuple_SET_ITEM(tuple, 0, obj);
1555
1556 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001558 */
1559 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001561
1562 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001564
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001565 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001566 Py_RETURN_NONE;
1567}
1568
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001569static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001570parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001571{
Larry Hastings8f904da2012-06-22 03:56:29 -07001572 PyObject *sub_args;
1573 PyObject *sub_kwargs;
1574 char *sub_format;
1575 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001576
Larry Hastings8f904da2012-06-22 03:56:29 -07001577 Py_ssize_t i, size;
1578 char *keywords[8 + 1]; /* space for NULL at end */
1579 PyObject *o;
1580 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001581
Larry Hastings8f904da2012-06-22 03:56:29 -07001582 int result;
1583 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001584
Larry Hastings22701e82012-08-08 14:52:22 -07001585 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001586
Larry Hastings8f904da2012-06-22 03:56:29 -07001587 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1588 &sub_args, &sub_kwargs,
1589 &sub_format, &sub_keywords))
1590 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001591
Larry Hastings8f904da2012-06-22 03:56:29 -07001592 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1593 PyErr_SetString(PyExc_ValueError,
1594 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1595 return NULL;
1596 }
1597
1598 memset(buffers, 0, sizeof(buffers));
1599 memset(converted, 0, sizeof(converted));
1600 memset(keywords, 0, sizeof(keywords));
1601
1602 size = PySequence_Fast_GET_SIZE(sub_keywords);
1603 if (size > 8) {
1604 PyErr_SetString(PyExc_ValueError,
1605 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1606 goto exit;
1607 }
1608
1609 for (i = 0; i < size; i++) {
1610 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1611 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1612 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001613 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001614 goto exit;
1615 }
1616 keywords[i] = PyBytes_AS_STRING(converted[i]);
1617 }
1618
1619 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1620 sub_format, keywords,
1621 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1622 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1623
1624 if (result) {
1625 return_value = Py_None;
1626 Py_INCREF(Py_None);
1627 }
1628
1629exit:
1630 size = sizeof(converted) / sizeof(converted[0]);
1631 for (i = 0; i < size; i++) {
1632 Py_XDECREF(converted[i]);
1633 }
1634 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001635}
1636
Benjamin Peterson92035012008-12-27 16:00:54 +00001637static volatile int x;
1638
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001639/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1640 of an error.
1641*/
1642static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001643test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 PyObject *tuple, *obj;
1646 Py_UNICODE *value;
1647 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1650 /* Just use the macro and check that it compiles */
1651 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 tuple = PyTuple_New(1);
1654 if (tuple == NULL)
1655 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 obj = PyUnicode_Decode("test", strlen("test"),
1658 "ascii", NULL);
1659 if (obj == NULL)
1660 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 value = 0;
1665 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1666 return NULL;
1667 if (value != PyUnicode_AS_UNICODE(obj))
1668 return raiseTestError("test_u_code",
1669 "u code returned wrong value for u'test'");
1670 value = 0;
1671 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1672 return NULL;
1673 if (value != PyUnicode_AS_UNICODE(obj) ||
1674 len != PyUnicode_GET_SIZE(obj))
1675 return raiseTestError("test_u_code",
1676 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 Py_DECREF(tuple);
1679 Py_INCREF(Py_None);
1680 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001681}
1682
Guido van Rossumfb67be22007-08-29 18:38:11 +00001683/* Test Z and Z# codes for PyArg_ParseTuple */
1684static PyObject *
1685test_Z_code(PyObject *self)
1686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001688 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 tuple = PyTuple_New(2);
1692 if (tuple == NULL)
1693 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 obj = PyUnicode_FromString("test");
1696 PyTuple_SET_ITEM(tuple, 0, obj);
1697 Py_INCREF(Py_None);
1698 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 /* swap values on purpose */
1701 value1 = NULL;
1702 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 /* Test Z for both values */
1705 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1706 return NULL;
1707 if (value1 != PyUnicode_AS_UNICODE(obj))
1708 return raiseTestError("test_Z_code",
1709 "Z code returned wrong value for 'test'");
1710 if (value2 != NULL)
1711 return raiseTestError("test_Z_code",
1712 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 value1 = NULL;
1715 value2 = PyUnicode_AS_UNICODE(obj);
1716 len1 = -1;
1717 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 /* Test Z# for both values */
1720 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1721 &value2, &len2) < 0)
1722 return NULL;
1723 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1724 len1 != PyUnicode_GET_SIZE(obj))
1725 return raiseTestError("test_Z_code",
1726 "Z# code returned wrong values for 'test'");
1727 if (value2 != NULL ||
1728 len2 != 0)
1729 return raiseTestError("test_Z_code",
1730 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 Py_DECREF(tuple);
1733 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001734}
1735
Thomas Wouters477c8d52006-05-27 19:21:47 +00001736static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001737test_widechar(PyObject *self)
1738{
1739#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1741 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001742 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001743#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1745 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001746#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1750 if (wide == NULL)
1751 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1754 if (utf8 == NULL) {
1755 Py_DECREF(wide);
1756 return NULL;
1757 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001758
Victor Stinner8ef18872011-11-21 02:06:57 +01001759 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 Py_DECREF(wide);
1761 Py_DECREF(utf8);
1762 return raiseTestError("test_widechar",
1763 "wide string and utf8 string "
1764 "have different length");
1765 }
1766 if (PyUnicode_Compare(wide, utf8)) {
1767 Py_DECREF(wide);
1768 Py_DECREF(utf8);
1769 if (PyErr_Occurred())
1770 return NULL;
1771 return raiseTestError("test_widechar",
1772 "wide string and utf8 string "
1773 "are different");
1774 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 Py_DECREF(wide);
1777 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001778
1779#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1780 wide = PyUnicode_FromWideChar(invalid, 1);
1781 if (wide == NULL)
1782 PyErr_Clear();
1783 else
1784 return raiseTestError("test_widechar",
1785 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1786
1787 wide = PyUnicode_FromUnicode(invalid, 1);
1788 if (wide == NULL)
1789 PyErr_Clear();
1790 else
1791 return raiseTestError("test_widechar",
1792 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001793
1794 wide = PyUnicode_FromUnicode(NULL, 1);
1795 if (wide == NULL)
1796 return NULL;
1797 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001798 if (_PyUnicode_Ready(wide) < 0) {
1799 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001800 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001801 }
1802 else {
1803 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001804 return raiseTestError("test_widechar",
1805 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001806 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001807#endif
1808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001810}
1811
1812static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001813unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001814{
1815 PyObject *unicode, *result;
1816 Py_ssize_t buflen, size;
1817 wchar_t *buffer;
1818
1819 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1820 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001821 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001822 if (buffer == NULL)
1823 return PyErr_NoMemory();
1824
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001825 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001826 if (size == -1) {
1827 PyMem_Free(buffer);
1828 return NULL;
1829 }
1830
1831 if (size < buflen)
1832 buflen = size + 1;
1833 else
1834 buflen = size;
1835 result = PyUnicode_FromWideChar(buffer, buflen);
1836 PyMem_Free(buffer);
1837 if (result == NULL)
1838 return NULL;
1839
1840 return Py_BuildValue("(Nn)", result, size);
1841}
1842
1843static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001844unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001845{
1846 PyObject *unicode, *result;
1847 Py_ssize_t size;
1848 wchar_t *buffer;
1849
1850 if (!PyArg_ParseTuple(args, "U", &unicode))
1851 return NULL;
1852
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001853 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001854 if (buffer == NULL)
1855 return NULL;
1856
1857 result = PyUnicode_FromWideChar(buffer, size + 1);
1858 PyMem_Free(buffer);
1859 if (result == NULL)
1860 return NULL;
1861 return Py_BuildValue("(Nn)", result, size);
1862}
1863
1864static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001865unicode_asucs4(PyObject *self, PyObject *args)
1866{
1867 PyObject *unicode, *result;
1868 Py_UCS4 *buffer;
1869 int copy_null;
1870 Py_ssize_t str_len, buf_len;
1871
1872 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1873 return NULL;
1874 }
1875
1876 buf_len = str_len + 1;
1877 buffer = PyMem_NEW(Py_UCS4, buf_len);
1878 if (buffer == NULL) {
1879 return PyErr_NoMemory();
1880 }
1881 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1882 buffer[str_len] = 0xffffU;
1883
1884 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1885 PyMem_FREE(buffer);
1886 return NULL;
1887 }
1888
1889 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1890 PyMem_FREE(buffer);
1891 return result;
1892}
1893
1894static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001895unicode_copycharacters(PyObject *self, PyObject *args)
1896{
1897 PyObject *from, *to, *to_copy;
1898 Py_ssize_t from_start, to_start, how_many, copied;
1899
1900 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1901 &from, &from_start, &how_many)) {
1902 return NULL;
1903 }
1904
1905 if (PyUnicode_READY(to) < 0) {
1906 return NULL;
1907 }
1908
1909 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1910 PyUnicode_MAX_CHAR_VALUE(to)))) {
1911 return NULL;
1912 }
1913 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
1914 Py_DECREF(to_copy);
1915 return NULL;
1916 }
1917
1918 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
1919 from_start, how_many)) < 0) {
1920 Py_DECREF(to_copy);
1921 return NULL;
1922 }
1923
1924 return Py_BuildValue("(Nn)", to_copy, copied);
1925}
1926
1927static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001928unicode_encodedecimal(PyObject *self, PyObject *args)
1929{
1930 Py_UNICODE *unicode;
1931 Py_ssize_t length;
1932 char *errors = NULL;
1933 PyObject *decimal;
1934 Py_ssize_t decimal_length, new_length;
1935 int res;
1936
1937 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1938 return NULL;
1939
1940 decimal_length = length * 7; /* len('&#8364;') */
1941 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1942 if (decimal == NULL)
1943 return NULL;
1944
1945 res = PyUnicode_EncodeDecimal(unicode, length,
1946 PyBytes_AS_STRING(decimal),
1947 errors);
1948 if (res < 0) {
1949 Py_DECREF(decimal);
1950 return NULL;
1951 }
1952
1953 new_length = strlen(PyBytes_AS_STRING(decimal));
1954 assert(new_length <= decimal_length);
1955 res = _PyBytes_Resize(&decimal, new_length);
1956 if (res < 0)
1957 return NULL;
1958
1959 return decimal;
1960}
1961
1962static PyObject *
1963unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1964{
1965 Py_UNICODE *unicode;
1966 Py_ssize_t length;
1967 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1968 return NULL;
1969 return PyUnicode_TransformDecimalToASCII(unicode, length);
1970}
1971
1972static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001973unicode_legacy_string(PyObject *self, PyObject *args)
1974{
1975 Py_UNICODE *data;
1976 Py_ssize_t len;
1977 PyObject *u;
1978
1979 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1980 return NULL;
1981
1982 u = PyUnicode_FromUnicode(NULL, len);
1983 if (u == NULL)
1984 return NULL;
1985
1986 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1987
1988 if (len > 0) { /* The empty string is always ready. */
1989 assert(!PyUnicode_IS_READY(u));
1990 }
1991
1992 return u;
1993}
1994
1995static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001996getargs_w_star(PyObject *self, PyObject *args)
1997{
1998 Py_buffer buffer;
1999 PyObject *result;
2000 char *str;
2001
2002 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2003 return NULL;
2004
2005 if (2 <= buffer.len) {
2006 str = buffer.buf;
2007 str[0] = '[';
2008 str[buffer.len-1] = ']';
2009 }
2010
2011 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2012 PyBuffer_Release(&buffer);
2013 return result;
2014}
2015
2016
2017static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00002018test_empty_argparse(PyObject *self)
2019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 /* Test that formats can begin with '|'. See issue #4720. */
2021 PyObject *tuple, *dict = NULL;
2022 static char *kwlist[] = {NULL};
2023 int result;
2024 tuple = PyTuple_New(0);
2025 if (!tuple)
2026 return NULL;
2027 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
2028 goto done;
2029 dict = PyDict_New();
2030 if (!dict)
2031 goto done;
2032 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002033 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 Py_DECREF(tuple);
2035 Py_XDECREF(dict);
2036 if (result < 0)
2037 return NULL;
2038 else {
2039 Py_RETURN_NONE;
2040 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002041}
2042
2043static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002044codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 const char *encoding, *errors = NULL;
2047 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2048 &encoding, &errors))
2049 return NULL;
2050 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002051}
2052
Thomas Wouters477c8d52006-05-27 19:21:47 +00002053static PyObject *
2054codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002055{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 const char *encoding, *errors = NULL;
2057 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2058 &encoding, &errors))
2059 return NULL;
2060 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002061}
2062
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002063
Tim Peters5b8132f2003-01-31 15:52:05 +00002064/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002065static PyObject *
2066test_long_numbits(PyObject *self)
2067{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 struct triple {
2069 long input;
2070 size_t nbits;
2071 int sign;
2072 } testcases[] = {{0, 0, 0},
2073 {1L, 1, 1},
2074 {-1L, 1, -1},
2075 {2L, 2, 1},
2076 {-2L, 2, -1},
2077 {3L, 2, 1},
2078 {-3L, 2, -1},
2079 {4L, 3, 1},
2080 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002081 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 {-0x7fffL, 15, -1},
2083 {0xffffL, 16, 1},
2084 {-0xffffL, 16, -1},
2085 {0xfffffffL, 28, 1},
2086 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002087 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002088
Victor Stinner63941882011-09-29 00:42:28 +02002089 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002090 size_t nbits;
2091 int sign;
2092 PyObject *plong;
2093
2094 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002095 if (plong == NULL)
2096 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002097 nbits = _PyLong_NumBits(plong);
2098 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 Py_DECREF(plong);
2101 if (nbits != testcases[i].nbits)
2102 return raiseTestError("test_long_numbits",
2103 "wrong result for _PyLong_NumBits");
2104 if (sign != testcases[i].sign)
2105 return raiseTestError("test_long_numbits",
2106 "wrong result for _PyLong_Sign");
2107 }
2108 Py_INCREF(Py_None);
2109 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002110}
2111
Thomas Heller519a0422007-11-15 20:48:54 +00002112/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002113
2114static PyObject *
2115test_null_strings(PyObject *self)
2116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2118 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2119 Py_XDECREF(o1);
2120 Py_XDECREF(o2);
2121 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002122}
2123
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002124static PyObject *
2125raise_exception(PyObject *self, PyObject *args)
2126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002127 PyObject *exc;
2128 PyObject *exc_args, *v;
2129 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2132 &exc, &num_args))
2133 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 exc_args = PyTuple_New(num_args);
2136 if (exc_args == NULL)
2137 return NULL;
2138 for (i = 0; i < num_args; ++i) {
2139 v = PyLong_FromLong(i);
2140 if (v == NULL) {
2141 Py_DECREF(exc_args);
2142 return NULL;
2143 }
2144 PyTuple_SET_ITEM(exc_args, i, v);
2145 }
2146 PyErr_SetObject(exc, exc_args);
2147 Py_DECREF(exc_args);
2148 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002149}
Tim Peters91621db2001-06-12 20:10:01 +00002150
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002151static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002152set_errno(PyObject *self, PyObject *args)
2153{
2154 int new_errno;
2155
2156 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2157 return NULL;
2158
2159 errno = new_errno;
2160 Py_RETURN_NONE;
2161}
2162
2163static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002164test_set_exc_info(PyObject *self, PyObject *args)
2165{
2166 PyObject *orig_exc;
2167 PyObject *new_type, *new_value, *new_tb;
2168 PyObject *type, *value, *tb;
2169 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2170 &new_type, &new_value, &new_tb))
2171 return NULL;
2172
2173 PyErr_GetExcInfo(&type, &value, &tb);
2174
2175 Py_INCREF(new_type);
2176 Py_INCREF(new_value);
2177 Py_INCREF(new_tb);
2178 PyErr_SetExcInfo(new_type, new_value, new_tb);
2179
2180 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2181 Py_XDECREF(type);
2182 Py_XDECREF(value);
2183 Py_XDECREF(tb);
2184 return orig_exc;
2185}
Benjamin Peterson16323982010-02-03 01:13:41 +00002186
2187static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002188
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002189static PyObject *
2190test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 if (PyDateTimeAPI) {
2192 if (test_run_counter) {
2193 /* Probably regrtest.py -R */
2194 Py_RETURN_NONE;
2195 }
2196 else {
2197 PyErr_SetString(PyExc_AssertionError,
2198 "PyDateTime_CAPI somehow initialized");
2199 return NULL;
2200 }
2201 }
2202 test_run_counter++;
2203 PyDateTime_IMPORT;
2204 if (PyDateTimeAPI)
2205 Py_RETURN_NONE;
2206 else
2207 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002208}
2209
Benjamin Peterson16323982010-02-03 01:13:41 +00002210
2211#ifdef WITH_THREAD
2212
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002213/* test_thread_state spawns a thread of its own, and that thread releases
2214 * `thread_done` when it's finished. The driver code has to know when the
2215 * thread finishes, because the thread uses a PyObject (the callable) that
2216 * may go away when the driver finishes. The former lack of this explicit
2217 * synchronization caused rare segfaults, so rare that they were seen only
2218 * on a Mac buildbot (although they were possible on any box).
2219 */
2220static PyThread_type_lock thread_done = NULL;
2221
Benjamin Petersona786b022008-08-25 21:05:21 +00002222static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002223_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002225 PyObject *rc;
2226 int success;
2227 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002228 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 success = (rc != NULL);
2230 Py_XDECREF(rc);
2231 PyGILState_Release(s);
2232 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002233}
2234
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002235/* Same thing, but releases `thread_done` when it returns. This variant
2236 * should be called only from threads spawned by test_thread_state().
2237 */
2238static void
2239_make_call_from_thread(void *callable)
2240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 _make_call(callable);
2242 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002243}
2244
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002245static PyObject *
2246test_thread_state(PyObject *self, PyObject *args)
2247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 PyObject *fn;
2249 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2252 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 if (!PyCallable_Check(fn)) {
2255 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2256 fn->ob_type->tp_name);
2257 return NULL;
2258 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 /* Ensure Python is set up for threading */
2261 PyEval_InitThreads();
2262 thread_done = PyThread_allocate_lock();
2263 if (thread_done == NULL)
2264 return PyErr_NoMemory();
2265 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 /* Start a new thread with our callback. */
2268 PyThread_start_new_thread(_make_call_from_thread, fn);
2269 /* Make the callback with the thread lock held by this thread */
2270 success &= _make_call(fn);
2271 /* Do it all again, but this time with the thread-lock released */
2272 Py_BEGIN_ALLOW_THREADS
2273 success &= _make_call(fn);
2274 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2275 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 /* And once more with and without a thread
2278 XXX - should use a lock and work out exactly what we are trying
2279 to test <wink>
2280 */
2281 Py_BEGIN_ALLOW_THREADS
2282 PyThread_start_new_thread(_make_call_from_thread, fn);
2283 success &= _make_call(fn);
2284 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2285 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287 /* Release lock we acquired above. This is required on HP-UX. */
2288 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 PyThread_free_lock(thread_done);
2291 if (!success)
2292 return NULL;
2293 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002294}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002295
2296/* test Py_AddPendingCalls using threads */
2297static int _pending_callback(void *arg)
2298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 /* we assume the argument is callable object to which we own a reference */
2300 PyObject *callable = (PyObject *)arg;
2301 PyObject *r = PyObject_CallObject(callable, NULL);
2302 Py_DECREF(callable);
2303 Py_XDECREF(r);
2304 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002305}
2306
2307/* The following requests n callbacks to _pending_callback. It can be
2308 * run from any python thread.
2309 */
2310PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
2311{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 PyObject *callable;
2313 int r;
2314 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2315 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317 /* create the reference for the callbackwhile we hold the lock */
2318 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 Py_BEGIN_ALLOW_THREADS
2321 r = Py_AddPendingCall(&_pending_callback, callable);
2322 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 if (r<0) {
2325 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
2326 Py_INCREF(Py_False);
2327 return Py_False;
2328 }
2329 Py_INCREF(Py_True);
2330 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002331}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002332#endif
2333
Neal Norwitzb0d26332007-08-25 00:49:05 +00002334/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002335static PyObject *
2336test_string_from_format(PyObject *self, PyObject *args)
2337{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 PyObject *result;
2339 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002340
Alexander Belopolskye239d232010-12-08 23:31:48 +00002341#define CHECK_1_FORMAT(FORMAT, TYPE) \
2342 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2343 if (result == NULL) \
2344 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002345 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002346 msg = FORMAT " failed at 1"; \
2347 goto Fail; \
2348 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 CHECK_1_FORMAT("%d", int);
2352 CHECK_1_FORMAT("%ld", long);
2353 /* The z width modifier was added in Python 2.5. */
2354 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 /* The u type code was added in Python 2.5. */
2357 CHECK_1_FORMAT("%u", unsigned int);
2358 CHECK_1_FORMAT("%lu", unsigned long);
2359 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002362 CHECK_1_FORMAT("%llu", unsigned long long);
2363 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002366
2367 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 Py_XDECREF(result);
2369 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002370
2371#undef CHECK_1_FORMAT
2372}
2373
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002374
2375static PyObject *
2376test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2378 int result;
2379 if (py_s == NULL)
2380 return NULL;
2381 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2382 Py_DECREF(py_s);
2383 if (!result) {
2384 PyErr_SetString(TestError, "Python string ending in NULL "
2385 "should not compare equal to c string.");
2386 return NULL;
2387 }
2388 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002389}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002390
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002391/* This is here to provide a docstring for test_descr. */
2392static PyObject *
2393test_with_docstring(PyObject *self)
2394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002396}
2397
Mark Dickinson725bfd82009-05-03 20:33:40 +00002398/* Test PyOS_string_to_double. */
2399static PyObject *
2400test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 double result;
2402 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404#define CHECK_STRING(STR, expected) \
2405 result = PyOS_string_to_double(STR, NULL, NULL); \
2406 if (result == -1.0 && PyErr_Occurred()) \
2407 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002408 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 msg = "conversion of " STR " to float failed"; \
2410 goto fail; \
2411 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413#define CHECK_INVALID(STR) \
2414 result = PyOS_string_to_double(STR, NULL, NULL); \
2415 if (result == -1.0 && PyErr_Occurred()) { \
2416 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2417 PyErr_Clear(); \
2418 else \
2419 return NULL; \
2420 } \
2421 else { \
2422 msg = "conversion of " STR " didn't raise ValueError"; \
2423 goto fail; \
2424 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 CHECK_STRING("0.1", 0.1);
2427 CHECK_STRING("1.234", 1.234);
2428 CHECK_STRING("-1.35", -1.35);
2429 CHECK_STRING(".1e01", 1.0);
2430 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 CHECK_INVALID(" 0.1");
2433 CHECK_INVALID("\t\n-3");
2434 CHECK_INVALID(".123 ");
2435 CHECK_INVALID("3\n");
2436 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002439 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002441#undef CHECK_STRING
2442#undef CHECK_INVALID
2443}
2444
2445
Benjamin Petersonb173f782009-05-05 22:31:58 +00002446/* Coverage testing of capsule objects. */
2447
2448static const char *capsule_name = "capsule name";
2449static char *capsule_pointer = "capsule pointer";
2450static char *capsule_context = "capsule context";
2451static const char *capsule_error = NULL;
2452static int
2453capsule_destructor_call_count = 0;
2454
2455static void
2456capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 capsule_destructor_call_count++;
2458 if (PyCapsule_GetContext(o) != capsule_context) {
2459 capsule_error = "context did not match in destructor!";
2460 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2461 capsule_error = "destructor did not match in destructor! (woah!)";
2462 } else if (PyCapsule_GetName(o) != capsule_name) {
2463 capsule_error = "name did not match in destructor!";
2464 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2465 capsule_error = "pointer did not match in destructor!";
2466 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002467}
2468
2469typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 char *name;
2471 char *module;
2472 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002473} known_capsule;
2474
2475static PyObject *
2476test_capsule(PyObject *self, PyObject *args)
2477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 PyObject *object;
2479 const char *error = NULL;
2480 void *pointer;
2481 void *pointer2;
2482 known_capsule known_capsules[] = {
2483 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2484 KNOWN_CAPSULE("_socket", "CAPI"),
2485 KNOWN_CAPSULE("_curses", "_C_API"),
2486 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2487 { NULL, NULL },
2488 };
2489 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002490
2491#define FAIL(x) { error = (x); goto exit; }
2492
2493#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 if (capsule_error) { \
2495 FAIL(capsule_error); \
2496 } \
2497 else if (!capsule_destructor_call_count) { \
2498 FAIL("destructor not called!"); \
2499 } \
2500 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2503 PyCapsule_SetContext(object, capsule_context);
2504 capsule_destructor(object);
2505 CHECK_DESTRUCTOR;
2506 Py_DECREF(object);
2507 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 object = PyCapsule_New(known, "ignored", NULL);
2510 PyCapsule_SetPointer(object, capsule_pointer);
2511 PyCapsule_SetName(object, capsule_name);
2512 PyCapsule_SetDestructor(object, capsule_destructor);
2513 PyCapsule_SetContext(object, capsule_context);
2514 capsule_destructor(object);
2515 CHECK_DESTRUCTOR;
2516 /* intentionally access using the wrong name */
2517 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2518 if (!PyErr_Occurred()) {
2519 FAIL("PyCapsule_GetPointer should have failed but did not!");
2520 }
2521 PyErr_Clear();
2522 if (pointer2) {
2523 if (pointer2 == capsule_pointer) {
2524 FAIL("PyCapsule_GetPointer should not have"
2525 " returned the internal pointer!");
2526 } else {
2527 FAIL("PyCapsule_GetPointer should have "
2528 "returned NULL pointer but did not!");
2529 }
2530 }
2531 PyCapsule_SetDestructor(object, NULL);
2532 Py_DECREF(object);
2533 if (capsule_destructor_call_count) {
2534 FAIL("destructor called when it should not have been!");
2535 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 for (known = &known_capsules[0]; known->module != NULL; known++) {
2538 /* yeah, ordinarily I wouldn't do this either,
2539 but it's fine for this test harness.
2540 */
2541 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002542#undef FAIL
2543#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 { \
2545 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2546 x, known->module, known->attribute); \
2547 error = buffer; \
2548 goto exit; \
2549 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 PyObject *module = PyImport_ImportModule(known->module);
2552 if (module) {
2553 pointer = PyCapsule_Import(known->name, 0);
2554 if (!pointer) {
2555 Py_DECREF(module);
2556 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2557 }
2558 object = PyObject_GetAttrString(module, known->attribute);
2559 if (!object) {
2560 Py_DECREF(module);
2561 return NULL;
2562 }
2563 pointer2 = PyCapsule_GetPointer(object,
2564 "weebles wobble but they don't fall down");
2565 if (!PyErr_Occurred()) {
2566 Py_DECREF(object);
2567 Py_DECREF(module);
2568 FAIL("PyCapsule_GetPointer should have failed but did not!");
2569 }
2570 PyErr_Clear();
2571 if (pointer2) {
2572 Py_DECREF(module);
2573 Py_DECREF(object);
2574 if (pointer2 == pointer) {
2575 FAIL("PyCapsule_GetPointer should not have"
2576 " returned its internal pointer!");
2577 } else {
2578 FAIL("PyCapsule_GetPointer should have"
2579 " returned NULL pointer but did not!");
2580 }
2581 }
2582 Py_DECREF(object);
2583 Py_DECREF(module);
2584 }
2585 else
2586 PyErr_Clear();
2587 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002588
2589 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 if (error) {
2591 return raiseTestError("test_capsule", error);
2592 }
2593 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002594#undef FAIL
2595}
2596
Guido van Rossumddefaf32007-01-14 03:31:43 +00002597#ifdef HAVE_GETTIMEOFDAY
2598/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002599static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002600{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002601 e->tv_sec -= s->tv_sec;
2602 e->tv_usec -= s->tv_usec;
2603 if (e->tv_usec < 0) {
2604 e->tv_sec -=1;
2605 e->tv_usec += 1000000;
2606 }
2607 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002608}
2609
2610static PyObject *
2611profile_int(PyObject *self, PyObject* args)
2612{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002613 int i, k;
2614 struct timeval start, stop;
2615 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 /* Test 1: Allocate and immediately deallocate
2618 many small integers */
2619 gettimeofday(&start, NULL);
2620 for(k=0; k < 20000; k++)
2621 for(i=0; i < 1000; i++) {
2622 single = PyLong_FromLong(i);
2623 Py_DECREF(single);
2624 }
2625 gettimeofday(&stop, NULL);
2626 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 /* Test 2: Allocate and immediately deallocate
2629 many large integers */
2630 gettimeofday(&start, NULL);
2631 for(k=0; k < 20000; k++)
2632 for(i=0; i < 1000; i++) {
2633 single = PyLong_FromLong(i+1000000);
2634 Py_DECREF(single);
2635 }
2636 gettimeofday(&stop, NULL);
2637 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 /* Test 3: Allocate a few integers, then release
2640 them all simultaneously. */
2641 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002642 if (multiple == NULL)
2643 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 gettimeofday(&start, NULL);
2645 for(k=0; k < 20000; k++) {
2646 for(i=0; i < 1000; i++) {
2647 multiple[i] = PyLong_FromLong(i+1000000);
2648 }
2649 for(i=0; i < 1000; i++) {
2650 Py_DECREF(multiple[i]);
2651 }
2652 }
2653 gettimeofday(&stop, NULL);
2654 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002655 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 /* Test 4: Allocate many integers, then release
2658 them all simultaneously. */
2659 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002660 if (multiple == NULL)
2661 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 gettimeofday(&start, NULL);
2663 for(k=0; k < 20; k++) {
2664 for(i=0; i < 1000000; i++) {
2665 multiple[i] = PyLong_FromLong(i+1000000);
2666 }
2667 for(i=0; i < 1000000; i++) {
2668 Py_DECREF(multiple[i]);
2669 }
2670 }
2671 gettimeofday(&stop, NULL);
2672 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002673 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 /* Test 5: Allocate many integers < 32000 */
2676 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002677 if (multiple == NULL)
2678 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002679 gettimeofday(&start, NULL);
2680 for(k=0; k < 10; k++) {
2681 for(i=0; i < 1000000; i++) {
2682 multiple[i] = PyLong_FromLong(i+1000);
2683 }
2684 for(i=0; i < 1000000; i++) {
2685 Py_DECREF(multiple[i]);
2686 }
2687 }
2688 gettimeofday(&stop, NULL);
2689 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002690 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692 /* Test 6: Perform small int addition */
2693 op1 = PyLong_FromLong(1);
2694 gettimeofday(&start, NULL);
2695 for(i=0; i < 10000000; i++) {
2696 result = PyNumber_Add(op1, op1);
2697 Py_DECREF(result);
2698 }
2699 gettimeofday(&stop, NULL);
2700 Py_DECREF(op1);
2701 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 /* Test 7: Perform medium int addition */
2704 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002705 if (op1 == NULL)
2706 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 gettimeofday(&start, NULL);
2708 for(i=0; i < 10000000; i++) {
2709 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002710 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002711 }
2712 gettimeofday(&stop, NULL);
2713 Py_DECREF(op1);
2714 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 Py_INCREF(Py_None);
2717 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002718}
2719#endif
2720
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002721/* To test the format of tracebacks as printed out. */
2722static PyObject *
2723traceback_print(PyObject *self, PyObject *args)
2724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 PyObject *file;
2726 PyObject *traceback;
2727 int result;
2728
2729 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2730 &traceback, &file))
2731 return NULL;
2732
2733 result = PyTraceBack_Print(traceback, file);
2734 if (result < 0)
2735 return NULL;
2736 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002737}
2738
Benjamin Petersone6528212008-07-15 15:32:09 +00002739/* To test the format of exceptions as printed out. */
2740static PyObject *
2741exception_print(PyObject *self, PyObject *args)
2742{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 PyObject *value;
2744 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 if (!PyArg_ParseTuple(args, "O:exception_print",
2747 &value))
2748 return NULL;
2749 if (!PyExceptionInstance_Check(value)) {
2750 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2751 return NULL;
2752 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 tb = PyException_GetTraceback(value);
2755 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2756 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002759}
2760
2761
2762
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002763
2764/* reliably raise a MemoryError */
2765static PyObject *
2766raise_memoryerror(PyObject *self)
2767{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 PyErr_NoMemory();
2769 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002770}
2771
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002772/* Issue 6012 */
2773static PyObject *str1, *str2;
2774static int
2775failing_converter(PyObject *obj, void *arg)
2776{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 /* Clone str1, then let the conversion fail. */
2778 assert(str1);
2779 str2 = str1;
2780 Py_INCREF(str2);
2781 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002782}
2783static PyObject*
2784argparsing(PyObject *o, PyObject *args)
2785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 PyObject *res;
2787 str1 = str2 = NULL;
2788 if (!PyArg_ParseTuple(args, "O&O&",
2789 PyUnicode_FSConverter, &str1,
2790 failing_converter, &str2)) {
2791 if (!str2)
2792 /* argument converter not called? */
2793 return NULL;
2794 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002795 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 Py_DECREF(str2);
2797 PyErr_Clear();
2798 return res;
2799 }
2800 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002801}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002802
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002803/* To test that the result of PyCode_NewEmpty has the right members. */
2804static PyObject *
2805code_newempty(PyObject *self, PyObject *args)
2806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 const char *filename;
2808 const char *funcname;
2809 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2812 &filename, &funcname, &firstlineno))
2813 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002815 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002816}
2817
Georg Brandl1e28a272009-12-28 08:41:01 +00002818/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2819 Run via Lib/test/test_exceptions.py */
2820static PyObject *
2821make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2822{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 const char *name;
2824 const char *doc = NULL;
2825 PyObject *base = NULL;
2826 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2831 "s|sOO:make_exception_with_doc", kwlist,
2832 &name, &doc, &base, &dict))
2833 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002836}
2837
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002838static PyObject *
2839make_memoryview_from_NULL_pointer(PyObject *self)
2840{
2841 Py_buffer info;
2842 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2843 return NULL;
2844 return PyMemoryView_FromBuffer(&info);
2845}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002846
Stefan Krah7213fcc2015-02-01 16:19:23 +01002847static PyObject *
2848test_from_contiguous(PyObject* self, PyObject *noargs)
2849{
2850 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2851 int init[5] = {0, 1, 2, 3, 4};
2852 Py_ssize_t itemsize = sizeof(int);
2853 Py_ssize_t shape = 5;
2854 Py_ssize_t strides = 2 * itemsize;
2855 Py_buffer view = {
2856 data,
2857 NULL,
2858 5 * itemsize,
2859 itemsize,
2860 1,
2861 1,
2862 NULL,
2863 &shape,
2864 &strides,
2865 NULL,
2866 NULL
2867 };
2868 int *ptr;
2869 int i;
2870
2871 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2872 ptr = view.buf;
2873 for (i = 0; i < 5; i++) {
2874 if (ptr[2*i] != i) {
2875 PyErr_SetString(TestError,
2876 "test_from_contiguous: incorrect result");
2877 return NULL;
2878 }
2879 }
2880
2881 view.buf = &data[8];
2882 view.strides[0] = -2 * itemsize;
2883
2884 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2885 ptr = view.buf;
2886 for (i = 0; i < 5; i++) {
2887 if (*(ptr-2*i) != i) {
2888 PyErr_SetString(TestError,
2889 "test_from_contiguous: incorrect result");
2890 return NULL;
2891 }
2892 }
2893
2894 Py_RETURN_NONE;
2895}
Stefan Krah650c1e82015-02-03 21:43:23 +01002896
Stefan Kraha7559c02015-02-03 22:27:21 +01002897#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01002898extern PyTypeObject _PyBytesIOBuffer_Type;
2899
Stefan Krah5178d912015-02-03 16:57:21 +01002900static PyObject *
2901test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
2902{
Stefan Krah650c1e82015-02-03 21:43:23 +01002903 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01002904 PyObject *b;
2905 char *dummy[1];
2906 int ret, match;
2907
Stefan Krah650c1e82015-02-03 21:43:23 +01002908 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01002909 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
2910 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2911 PyErr_Clear();
2912 if (ret != -1 || match == 0)
2913 goto error;
2914
Stefan Krah650c1e82015-02-03 21:43:23 +01002915 /* bytesiobuf_getbuffer() */
2916 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01002917 if (b == NULL) {
2918 return NULL;
2919 }
2920
2921 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
2922 Py_DECREF(b);
2923 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2924 PyErr_Clear();
2925 if (ret != -1 || match == 0)
2926 goto error;
2927
2928 Py_RETURN_NONE;
2929
2930error:
2931 PyErr_SetString(TestError,
2932 "test_pep3118_obsolete_write_locks: failure");
2933 return NULL;
2934}
Stefan Kraha7559c02015-02-03 22:27:21 +01002935#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002936
Stefan Krah650c1e82015-02-03 21:43:23 +01002937/* This tests functions that historically supported write locks. It is
2938 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
2939 is entitled to segfault in that case. */
2940static PyObject *
2941getbuffer_with_null_view(PyObject* self, PyObject *obj)
2942{
2943 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
2944 return NULL;
2945
2946 Py_RETURN_NONE;
2947}
2948
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002949/* Test that the fatal error from not having a current thread doesn't
2950 cause an infinite loop. Run via Lib/test/test_capi.py */
2951static PyObject *
2952crash_no_current_thread(PyObject *self)
2953{
2954 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002955 /* Using PyThreadState_Get() directly allows the test to pass in
2956 !pydebug mode. However, the test only actually tests anything
2957 in pydebug mode, since that's where the infinite loop was in
2958 the first place. */
2959 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002960 Py_END_ALLOW_THREADS
2961 return NULL;
2962}
2963
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002964/* To run some code in a sub-interpreter. */
2965static PyObject *
2966run_in_subinterp(PyObject *self, PyObject *args)
2967{
2968 const char *code;
2969 int r;
2970 PyThreadState *substate, *mainstate;
2971
2972 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2973 &code))
2974 return NULL;
2975
2976 mainstate = PyThreadState_Get();
2977
2978 PyThreadState_Swap(NULL);
2979
2980 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002981 if (substate == NULL) {
2982 /* Since no new thread state was created, there is no exception to
2983 propagate; raise a fresh one after swapping in the old thread
2984 state. */
2985 PyThreadState_Swap(mainstate);
2986 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2987 return NULL;
2988 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002989 r = PyRun_SimpleString(code);
2990 Py_EndInterpreter(substate);
2991
2992 PyThreadState_Swap(mainstate);
2993
2994 return PyLong_FromLong(r);
2995}
2996
Victor Stinner3c1b3792014-02-17 00:02:43 +01002997static int
2998check_time_rounding(int round)
2999{
Victor Stinner74474232015-09-02 01:43:56 +02003000 if (round != _PyTime_ROUND_FLOOR
3001 && round != _PyTime_ROUND_CEILING
Victor Stinner7667f582015-09-09 01:02:23 +02003002 && round != _PyTime_ROUND_HALF_EVEN) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003003 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3004 return -1;
3005 }
3006 return 0;
3007}
3008
Victor Stinner5d272cc2012-03-13 13:35:55 +01003009static PyObject *
3010test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3011{
3012 PyObject *obj;
3013 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003014 int round;
3015 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003016 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003017 if (check_time_rounding(round) < 0)
3018 return NULL;
3019 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003020 return NULL;
3021 return _PyLong_FromTime_t(sec);
3022}
3023
3024static PyObject *
3025test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3026{
3027 PyObject *obj;
3028 time_t sec;
3029 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003030 int round;
3031 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003032 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003033 if (check_time_rounding(round) < 0)
3034 return NULL;
3035 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003036 return NULL;
3037 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3038}
3039
Victor Stinner643cd682012-03-02 22:54:03 +01003040static PyObject *
3041test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3042{
3043 PyObject *obj;
3044 time_t sec;
3045 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003046 int round;
3047 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003048 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003049 if (check_time_rounding(round) < 0)
3050 return NULL;
3051 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003052 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003053 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003054}
3055
Antoine Pitrou796564c2013-07-30 19:59:21 +02003056static void
3057slot_tp_del(PyObject *self)
3058{
3059 _Py_IDENTIFIER(__tp_del__);
3060 PyObject *del, *res;
3061 PyObject *error_type, *error_value, *error_traceback;
3062
3063 /* Temporarily resurrect the object. */
3064 assert(self->ob_refcnt == 0);
3065 self->ob_refcnt = 1;
3066
3067 /* Save the current exception, if any. */
3068 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3069
3070 /* Execute __del__ method, if any. */
3071 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3072 if (del != NULL) {
3073 res = PyEval_CallObject(del, NULL);
3074 if (res == NULL)
3075 PyErr_WriteUnraisable(del);
3076 else
3077 Py_DECREF(res);
3078 Py_DECREF(del);
3079 }
3080
3081 /* Restore the saved exception. */
3082 PyErr_Restore(error_type, error_value, error_traceback);
3083
3084 /* Undo the temporary resurrection; can't use DECREF here, it would
3085 * cause a recursive call.
3086 */
3087 assert(self->ob_refcnt > 0);
3088 if (--self->ob_refcnt == 0)
3089 return; /* this is the normal path out */
3090
3091 /* __del__ resurrected it! Make it look like the original Py_DECREF
3092 * never happened.
3093 */
3094 {
3095 Py_ssize_t refcnt = self->ob_refcnt;
3096 _Py_NewReference(self);
3097 self->ob_refcnt = refcnt;
3098 }
3099 assert(!PyType_IS_GC(Py_TYPE(self)) ||
3100 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
3101 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3102 * we need to undo that. */
3103 _Py_DEC_REFTOTAL;
3104 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3105 * chain, so no more to do there.
3106 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3107 * _Py_NewReference bumped tp_allocs: both of those need to be
3108 * undone.
3109 */
3110#ifdef COUNT_ALLOCS
3111 --Py_TYPE(self)->tp_frees;
3112 --Py_TYPE(self)->tp_allocs;
3113#endif
3114}
3115
3116static PyObject *
3117with_tp_del(PyObject *self, PyObject *args)
3118{
3119 PyObject *obj;
3120 PyTypeObject *tp;
3121
3122 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3123 return NULL;
3124 tp = (PyTypeObject *) obj;
3125 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3126 PyErr_Format(PyExc_TypeError,
3127 "heap type expected, got %R", obj);
3128 return NULL;
3129 }
3130 tp->tp_del = slot_tp_del;
3131 Py_INCREF(obj);
3132 return obj;
3133}
3134
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003135static PyMethodDef ml;
3136
3137static PyObject *
3138create_cfunction(PyObject *self, PyObject *args)
3139{
3140 return PyCFunction_NewEx(&ml, self, NULL);
3141}
3142
3143static PyMethodDef ml = {
3144 "create_cfunction",
3145 create_cfunction,
3146 METH_NOARGS,
3147 NULL
3148};
3149
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003150static PyObject *
3151_test_incref(PyObject *ob)
3152{
3153 Py_INCREF(ob);
3154 return ob;
3155}
3156
3157static PyObject *
3158test_xincref_doesnt_leak(PyObject *ob)
3159{
3160 PyObject *obj = PyLong_FromLong(0);
3161 Py_XINCREF(_test_incref(obj));
3162 Py_DECREF(obj);
3163 Py_DECREF(obj);
3164 Py_DECREF(obj);
3165 Py_RETURN_NONE;
3166}
3167
3168static PyObject *
3169test_incref_doesnt_leak(PyObject *ob)
3170{
3171 PyObject *obj = PyLong_FromLong(0);
3172 Py_INCREF(_test_incref(obj));
3173 Py_DECREF(obj);
3174 Py_DECREF(obj);
3175 Py_DECREF(obj);
3176 Py_RETURN_NONE;
3177}
3178
3179static PyObject *
3180test_xdecref_doesnt_leak(PyObject *ob)
3181{
3182 Py_XDECREF(PyLong_FromLong(0));
3183 Py_RETURN_NONE;
3184}
3185
3186static PyObject *
3187test_decref_doesnt_leak(PyObject *ob)
3188{
3189 Py_DECREF(PyLong_FromLong(0));
3190 Py_RETURN_NONE;
3191}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003192
Victor Stinner0507bf52013-07-07 02:05:46 +02003193static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02003194test_incref_decref_API(PyObject *ob)
3195{
3196 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003197 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003198 Py_DecRef(obj);
3199 Py_DecRef(obj);
3200 Py_RETURN_NONE;
3201}
3202
3203static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02003204test_pymem_alloc0(PyObject *self)
3205{
3206 void *ptr;
3207
Victor Stinnerdb067af2014-05-02 22:31:14 +02003208 ptr = PyMem_RawMalloc(0);
3209 if (ptr == NULL) {
3210 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3211 return NULL;
3212 }
3213 PyMem_RawFree(ptr);
3214
3215 ptr = PyMem_RawCalloc(0, 0);
3216 if (ptr == NULL) {
3217 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3218 return NULL;
3219 }
3220 PyMem_RawFree(ptr);
3221
Victor Stinner0507bf52013-07-07 02:05:46 +02003222 ptr = PyMem_Malloc(0);
3223 if (ptr == NULL) {
3224 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3225 return NULL;
3226 }
3227 PyMem_Free(ptr);
3228
Victor Stinnerdb067af2014-05-02 22:31:14 +02003229 ptr = PyMem_Calloc(0, 0);
3230 if (ptr == NULL) {
3231 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3232 return NULL;
3233 }
3234 PyMem_Free(ptr);
3235
Victor Stinner0507bf52013-07-07 02:05:46 +02003236 ptr = PyObject_Malloc(0);
3237 if (ptr == NULL) {
3238 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3239 return NULL;
3240 }
3241 PyObject_Free(ptr);
3242
Victor Stinnerdb067af2014-05-02 22:31:14 +02003243 ptr = PyObject_Calloc(0, 0);
3244 if (ptr == NULL) {
3245 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3246 return NULL;
3247 }
3248 PyObject_Free(ptr);
3249
Victor Stinner0507bf52013-07-07 02:05:46 +02003250 Py_RETURN_NONE;
3251}
3252
3253typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003254 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003255
3256 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003257 size_t calloc_nelem;
3258 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003259 void *realloc_ptr;
3260 size_t realloc_new_size;
3261 void *free_ptr;
3262} alloc_hook_t;
3263
3264static void* hook_malloc (void* ctx, size_t size)
3265{
3266 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3267 hook->malloc_size = size;
3268 return hook->alloc.malloc(hook->alloc.ctx, size);
3269}
3270
Victor Stinnerdb067af2014-05-02 22:31:14 +02003271static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
3272{
3273 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3274 hook->calloc_nelem = nelem;
3275 hook->calloc_elsize = elsize;
3276 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3277}
3278
Victor Stinner0507bf52013-07-07 02:05:46 +02003279static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
3280{
3281 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3282 hook->realloc_ptr = ptr;
3283 hook->realloc_new_size = new_size;
3284 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3285}
3286
3287static void hook_free (void *ctx, void *ptr)
3288{
3289 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3290 hook->free_ptr = ptr;
3291 hook->alloc.free(hook->alloc.ctx, ptr);
3292}
3293
3294static PyObject *
3295test_setallocators(PyMemAllocatorDomain domain)
3296{
3297 PyObject *res = NULL;
3298 const char *error_msg;
3299 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003300 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003301 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003302 void *ptr, *ptr2;
3303
Victor Stinnerdb067af2014-05-02 22:31:14 +02003304 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003305
3306 alloc.ctx = &hook;
3307 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003308 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003309 alloc.realloc = &hook_realloc;
3310 alloc.free = &hook_free;
3311 PyMem_GetAllocator(domain, &hook.alloc);
3312 PyMem_SetAllocator(domain, &alloc);
3313
3314 size = 42;
3315 switch(domain)
3316 {
3317 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3318 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3319 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3320 default: ptr = NULL; break;
3321 }
3322
3323 if (ptr == NULL) {
3324 error_msg = "malloc failed";
3325 goto fail;
3326 }
3327
3328 if (hook.malloc_size != size) {
3329 error_msg = "malloc invalid size";
3330 goto fail;
3331 }
3332
3333 size2 = 200;
3334 switch(domain)
3335 {
3336 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3337 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3338 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003339 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003340 }
3341
3342 if (ptr2 == NULL) {
3343 error_msg = "realloc failed";
3344 goto fail;
3345 }
3346
3347 if (hook.realloc_ptr != ptr
3348 || hook.realloc_new_size != size2) {
3349 error_msg = "realloc invalid parameters";
3350 goto fail;
3351 }
3352
3353 switch(domain)
3354 {
3355 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3356 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3357 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3358 }
3359
3360 if (hook.free_ptr != ptr2) {
3361 error_msg = "free invalid pointer";
3362 goto fail;
3363 }
3364
Victor Stinnerdb067af2014-05-02 22:31:14 +02003365 nelem = 2;
3366 elsize = 5;
3367 switch(domain)
3368 {
3369 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3370 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3371 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3372 default: ptr = NULL; break;
3373 }
3374
3375 if (ptr == NULL) {
3376 error_msg = "calloc failed";
3377 goto fail;
3378 }
3379
3380 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3381 error_msg = "calloc invalid nelem or elsize";
3382 goto fail;
3383 }
3384
3385 switch(domain)
3386 {
3387 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3388 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3389 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3390 }
3391
Victor Stinner0507bf52013-07-07 02:05:46 +02003392 Py_INCREF(Py_None);
3393 res = Py_None;
3394 goto finally;
3395
3396fail:
3397 PyErr_SetString(PyExc_RuntimeError, error_msg);
3398
3399finally:
3400 PyMem_SetAllocator(domain, &hook.alloc);
3401 return res;
3402}
3403
3404static PyObject *
3405test_pymem_setrawallocators(PyObject *self)
3406{
3407 return test_setallocators(PYMEM_DOMAIN_RAW);
3408}
3409
3410static PyObject *
3411test_pymem_setallocators(PyObject *self)
3412{
3413 return test_setallocators(PYMEM_DOMAIN_MEM);
3414}
3415
3416static PyObject *
3417test_pyobject_setallocators(PyObject *self)
3418{
3419 return test_setallocators(PYMEM_DOMAIN_OBJ);
3420}
3421
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003422PyDoc_STRVAR(docstring_empty,
3423""
3424);
3425
3426PyDoc_STRVAR(docstring_no_signature,
3427"This docstring has no signature."
3428);
3429
3430PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003431"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003432"\n"
3433"This docstring has an invalid signature."
3434);
3435
Larry Hastings2623c8c2014-02-08 22:15:29 -08003436PyDoc_STRVAR(docstring_with_invalid_signature2,
3437"docstring_with_invalid_signature2($module, /, boo)\n"
3438"\n"
3439"--\n"
3440"\n"
3441"This docstring also has an invalid signature."
3442);
3443
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003444PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003445"docstring_with_signature($module, /, sig)\n"
3446"--\n"
3447"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003448"This docstring has a valid signature."
3449);
3450
Zachary Ware8ef887c2015-04-13 18:22:35 -05003451PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3452"docstring_with_signature_but_no_doc($module, /, sig)\n"
3453"--\n"
3454"\n"
3455);
3456
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003457PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003458"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3459"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003460"\n"
3461"\n"
3462"This docstring has a valid signature and some extra newlines."
3463);
3464
Larry Hastings16c51912014-01-07 11:53:01 -08003465PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003466"docstring_with_signature_with_defaults(module, s='avocado',\n"
3467" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3468" local=the_number_three, sys=sys.maxsize,\n"
3469" exp=sys.maxsize - 1)\n"
3470"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003471"\n"
3472"\n"
3473"\n"
3474"This docstring has a valid signature with parameters,\n"
3475"and the parameters take defaults of varying types."
3476);
3477
Victor Stinner258e4d32013-12-13 02:30:12 +01003478#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003479typedef struct {
3480 PyThread_type_lock start_event;
3481 PyThread_type_lock exit_event;
3482 PyObject *callback;
3483} test_c_thread_t;
3484
3485static void
3486temporary_c_thread(void *data)
3487{
3488 test_c_thread_t *test_c_thread = data;
3489 PyGILState_STATE state;
3490 PyObject *res;
3491
3492 PyThread_release_lock(test_c_thread->start_event);
3493
3494 /* Allocate a Python thread state for this thread */
3495 state = PyGILState_Ensure();
3496
Victor Stinner3466bde2016-09-05 18:16:01 -07003497 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003498 Py_CLEAR(test_c_thread->callback);
3499
3500 if (res == NULL) {
3501 PyErr_Print();
3502 }
3503 else {
3504 Py_DECREF(res);
3505 }
3506
3507 /* Destroy the Python thread state for this thread */
3508 PyGILState_Release(state);
3509
3510 PyThread_release_lock(test_c_thread->exit_event);
3511
3512 PyThread_exit_thread();
3513}
3514
3515static PyObject *
3516call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3517{
3518 PyObject *res = NULL;
3519 test_c_thread_t test_c_thread;
3520 long thread;
3521
3522 PyEval_InitThreads();
3523
3524 test_c_thread.start_event = PyThread_allocate_lock();
3525 test_c_thread.exit_event = PyThread_allocate_lock();
3526 test_c_thread.callback = NULL;
3527 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3528 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3529 goto exit;
3530 }
3531
3532 Py_INCREF(callback);
3533 test_c_thread.callback = callback;
3534
3535 PyThread_acquire_lock(test_c_thread.start_event, 1);
3536 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3537
3538 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3539 if (thread == -1) {
3540 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3541 PyThread_release_lock(test_c_thread.start_event);
3542 PyThread_release_lock(test_c_thread.exit_event);
3543 goto exit;
3544 }
3545
3546 PyThread_acquire_lock(test_c_thread.start_event, 1);
3547 PyThread_release_lock(test_c_thread.start_event);
3548
3549 Py_BEGIN_ALLOW_THREADS
3550 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3551 PyThread_release_lock(test_c_thread.exit_event);
3552 Py_END_ALLOW_THREADS
3553
3554 Py_INCREF(Py_None);
3555 res = Py_None;
3556
3557exit:
3558 Py_CLEAR(test_c_thread.callback);
3559 if (test_c_thread.start_event)
3560 PyThread_free_lock(test_c_thread.start_event);
3561 if (test_c_thread.exit_event)
3562 PyThread_free_lock(test_c_thread.exit_event);
3563 return res;
3564}
Victor Stinner258e4d32013-12-13 02:30:12 +01003565#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003566
Victor Stinner56e8c292014-07-21 12:30:22 +02003567static PyObject*
3568test_raise_signal(PyObject* self, PyObject *args)
3569{
3570 int signum, err;
3571
3572 if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0)
3573 return NULL;
3574
3575 err = raise(signum);
3576 if (err)
3577 return PyErr_SetFromErrno(PyExc_OSError);
3578
3579 if (PyErr_CheckSignals() < 0)
3580 return NULL;
3581
3582 Py_RETURN_NONE;
3583}
3584
Serhiy Storchakab5181342015-02-06 08:58:56 +02003585/* marshal */
3586
3587static PyObject*
3588pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3589{
3590 long value;
3591 char *filename;
3592 int version;
3593 FILE *fp;
3594
3595 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3596 &value, &filename, &version))
3597 return NULL;
3598
3599 fp = fopen(filename, "wb");
3600 if (fp == NULL) {
3601 PyErr_SetFromErrno(PyExc_OSError);
3602 return NULL;
3603 }
3604
3605 PyMarshal_WriteLongToFile(value, fp, version);
3606
3607 fclose(fp);
3608 if (PyErr_Occurred())
3609 return NULL;
3610 Py_RETURN_NONE;
3611}
3612
3613static PyObject*
3614pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3615{
3616 PyObject *obj;
3617 char *filename;
3618 int version;
3619 FILE *fp;
3620
3621 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3622 &obj, &filename, &version))
3623 return NULL;
3624
3625 fp = fopen(filename, "wb");
3626 if (fp == NULL) {
3627 PyErr_SetFromErrno(PyExc_OSError);
3628 return NULL;
3629 }
3630
3631 PyMarshal_WriteObjectToFile(obj, fp, version);
3632
3633 fclose(fp);
3634 if (PyErr_Occurred())
3635 return NULL;
3636 Py_RETURN_NONE;
3637}
3638
3639static PyObject*
3640pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3641{
3642 int value;
3643 long pos;
3644 char *filename;
3645 FILE *fp;
3646
3647 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3648 return NULL;
3649
3650 fp = fopen(filename, "rb");
3651 if (fp == NULL) {
3652 PyErr_SetFromErrno(PyExc_OSError);
3653 return NULL;
3654 }
3655
3656 value = PyMarshal_ReadShortFromFile(fp);
3657 pos = ftell(fp);
3658
3659 fclose(fp);
3660 if (PyErr_Occurred())
3661 return NULL;
3662 return Py_BuildValue("il", value, pos);
3663}
3664
3665static PyObject*
3666pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3667{
3668 long value, pos;
3669 char *filename;
3670 FILE *fp;
3671
3672 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3673 return NULL;
3674
3675 fp = fopen(filename, "rb");
3676 if (fp == NULL) {
3677 PyErr_SetFromErrno(PyExc_OSError);
3678 return NULL;
3679 }
3680
3681 value = PyMarshal_ReadLongFromFile(fp);
3682 pos = ftell(fp);
3683
3684 fclose(fp);
3685 if (PyErr_Occurred())
3686 return NULL;
3687 return Py_BuildValue("ll", value, pos);
3688}
3689
3690static PyObject*
3691pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3692{
3693 PyObject *obj;
3694 long pos;
3695 char *filename;
3696 FILE *fp;
3697
3698 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3699 return NULL;
3700
3701 fp = fopen(filename, "rb");
3702 if (fp == NULL) {
3703 PyErr_SetFromErrno(PyExc_OSError);
3704 return NULL;
3705 }
3706
3707 obj = PyMarshal_ReadLastObjectFromFile(fp);
3708 pos = ftell(fp);
3709
3710 fclose(fp);
3711 return Py_BuildValue("Nl", obj, pos);
3712}
3713
3714static PyObject*
3715pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3716{
3717 PyObject *obj;
3718 long pos;
3719 char *filename;
3720 FILE *fp;
3721
3722 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3723 return NULL;
3724
3725 fp = fopen(filename, "rb");
3726 if (fp == NULL) {
3727 PyErr_SetFromErrno(PyExc_OSError);
3728 return NULL;
3729 }
3730
3731 obj = PyMarshal_ReadObjectFromFile(fp);
3732 pos = ftell(fp);
3733
3734 fclose(fp);
3735 return Py_BuildValue("Nl", obj, pos);
3736}
3737
Victor Stinnerefde1462015-03-21 15:04:43 +01003738static PyObject*
3739return_null_without_error(PyObject *self, PyObject *args)
3740{
3741 /* invalid call: return NULL without setting an error,
3742 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3743 PyErr_Clear();
3744 return NULL;
3745}
3746
3747static PyObject*
3748return_result_with_error(PyObject *self, PyObject *args)
3749{
3750 /* invalid call: return a result with an error set,
3751 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3752 PyErr_SetNone(PyExc_ValueError);
3753 Py_RETURN_NONE;
3754}
3755
Victor Stinner992c43f2015-03-27 17:12:45 +01003756static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02003757test_pytime_fromseconds(PyObject *self, PyObject *args)
3758{
3759 int seconds;
3760 _PyTime_t ts;
3761
3762 if (!PyArg_ParseTuple(args, "i", &seconds))
3763 return NULL;
3764 ts = _PyTime_FromSeconds(seconds);
3765 return _PyTime_AsNanosecondsObject(ts);
3766}
3767
3768static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01003769test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
3770{
3771 PyObject *obj;
3772 int round;
3773 _PyTime_t ts;
3774
3775 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
3776 return NULL;
3777 if (check_time_rounding(round) < 0)
3778 return NULL;
3779 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
3780 return NULL;
3781 return _PyTime_AsNanosecondsObject(ts);
3782}
3783
Victor Stinner4bfb4602015-03-27 22:27:24 +01003784static PyObject *
3785test_pytime_assecondsdouble(PyObject *self, PyObject *args)
3786{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003787 long long ns;
Victor Stinner4bfb4602015-03-27 22:27:24 +01003788 _PyTime_t ts;
3789 double d;
3790
3791 if (!PyArg_ParseTuple(args, "L", &ns))
3792 return NULL;
3793 ts = _PyTime_FromNanoseconds(ns);
3794 d = _PyTime_AsSecondsDouble(ts);
3795 return PyFloat_FromDouble(d);
3796}
3797
Victor Stinner95e9cef2015-03-28 01:26:47 +01003798static PyObject *
3799test_PyTime_AsTimeval(PyObject *self, PyObject *args)
3800{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003801 long long ns;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003802 int round;
3803 _PyTime_t t;
3804 struct timeval tv;
3805 PyObject *seconds;
3806
3807 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3808 return NULL;
3809 if (check_time_rounding(round) < 0)
3810 return NULL;
3811 t = _PyTime_FromNanoseconds(ns);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +02003812 if (_PyTime_AsTimeval(t, &tv, round) < 0)
Victor Stinner95e9cef2015-03-28 01:26:47 +01003813 return NULL;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003814
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003815 seconds = PyLong_FromLong((long long)tv.tv_sec);
Victor Stinner95e9cef2015-03-28 01:26:47 +01003816 if (seconds == NULL)
3817 return NULL;
3818 return Py_BuildValue("Nl", seconds, tv.tv_usec);
3819}
3820
Victor Stinner34dc0f42015-03-27 18:19:03 +01003821#ifdef HAVE_CLOCK_GETTIME
3822static PyObject *
3823test_PyTime_AsTimespec(PyObject *self, PyObject *args)
3824{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003825 long long ns;
Victor Stinner34dc0f42015-03-27 18:19:03 +01003826 _PyTime_t t;
3827 struct timespec ts;
3828
3829 if (!PyArg_ParseTuple(args, "L", &ns))
3830 return NULL;
3831 t = _PyTime_FromNanoseconds(ns);
3832 if (_PyTime_AsTimespec(t, &ts) == -1)
3833 return NULL;
3834 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
3835}
3836#endif
3837
Victor Stinner62d1c702015-04-01 17:47:07 +02003838static PyObject *
3839test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
3840{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003841 long long ns;
Victor Stinner62d1c702015-04-01 17:47:07 +02003842 int round;
3843 _PyTime_t t, ms;
3844
3845 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3846 return NULL;
3847 if (check_time_rounding(round) < 0)
3848 return NULL;
3849 t = _PyTime_FromNanoseconds(ns);
3850 ms = _PyTime_AsMilliseconds(t, round);
3851 /* This conversion rely on the fact that _PyTime_t is a number of
3852 nanoseconds */
3853 return _PyTime_AsNanosecondsObject(ms);
3854}
3855
3856static PyObject *
3857test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
3858{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003859 long long ns;
Victor Stinner62d1c702015-04-01 17:47:07 +02003860 int round;
3861 _PyTime_t t, ms;
3862
3863 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3864 return NULL;
3865 if (check_time_rounding(round) < 0)
3866 return NULL;
3867 t = _PyTime_FromNanoseconds(ns);
3868 ms = _PyTime_AsMicroseconds(t, round);
3869 /* This conversion rely on the fact that _PyTime_t is a number of
3870 nanoseconds */
3871 return _PyTime_AsNanosecondsObject(ms);
3872}
3873
Victor Stinner50856d52015-10-13 00:11:21 +02003874static PyObject*
3875get_recursion_depth(PyObject *self, PyObject *args)
3876{
3877 PyThreadState *tstate = PyThreadState_GET();
3878
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07003879 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02003880 return PyLong_FromLong(tstate->recursion_depth - 1);
3881}
3882
Victor Stinner34be8072016-03-14 12:04:26 +01003883static PyObject*
3884pymem_buffer_overflow(PyObject *self, PyObject *args)
3885{
3886 char *buffer;
3887
3888 /* Deliberate buffer overflow to check that PyMem_Free() detects
3889 the overflow when debug hooks are installed. */
3890 buffer = PyMem_Malloc(16);
3891 buffer[16] = 'x';
3892 PyMem_Free(buffer);
3893
3894 Py_RETURN_NONE;
3895}
3896
3897static PyObject*
3898pymem_api_misuse(PyObject *self, PyObject *args)
3899{
3900 char *buffer;
3901
3902 /* Deliberate misusage of Python allocators:
3903 allococate with PyMem but release with PyMem_Raw. */
3904 buffer = PyMem_Malloc(16);
3905 PyMem_RawFree(buffer);
3906
3907 Py_RETURN_NONE;
3908}
3909
Victor Stinnerc4aec362016-03-14 22:26:53 +01003910static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01003911pymem_malloc_without_gil(PyObject *self, PyObject *args)
3912{
3913 char *buffer;
3914
3915 /* Deliberate bug to test debug hooks on Python memory allocators:
3916 call PyMem_Malloc() without holding the GIL */
3917 Py_BEGIN_ALLOW_THREADS
3918 buffer = PyMem_Malloc(10);
3919 Py_END_ALLOW_THREADS
3920
3921 PyMem_Free(buffer);
3922
3923 Py_RETURN_NONE;
3924}
3925
3926static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01003927pyobject_malloc_without_gil(PyObject *self, PyObject *args)
3928{
3929 char *buffer;
3930
Victor Stinnerad524372016-03-16 12:12:53 +01003931 /* Deliberate bug to test debug hooks on Python memory allocators:
3932 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01003933 Py_BEGIN_ALLOW_THREADS
3934 buffer = PyObject_Malloc(10);
3935 Py_END_ALLOW_THREADS
3936
3937 PyObject_Free(buffer);
3938
3939 Py_RETURN_NONE;
3940}
3941
Victor Stinner10b73e12016-03-22 13:39:05 +01003942static PyObject *
3943tracemalloc_track(PyObject *self, PyObject *args)
3944{
3945 unsigned int domain;
3946 PyObject *ptr_obj;
3947 void *ptr;
3948 Py_ssize_t size;
3949 int release_gil = 0;
3950 int res;
3951
3952 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
3953 return NULL;
3954 ptr = PyLong_AsVoidPtr(ptr_obj);
3955 if (PyErr_Occurred())
3956 return NULL;
3957
3958 if (release_gil) {
3959 Py_BEGIN_ALLOW_THREADS
Benjamin Petersonca470632016-09-06 13:47:26 -07003960 res = _PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01003961 Py_END_ALLOW_THREADS
3962 }
3963 else {
Benjamin Petersonca470632016-09-06 13:47:26 -07003964 res = _PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01003965 }
3966
3967 if (res < 0) {
3968 PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
3969 return NULL;
3970 }
3971
3972 Py_RETURN_NONE;
3973}
3974
3975static PyObject *
3976tracemalloc_untrack(PyObject *self, PyObject *args)
3977{
3978 unsigned int domain;
3979 PyObject *ptr_obj;
3980 void *ptr;
3981 int res;
3982
3983 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
3984 return NULL;
3985 ptr = PyLong_AsVoidPtr(ptr_obj);
3986 if (PyErr_Occurred())
3987 return NULL;
3988
Benjamin Petersonca470632016-09-06 13:47:26 -07003989 res = _PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01003990 if (res < 0) {
3991 PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
3992 return NULL;
3993 }
3994
3995 Py_RETURN_NONE;
3996}
3997
3998static PyObject *
3999tracemalloc_get_traceback(PyObject *self, PyObject *args)
4000{
4001 unsigned int domain;
4002 PyObject *ptr_obj;
4003 void *ptr;
4004
4005 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4006 return NULL;
4007 ptr = PyLong_AsVoidPtr(ptr_obj);
4008 if (PyErr_Occurred())
4009 return NULL;
4010
Benjamin Petersonca470632016-09-06 13:47:26 -07004011 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004012}
4013
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004014static PyObject *
4015dict_get_version(PyObject *self, PyObject *args)
4016{
4017 PyDictObject *dict;
4018 uint64_t version;
4019
4020 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4021 return NULL;
4022
4023 version = dict->ma_version_tag;
4024
4025 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4026 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4027}
4028
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004029
Tim Peters9ea17ac2001-02-02 05:57:15 +00004030static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004031 {"raise_exception", raise_exception, METH_VARARGS},
4032 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02004033 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004034 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01004035 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004036 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
4037 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
4038 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02004039 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01004040 {"dict_hassplittable", dict_hassplittable, METH_O},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004041 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004042 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07004043 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
4044 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
4045 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
4046 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02004047 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004048 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
4049 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02004050 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
4051 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004052 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
4053 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
4054 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07004055 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004056 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
4057 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
4058 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
4059 PyDoc_STR("This is a pretty normal docstring.")},
4060 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
4061 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
4062 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01004063 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004064#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01004065 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004066#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01004067 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03004068 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03004069 {"get_args", get_args, METH_VARARGS},
4070 {"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004071 {"getargs_tuple", getargs_tuple, METH_VARARGS},
4072 {"getargs_keywords", (PyCFunction)getargs_keywords,
4073 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00004074 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
4075 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03004076 {"getargs_positional_only_and_keywords",
4077 (PyCFunction)getargs_positional_only_and_keywords,
4078 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004079 {"getargs_b", getargs_b, METH_VARARGS},
4080 {"getargs_B", getargs_B, METH_VARARGS},
4081 {"getargs_h", getargs_h, METH_VARARGS},
4082 {"getargs_H", getargs_H, METH_VARARGS},
4083 {"getargs_I", getargs_I, METH_VARARGS},
4084 {"getargs_k", getargs_k, METH_VARARGS},
4085 {"getargs_i", getargs_i, METH_VARARGS},
4086 {"getargs_l", getargs_l, METH_VARARGS},
4087 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07004088 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004089 {"getargs_L", getargs_L, METH_VARARGS},
4090 {"getargs_K", getargs_K, METH_VARARGS},
4091 {"test_longlong_api", test_longlong_api, METH_NOARGS},
4092 {"test_long_long_and_overflow",
4093 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
4094 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03004095 {"getargs_f", getargs_f, METH_VARARGS},
4096 {"getargs_d", getargs_d, METH_VARARGS},
4097 {"getargs_D", getargs_D, METH_VARARGS},
4098 {"getargs_S", getargs_S, METH_VARARGS},
4099 {"getargs_Y", getargs_Y, METH_VARARGS},
4100 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03004101 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004102 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00004103 {"getargs_s", getargs_s, METH_VARARGS},
4104 {"getargs_s_star", getargs_s_star, METH_VARARGS},
4105 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
4106 {"getargs_z", getargs_z, METH_VARARGS},
4107 {"getargs_z_star", getargs_z_star, METH_VARARGS},
4108 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
4109 {"getargs_y", getargs_y, METH_VARARGS},
4110 {"getargs_y_star", getargs_y_star, METH_VARARGS},
4111 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
4112 {"getargs_u", getargs_u, METH_VARARGS},
4113 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
4114 {"getargs_Z", getargs_Z, METH_VARARGS},
4115 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00004116 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004117 {"getargs_es", getargs_es, METH_VARARGS},
4118 {"getargs_et", getargs_et, METH_VARARGS},
4119 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
4120 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004121 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004122 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004123 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004124 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
4126 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
4127 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
4128 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004129 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
4130 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03004131 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03004132 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004133 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
4134 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01004135 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004136#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00004137 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004138 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004139#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00004140#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00004141 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004142#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00004143 {"traceback_print", traceback_print, METH_VARARGS},
4144 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02004145 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004146 {"argparsing", argparsing, METH_VARARGS},
4147 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004148 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
4149 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00004150 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
4151 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00004152 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004153 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01004154 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
4155 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01004156 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02004157 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04004158 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02004159 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02004160 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
4161 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02004162 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
4163 {"test_pymem_setallocators",
4164 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
4165 {"test_pyobject_setallocators",
4166 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004167 {"no_docstring",
4168 (PyCFunction)test_with_docstring, METH_NOARGS},
4169 {"docstring_empty",
4170 (PyCFunction)test_with_docstring, METH_NOARGS,
4171 docstring_empty},
4172 {"docstring_no_signature",
4173 (PyCFunction)test_with_docstring, METH_NOARGS,
4174 docstring_no_signature},
4175 {"docstring_with_invalid_signature",
4176 (PyCFunction)test_with_docstring, METH_NOARGS,
4177 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004178 {"docstring_with_invalid_signature2",
4179 (PyCFunction)test_with_docstring, METH_NOARGS,
4180 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004181 {"docstring_with_signature",
4182 (PyCFunction)test_with_docstring, METH_NOARGS,
4183 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004184 {"docstring_with_signature_but_no_doc",
4185 (PyCFunction)test_with_docstring, METH_NOARGS,
4186 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004187 {"docstring_with_signature_and_extra_newlines",
4188 (PyCFunction)test_with_docstring, METH_NOARGS,
4189 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004190 {"docstring_with_signature_with_defaults",
4191 (PyCFunction)test_with_docstring, METH_NOARGS,
4192 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02004193 {"raise_signal",
4194 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01004195#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004196 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4197 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01004198#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02004199 {"pymarshal_write_long_to_file",
4200 pymarshal_write_long_to_file, METH_VARARGS},
4201 {"pymarshal_write_object_to_file",
4202 pymarshal_write_object_to_file, METH_VARARGS},
4203 {"pymarshal_read_short_from_file",
4204 pymarshal_read_short_from_file, METH_VARARGS},
4205 {"pymarshal_read_long_from_file",
4206 pymarshal_read_long_from_file, METH_VARARGS},
4207 {"pymarshal_read_last_object_from_file",
4208 pymarshal_read_last_object_from_file, METH_VARARGS},
4209 {"pymarshal_read_object_from_file",
4210 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004211 {"return_null_without_error",
4212 return_null_without_error, METH_NOARGS},
4213 {"return_result_with_error",
4214 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004215 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004216 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4217 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004218 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004219#ifdef HAVE_CLOCK_GETTIME
4220 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4221#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004222 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4223 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004224 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be8072016-03-14 12:04:26 +01004225 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
4226 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01004227 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01004228 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01004229 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
4230 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
4231 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004232 {"dict_get_version", dict_get_version, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00004234};
4235
Thomas Hellera4ea6032003-04-17 18:55:45 +00004236#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
4237
Thomas Wouters89f507f2006-12-13 04:49:30 +00004238typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004239 char bool_member;
4240 char byte_member;
4241 unsigned char ubyte_member;
4242 short short_member;
4243 unsigned short ushort_member;
4244 int int_member;
4245 unsigned int uint_member;
4246 long long_member;
4247 unsigned long ulong_member;
4248 Py_ssize_t pyssizet_member;
4249 float float_member;
4250 double double_member;
4251 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07004252 long long longlong_member;
4253 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004254} all_structmembers;
4255
4256typedef struct {
4257 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004258 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004259} test_structmembers;
4260
4261static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004262 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
4263 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
4264 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
4265 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
4266 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
4267 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
4268 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
4269 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
4270 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
4271 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
4272 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
4273 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
4274 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004275 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
4276 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004277 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00004278};
4279
4280
Christian Heimes1af737c2008-01-23 08:24:23 +00004281static PyObject *
4282test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
4283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004284 static char *keywords[] = {
4285 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
4286 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
4287 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004288 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004289 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07004290 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004291 test_structmembers *ob;
4292 const char *s = NULL;
4293 Py_ssize_t string_len = 0;
4294 ob = PyObject_New(test_structmembers, type);
4295 if (ob == NULL)
4296 return NULL;
4297 memset(&ob->structmembers, 0, sizeof(all_structmembers));
4298 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
4299 &ob->structmembers.bool_member,
4300 &ob->structmembers.byte_member,
4301 &ob->structmembers.ubyte_member,
4302 &ob->structmembers.short_member,
4303 &ob->structmembers.ushort_member,
4304 &ob->structmembers.int_member,
4305 &ob->structmembers.uint_member,
4306 &ob->structmembers.long_member,
4307 &ob->structmembers.ulong_member,
4308 &ob->structmembers.pyssizet_member,
4309 &ob->structmembers.float_member,
4310 &ob->structmembers.double_member,
4311 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004312 , &ob->structmembers.longlong_member,
4313 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004314 )) {
4315 Py_DECREF(ob);
4316 return NULL;
4317 }
4318 if (s != NULL) {
4319 if (string_len > 5) {
4320 Py_DECREF(ob);
4321 PyErr_SetString(PyExc_ValueError, "string too long");
4322 return NULL;
4323 }
4324 strcpy(ob->structmembers.inplace_member, s);
4325 }
4326 else {
4327 strcpy(ob->structmembers.inplace_member, "");
4328 }
4329 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004330}
4331
Christian Heimes1af737c2008-01-23 08:24:23 +00004332static void
4333test_structmembers_free(PyObject *ob)
4334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004335 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004336}
4337
4338static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004339 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004340 "test_structmembersType",
4341 sizeof(test_structmembers), /* tp_basicsize */
4342 0, /* tp_itemsize */
4343 test_structmembers_free, /* destructor tp_dealloc */
4344 0, /* tp_print */
4345 0, /* tp_getattr */
4346 0, /* tp_setattr */
4347 0, /* tp_reserved */
4348 0, /* tp_repr */
4349 0, /* tp_as_number */
4350 0, /* tp_as_sequence */
4351 0, /* tp_as_mapping */
4352 0, /* tp_hash */
4353 0, /* tp_call */
4354 0, /* tp_str */
4355 PyObject_GenericGetAttr, /* tp_getattro */
4356 PyObject_GenericSetAttr, /* tp_setattro */
4357 0, /* tp_as_buffer */
4358 0, /* tp_flags */
4359 "Type containing all structmember types",
4360 0, /* traverseproc tp_traverse */
4361 0, /* tp_clear */
4362 0, /* tp_richcompare */
4363 0, /* tp_weaklistoffset */
4364 0, /* tp_iter */
4365 0, /* tp_iternext */
4366 0, /* tp_methods */
4367 test_members, /* tp_members */
4368 0,
4369 0,
4370 0,
4371 0,
4372 0,
4373 0,
4374 0,
4375 0,
4376 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004377};
4378
4379
Benjamin Petersond51374e2014-04-09 23:55:56 -04004380typedef struct {
4381 PyObject_HEAD
4382} matmulObject;
4383
4384static PyObject *
4385matmulType_matmul(PyObject *self, PyObject *other)
4386{
4387 return Py_BuildValue("(sOO)", "matmul", self, other);
4388}
4389
4390static PyObject *
4391matmulType_imatmul(PyObject *self, PyObject *other)
4392{
4393 return Py_BuildValue("(sOO)", "imatmul", self, other);
4394}
4395
4396static void
4397matmulType_dealloc(PyObject *self)
4398{
Zachary Ware420dc562014-04-23 13:51:27 -05004399 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004400}
4401
4402static PyNumberMethods matmulType_as_number = {
4403 0, /* nb_add */
4404 0, /* nb_subtract */
4405 0, /* nb_multiply */
4406 0, /* nb_remainde r*/
4407 0, /* nb_divmod */
4408 0, /* nb_power */
4409 0, /* nb_negative */
4410 0, /* tp_positive */
4411 0, /* tp_absolute */
4412 0, /* tp_bool */
4413 0, /* nb_invert */
4414 0, /* nb_lshift */
4415 0, /* nb_rshift */
4416 0, /* nb_and */
4417 0, /* nb_xor */
4418 0, /* nb_or */
4419 0, /* nb_int */
4420 0, /* nb_reserved */
4421 0, /* nb_float */
4422 0, /* nb_inplace_add */
4423 0, /* nb_inplace_subtract */
4424 0, /* nb_inplace_multiply */
4425 0, /* nb_inplace_remainder */
4426 0, /* nb_inplace_power */
4427 0, /* nb_inplace_lshift */
4428 0, /* nb_inplace_rshift */
4429 0, /* nb_inplace_and */
4430 0, /* nb_inplace_xor */
4431 0, /* nb_inplace_or */
4432 0, /* nb_floor_divide */
4433 0, /* nb_true_divide */
4434 0, /* nb_inplace_floor_divide */
4435 0, /* nb_inplace_true_divide */
4436 0, /* nb_index */
4437 matmulType_matmul, /* nb_matrix_multiply */
4438 matmulType_imatmul /* nb_matrix_inplace_multiply */
4439};
4440
4441static PyTypeObject matmulType = {
4442 PyVarObject_HEAD_INIT(NULL, 0)
4443 "matmulType",
4444 sizeof(matmulObject), /* tp_basicsize */
4445 0, /* tp_itemsize */
4446 matmulType_dealloc, /* destructor tp_dealloc */
4447 0, /* tp_print */
4448 0, /* tp_getattr */
4449 0, /* tp_setattr */
4450 0, /* tp_reserved */
4451 0, /* tp_repr */
4452 &matmulType_as_number, /* tp_as_number */
4453 0, /* tp_as_sequence */
4454 0, /* tp_as_mapping */
4455 0, /* tp_hash */
4456 0, /* tp_call */
4457 0, /* tp_str */
4458 PyObject_GenericGetAttr, /* tp_getattro */
4459 PyObject_GenericSetAttr, /* tp_setattro */
4460 0, /* tp_as_buffer */
4461 0, /* tp_flags */
4462 "C level type with matrix operations defined",
4463 0, /* traverseproc tp_traverse */
4464 0, /* tp_clear */
4465 0, /* tp_richcompare */
4466 0, /* tp_weaklistoffset */
4467 0, /* tp_iter */
4468 0, /* tp_iternext */
4469 0, /* tp_methods */
4470 0, /* tp_members */
4471 0,
4472 0,
4473 0,
4474 0,
4475 0,
4476 0,
4477 0,
4478 0,
4479 PyType_GenericNew, /* tp_new */
4480 PyObject_Del, /* tp_free */
4481};
4482
Martin v. Löwis1a214512008-06-11 05:26:20 +00004483
Yury Selivanov75445082015-05-11 22:57:16 -04004484typedef struct {
4485 PyObject_HEAD
4486 PyObject *ao_iterator;
4487} awaitObject;
4488
4489
4490static PyObject *
4491awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4492{
4493 PyObject *v;
4494 awaitObject *ao;
4495
4496 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
4497 return NULL;
4498
4499 ao = (awaitObject *)type->tp_alloc(type, 0);
4500 if (ao == NULL) {
4501 return NULL;
4502 }
4503
4504 Py_INCREF(v);
4505 ao->ao_iterator = v;
4506
4507 return (PyObject *)ao;
4508}
4509
4510
4511static void
4512awaitObject_dealloc(awaitObject *ao)
4513{
4514 Py_CLEAR(ao->ao_iterator);
4515 Py_TYPE(ao)->tp_free(ao);
4516}
4517
4518
4519static PyObject *
4520awaitObject_await(awaitObject *ao)
4521{
4522 Py_INCREF(ao->ao_iterator);
4523 return ao->ao_iterator;
4524}
4525
4526static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04004527 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04004528 0, /* am_aiter */
4529 0 /* am_anext */
4530};
4531
4532
4533static PyTypeObject awaitType = {
4534 PyVarObject_HEAD_INIT(NULL, 0)
4535 "awaitType",
4536 sizeof(awaitObject), /* tp_basicsize */
4537 0, /* tp_itemsize */
4538 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
4539 0, /* tp_print */
4540 0, /* tp_getattr */
4541 0, /* tp_setattr */
4542 &awaitType_as_async, /* tp_as_async */
4543 0, /* tp_repr */
4544 0, /* tp_as_number */
4545 0, /* tp_as_sequence */
4546 0, /* tp_as_mapping */
4547 0, /* tp_hash */
4548 0, /* tp_call */
4549 0, /* tp_str */
4550 PyObject_GenericGetAttr, /* tp_getattro */
4551 PyObject_GenericSetAttr, /* tp_setattro */
4552 0, /* tp_as_buffer */
4553 0, /* tp_flags */
4554 "C level type with tp_as_async",
4555 0, /* traverseproc tp_traverse */
4556 0, /* tp_clear */
4557 0, /* tp_richcompare */
4558 0, /* tp_weaklistoffset */
4559 0, /* tp_iter */
4560 0, /* tp_iternext */
4561 0, /* tp_methods */
4562 0, /* tp_members */
4563 0,
4564 0,
4565 0,
4566 0,
4567 0,
4568 0,
4569 0,
4570 0,
4571 awaitObject_new, /* tp_new */
4572 PyObject_Del, /* tp_free */
4573};
4574
4575
Martin v. Löwis1a214512008-06-11 05:26:20 +00004576static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 PyModuleDef_HEAD_INIT,
4578 "_testcapi",
4579 NULL,
4580 -1,
4581 TestMethods,
4582 NULL,
4583 NULL,
4584 NULL,
4585 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004586};
4587
Nick Coghland5cacbb2015-05-23 22:24:10 +10004588/* Per PEP 489, this module will not be converted to multi-phase initialization
4589 */
4590
Mark Hammond62b1ab12002-07-23 06:31:15 +00004591PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004592PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00004593{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004594 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004596 m = PyModule_Create(&_testcapimodule);
4597 if (m == NULL)
4598 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004600 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00004601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004602 Py_TYPE(&test_structmembersType)=&PyType_Type;
4603 Py_INCREF(&test_structmembersType);
4604 /* don't use a name starting with "test", since we don't want
4605 test_capi to automatically call this */
4606 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004607 if (PyType_Ready(&matmulType) < 0)
4608 return NULL;
4609 Py_INCREF(&matmulType);
4610 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004611
Yury Selivanov75445082015-05-11 22:57:16 -04004612 if (PyType_Ready(&awaitType) < 0)
4613 return NULL;
4614 Py_INCREF(&awaitType);
4615 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
4616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
4618 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
4619 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
4620 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
4621 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
4622 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
4623 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
4624 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
4625 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
4626 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
4627 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
4628 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
4629 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
4630 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
4631 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
4632 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
4633 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
4634 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
4635 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
4636 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
4637 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
4638 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02004639 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 Py_INCREF(&PyInstanceMethod_Type);
4641 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00004642
Larry Hastings2a727912014-01-16 11:32:01 -08004643 PyModule_AddIntConstant(m, "the_number_three", 3);
4644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004645 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
4646 Py_INCREF(TestError);
4647 PyModule_AddObject(m, "error", TestError);
4648 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004649}