blob: 34b95c02a8dc3c142501ec7b34d8789b284a0f2a [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"
Tim Peters9ea17ac2001-02-02 05:57:15 +000014
Mark Hammond8d98d2c2003-04-19 15:41:53 +000015#ifdef WITH_THREAD
16#include "pythread.h"
17#endif /* WITH_THREAD */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000018static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000019
Tim Peters91621db2001-06-12 20:10:01 +000020/* Raise TestError with test_name + ": " + msg, and return NULL. */
21
22static PyObject *
23raiseTestError(const char* test_name, const char* msg)
24{
Victor Stinner6ced7c42011-03-21 18:15:42 +010025 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000026 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000027}
28
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000029/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000030
31 The ones derived from autoconf on the UNIX-like OSes can be relied
32 upon (in the absence of sloppy cross-compiling), but the Windows
33 platforms have these hardcoded. Better safe than sorry.
34*/
35static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000036sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000038{
Victor Stinner499dfcf2011-03-21 13:26:24 +010039 PyErr_Format(TestError,
40 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000041 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000043}
44
45static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000046test_config(PyObject *self)
Tim Peters9ea17ac2001-02-02 05:57:15 +000047{
Tim Peters9ea17ac2001-02-02 05:57:15 +000048#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 if (FATNAME != sizeof(TYPE)) \
50 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 CHECK_SIZEOF(SIZEOF_SHORT, short);
53 CHECK_SIZEOF(SIZEOF_INT, int);
54 CHECK_SIZEOF(SIZEOF_LONG, long);
55 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
56 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Tim Peters9ea17ac2001-02-02 05:57:15 +000057#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
Tim Peters9ea17ac2001-02-02 05:57:15 +000059#endif
60
61#undef CHECK_SIZEOF
62
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 Py_INCREF(Py_None);
64 return Py_None;
Tim Peters9ea17ac2001-02-02 05:57:15 +000065}
66
Tim Peters5c4d5bf2001-02-12 22:13:26 +000067static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000068test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +000069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 PyObject* list;
71 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +000072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +000074#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 list = PyList_New(NLIST);
76 if (list == (PyObject*)NULL)
77 return (PyObject*)NULL;
78 /* list = range(NLIST) */
79 for (i = 0; i < NLIST; ++i) {
80 PyObject* anint = PyLong_FromLong(i);
81 if (anint == (PyObject*)NULL) {
82 Py_DECREF(list);
83 return (PyObject*)NULL;
84 }
85 PyList_SET_ITEM(list, i, anint);
86 }
87 /* list.reverse(), via PyList_Reverse() */
88 i = PyList_Reverse(list); /* should not blow up! */
89 if (i != 0) {
90 Py_DECREF(list);
91 return (PyObject*)NULL;
92 }
93 /* Check that list == range(29, -1, -1) now */
94 for (i = 0; i < NLIST; ++i) {
95 PyObject* anint = PyList_GET_ITEM(list, i);
96 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
97 PyErr_SetString(TestError,
98 "test_list_api: reverse screwed up");
99 Py_DECREF(list);
100 return (PyObject*)NULL;
101 }
102 }
103 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000104#undef NLIST
105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 Py_INCREF(Py_None);
107 return Py_None;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000108}
109
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000110static int
111test_dict_inner(int count)
112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 Py_ssize_t pos = 0, iterations = 0;
114 int i;
115 PyObject *dict = PyDict_New();
116 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 if (dict == NULL)
119 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 for (i = 0; i < count; i++) {
122 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200123 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200124 return -1;
125 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200126 if (PyDict_SetItem(dict, v, v) < 0) {
127 Py_DECREF(v);
128 return -1;
129 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 Py_DECREF(v);
131 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000133 while (PyDict_Next(dict, &pos, &k, &v)) {
134 PyObject *o;
135 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 i = PyLong_AS_LONG(v) + 1;
138 o = PyLong_FromLong(i);
139 if (o == NULL)
140 return -1;
141 if (PyDict_SetItem(dict, k, o) < 0) {
142 Py_DECREF(o);
143 return -1;
144 }
145 Py_DECREF(o);
146 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000150 if (iterations != count) {
151 PyErr_SetString(
152 TestError,
153 "test_dict_iteration: dict iteration went wrong ");
154 return -1;
155 } else {
156 return 0;
157 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000158}
159
160static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000161test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 for (i = 0; i < 200; i++) {
166 if (test_dict_inner(i) < 0) {
167 return NULL;
168 }
169 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 Py_INCREF(Py_None);
172 return Py_None;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000173}
174
Tim Peters91621db2001-06-12 20:10:01 +0000175
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000176/* Issue #4701: Check that PyObject_Hash implicitly calls
177 * PyType_Ready if it hasn't already been called
178 */
179static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 PyVarObject_HEAD_INIT(NULL, 0)
181 "hashinheritancetester", /* Name of this type */
182 sizeof(PyObject), /* Basic object size */
183 0, /* Item size for varobject */
184 (destructor)PyObject_Del, /* tp_dealloc */
185 0, /* tp_print */
186 0, /* tp_getattr */
187 0, /* tp_setattr */
188 0, /* tp_reserved */
189 0, /* tp_repr */
190 0, /* tp_as_number */
191 0, /* tp_as_sequence */
192 0, /* tp_as_mapping */
193 0, /* tp_hash */
194 0, /* tp_call */
195 0, /* tp_str */
196 PyObject_GenericGetAttr, /* tp_getattro */
197 0, /* tp_setattro */
198 0, /* tp_as_buffer */
199 Py_TPFLAGS_DEFAULT, /* tp_flags */
200 0, /* tp_doc */
201 0, /* tp_traverse */
202 0, /* tp_clear */
203 0, /* tp_richcompare */
204 0, /* tp_weaklistoffset */
205 0, /* tp_iter */
206 0, /* tp_iternext */
207 0, /* tp_methods */
208 0, /* tp_members */
209 0, /* tp_getset */
210 0, /* tp_base */
211 0, /* tp_dict */
212 0, /* tp_descr_get */
213 0, /* tp_descr_set */
214 0, /* tp_dictoffset */
215 0, /* tp_init */
216 0, /* tp_alloc */
217 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000218};
219
220static PyObject*
221test_lazy_hash_inheritance(PyObject* self)
222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 PyTypeObject *type;
224 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000225 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 if (type->tp_dict != NULL)
230 /* The type has already been initialized. This probably means
231 -R is being used. */
232 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000233
234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 obj = PyObject_New(PyObject, type);
236 if (obj == NULL) {
237 PyErr_Clear();
238 PyErr_SetString(
239 TestError,
240 "test_lazy_hash_inheritance: failed to create object");
241 return NULL;
242 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 if (type->tp_dict != NULL) {
245 PyErr_SetString(
246 TestError,
247 "test_lazy_hash_inheritance: type initialised too soon");
248 Py_DECREF(obj);
249 return NULL;
250 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 hash = PyObject_Hash(obj);
253 if ((hash == -1) && PyErr_Occurred()) {
254 PyErr_Clear();
255 PyErr_SetString(
256 TestError,
257 "test_lazy_hash_inheritance: could not hash object");
258 Py_DECREF(obj);
259 return NULL;
260 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 if (type->tp_dict == NULL) {
263 PyErr_SetString(
264 TestError,
265 "test_lazy_hash_inheritance: type not initialised by hash()");
266 Py_DECREF(obj);
267 return NULL;
268 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 if (type->tp_hash != PyType_Type.tp_hash) {
271 PyErr_SetString(
272 TestError,
273 "test_lazy_hash_inheritance: unexpected hash function");
274 Py_DECREF(obj);
275 return NULL;
276 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000281}
282
283
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000284/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
Tim Petersff70d3c2001-06-14 01:11:03 +0000285 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000286
287 Note that the meat of the test is contained in testcapi_long.h.
288 This is revolting, but delicate code duplication is worse: "almost
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000289 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000290 dependence on type names makes it impossible to use a parameterized
291 function. A giant macro would be even worse than this. A C++ template
292 would be perfect.
293
294 The "report an error" functions are deliberately not part of the #include
295 file: if the test fails, you can set a breakpoint in the appropriate
296 error function directly, and crawl back from there in the debugger.
297*/
298
299#define UNBIND(X) Py_DECREF(X); (X) = NULL
300
301static PyObject *
302raise_test_long_error(const char* msg)
303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000305}
306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307#define TESTNAME test_long_api_inner
308#define TYPENAME long
309#define F_S_TO_PY PyLong_FromLong
310#define F_PY_TO_S PyLong_AsLong
311#define F_U_TO_PY PyLong_FromUnsignedLong
312#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000313
314#include "testcapi_long.h"
315
316static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000317test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000320}
321
322#undef TESTNAME
323#undef TYPENAME
324#undef F_S_TO_PY
325#undef F_PY_TO_S
326#undef F_U_TO_PY
327#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000328
329#ifdef HAVE_LONG_LONG
Tim Peters91621db2001-06-12 20:10:01 +0000330
331static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000332raise_test_longlong_error(const char* msg)
333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000335}
336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337#define TESTNAME test_longlong_api_inner
338#define TYPENAME PY_LONG_LONG
339#define F_S_TO_PY PyLong_FromLongLong
340#define F_PY_TO_S PyLong_AsLongLong
341#define F_U_TO_PY PyLong_FromUnsignedLongLong
342#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000343
344#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000345
346static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000347test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000350}
351
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000352#undef TESTNAME
353#undef TYPENAME
354#undef F_S_TO_PY
355#undef F_PY_TO_S
356#undef F_U_TO_PY
357#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000358
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000359/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
360 is tested by test_long_api_inner. This test will concentrate on proper
361 handling of overflow.
362*/
363
364static PyObject *
365test_long_and_overflow(PyObject *self)
366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 PyObject *num, *one, *temp;
368 long value;
369 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 /* Test that overflow is set properly for a large value. */
372 /* num is a number larger than LONG_MAX even on 64-bit platforms */
373 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
374 if (num == NULL)
375 return NULL;
376 overflow = 1234;
377 value = PyLong_AsLongAndOverflow(num, &overflow);
378 Py_DECREF(num);
379 if (value == -1 && PyErr_Occurred())
380 return NULL;
381 if (value != -1)
382 return raiseTestError("test_long_and_overflow",
383 "return value was not set to -1");
384 if (overflow != 1)
385 return raiseTestError("test_long_and_overflow",
386 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 /* Same again, with num = LONG_MAX + 1 */
389 num = PyLong_FromLong(LONG_MAX);
390 if (num == NULL)
391 return NULL;
392 one = PyLong_FromLong(1L);
393 if (one == NULL) {
394 Py_DECREF(num);
395 return NULL;
396 }
397 temp = PyNumber_Add(num, one);
398 Py_DECREF(one);
399 Py_DECREF(num);
400 num = temp;
401 if (num == NULL)
402 return NULL;
403 overflow = 0;
404 value = PyLong_AsLongAndOverflow(num, &overflow);
405 Py_DECREF(num);
406 if (value == -1 && PyErr_Occurred())
407 return NULL;
408 if (value != -1)
409 return raiseTestError("test_long_and_overflow",
410 "return value was not set to -1");
411 if (overflow != 1)
412 return raiseTestError("test_long_and_overflow",
413 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 /* Test that overflow is set properly for a large negative value. */
416 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
417 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
418 if (num == NULL)
419 return NULL;
420 overflow = 1234;
421 value = PyLong_AsLongAndOverflow(num, &overflow);
422 Py_DECREF(num);
423 if (value == -1 && PyErr_Occurred())
424 return NULL;
425 if (value != -1)
426 return raiseTestError("test_long_and_overflow",
427 "return value was not set to -1");
428 if (overflow != -1)
429 return raiseTestError("test_long_and_overflow",
430 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 /* Same again, with num = LONG_MIN - 1 */
433 num = PyLong_FromLong(LONG_MIN);
434 if (num == NULL)
435 return NULL;
436 one = PyLong_FromLong(1L);
437 if (one == NULL) {
438 Py_DECREF(num);
439 return NULL;
440 }
441 temp = PyNumber_Subtract(num, one);
442 Py_DECREF(one);
443 Py_DECREF(num);
444 num = temp;
445 if (num == NULL)
446 return NULL;
447 overflow = 0;
448 value = PyLong_AsLongAndOverflow(num, &overflow);
449 Py_DECREF(num);
450 if (value == -1 && PyErr_Occurred())
451 return NULL;
452 if (value != -1)
453 return raiseTestError("test_long_and_overflow",
454 "return value was not set to -1");
455 if (overflow != -1)
456 return raiseTestError("test_long_and_overflow",
457 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 /* Test that overflow is cleared properly for small values. */
460 num = PyLong_FromString("FF", NULL, 16);
461 if (num == NULL)
462 return NULL;
463 overflow = 1234;
464 value = PyLong_AsLongAndOverflow(num, &overflow);
465 Py_DECREF(num);
466 if (value == -1 && PyErr_Occurred())
467 return NULL;
468 if (value != 0xFF)
469 return raiseTestError("test_long_and_overflow",
470 "expected return value 0xFF");
471 if (overflow != 0)
472 return raiseTestError("test_long_and_overflow",
473 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 num = PyLong_FromString("-FF", NULL, 16);
476 if (num == NULL)
477 return NULL;
478 overflow = 0;
479 value = PyLong_AsLongAndOverflow(num, &overflow);
480 Py_DECREF(num);
481 if (value == -1 && PyErr_Occurred())
482 return NULL;
483 if (value != -0xFF)
484 return raiseTestError("test_long_and_overflow",
485 "expected return value 0xFF");
486 if (overflow != 0)
487 return raiseTestError("test_long_and_overflow",
488 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 num = PyLong_FromLong(LONG_MAX);
491 if (num == NULL)
492 return NULL;
493 overflow = 1234;
494 value = PyLong_AsLongAndOverflow(num, &overflow);
495 Py_DECREF(num);
496 if (value == -1 && PyErr_Occurred())
497 return NULL;
498 if (value != LONG_MAX)
499 return raiseTestError("test_long_and_overflow",
500 "expected return value LONG_MAX");
501 if (overflow != 0)
502 return raiseTestError("test_long_and_overflow",
503 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 num = PyLong_FromLong(LONG_MIN);
506 if (num == NULL)
507 return NULL;
508 overflow = 0;
509 value = PyLong_AsLongAndOverflow(num, &overflow);
510 Py_DECREF(num);
511 if (value == -1 && PyErr_Occurred())
512 return NULL;
513 if (value != LONG_MIN)
514 return raiseTestError("test_long_and_overflow",
515 "expected return value LONG_MIN");
516 if (overflow != 0)
517 return raiseTestError("test_long_and_overflow",
518 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 Py_INCREF(Py_None);
521 return Py_None;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000522}
523
Mark Dickinson93f562c2010-01-30 10:30:15 +0000524/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
525 PY_LONG_LONG is tested by test_long_api_inner. This test will
526 concentrate on proper handling of overflow.
527*/
528
529static PyObject *
530test_long_long_and_overflow(PyObject *self)
531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 PyObject *num, *one, *temp;
533 PY_LONG_LONG value;
534 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 /* Test that overflow is set properly for a large value. */
537 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
538 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
539 if (num == NULL)
540 return NULL;
541 overflow = 1234;
542 value = PyLong_AsLongLongAndOverflow(num, &overflow);
543 Py_DECREF(num);
544 if (value == -1 && PyErr_Occurred())
545 return NULL;
546 if (value != -1)
547 return raiseTestError("test_long_long_and_overflow",
548 "return value was not set to -1");
549 if (overflow != 1)
550 return raiseTestError("test_long_long_and_overflow",
551 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 /* Same again, with num = PY_LLONG_MAX + 1 */
554 num = PyLong_FromLongLong(PY_LLONG_MAX);
555 if (num == NULL)
556 return NULL;
557 one = PyLong_FromLong(1L);
558 if (one == NULL) {
559 Py_DECREF(num);
560 return NULL;
561 }
562 temp = PyNumber_Add(num, one);
563 Py_DECREF(one);
564 Py_DECREF(num);
565 num = temp;
566 if (num == NULL)
567 return NULL;
568 overflow = 0;
569 value = PyLong_AsLongLongAndOverflow(num, &overflow);
570 Py_DECREF(num);
571 if (value == -1 && PyErr_Occurred())
572 return NULL;
573 if (value != -1)
574 return raiseTestError("test_long_long_and_overflow",
575 "return value was not set to -1");
576 if (overflow != 1)
577 return raiseTestError("test_long_long_and_overflow",
578 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 /* Test that overflow is set properly for a large negative value. */
581 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
582 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
583 if (num == NULL)
584 return NULL;
585 overflow = 1234;
586 value = PyLong_AsLongLongAndOverflow(num, &overflow);
587 Py_DECREF(num);
588 if (value == -1 && PyErr_Occurred())
589 return NULL;
590 if (value != -1)
591 return raiseTestError("test_long_long_and_overflow",
592 "return value was not set to -1");
593 if (overflow != -1)
594 return raiseTestError("test_long_long_and_overflow",
595 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 /* Same again, with num = PY_LLONG_MIN - 1 */
598 num = PyLong_FromLongLong(PY_LLONG_MIN);
599 if (num == NULL)
600 return NULL;
601 one = PyLong_FromLong(1L);
602 if (one == NULL) {
603 Py_DECREF(num);
604 return NULL;
605 }
606 temp = PyNumber_Subtract(num, one);
607 Py_DECREF(one);
608 Py_DECREF(num);
609 num = temp;
610 if (num == NULL)
611 return NULL;
612 overflow = 0;
613 value = PyLong_AsLongLongAndOverflow(num, &overflow);
614 Py_DECREF(num);
615 if (value == -1 && PyErr_Occurred())
616 return NULL;
617 if (value != -1)
618 return raiseTestError("test_long_long_and_overflow",
619 "return value was not set to -1");
620 if (overflow != -1)
621 return raiseTestError("test_long_long_and_overflow",
622 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 /* Test that overflow is cleared properly for small values. */
625 num = PyLong_FromString("FF", NULL, 16);
626 if (num == NULL)
627 return NULL;
628 overflow = 1234;
629 value = PyLong_AsLongLongAndOverflow(num, &overflow);
630 Py_DECREF(num);
631 if (value == -1 && PyErr_Occurred())
632 return NULL;
633 if (value != 0xFF)
634 return raiseTestError("test_long_long_and_overflow",
635 "expected return value 0xFF");
636 if (overflow != 0)
637 return raiseTestError("test_long_long_and_overflow",
638 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 num = PyLong_FromString("-FF", NULL, 16);
641 if (num == NULL)
642 return NULL;
643 overflow = 0;
644 value = PyLong_AsLongLongAndOverflow(num, &overflow);
645 Py_DECREF(num);
646 if (value == -1 && PyErr_Occurred())
647 return NULL;
648 if (value != -0xFF)
649 return raiseTestError("test_long_long_and_overflow",
650 "expected return value 0xFF");
651 if (overflow != 0)
652 return raiseTestError("test_long_long_and_overflow",
653 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 num = PyLong_FromLongLong(PY_LLONG_MAX);
656 if (num == NULL)
657 return NULL;
658 overflow = 1234;
659 value = PyLong_AsLongLongAndOverflow(num, &overflow);
660 Py_DECREF(num);
661 if (value == -1 && PyErr_Occurred())
662 return NULL;
663 if (value != PY_LLONG_MAX)
664 return raiseTestError("test_long_long_and_overflow",
665 "expected return value PY_LLONG_MAX");
666 if (overflow != 0)
667 return raiseTestError("test_long_long_and_overflow",
668 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 num = PyLong_FromLongLong(PY_LLONG_MIN);
671 if (num == NULL)
672 return NULL;
673 overflow = 0;
674 value = PyLong_AsLongLongAndOverflow(num, &overflow);
675 Py_DECREF(num);
676 if (value == -1 && PyErr_Occurred())
677 return NULL;
678 if (value != PY_LLONG_MIN)
679 return raiseTestError("test_long_long_and_overflow",
680 "expected return value PY_LLONG_MIN");
681 if (overflow != 0)
682 return raiseTestError("test_long_long_and_overflow",
683 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 Py_INCREF(Py_None);
686 return Py_None;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000687}
688
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200689/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
690 non-integer arguments are handled correctly. It should be extended to
691 test overflow handling.
692 */
693
694static PyObject *
695test_long_as_size_t(PyObject *self)
696{
697 size_t out_u;
698 Py_ssize_t out_s;
699
700 Py_INCREF(Py_None);
701
702 out_u = PyLong_AsSize_t(Py_None);
703 if (out_u != (size_t)-1 || !PyErr_Occurred())
704 return raiseTestError("test_long_as_size_t",
705 "PyLong_AsSize_t(None) didn't complain");
706 if (!PyErr_ExceptionMatches(PyExc_TypeError))
707 return raiseTestError("test_long_as_size_t",
708 "PyLong_AsSize_t(None) raised "
709 "something other than TypeError");
710 PyErr_Clear();
711
712 out_s = PyLong_AsSsize_t(Py_None);
713 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
714 return raiseTestError("test_long_as_size_t",
715 "PyLong_AsSsize_t(None) didn't complain");
716 if (!PyErr_ExceptionMatches(PyExc_TypeError))
717 return raiseTestError("test_long_as_size_t",
718 "PyLong_AsSsize_t(None) raised "
719 "something other than TypeError");
720 PyErr_Clear();
721
722 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
723 return Py_None;
724}
725
726/* Test the PyLong_AsDouble API. At present this just tests that
727 non-integer arguments are handled correctly.
728 */
729
730static PyObject *
731test_long_as_double(PyObject *self)
732{
733 double out;
734
735 Py_INCREF(Py_None);
736
737 out = PyLong_AsDouble(Py_None);
738 if (out != -1.0 || !PyErr_Occurred())
739 return raiseTestError("test_long_as_double",
740 "PyLong_AsDouble(None) didn't complain");
741 if (!PyErr_ExceptionMatches(PyExc_TypeError))
742 return raiseTestError("test_long_as_double",
743 "PyLong_AsDouble(None) raised "
744 "something other than TypeError");
745 PyErr_Clear();
746
747 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
748 return Py_None;
749}
750
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000751/* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
Tim Petersd38b1c72001-09-30 05:09:37 +0000752 for both long and int arguments. The test may leak a little memory if
753 it fails.
754*/
755static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000756test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000757{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 PyObject *tuple, *num;
759 PY_LONG_LONG value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 tuple = PyTuple_New(1);
762 if (tuple == NULL)
763 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 num = PyLong_FromLong(42);
766 if (num == NULL)
767 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 value = -1;
772 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
773 return NULL;
774 if (value != 42)
775 return raiseTestError("test_L_code",
776 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 Py_DECREF(num);
779 num = PyLong_FromLong(42);
780 if (num == NULL)
781 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 value = -1;
786 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
787 return NULL;
788 if (value != 42)
789 return raiseTestError("test_L_code",
790 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 Py_DECREF(tuple);
793 Py_INCREF(Py_None);
794 return Py_None;
Tim Petersd38b1c72001-09-30 05:09:37 +0000795}
796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797#endif /* ifdef HAVE_LONG_LONG */
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000798
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000799/* Test tuple argument processing */
800static PyObject *
801getargs_tuple(PyObject *self, PyObject *args)
802{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 int a, b, c;
804 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
805 return NULL;
806 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000807}
808
Christian Heimes380f7f22008-02-28 11:19:05 +0000809/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +0000810static PyObject *
811getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +0000812{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
814 static char *fmt="(ii)i|(i(ii))(iii)i";
815 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +0000816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
818 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
819 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
820 return NULL;
821 return Py_BuildValue("iiiiiiiiii",
822 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
823 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +0000824}
825
Larry Hastings83a9f482012-03-20 20:06:16 +0000826/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
827static PyObject *
828getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
829{
830 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
831 int required = -1;
832 int optional = -1;
833 int keyword_only = -1;
834
835 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
836 &required, &optional, &keyword_only))
837 return NULL;
838 return Py_BuildValue("iii", required, optional, keyword_only);
839}
840
Thomas Heller3457e4b2003-04-24 16:14:27 +0000841/* Functions to call PyArg_ParseTuple with integer format codes,
842 and return the result.
843*/
Thomas Hellera4ea6032003-04-17 18:55:45 +0000844static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000845getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000846{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 unsigned char value;
848 if (!PyArg_ParseTuple(args, "b", &value))
849 return NULL;
850 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000851}
852
Thomas Heller3457e4b2003-04-24 16:14:27 +0000853static PyObject *
854getargs_B(PyObject *self, PyObject *args)
855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 unsigned char value;
857 if (!PyArg_ParseTuple(args, "B", &value))
858 return NULL;
859 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000860}
861
862static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +0000863getargs_h(PyObject *self, PyObject *args)
864{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 short value;
866 if (!PyArg_ParseTuple(args, "h", &value))
867 return NULL;
868 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +0000869}
870
871static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000872getargs_H(PyObject *self, PyObject *args)
873{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 unsigned short value;
875 if (!PyArg_ParseTuple(args, "H", &value))
876 return NULL;
877 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000878}
879
880static PyObject *
881getargs_I(PyObject *self, PyObject *args)
882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 unsigned int value;
884 if (!PyArg_ParseTuple(args, "I", &value))
885 return NULL;
886 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000887}
888
889static PyObject *
890getargs_k(PyObject *self, PyObject *args)
891{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 unsigned long value;
893 if (!PyArg_ParseTuple(args, "k", &value))
894 return NULL;
895 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000896}
897
898static PyObject *
899getargs_i(PyObject *self, PyObject *args)
900{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 int value;
902 if (!PyArg_ParseTuple(args, "i", &value))
903 return NULL;
904 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000905}
906
Thomas Hellera4ea6032003-04-17 18:55:45 +0000907static PyObject *
908getargs_l(PyObject *self, PyObject *args)
909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 long value;
911 if (!PyArg_ParseTuple(args, "l", &value))
912 return NULL;
913 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000914}
915
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000916static PyObject *
917getargs_n(PyObject *self, PyObject *args)
918{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 Py_ssize_t value;
920 if (!PyArg_ParseTuple(args, "n", &value))
921 return NULL;
922 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000923}
924
Larry Hastingsfaf91e72012-05-05 16:54:29 -0700925static PyObject *
926getargs_p(PyObject *self, PyObject *args)
927{
928 int value;
929 if (!PyArg_ParseTuple(args, "p", &value))
930 return NULL;
931 return PyLong_FromLong(value);
932}
933
Thomas Hellera4ea6032003-04-17 18:55:45 +0000934#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +0000935static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000936getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 PY_LONG_LONG value;
939 if (!PyArg_ParseTuple(args, "L", &value))
940 return NULL;
941 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000942}
943
Thomas Hellera4ea6032003-04-17 18:55:45 +0000944static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000945getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 unsigned PY_LONG_LONG value;
948 if (!PyArg_ParseTuple(args, "K", &value))
949 return NULL;
950 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000951}
952#endif
953
954/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +0000955 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +0000956static PyObject *
957test_k_code(PyObject *self)
958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 PyObject *tuple, *num;
960 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 tuple = PyTuple_New(1);
963 if (tuple == NULL)
964 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 /* a number larger than ULONG_MAX even on 64-bit platforms */
967 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
968 if (num == NULL)
969 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 value = PyLong_AsUnsignedLongMask(num);
972 if (value != ULONG_MAX)
973 return raiseTestError("test_k_code",
974 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 value = 0;
979 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
980 return NULL;
981 if (value != ULONG_MAX)
982 return raiseTestError("test_k_code",
983 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 Py_DECREF(num);
986 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
987 if (num == NULL)
988 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 value = PyLong_AsUnsignedLongMask(num);
991 if (value != (unsigned long)-0x42)
992 return raiseTestError("test_k_code",
993 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 value = 0;
998 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
999 return NULL;
1000 if (value != (unsigned long)-0x42)
1001 return raiseTestError("test_k_code",
1002 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 Py_DECREF(tuple);
1005 Py_INCREF(Py_None);
1006 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001007}
1008
Victor Stinner06e49dd2010-06-13 18:21:50 +00001009static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001010getargs_c(PyObject *self, PyObject *args)
1011{
1012 char c;
1013 if (!PyArg_ParseTuple(args, "c", &c))
1014 return NULL;
1015 return PyBytes_FromStringAndSize(&c, 1);
1016}
1017
1018static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001019getargs_s(PyObject *self, PyObject *args)
1020{
1021 char *str;
1022 if (!PyArg_ParseTuple(args, "s", &str))
1023 return NULL;
1024 return PyBytes_FromString(str);
1025}
1026
1027static PyObject *
1028getargs_s_star(PyObject *self, PyObject *args)
1029{
1030 Py_buffer buffer;
1031 PyObject *bytes;
1032 if (!PyArg_ParseTuple(args, "s*", &buffer))
1033 return NULL;
1034 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1035 PyBuffer_Release(&buffer);
1036 return bytes;
1037}
1038
1039static PyObject *
1040getargs_s_hash(PyObject *self, PyObject *args)
1041{
1042 char *str;
1043 Py_ssize_t size;
1044 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1045 return NULL;
1046 return PyBytes_FromStringAndSize(str, size);
1047}
1048
1049static PyObject *
1050getargs_z(PyObject *self, PyObject *args)
1051{
1052 char *str;
1053 if (!PyArg_ParseTuple(args, "z", &str))
1054 return NULL;
1055 if (str != NULL)
1056 return PyBytes_FromString(str);
1057 else
1058 Py_RETURN_NONE;
1059}
1060
1061static PyObject *
1062getargs_z_star(PyObject *self, PyObject *args)
1063{
1064 Py_buffer buffer;
1065 PyObject *bytes;
1066 if (!PyArg_ParseTuple(args, "z*", &buffer))
1067 return NULL;
1068 if (buffer.buf != NULL)
1069 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1070 else {
1071 Py_INCREF(Py_None);
1072 bytes = Py_None;
1073 }
1074 PyBuffer_Release(&buffer);
1075 return bytes;
1076}
1077
1078static PyObject *
1079getargs_z_hash(PyObject *self, PyObject *args)
1080{
1081 char *str;
1082 Py_ssize_t size;
1083 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1084 return NULL;
1085 if (str != NULL)
1086 return PyBytes_FromStringAndSize(str, size);
1087 else
1088 Py_RETURN_NONE;
1089}
1090
1091static PyObject *
1092getargs_y(PyObject *self, PyObject *args)
1093{
1094 char *str;
1095 if (!PyArg_ParseTuple(args, "y", &str))
1096 return NULL;
1097 return PyBytes_FromString(str);
1098}
1099
1100static PyObject *
1101getargs_y_star(PyObject *self, PyObject *args)
1102{
1103 Py_buffer buffer;
1104 PyObject *bytes;
1105 if (!PyArg_ParseTuple(args, "y*", &buffer))
1106 return NULL;
1107 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1108 PyBuffer_Release(&buffer);
1109 return bytes;
1110}
1111
1112static PyObject *
1113getargs_y_hash(PyObject *self, PyObject *args)
1114{
1115 char *str;
1116 Py_ssize_t size;
1117 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1118 return NULL;
1119 return PyBytes_FromStringAndSize(str, size);
1120}
1121
1122static PyObject *
1123getargs_u(PyObject *self, PyObject *args)
1124{
1125 Py_UNICODE *str;
1126 Py_ssize_t size;
1127 if (!PyArg_ParseTuple(args, "u", &str))
1128 return NULL;
1129 size = Py_UNICODE_strlen(str);
1130 return PyUnicode_FromUnicode(str, size);
1131}
1132
1133static PyObject *
1134getargs_u_hash(PyObject *self, PyObject *args)
1135{
1136 Py_UNICODE *str;
1137 Py_ssize_t size;
1138 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1139 return NULL;
1140 return PyUnicode_FromUnicode(str, size);
1141}
1142
1143static PyObject *
1144getargs_Z(PyObject *self, PyObject *args)
1145{
1146 Py_UNICODE *str;
1147 Py_ssize_t size;
1148 if (!PyArg_ParseTuple(args, "Z", &str))
1149 return NULL;
1150 if (str != NULL) {
1151 size = Py_UNICODE_strlen(str);
1152 return PyUnicode_FromUnicode(str, size);
1153 } else
1154 Py_RETURN_NONE;
1155}
1156
1157static PyObject *
1158getargs_Z_hash(PyObject *self, PyObject *args)
1159{
1160 Py_UNICODE *str;
1161 Py_ssize_t size;
1162 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1163 return NULL;
1164 if (str != NULL)
1165 return PyUnicode_FromUnicode(str, size);
1166 else
1167 Py_RETURN_NONE;
1168}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001169
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001170/* Test the s and z codes for PyArg_ParseTuple.
1171*/
1172static PyObject *
1173test_s_code(PyObject *self)
1174{
1175 /* Unicode strings should be accepted */
1176 PyObject *tuple, *obj;
1177 char *value;
1178
1179 tuple = PyTuple_New(1);
1180 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001182
1183 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001185 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001187
1188 PyTuple_SET_ITEM(tuple, 0, obj);
1189
1190 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001192 */
1193 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001195
1196 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001198
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001199 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001200 Py_RETURN_NONE;
1201}
1202
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001203static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001204parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001205{
Larry Hastings8f904da2012-06-22 03:56:29 -07001206 PyObject *sub_args;
1207 PyObject *sub_kwargs;
1208 char *sub_format;
1209 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001210
Larry Hastings8f904da2012-06-22 03:56:29 -07001211 Py_ssize_t i, size;
1212 char *keywords[8 + 1]; /* space for NULL at end */
1213 PyObject *o;
1214 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001215
Larry Hastings8f904da2012-06-22 03:56:29 -07001216 int result;
1217 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001218
Larry Hastings22701e82012-08-08 14:52:22 -07001219 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001220
Larry Hastings8f904da2012-06-22 03:56:29 -07001221 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1222 &sub_args, &sub_kwargs,
1223 &sub_format, &sub_keywords))
1224 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001225
Larry Hastings8f904da2012-06-22 03:56:29 -07001226 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1227 PyErr_SetString(PyExc_ValueError,
1228 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1229 return NULL;
1230 }
1231
1232 memset(buffers, 0, sizeof(buffers));
1233 memset(converted, 0, sizeof(converted));
1234 memset(keywords, 0, sizeof(keywords));
1235
1236 size = PySequence_Fast_GET_SIZE(sub_keywords);
1237 if (size > 8) {
1238 PyErr_SetString(PyExc_ValueError,
1239 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1240 goto exit;
1241 }
1242
1243 for (i = 0; i < size; i++) {
1244 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1245 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1246 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001247 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001248 goto exit;
1249 }
1250 keywords[i] = PyBytes_AS_STRING(converted[i]);
1251 }
1252
1253 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1254 sub_format, keywords,
1255 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1256 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1257
1258 if (result) {
1259 return_value = Py_None;
1260 Py_INCREF(Py_None);
1261 }
1262
1263exit:
1264 size = sizeof(converted) / sizeof(converted[0]);
1265 for (i = 0; i < size; i++) {
1266 Py_XDECREF(converted[i]);
1267 }
1268 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001269}
1270
Benjamin Peterson92035012008-12-27 16:00:54 +00001271static volatile int x;
1272
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001273/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1274 of an error.
1275*/
1276static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001277test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 PyObject *tuple, *obj;
1280 Py_UNICODE *value;
1281 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1284 /* Just use the macro and check that it compiles */
1285 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 tuple = PyTuple_New(1);
1288 if (tuple == NULL)
1289 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 obj = PyUnicode_Decode("test", strlen("test"),
1292 "ascii", NULL);
1293 if (obj == NULL)
1294 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 value = 0;
1299 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1300 return NULL;
1301 if (value != PyUnicode_AS_UNICODE(obj))
1302 return raiseTestError("test_u_code",
1303 "u code returned wrong value for u'test'");
1304 value = 0;
1305 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1306 return NULL;
1307 if (value != PyUnicode_AS_UNICODE(obj) ||
1308 len != PyUnicode_GET_SIZE(obj))
1309 return raiseTestError("test_u_code",
1310 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 Py_DECREF(tuple);
1313 Py_INCREF(Py_None);
1314 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001315}
1316
Guido van Rossumfb67be22007-08-29 18:38:11 +00001317/* Test Z and Z# codes for PyArg_ParseTuple */
1318static PyObject *
1319test_Z_code(PyObject *self)
1320{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001322 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 tuple = PyTuple_New(2);
1326 if (tuple == NULL)
1327 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 obj = PyUnicode_FromString("test");
1330 PyTuple_SET_ITEM(tuple, 0, obj);
1331 Py_INCREF(Py_None);
1332 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 /* swap values on purpose */
1335 value1 = NULL;
1336 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 /* Test Z for both values */
1339 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1340 return NULL;
1341 if (value1 != PyUnicode_AS_UNICODE(obj))
1342 return raiseTestError("test_Z_code",
1343 "Z code returned wrong value for 'test'");
1344 if (value2 != NULL)
1345 return raiseTestError("test_Z_code",
1346 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 value1 = NULL;
1349 value2 = PyUnicode_AS_UNICODE(obj);
1350 len1 = -1;
1351 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 /* Test Z# for both values */
1354 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1355 &value2, &len2) < 0)
1356 return NULL;
1357 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1358 len1 != PyUnicode_GET_SIZE(obj))
1359 return raiseTestError("test_Z_code",
1360 "Z# code returned wrong values for 'test'");
1361 if (value2 != NULL ||
1362 len2 != 0)
1363 return raiseTestError("test_Z_code",
1364 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 Py_DECREF(tuple);
1367 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001368}
1369
Thomas Wouters477c8d52006-05-27 19:21:47 +00001370static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001371test_widechar(PyObject *self)
1372{
1373#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1375 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001376 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001377#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1379 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001380#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1384 if (wide == NULL)
1385 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1388 if (utf8 == NULL) {
1389 Py_DECREF(wide);
1390 return NULL;
1391 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001392
Victor Stinner8ef18872011-11-21 02:06:57 +01001393 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 Py_DECREF(wide);
1395 Py_DECREF(utf8);
1396 return raiseTestError("test_widechar",
1397 "wide string and utf8 string "
1398 "have different length");
1399 }
1400 if (PyUnicode_Compare(wide, utf8)) {
1401 Py_DECREF(wide);
1402 Py_DECREF(utf8);
1403 if (PyErr_Occurred())
1404 return NULL;
1405 return raiseTestError("test_widechar",
1406 "wide string and utf8 string "
1407 "are different");
1408 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 Py_DECREF(wide);
1411 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001412
1413#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1414 wide = PyUnicode_FromWideChar(invalid, 1);
1415 if (wide == NULL)
1416 PyErr_Clear();
1417 else
1418 return raiseTestError("test_widechar",
1419 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1420
1421 wide = PyUnicode_FromUnicode(invalid, 1);
1422 if (wide == NULL)
1423 PyErr_Clear();
1424 else
1425 return raiseTestError("test_widechar",
1426 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001427
1428 wide = PyUnicode_FromUnicode(NULL, 1);
1429 if (wide == NULL)
1430 return NULL;
1431 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001432 if (_PyUnicode_Ready(wide) < 0) {
1433 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001434 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001435 }
1436 else {
1437 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001438 return raiseTestError("test_widechar",
1439 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001440 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001441#endif
1442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001444}
1445
1446static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001447unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001448{
1449 PyObject *unicode, *result;
1450 Py_ssize_t buflen, size;
1451 wchar_t *buffer;
1452
1453 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1454 return NULL;
1455 buffer = PyMem_Malloc(buflen * sizeof(wchar_t));
1456 if (buffer == NULL)
1457 return PyErr_NoMemory();
1458
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001459 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001460 if (size == -1) {
1461 PyMem_Free(buffer);
1462 return NULL;
1463 }
1464
1465 if (size < buflen)
1466 buflen = size + 1;
1467 else
1468 buflen = size;
1469 result = PyUnicode_FromWideChar(buffer, buflen);
1470 PyMem_Free(buffer);
1471 if (result == NULL)
1472 return NULL;
1473
1474 return Py_BuildValue("(Nn)", result, size);
1475}
1476
1477static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001478unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001479{
1480 PyObject *unicode, *result;
1481 Py_ssize_t size;
1482 wchar_t *buffer;
1483
1484 if (!PyArg_ParseTuple(args, "U", &unicode))
1485 return NULL;
1486
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001487 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001488 if (buffer == NULL)
1489 return NULL;
1490
1491 result = PyUnicode_FromWideChar(buffer, size + 1);
1492 PyMem_Free(buffer);
1493 if (result == NULL)
1494 return NULL;
1495 return Py_BuildValue("(Nn)", result, size);
1496}
1497
1498static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001499unicode_encodedecimal(PyObject *self, PyObject *args)
1500{
1501 Py_UNICODE *unicode;
1502 Py_ssize_t length;
1503 char *errors = NULL;
1504 PyObject *decimal;
1505 Py_ssize_t decimal_length, new_length;
1506 int res;
1507
1508 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1509 return NULL;
1510
1511 decimal_length = length * 7; /* len('&#8364;') */
1512 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1513 if (decimal == NULL)
1514 return NULL;
1515
1516 res = PyUnicode_EncodeDecimal(unicode, length,
1517 PyBytes_AS_STRING(decimal),
1518 errors);
1519 if (res < 0) {
1520 Py_DECREF(decimal);
1521 return NULL;
1522 }
1523
1524 new_length = strlen(PyBytes_AS_STRING(decimal));
1525 assert(new_length <= decimal_length);
1526 res = _PyBytes_Resize(&decimal, new_length);
1527 if (res < 0)
1528 return NULL;
1529
1530 return decimal;
1531}
1532
1533static PyObject *
1534unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1535{
1536 Py_UNICODE *unicode;
1537 Py_ssize_t length;
1538 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1539 return NULL;
1540 return PyUnicode_TransformDecimalToASCII(unicode, length);
1541}
1542
1543static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001544unicode_legacy_string(PyObject *self, PyObject *args)
1545{
1546 Py_UNICODE *data;
1547 Py_ssize_t len;
1548 PyObject *u;
1549
1550 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1551 return NULL;
1552
1553 u = PyUnicode_FromUnicode(NULL, len);
1554 if (u == NULL)
1555 return NULL;
1556
1557 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1558
1559 if (len > 0) { /* The empty string is always ready. */
1560 assert(!PyUnicode_IS_READY(u));
1561 }
1562
1563 return u;
1564}
1565
1566static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001567getargs_w_star(PyObject *self, PyObject *args)
1568{
1569 Py_buffer buffer;
1570 PyObject *result;
1571 char *str;
1572
1573 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1574 return NULL;
1575
1576 if (2 <= buffer.len) {
1577 str = buffer.buf;
1578 str[0] = '[';
1579 str[buffer.len-1] = ']';
1580 }
1581
1582 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1583 PyBuffer_Release(&buffer);
1584 return result;
1585}
1586
1587
1588static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001589test_empty_argparse(PyObject *self)
1590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 /* Test that formats can begin with '|'. See issue #4720. */
1592 PyObject *tuple, *dict = NULL;
1593 static char *kwlist[] = {NULL};
1594 int result;
1595 tuple = PyTuple_New(0);
1596 if (!tuple)
1597 return NULL;
1598 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1599 goto done;
1600 dict = PyDict_New();
1601 if (!dict)
1602 goto done;
1603 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00001604 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 Py_DECREF(tuple);
1606 Py_XDECREF(dict);
1607 if (result < 0)
1608 return NULL;
1609 else {
1610 Py_RETURN_NONE;
1611 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001612}
1613
1614static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001615codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001616{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 const char *encoding, *errors = NULL;
1618 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1619 &encoding, &errors))
1620 return NULL;
1621 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001622}
1623
Thomas Wouters477c8d52006-05-27 19:21:47 +00001624static PyObject *
1625codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001626{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 const char *encoding, *errors = NULL;
1628 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1629 &encoding, &errors))
1630 return NULL;
1631 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001632}
1633
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001634
Tim Peters5b8132f2003-01-31 15:52:05 +00001635/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001636static PyObject *
1637test_long_numbits(PyObject *self)
1638{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 struct triple {
1640 long input;
1641 size_t nbits;
1642 int sign;
1643 } testcases[] = {{0, 0, 0},
1644 {1L, 1, 1},
1645 {-1L, 1, -1},
1646 {2L, 2, 1},
1647 {-2L, 2, -1},
1648 {3L, 2, 1},
1649 {-3L, 2, -1},
1650 {4L, 3, 1},
1651 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03001652 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 {-0x7fffL, 15, -1},
1654 {0xffffL, 16, 1},
1655 {-0xffffL, 16, -1},
1656 {0xfffffffL, 28, 1},
1657 {-0xfffffffL, 28, -1}};
1658 int i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001659
Victor Stinner63941882011-09-29 00:42:28 +02001660 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02001661 size_t nbits;
1662 int sign;
1663 PyObject *plong;
1664
1665 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02001666 if (plong == NULL)
1667 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02001668 nbits = _PyLong_NumBits(plong);
1669 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 Py_DECREF(plong);
1672 if (nbits != testcases[i].nbits)
1673 return raiseTestError("test_long_numbits",
1674 "wrong result for _PyLong_NumBits");
1675 if (sign != testcases[i].sign)
1676 return raiseTestError("test_long_numbits",
1677 "wrong result for _PyLong_Sign");
1678 }
1679 Py_INCREF(Py_None);
1680 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001681}
1682
Thomas Heller519a0422007-11-15 20:48:54 +00001683/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00001684
1685static PyObject *
1686test_null_strings(PyObject *self)
1687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
1689 PyObject *tuple = PyTuple_Pack(2, o1, o2);
1690 Py_XDECREF(o1);
1691 Py_XDECREF(o2);
1692 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00001693}
1694
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001695static PyObject *
1696raise_exception(PyObject *self, PyObject *args)
1697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 PyObject *exc;
1699 PyObject *exc_args, *v;
1700 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
1703 &exc, &num_args))
1704 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 exc_args = PyTuple_New(num_args);
1707 if (exc_args == NULL)
1708 return NULL;
1709 for (i = 0; i < num_args; ++i) {
1710 v = PyLong_FromLong(i);
1711 if (v == NULL) {
1712 Py_DECREF(exc_args);
1713 return NULL;
1714 }
1715 PyTuple_SET_ITEM(exc_args, i, v);
1716 }
1717 PyErr_SetObject(exc, exc_args);
1718 Py_DECREF(exc_args);
1719 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001720}
Tim Peters91621db2001-06-12 20:10:01 +00001721
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02001722static PyObject *
1723test_set_exc_info(PyObject *self, PyObject *args)
1724{
1725 PyObject *orig_exc;
1726 PyObject *new_type, *new_value, *new_tb;
1727 PyObject *type, *value, *tb;
1728 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
1729 &new_type, &new_value, &new_tb))
1730 return NULL;
1731
1732 PyErr_GetExcInfo(&type, &value, &tb);
1733
1734 Py_INCREF(new_type);
1735 Py_INCREF(new_value);
1736 Py_INCREF(new_tb);
1737 PyErr_SetExcInfo(new_type, new_value, new_tb);
1738
1739 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
1740 Py_XDECREF(type);
1741 Py_XDECREF(value);
1742 Py_XDECREF(tb);
1743 return orig_exc;
1744}
Benjamin Peterson16323982010-02-03 01:13:41 +00001745
1746static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001747
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001748static PyObject *
1749test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 if (PyDateTimeAPI) {
1751 if (test_run_counter) {
1752 /* Probably regrtest.py -R */
1753 Py_RETURN_NONE;
1754 }
1755 else {
1756 PyErr_SetString(PyExc_AssertionError,
1757 "PyDateTime_CAPI somehow initialized");
1758 return NULL;
1759 }
1760 }
1761 test_run_counter++;
1762 PyDateTime_IMPORT;
1763 if (PyDateTimeAPI)
1764 Py_RETURN_NONE;
1765 else
1766 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001767}
1768
Benjamin Peterson16323982010-02-03 01:13:41 +00001769
1770#ifdef WITH_THREAD
1771
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001772/* test_thread_state spawns a thread of its own, and that thread releases
1773 * `thread_done` when it's finished. The driver code has to know when the
1774 * thread finishes, because the thread uses a PyObject (the callable) that
1775 * may go away when the driver finishes. The former lack of this explicit
1776 * synchronization caused rare segfaults, so rare that they were seen only
1777 * on a Mac buildbot (although they were possible on any box).
1778 */
1779static PyThread_type_lock thread_done = NULL;
1780
Benjamin Petersona786b022008-08-25 21:05:21 +00001781static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001782_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 PyObject *rc;
1785 int success;
1786 PyGILState_STATE s = PyGILState_Ensure();
1787 rc = PyObject_CallFunction((PyObject *)callable, "");
1788 success = (rc != NULL);
1789 Py_XDECREF(rc);
1790 PyGILState_Release(s);
1791 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001792}
1793
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001794/* Same thing, but releases `thread_done` when it returns. This variant
1795 * should be called only from threads spawned by test_thread_state().
1796 */
1797static void
1798_make_call_from_thread(void *callable)
1799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 _make_call(callable);
1801 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001802}
1803
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001804static PyObject *
1805test_thread_state(PyObject *self, PyObject *args)
1806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 PyObject *fn;
1808 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1811 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 if (!PyCallable_Check(fn)) {
1814 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1815 fn->ob_type->tp_name);
1816 return NULL;
1817 }
Benjamin Petersona786b022008-08-25 21:05:21 +00001818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 /* Ensure Python is set up for threading */
1820 PyEval_InitThreads();
1821 thread_done = PyThread_allocate_lock();
1822 if (thread_done == NULL)
1823 return PyErr_NoMemory();
1824 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 /* Start a new thread with our callback. */
1827 PyThread_start_new_thread(_make_call_from_thread, fn);
1828 /* Make the callback with the thread lock held by this thread */
1829 success &= _make_call(fn);
1830 /* Do it all again, but this time with the thread-lock released */
1831 Py_BEGIN_ALLOW_THREADS
1832 success &= _make_call(fn);
1833 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1834 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 /* And once more with and without a thread
1837 XXX - should use a lock and work out exactly what we are trying
1838 to test <wink>
1839 */
1840 Py_BEGIN_ALLOW_THREADS
1841 PyThread_start_new_thread(_make_call_from_thread, fn);
1842 success &= _make_call(fn);
1843 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1844 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 /* Release lock we acquired above. This is required on HP-UX. */
1847 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 PyThread_free_lock(thread_done);
1850 if (!success)
1851 return NULL;
1852 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001853}
Benjamin Petersona54c9092009-01-13 02:11:23 +00001854
1855/* test Py_AddPendingCalls using threads */
1856static int _pending_callback(void *arg)
1857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 /* we assume the argument is callable object to which we own a reference */
1859 PyObject *callable = (PyObject *)arg;
1860 PyObject *r = PyObject_CallObject(callable, NULL);
1861 Py_DECREF(callable);
1862 Py_XDECREF(r);
1863 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001864}
1865
1866/* The following requests n callbacks to _pending_callback. It can be
1867 * run from any python thread.
1868 */
1869PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
1870{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 PyObject *callable;
1872 int r;
1873 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
1874 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 /* create the reference for the callbackwhile we hold the lock */
1877 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00001878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 Py_BEGIN_ALLOW_THREADS
1880 r = Py_AddPendingCall(&_pending_callback, callable);
1881 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 if (r<0) {
1884 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
1885 Py_INCREF(Py_False);
1886 return Py_False;
1887 }
1888 Py_INCREF(Py_True);
1889 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001890}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001891#endif
1892
Neal Norwitzb0d26332007-08-25 00:49:05 +00001893/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001894static PyObject *
1895test_string_from_format(PyObject *self, PyObject *args)
1896{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 PyObject *result;
1898 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001899
Alexander Belopolskye239d232010-12-08 23:31:48 +00001900#define CHECK_1_FORMAT(FORMAT, TYPE) \
1901 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
1902 if (result == NULL) \
1903 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01001904 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00001905 msg = FORMAT " failed at 1"; \
1906 goto Fail; \
1907 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 CHECK_1_FORMAT("%d", int);
1911 CHECK_1_FORMAT("%ld", long);
1912 /* The z width modifier was added in Python 2.5. */
1913 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 /* The u type code was added in Python 2.5. */
1916 CHECK_1_FORMAT("%u", unsigned int);
1917 CHECK_1_FORMAT("%lu", unsigned long);
1918 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001921#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
1923 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001924#endif
1925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001927
1928 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 Py_XDECREF(result);
1930 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001931
1932#undef CHECK_1_FORMAT
1933}
1934
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001935
1936static PyObject *
1937test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
1939 int result;
1940 if (py_s == NULL)
1941 return NULL;
1942 result = PyUnicode_CompareWithASCIIString(py_s, "str");
1943 Py_DECREF(py_s);
1944 if (!result) {
1945 PyErr_SetString(TestError, "Python string ending in NULL "
1946 "should not compare equal to c string.");
1947 return NULL;
1948 }
1949 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00001950}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001951
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001952/* This is here to provide a docstring for test_descr. */
1953static PyObject *
1954test_with_docstring(PyObject *self)
1955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001957}
1958
Mark Dickinson725bfd82009-05-03 20:33:40 +00001959/* Test PyOS_string_to_double. */
1960static PyObject *
1961test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001962 double result;
1963 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00001964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965#define CHECK_STRING(STR, expected) \
1966 result = PyOS_string_to_double(STR, NULL, NULL); \
1967 if (result == -1.0 && PyErr_Occurred()) \
1968 return NULL; \
1969 if (result != expected) { \
1970 msg = "conversion of " STR " to float failed"; \
1971 goto fail; \
1972 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00001973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974#define CHECK_INVALID(STR) \
1975 result = PyOS_string_to_double(STR, NULL, NULL); \
1976 if (result == -1.0 && PyErr_Occurred()) { \
1977 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
1978 PyErr_Clear(); \
1979 else \
1980 return NULL; \
1981 } \
1982 else { \
1983 msg = "conversion of " STR " didn't raise ValueError"; \
1984 goto fail; \
1985 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00001986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 CHECK_STRING("0.1", 0.1);
1988 CHECK_STRING("1.234", 1.234);
1989 CHECK_STRING("-1.35", -1.35);
1990 CHECK_STRING(".1e01", 1.0);
1991 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00001992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 CHECK_INVALID(" 0.1");
1994 CHECK_INVALID("\t\n-3");
1995 CHECK_INVALID(".123 ");
1996 CHECK_INVALID("3\n");
1997 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00001998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001999 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002000 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002002#undef CHECK_STRING
2003#undef CHECK_INVALID
2004}
2005
2006
Benjamin Petersonb173f782009-05-05 22:31:58 +00002007/* Coverage testing of capsule objects. */
2008
2009static const char *capsule_name = "capsule name";
2010static char *capsule_pointer = "capsule pointer";
2011static char *capsule_context = "capsule context";
2012static const char *capsule_error = NULL;
2013static int
2014capsule_destructor_call_count = 0;
2015
2016static void
2017capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 capsule_destructor_call_count++;
2019 if (PyCapsule_GetContext(o) != capsule_context) {
2020 capsule_error = "context did not match in destructor!";
2021 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2022 capsule_error = "destructor did not match in destructor! (woah!)";
2023 } else if (PyCapsule_GetName(o) != capsule_name) {
2024 capsule_error = "name did not match in destructor!";
2025 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2026 capsule_error = "pointer did not match in destructor!";
2027 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002028}
2029
2030typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 char *name;
2032 char *module;
2033 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002034} known_capsule;
2035
2036static PyObject *
2037test_capsule(PyObject *self, PyObject *args)
2038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 PyObject *object;
2040 const char *error = NULL;
2041 void *pointer;
2042 void *pointer2;
2043 known_capsule known_capsules[] = {
2044 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2045 KNOWN_CAPSULE("_socket", "CAPI"),
2046 KNOWN_CAPSULE("_curses", "_C_API"),
2047 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2048 { NULL, NULL },
2049 };
2050 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002051
2052#define FAIL(x) { error = (x); goto exit; }
2053
2054#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 if (capsule_error) { \
2056 FAIL(capsule_error); \
2057 } \
2058 else if (!capsule_destructor_call_count) { \
2059 FAIL("destructor not called!"); \
2060 } \
2061 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2064 PyCapsule_SetContext(object, capsule_context);
2065 capsule_destructor(object);
2066 CHECK_DESTRUCTOR;
2067 Py_DECREF(object);
2068 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 object = PyCapsule_New(known, "ignored", NULL);
2071 PyCapsule_SetPointer(object, capsule_pointer);
2072 PyCapsule_SetName(object, capsule_name);
2073 PyCapsule_SetDestructor(object, capsule_destructor);
2074 PyCapsule_SetContext(object, capsule_context);
2075 capsule_destructor(object);
2076 CHECK_DESTRUCTOR;
2077 /* intentionally access using the wrong name */
2078 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2079 if (!PyErr_Occurred()) {
2080 FAIL("PyCapsule_GetPointer should have failed but did not!");
2081 }
2082 PyErr_Clear();
2083 if (pointer2) {
2084 if (pointer2 == capsule_pointer) {
2085 FAIL("PyCapsule_GetPointer should not have"
2086 " returned the internal pointer!");
2087 } else {
2088 FAIL("PyCapsule_GetPointer should have "
2089 "returned NULL pointer but did not!");
2090 }
2091 }
2092 PyCapsule_SetDestructor(object, NULL);
2093 Py_DECREF(object);
2094 if (capsule_destructor_call_count) {
2095 FAIL("destructor called when it should not have been!");
2096 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 for (known = &known_capsules[0]; known->module != NULL; known++) {
2099 /* yeah, ordinarily I wouldn't do this either,
2100 but it's fine for this test harness.
2101 */
2102 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002103#undef FAIL
2104#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 { \
2106 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2107 x, known->module, known->attribute); \
2108 error = buffer; \
2109 goto exit; \
2110 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 PyObject *module = PyImport_ImportModule(known->module);
2113 if (module) {
2114 pointer = PyCapsule_Import(known->name, 0);
2115 if (!pointer) {
2116 Py_DECREF(module);
2117 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2118 }
2119 object = PyObject_GetAttrString(module, known->attribute);
2120 if (!object) {
2121 Py_DECREF(module);
2122 return NULL;
2123 }
2124 pointer2 = PyCapsule_GetPointer(object,
2125 "weebles wobble but they don't fall down");
2126 if (!PyErr_Occurred()) {
2127 Py_DECREF(object);
2128 Py_DECREF(module);
2129 FAIL("PyCapsule_GetPointer should have failed but did not!");
2130 }
2131 PyErr_Clear();
2132 if (pointer2) {
2133 Py_DECREF(module);
2134 Py_DECREF(object);
2135 if (pointer2 == pointer) {
2136 FAIL("PyCapsule_GetPointer should not have"
2137 " returned its internal pointer!");
2138 } else {
2139 FAIL("PyCapsule_GetPointer should have"
2140 " returned NULL pointer but did not!");
2141 }
2142 }
2143 Py_DECREF(object);
2144 Py_DECREF(module);
2145 }
2146 else
2147 PyErr_Clear();
2148 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002149
2150 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 if (error) {
2152 return raiseTestError("test_capsule", error);
2153 }
2154 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002155#undef FAIL
2156}
2157
Guido van Rossumddefaf32007-01-14 03:31:43 +00002158#ifdef HAVE_GETTIMEOFDAY
2159/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002160static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 e->tv_sec -= s->tv_sec;
2163 e->tv_usec -= s->tv_usec;
2164 if (e->tv_usec < 0) {
2165 e->tv_sec -=1;
2166 e->tv_usec += 1000000;
2167 }
2168 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002169}
2170
2171static PyObject *
2172profile_int(PyObject *self, PyObject* args)
2173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 int i, k;
2175 struct timeval start, stop;
2176 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 /* Test 1: Allocate and immediately deallocate
2179 many small integers */
2180 gettimeofday(&start, NULL);
2181 for(k=0; k < 20000; k++)
2182 for(i=0; i < 1000; i++) {
2183 single = PyLong_FromLong(i);
2184 Py_DECREF(single);
2185 }
2186 gettimeofday(&stop, NULL);
2187 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 /* Test 2: Allocate and immediately deallocate
2190 many large integers */
2191 gettimeofday(&start, NULL);
2192 for(k=0; k < 20000; k++)
2193 for(i=0; i < 1000; i++) {
2194 single = PyLong_FromLong(i+1000000);
2195 Py_DECREF(single);
2196 }
2197 gettimeofday(&stop, NULL);
2198 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200 /* Test 3: Allocate a few integers, then release
2201 them all simultaneously. */
2202 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002203 if (multiple == NULL)
2204 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002205 gettimeofday(&start, NULL);
2206 for(k=0; k < 20000; k++) {
2207 for(i=0; i < 1000; i++) {
2208 multiple[i] = PyLong_FromLong(i+1000000);
2209 }
2210 for(i=0; i < 1000; i++) {
2211 Py_DECREF(multiple[i]);
2212 }
2213 }
2214 gettimeofday(&stop, NULL);
2215 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002216 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 /* Test 4: Allocate many integers, then release
2219 them all simultaneously. */
2220 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002221 if (multiple == NULL)
2222 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 gettimeofday(&start, NULL);
2224 for(k=0; k < 20; k++) {
2225 for(i=0; i < 1000000; i++) {
2226 multiple[i] = PyLong_FromLong(i+1000000);
2227 }
2228 for(i=0; i < 1000000; i++) {
2229 Py_DECREF(multiple[i]);
2230 }
2231 }
2232 gettimeofday(&stop, NULL);
2233 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002234 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 /* Test 5: Allocate many integers < 32000 */
2237 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002238 if (multiple == NULL)
2239 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002240 gettimeofday(&start, NULL);
2241 for(k=0; k < 10; k++) {
2242 for(i=0; i < 1000000; i++) {
2243 multiple[i] = PyLong_FromLong(i+1000);
2244 }
2245 for(i=0; i < 1000000; i++) {
2246 Py_DECREF(multiple[i]);
2247 }
2248 }
2249 gettimeofday(&stop, NULL);
2250 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002251 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 /* Test 6: Perform small int addition */
2254 op1 = PyLong_FromLong(1);
2255 gettimeofday(&start, NULL);
2256 for(i=0; i < 10000000; i++) {
2257 result = PyNumber_Add(op1, op1);
2258 Py_DECREF(result);
2259 }
2260 gettimeofday(&stop, NULL);
2261 Py_DECREF(op1);
2262 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 /* Test 7: Perform medium int addition */
2265 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002266 if (op1 == NULL)
2267 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 gettimeofday(&start, NULL);
2269 for(i=0; i < 10000000; i++) {
2270 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002271 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 }
2273 gettimeofday(&stop, NULL);
2274 Py_DECREF(op1);
2275 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 Py_INCREF(Py_None);
2278 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002279}
2280#endif
2281
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002282/* To test the format of tracebacks as printed out. */
2283static PyObject *
2284traceback_print(PyObject *self, PyObject *args)
2285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 PyObject *file;
2287 PyObject *traceback;
2288 int result;
2289
2290 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2291 &traceback, &file))
2292 return NULL;
2293
2294 result = PyTraceBack_Print(traceback, file);
2295 if (result < 0)
2296 return NULL;
2297 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002298}
2299
Benjamin Petersone6528212008-07-15 15:32:09 +00002300/* To test the format of exceptions as printed out. */
2301static PyObject *
2302exception_print(PyObject *self, PyObject *args)
2303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002304 PyObject *value;
2305 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 if (!PyArg_ParseTuple(args, "O:exception_print",
2308 &value))
2309 return NULL;
2310 if (!PyExceptionInstance_Check(value)) {
2311 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2312 return NULL;
2313 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 tb = PyException_GetTraceback(value);
2316 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2317 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002320}
2321
2322
2323
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002324
2325/* reliably raise a MemoryError */
2326static PyObject *
2327raise_memoryerror(PyObject *self)
2328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 PyErr_NoMemory();
2330 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002331}
2332
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002333/* Issue 6012 */
2334static PyObject *str1, *str2;
2335static int
2336failing_converter(PyObject *obj, void *arg)
2337{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 /* Clone str1, then let the conversion fail. */
2339 assert(str1);
2340 str2 = str1;
2341 Py_INCREF(str2);
2342 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002343}
2344static PyObject*
2345argparsing(PyObject *o, PyObject *args)
2346{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 PyObject *res;
2348 str1 = str2 = NULL;
2349 if (!PyArg_ParseTuple(args, "O&O&",
2350 PyUnicode_FSConverter, &str1,
2351 failing_converter, &str2)) {
2352 if (!str2)
2353 /* argument converter not called? */
2354 return NULL;
2355 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002356 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 Py_DECREF(str2);
2358 PyErr_Clear();
2359 return res;
2360 }
2361 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002362}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002363
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002364/* To test that the result of PyCode_NewEmpty has the right members. */
2365static PyObject *
2366code_newempty(PyObject *self, PyObject *args)
2367{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 const char *filename;
2369 const char *funcname;
2370 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2373 &filename, &funcname, &firstlineno))
2374 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002377}
2378
Georg Brandl1e28a272009-12-28 08:41:01 +00002379/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2380 Run via Lib/test/test_exceptions.py */
2381static PyObject *
2382make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 const char *name;
2385 const char *doc = NULL;
2386 PyObject *base = NULL;
2387 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2392 "s|sOO:make_exception_with_doc", kwlist,
2393 &name, &doc, &base, &dict))
2394 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002397}
2398
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002399static PyObject *
2400make_memoryview_from_NULL_pointer(PyObject *self)
2401{
2402 Py_buffer info;
2403 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2404 return NULL;
2405 return PyMemoryView_FromBuffer(&info);
2406}
2407
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002408/* Test that the fatal error from not having a current thread doesn't
2409 cause an infinite loop. Run via Lib/test/test_capi.py */
2410static PyObject *
2411crash_no_current_thread(PyObject *self)
2412{
2413 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002414 /* Using PyThreadState_Get() directly allows the test to pass in
2415 !pydebug mode. However, the test only actually tests anything
2416 in pydebug mode, since that's where the infinite loop was in
2417 the first place. */
2418 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002419 Py_END_ALLOW_THREADS
2420 return NULL;
2421}
2422
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002423/* To run some code in a sub-interpreter. */
2424static PyObject *
2425run_in_subinterp(PyObject *self, PyObject *args)
2426{
2427 const char *code;
2428 int r;
2429 PyThreadState *substate, *mainstate;
2430
2431 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2432 &code))
2433 return NULL;
2434
2435 mainstate = PyThreadState_Get();
2436
2437 PyThreadState_Swap(NULL);
2438
2439 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002440 if (substate == NULL) {
2441 /* Since no new thread state was created, there is no exception to
2442 propagate; raise a fresh one after swapping in the old thread
2443 state. */
2444 PyThreadState_Swap(mainstate);
2445 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2446 return NULL;
2447 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002448 r = PyRun_SimpleString(code);
2449 Py_EndInterpreter(substate);
2450
2451 PyThreadState_Swap(mainstate);
2452
2453 return PyLong_FromLong(r);
2454}
2455
Victor Stinner5d272cc2012-03-13 13:35:55 +01002456static PyObject *
2457test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2458{
2459 PyObject *obj;
2460 time_t sec;
2461 if (!PyArg_ParseTuple(args, "O:pytime_object_to_time_t", &obj))
2462 return NULL;
2463 if (_PyTime_ObjectToTime_t(obj, &sec) == -1)
2464 return NULL;
2465 return _PyLong_FromTime_t(sec);
2466}
2467
2468static PyObject *
2469test_pytime_object_to_timeval(PyObject *self, PyObject *args)
2470{
2471 PyObject *obj;
2472 time_t sec;
2473 long usec;
2474 if (!PyArg_ParseTuple(args, "O:pytime_object_to_timeval", &obj))
2475 return NULL;
2476 if (_PyTime_ObjectToTimeval(obj, &sec, &usec) == -1)
2477 return NULL;
2478 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
2479}
2480
Victor Stinner643cd682012-03-02 22:54:03 +01002481static PyObject *
2482test_pytime_object_to_timespec(PyObject *self, PyObject *args)
2483{
2484 PyObject *obj;
2485 time_t sec;
2486 long nsec;
2487 if (!PyArg_ParseTuple(args, "O:pytime_object_to_timespec", &obj))
2488 return NULL;
2489 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec) == -1)
2490 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01002491 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01002492}
2493
Antoine Pitrou796564c2013-07-30 19:59:21 +02002494static void
2495slot_tp_del(PyObject *self)
2496{
2497 _Py_IDENTIFIER(__tp_del__);
2498 PyObject *del, *res;
2499 PyObject *error_type, *error_value, *error_traceback;
2500
2501 /* Temporarily resurrect the object. */
2502 assert(self->ob_refcnt == 0);
2503 self->ob_refcnt = 1;
2504
2505 /* Save the current exception, if any. */
2506 PyErr_Fetch(&error_type, &error_value, &error_traceback);
2507
2508 /* Execute __del__ method, if any. */
2509 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
2510 if (del != NULL) {
2511 res = PyEval_CallObject(del, NULL);
2512 if (res == NULL)
2513 PyErr_WriteUnraisable(del);
2514 else
2515 Py_DECREF(res);
2516 Py_DECREF(del);
2517 }
2518
2519 /* Restore the saved exception. */
2520 PyErr_Restore(error_type, error_value, error_traceback);
2521
2522 /* Undo the temporary resurrection; can't use DECREF here, it would
2523 * cause a recursive call.
2524 */
2525 assert(self->ob_refcnt > 0);
2526 if (--self->ob_refcnt == 0)
2527 return; /* this is the normal path out */
2528
2529 /* __del__ resurrected it! Make it look like the original Py_DECREF
2530 * never happened.
2531 */
2532 {
2533 Py_ssize_t refcnt = self->ob_refcnt;
2534 _Py_NewReference(self);
2535 self->ob_refcnt = refcnt;
2536 }
2537 assert(!PyType_IS_GC(Py_TYPE(self)) ||
2538 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
2539 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
2540 * we need to undo that. */
2541 _Py_DEC_REFTOTAL;
2542 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
2543 * chain, so no more to do there.
2544 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
2545 * _Py_NewReference bumped tp_allocs: both of those need to be
2546 * undone.
2547 */
2548#ifdef COUNT_ALLOCS
2549 --Py_TYPE(self)->tp_frees;
2550 --Py_TYPE(self)->tp_allocs;
2551#endif
2552}
2553
2554static PyObject *
2555with_tp_del(PyObject *self, PyObject *args)
2556{
2557 PyObject *obj;
2558 PyTypeObject *tp;
2559
2560 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
2561 return NULL;
2562 tp = (PyTypeObject *) obj;
2563 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
2564 PyErr_Format(PyExc_TypeError,
2565 "heap type expected, got %R", obj);
2566 return NULL;
2567 }
2568 tp->tp_del = slot_tp_del;
2569 Py_INCREF(obj);
2570 return obj;
2571}
2572
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07002573static PyObject *
2574_test_incref(PyObject *ob)
2575{
2576 Py_INCREF(ob);
2577 return ob;
2578}
2579
2580static PyObject *
2581test_xincref_doesnt_leak(PyObject *ob)
2582{
2583 PyObject *obj = PyLong_FromLong(0);
2584 Py_XINCREF(_test_incref(obj));
2585 Py_DECREF(obj);
2586 Py_DECREF(obj);
2587 Py_DECREF(obj);
2588 Py_RETURN_NONE;
2589}
2590
2591static PyObject *
2592test_incref_doesnt_leak(PyObject *ob)
2593{
2594 PyObject *obj = PyLong_FromLong(0);
2595 Py_INCREF(_test_incref(obj));
2596 Py_DECREF(obj);
2597 Py_DECREF(obj);
2598 Py_DECREF(obj);
2599 Py_RETURN_NONE;
2600}
2601
2602static PyObject *
2603test_xdecref_doesnt_leak(PyObject *ob)
2604{
2605 Py_XDECREF(PyLong_FromLong(0));
2606 Py_RETURN_NONE;
2607}
2608
2609static PyObject *
2610test_decref_doesnt_leak(PyObject *ob)
2611{
2612 Py_DECREF(PyLong_FromLong(0));
2613 Py_RETURN_NONE;
2614}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002615
Victor Stinner0507bf52013-07-07 02:05:46 +02002616static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02002617test_incref_decref_API(PyObject *ob)
2618{
2619 PyObject *obj = PyLong_FromLong(0);
2620 Py_IncRef(ob);
2621 Py_DecRef(obj);
2622 Py_DecRef(obj);
2623 Py_RETURN_NONE;
2624}
2625
2626static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02002627test_pymem_alloc0(PyObject *self)
2628{
2629 void *ptr;
2630
2631 ptr = PyMem_Malloc(0);
2632 if (ptr == NULL) {
2633 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
2634 return NULL;
2635 }
2636 PyMem_Free(ptr);
2637
2638 ptr = PyObject_Malloc(0);
2639 if (ptr == NULL) {
2640 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
2641 return NULL;
2642 }
2643 PyObject_Free(ptr);
2644
2645 Py_RETURN_NONE;
2646}
2647
2648typedef struct {
2649 PyMemAllocator alloc;
2650
2651 size_t malloc_size;
2652 void *realloc_ptr;
2653 size_t realloc_new_size;
2654 void *free_ptr;
2655} alloc_hook_t;
2656
2657static void* hook_malloc (void* ctx, size_t size)
2658{
2659 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2660 hook->malloc_size = size;
2661 return hook->alloc.malloc(hook->alloc.ctx, size);
2662}
2663
2664static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
2665{
2666 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2667 hook->realloc_ptr = ptr;
2668 hook->realloc_new_size = new_size;
2669 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
2670}
2671
2672static void hook_free (void *ctx, void *ptr)
2673{
2674 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2675 hook->free_ptr = ptr;
2676 hook->alloc.free(hook->alloc.ctx, ptr);
2677}
2678
2679static PyObject *
2680test_setallocators(PyMemAllocatorDomain domain)
2681{
2682 PyObject *res = NULL;
2683 const char *error_msg;
2684 alloc_hook_t hook;
2685 PyMemAllocator alloc;
2686 size_t size, size2;
2687 void *ptr, *ptr2;
2688
2689 hook.malloc_size = 0;
2690 hook.realloc_ptr = NULL;
2691 hook.realloc_new_size = 0;
2692 hook.free_ptr = NULL;
2693
2694 alloc.ctx = &hook;
2695 alloc.malloc = &hook_malloc;
2696 alloc.realloc = &hook_realloc;
2697 alloc.free = &hook_free;
2698 PyMem_GetAllocator(domain, &hook.alloc);
2699 PyMem_SetAllocator(domain, &alloc);
2700
2701 size = 42;
2702 switch(domain)
2703 {
2704 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
2705 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
2706 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
2707 default: ptr = NULL; break;
2708 }
2709
2710 if (ptr == NULL) {
2711 error_msg = "malloc failed";
2712 goto fail;
2713 }
2714
2715 if (hook.malloc_size != size) {
2716 error_msg = "malloc invalid size";
2717 goto fail;
2718 }
2719
2720 size2 = 200;
2721 switch(domain)
2722 {
2723 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
2724 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
2725 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02002726 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02002727 }
2728
2729 if (ptr2 == NULL) {
2730 error_msg = "realloc failed";
2731 goto fail;
2732 }
2733
2734 if (hook.realloc_ptr != ptr
2735 || hook.realloc_new_size != size2) {
2736 error_msg = "realloc invalid parameters";
2737 goto fail;
2738 }
2739
2740 switch(domain)
2741 {
2742 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
2743 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
2744 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
2745 }
2746
2747 if (hook.free_ptr != ptr2) {
2748 error_msg = "free invalid pointer";
2749 goto fail;
2750 }
2751
2752 Py_INCREF(Py_None);
2753 res = Py_None;
2754 goto finally;
2755
2756fail:
2757 PyErr_SetString(PyExc_RuntimeError, error_msg);
2758
2759finally:
2760 PyMem_SetAllocator(domain, &hook.alloc);
2761 return res;
2762}
2763
2764static PyObject *
2765test_pymem_setrawallocators(PyObject *self)
2766{
2767 return test_setallocators(PYMEM_DOMAIN_RAW);
2768}
2769
2770static PyObject *
2771test_pymem_setallocators(PyObject *self)
2772{
2773 return test_setallocators(PYMEM_DOMAIN_MEM);
2774}
2775
2776static PyObject *
2777test_pyobject_setallocators(PyObject *self)
2778{
2779 return test_setallocators(PYMEM_DOMAIN_OBJ);
2780}
2781
Tim Peters9ea17ac2001-02-02 05:57:15 +00002782static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 {"raise_exception", raise_exception, METH_VARARGS},
2784 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
2785 {"test_config", (PyCFunction)test_config, METH_NOARGS},
2786 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
2787 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
2788 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
2789 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07002791 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
2792 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
2793 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
2794 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02002795 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
2797 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02002798 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
2799 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
2801 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
2802 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07002803 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
2805 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
2806 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
2807 PyDoc_STR("This is a pretty normal docstring.")},
2808 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
2809 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
2810 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
2811 {"getargs_tuple", getargs_tuple, METH_VARARGS},
2812 {"getargs_keywords", (PyCFunction)getargs_keywords,
2813 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00002814 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
2815 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 {"getargs_b", getargs_b, METH_VARARGS},
2817 {"getargs_B", getargs_B, METH_VARARGS},
2818 {"getargs_h", getargs_h, METH_VARARGS},
2819 {"getargs_H", getargs_H, METH_VARARGS},
2820 {"getargs_I", getargs_I, METH_VARARGS},
2821 {"getargs_k", getargs_k, METH_VARARGS},
2822 {"getargs_i", getargs_i, METH_VARARGS},
2823 {"getargs_l", getargs_l, METH_VARARGS},
2824 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07002825 {"getargs_p", getargs_p, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00002826#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 {"getargs_L", getargs_L, METH_VARARGS},
2828 {"getargs_K", getargs_K, METH_VARARGS},
2829 {"test_longlong_api", test_longlong_api, METH_NOARGS},
2830 {"test_long_long_and_overflow",
2831 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
2832 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00002833#endif
Eli Bendersky906b88f2011-07-29 07:05:08 +03002834 {"getargs_c", getargs_c, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00002835 {"getargs_s", getargs_s, METH_VARARGS},
2836 {"getargs_s_star", getargs_s_star, METH_VARARGS},
2837 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
2838 {"getargs_z", getargs_z, METH_VARARGS},
2839 {"getargs_z_star", getargs_z_star, METH_VARARGS},
2840 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
2841 {"getargs_y", getargs_y, METH_VARARGS},
2842 {"getargs_y_star", getargs_y_star, METH_VARARGS},
2843 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
2844 {"getargs_u", getargs_u, METH_VARARGS},
2845 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
2846 {"getargs_Z", getargs_Z, METH_VARARGS},
2847 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00002848 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00002850 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00002852 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002853 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
2854 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
2855 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
2856 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01002857 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
2858 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
2859 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
2860 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01002861 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002862#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00002863 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002865#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00002866#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00002867 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00002868#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00002869 {"traceback_print", traceback_print, METH_VARARGS},
2870 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002871 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00002872 {"argparsing", argparsing, METH_VARARGS},
2873 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
2875 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002876 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
2877 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002878 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002879 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01002880 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
2881 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01002882 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02002883 {"with_tp_del", with_tp_del, METH_VARARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02002884 {"test_pymem",
2885 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
2886 {"test_pymem_alloc0",
2887 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
2888 {"test_pymem_setallocators",
2889 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
2890 {"test_pyobject_setallocators",
2891 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00002893};
2894
Thomas Hellera4ea6032003-04-17 18:55:45 +00002895#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
2896
Thomas Wouters89f507f2006-12-13 04:49:30 +00002897typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002898 char bool_member;
2899 char byte_member;
2900 unsigned char ubyte_member;
2901 short short_member;
2902 unsigned short ushort_member;
2903 int int_member;
2904 unsigned int uint_member;
2905 long long_member;
2906 unsigned long ulong_member;
2907 Py_ssize_t pyssizet_member;
2908 float float_member;
2909 double double_member;
2910 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002911#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002912 PY_LONG_LONG longlong_member;
2913 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002914#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00002915} all_structmembers;
2916
2917typedef struct {
2918 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002920} test_structmembers;
2921
2922static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002923 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
2924 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
2925 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
2926 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
2927 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
2928 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
2929 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
2930 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
2931 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
2932 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
2933 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
2934 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
2935 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002936#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002937 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
2938 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002940 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00002941};
2942
2943
Christian Heimes1af737c2008-01-23 08:24:23 +00002944static PyObject *
2945test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
2946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 static char *keywords[] = {
2948 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
2949 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
2950 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00002951#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00002953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 NULL};
2955 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00002956#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002957 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00002958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 ;
2960 test_structmembers *ob;
2961 const char *s = NULL;
2962 Py_ssize_t string_len = 0;
2963 ob = PyObject_New(test_structmembers, type);
2964 if (ob == NULL)
2965 return NULL;
2966 memset(&ob->structmembers, 0, sizeof(all_structmembers));
2967 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
2968 &ob->structmembers.bool_member,
2969 &ob->structmembers.byte_member,
2970 &ob->structmembers.ubyte_member,
2971 &ob->structmembers.short_member,
2972 &ob->structmembers.ushort_member,
2973 &ob->structmembers.int_member,
2974 &ob->structmembers.uint_member,
2975 &ob->structmembers.long_member,
2976 &ob->structmembers.ulong_member,
2977 &ob->structmembers.pyssizet_member,
2978 &ob->structmembers.float_member,
2979 &ob->structmembers.double_member,
2980 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00002981#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002982 , &ob->structmembers.longlong_member,
2983 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00002984#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 )) {
2986 Py_DECREF(ob);
2987 return NULL;
2988 }
2989 if (s != NULL) {
2990 if (string_len > 5) {
2991 Py_DECREF(ob);
2992 PyErr_SetString(PyExc_ValueError, "string too long");
2993 return NULL;
2994 }
2995 strcpy(ob->structmembers.inplace_member, s);
2996 }
2997 else {
2998 strcpy(ob->structmembers.inplace_member, "");
2999 }
3000 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003001}
3002
Christian Heimes1af737c2008-01-23 08:24:23 +00003003static void
3004test_structmembers_free(PyObject *ob)
3005{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003006 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003007}
3008
3009static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003010 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003011 "test_structmembersType",
3012 sizeof(test_structmembers), /* tp_basicsize */
3013 0, /* tp_itemsize */
3014 test_structmembers_free, /* destructor tp_dealloc */
3015 0, /* tp_print */
3016 0, /* tp_getattr */
3017 0, /* tp_setattr */
3018 0, /* tp_reserved */
3019 0, /* tp_repr */
3020 0, /* tp_as_number */
3021 0, /* tp_as_sequence */
3022 0, /* tp_as_mapping */
3023 0, /* tp_hash */
3024 0, /* tp_call */
3025 0, /* tp_str */
3026 PyObject_GenericGetAttr, /* tp_getattro */
3027 PyObject_GenericSetAttr, /* tp_setattro */
3028 0, /* tp_as_buffer */
3029 0, /* tp_flags */
3030 "Type containing all structmember types",
3031 0, /* traverseproc tp_traverse */
3032 0, /* tp_clear */
3033 0, /* tp_richcompare */
3034 0, /* tp_weaklistoffset */
3035 0, /* tp_iter */
3036 0, /* tp_iternext */
3037 0, /* tp_methods */
3038 test_members, /* tp_members */
3039 0,
3040 0,
3041 0,
3042 0,
3043 0,
3044 0,
3045 0,
3046 0,
3047 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003048};
3049
3050
Martin v. Löwis1a214512008-06-11 05:26:20 +00003051
3052static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003053 PyModuleDef_HEAD_INIT,
3054 "_testcapi",
3055 NULL,
3056 -1,
3057 TestMethods,
3058 NULL,
3059 NULL,
3060 NULL,
3061 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003062};
3063
Mark Hammond62b1ab12002-07-23 06:31:15 +00003064PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003065PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00003066{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003069 m = PyModule_Create(&_testcapimodule);
3070 if (m == NULL)
3071 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003073 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00003074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003075 Py_TYPE(&test_structmembersType)=&PyType_Type;
3076 Py_INCREF(&test_structmembersType);
3077 /* don't use a name starting with "test", since we don't want
3078 test_capi to automatically call this */
3079 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
3082 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
3083 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
3084 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
3085 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
3086 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
3087 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
3088 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
3089 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
3090 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
3091 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
3092 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
3093 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
3094 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
3095 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
3096 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
3097 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
3098 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
3099 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
3100 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
3101 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
3102 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
3103 Py_INCREF(&PyInstanceMethod_Type);
3104 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00003105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003106 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
3107 Py_INCREF(TestError);
3108 PyModule_AddObject(m, "error", TestError);
3109 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003110}