blob: 0fc7cbc3288a0e9f32c4d36b8f63d25939a0aa66 [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);
Tim Peters9ea17ac2001-02-02 05:57:15 +000063#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
Tim Peters9ea17ac2001-02-02 05:57:15 +000065#endif
66
67#undef CHECK_SIZEOF
68
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000069 Py_INCREF(Py_None);
70 return Py_None;
Tim Peters9ea17ac2001-02-02 05:57:15 +000071}
72
Tim Peters5c4d5bf2001-02-12 22:13:26 +000073static PyObject*
Victor Stinner01076552013-10-29 19:39:52 +010074test_sizeof_c_types(PyObject *self)
75{
Ned Deilye37a1942015-03-05 15:47:10 -080076#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020077#pragma GCC diagnostic push
78#pragma GCC diagnostic ignored "-Wtype-limits"
79#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010080#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010081 if (EXPECTED != sizeof(TYPE)) { \
82 PyErr_Format(TestError, \
83 "sizeof(%s) = %u instead of %u", \
84 #TYPE, sizeof(TYPE), EXPECTED); \
85 return (PyObject*)NULL; \
86 }
Victor Stinnerf866f972013-10-29 19:59:31 +010087#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
88#define CHECK_SIGNNESS(TYPE, SIGNED) \
89 if (IS_SIGNED(TYPE) != SIGNED) { \
90 PyErr_Format(TestError, \
91 "%s signness is, instead of %i", \
92 #TYPE, IS_SIGNED(TYPE), SIGNED); \
93 return (PyObject*)NULL; \
94 }
Victor Stinner01076552013-10-29 19:39:52 +010095
96 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +010097 CHECK_SIZEOF(Py_UCS1, 1);
98 CHECK_SIZEOF(Py_UCS2, 2);
99 CHECK_SIZEOF(Py_UCS4, 4);
100 CHECK_SIGNNESS(Py_UCS1, 0);
101 CHECK_SIGNNESS(Py_UCS2, 0);
102 CHECK_SIGNNESS(Py_UCS4, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100103#ifdef HAVE_INT32_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100104 CHECK_SIZEOF(PY_INT32_T, 4);
105 CHECK_SIGNNESS(PY_INT32_T, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100106#endif
107#ifdef HAVE_UINT32_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100108 CHECK_SIZEOF(PY_UINT32_T, 4);
109 CHECK_SIGNNESS(PY_UINT32_T, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100110#endif
111#ifdef HAVE_INT64_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100112 CHECK_SIZEOF(PY_INT64_T, 8);
113 CHECK_SIGNNESS(PY_INT64_T, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100114#endif
115#ifdef HAVE_UINT64_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100116 CHECK_SIZEOF(PY_UINT64_T, 8);
117 CHECK_SIGNNESS(PY_UINT64_T, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100118#endif
119
120 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100121 CHECK_SIZEOF(size_t, sizeof(void *));
122 CHECK_SIGNNESS(size_t, 0);
123 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
124 CHECK_SIGNNESS(Py_ssize_t, 1);
125
126 CHECK_SIZEOF(Py_uintptr_t, sizeof(void *));
127 CHECK_SIGNNESS(Py_uintptr_t, 0);
128 CHECK_SIZEOF(Py_intptr_t, sizeof(void *));
129 CHECK_SIGNNESS(Py_intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100130
131 Py_INCREF(Py_None);
132 return Py_None;
133
Victor Stinnerf866f972013-10-29 19:59:31 +0100134#undef IS_SIGNED
135#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100136#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800137#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200138#pragma GCC diagnostic pop
139#endif
Victor Stinner01076552013-10-29 19:39:52 +0100140}
141
142
143static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000144test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 PyObject* list;
147 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000150#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 list = PyList_New(NLIST);
152 if (list == (PyObject*)NULL)
153 return (PyObject*)NULL;
154 /* list = range(NLIST) */
155 for (i = 0; i < NLIST; ++i) {
156 PyObject* anint = PyLong_FromLong(i);
157 if (anint == (PyObject*)NULL) {
158 Py_DECREF(list);
159 return (PyObject*)NULL;
160 }
161 PyList_SET_ITEM(list, i, anint);
162 }
163 /* list.reverse(), via PyList_Reverse() */
164 i = PyList_Reverse(list); /* should not blow up! */
165 if (i != 0) {
166 Py_DECREF(list);
167 return (PyObject*)NULL;
168 }
169 /* Check that list == range(29, -1, -1) now */
170 for (i = 0; i < NLIST; ++i) {
171 PyObject* anint = PyList_GET_ITEM(list, i);
172 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
173 PyErr_SetString(TestError,
174 "test_list_api: reverse screwed up");
175 Py_DECREF(list);
176 return (PyObject*)NULL;
177 }
178 }
179 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000180#undef NLIST
181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 Py_INCREF(Py_None);
183 return Py_None;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000184}
185
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000186static int
187test_dict_inner(int count)
188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 Py_ssize_t pos = 0, iterations = 0;
190 int i;
191 PyObject *dict = PyDict_New();
192 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 if (dict == NULL)
195 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 for (i = 0; i < count; i++) {
198 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200199 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200200 return -1;
201 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200202 if (PyDict_SetItem(dict, v, v) < 0) {
203 Py_DECREF(v);
204 return -1;
205 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 Py_DECREF(v);
207 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 while (PyDict_Next(dict, &pos, &k, &v)) {
210 PyObject *o;
211 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 i = PyLong_AS_LONG(v) + 1;
214 o = PyLong_FromLong(i);
215 if (o == NULL)
216 return -1;
217 if (PyDict_SetItem(dict, k, o) < 0) {
218 Py_DECREF(o);
219 return -1;
220 }
221 Py_DECREF(o);
222 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 if (iterations != count) {
227 PyErr_SetString(
228 TestError,
229 "test_dict_iteration: dict iteration went wrong ");
230 return -1;
231 } else {
232 return 0;
233 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000234}
235
236static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000237test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 for (i = 0; i < 200; i++) {
242 if (test_dict_inner(i) < 0) {
243 return NULL;
244 }
245 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 Py_INCREF(Py_None);
248 return Py_None;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000249}
250
Tim Peters91621db2001-06-12 20:10:01 +0000251
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000252/* Issue #4701: Check that PyObject_Hash implicitly calls
253 * PyType_Ready if it hasn't already been called
254 */
255static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 PyVarObject_HEAD_INIT(NULL, 0)
257 "hashinheritancetester", /* Name of this type */
258 sizeof(PyObject), /* Basic object size */
259 0, /* Item size for varobject */
260 (destructor)PyObject_Del, /* tp_dealloc */
261 0, /* tp_print */
262 0, /* tp_getattr */
263 0, /* tp_setattr */
264 0, /* tp_reserved */
265 0, /* tp_repr */
266 0, /* tp_as_number */
267 0, /* tp_as_sequence */
268 0, /* tp_as_mapping */
269 0, /* tp_hash */
270 0, /* tp_call */
271 0, /* tp_str */
272 PyObject_GenericGetAttr, /* tp_getattro */
273 0, /* tp_setattro */
274 0, /* tp_as_buffer */
275 Py_TPFLAGS_DEFAULT, /* tp_flags */
276 0, /* tp_doc */
277 0, /* tp_traverse */
278 0, /* tp_clear */
279 0, /* tp_richcompare */
280 0, /* tp_weaklistoffset */
281 0, /* tp_iter */
282 0, /* tp_iternext */
283 0, /* tp_methods */
284 0, /* tp_members */
285 0, /* tp_getset */
286 0, /* tp_base */
287 0, /* tp_dict */
288 0, /* tp_descr_get */
289 0, /* tp_descr_set */
290 0, /* tp_dictoffset */
291 0, /* tp_init */
292 0, /* tp_alloc */
293 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000294};
295
296static PyObject*
297test_lazy_hash_inheritance(PyObject* self)
298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 PyTypeObject *type;
300 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000301 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 if (type->tp_dict != NULL)
306 /* The type has already been initialized. This probably means
307 -R is being used. */
308 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000309
310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 obj = PyObject_New(PyObject, type);
312 if (obj == NULL) {
313 PyErr_Clear();
314 PyErr_SetString(
315 TestError,
316 "test_lazy_hash_inheritance: failed to create object");
317 return NULL;
318 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 if (type->tp_dict != NULL) {
321 PyErr_SetString(
322 TestError,
323 "test_lazy_hash_inheritance: type initialised too soon");
324 Py_DECREF(obj);
325 return NULL;
326 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 hash = PyObject_Hash(obj);
329 if ((hash == -1) && PyErr_Occurred()) {
330 PyErr_Clear();
331 PyErr_SetString(
332 TestError,
333 "test_lazy_hash_inheritance: could not hash object");
334 Py_DECREF(obj);
335 return NULL;
336 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 if (type->tp_dict == NULL) {
339 PyErr_SetString(
340 TestError,
341 "test_lazy_hash_inheritance: type not initialised by hash()");
342 Py_DECREF(obj);
343 return NULL;
344 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 if (type->tp_hash != PyType_Type.tp_hash) {
347 PyErr_SetString(
348 TestError,
349 "test_lazy_hash_inheritance: unexpected hash function");
350 Py_DECREF(obj);
351 return NULL;
352 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000357}
358
359
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000360/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
Tim Petersff70d3c2001-06-14 01:11:03 +0000361 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000362
363 Note that the meat of the test is contained in testcapi_long.h.
364 This is revolting, but delicate code duplication is worse: "almost
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000365 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000366 dependence on type names makes it impossible to use a parameterized
367 function. A giant macro would be even worse than this. A C++ template
368 would be perfect.
369
370 The "report an error" functions are deliberately not part of the #include
371 file: if the test fails, you can set a breakpoint in the appropriate
372 error function directly, and crawl back from there in the debugger.
373*/
374
375#define UNBIND(X) Py_DECREF(X); (X) = NULL
376
377static PyObject *
378raise_test_long_error(const char* msg)
379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000381}
382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383#define TESTNAME test_long_api_inner
384#define TYPENAME long
385#define F_S_TO_PY PyLong_FromLong
386#define F_PY_TO_S PyLong_AsLong
387#define F_U_TO_PY PyLong_FromUnsignedLong
388#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000389
390#include "testcapi_long.h"
391
392static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000393test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000396}
397
398#undef TESTNAME
399#undef TYPENAME
400#undef F_S_TO_PY
401#undef F_PY_TO_S
402#undef F_U_TO_PY
403#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000404
405#ifdef HAVE_LONG_LONG
Tim Peters91621db2001-06-12 20:10:01 +0000406
407static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000408raise_test_longlong_error(const char* msg)
409{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000411}
412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413#define TESTNAME test_longlong_api_inner
414#define TYPENAME PY_LONG_LONG
415#define F_S_TO_PY PyLong_FromLongLong
416#define F_PY_TO_S PyLong_AsLongLong
417#define F_U_TO_PY PyLong_FromUnsignedLongLong
418#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000419
420#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000421
422static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000423test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000426}
427
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000428#undef TESTNAME
429#undef TYPENAME
430#undef F_S_TO_PY
431#undef F_PY_TO_S
432#undef F_U_TO_PY
433#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000434
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000435/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
436 is tested by test_long_api_inner. This test will concentrate on proper
437 handling of overflow.
438*/
439
440static PyObject *
441test_long_and_overflow(PyObject *self)
442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 PyObject *num, *one, *temp;
444 long value;
445 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 /* Test that overflow is set properly for a large value. */
448 /* num is a number larger than LONG_MAX even on 64-bit platforms */
449 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
450 if (num == NULL)
451 return NULL;
452 overflow = 1234;
453 value = PyLong_AsLongAndOverflow(num, &overflow);
454 Py_DECREF(num);
455 if (value == -1 && PyErr_Occurred())
456 return NULL;
457 if (value != -1)
458 return raiseTestError("test_long_and_overflow",
459 "return value was not set to -1");
460 if (overflow != 1)
461 return raiseTestError("test_long_and_overflow",
462 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 /* Same again, with num = LONG_MAX + 1 */
465 num = PyLong_FromLong(LONG_MAX);
466 if (num == NULL)
467 return NULL;
468 one = PyLong_FromLong(1L);
469 if (one == NULL) {
470 Py_DECREF(num);
471 return NULL;
472 }
473 temp = PyNumber_Add(num, one);
474 Py_DECREF(one);
475 Py_DECREF(num);
476 num = temp;
477 if (num == NULL)
478 return NULL;
479 overflow = 0;
480 value = PyLong_AsLongAndOverflow(num, &overflow);
481 Py_DECREF(num);
482 if (value == -1 && PyErr_Occurred())
483 return NULL;
484 if (value != -1)
485 return raiseTestError("test_long_and_overflow",
486 "return value was not set to -1");
487 if (overflow != 1)
488 return raiseTestError("test_long_and_overflow",
489 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 /* Test that overflow is set properly for a large negative value. */
492 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
493 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
494 if (num == NULL)
495 return NULL;
496 overflow = 1234;
497 value = PyLong_AsLongAndOverflow(num, &overflow);
498 Py_DECREF(num);
499 if (value == -1 && PyErr_Occurred())
500 return NULL;
501 if (value != -1)
502 return raiseTestError("test_long_and_overflow",
503 "return value was not set to -1");
504 if (overflow != -1)
505 return raiseTestError("test_long_and_overflow",
506 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 /* Same again, with num = LONG_MIN - 1 */
509 num = PyLong_FromLong(LONG_MIN);
510 if (num == NULL)
511 return NULL;
512 one = PyLong_FromLong(1L);
513 if (one == NULL) {
514 Py_DECREF(num);
515 return NULL;
516 }
517 temp = PyNumber_Subtract(num, one);
518 Py_DECREF(one);
519 Py_DECREF(num);
520 num = temp;
521 if (num == NULL)
522 return NULL;
523 overflow = 0;
524 value = PyLong_AsLongAndOverflow(num, &overflow);
525 Py_DECREF(num);
526 if (value == -1 && PyErr_Occurred())
527 return NULL;
528 if (value != -1)
529 return raiseTestError("test_long_and_overflow",
530 "return value was not set to -1");
531 if (overflow != -1)
532 return raiseTestError("test_long_and_overflow",
533 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 /* Test that overflow is cleared properly for small values. */
536 num = PyLong_FromString("FF", NULL, 16);
537 if (num == NULL)
538 return NULL;
539 overflow = 1234;
540 value = PyLong_AsLongAndOverflow(num, &overflow);
541 Py_DECREF(num);
542 if (value == -1 && PyErr_Occurred())
543 return NULL;
544 if (value != 0xFF)
545 return raiseTestError("test_long_and_overflow",
546 "expected return value 0xFF");
547 if (overflow != 0)
548 return raiseTestError("test_long_and_overflow",
549 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 num = PyLong_FromString("-FF", NULL, 16);
552 if (num == NULL)
553 return NULL;
554 overflow = 0;
555 value = PyLong_AsLongAndOverflow(num, &overflow);
556 Py_DECREF(num);
557 if (value == -1 && PyErr_Occurred())
558 return NULL;
559 if (value != -0xFF)
560 return raiseTestError("test_long_and_overflow",
561 "expected return value 0xFF");
562 if (overflow != 0)
563 return raiseTestError("test_long_and_overflow",
564 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 num = PyLong_FromLong(LONG_MAX);
567 if (num == NULL)
568 return NULL;
569 overflow = 1234;
570 value = PyLong_AsLongAndOverflow(num, &overflow);
571 Py_DECREF(num);
572 if (value == -1 && PyErr_Occurred())
573 return NULL;
574 if (value != LONG_MAX)
575 return raiseTestError("test_long_and_overflow",
576 "expected return value LONG_MAX");
577 if (overflow != 0)
578 return raiseTestError("test_long_and_overflow",
579 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 num = PyLong_FromLong(LONG_MIN);
582 if (num == NULL)
583 return NULL;
584 overflow = 0;
585 value = PyLong_AsLongAndOverflow(num, &overflow);
586 Py_DECREF(num);
587 if (value == -1 && PyErr_Occurred())
588 return NULL;
589 if (value != LONG_MIN)
590 return raiseTestError("test_long_and_overflow",
591 "expected return value LONG_MIN");
592 if (overflow != 0)
593 return raiseTestError("test_long_and_overflow",
594 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 Py_INCREF(Py_None);
597 return Py_None;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000598}
599
Mark Dickinson93f562c2010-01-30 10:30:15 +0000600/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
601 PY_LONG_LONG is tested by test_long_api_inner. This test will
602 concentrate on proper handling of overflow.
603*/
604
605static PyObject *
606test_long_long_and_overflow(PyObject *self)
607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 PyObject *num, *one, *temp;
609 PY_LONG_LONG value;
610 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 /* Test that overflow is set properly for a large value. */
613 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
614 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
615 if (num == NULL)
616 return NULL;
617 overflow = 1234;
618 value = PyLong_AsLongLongAndOverflow(num, &overflow);
619 Py_DECREF(num);
620 if (value == -1 && PyErr_Occurred())
621 return NULL;
622 if (value != -1)
623 return raiseTestError("test_long_long_and_overflow",
624 "return value was not set to -1");
625 if (overflow != 1)
626 return raiseTestError("test_long_long_and_overflow",
627 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 /* Same again, with num = PY_LLONG_MAX + 1 */
630 num = PyLong_FromLongLong(PY_LLONG_MAX);
631 if (num == NULL)
632 return NULL;
633 one = PyLong_FromLong(1L);
634 if (one == NULL) {
635 Py_DECREF(num);
636 return NULL;
637 }
638 temp = PyNumber_Add(num, one);
639 Py_DECREF(one);
640 Py_DECREF(num);
641 num = temp;
642 if (num == NULL)
643 return NULL;
644 overflow = 0;
645 value = PyLong_AsLongLongAndOverflow(num, &overflow);
646 Py_DECREF(num);
647 if (value == -1 && PyErr_Occurred())
648 return NULL;
649 if (value != -1)
650 return raiseTestError("test_long_long_and_overflow",
651 "return value was not set to -1");
652 if (overflow != 1)
653 return raiseTestError("test_long_long_and_overflow",
654 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 /* Test that overflow is set properly for a large negative value. */
657 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
658 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
659 if (num == NULL)
660 return NULL;
661 overflow = 1234;
662 value = PyLong_AsLongLongAndOverflow(num, &overflow);
663 Py_DECREF(num);
664 if (value == -1 && PyErr_Occurred())
665 return NULL;
666 if (value != -1)
667 return raiseTestError("test_long_long_and_overflow",
668 "return value was not set to -1");
669 if (overflow != -1)
670 return raiseTestError("test_long_long_and_overflow",
671 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 /* Same again, with num = PY_LLONG_MIN - 1 */
674 num = PyLong_FromLongLong(PY_LLONG_MIN);
675 if (num == NULL)
676 return NULL;
677 one = PyLong_FromLong(1L);
678 if (one == NULL) {
679 Py_DECREF(num);
680 return NULL;
681 }
682 temp = PyNumber_Subtract(num, one);
683 Py_DECREF(one);
684 Py_DECREF(num);
685 num = temp;
686 if (num == NULL)
687 return NULL;
688 overflow = 0;
689 value = PyLong_AsLongLongAndOverflow(num, &overflow);
690 Py_DECREF(num);
691 if (value == -1 && PyErr_Occurred())
692 return NULL;
693 if (value != -1)
694 return raiseTestError("test_long_long_and_overflow",
695 "return value was not set to -1");
696 if (overflow != -1)
697 return raiseTestError("test_long_long_and_overflow",
698 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 /* Test that overflow is cleared properly for small values. */
701 num = PyLong_FromString("FF", NULL, 16);
702 if (num == NULL)
703 return NULL;
704 overflow = 1234;
705 value = PyLong_AsLongLongAndOverflow(num, &overflow);
706 Py_DECREF(num);
707 if (value == -1 && PyErr_Occurred())
708 return NULL;
709 if (value != 0xFF)
710 return raiseTestError("test_long_long_and_overflow",
711 "expected return value 0xFF");
712 if (overflow != 0)
713 return raiseTestError("test_long_long_and_overflow",
714 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 num = PyLong_FromString("-FF", NULL, 16);
717 if (num == NULL)
718 return NULL;
719 overflow = 0;
720 value = PyLong_AsLongLongAndOverflow(num, &overflow);
721 Py_DECREF(num);
722 if (value == -1 && PyErr_Occurred())
723 return NULL;
724 if (value != -0xFF)
725 return raiseTestError("test_long_long_and_overflow",
726 "expected return value 0xFF");
727 if (overflow != 0)
728 return raiseTestError("test_long_long_and_overflow",
729 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 num = PyLong_FromLongLong(PY_LLONG_MAX);
732 if (num == NULL)
733 return NULL;
734 overflow = 1234;
735 value = PyLong_AsLongLongAndOverflow(num, &overflow);
736 Py_DECREF(num);
737 if (value == -1 && PyErr_Occurred())
738 return NULL;
739 if (value != PY_LLONG_MAX)
740 return raiseTestError("test_long_long_and_overflow",
741 "expected return value PY_LLONG_MAX");
742 if (overflow != 0)
743 return raiseTestError("test_long_long_and_overflow",
744 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 num = PyLong_FromLongLong(PY_LLONG_MIN);
747 if (num == NULL)
748 return NULL;
749 overflow = 0;
750 value = PyLong_AsLongLongAndOverflow(num, &overflow);
751 Py_DECREF(num);
752 if (value == -1 && PyErr_Occurred())
753 return NULL;
754 if (value != PY_LLONG_MIN)
755 return raiseTestError("test_long_long_and_overflow",
756 "expected return value PY_LLONG_MIN");
757 if (overflow != 0)
758 return raiseTestError("test_long_long_and_overflow",
759 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 Py_INCREF(Py_None);
762 return Py_None;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000763}
764
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200765/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
766 non-integer arguments are handled correctly. It should be extended to
767 test overflow handling.
768 */
769
770static PyObject *
771test_long_as_size_t(PyObject *self)
772{
773 size_t out_u;
774 Py_ssize_t out_s;
775
776 Py_INCREF(Py_None);
777
778 out_u = PyLong_AsSize_t(Py_None);
779 if (out_u != (size_t)-1 || !PyErr_Occurred())
780 return raiseTestError("test_long_as_size_t",
781 "PyLong_AsSize_t(None) didn't complain");
782 if (!PyErr_ExceptionMatches(PyExc_TypeError))
783 return raiseTestError("test_long_as_size_t",
784 "PyLong_AsSize_t(None) raised "
785 "something other than TypeError");
786 PyErr_Clear();
787
788 out_s = PyLong_AsSsize_t(Py_None);
789 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
790 return raiseTestError("test_long_as_size_t",
791 "PyLong_AsSsize_t(None) didn't complain");
792 if (!PyErr_ExceptionMatches(PyExc_TypeError))
793 return raiseTestError("test_long_as_size_t",
794 "PyLong_AsSsize_t(None) raised "
795 "something other than TypeError");
796 PyErr_Clear();
797
798 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
799 return Py_None;
800}
801
802/* Test the PyLong_AsDouble API. At present this just tests that
803 non-integer arguments are handled correctly.
804 */
805
806static PyObject *
807test_long_as_double(PyObject *self)
808{
809 double out;
810
811 Py_INCREF(Py_None);
812
813 out = PyLong_AsDouble(Py_None);
814 if (out != -1.0 || !PyErr_Occurred())
815 return raiseTestError("test_long_as_double",
816 "PyLong_AsDouble(None) didn't complain");
817 if (!PyErr_ExceptionMatches(PyExc_TypeError))
818 return raiseTestError("test_long_as_double",
819 "PyLong_AsDouble(None) raised "
820 "something other than TypeError");
821 PyErr_Clear();
822
823 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
824 return Py_None;
825}
826
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000827/* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
Tim Petersd38b1c72001-09-30 05:09:37 +0000828 for both long and int arguments. The test may leak a little memory if
829 it fails.
830*/
831static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000832test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000833{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 PyObject *tuple, *num;
835 PY_LONG_LONG value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 tuple = PyTuple_New(1);
838 if (tuple == NULL)
839 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 num = PyLong_FromLong(42);
842 if (num == NULL)
843 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 value = -1;
848 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
849 return NULL;
850 if (value != 42)
851 return raiseTestError("test_L_code",
852 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 Py_DECREF(num);
855 num = PyLong_FromLong(42);
856 if (num == NULL)
857 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 value = -1;
862 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
863 return NULL;
864 if (value != 42)
865 return raiseTestError("test_L_code",
866 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 Py_DECREF(tuple);
869 Py_INCREF(Py_None);
870 return Py_None;
Tim Petersd38b1c72001-09-30 05:09:37 +0000871}
872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873#endif /* ifdef HAVE_LONG_LONG */
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000874
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000875/* Test tuple argument processing */
876static PyObject *
877getargs_tuple(PyObject *self, PyObject *args)
878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 int a, b, c;
880 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
881 return NULL;
882 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000883}
884
Christian Heimes380f7f22008-02-28 11:19:05 +0000885/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +0000886static PyObject *
887getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +0000888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200890 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +0000892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
894 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
895 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
896 return NULL;
897 return Py_BuildValue("iiiiiiiiii",
898 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
899 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +0000900}
901
Larry Hastings83a9f482012-03-20 20:06:16 +0000902/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
903static PyObject *
904getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
905{
906 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
907 int required = -1;
908 int optional = -1;
909 int keyword_only = -1;
910
911 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
912 &required, &optional, &keyword_only))
913 return NULL;
914 return Py_BuildValue("iii", required, optional, keyword_only);
915}
916
Thomas Heller3457e4b2003-04-24 16:14:27 +0000917/* Functions to call PyArg_ParseTuple with integer format codes,
918 and return the result.
919*/
Thomas Hellera4ea6032003-04-17 18:55:45 +0000920static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000921getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000922{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 unsigned char value;
924 if (!PyArg_ParseTuple(args, "b", &value))
925 return NULL;
926 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000927}
928
Thomas Heller3457e4b2003-04-24 16:14:27 +0000929static PyObject *
930getargs_B(PyObject *self, PyObject *args)
931{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 unsigned char value;
933 if (!PyArg_ParseTuple(args, "B", &value))
934 return NULL;
935 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000936}
937
938static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +0000939getargs_h(PyObject *self, PyObject *args)
940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 short value;
942 if (!PyArg_ParseTuple(args, "h", &value))
943 return NULL;
944 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +0000945}
946
947static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000948getargs_H(PyObject *self, PyObject *args)
949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 unsigned short value;
951 if (!PyArg_ParseTuple(args, "H", &value))
952 return NULL;
953 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000954}
955
956static PyObject *
957getargs_I(PyObject *self, PyObject *args)
958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 unsigned int value;
960 if (!PyArg_ParseTuple(args, "I", &value))
961 return NULL;
962 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000963}
964
965static PyObject *
966getargs_k(PyObject *self, PyObject *args)
967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 unsigned long value;
969 if (!PyArg_ParseTuple(args, "k", &value))
970 return NULL;
971 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000972}
973
974static PyObject *
975getargs_i(PyObject *self, PyObject *args)
976{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 int value;
978 if (!PyArg_ParseTuple(args, "i", &value))
979 return NULL;
980 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000981}
982
Thomas Hellera4ea6032003-04-17 18:55:45 +0000983static PyObject *
984getargs_l(PyObject *self, PyObject *args)
985{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 long value;
987 if (!PyArg_ParseTuple(args, "l", &value))
988 return NULL;
989 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000990}
991
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000992static PyObject *
993getargs_n(PyObject *self, PyObject *args)
994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 Py_ssize_t value;
996 if (!PyArg_ParseTuple(args, "n", &value))
997 return NULL;
998 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000999}
1000
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001001static PyObject *
1002getargs_p(PyObject *self, PyObject *args)
1003{
1004 int value;
1005 if (!PyArg_ParseTuple(args, "p", &value))
1006 return NULL;
1007 return PyLong_FromLong(value);
1008}
1009
Thomas Hellera4ea6032003-04-17 18:55:45 +00001010#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +00001011static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001012getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 PY_LONG_LONG value;
1015 if (!PyArg_ParseTuple(args, "L", &value))
1016 return NULL;
1017 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001018}
1019
Thomas Hellera4ea6032003-04-17 18:55:45 +00001020static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001021getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 unsigned PY_LONG_LONG value;
1024 if (!PyArg_ParseTuple(args, "K", &value))
1025 return NULL;
1026 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001027}
1028#endif
1029
1030/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +00001031 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001032static PyObject *
1033test_k_code(PyObject *self)
1034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 PyObject *tuple, *num;
1036 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 tuple = PyTuple_New(1);
1039 if (tuple == NULL)
1040 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 /* a number larger than ULONG_MAX even on 64-bit platforms */
1043 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1044 if (num == NULL)
1045 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 value = PyLong_AsUnsignedLongMask(num);
1048 if (value != ULONG_MAX)
1049 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001050 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 value = 0;
1055 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1056 return NULL;
1057 if (value != ULONG_MAX)
1058 return raiseTestError("test_k_code",
1059 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 Py_DECREF(num);
1062 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1063 if (num == NULL)
1064 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 value = PyLong_AsUnsignedLongMask(num);
1067 if (value != (unsigned long)-0x42)
1068 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001069 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 value = 0;
1074 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1075 return NULL;
1076 if (value != (unsigned long)-0x42)
1077 return raiseTestError("test_k_code",
1078 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 Py_DECREF(tuple);
1081 Py_INCREF(Py_None);
1082 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001083}
1084
Victor Stinner06e49dd2010-06-13 18:21:50 +00001085static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001086getargs_c(PyObject *self, PyObject *args)
1087{
1088 char c;
1089 if (!PyArg_ParseTuple(args, "c", &c))
1090 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001091 return PyLong_FromLong((unsigned char)c);
1092}
1093
1094static PyObject *
1095getargs_C(PyObject *self, PyObject *args)
1096{
1097 int c;
1098 if (!PyArg_ParseTuple(args, "C", &c))
1099 return NULL;
1100 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001101}
1102
1103static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001104getargs_s(PyObject *self, PyObject *args)
1105{
1106 char *str;
1107 if (!PyArg_ParseTuple(args, "s", &str))
1108 return NULL;
1109 return PyBytes_FromString(str);
1110}
1111
1112static PyObject *
1113getargs_s_star(PyObject *self, PyObject *args)
1114{
1115 Py_buffer buffer;
1116 PyObject *bytes;
1117 if (!PyArg_ParseTuple(args, "s*", &buffer))
1118 return NULL;
1119 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1120 PyBuffer_Release(&buffer);
1121 return bytes;
1122}
1123
1124static PyObject *
1125getargs_s_hash(PyObject *self, PyObject *args)
1126{
1127 char *str;
1128 Py_ssize_t size;
1129 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1130 return NULL;
1131 return PyBytes_FromStringAndSize(str, size);
1132}
1133
1134static PyObject *
1135getargs_z(PyObject *self, PyObject *args)
1136{
1137 char *str;
1138 if (!PyArg_ParseTuple(args, "z", &str))
1139 return NULL;
1140 if (str != NULL)
1141 return PyBytes_FromString(str);
1142 else
1143 Py_RETURN_NONE;
1144}
1145
1146static PyObject *
1147getargs_z_star(PyObject *self, PyObject *args)
1148{
1149 Py_buffer buffer;
1150 PyObject *bytes;
1151 if (!PyArg_ParseTuple(args, "z*", &buffer))
1152 return NULL;
1153 if (buffer.buf != NULL)
1154 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1155 else {
1156 Py_INCREF(Py_None);
1157 bytes = Py_None;
1158 }
1159 PyBuffer_Release(&buffer);
1160 return bytes;
1161}
1162
1163static PyObject *
1164getargs_z_hash(PyObject *self, PyObject *args)
1165{
1166 char *str;
1167 Py_ssize_t size;
1168 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1169 return NULL;
1170 if (str != NULL)
1171 return PyBytes_FromStringAndSize(str, size);
1172 else
1173 Py_RETURN_NONE;
1174}
1175
1176static PyObject *
1177getargs_y(PyObject *self, PyObject *args)
1178{
1179 char *str;
1180 if (!PyArg_ParseTuple(args, "y", &str))
1181 return NULL;
1182 return PyBytes_FromString(str);
1183}
1184
1185static PyObject *
1186getargs_y_star(PyObject *self, PyObject *args)
1187{
1188 Py_buffer buffer;
1189 PyObject *bytes;
1190 if (!PyArg_ParseTuple(args, "y*", &buffer))
1191 return NULL;
1192 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1193 PyBuffer_Release(&buffer);
1194 return bytes;
1195}
1196
1197static PyObject *
1198getargs_y_hash(PyObject *self, PyObject *args)
1199{
1200 char *str;
1201 Py_ssize_t size;
1202 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1203 return NULL;
1204 return PyBytes_FromStringAndSize(str, size);
1205}
1206
1207static PyObject *
1208getargs_u(PyObject *self, PyObject *args)
1209{
1210 Py_UNICODE *str;
1211 Py_ssize_t size;
1212 if (!PyArg_ParseTuple(args, "u", &str))
1213 return NULL;
1214 size = Py_UNICODE_strlen(str);
1215 return PyUnicode_FromUnicode(str, size);
1216}
1217
1218static PyObject *
1219getargs_u_hash(PyObject *self, PyObject *args)
1220{
1221 Py_UNICODE *str;
1222 Py_ssize_t size;
1223 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1224 return NULL;
1225 return PyUnicode_FromUnicode(str, size);
1226}
1227
1228static PyObject *
1229getargs_Z(PyObject *self, PyObject *args)
1230{
1231 Py_UNICODE *str;
1232 Py_ssize_t size;
1233 if (!PyArg_ParseTuple(args, "Z", &str))
1234 return NULL;
1235 if (str != NULL) {
1236 size = Py_UNICODE_strlen(str);
1237 return PyUnicode_FromUnicode(str, size);
1238 } else
1239 Py_RETURN_NONE;
1240}
1241
1242static PyObject *
1243getargs_Z_hash(PyObject *self, PyObject *args)
1244{
1245 Py_UNICODE *str;
1246 Py_ssize_t size;
1247 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1248 return NULL;
1249 if (str != NULL)
1250 return PyUnicode_FromUnicode(str, size);
1251 else
1252 Py_RETURN_NONE;
1253}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001254
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001255static PyObject *
1256getargs_es(PyObject *self, PyObject *args)
1257{
1258 PyObject *arg, *result;
1259 const char *encoding = NULL;
1260 char *str;
1261
1262 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1263 return NULL;
1264 if (!PyArg_Parse(arg, "es", encoding, &str))
1265 return NULL;
1266 result = PyBytes_FromString(str);
1267 PyMem_Free(str);
1268 return result;
1269}
1270
1271static PyObject *
1272getargs_et(PyObject *self, PyObject *args)
1273{
1274 PyObject *arg, *result;
1275 const char *encoding = NULL;
1276 char *str;
1277
1278 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1279 return NULL;
1280 if (!PyArg_Parse(arg, "et", encoding, &str))
1281 return NULL;
1282 result = PyBytes_FromString(str);
1283 PyMem_Free(str);
1284 return result;
1285}
1286
1287static PyObject *
1288getargs_es_hash(PyObject *self, PyObject *args)
1289{
1290 PyObject *arg, *result;
1291 const char *encoding = NULL;
1292 PyByteArrayObject *buffer = NULL;
1293 char *str = NULL;
1294 Py_ssize_t size;
1295
1296 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1297 return NULL;
1298 if (buffer != NULL) {
1299 str = PyByteArray_AS_STRING(buffer);
1300 size = PyByteArray_GET_SIZE(buffer);
1301 }
1302 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1303 return NULL;
1304 result = PyBytes_FromStringAndSize(str, size);
1305 if (buffer == NULL)
1306 PyMem_Free(str);
1307 return result;
1308}
1309
1310static PyObject *
1311getargs_et_hash(PyObject *self, PyObject *args)
1312{
1313 PyObject *arg, *result;
1314 const char *encoding = NULL;
1315 PyByteArrayObject *buffer = NULL;
1316 char *str = NULL;
1317 Py_ssize_t size;
1318
1319 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1320 return NULL;
1321 if (buffer != NULL) {
1322 str = PyByteArray_AS_STRING(buffer);
1323 size = PyByteArray_GET_SIZE(buffer);
1324 }
1325 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1326 return NULL;
1327 result = PyBytes_FromStringAndSize(str, size);
1328 if (buffer == NULL)
1329 PyMem_Free(str);
1330 return result;
1331}
1332
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001333/* Test the s and z codes for PyArg_ParseTuple.
1334*/
1335static PyObject *
1336test_s_code(PyObject *self)
1337{
1338 /* Unicode strings should be accepted */
1339 PyObject *tuple, *obj;
1340 char *value;
1341
1342 tuple = PyTuple_New(1);
1343 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001345
1346 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001348 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001350
1351 PyTuple_SET_ITEM(tuple, 0, obj);
1352
1353 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001355 */
1356 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001358
1359 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001361
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001362 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001363 Py_RETURN_NONE;
1364}
1365
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001366static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001367parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001368{
Larry Hastings8f904da2012-06-22 03:56:29 -07001369 PyObject *sub_args;
1370 PyObject *sub_kwargs;
1371 char *sub_format;
1372 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001373
Larry Hastings8f904da2012-06-22 03:56:29 -07001374 Py_ssize_t i, size;
1375 char *keywords[8 + 1]; /* space for NULL at end */
1376 PyObject *o;
1377 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001378
Larry Hastings8f904da2012-06-22 03:56:29 -07001379 int result;
1380 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001381
Larry Hastings22701e82012-08-08 14:52:22 -07001382 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001383
Larry Hastings8f904da2012-06-22 03:56:29 -07001384 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1385 &sub_args, &sub_kwargs,
1386 &sub_format, &sub_keywords))
1387 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001388
Larry Hastings8f904da2012-06-22 03:56:29 -07001389 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1390 PyErr_SetString(PyExc_ValueError,
1391 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1392 return NULL;
1393 }
1394
1395 memset(buffers, 0, sizeof(buffers));
1396 memset(converted, 0, sizeof(converted));
1397 memset(keywords, 0, sizeof(keywords));
1398
1399 size = PySequence_Fast_GET_SIZE(sub_keywords);
1400 if (size > 8) {
1401 PyErr_SetString(PyExc_ValueError,
1402 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1403 goto exit;
1404 }
1405
1406 for (i = 0; i < size; i++) {
1407 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1408 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1409 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001410 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001411 goto exit;
1412 }
1413 keywords[i] = PyBytes_AS_STRING(converted[i]);
1414 }
1415
1416 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1417 sub_format, keywords,
1418 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1419 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1420
1421 if (result) {
1422 return_value = Py_None;
1423 Py_INCREF(Py_None);
1424 }
1425
1426exit:
1427 size = sizeof(converted) / sizeof(converted[0]);
1428 for (i = 0; i < size; i++) {
1429 Py_XDECREF(converted[i]);
1430 }
1431 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001432}
1433
Benjamin Peterson92035012008-12-27 16:00:54 +00001434static volatile int x;
1435
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001436/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1437 of an error.
1438*/
1439static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001440test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001441{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 PyObject *tuple, *obj;
1443 Py_UNICODE *value;
1444 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1447 /* Just use the macro and check that it compiles */
1448 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 tuple = PyTuple_New(1);
1451 if (tuple == NULL)
1452 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 obj = PyUnicode_Decode("test", strlen("test"),
1455 "ascii", NULL);
1456 if (obj == NULL)
1457 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 value = 0;
1462 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1463 return NULL;
1464 if (value != PyUnicode_AS_UNICODE(obj))
1465 return raiseTestError("test_u_code",
1466 "u code returned wrong value for u'test'");
1467 value = 0;
1468 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1469 return NULL;
1470 if (value != PyUnicode_AS_UNICODE(obj) ||
1471 len != PyUnicode_GET_SIZE(obj))
1472 return raiseTestError("test_u_code",
1473 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 Py_DECREF(tuple);
1476 Py_INCREF(Py_None);
1477 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001478}
1479
Guido van Rossumfb67be22007-08-29 18:38:11 +00001480/* Test Z and Z# codes for PyArg_ParseTuple */
1481static PyObject *
1482test_Z_code(PyObject *self)
1483{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001485 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 tuple = PyTuple_New(2);
1489 if (tuple == NULL)
1490 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 obj = PyUnicode_FromString("test");
1493 PyTuple_SET_ITEM(tuple, 0, obj);
1494 Py_INCREF(Py_None);
1495 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 /* swap values on purpose */
1498 value1 = NULL;
1499 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 /* Test Z for both values */
1502 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1503 return NULL;
1504 if (value1 != PyUnicode_AS_UNICODE(obj))
1505 return raiseTestError("test_Z_code",
1506 "Z code returned wrong value for 'test'");
1507 if (value2 != NULL)
1508 return raiseTestError("test_Z_code",
1509 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 value1 = NULL;
1512 value2 = PyUnicode_AS_UNICODE(obj);
1513 len1 = -1;
1514 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 /* Test Z# for both values */
1517 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1518 &value2, &len2) < 0)
1519 return NULL;
1520 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1521 len1 != PyUnicode_GET_SIZE(obj))
1522 return raiseTestError("test_Z_code",
1523 "Z# code returned wrong values for 'test'");
1524 if (value2 != NULL ||
1525 len2 != 0)
1526 return raiseTestError("test_Z_code",
1527 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 Py_DECREF(tuple);
1530 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001531}
1532
Thomas Wouters477c8d52006-05-27 19:21:47 +00001533static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001534test_widechar(PyObject *self)
1535{
1536#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1538 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001539 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001540#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1542 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001543#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1547 if (wide == NULL)
1548 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1551 if (utf8 == NULL) {
1552 Py_DECREF(wide);
1553 return NULL;
1554 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001555
Victor Stinner8ef18872011-11-21 02:06:57 +01001556 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 Py_DECREF(wide);
1558 Py_DECREF(utf8);
1559 return raiseTestError("test_widechar",
1560 "wide string and utf8 string "
1561 "have different length");
1562 }
1563 if (PyUnicode_Compare(wide, utf8)) {
1564 Py_DECREF(wide);
1565 Py_DECREF(utf8);
1566 if (PyErr_Occurred())
1567 return NULL;
1568 return raiseTestError("test_widechar",
1569 "wide string and utf8 string "
1570 "are different");
1571 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 Py_DECREF(wide);
1574 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001575
1576#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1577 wide = PyUnicode_FromWideChar(invalid, 1);
1578 if (wide == NULL)
1579 PyErr_Clear();
1580 else
1581 return raiseTestError("test_widechar",
1582 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1583
1584 wide = PyUnicode_FromUnicode(invalid, 1);
1585 if (wide == NULL)
1586 PyErr_Clear();
1587 else
1588 return raiseTestError("test_widechar",
1589 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001590
1591 wide = PyUnicode_FromUnicode(NULL, 1);
1592 if (wide == NULL)
1593 return NULL;
1594 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001595 if (_PyUnicode_Ready(wide) < 0) {
1596 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001597 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001598 }
1599 else {
1600 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001601 return raiseTestError("test_widechar",
1602 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001603 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001604#endif
1605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001607}
1608
1609static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001610unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001611{
1612 PyObject *unicode, *result;
1613 Py_ssize_t buflen, size;
1614 wchar_t *buffer;
1615
1616 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1617 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001618 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001619 if (buffer == NULL)
1620 return PyErr_NoMemory();
1621
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001622 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001623 if (size == -1) {
1624 PyMem_Free(buffer);
1625 return NULL;
1626 }
1627
1628 if (size < buflen)
1629 buflen = size + 1;
1630 else
1631 buflen = size;
1632 result = PyUnicode_FromWideChar(buffer, buflen);
1633 PyMem_Free(buffer);
1634 if (result == NULL)
1635 return NULL;
1636
1637 return Py_BuildValue("(Nn)", result, size);
1638}
1639
1640static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001641unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001642{
1643 PyObject *unicode, *result;
1644 Py_ssize_t size;
1645 wchar_t *buffer;
1646
1647 if (!PyArg_ParseTuple(args, "U", &unicode))
1648 return NULL;
1649
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001650 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001651 if (buffer == NULL)
1652 return NULL;
1653
1654 result = PyUnicode_FromWideChar(buffer, size + 1);
1655 PyMem_Free(buffer);
1656 if (result == NULL)
1657 return NULL;
1658 return Py_BuildValue("(Nn)", result, size);
1659}
1660
1661static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001662unicode_encodedecimal(PyObject *self, PyObject *args)
1663{
1664 Py_UNICODE *unicode;
1665 Py_ssize_t length;
1666 char *errors = NULL;
1667 PyObject *decimal;
1668 Py_ssize_t decimal_length, new_length;
1669 int res;
1670
1671 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1672 return NULL;
1673
1674 decimal_length = length * 7; /* len('&#8364;') */
1675 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1676 if (decimal == NULL)
1677 return NULL;
1678
1679 res = PyUnicode_EncodeDecimal(unicode, length,
1680 PyBytes_AS_STRING(decimal),
1681 errors);
1682 if (res < 0) {
1683 Py_DECREF(decimal);
1684 return NULL;
1685 }
1686
1687 new_length = strlen(PyBytes_AS_STRING(decimal));
1688 assert(new_length <= decimal_length);
1689 res = _PyBytes_Resize(&decimal, new_length);
1690 if (res < 0)
1691 return NULL;
1692
1693 return decimal;
1694}
1695
1696static PyObject *
1697unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1698{
1699 Py_UNICODE *unicode;
1700 Py_ssize_t length;
1701 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1702 return NULL;
1703 return PyUnicode_TransformDecimalToASCII(unicode, length);
1704}
1705
1706static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001707unicode_legacy_string(PyObject *self, PyObject *args)
1708{
1709 Py_UNICODE *data;
1710 Py_ssize_t len;
1711 PyObject *u;
1712
1713 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1714 return NULL;
1715
1716 u = PyUnicode_FromUnicode(NULL, len);
1717 if (u == NULL)
1718 return NULL;
1719
1720 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1721
1722 if (len > 0) { /* The empty string is always ready. */
1723 assert(!PyUnicode_IS_READY(u));
1724 }
1725
1726 return u;
1727}
1728
1729static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001730getargs_w_star(PyObject *self, PyObject *args)
1731{
1732 Py_buffer buffer;
1733 PyObject *result;
1734 char *str;
1735
1736 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1737 return NULL;
1738
1739 if (2 <= buffer.len) {
1740 str = buffer.buf;
1741 str[0] = '[';
1742 str[buffer.len-1] = ']';
1743 }
1744
1745 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1746 PyBuffer_Release(&buffer);
1747 return result;
1748}
1749
1750
1751static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001752test_empty_argparse(PyObject *self)
1753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 /* Test that formats can begin with '|'. See issue #4720. */
1755 PyObject *tuple, *dict = NULL;
1756 static char *kwlist[] = {NULL};
1757 int result;
1758 tuple = PyTuple_New(0);
1759 if (!tuple)
1760 return NULL;
1761 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1762 goto done;
1763 dict = PyDict_New();
1764 if (!dict)
1765 goto done;
1766 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00001767 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 Py_DECREF(tuple);
1769 Py_XDECREF(dict);
1770 if (result < 0)
1771 return NULL;
1772 else {
1773 Py_RETURN_NONE;
1774 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001775}
1776
1777static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001778codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001779{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 const char *encoding, *errors = NULL;
1781 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1782 &encoding, &errors))
1783 return NULL;
1784 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001785}
1786
Thomas Wouters477c8d52006-05-27 19:21:47 +00001787static PyObject *
1788codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001789{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 const char *encoding, *errors = NULL;
1791 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1792 &encoding, &errors))
1793 return NULL;
1794 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001795}
1796
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001797
Tim Peters5b8132f2003-01-31 15:52:05 +00001798/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001799static PyObject *
1800test_long_numbits(PyObject *self)
1801{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 struct triple {
1803 long input;
1804 size_t nbits;
1805 int sign;
1806 } testcases[] = {{0, 0, 0},
1807 {1L, 1, 1},
1808 {-1L, 1, -1},
1809 {2L, 2, 1},
1810 {-2L, 2, -1},
1811 {3L, 2, 1},
1812 {-3L, 2, -1},
1813 {4L, 3, 1},
1814 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03001815 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 {-0x7fffL, 15, -1},
1817 {0xffffL, 16, 1},
1818 {-0xffffL, 16, -1},
1819 {0xfffffffL, 28, 1},
1820 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02001821 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001822
Victor Stinner63941882011-09-29 00:42:28 +02001823 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02001824 size_t nbits;
1825 int sign;
1826 PyObject *plong;
1827
1828 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02001829 if (plong == NULL)
1830 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02001831 nbits = _PyLong_NumBits(plong);
1832 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 Py_DECREF(plong);
1835 if (nbits != testcases[i].nbits)
1836 return raiseTestError("test_long_numbits",
1837 "wrong result for _PyLong_NumBits");
1838 if (sign != testcases[i].sign)
1839 return raiseTestError("test_long_numbits",
1840 "wrong result for _PyLong_Sign");
1841 }
1842 Py_INCREF(Py_None);
1843 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001844}
1845
Thomas Heller519a0422007-11-15 20:48:54 +00001846/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00001847
1848static PyObject *
1849test_null_strings(PyObject *self)
1850{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
1852 PyObject *tuple = PyTuple_Pack(2, o1, o2);
1853 Py_XDECREF(o1);
1854 Py_XDECREF(o2);
1855 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00001856}
1857
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001858static PyObject *
1859raise_exception(PyObject *self, PyObject *args)
1860{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 PyObject *exc;
1862 PyObject *exc_args, *v;
1863 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
1866 &exc, &num_args))
1867 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 exc_args = PyTuple_New(num_args);
1870 if (exc_args == NULL)
1871 return NULL;
1872 for (i = 0; i < num_args; ++i) {
1873 v = PyLong_FromLong(i);
1874 if (v == NULL) {
1875 Py_DECREF(exc_args);
1876 return NULL;
1877 }
1878 PyTuple_SET_ITEM(exc_args, i, v);
1879 }
1880 PyErr_SetObject(exc, exc_args);
1881 Py_DECREF(exc_args);
1882 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001883}
Tim Peters91621db2001-06-12 20:10:01 +00001884
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02001885static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02001886set_errno(PyObject *self, PyObject *args)
1887{
1888 int new_errno;
1889
1890 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
1891 return NULL;
1892
1893 errno = new_errno;
1894 Py_RETURN_NONE;
1895}
1896
1897static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02001898test_set_exc_info(PyObject *self, PyObject *args)
1899{
1900 PyObject *orig_exc;
1901 PyObject *new_type, *new_value, *new_tb;
1902 PyObject *type, *value, *tb;
1903 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
1904 &new_type, &new_value, &new_tb))
1905 return NULL;
1906
1907 PyErr_GetExcInfo(&type, &value, &tb);
1908
1909 Py_INCREF(new_type);
1910 Py_INCREF(new_value);
1911 Py_INCREF(new_tb);
1912 PyErr_SetExcInfo(new_type, new_value, new_tb);
1913
1914 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
1915 Py_XDECREF(type);
1916 Py_XDECREF(value);
1917 Py_XDECREF(tb);
1918 return orig_exc;
1919}
Benjamin Peterson16323982010-02-03 01:13:41 +00001920
1921static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001922
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001923static PyObject *
1924test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 if (PyDateTimeAPI) {
1926 if (test_run_counter) {
1927 /* Probably regrtest.py -R */
1928 Py_RETURN_NONE;
1929 }
1930 else {
1931 PyErr_SetString(PyExc_AssertionError,
1932 "PyDateTime_CAPI somehow initialized");
1933 return NULL;
1934 }
1935 }
1936 test_run_counter++;
1937 PyDateTime_IMPORT;
1938 if (PyDateTimeAPI)
1939 Py_RETURN_NONE;
1940 else
1941 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001942}
1943
Benjamin Peterson16323982010-02-03 01:13:41 +00001944
1945#ifdef WITH_THREAD
1946
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001947/* test_thread_state spawns a thread of its own, and that thread releases
1948 * `thread_done` when it's finished. The driver code has to know when the
1949 * thread finishes, because the thread uses a PyObject (the callable) that
1950 * may go away when the driver finishes. The former lack of this explicit
1951 * synchronization caused rare segfaults, so rare that they were seen only
1952 * on a Mac buildbot (although they were possible on any box).
1953 */
1954static PyThread_type_lock thread_done = NULL;
1955
Benjamin Petersona786b022008-08-25 21:05:21 +00001956static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001957_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 PyObject *rc;
1960 int success;
1961 PyGILState_STATE s = PyGILState_Ensure();
1962 rc = PyObject_CallFunction((PyObject *)callable, "");
1963 success = (rc != NULL);
1964 Py_XDECREF(rc);
1965 PyGILState_Release(s);
1966 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001967}
1968
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001969/* Same thing, but releases `thread_done` when it returns. This variant
1970 * should be called only from threads spawned by test_thread_state().
1971 */
1972static void
1973_make_call_from_thread(void *callable)
1974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 _make_call(callable);
1976 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001977}
1978
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001979static PyObject *
1980test_thread_state(PyObject *self, PyObject *args)
1981{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 PyObject *fn;
1983 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1986 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 if (!PyCallable_Check(fn)) {
1989 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1990 fn->ob_type->tp_name);
1991 return NULL;
1992 }
Benjamin Petersona786b022008-08-25 21:05:21 +00001993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 /* Ensure Python is set up for threading */
1995 PyEval_InitThreads();
1996 thread_done = PyThread_allocate_lock();
1997 if (thread_done == NULL)
1998 return PyErr_NoMemory();
1999 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 /* Start a new thread with our callback. */
2002 PyThread_start_new_thread(_make_call_from_thread, fn);
2003 /* Make the callback with the thread lock held by this thread */
2004 success &= _make_call(fn);
2005 /* Do it all again, but this time with the thread-lock released */
2006 Py_BEGIN_ALLOW_THREADS
2007 success &= _make_call(fn);
2008 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2009 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 /* And once more with and without a thread
2012 XXX - should use a lock and work out exactly what we are trying
2013 to test <wink>
2014 */
2015 Py_BEGIN_ALLOW_THREADS
2016 PyThread_start_new_thread(_make_call_from_thread, fn);
2017 success &= _make_call(fn);
2018 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2019 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 /* Release lock we acquired above. This is required on HP-UX. */
2022 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 PyThread_free_lock(thread_done);
2025 if (!success)
2026 return NULL;
2027 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002028}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002029
2030/* test Py_AddPendingCalls using threads */
2031static int _pending_callback(void *arg)
2032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 /* we assume the argument is callable object to which we own a reference */
2034 PyObject *callable = (PyObject *)arg;
2035 PyObject *r = PyObject_CallObject(callable, NULL);
2036 Py_DECREF(callable);
2037 Py_XDECREF(r);
2038 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002039}
2040
2041/* The following requests n callbacks to _pending_callback. It can be
2042 * run from any python thread.
2043 */
2044PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
2045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 PyObject *callable;
2047 int r;
2048 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2049 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 /* create the reference for the callbackwhile we hold the lock */
2052 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 Py_BEGIN_ALLOW_THREADS
2055 r = Py_AddPendingCall(&_pending_callback, callable);
2056 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 if (r<0) {
2059 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
2060 Py_INCREF(Py_False);
2061 return Py_False;
2062 }
2063 Py_INCREF(Py_True);
2064 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002065}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002066#endif
2067
Neal Norwitzb0d26332007-08-25 00:49:05 +00002068/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002069static PyObject *
2070test_string_from_format(PyObject *self, PyObject *args)
2071{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 PyObject *result;
2073 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002074
Alexander Belopolskye239d232010-12-08 23:31:48 +00002075#define CHECK_1_FORMAT(FORMAT, TYPE) \
2076 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2077 if (result == NULL) \
2078 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01002079 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002080 msg = FORMAT " failed at 1"; \
2081 goto Fail; \
2082 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 CHECK_1_FORMAT("%d", int);
2086 CHECK_1_FORMAT("%ld", long);
2087 /* The z width modifier was added in Python 2.5. */
2088 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 /* The u type code was added in Python 2.5. */
2091 CHECK_1_FORMAT("%u", unsigned int);
2092 CHECK_1_FORMAT("%lu", unsigned long);
2093 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002096#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
2098 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002099#endif
2100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002102
2103 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 Py_XDECREF(result);
2105 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002106
2107#undef CHECK_1_FORMAT
2108}
2109
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002110
2111static PyObject *
2112test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2114 int result;
2115 if (py_s == NULL)
2116 return NULL;
2117 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2118 Py_DECREF(py_s);
2119 if (!result) {
2120 PyErr_SetString(TestError, "Python string ending in NULL "
2121 "should not compare equal to c string.");
2122 return NULL;
2123 }
2124 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002125}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002126
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002127/* This is here to provide a docstring for test_descr. */
2128static PyObject *
2129test_with_docstring(PyObject *self)
2130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002132}
2133
Mark Dickinson725bfd82009-05-03 20:33:40 +00002134/* Test PyOS_string_to_double. */
2135static PyObject *
2136test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 double result;
2138 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140#define CHECK_STRING(STR, expected) \
2141 result = PyOS_string_to_double(STR, NULL, NULL); \
2142 if (result == -1.0 && PyErr_Occurred()) \
2143 return NULL; \
2144 if (result != expected) { \
2145 msg = "conversion of " STR " to float failed"; \
2146 goto fail; \
2147 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149#define CHECK_INVALID(STR) \
2150 result = PyOS_string_to_double(STR, NULL, NULL); \
2151 if (result == -1.0 && PyErr_Occurred()) { \
2152 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2153 PyErr_Clear(); \
2154 else \
2155 return NULL; \
2156 } \
2157 else { \
2158 msg = "conversion of " STR " didn't raise ValueError"; \
2159 goto fail; \
2160 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 CHECK_STRING("0.1", 0.1);
2163 CHECK_STRING("1.234", 1.234);
2164 CHECK_STRING("-1.35", -1.35);
2165 CHECK_STRING(".1e01", 1.0);
2166 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 CHECK_INVALID(" 0.1");
2169 CHECK_INVALID("\t\n-3");
2170 CHECK_INVALID(".123 ");
2171 CHECK_INVALID("3\n");
2172 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002175 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002176 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002177#undef CHECK_STRING
2178#undef CHECK_INVALID
2179}
2180
2181
Benjamin Petersonb173f782009-05-05 22:31:58 +00002182/* Coverage testing of capsule objects. */
2183
2184static const char *capsule_name = "capsule name";
2185static char *capsule_pointer = "capsule pointer";
2186static char *capsule_context = "capsule context";
2187static const char *capsule_error = NULL;
2188static int
2189capsule_destructor_call_count = 0;
2190
2191static void
2192capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002193 capsule_destructor_call_count++;
2194 if (PyCapsule_GetContext(o) != capsule_context) {
2195 capsule_error = "context did not match in destructor!";
2196 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2197 capsule_error = "destructor did not match in destructor! (woah!)";
2198 } else if (PyCapsule_GetName(o) != capsule_name) {
2199 capsule_error = "name did not match in destructor!";
2200 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2201 capsule_error = "pointer did not match in destructor!";
2202 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002203}
2204
2205typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 char *name;
2207 char *module;
2208 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002209} known_capsule;
2210
2211static PyObject *
2212test_capsule(PyObject *self, PyObject *args)
2213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214 PyObject *object;
2215 const char *error = NULL;
2216 void *pointer;
2217 void *pointer2;
2218 known_capsule known_capsules[] = {
2219 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2220 KNOWN_CAPSULE("_socket", "CAPI"),
2221 KNOWN_CAPSULE("_curses", "_C_API"),
2222 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2223 { NULL, NULL },
2224 };
2225 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002226
2227#define FAIL(x) { error = (x); goto exit; }
2228
2229#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 if (capsule_error) { \
2231 FAIL(capsule_error); \
2232 } \
2233 else if (!capsule_destructor_call_count) { \
2234 FAIL("destructor not called!"); \
2235 } \
2236 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2239 PyCapsule_SetContext(object, capsule_context);
2240 capsule_destructor(object);
2241 CHECK_DESTRUCTOR;
2242 Py_DECREF(object);
2243 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 object = PyCapsule_New(known, "ignored", NULL);
2246 PyCapsule_SetPointer(object, capsule_pointer);
2247 PyCapsule_SetName(object, capsule_name);
2248 PyCapsule_SetDestructor(object, capsule_destructor);
2249 PyCapsule_SetContext(object, capsule_context);
2250 capsule_destructor(object);
2251 CHECK_DESTRUCTOR;
2252 /* intentionally access using the wrong name */
2253 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2254 if (!PyErr_Occurred()) {
2255 FAIL("PyCapsule_GetPointer should have failed but did not!");
2256 }
2257 PyErr_Clear();
2258 if (pointer2) {
2259 if (pointer2 == capsule_pointer) {
2260 FAIL("PyCapsule_GetPointer should not have"
2261 " returned the internal pointer!");
2262 } else {
2263 FAIL("PyCapsule_GetPointer should have "
2264 "returned NULL pointer but did not!");
2265 }
2266 }
2267 PyCapsule_SetDestructor(object, NULL);
2268 Py_DECREF(object);
2269 if (capsule_destructor_call_count) {
2270 FAIL("destructor called when it should not have been!");
2271 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 for (known = &known_capsules[0]; known->module != NULL; known++) {
2274 /* yeah, ordinarily I wouldn't do this either,
2275 but it's fine for this test harness.
2276 */
2277 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002278#undef FAIL
2279#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 { \
2281 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2282 x, known->module, known->attribute); \
2283 error = buffer; \
2284 goto exit; \
2285 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287 PyObject *module = PyImport_ImportModule(known->module);
2288 if (module) {
2289 pointer = PyCapsule_Import(known->name, 0);
2290 if (!pointer) {
2291 Py_DECREF(module);
2292 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2293 }
2294 object = PyObject_GetAttrString(module, known->attribute);
2295 if (!object) {
2296 Py_DECREF(module);
2297 return NULL;
2298 }
2299 pointer2 = PyCapsule_GetPointer(object,
2300 "weebles wobble but they don't fall down");
2301 if (!PyErr_Occurred()) {
2302 Py_DECREF(object);
2303 Py_DECREF(module);
2304 FAIL("PyCapsule_GetPointer should have failed but did not!");
2305 }
2306 PyErr_Clear();
2307 if (pointer2) {
2308 Py_DECREF(module);
2309 Py_DECREF(object);
2310 if (pointer2 == pointer) {
2311 FAIL("PyCapsule_GetPointer should not have"
2312 " returned its internal pointer!");
2313 } else {
2314 FAIL("PyCapsule_GetPointer should have"
2315 " returned NULL pointer but did not!");
2316 }
2317 }
2318 Py_DECREF(object);
2319 Py_DECREF(module);
2320 }
2321 else
2322 PyErr_Clear();
2323 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002324
2325 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 if (error) {
2327 return raiseTestError("test_capsule", error);
2328 }
2329 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002330#undef FAIL
2331}
2332
Guido van Rossumddefaf32007-01-14 03:31:43 +00002333#ifdef HAVE_GETTIMEOFDAY
2334/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002335static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002336{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 e->tv_sec -= s->tv_sec;
2338 e->tv_usec -= s->tv_usec;
2339 if (e->tv_usec < 0) {
2340 e->tv_sec -=1;
2341 e->tv_usec += 1000000;
2342 }
2343 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002344}
2345
2346static PyObject *
2347profile_int(PyObject *self, PyObject* args)
2348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 int i, k;
2350 struct timeval start, stop;
2351 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 /* Test 1: Allocate and immediately deallocate
2354 many small integers */
2355 gettimeofday(&start, NULL);
2356 for(k=0; k < 20000; k++)
2357 for(i=0; i < 1000; i++) {
2358 single = PyLong_FromLong(i);
2359 Py_DECREF(single);
2360 }
2361 gettimeofday(&stop, NULL);
2362 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 /* Test 2: Allocate and immediately deallocate
2365 many large integers */
2366 gettimeofday(&start, NULL);
2367 for(k=0; k < 20000; k++)
2368 for(i=0; i < 1000; i++) {
2369 single = PyLong_FromLong(i+1000000);
2370 Py_DECREF(single);
2371 }
2372 gettimeofday(&stop, NULL);
2373 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 /* Test 3: Allocate a few integers, then release
2376 them all simultaneously. */
2377 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002378 if (multiple == NULL)
2379 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 gettimeofday(&start, NULL);
2381 for(k=0; k < 20000; k++) {
2382 for(i=0; i < 1000; i++) {
2383 multiple[i] = PyLong_FromLong(i+1000000);
2384 }
2385 for(i=0; i < 1000; i++) {
2386 Py_DECREF(multiple[i]);
2387 }
2388 }
2389 gettimeofday(&stop, NULL);
2390 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002391 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393 /* Test 4: Allocate many integers, then release
2394 them all simultaneously. */
2395 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002396 if (multiple == NULL)
2397 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 gettimeofday(&start, NULL);
2399 for(k=0; k < 20; k++) {
2400 for(i=0; i < 1000000; i++) {
2401 multiple[i] = PyLong_FromLong(i+1000000);
2402 }
2403 for(i=0; i < 1000000; i++) {
2404 Py_DECREF(multiple[i]);
2405 }
2406 }
2407 gettimeofday(&stop, NULL);
2408 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002409 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 /* Test 5: Allocate many integers < 32000 */
2412 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002413 if (multiple == NULL)
2414 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 gettimeofday(&start, NULL);
2416 for(k=0; k < 10; k++) {
2417 for(i=0; i < 1000000; i++) {
2418 multiple[i] = PyLong_FromLong(i+1000);
2419 }
2420 for(i=0; i < 1000000; i++) {
2421 Py_DECREF(multiple[i]);
2422 }
2423 }
2424 gettimeofday(&stop, NULL);
2425 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002426 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 /* Test 6: Perform small int addition */
2429 op1 = PyLong_FromLong(1);
2430 gettimeofday(&start, NULL);
2431 for(i=0; i < 10000000; i++) {
2432 result = PyNumber_Add(op1, op1);
2433 Py_DECREF(result);
2434 }
2435 gettimeofday(&stop, NULL);
2436 Py_DECREF(op1);
2437 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 /* Test 7: Perform medium int addition */
2440 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002441 if (op1 == NULL)
2442 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 gettimeofday(&start, NULL);
2444 for(i=0; i < 10000000; i++) {
2445 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002446 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 }
2448 gettimeofday(&stop, NULL);
2449 Py_DECREF(op1);
2450 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 Py_INCREF(Py_None);
2453 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002454}
2455#endif
2456
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002457/* To test the format of tracebacks as printed out. */
2458static PyObject *
2459traceback_print(PyObject *self, PyObject *args)
2460{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 PyObject *file;
2462 PyObject *traceback;
2463 int result;
2464
2465 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2466 &traceback, &file))
2467 return NULL;
2468
2469 result = PyTraceBack_Print(traceback, file);
2470 if (result < 0)
2471 return NULL;
2472 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002473}
2474
Benjamin Petersone6528212008-07-15 15:32:09 +00002475/* To test the format of exceptions as printed out. */
2476static PyObject *
2477exception_print(PyObject *self, PyObject *args)
2478{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 PyObject *value;
2480 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 if (!PyArg_ParseTuple(args, "O:exception_print",
2483 &value))
2484 return NULL;
2485 if (!PyExceptionInstance_Check(value)) {
2486 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2487 return NULL;
2488 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 tb = PyException_GetTraceback(value);
2491 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2492 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002495}
2496
2497
2498
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002499
2500/* reliably raise a MemoryError */
2501static PyObject *
2502raise_memoryerror(PyObject *self)
2503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 PyErr_NoMemory();
2505 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002506}
2507
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002508/* Issue 6012 */
2509static PyObject *str1, *str2;
2510static int
2511failing_converter(PyObject *obj, void *arg)
2512{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 /* Clone str1, then let the conversion fail. */
2514 assert(str1);
2515 str2 = str1;
2516 Py_INCREF(str2);
2517 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002518}
2519static PyObject*
2520argparsing(PyObject *o, PyObject *args)
2521{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522 PyObject *res;
2523 str1 = str2 = NULL;
2524 if (!PyArg_ParseTuple(args, "O&O&",
2525 PyUnicode_FSConverter, &str1,
2526 failing_converter, &str2)) {
2527 if (!str2)
2528 /* argument converter not called? */
2529 return NULL;
2530 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002531 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 Py_DECREF(str2);
2533 PyErr_Clear();
2534 return res;
2535 }
2536 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002537}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002538
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002539/* To test that the result of PyCode_NewEmpty has the right members. */
2540static PyObject *
2541code_newempty(PyObject *self, PyObject *args)
2542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 const char *filename;
2544 const char *funcname;
2545 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002547 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2548 &filename, &funcname, &firstlineno))
2549 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002552}
2553
Georg Brandl1e28a272009-12-28 08:41:01 +00002554/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2555 Run via Lib/test/test_exceptions.py */
2556static PyObject *
2557make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2558{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 const char *name;
2560 const char *doc = NULL;
2561 PyObject *base = NULL;
2562 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2567 "s|sOO:make_exception_with_doc", kwlist,
2568 &name, &doc, &base, &dict))
2569 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002572}
2573
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002574static PyObject *
2575make_memoryview_from_NULL_pointer(PyObject *self)
2576{
2577 Py_buffer info;
2578 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2579 return NULL;
2580 return PyMemoryView_FromBuffer(&info);
2581}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002582
Stefan Krah7213fcc2015-02-01 16:19:23 +01002583static PyObject *
2584test_from_contiguous(PyObject* self, PyObject *noargs)
2585{
2586 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2587 int init[5] = {0, 1, 2, 3, 4};
2588 Py_ssize_t itemsize = sizeof(int);
2589 Py_ssize_t shape = 5;
2590 Py_ssize_t strides = 2 * itemsize;
2591 Py_buffer view = {
2592 data,
2593 NULL,
2594 5 * itemsize,
2595 itemsize,
2596 1,
2597 1,
2598 NULL,
2599 &shape,
2600 &strides,
2601 NULL,
2602 NULL
2603 };
2604 int *ptr;
2605 int i;
2606
2607 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2608 ptr = view.buf;
2609 for (i = 0; i < 5; i++) {
2610 if (ptr[2*i] != i) {
2611 PyErr_SetString(TestError,
2612 "test_from_contiguous: incorrect result");
2613 return NULL;
2614 }
2615 }
2616
2617 view.buf = &data[8];
2618 view.strides[0] = -2 * itemsize;
2619
2620 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2621 ptr = view.buf;
2622 for (i = 0; i < 5; i++) {
2623 if (*(ptr-2*i) != i) {
2624 PyErr_SetString(TestError,
2625 "test_from_contiguous: incorrect result");
2626 return NULL;
2627 }
2628 }
2629
2630 Py_RETURN_NONE;
2631}
Stefan Krah650c1e82015-02-03 21:43:23 +01002632
Stefan Kraha7559c02015-02-03 22:27:21 +01002633#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01002634extern PyTypeObject _PyBytesIOBuffer_Type;
2635
Stefan Krah5178d912015-02-03 16:57:21 +01002636static PyObject *
2637test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
2638{
Stefan Krah650c1e82015-02-03 21:43:23 +01002639 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01002640 PyObject *b;
2641 char *dummy[1];
2642 int ret, match;
2643
Stefan Krah650c1e82015-02-03 21:43:23 +01002644 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01002645 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
2646 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2647 PyErr_Clear();
2648 if (ret != -1 || match == 0)
2649 goto error;
2650
Stefan Krah650c1e82015-02-03 21:43:23 +01002651 /* bytesiobuf_getbuffer() */
2652 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01002653 if (b == NULL) {
2654 return NULL;
2655 }
2656
2657 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
2658 Py_DECREF(b);
2659 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2660 PyErr_Clear();
2661 if (ret != -1 || match == 0)
2662 goto error;
2663
2664 Py_RETURN_NONE;
2665
2666error:
2667 PyErr_SetString(TestError,
2668 "test_pep3118_obsolete_write_locks: failure");
2669 return NULL;
2670}
Stefan Kraha7559c02015-02-03 22:27:21 +01002671#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002672
Stefan Krah650c1e82015-02-03 21:43:23 +01002673/* This tests functions that historically supported write locks. It is
2674 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
2675 is entitled to segfault in that case. */
2676static PyObject *
2677getbuffer_with_null_view(PyObject* self, PyObject *obj)
2678{
2679 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
2680 return NULL;
2681
2682 Py_RETURN_NONE;
2683}
2684
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002685/* Test that the fatal error from not having a current thread doesn't
2686 cause an infinite loop. Run via Lib/test/test_capi.py */
2687static PyObject *
2688crash_no_current_thread(PyObject *self)
2689{
2690 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002691 /* Using PyThreadState_Get() directly allows the test to pass in
2692 !pydebug mode. However, the test only actually tests anything
2693 in pydebug mode, since that's where the infinite loop was in
2694 the first place. */
2695 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002696 Py_END_ALLOW_THREADS
2697 return NULL;
2698}
2699
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002700/* To run some code in a sub-interpreter. */
2701static PyObject *
2702run_in_subinterp(PyObject *self, PyObject *args)
2703{
2704 const char *code;
2705 int r;
2706 PyThreadState *substate, *mainstate;
2707
2708 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2709 &code))
2710 return NULL;
2711
2712 mainstate = PyThreadState_Get();
2713
2714 PyThreadState_Swap(NULL);
2715
2716 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002717 if (substate == NULL) {
2718 /* Since no new thread state was created, there is no exception to
2719 propagate; raise a fresh one after swapping in the old thread
2720 state. */
2721 PyThreadState_Swap(mainstate);
2722 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2723 return NULL;
2724 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002725 r = PyRun_SimpleString(code);
2726 Py_EndInterpreter(substate);
2727
2728 PyThreadState_Swap(mainstate);
2729
2730 return PyLong_FromLong(r);
2731}
2732
Victor Stinner3c1b3792014-02-17 00:02:43 +01002733static int
2734check_time_rounding(int round)
2735{
Victor Stinner74474232015-09-02 01:43:56 +02002736 if (round != _PyTime_ROUND_FLOOR
2737 && round != _PyTime_ROUND_CEILING
Victor Stinner7667f582015-09-09 01:02:23 +02002738 && round != _PyTime_ROUND_HALF_EVEN) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01002739 PyErr_SetString(PyExc_ValueError, "invalid rounding");
2740 return -1;
2741 }
2742 return 0;
2743}
2744
Victor Stinner5d272cc2012-03-13 13:35:55 +01002745static PyObject *
2746test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2747{
2748 PyObject *obj;
2749 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002750 int round;
2751 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002752 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002753 if (check_time_rounding(round) < 0)
2754 return NULL;
2755 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002756 return NULL;
2757 return _PyLong_FromTime_t(sec);
2758}
2759
2760static PyObject *
2761test_pytime_object_to_timeval(PyObject *self, PyObject *args)
2762{
2763 PyObject *obj;
2764 time_t sec;
2765 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002766 int round;
2767 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002768 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002769 if (check_time_rounding(round) < 0)
2770 return NULL;
2771 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002772 return NULL;
2773 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
2774}
2775
Victor Stinner643cd682012-03-02 22:54:03 +01002776static PyObject *
2777test_pytime_object_to_timespec(PyObject *self, PyObject *args)
2778{
2779 PyObject *obj;
2780 time_t sec;
2781 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002782 int round;
2783 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01002784 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002785 if (check_time_rounding(round) < 0)
2786 return NULL;
2787 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01002788 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01002789 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01002790}
2791
Antoine Pitrou796564c2013-07-30 19:59:21 +02002792static void
2793slot_tp_del(PyObject *self)
2794{
2795 _Py_IDENTIFIER(__tp_del__);
2796 PyObject *del, *res;
2797 PyObject *error_type, *error_value, *error_traceback;
2798
2799 /* Temporarily resurrect the object. */
2800 assert(self->ob_refcnt == 0);
2801 self->ob_refcnt = 1;
2802
2803 /* Save the current exception, if any. */
2804 PyErr_Fetch(&error_type, &error_value, &error_traceback);
2805
2806 /* Execute __del__ method, if any. */
2807 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
2808 if (del != NULL) {
2809 res = PyEval_CallObject(del, NULL);
2810 if (res == NULL)
2811 PyErr_WriteUnraisable(del);
2812 else
2813 Py_DECREF(res);
2814 Py_DECREF(del);
2815 }
2816
2817 /* Restore the saved exception. */
2818 PyErr_Restore(error_type, error_value, error_traceback);
2819
2820 /* Undo the temporary resurrection; can't use DECREF here, it would
2821 * cause a recursive call.
2822 */
2823 assert(self->ob_refcnt > 0);
2824 if (--self->ob_refcnt == 0)
2825 return; /* this is the normal path out */
2826
2827 /* __del__ resurrected it! Make it look like the original Py_DECREF
2828 * never happened.
2829 */
2830 {
2831 Py_ssize_t refcnt = self->ob_refcnt;
2832 _Py_NewReference(self);
2833 self->ob_refcnt = refcnt;
2834 }
2835 assert(!PyType_IS_GC(Py_TYPE(self)) ||
2836 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
2837 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
2838 * we need to undo that. */
2839 _Py_DEC_REFTOTAL;
2840 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
2841 * chain, so no more to do there.
2842 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
2843 * _Py_NewReference bumped tp_allocs: both of those need to be
2844 * undone.
2845 */
2846#ifdef COUNT_ALLOCS
2847 --Py_TYPE(self)->tp_frees;
2848 --Py_TYPE(self)->tp_allocs;
2849#endif
2850}
2851
2852static PyObject *
2853with_tp_del(PyObject *self, PyObject *args)
2854{
2855 PyObject *obj;
2856 PyTypeObject *tp;
2857
2858 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
2859 return NULL;
2860 tp = (PyTypeObject *) obj;
2861 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
2862 PyErr_Format(PyExc_TypeError,
2863 "heap type expected, got %R", obj);
2864 return NULL;
2865 }
2866 tp->tp_del = slot_tp_del;
2867 Py_INCREF(obj);
2868 return obj;
2869}
2870
Antoine Pitroub349e4c2014-08-06 19:31:40 -04002871static PyMethodDef ml;
2872
2873static PyObject *
2874create_cfunction(PyObject *self, PyObject *args)
2875{
2876 return PyCFunction_NewEx(&ml, self, NULL);
2877}
2878
2879static PyMethodDef ml = {
2880 "create_cfunction",
2881 create_cfunction,
2882 METH_NOARGS,
2883 NULL
2884};
2885
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07002886static PyObject *
2887_test_incref(PyObject *ob)
2888{
2889 Py_INCREF(ob);
2890 return ob;
2891}
2892
2893static PyObject *
2894test_xincref_doesnt_leak(PyObject *ob)
2895{
2896 PyObject *obj = PyLong_FromLong(0);
2897 Py_XINCREF(_test_incref(obj));
2898 Py_DECREF(obj);
2899 Py_DECREF(obj);
2900 Py_DECREF(obj);
2901 Py_RETURN_NONE;
2902}
2903
2904static PyObject *
2905test_incref_doesnt_leak(PyObject *ob)
2906{
2907 PyObject *obj = PyLong_FromLong(0);
2908 Py_INCREF(_test_incref(obj));
2909 Py_DECREF(obj);
2910 Py_DECREF(obj);
2911 Py_DECREF(obj);
2912 Py_RETURN_NONE;
2913}
2914
2915static PyObject *
2916test_xdecref_doesnt_leak(PyObject *ob)
2917{
2918 Py_XDECREF(PyLong_FromLong(0));
2919 Py_RETURN_NONE;
2920}
2921
2922static PyObject *
2923test_decref_doesnt_leak(PyObject *ob)
2924{
2925 Py_DECREF(PyLong_FromLong(0));
2926 Py_RETURN_NONE;
2927}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002928
Victor Stinner0507bf52013-07-07 02:05:46 +02002929static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02002930test_incref_decref_API(PyObject *ob)
2931{
2932 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02002933 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02002934 Py_DecRef(obj);
2935 Py_DecRef(obj);
2936 Py_RETURN_NONE;
2937}
2938
2939static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02002940test_pymem_alloc0(PyObject *self)
2941{
2942 void *ptr;
2943
Victor Stinnerdb067af2014-05-02 22:31:14 +02002944 ptr = PyMem_RawMalloc(0);
2945 if (ptr == NULL) {
2946 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
2947 return NULL;
2948 }
2949 PyMem_RawFree(ptr);
2950
2951 ptr = PyMem_RawCalloc(0, 0);
2952 if (ptr == NULL) {
2953 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
2954 return NULL;
2955 }
2956 PyMem_RawFree(ptr);
2957
Victor Stinner0507bf52013-07-07 02:05:46 +02002958 ptr = PyMem_Malloc(0);
2959 if (ptr == NULL) {
2960 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
2961 return NULL;
2962 }
2963 PyMem_Free(ptr);
2964
Victor Stinnerdb067af2014-05-02 22:31:14 +02002965 ptr = PyMem_Calloc(0, 0);
2966 if (ptr == NULL) {
2967 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
2968 return NULL;
2969 }
2970 PyMem_Free(ptr);
2971
Victor Stinner0507bf52013-07-07 02:05:46 +02002972 ptr = PyObject_Malloc(0);
2973 if (ptr == NULL) {
2974 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
2975 return NULL;
2976 }
2977 PyObject_Free(ptr);
2978
Victor Stinnerdb067af2014-05-02 22:31:14 +02002979 ptr = PyObject_Calloc(0, 0);
2980 if (ptr == NULL) {
2981 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
2982 return NULL;
2983 }
2984 PyObject_Free(ptr);
2985
Victor Stinner0507bf52013-07-07 02:05:46 +02002986 Py_RETURN_NONE;
2987}
2988
2989typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02002990 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02002991
2992 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02002993 size_t calloc_nelem;
2994 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02002995 void *realloc_ptr;
2996 size_t realloc_new_size;
2997 void *free_ptr;
2998} alloc_hook_t;
2999
3000static void* hook_malloc (void* ctx, size_t size)
3001{
3002 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3003 hook->malloc_size = size;
3004 return hook->alloc.malloc(hook->alloc.ctx, size);
3005}
3006
Victor Stinnerdb067af2014-05-02 22:31:14 +02003007static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
3008{
3009 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3010 hook->calloc_nelem = nelem;
3011 hook->calloc_elsize = elsize;
3012 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3013}
3014
Victor Stinner0507bf52013-07-07 02:05:46 +02003015static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
3016{
3017 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3018 hook->realloc_ptr = ptr;
3019 hook->realloc_new_size = new_size;
3020 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3021}
3022
3023static void hook_free (void *ctx, void *ptr)
3024{
3025 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3026 hook->free_ptr = ptr;
3027 hook->alloc.free(hook->alloc.ctx, ptr);
3028}
3029
3030static PyObject *
3031test_setallocators(PyMemAllocatorDomain domain)
3032{
3033 PyObject *res = NULL;
3034 const char *error_msg;
3035 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003036 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003037 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003038 void *ptr, *ptr2;
3039
Victor Stinnerdb067af2014-05-02 22:31:14 +02003040 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003041
3042 alloc.ctx = &hook;
3043 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003044 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003045 alloc.realloc = &hook_realloc;
3046 alloc.free = &hook_free;
3047 PyMem_GetAllocator(domain, &hook.alloc);
3048 PyMem_SetAllocator(domain, &alloc);
3049
3050 size = 42;
3051 switch(domain)
3052 {
3053 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3054 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3055 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3056 default: ptr = NULL; break;
3057 }
3058
3059 if (ptr == NULL) {
3060 error_msg = "malloc failed";
3061 goto fail;
3062 }
3063
3064 if (hook.malloc_size != size) {
3065 error_msg = "malloc invalid size";
3066 goto fail;
3067 }
3068
3069 size2 = 200;
3070 switch(domain)
3071 {
3072 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3073 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3074 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003075 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003076 }
3077
3078 if (ptr2 == NULL) {
3079 error_msg = "realloc failed";
3080 goto fail;
3081 }
3082
3083 if (hook.realloc_ptr != ptr
3084 || hook.realloc_new_size != size2) {
3085 error_msg = "realloc invalid parameters";
3086 goto fail;
3087 }
3088
3089 switch(domain)
3090 {
3091 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3092 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3093 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3094 }
3095
3096 if (hook.free_ptr != ptr2) {
3097 error_msg = "free invalid pointer";
3098 goto fail;
3099 }
3100
Victor Stinnerdb067af2014-05-02 22:31:14 +02003101 nelem = 2;
3102 elsize = 5;
3103 switch(domain)
3104 {
3105 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3106 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3107 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3108 default: ptr = NULL; break;
3109 }
3110
3111 if (ptr == NULL) {
3112 error_msg = "calloc failed";
3113 goto fail;
3114 }
3115
3116 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3117 error_msg = "calloc invalid nelem or elsize";
3118 goto fail;
3119 }
3120
3121 switch(domain)
3122 {
3123 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3124 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3125 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3126 }
3127
Victor Stinner0507bf52013-07-07 02:05:46 +02003128 Py_INCREF(Py_None);
3129 res = Py_None;
3130 goto finally;
3131
3132fail:
3133 PyErr_SetString(PyExc_RuntimeError, error_msg);
3134
3135finally:
3136 PyMem_SetAllocator(domain, &hook.alloc);
3137 return res;
3138}
3139
3140static PyObject *
3141test_pymem_setrawallocators(PyObject *self)
3142{
3143 return test_setallocators(PYMEM_DOMAIN_RAW);
3144}
3145
3146static PyObject *
3147test_pymem_setallocators(PyObject *self)
3148{
3149 return test_setallocators(PYMEM_DOMAIN_MEM);
3150}
3151
3152static PyObject *
3153test_pyobject_setallocators(PyObject *self)
3154{
3155 return test_setallocators(PYMEM_DOMAIN_OBJ);
3156}
3157
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003158PyDoc_STRVAR(docstring_empty,
3159""
3160);
3161
3162PyDoc_STRVAR(docstring_no_signature,
3163"This docstring has no signature."
3164);
3165
3166PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003167"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003168"\n"
3169"This docstring has an invalid signature."
3170);
3171
Larry Hastings2623c8c2014-02-08 22:15:29 -08003172PyDoc_STRVAR(docstring_with_invalid_signature2,
3173"docstring_with_invalid_signature2($module, /, boo)\n"
3174"\n"
3175"--\n"
3176"\n"
3177"This docstring also has an invalid signature."
3178);
3179
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003180PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003181"docstring_with_signature($module, /, sig)\n"
3182"--\n"
3183"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003184"This docstring has a valid signature."
3185);
3186
Zachary Ware8ef887c2015-04-13 18:22:35 -05003187PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3188"docstring_with_signature_but_no_doc($module, /, sig)\n"
3189"--\n"
3190"\n"
3191);
3192
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003193PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003194"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3195"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003196"\n"
3197"\n"
3198"This docstring has a valid signature and some extra newlines."
3199);
3200
Larry Hastings16c51912014-01-07 11:53:01 -08003201PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003202"docstring_with_signature_with_defaults(module, s='avocado',\n"
3203" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3204" local=the_number_three, sys=sys.maxsize,\n"
3205" exp=sys.maxsize - 1)\n"
3206"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003207"\n"
3208"\n"
3209"\n"
3210"This docstring has a valid signature with parameters,\n"
3211"and the parameters take defaults of varying types."
3212);
3213
Victor Stinner258e4d32013-12-13 02:30:12 +01003214#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003215typedef struct {
3216 PyThread_type_lock start_event;
3217 PyThread_type_lock exit_event;
3218 PyObject *callback;
3219} test_c_thread_t;
3220
3221static void
3222temporary_c_thread(void *data)
3223{
3224 test_c_thread_t *test_c_thread = data;
3225 PyGILState_STATE state;
3226 PyObject *res;
3227
3228 PyThread_release_lock(test_c_thread->start_event);
3229
3230 /* Allocate a Python thread state for this thread */
3231 state = PyGILState_Ensure();
3232
3233 res = PyObject_CallFunction(test_c_thread->callback, "", NULL);
3234 Py_CLEAR(test_c_thread->callback);
3235
3236 if (res == NULL) {
3237 PyErr_Print();
3238 }
3239 else {
3240 Py_DECREF(res);
3241 }
3242
3243 /* Destroy the Python thread state for this thread */
3244 PyGILState_Release(state);
3245
3246 PyThread_release_lock(test_c_thread->exit_event);
3247
3248 PyThread_exit_thread();
3249}
3250
3251static PyObject *
3252call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3253{
3254 PyObject *res = NULL;
3255 test_c_thread_t test_c_thread;
3256 long thread;
3257
3258 PyEval_InitThreads();
3259
3260 test_c_thread.start_event = PyThread_allocate_lock();
3261 test_c_thread.exit_event = PyThread_allocate_lock();
3262 test_c_thread.callback = NULL;
3263 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3264 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3265 goto exit;
3266 }
3267
3268 Py_INCREF(callback);
3269 test_c_thread.callback = callback;
3270
3271 PyThread_acquire_lock(test_c_thread.start_event, 1);
3272 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3273
3274 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3275 if (thread == -1) {
3276 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3277 PyThread_release_lock(test_c_thread.start_event);
3278 PyThread_release_lock(test_c_thread.exit_event);
3279 goto exit;
3280 }
3281
3282 PyThread_acquire_lock(test_c_thread.start_event, 1);
3283 PyThread_release_lock(test_c_thread.start_event);
3284
3285 Py_BEGIN_ALLOW_THREADS
3286 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3287 PyThread_release_lock(test_c_thread.exit_event);
3288 Py_END_ALLOW_THREADS
3289
3290 Py_INCREF(Py_None);
3291 res = Py_None;
3292
3293exit:
3294 Py_CLEAR(test_c_thread.callback);
3295 if (test_c_thread.start_event)
3296 PyThread_free_lock(test_c_thread.start_event);
3297 if (test_c_thread.exit_event)
3298 PyThread_free_lock(test_c_thread.exit_event);
3299 return res;
3300}
Victor Stinner258e4d32013-12-13 02:30:12 +01003301#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003302
Victor Stinner56e8c292014-07-21 12:30:22 +02003303static PyObject*
3304test_raise_signal(PyObject* self, PyObject *args)
3305{
3306 int signum, err;
3307
3308 if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0)
3309 return NULL;
3310
3311 err = raise(signum);
3312 if (err)
3313 return PyErr_SetFromErrno(PyExc_OSError);
3314
3315 if (PyErr_CheckSignals() < 0)
3316 return NULL;
3317
3318 Py_RETURN_NONE;
3319}
3320
Serhiy Storchakab5181342015-02-06 08:58:56 +02003321/* marshal */
3322
3323static PyObject*
3324pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3325{
3326 long value;
3327 char *filename;
3328 int version;
3329 FILE *fp;
3330
3331 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3332 &value, &filename, &version))
3333 return NULL;
3334
3335 fp = fopen(filename, "wb");
3336 if (fp == NULL) {
3337 PyErr_SetFromErrno(PyExc_OSError);
3338 return NULL;
3339 }
3340
3341 PyMarshal_WriteLongToFile(value, fp, version);
3342
3343 fclose(fp);
3344 if (PyErr_Occurred())
3345 return NULL;
3346 Py_RETURN_NONE;
3347}
3348
3349static PyObject*
3350pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3351{
3352 PyObject *obj;
3353 char *filename;
3354 int version;
3355 FILE *fp;
3356
3357 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3358 &obj, &filename, &version))
3359 return NULL;
3360
3361 fp = fopen(filename, "wb");
3362 if (fp == NULL) {
3363 PyErr_SetFromErrno(PyExc_OSError);
3364 return NULL;
3365 }
3366
3367 PyMarshal_WriteObjectToFile(obj, fp, version);
3368
3369 fclose(fp);
3370 if (PyErr_Occurred())
3371 return NULL;
3372 Py_RETURN_NONE;
3373}
3374
3375static PyObject*
3376pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3377{
3378 int value;
3379 long pos;
3380 char *filename;
3381 FILE *fp;
3382
3383 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3384 return NULL;
3385
3386 fp = fopen(filename, "rb");
3387 if (fp == NULL) {
3388 PyErr_SetFromErrno(PyExc_OSError);
3389 return NULL;
3390 }
3391
3392 value = PyMarshal_ReadShortFromFile(fp);
3393 pos = ftell(fp);
3394
3395 fclose(fp);
3396 if (PyErr_Occurred())
3397 return NULL;
3398 return Py_BuildValue("il", value, pos);
3399}
3400
3401static PyObject*
3402pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3403{
3404 long value, pos;
3405 char *filename;
3406 FILE *fp;
3407
3408 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3409 return NULL;
3410
3411 fp = fopen(filename, "rb");
3412 if (fp == NULL) {
3413 PyErr_SetFromErrno(PyExc_OSError);
3414 return NULL;
3415 }
3416
3417 value = PyMarshal_ReadLongFromFile(fp);
3418 pos = ftell(fp);
3419
3420 fclose(fp);
3421 if (PyErr_Occurred())
3422 return NULL;
3423 return Py_BuildValue("ll", value, pos);
3424}
3425
3426static PyObject*
3427pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3428{
3429 PyObject *obj;
3430 long pos;
3431 char *filename;
3432 FILE *fp;
3433
3434 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3435 return NULL;
3436
3437 fp = fopen(filename, "rb");
3438 if (fp == NULL) {
3439 PyErr_SetFromErrno(PyExc_OSError);
3440 return NULL;
3441 }
3442
3443 obj = PyMarshal_ReadLastObjectFromFile(fp);
3444 pos = ftell(fp);
3445
3446 fclose(fp);
3447 return Py_BuildValue("Nl", obj, pos);
3448}
3449
3450static PyObject*
3451pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3452{
3453 PyObject *obj;
3454 long pos;
3455 char *filename;
3456 FILE *fp;
3457
3458 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3459 return NULL;
3460
3461 fp = fopen(filename, "rb");
3462 if (fp == NULL) {
3463 PyErr_SetFromErrno(PyExc_OSError);
3464 return NULL;
3465 }
3466
3467 obj = PyMarshal_ReadObjectFromFile(fp);
3468 pos = ftell(fp);
3469
3470 fclose(fp);
3471 return Py_BuildValue("Nl", obj, pos);
3472}
3473
Victor Stinnerefde1462015-03-21 15:04:43 +01003474static PyObject*
3475return_null_without_error(PyObject *self, PyObject *args)
3476{
3477 /* invalid call: return NULL without setting an error,
3478 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3479 PyErr_Clear();
3480 return NULL;
3481}
3482
3483static PyObject*
3484return_result_with_error(PyObject *self, PyObject *args)
3485{
3486 /* invalid call: return a result with an error set,
3487 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3488 PyErr_SetNone(PyExc_ValueError);
3489 Py_RETURN_NONE;
3490}
3491
Victor Stinner992c43f2015-03-27 17:12:45 +01003492static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02003493test_pytime_fromseconds(PyObject *self, PyObject *args)
3494{
3495 int seconds;
3496 _PyTime_t ts;
3497
3498 if (!PyArg_ParseTuple(args, "i", &seconds))
3499 return NULL;
3500 ts = _PyTime_FromSeconds(seconds);
3501 return _PyTime_AsNanosecondsObject(ts);
3502}
3503
3504static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01003505test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
3506{
3507 PyObject *obj;
3508 int round;
3509 _PyTime_t ts;
3510
3511 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
3512 return NULL;
3513 if (check_time_rounding(round) < 0)
3514 return NULL;
3515 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
3516 return NULL;
3517 return _PyTime_AsNanosecondsObject(ts);
3518}
3519
Victor Stinner4bfb4602015-03-27 22:27:24 +01003520static PyObject *
3521test_pytime_assecondsdouble(PyObject *self, PyObject *args)
3522{
3523 PY_LONG_LONG ns;
3524 _PyTime_t ts;
3525 double d;
3526
3527 if (!PyArg_ParseTuple(args, "L", &ns))
3528 return NULL;
3529 ts = _PyTime_FromNanoseconds(ns);
3530 d = _PyTime_AsSecondsDouble(ts);
3531 return PyFloat_FromDouble(d);
3532}
3533
Victor Stinner95e9cef2015-03-28 01:26:47 +01003534static PyObject *
3535test_PyTime_AsTimeval(PyObject *self, PyObject *args)
3536{
3537 PY_LONG_LONG ns;
3538 int round;
3539 _PyTime_t t;
3540 struct timeval tv;
3541 PyObject *seconds;
3542
3543 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3544 return NULL;
3545 if (check_time_rounding(round) < 0)
3546 return NULL;
3547 t = _PyTime_FromNanoseconds(ns);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +02003548 if (_PyTime_AsTimeval(t, &tv, round) < 0)
Victor Stinner95e9cef2015-03-28 01:26:47 +01003549 return NULL;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003550
3551 seconds = PyLong_FromLong((PY_LONG_LONG)tv.tv_sec);
3552 if (seconds == NULL)
3553 return NULL;
3554 return Py_BuildValue("Nl", seconds, tv.tv_usec);
3555}
3556
Victor Stinner34dc0f42015-03-27 18:19:03 +01003557#ifdef HAVE_CLOCK_GETTIME
3558static PyObject *
3559test_PyTime_AsTimespec(PyObject *self, PyObject *args)
3560{
3561 PY_LONG_LONG ns;
3562 _PyTime_t t;
3563 struct timespec ts;
3564
3565 if (!PyArg_ParseTuple(args, "L", &ns))
3566 return NULL;
3567 t = _PyTime_FromNanoseconds(ns);
3568 if (_PyTime_AsTimespec(t, &ts) == -1)
3569 return NULL;
3570 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
3571}
3572#endif
3573
Victor Stinner62d1c702015-04-01 17:47:07 +02003574static PyObject *
3575test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
3576{
3577 PY_LONG_LONG ns;
3578 int round;
3579 _PyTime_t t, ms;
3580
3581 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3582 return NULL;
3583 if (check_time_rounding(round) < 0)
3584 return NULL;
3585 t = _PyTime_FromNanoseconds(ns);
3586 ms = _PyTime_AsMilliseconds(t, round);
3587 /* This conversion rely on the fact that _PyTime_t is a number of
3588 nanoseconds */
3589 return _PyTime_AsNanosecondsObject(ms);
3590}
3591
3592static PyObject *
3593test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
3594{
3595 PY_LONG_LONG ns;
3596 int round;
3597 _PyTime_t t, ms;
3598
3599 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3600 return NULL;
3601 if (check_time_rounding(round) < 0)
3602 return NULL;
3603 t = _PyTime_FromNanoseconds(ns);
3604 ms = _PyTime_AsMicroseconds(t, round);
3605 /* This conversion rely on the fact that _PyTime_t is a number of
3606 nanoseconds */
3607 return _PyTime_AsNanosecondsObject(ms);
3608}
3609
Victor Stinner50856d52015-10-13 00:11:21 +02003610static PyObject*
3611get_recursion_depth(PyObject *self, PyObject *args)
3612{
3613 PyThreadState *tstate = PyThreadState_GET();
3614
3615 /* substract one to ignore the frame of the get_recursion_depth() call */
3616 return PyLong_FromLong(tstate->recursion_depth - 1);
3617}
3618
Victor Stinner34be807c2016-03-14 12:04:26 +01003619static PyObject*
3620pymem_buffer_overflow(PyObject *self, PyObject *args)
3621{
3622 char *buffer;
3623
3624 /* Deliberate buffer overflow to check that PyMem_Free() detects
3625 the overflow when debug hooks are installed. */
3626 buffer = PyMem_Malloc(16);
3627 buffer[16] = 'x';
3628 PyMem_Free(buffer);
3629
3630 Py_RETURN_NONE;
3631}
3632
3633static PyObject*
3634pymem_api_misuse(PyObject *self, PyObject *args)
3635{
3636 char *buffer;
3637
3638 /* Deliberate misusage of Python allocators:
3639 allococate with PyMem but release with PyMem_Raw. */
3640 buffer = PyMem_Malloc(16);
3641 PyMem_RawFree(buffer);
3642
3643 Py_RETURN_NONE;
3644}
3645
Victor Stinnerc4aec362016-03-14 22:26:53 +01003646static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01003647pymem_malloc_without_gil(PyObject *self, PyObject *args)
3648{
3649 char *buffer;
3650
3651 /* Deliberate bug to test debug hooks on Python memory allocators:
3652 call PyMem_Malloc() without holding the GIL */
3653 Py_BEGIN_ALLOW_THREADS
3654 buffer = PyMem_Malloc(10);
3655 Py_END_ALLOW_THREADS
3656
3657 PyMem_Free(buffer);
3658
3659 Py_RETURN_NONE;
3660}
3661
3662static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01003663pyobject_malloc_without_gil(PyObject *self, PyObject *args)
3664{
3665 char *buffer;
3666
Victor Stinnerad524372016-03-16 12:12:53 +01003667 /* Deliberate bug to test debug hooks on Python memory allocators:
3668 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01003669 Py_BEGIN_ALLOW_THREADS
3670 buffer = PyObject_Malloc(10);
3671 Py_END_ALLOW_THREADS
3672
3673 PyObject_Free(buffer);
3674
3675 Py_RETURN_NONE;
3676}
3677
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003678
Tim Peters9ea17ac2001-02-02 05:57:15 +00003679static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003680 {"raise_exception", raise_exception, METH_VARARGS},
3681 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02003682 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003683 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01003684 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003685 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
3686 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
3687 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
3688 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003689 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003690 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
3691 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
3692 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
3693 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02003694 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003695 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
3696 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02003697 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
3698 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003699 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
3700 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
3701 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07003702 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003703 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
3704 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
3705 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
3706 PyDoc_STR("This is a pretty normal docstring.")},
3707 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
3708 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
3709 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01003710 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01003711#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01003712 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01003713#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01003714 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003715 {"getargs_tuple", getargs_tuple, METH_VARARGS},
3716 {"getargs_keywords", (PyCFunction)getargs_keywords,
3717 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00003718 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
3719 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003720 {"getargs_b", getargs_b, METH_VARARGS},
3721 {"getargs_B", getargs_B, METH_VARARGS},
3722 {"getargs_h", getargs_h, METH_VARARGS},
3723 {"getargs_H", getargs_H, METH_VARARGS},
3724 {"getargs_I", getargs_I, METH_VARARGS},
3725 {"getargs_k", getargs_k, METH_VARARGS},
3726 {"getargs_i", getargs_i, METH_VARARGS},
3727 {"getargs_l", getargs_l, METH_VARARGS},
3728 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07003729 {"getargs_p", getargs_p, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00003730#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003731 {"getargs_L", getargs_L, METH_VARARGS},
3732 {"getargs_K", getargs_K, METH_VARARGS},
3733 {"test_longlong_api", test_longlong_api, METH_NOARGS},
3734 {"test_long_long_and_overflow",
3735 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
3736 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003737#endif
Eli Bendersky906b88f2011-07-29 07:05:08 +03003738 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02003739 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003740 {"getargs_s", getargs_s, METH_VARARGS},
3741 {"getargs_s_star", getargs_s_star, METH_VARARGS},
3742 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
3743 {"getargs_z", getargs_z, METH_VARARGS},
3744 {"getargs_z_star", getargs_z_star, METH_VARARGS},
3745 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
3746 {"getargs_y", getargs_y, METH_VARARGS},
3747 {"getargs_y_star", getargs_y_star, METH_VARARGS},
3748 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
3749 {"getargs_u", getargs_u, METH_VARARGS},
3750 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
3751 {"getargs_Z", getargs_Z, METH_VARARGS},
3752 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00003753 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02003754 {"getargs_es", getargs_es, METH_VARARGS},
3755 {"getargs_et", getargs_et, METH_VARARGS},
3756 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
3757 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003758 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003759 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003760 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003761 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
3763 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
3764 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
3765 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01003766 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
3767 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
3768 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
3769 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01003770 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003771#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00003772 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003773 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003774#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00003775#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00003776 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00003777#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00003778 {"traceback_print", traceback_print, METH_VARARGS},
3779 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02003780 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00003781 {"argparsing", argparsing, METH_VARARGS},
3782 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003783 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
3784 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003785 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
3786 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003787 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003788 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01003789 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
3790 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01003791 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02003792 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003793 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02003794 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02003795 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
3796 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02003797 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
3798 {"test_pymem_setallocators",
3799 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
3800 {"test_pyobject_setallocators",
3801 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003802 {"no_docstring",
3803 (PyCFunction)test_with_docstring, METH_NOARGS},
3804 {"docstring_empty",
3805 (PyCFunction)test_with_docstring, METH_NOARGS,
3806 docstring_empty},
3807 {"docstring_no_signature",
3808 (PyCFunction)test_with_docstring, METH_NOARGS,
3809 docstring_no_signature},
3810 {"docstring_with_invalid_signature",
3811 (PyCFunction)test_with_docstring, METH_NOARGS,
3812 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08003813 {"docstring_with_invalid_signature2",
3814 (PyCFunction)test_with_docstring, METH_NOARGS,
3815 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003816 {"docstring_with_signature",
3817 (PyCFunction)test_with_docstring, METH_NOARGS,
3818 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05003819 {"docstring_with_signature_but_no_doc",
3820 (PyCFunction)test_with_docstring, METH_NOARGS,
3821 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003822 {"docstring_with_signature_and_extra_newlines",
3823 (PyCFunction)test_with_docstring, METH_NOARGS,
3824 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08003825 {"docstring_with_signature_with_defaults",
3826 (PyCFunction)test_with_docstring, METH_NOARGS,
3827 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02003828 {"raise_signal",
3829 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01003830#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003831 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
3832 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01003833#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02003834 {"pymarshal_write_long_to_file",
3835 pymarshal_write_long_to_file, METH_VARARGS},
3836 {"pymarshal_write_object_to_file",
3837 pymarshal_write_object_to_file, METH_VARARGS},
3838 {"pymarshal_read_short_from_file",
3839 pymarshal_read_short_from_file, METH_VARARGS},
3840 {"pymarshal_read_long_from_file",
3841 pymarshal_read_long_from_file, METH_VARARGS},
3842 {"pymarshal_read_last_object_from_file",
3843 pymarshal_read_last_object_from_file, METH_VARARGS},
3844 {"pymarshal_read_object_from_file",
3845 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01003846 {"return_null_without_error",
3847 return_null_without_error, METH_NOARGS},
3848 {"return_result_with_error",
3849 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02003850 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01003851 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
3852 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01003853 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01003854#ifdef HAVE_CLOCK_GETTIME
3855 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
3856#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02003857 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
3858 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02003859 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01003860 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
3861 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01003862 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01003863 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003864 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00003865};
3866
Thomas Hellera4ea6032003-04-17 18:55:45 +00003867#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
3868
Thomas Wouters89f507f2006-12-13 04:49:30 +00003869typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003870 char bool_member;
3871 char byte_member;
3872 unsigned char ubyte_member;
3873 short short_member;
3874 unsigned short ushort_member;
3875 int int_member;
3876 unsigned int uint_member;
3877 long long_member;
3878 unsigned long ulong_member;
3879 Py_ssize_t pyssizet_member;
3880 float float_member;
3881 double double_member;
3882 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003883#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003884 PY_LONG_LONG longlong_member;
3885 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003886#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003887} all_structmembers;
3888
3889typedef struct {
3890 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003891 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003892} test_structmembers;
3893
3894static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003895 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
3896 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
3897 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
3898 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
3899 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
3900 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
3901 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
3902 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
3903 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
3904 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
3905 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
3906 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
3907 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003908#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003909 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
3910 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003912 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00003913};
3914
3915
Christian Heimes1af737c2008-01-23 08:24:23 +00003916static PyObject *
3917test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
3918{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003919 static char *keywords[] = {
3920 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
3921 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
3922 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00003923#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003924 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00003925#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003926 NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02003927 static const char fmt[] = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00003928#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003929 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00003930#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003931 ;
3932 test_structmembers *ob;
3933 const char *s = NULL;
3934 Py_ssize_t string_len = 0;
3935 ob = PyObject_New(test_structmembers, type);
3936 if (ob == NULL)
3937 return NULL;
3938 memset(&ob->structmembers, 0, sizeof(all_structmembers));
3939 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
3940 &ob->structmembers.bool_member,
3941 &ob->structmembers.byte_member,
3942 &ob->structmembers.ubyte_member,
3943 &ob->structmembers.short_member,
3944 &ob->structmembers.ushort_member,
3945 &ob->structmembers.int_member,
3946 &ob->structmembers.uint_member,
3947 &ob->structmembers.long_member,
3948 &ob->structmembers.ulong_member,
3949 &ob->structmembers.pyssizet_member,
3950 &ob->structmembers.float_member,
3951 &ob->structmembers.double_member,
3952 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00003953#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003954 , &ob->structmembers.longlong_member,
3955 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00003956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003957 )) {
3958 Py_DECREF(ob);
3959 return NULL;
3960 }
3961 if (s != NULL) {
3962 if (string_len > 5) {
3963 Py_DECREF(ob);
3964 PyErr_SetString(PyExc_ValueError, "string too long");
3965 return NULL;
3966 }
3967 strcpy(ob->structmembers.inplace_member, s);
3968 }
3969 else {
3970 strcpy(ob->structmembers.inplace_member, "");
3971 }
3972 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003973}
3974
Christian Heimes1af737c2008-01-23 08:24:23 +00003975static void
3976test_structmembers_free(PyObject *ob)
3977{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003979}
3980
3981static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003982 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003983 "test_structmembersType",
3984 sizeof(test_structmembers), /* tp_basicsize */
3985 0, /* tp_itemsize */
3986 test_structmembers_free, /* destructor tp_dealloc */
3987 0, /* tp_print */
3988 0, /* tp_getattr */
3989 0, /* tp_setattr */
3990 0, /* tp_reserved */
3991 0, /* tp_repr */
3992 0, /* tp_as_number */
3993 0, /* tp_as_sequence */
3994 0, /* tp_as_mapping */
3995 0, /* tp_hash */
3996 0, /* tp_call */
3997 0, /* tp_str */
3998 PyObject_GenericGetAttr, /* tp_getattro */
3999 PyObject_GenericSetAttr, /* tp_setattro */
4000 0, /* tp_as_buffer */
4001 0, /* tp_flags */
4002 "Type containing all structmember types",
4003 0, /* traverseproc tp_traverse */
4004 0, /* tp_clear */
4005 0, /* tp_richcompare */
4006 0, /* tp_weaklistoffset */
4007 0, /* tp_iter */
4008 0, /* tp_iternext */
4009 0, /* tp_methods */
4010 test_members, /* tp_members */
4011 0,
4012 0,
4013 0,
4014 0,
4015 0,
4016 0,
4017 0,
4018 0,
4019 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004020};
4021
4022
Benjamin Petersond51374e2014-04-09 23:55:56 -04004023typedef struct {
4024 PyObject_HEAD
4025} matmulObject;
4026
4027static PyObject *
4028matmulType_matmul(PyObject *self, PyObject *other)
4029{
4030 return Py_BuildValue("(sOO)", "matmul", self, other);
4031}
4032
4033static PyObject *
4034matmulType_imatmul(PyObject *self, PyObject *other)
4035{
4036 return Py_BuildValue("(sOO)", "imatmul", self, other);
4037}
4038
4039static void
4040matmulType_dealloc(PyObject *self)
4041{
Zachary Ware420dc562014-04-23 13:51:27 -05004042 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004043}
4044
4045static PyNumberMethods matmulType_as_number = {
4046 0, /* nb_add */
4047 0, /* nb_subtract */
4048 0, /* nb_multiply */
4049 0, /* nb_remainde r*/
4050 0, /* nb_divmod */
4051 0, /* nb_power */
4052 0, /* nb_negative */
4053 0, /* tp_positive */
4054 0, /* tp_absolute */
4055 0, /* tp_bool */
4056 0, /* nb_invert */
4057 0, /* nb_lshift */
4058 0, /* nb_rshift */
4059 0, /* nb_and */
4060 0, /* nb_xor */
4061 0, /* nb_or */
4062 0, /* nb_int */
4063 0, /* nb_reserved */
4064 0, /* nb_float */
4065 0, /* nb_inplace_add */
4066 0, /* nb_inplace_subtract */
4067 0, /* nb_inplace_multiply */
4068 0, /* nb_inplace_remainder */
4069 0, /* nb_inplace_power */
4070 0, /* nb_inplace_lshift */
4071 0, /* nb_inplace_rshift */
4072 0, /* nb_inplace_and */
4073 0, /* nb_inplace_xor */
4074 0, /* nb_inplace_or */
4075 0, /* nb_floor_divide */
4076 0, /* nb_true_divide */
4077 0, /* nb_inplace_floor_divide */
4078 0, /* nb_inplace_true_divide */
4079 0, /* nb_index */
4080 matmulType_matmul, /* nb_matrix_multiply */
4081 matmulType_imatmul /* nb_matrix_inplace_multiply */
4082};
4083
4084static PyTypeObject matmulType = {
4085 PyVarObject_HEAD_INIT(NULL, 0)
4086 "matmulType",
4087 sizeof(matmulObject), /* tp_basicsize */
4088 0, /* tp_itemsize */
4089 matmulType_dealloc, /* destructor tp_dealloc */
4090 0, /* tp_print */
4091 0, /* tp_getattr */
4092 0, /* tp_setattr */
4093 0, /* tp_reserved */
4094 0, /* tp_repr */
4095 &matmulType_as_number, /* tp_as_number */
4096 0, /* tp_as_sequence */
4097 0, /* tp_as_mapping */
4098 0, /* tp_hash */
4099 0, /* tp_call */
4100 0, /* tp_str */
4101 PyObject_GenericGetAttr, /* tp_getattro */
4102 PyObject_GenericSetAttr, /* tp_setattro */
4103 0, /* tp_as_buffer */
4104 0, /* tp_flags */
4105 "C level type with matrix operations defined",
4106 0, /* traverseproc tp_traverse */
4107 0, /* tp_clear */
4108 0, /* tp_richcompare */
4109 0, /* tp_weaklistoffset */
4110 0, /* tp_iter */
4111 0, /* tp_iternext */
4112 0, /* tp_methods */
4113 0, /* tp_members */
4114 0,
4115 0,
4116 0,
4117 0,
4118 0,
4119 0,
4120 0,
4121 0,
4122 PyType_GenericNew, /* tp_new */
4123 PyObject_Del, /* tp_free */
4124};
4125
Martin v. Löwis1a214512008-06-11 05:26:20 +00004126
Yury Selivanov75445082015-05-11 22:57:16 -04004127typedef struct {
4128 PyObject_HEAD
4129 PyObject *ao_iterator;
4130} awaitObject;
4131
4132
4133static PyObject *
4134awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4135{
4136 PyObject *v;
4137 awaitObject *ao;
4138
4139 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
4140 return NULL;
4141
4142 ao = (awaitObject *)type->tp_alloc(type, 0);
4143 if (ao == NULL) {
4144 return NULL;
4145 }
4146
4147 Py_INCREF(v);
4148 ao->ao_iterator = v;
4149
4150 return (PyObject *)ao;
4151}
4152
4153
4154static void
4155awaitObject_dealloc(awaitObject *ao)
4156{
4157 Py_CLEAR(ao->ao_iterator);
4158 Py_TYPE(ao)->tp_free(ao);
4159}
4160
4161
4162static PyObject *
4163awaitObject_await(awaitObject *ao)
4164{
4165 Py_INCREF(ao->ao_iterator);
4166 return ao->ao_iterator;
4167}
4168
4169static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04004170 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04004171 0, /* am_aiter */
4172 0 /* am_anext */
4173};
4174
4175
4176static PyTypeObject awaitType = {
4177 PyVarObject_HEAD_INIT(NULL, 0)
4178 "awaitType",
4179 sizeof(awaitObject), /* tp_basicsize */
4180 0, /* tp_itemsize */
4181 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
4182 0, /* tp_print */
4183 0, /* tp_getattr */
4184 0, /* tp_setattr */
4185 &awaitType_as_async, /* tp_as_async */
4186 0, /* tp_repr */
4187 0, /* tp_as_number */
4188 0, /* tp_as_sequence */
4189 0, /* tp_as_mapping */
4190 0, /* tp_hash */
4191 0, /* tp_call */
4192 0, /* tp_str */
4193 PyObject_GenericGetAttr, /* tp_getattro */
4194 PyObject_GenericSetAttr, /* tp_setattro */
4195 0, /* tp_as_buffer */
4196 0, /* tp_flags */
4197 "C level type with tp_as_async",
4198 0, /* traverseproc tp_traverse */
4199 0, /* tp_clear */
4200 0, /* tp_richcompare */
4201 0, /* tp_weaklistoffset */
4202 0, /* tp_iter */
4203 0, /* tp_iternext */
4204 0, /* tp_methods */
4205 0, /* tp_members */
4206 0,
4207 0,
4208 0,
4209 0,
4210 0,
4211 0,
4212 0,
4213 0,
4214 awaitObject_new, /* tp_new */
4215 PyObject_Del, /* tp_free */
4216};
4217
4218
Martin v. Löwis1a214512008-06-11 05:26:20 +00004219static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004220 PyModuleDef_HEAD_INIT,
4221 "_testcapi",
4222 NULL,
4223 -1,
4224 TestMethods,
4225 NULL,
4226 NULL,
4227 NULL,
4228 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004229};
4230
Nick Coghland5cacbb2015-05-23 22:24:10 +10004231/* Per PEP 489, this module will not be converted to multi-phase initialization
4232 */
4233
Mark Hammond62b1ab12002-07-23 06:31:15 +00004234PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004235PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00004236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004237 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004239 m = PyModule_Create(&_testcapimodule);
4240 if (m == NULL)
4241 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004243 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00004244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004245 Py_TYPE(&test_structmembersType)=&PyType_Type;
4246 Py_INCREF(&test_structmembersType);
4247 /* don't use a name starting with "test", since we don't want
4248 test_capi to automatically call this */
4249 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004250 if (PyType_Ready(&matmulType) < 0)
4251 return NULL;
4252 Py_INCREF(&matmulType);
4253 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004254
Yury Selivanov75445082015-05-11 22:57:16 -04004255 if (PyType_Ready(&awaitType) < 0)
4256 return NULL;
4257 Py_INCREF(&awaitType);
4258 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
4259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004260 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
4261 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
4262 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
4263 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
4264 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
4265 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
4266 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
4267 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
4268 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
4269 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
4270 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
4271 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
4272 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
4273 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
4274 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
4275 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
4276 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
4277 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
4278 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
4279 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
4280 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
4281 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02004282 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004283 Py_INCREF(&PyInstanceMethod_Type);
4284 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00004285
Larry Hastings2a727912014-01-16 11:32:01 -08004286 PyModule_AddIntConstant(m, "the_number_three", 3);
4287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004288 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
4289 Py_INCREF(TestError);
4290 PyModule_AddObject(m, "error", TestError);
4291 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004292}