blob: 471d66d659e4c2cf874c056cc7face3539d70758 [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);
123 PyDict_SetItem(dict, v, v);
124 Py_DECREF(v);
125 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 while (PyDict_Next(dict, &pos, &k, &v)) {
128 PyObject *o;
129 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 i = PyLong_AS_LONG(v) + 1;
132 o = PyLong_FromLong(i);
133 if (o == NULL)
134 return -1;
135 if (PyDict_SetItem(dict, k, o) < 0) {
136 Py_DECREF(o);
137 return -1;
138 }
139 Py_DECREF(o);
140 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 if (iterations != count) {
145 PyErr_SetString(
146 TestError,
147 "test_dict_iteration: dict iteration went wrong ");
148 return -1;
149 } else {
150 return 0;
151 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000152}
153
154static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000155test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000156{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000159 for (i = 0; i < 200; i++) {
160 if (test_dict_inner(i) < 0) {
161 return NULL;
162 }
163 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 Py_INCREF(Py_None);
166 return Py_None;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000167}
168
Tim Peters91621db2001-06-12 20:10:01 +0000169
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000170/* Issue #4701: Check that PyObject_Hash implicitly calls
171 * PyType_Ready if it hasn't already been called
172 */
173static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 PyVarObject_HEAD_INIT(NULL, 0)
175 "hashinheritancetester", /* Name of this type */
176 sizeof(PyObject), /* Basic object size */
177 0, /* Item size for varobject */
178 (destructor)PyObject_Del, /* tp_dealloc */
179 0, /* tp_print */
180 0, /* tp_getattr */
181 0, /* tp_setattr */
182 0, /* tp_reserved */
183 0, /* tp_repr */
184 0, /* tp_as_number */
185 0, /* tp_as_sequence */
186 0, /* tp_as_mapping */
187 0, /* tp_hash */
188 0, /* tp_call */
189 0, /* tp_str */
190 PyObject_GenericGetAttr, /* tp_getattro */
191 0, /* tp_setattro */
192 0, /* tp_as_buffer */
193 Py_TPFLAGS_DEFAULT, /* tp_flags */
194 0, /* tp_doc */
195 0, /* tp_traverse */
196 0, /* tp_clear */
197 0, /* tp_richcompare */
198 0, /* tp_weaklistoffset */
199 0, /* tp_iter */
200 0, /* tp_iternext */
201 0, /* tp_methods */
202 0, /* tp_members */
203 0, /* tp_getset */
204 0, /* tp_base */
205 0, /* tp_dict */
206 0, /* tp_descr_get */
207 0, /* tp_descr_set */
208 0, /* tp_dictoffset */
209 0, /* tp_init */
210 0, /* tp_alloc */
211 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000212};
213
214static PyObject*
215test_lazy_hash_inheritance(PyObject* self)
216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 PyTypeObject *type;
218 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000219 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 if (type->tp_dict != NULL)
224 /* The type has already been initialized. This probably means
225 -R is being used. */
226 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000227
228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 obj = PyObject_New(PyObject, type);
230 if (obj == NULL) {
231 PyErr_Clear();
232 PyErr_SetString(
233 TestError,
234 "test_lazy_hash_inheritance: failed to create object");
235 return NULL;
236 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 if (type->tp_dict != NULL) {
239 PyErr_SetString(
240 TestError,
241 "test_lazy_hash_inheritance: type initialised too soon");
242 Py_DECREF(obj);
243 return NULL;
244 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 hash = PyObject_Hash(obj);
247 if ((hash == -1) && PyErr_Occurred()) {
248 PyErr_Clear();
249 PyErr_SetString(
250 TestError,
251 "test_lazy_hash_inheritance: could not hash object");
252 Py_DECREF(obj);
253 return NULL;
254 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 if (type->tp_dict == NULL) {
257 PyErr_SetString(
258 TestError,
259 "test_lazy_hash_inheritance: type not initialised by hash()");
260 Py_DECREF(obj);
261 return NULL;
262 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 if (type->tp_hash != PyType_Type.tp_hash) {
265 PyErr_SetString(
266 TestError,
267 "test_lazy_hash_inheritance: unexpected hash function");
268 Py_DECREF(obj);
269 return NULL;
270 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000275}
276
277
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000278/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
Tim Petersff70d3c2001-06-14 01:11:03 +0000279 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000280
281 Note that the meat of the test is contained in testcapi_long.h.
282 This is revolting, but delicate code duplication is worse: "almost
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000283 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000284 dependence on type names makes it impossible to use a parameterized
285 function. A giant macro would be even worse than this. A C++ template
286 would be perfect.
287
288 The "report an error" functions are deliberately not part of the #include
289 file: if the test fails, you can set a breakpoint in the appropriate
290 error function directly, and crawl back from there in the debugger.
291*/
292
293#define UNBIND(X) Py_DECREF(X); (X) = NULL
294
295static PyObject *
296raise_test_long_error(const char* msg)
297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000299}
300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301#define TESTNAME test_long_api_inner
302#define TYPENAME long
303#define F_S_TO_PY PyLong_FromLong
304#define F_PY_TO_S PyLong_AsLong
305#define F_U_TO_PY PyLong_FromUnsignedLong
306#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000307
308#include "testcapi_long.h"
309
310static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000311test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000314}
315
316#undef TESTNAME
317#undef TYPENAME
318#undef F_S_TO_PY
319#undef F_PY_TO_S
320#undef F_U_TO_PY
321#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000322
323#ifdef HAVE_LONG_LONG
Tim Peters91621db2001-06-12 20:10:01 +0000324
325static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000326raise_test_longlong_error(const char* msg)
327{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000329}
330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331#define TESTNAME test_longlong_api_inner
332#define TYPENAME PY_LONG_LONG
333#define F_S_TO_PY PyLong_FromLongLong
334#define F_PY_TO_S PyLong_AsLongLong
335#define F_U_TO_PY PyLong_FromUnsignedLongLong
336#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000337
338#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000339
340static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000341test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000344}
345
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000346#undef TESTNAME
347#undef TYPENAME
348#undef F_S_TO_PY
349#undef F_PY_TO_S
350#undef F_U_TO_PY
351#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000352
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000353/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
354 is tested by test_long_api_inner. This test will concentrate on proper
355 handling of overflow.
356*/
357
358static PyObject *
359test_long_and_overflow(PyObject *self)
360{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 PyObject *num, *one, *temp;
362 long value;
363 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 /* Test that overflow is set properly for a large value. */
366 /* num is a number larger than LONG_MAX even on 64-bit platforms */
367 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
368 if (num == NULL)
369 return NULL;
370 overflow = 1234;
371 value = PyLong_AsLongAndOverflow(num, &overflow);
372 Py_DECREF(num);
373 if (value == -1 && PyErr_Occurred())
374 return NULL;
375 if (value != -1)
376 return raiseTestError("test_long_and_overflow",
377 "return value was not set to -1");
378 if (overflow != 1)
379 return raiseTestError("test_long_and_overflow",
380 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 /* Same again, with num = LONG_MAX + 1 */
383 num = PyLong_FromLong(LONG_MAX);
384 if (num == NULL)
385 return NULL;
386 one = PyLong_FromLong(1L);
387 if (one == NULL) {
388 Py_DECREF(num);
389 return NULL;
390 }
391 temp = PyNumber_Add(num, one);
392 Py_DECREF(one);
393 Py_DECREF(num);
394 num = temp;
395 if (num == NULL)
396 return NULL;
397 overflow = 0;
398 value = PyLong_AsLongAndOverflow(num, &overflow);
399 Py_DECREF(num);
400 if (value == -1 && PyErr_Occurred())
401 return NULL;
402 if (value != -1)
403 return raiseTestError("test_long_and_overflow",
404 "return value was not set to -1");
405 if (overflow != 1)
406 return raiseTestError("test_long_and_overflow",
407 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 /* Test that overflow is set properly for a large negative value. */
410 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
411 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
412 if (num == NULL)
413 return NULL;
414 overflow = 1234;
415 value = PyLong_AsLongAndOverflow(num, &overflow);
416 Py_DECREF(num);
417 if (value == -1 && PyErr_Occurred())
418 return NULL;
419 if (value != -1)
420 return raiseTestError("test_long_and_overflow",
421 "return value was not set to -1");
422 if (overflow != -1)
423 return raiseTestError("test_long_and_overflow",
424 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 /* Same again, with num = LONG_MIN - 1 */
427 num = PyLong_FromLong(LONG_MIN);
428 if (num == NULL)
429 return NULL;
430 one = PyLong_FromLong(1L);
431 if (one == NULL) {
432 Py_DECREF(num);
433 return NULL;
434 }
435 temp = PyNumber_Subtract(num, one);
436 Py_DECREF(one);
437 Py_DECREF(num);
438 num = temp;
439 if (num == NULL)
440 return NULL;
441 overflow = 0;
442 value = PyLong_AsLongAndOverflow(num, &overflow);
443 Py_DECREF(num);
444 if (value == -1 && PyErr_Occurred())
445 return NULL;
446 if (value != -1)
447 return raiseTestError("test_long_and_overflow",
448 "return value was not set to -1");
449 if (overflow != -1)
450 return raiseTestError("test_long_and_overflow",
451 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 /* Test that overflow is cleared properly for small values. */
454 num = PyLong_FromString("FF", NULL, 16);
455 if (num == NULL)
456 return NULL;
457 overflow = 1234;
458 value = PyLong_AsLongAndOverflow(num, &overflow);
459 Py_DECREF(num);
460 if (value == -1 && PyErr_Occurred())
461 return NULL;
462 if (value != 0xFF)
463 return raiseTestError("test_long_and_overflow",
464 "expected return value 0xFF");
465 if (overflow != 0)
466 return raiseTestError("test_long_and_overflow",
467 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 num = PyLong_FromString("-FF", NULL, 16);
470 if (num == NULL)
471 return NULL;
472 overflow = 0;
473 value = PyLong_AsLongAndOverflow(num, &overflow);
474 Py_DECREF(num);
475 if (value == -1 && PyErr_Occurred())
476 return NULL;
477 if (value != -0xFF)
478 return raiseTestError("test_long_and_overflow",
479 "expected return value 0xFF");
480 if (overflow != 0)
481 return raiseTestError("test_long_and_overflow",
482 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 num = PyLong_FromLong(LONG_MAX);
485 if (num == NULL)
486 return NULL;
487 overflow = 1234;
488 value = PyLong_AsLongAndOverflow(num, &overflow);
489 Py_DECREF(num);
490 if (value == -1 && PyErr_Occurred())
491 return NULL;
492 if (value != LONG_MAX)
493 return raiseTestError("test_long_and_overflow",
494 "expected return value LONG_MAX");
495 if (overflow != 0)
496 return raiseTestError("test_long_and_overflow",
497 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 num = PyLong_FromLong(LONG_MIN);
500 if (num == NULL)
501 return NULL;
502 overflow = 0;
503 value = PyLong_AsLongAndOverflow(num, &overflow);
504 Py_DECREF(num);
505 if (value == -1 && PyErr_Occurred())
506 return NULL;
507 if (value != LONG_MIN)
508 return raiseTestError("test_long_and_overflow",
509 "expected return value LONG_MIN");
510 if (overflow != 0)
511 return raiseTestError("test_long_and_overflow",
512 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 Py_INCREF(Py_None);
515 return Py_None;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000516}
517
Mark Dickinson93f562c2010-01-30 10:30:15 +0000518/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
519 PY_LONG_LONG is tested by test_long_api_inner. This test will
520 concentrate on proper handling of overflow.
521*/
522
523static PyObject *
524test_long_long_and_overflow(PyObject *self)
525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 PyObject *num, *one, *temp;
527 PY_LONG_LONG value;
528 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 /* Test that overflow is set properly for a large value. */
531 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
532 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
533 if (num == NULL)
534 return NULL;
535 overflow = 1234;
536 value = PyLong_AsLongLongAndOverflow(num, &overflow);
537 Py_DECREF(num);
538 if (value == -1 && PyErr_Occurred())
539 return NULL;
540 if (value != -1)
541 return raiseTestError("test_long_long_and_overflow",
542 "return value was not set to -1");
543 if (overflow != 1)
544 return raiseTestError("test_long_long_and_overflow",
545 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 /* Same again, with num = PY_LLONG_MAX + 1 */
548 num = PyLong_FromLongLong(PY_LLONG_MAX);
549 if (num == NULL)
550 return NULL;
551 one = PyLong_FromLong(1L);
552 if (one == NULL) {
553 Py_DECREF(num);
554 return NULL;
555 }
556 temp = PyNumber_Add(num, one);
557 Py_DECREF(one);
558 Py_DECREF(num);
559 num = temp;
560 if (num == NULL)
561 return NULL;
562 overflow = 0;
563 value = PyLong_AsLongLongAndOverflow(num, &overflow);
564 Py_DECREF(num);
565 if (value == -1 && PyErr_Occurred())
566 return NULL;
567 if (value != -1)
568 return raiseTestError("test_long_long_and_overflow",
569 "return value was not set to -1");
570 if (overflow != 1)
571 return raiseTestError("test_long_long_and_overflow",
572 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 /* Test that overflow is set properly for a large negative value. */
575 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
576 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
577 if (num == NULL)
578 return NULL;
579 overflow = 1234;
580 value = PyLong_AsLongLongAndOverflow(num, &overflow);
581 Py_DECREF(num);
582 if (value == -1 && PyErr_Occurred())
583 return NULL;
584 if (value != -1)
585 return raiseTestError("test_long_long_and_overflow",
586 "return value was not set to -1");
587 if (overflow != -1)
588 return raiseTestError("test_long_long_and_overflow",
589 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 /* Same again, with num = PY_LLONG_MIN - 1 */
592 num = PyLong_FromLongLong(PY_LLONG_MIN);
593 if (num == NULL)
594 return NULL;
595 one = PyLong_FromLong(1L);
596 if (one == NULL) {
597 Py_DECREF(num);
598 return NULL;
599 }
600 temp = PyNumber_Subtract(num, one);
601 Py_DECREF(one);
602 Py_DECREF(num);
603 num = temp;
604 if (num == NULL)
605 return NULL;
606 overflow = 0;
607 value = PyLong_AsLongLongAndOverflow(num, &overflow);
608 Py_DECREF(num);
609 if (value == -1 && PyErr_Occurred())
610 return NULL;
611 if (value != -1)
612 return raiseTestError("test_long_long_and_overflow",
613 "return value was not set to -1");
614 if (overflow != -1)
615 return raiseTestError("test_long_long_and_overflow",
616 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 /* Test that overflow is cleared properly for small values. */
619 num = PyLong_FromString("FF", NULL, 16);
620 if (num == NULL)
621 return NULL;
622 overflow = 1234;
623 value = PyLong_AsLongLongAndOverflow(num, &overflow);
624 Py_DECREF(num);
625 if (value == -1 && PyErr_Occurred())
626 return NULL;
627 if (value != 0xFF)
628 return raiseTestError("test_long_long_and_overflow",
629 "expected return value 0xFF");
630 if (overflow != 0)
631 return raiseTestError("test_long_long_and_overflow",
632 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 num = PyLong_FromString("-FF", NULL, 16);
635 if (num == NULL)
636 return NULL;
637 overflow = 0;
638 value = PyLong_AsLongLongAndOverflow(num, &overflow);
639 Py_DECREF(num);
640 if (value == -1 && PyErr_Occurred())
641 return NULL;
642 if (value != -0xFF)
643 return raiseTestError("test_long_long_and_overflow",
644 "expected return value 0xFF");
645 if (overflow != 0)
646 return raiseTestError("test_long_long_and_overflow",
647 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 num = PyLong_FromLongLong(PY_LLONG_MAX);
650 if (num == NULL)
651 return NULL;
652 overflow = 1234;
653 value = PyLong_AsLongLongAndOverflow(num, &overflow);
654 Py_DECREF(num);
655 if (value == -1 && PyErr_Occurred())
656 return NULL;
657 if (value != PY_LLONG_MAX)
658 return raiseTestError("test_long_long_and_overflow",
659 "expected return value PY_LLONG_MAX");
660 if (overflow != 0)
661 return raiseTestError("test_long_long_and_overflow",
662 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 num = PyLong_FromLongLong(PY_LLONG_MIN);
665 if (num == NULL)
666 return NULL;
667 overflow = 0;
668 value = PyLong_AsLongLongAndOverflow(num, &overflow);
669 Py_DECREF(num);
670 if (value == -1 && PyErr_Occurred())
671 return NULL;
672 if (value != PY_LLONG_MIN)
673 return raiseTestError("test_long_long_and_overflow",
674 "expected return value PY_LLONG_MIN");
675 if (overflow != 0)
676 return raiseTestError("test_long_long_and_overflow",
677 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 Py_INCREF(Py_None);
680 return Py_None;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000681}
682
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200683/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
684 non-integer arguments are handled correctly. It should be extended to
685 test overflow handling.
686 */
687
688static PyObject *
689test_long_as_size_t(PyObject *self)
690{
691 size_t out_u;
692 Py_ssize_t out_s;
693
694 Py_INCREF(Py_None);
695
696 out_u = PyLong_AsSize_t(Py_None);
697 if (out_u != (size_t)-1 || !PyErr_Occurred())
698 return raiseTestError("test_long_as_size_t",
699 "PyLong_AsSize_t(None) didn't complain");
700 if (!PyErr_ExceptionMatches(PyExc_TypeError))
701 return raiseTestError("test_long_as_size_t",
702 "PyLong_AsSize_t(None) raised "
703 "something other than TypeError");
704 PyErr_Clear();
705
706 out_s = PyLong_AsSsize_t(Py_None);
707 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
708 return raiseTestError("test_long_as_size_t",
709 "PyLong_AsSsize_t(None) didn't complain");
710 if (!PyErr_ExceptionMatches(PyExc_TypeError))
711 return raiseTestError("test_long_as_size_t",
712 "PyLong_AsSsize_t(None) raised "
713 "something other than TypeError");
714 PyErr_Clear();
715
716 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
717 return Py_None;
718}
719
720/* Test the PyLong_AsDouble API. At present this just tests that
721 non-integer arguments are handled correctly.
722 */
723
724static PyObject *
725test_long_as_double(PyObject *self)
726{
727 double out;
728
729 Py_INCREF(Py_None);
730
731 out = PyLong_AsDouble(Py_None);
732 if (out != -1.0 || !PyErr_Occurred())
733 return raiseTestError("test_long_as_double",
734 "PyLong_AsDouble(None) didn't complain");
735 if (!PyErr_ExceptionMatches(PyExc_TypeError))
736 return raiseTestError("test_long_as_double",
737 "PyLong_AsDouble(None) raised "
738 "something other than TypeError");
739 PyErr_Clear();
740
741 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
742 return Py_None;
743}
744
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000745/* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
Tim Petersd38b1c72001-09-30 05:09:37 +0000746 for both long and int arguments. The test may leak a little memory if
747 it fails.
748*/
749static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000750test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 PyObject *tuple, *num;
753 PY_LONG_LONG value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 tuple = PyTuple_New(1);
756 if (tuple == NULL)
757 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 num = PyLong_FromLong(42);
760 if (num == NULL)
761 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 value = -1;
766 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
767 return NULL;
768 if (value != 42)
769 return raiseTestError("test_L_code",
770 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 Py_DECREF(num);
773 num = PyLong_FromLong(42);
774 if (num == NULL)
775 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 value = -1;
780 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
781 return NULL;
782 if (value != 42)
783 return raiseTestError("test_L_code",
784 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 Py_DECREF(tuple);
787 Py_INCREF(Py_None);
788 return Py_None;
Tim Petersd38b1c72001-09-30 05:09:37 +0000789}
790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791#endif /* ifdef HAVE_LONG_LONG */
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000792
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000793/* Test tuple argument processing */
794static PyObject *
795getargs_tuple(PyObject *self, PyObject *args)
796{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 int a, b, c;
798 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
799 return NULL;
800 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000801}
802
Christian Heimes380f7f22008-02-28 11:19:05 +0000803/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +0000804static PyObject *
805getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +0000806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
808 static char *fmt="(ii)i|(i(ii))(iii)i";
809 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +0000810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
812 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
813 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
814 return NULL;
815 return Py_BuildValue("iiiiiiiiii",
816 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
817 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +0000818}
819
Larry Hastings83a9f482012-03-20 20:06:16 +0000820/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
821static PyObject *
822getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
823{
824 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
825 int required = -1;
826 int optional = -1;
827 int keyword_only = -1;
828
829 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
830 &required, &optional, &keyword_only))
831 return NULL;
832 return Py_BuildValue("iii", required, optional, keyword_only);
833}
834
Thomas Heller3457e4b2003-04-24 16:14:27 +0000835/* Functions to call PyArg_ParseTuple with integer format codes,
836 and return the result.
837*/
Thomas Hellera4ea6032003-04-17 18:55:45 +0000838static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000839getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000840{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 unsigned char value;
842 if (!PyArg_ParseTuple(args, "b", &value))
843 return NULL;
844 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000845}
846
Thomas Heller3457e4b2003-04-24 16:14:27 +0000847static PyObject *
848getargs_B(PyObject *self, PyObject *args)
849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 unsigned char value;
851 if (!PyArg_ParseTuple(args, "B", &value))
852 return NULL;
853 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000854}
855
856static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +0000857getargs_h(PyObject *self, PyObject *args)
858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 short value;
860 if (!PyArg_ParseTuple(args, "h", &value))
861 return NULL;
862 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +0000863}
864
865static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000866getargs_H(PyObject *self, PyObject *args)
867{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 unsigned short value;
869 if (!PyArg_ParseTuple(args, "H", &value))
870 return NULL;
871 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000872}
873
874static PyObject *
875getargs_I(PyObject *self, PyObject *args)
876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 unsigned int value;
878 if (!PyArg_ParseTuple(args, "I", &value))
879 return NULL;
880 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000881}
882
883static PyObject *
884getargs_k(PyObject *self, PyObject *args)
885{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 unsigned long value;
887 if (!PyArg_ParseTuple(args, "k", &value))
888 return NULL;
889 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000890}
891
892static PyObject *
893getargs_i(PyObject *self, PyObject *args)
894{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 int value;
896 if (!PyArg_ParseTuple(args, "i", &value))
897 return NULL;
898 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000899}
900
Thomas Hellera4ea6032003-04-17 18:55:45 +0000901static PyObject *
902getargs_l(PyObject *self, PyObject *args)
903{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 long value;
905 if (!PyArg_ParseTuple(args, "l", &value))
906 return NULL;
907 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000908}
909
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000910static PyObject *
911getargs_n(PyObject *self, PyObject *args)
912{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 Py_ssize_t value;
914 if (!PyArg_ParseTuple(args, "n", &value))
915 return NULL;
916 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000917}
918
Thomas Hellera4ea6032003-04-17 18:55:45 +0000919#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +0000920static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000921getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000922{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 PY_LONG_LONG value;
924 if (!PyArg_ParseTuple(args, "L", &value))
925 return NULL;
926 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000927}
928
Thomas Hellera4ea6032003-04-17 18:55:45 +0000929static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000930getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000931{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 unsigned PY_LONG_LONG value;
933 if (!PyArg_ParseTuple(args, "K", &value))
934 return NULL;
935 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000936}
937#endif
938
939/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +0000940 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +0000941static PyObject *
942test_k_code(PyObject *self)
943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 PyObject *tuple, *num;
945 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 tuple = PyTuple_New(1);
948 if (tuple == NULL)
949 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 /* a number larger than ULONG_MAX even on 64-bit platforms */
952 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
953 if (num == NULL)
954 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 value = PyLong_AsUnsignedLongMask(num);
957 if (value != ULONG_MAX)
958 return raiseTestError("test_k_code",
959 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 value = 0;
964 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
965 return NULL;
966 if (value != ULONG_MAX)
967 return raiseTestError("test_k_code",
968 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 Py_DECREF(num);
971 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
972 if (num == NULL)
973 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 value = PyLong_AsUnsignedLongMask(num);
976 if (value != (unsigned long)-0x42)
977 return raiseTestError("test_k_code",
978 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 value = 0;
983 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
984 return NULL;
985 if (value != (unsigned long)-0x42)
986 return raiseTestError("test_k_code",
987 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 Py_DECREF(tuple);
990 Py_INCREF(Py_None);
991 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000992}
993
Victor Stinner06e49dd2010-06-13 18:21:50 +0000994static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +0300995getargs_c(PyObject *self, PyObject *args)
996{
997 char c;
998 if (!PyArg_ParseTuple(args, "c", &c))
999 return NULL;
1000 return PyBytes_FromStringAndSize(&c, 1);
1001}
1002
1003static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001004getargs_s(PyObject *self, PyObject *args)
1005{
1006 char *str;
1007 if (!PyArg_ParseTuple(args, "s", &str))
1008 return NULL;
1009 return PyBytes_FromString(str);
1010}
1011
1012static PyObject *
1013getargs_s_star(PyObject *self, PyObject *args)
1014{
1015 Py_buffer buffer;
1016 PyObject *bytes;
1017 if (!PyArg_ParseTuple(args, "s*", &buffer))
1018 return NULL;
1019 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1020 PyBuffer_Release(&buffer);
1021 return bytes;
1022}
1023
1024static PyObject *
1025getargs_s_hash(PyObject *self, PyObject *args)
1026{
1027 char *str;
1028 Py_ssize_t size;
1029 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1030 return NULL;
1031 return PyBytes_FromStringAndSize(str, size);
1032}
1033
1034static PyObject *
1035getargs_z(PyObject *self, PyObject *args)
1036{
1037 char *str;
1038 if (!PyArg_ParseTuple(args, "z", &str))
1039 return NULL;
1040 if (str != NULL)
1041 return PyBytes_FromString(str);
1042 else
1043 Py_RETURN_NONE;
1044}
1045
1046static PyObject *
1047getargs_z_star(PyObject *self, PyObject *args)
1048{
1049 Py_buffer buffer;
1050 PyObject *bytes;
1051 if (!PyArg_ParseTuple(args, "z*", &buffer))
1052 return NULL;
1053 if (buffer.buf != NULL)
1054 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1055 else {
1056 Py_INCREF(Py_None);
1057 bytes = Py_None;
1058 }
1059 PyBuffer_Release(&buffer);
1060 return bytes;
1061}
1062
1063static PyObject *
1064getargs_z_hash(PyObject *self, PyObject *args)
1065{
1066 char *str;
1067 Py_ssize_t size;
1068 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1069 return NULL;
1070 if (str != NULL)
1071 return PyBytes_FromStringAndSize(str, size);
1072 else
1073 Py_RETURN_NONE;
1074}
1075
1076static PyObject *
1077getargs_y(PyObject *self, PyObject *args)
1078{
1079 char *str;
1080 if (!PyArg_ParseTuple(args, "y", &str))
1081 return NULL;
1082 return PyBytes_FromString(str);
1083}
1084
1085static PyObject *
1086getargs_y_star(PyObject *self, PyObject *args)
1087{
1088 Py_buffer buffer;
1089 PyObject *bytes;
1090 if (!PyArg_ParseTuple(args, "y*", &buffer))
1091 return NULL;
1092 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1093 PyBuffer_Release(&buffer);
1094 return bytes;
1095}
1096
1097static PyObject *
1098getargs_y_hash(PyObject *self, PyObject *args)
1099{
1100 char *str;
1101 Py_ssize_t size;
1102 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1103 return NULL;
1104 return PyBytes_FromStringAndSize(str, size);
1105}
1106
1107static PyObject *
1108getargs_u(PyObject *self, PyObject *args)
1109{
1110 Py_UNICODE *str;
1111 Py_ssize_t size;
1112 if (!PyArg_ParseTuple(args, "u", &str))
1113 return NULL;
1114 size = Py_UNICODE_strlen(str);
1115 return PyUnicode_FromUnicode(str, size);
1116}
1117
1118static PyObject *
1119getargs_u_hash(PyObject *self, PyObject *args)
1120{
1121 Py_UNICODE *str;
1122 Py_ssize_t size;
1123 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1124 return NULL;
1125 return PyUnicode_FromUnicode(str, size);
1126}
1127
1128static PyObject *
1129getargs_Z(PyObject *self, PyObject *args)
1130{
1131 Py_UNICODE *str;
1132 Py_ssize_t size;
1133 if (!PyArg_ParseTuple(args, "Z", &str))
1134 return NULL;
1135 if (str != NULL) {
1136 size = Py_UNICODE_strlen(str);
1137 return PyUnicode_FromUnicode(str, size);
1138 } else
1139 Py_RETURN_NONE;
1140}
1141
1142static PyObject *
1143getargs_Z_hash(PyObject *self, PyObject *args)
1144{
1145 Py_UNICODE *str;
1146 Py_ssize_t size;
1147 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1148 return NULL;
1149 if (str != NULL)
1150 return PyUnicode_FromUnicode(str, size);
1151 else
1152 Py_RETURN_NONE;
1153}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001154
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001155/* Test the s and z codes for PyArg_ParseTuple.
1156*/
1157static PyObject *
1158test_s_code(PyObject *self)
1159{
1160 /* Unicode strings should be accepted */
1161 PyObject *tuple, *obj;
1162 char *value;
1163
1164 tuple = PyTuple_New(1);
1165 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001167
1168 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001170 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001172
1173 PyTuple_SET_ITEM(tuple, 0, obj);
1174
1175 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001177 */
1178 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001180
1181 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001183
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001184 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001185 Py_RETURN_NONE;
1186}
1187
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001188static PyObject *
1189test_bug_7414(PyObject *self)
1190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 /* Issue #7414: for PyArg_ParseTupleAndKeywords, 'C' code wasn't being
1192 skipped properly in skipitem() */
1193 int a = 0, b = 0, result;
1194 char *kwlist[] = {"a", "b", NULL};
1195 PyObject *tuple = NULL, *dict = NULL, *b_str;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 tuple = PyTuple_New(0);
1198 if (tuple == NULL)
1199 goto failure;
1200 dict = PyDict_New();
1201 if (dict == NULL)
1202 goto failure;
1203 b_str = PyUnicode_FromString("b");
1204 if (b_str == NULL)
1205 goto failure;
1206 result = PyDict_SetItemString(dict, "b", b_str);
1207 Py_DECREF(b_str);
1208 if (result < 0)
1209 goto failure;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|CC",
1212 kwlist, &a, &b);
1213 if (!result)
1214 goto failure;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 if (a != 0)
1217 return raiseTestError("test_bug_7414",
1218 "C format code not skipped properly");
1219 if (b != 'b')
1220 return raiseTestError("test_bug_7414",
1221 "C format code returned wrong value");
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 Py_DECREF(dict);
1224 Py_DECREF(tuple);
1225 Py_RETURN_NONE;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001226
1227 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 Py_XDECREF(dict);
1229 Py_XDECREF(tuple);
1230 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001231}
1232
1233
Benjamin Peterson92035012008-12-27 16:00:54 +00001234static volatile int x;
1235
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001236/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1237 of an error.
1238*/
1239static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001240test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 PyObject *tuple, *obj;
1243 Py_UNICODE *value;
1244 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1247 /* Just use the macro and check that it compiles */
1248 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 tuple = PyTuple_New(1);
1251 if (tuple == NULL)
1252 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 obj = PyUnicode_Decode("test", strlen("test"),
1255 "ascii", NULL);
1256 if (obj == NULL)
1257 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 value = 0;
1262 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1263 return NULL;
1264 if (value != PyUnicode_AS_UNICODE(obj))
1265 return raiseTestError("test_u_code",
1266 "u code returned wrong value for u'test'");
1267 value = 0;
1268 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1269 return NULL;
1270 if (value != PyUnicode_AS_UNICODE(obj) ||
1271 len != PyUnicode_GET_SIZE(obj))
1272 return raiseTestError("test_u_code",
1273 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 Py_DECREF(tuple);
1276 Py_INCREF(Py_None);
1277 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001278}
1279
Guido van Rossumfb67be22007-08-29 18:38:11 +00001280/* Test Z and Z# codes for PyArg_ParseTuple */
1281static PyObject *
1282test_Z_code(PyObject *self)
1283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001285 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 tuple = PyTuple_New(2);
1289 if (tuple == NULL)
1290 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 obj = PyUnicode_FromString("test");
1293 PyTuple_SET_ITEM(tuple, 0, obj);
1294 Py_INCREF(Py_None);
1295 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 /* swap values on purpose */
1298 value1 = NULL;
1299 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 /* Test Z for both values */
1302 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1303 return NULL;
1304 if (value1 != PyUnicode_AS_UNICODE(obj))
1305 return raiseTestError("test_Z_code",
1306 "Z code returned wrong value for 'test'");
1307 if (value2 != NULL)
1308 return raiseTestError("test_Z_code",
1309 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 value1 = NULL;
1312 value2 = PyUnicode_AS_UNICODE(obj);
1313 len1 = -1;
1314 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 /* Test Z# for both values */
1317 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1318 &value2, &len2) < 0)
1319 return NULL;
1320 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1321 len1 != PyUnicode_GET_SIZE(obj))
1322 return raiseTestError("test_Z_code",
1323 "Z# code returned wrong values for 'test'");
1324 if (value2 != NULL ||
1325 len2 != 0)
1326 return raiseTestError("test_Z_code",
1327 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 Py_DECREF(tuple);
1330 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001331}
1332
Thomas Wouters477c8d52006-05-27 19:21:47 +00001333static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001334test_widechar(PyObject *self)
1335{
1336#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1338 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001339 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001340#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1342 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001343#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1347 if (wide == NULL)
1348 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1351 if (utf8 == NULL) {
1352 Py_DECREF(wide);
1353 return NULL;
1354 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001355
Victor Stinner8ef18872011-11-21 02:06:57 +01001356 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 Py_DECREF(wide);
1358 Py_DECREF(utf8);
1359 return raiseTestError("test_widechar",
1360 "wide string and utf8 string "
1361 "have different length");
1362 }
1363 if (PyUnicode_Compare(wide, utf8)) {
1364 Py_DECREF(wide);
1365 Py_DECREF(utf8);
1366 if (PyErr_Occurred())
1367 return NULL;
1368 return raiseTestError("test_widechar",
1369 "wide string and utf8 string "
1370 "are different");
1371 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 Py_DECREF(wide);
1374 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001375
1376#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1377 wide = PyUnicode_FromWideChar(invalid, 1);
1378 if (wide == NULL)
1379 PyErr_Clear();
1380 else
1381 return raiseTestError("test_widechar",
1382 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1383
1384 wide = PyUnicode_FromUnicode(invalid, 1);
1385 if (wide == NULL)
1386 PyErr_Clear();
1387 else
1388 return raiseTestError("test_widechar",
1389 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
1390#endif
1391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001393}
1394
1395static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001396unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001397{
1398 PyObject *unicode, *result;
1399 Py_ssize_t buflen, size;
1400 wchar_t *buffer;
1401
1402 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1403 return NULL;
1404 buffer = PyMem_Malloc(buflen * sizeof(wchar_t));
1405 if (buffer == NULL)
1406 return PyErr_NoMemory();
1407
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001408 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001409 if (size == -1) {
1410 PyMem_Free(buffer);
1411 return NULL;
1412 }
1413
1414 if (size < buflen)
1415 buflen = size + 1;
1416 else
1417 buflen = size;
1418 result = PyUnicode_FromWideChar(buffer, buflen);
1419 PyMem_Free(buffer);
1420 if (result == NULL)
1421 return NULL;
1422
1423 return Py_BuildValue("(Nn)", result, size);
1424}
1425
1426static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001427unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001428{
1429 PyObject *unicode, *result;
1430 Py_ssize_t size;
1431 wchar_t *buffer;
1432
1433 if (!PyArg_ParseTuple(args, "U", &unicode))
1434 return NULL;
1435
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001436 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001437 if (buffer == NULL)
1438 return NULL;
1439
1440 result = PyUnicode_FromWideChar(buffer, size + 1);
1441 PyMem_Free(buffer);
1442 if (result == NULL)
1443 return NULL;
1444 return Py_BuildValue("(Nn)", result, size);
1445}
1446
1447static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001448unicode_encodedecimal(PyObject *self, PyObject *args)
1449{
1450 Py_UNICODE *unicode;
1451 Py_ssize_t length;
1452 char *errors = NULL;
1453 PyObject *decimal;
1454 Py_ssize_t decimal_length, new_length;
1455 int res;
1456
1457 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1458 return NULL;
1459
1460 decimal_length = length * 7; /* len('&#8364;') */
1461 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1462 if (decimal == NULL)
1463 return NULL;
1464
1465 res = PyUnicode_EncodeDecimal(unicode, length,
1466 PyBytes_AS_STRING(decimal),
1467 errors);
1468 if (res < 0) {
1469 Py_DECREF(decimal);
1470 return NULL;
1471 }
1472
1473 new_length = strlen(PyBytes_AS_STRING(decimal));
1474 assert(new_length <= decimal_length);
1475 res = _PyBytes_Resize(&decimal, new_length);
1476 if (res < 0)
1477 return NULL;
1478
1479 return decimal;
1480}
1481
1482static PyObject *
1483unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1484{
1485 Py_UNICODE *unicode;
1486 Py_ssize_t length;
1487 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1488 return NULL;
1489 return PyUnicode_TransformDecimalToASCII(unicode, length);
1490}
1491
1492static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001493getargs_w_star(PyObject *self, PyObject *args)
1494{
1495 Py_buffer buffer;
1496 PyObject *result;
1497 char *str;
1498
1499 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1500 return NULL;
1501
1502 if (2 <= buffer.len) {
1503 str = buffer.buf;
1504 str[0] = '[';
1505 str[buffer.len-1] = ']';
1506 }
1507
1508 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1509 PyBuffer_Release(&buffer);
1510 return result;
1511}
1512
1513
1514static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001515test_empty_argparse(PyObject *self)
1516{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 /* Test that formats can begin with '|'. See issue #4720. */
1518 PyObject *tuple, *dict = NULL;
1519 static char *kwlist[] = {NULL};
1520 int result;
1521 tuple = PyTuple_New(0);
1522 if (!tuple)
1523 return NULL;
1524 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1525 goto done;
1526 dict = PyDict_New();
1527 if (!dict)
1528 goto done;
1529 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00001530 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 Py_DECREF(tuple);
1532 Py_XDECREF(dict);
1533 if (result < 0)
1534 return NULL;
1535 else {
1536 Py_RETURN_NONE;
1537 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001538}
1539
1540static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001541codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 const char *encoding, *errors = NULL;
1544 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1545 &encoding, &errors))
1546 return NULL;
1547 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001548}
1549
Thomas Wouters477c8d52006-05-27 19:21:47 +00001550static PyObject *
1551codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 const char *encoding, *errors = NULL;
1554 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1555 &encoding, &errors))
1556 return NULL;
1557 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001558}
1559
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001560
Tim Peters5b8132f2003-01-31 15:52:05 +00001561/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001562static PyObject *
1563test_long_numbits(PyObject *self)
1564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 struct triple {
1566 long input;
1567 size_t nbits;
1568 int sign;
1569 } testcases[] = {{0, 0, 0},
1570 {1L, 1, 1},
1571 {-1L, 1, -1},
1572 {2L, 2, 1},
1573 {-2L, 2, -1},
1574 {3L, 2, 1},
1575 {-3L, 2, -1},
1576 {4L, 3, 1},
1577 {-4L, 3, -1},
1578 {0x7fffL, 15, 1}, /* one Python long digit */
1579 {-0x7fffL, 15, -1},
1580 {0xffffL, 16, 1},
1581 {-0xffffL, 16, -1},
1582 {0xfffffffL, 28, 1},
1583 {-0xfffffffL, 28, -1}};
1584 int i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001585
Victor Stinner63941882011-09-29 00:42:28 +02001586 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 PyObject *plong = PyLong_FromLong(testcases[i].input);
1588 size_t nbits = _PyLong_NumBits(plong);
1589 int sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 Py_DECREF(plong);
1592 if (nbits != testcases[i].nbits)
1593 return raiseTestError("test_long_numbits",
1594 "wrong result for _PyLong_NumBits");
1595 if (sign != testcases[i].sign)
1596 return raiseTestError("test_long_numbits",
1597 "wrong result for _PyLong_Sign");
1598 }
1599 Py_INCREF(Py_None);
1600 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001601}
1602
Thomas Heller519a0422007-11-15 20:48:54 +00001603/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00001604
1605static PyObject *
1606test_null_strings(PyObject *self)
1607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
1609 PyObject *tuple = PyTuple_Pack(2, o1, o2);
1610 Py_XDECREF(o1);
1611 Py_XDECREF(o2);
1612 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00001613}
1614
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001615static PyObject *
1616raise_exception(PyObject *self, PyObject *args)
1617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 PyObject *exc;
1619 PyObject *exc_args, *v;
1620 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
1623 &exc, &num_args))
1624 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 exc_args = PyTuple_New(num_args);
1627 if (exc_args == NULL)
1628 return NULL;
1629 for (i = 0; i < num_args; ++i) {
1630 v = PyLong_FromLong(i);
1631 if (v == NULL) {
1632 Py_DECREF(exc_args);
1633 return NULL;
1634 }
1635 PyTuple_SET_ITEM(exc_args, i, v);
1636 }
1637 PyErr_SetObject(exc, exc_args);
1638 Py_DECREF(exc_args);
1639 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001640}
Tim Peters91621db2001-06-12 20:10:01 +00001641
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02001642static PyObject *
1643test_set_exc_info(PyObject *self, PyObject *args)
1644{
1645 PyObject *orig_exc;
1646 PyObject *new_type, *new_value, *new_tb;
1647 PyObject *type, *value, *tb;
1648 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
1649 &new_type, &new_value, &new_tb))
1650 return NULL;
1651
1652 PyErr_GetExcInfo(&type, &value, &tb);
1653
1654 Py_INCREF(new_type);
1655 Py_INCREF(new_value);
1656 Py_INCREF(new_tb);
1657 PyErr_SetExcInfo(new_type, new_value, new_tb);
1658
1659 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
1660 Py_XDECREF(type);
1661 Py_XDECREF(value);
1662 Py_XDECREF(tb);
1663 return orig_exc;
1664}
Benjamin Peterson16323982010-02-03 01:13:41 +00001665
1666static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001667
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001668static PyObject *
1669test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 if (PyDateTimeAPI) {
1671 if (test_run_counter) {
1672 /* Probably regrtest.py -R */
1673 Py_RETURN_NONE;
1674 }
1675 else {
1676 PyErr_SetString(PyExc_AssertionError,
1677 "PyDateTime_CAPI somehow initialized");
1678 return NULL;
1679 }
1680 }
1681 test_run_counter++;
1682 PyDateTime_IMPORT;
1683 if (PyDateTimeAPI)
1684 Py_RETURN_NONE;
1685 else
1686 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001687}
1688
Benjamin Peterson16323982010-02-03 01:13:41 +00001689
1690#ifdef WITH_THREAD
1691
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001692/* test_thread_state spawns a thread of its own, and that thread releases
1693 * `thread_done` when it's finished. The driver code has to know when the
1694 * thread finishes, because the thread uses a PyObject (the callable) that
1695 * may go away when the driver finishes. The former lack of this explicit
1696 * synchronization caused rare segfaults, so rare that they were seen only
1697 * on a Mac buildbot (although they were possible on any box).
1698 */
1699static PyThread_type_lock thread_done = NULL;
1700
Benjamin Petersona786b022008-08-25 21:05:21 +00001701static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001702_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001703{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 PyObject *rc;
1705 int success;
1706 PyGILState_STATE s = PyGILState_Ensure();
1707 rc = PyObject_CallFunction((PyObject *)callable, "");
1708 success = (rc != NULL);
1709 Py_XDECREF(rc);
1710 PyGILState_Release(s);
1711 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001712}
1713
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001714/* Same thing, but releases `thread_done` when it returns. This variant
1715 * should be called only from threads spawned by test_thread_state().
1716 */
1717static void
1718_make_call_from_thread(void *callable)
1719{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 _make_call(callable);
1721 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001722}
1723
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001724static PyObject *
1725test_thread_state(PyObject *self, PyObject *args)
1726{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 PyObject *fn;
1728 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1731 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 if (!PyCallable_Check(fn)) {
1734 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1735 fn->ob_type->tp_name);
1736 return NULL;
1737 }
Benjamin Petersona786b022008-08-25 21:05:21 +00001738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 /* Ensure Python is set up for threading */
1740 PyEval_InitThreads();
1741 thread_done = PyThread_allocate_lock();
1742 if (thread_done == NULL)
1743 return PyErr_NoMemory();
1744 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 /* Start a new thread with our callback. */
1747 PyThread_start_new_thread(_make_call_from_thread, fn);
1748 /* Make the callback with the thread lock held by this thread */
1749 success &= _make_call(fn);
1750 /* Do it all again, but this time with the thread-lock released */
1751 Py_BEGIN_ALLOW_THREADS
1752 success &= _make_call(fn);
1753 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1754 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 /* And once more with and without a thread
1757 XXX - should use a lock and work out exactly what we are trying
1758 to test <wink>
1759 */
1760 Py_BEGIN_ALLOW_THREADS
1761 PyThread_start_new_thread(_make_call_from_thread, fn);
1762 success &= _make_call(fn);
1763 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1764 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 /* Release lock we acquired above. This is required on HP-UX. */
1767 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 PyThread_free_lock(thread_done);
1770 if (!success)
1771 return NULL;
1772 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001773}
Benjamin Petersona54c9092009-01-13 02:11:23 +00001774
1775/* test Py_AddPendingCalls using threads */
1776static int _pending_callback(void *arg)
1777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 /* we assume the argument is callable object to which we own a reference */
1779 PyObject *callable = (PyObject *)arg;
1780 PyObject *r = PyObject_CallObject(callable, NULL);
1781 Py_DECREF(callable);
1782 Py_XDECREF(r);
1783 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001784}
1785
1786/* The following requests n callbacks to _pending_callback. It can be
1787 * run from any python thread.
1788 */
1789PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
1790{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 PyObject *callable;
1792 int r;
1793 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
1794 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 /* create the reference for the callbackwhile we hold the lock */
1797 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00001798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 Py_BEGIN_ALLOW_THREADS
1800 r = Py_AddPendingCall(&_pending_callback, callable);
1801 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00001802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 if (r<0) {
1804 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
1805 Py_INCREF(Py_False);
1806 return Py_False;
1807 }
1808 Py_INCREF(Py_True);
1809 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001810}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001811#endif
1812
Neal Norwitzb0d26332007-08-25 00:49:05 +00001813/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001814static PyObject *
1815test_string_from_format(PyObject *self, PyObject *args)
1816{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 PyObject *result;
1818 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001819
Alexander Belopolskye239d232010-12-08 23:31:48 +00001820#define CHECK_1_FORMAT(FORMAT, TYPE) \
1821 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
1822 if (result == NULL) \
1823 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01001824 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00001825 msg = FORMAT " failed at 1"; \
1826 goto Fail; \
1827 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 CHECK_1_FORMAT("%d", int);
1831 CHECK_1_FORMAT("%ld", long);
1832 /* The z width modifier was added in Python 2.5. */
1833 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 /* The u type code was added in Python 2.5. */
1836 CHECK_1_FORMAT("%u", unsigned int);
1837 CHECK_1_FORMAT("%lu", unsigned long);
1838 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001841#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
1843 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001844#endif
1845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001847
1848 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 Py_XDECREF(result);
1850 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001851
1852#undef CHECK_1_FORMAT
1853}
1854
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001855
1856static PyObject *
1857test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
1859 int result;
1860 if (py_s == NULL)
1861 return NULL;
1862 result = PyUnicode_CompareWithASCIIString(py_s, "str");
1863 Py_DECREF(py_s);
1864 if (!result) {
1865 PyErr_SetString(TestError, "Python string ending in NULL "
1866 "should not compare equal to c string.");
1867 return NULL;
1868 }
1869 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00001870}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001871
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001872/* This is here to provide a docstring for test_descr. */
1873static PyObject *
1874test_with_docstring(PyObject *self)
1875{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001877}
1878
Mark Dickinson725bfd82009-05-03 20:33:40 +00001879/* Test PyOS_string_to_double. */
1880static PyObject *
1881test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 double result;
1883 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00001884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885#define CHECK_STRING(STR, expected) \
1886 result = PyOS_string_to_double(STR, NULL, NULL); \
1887 if (result == -1.0 && PyErr_Occurred()) \
1888 return NULL; \
1889 if (result != expected) { \
1890 msg = "conversion of " STR " to float failed"; \
1891 goto fail; \
1892 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00001893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894#define CHECK_INVALID(STR) \
1895 result = PyOS_string_to_double(STR, NULL, NULL); \
1896 if (result == -1.0 && PyErr_Occurred()) { \
1897 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
1898 PyErr_Clear(); \
1899 else \
1900 return NULL; \
1901 } \
1902 else { \
1903 msg = "conversion of " STR " didn't raise ValueError"; \
1904 goto fail; \
1905 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00001906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 CHECK_STRING("0.1", 0.1);
1908 CHECK_STRING("1.234", 1.234);
1909 CHECK_STRING("-1.35", -1.35);
1910 CHECK_STRING(".1e01", 1.0);
1911 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00001912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 CHECK_INVALID(" 0.1");
1914 CHECK_INVALID("\t\n-3");
1915 CHECK_INVALID(".123 ");
1916 CHECK_INVALID("3\n");
1917 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00001918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00001920 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00001922#undef CHECK_STRING
1923#undef CHECK_INVALID
1924}
1925
1926
Benjamin Petersonb173f782009-05-05 22:31:58 +00001927/* Coverage testing of capsule objects. */
1928
1929static const char *capsule_name = "capsule name";
1930static char *capsule_pointer = "capsule pointer";
1931static char *capsule_context = "capsule context";
1932static const char *capsule_error = NULL;
1933static int
1934capsule_destructor_call_count = 0;
1935
1936static void
1937capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 capsule_destructor_call_count++;
1939 if (PyCapsule_GetContext(o) != capsule_context) {
1940 capsule_error = "context did not match in destructor!";
1941 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
1942 capsule_error = "destructor did not match in destructor! (woah!)";
1943 } else if (PyCapsule_GetName(o) != capsule_name) {
1944 capsule_error = "name did not match in destructor!";
1945 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
1946 capsule_error = "pointer did not match in destructor!";
1947 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00001948}
1949
1950typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 char *name;
1952 char *module;
1953 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001954} known_capsule;
1955
1956static PyObject *
1957test_capsule(PyObject *self, PyObject *args)
1958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 PyObject *object;
1960 const char *error = NULL;
1961 void *pointer;
1962 void *pointer2;
1963 known_capsule known_capsules[] = {
1964 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
1965 KNOWN_CAPSULE("_socket", "CAPI"),
1966 KNOWN_CAPSULE("_curses", "_C_API"),
1967 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
1968 { NULL, NULL },
1969 };
1970 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00001971
1972#define FAIL(x) { error = (x); goto exit; }
1973
1974#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 if (capsule_error) { \
1976 FAIL(capsule_error); \
1977 } \
1978 else if (!capsule_destructor_call_count) { \
1979 FAIL("destructor not called!"); \
1980 } \
1981 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00001982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
1984 PyCapsule_SetContext(object, capsule_context);
1985 capsule_destructor(object);
1986 CHECK_DESTRUCTOR;
1987 Py_DECREF(object);
1988 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 object = PyCapsule_New(known, "ignored", NULL);
1991 PyCapsule_SetPointer(object, capsule_pointer);
1992 PyCapsule_SetName(object, capsule_name);
1993 PyCapsule_SetDestructor(object, capsule_destructor);
1994 PyCapsule_SetContext(object, capsule_context);
1995 capsule_destructor(object);
1996 CHECK_DESTRUCTOR;
1997 /* intentionally access using the wrong name */
1998 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
1999 if (!PyErr_Occurred()) {
2000 FAIL("PyCapsule_GetPointer should have failed but did not!");
2001 }
2002 PyErr_Clear();
2003 if (pointer2) {
2004 if (pointer2 == capsule_pointer) {
2005 FAIL("PyCapsule_GetPointer should not have"
2006 " returned the internal pointer!");
2007 } else {
2008 FAIL("PyCapsule_GetPointer should have "
2009 "returned NULL pointer but did not!");
2010 }
2011 }
2012 PyCapsule_SetDestructor(object, NULL);
2013 Py_DECREF(object);
2014 if (capsule_destructor_call_count) {
2015 FAIL("destructor called when it should not have been!");
2016 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 for (known = &known_capsules[0]; known->module != NULL; known++) {
2019 /* yeah, ordinarily I wouldn't do this either,
2020 but it's fine for this test harness.
2021 */
2022 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002023#undef FAIL
2024#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 { \
2026 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2027 x, known->module, known->attribute); \
2028 error = buffer; \
2029 goto exit; \
2030 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 PyObject *module = PyImport_ImportModule(known->module);
2033 if (module) {
2034 pointer = PyCapsule_Import(known->name, 0);
2035 if (!pointer) {
2036 Py_DECREF(module);
2037 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2038 }
2039 object = PyObject_GetAttrString(module, known->attribute);
2040 if (!object) {
2041 Py_DECREF(module);
2042 return NULL;
2043 }
2044 pointer2 = PyCapsule_GetPointer(object,
2045 "weebles wobble but they don't fall down");
2046 if (!PyErr_Occurred()) {
2047 Py_DECREF(object);
2048 Py_DECREF(module);
2049 FAIL("PyCapsule_GetPointer should have failed but did not!");
2050 }
2051 PyErr_Clear();
2052 if (pointer2) {
2053 Py_DECREF(module);
2054 Py_DECREF(object);
2055 if (pointer2 == pointer) {
2056 FAIL("PyCapsule_GetPointer should not have"
2057 " returned its internal pointer!");
2058 } else {
2059 FAIL("PyCapsule_GetPointer should have"
2060 " returned NULL pointer but did not!");
2061 }
2062 }
2063 Py_DECREF(object);
2064 Py_DECREF(module);
2065 }
2066 else
2067 PyErr_Clear();
2068 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002069
2070 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 if (error) {
2072 return raiseTestError("test_capsule", error);
2073 }
2074 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002075#undef FAIL
2076}
2077
Guido van Rossumddefaf32007-01-14 03:31:43 +00002078#ifdef HAVE_GETTIMEOFDAY
2079/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002080static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 e->tv_sec -= s->tv_sec;
2083 e->tv_usec -= s->tv_usec;
2084 if (e->tv_usec < 0) {
2085 e->tv_sec -=1;
2086 e->tv_usec += 1000000;
2087 }
2088 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002089}
2090
2091static PyObject *
2092profile_int(PyObject *self, PyObject* args)
2093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 int i, k;
2095 struct timeval start, stop;
2096 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 /* Test 1: Allocate and immediately deallocate
2099 many small integers */
2100 gettimeofday(&start, NULL);
2101 for(k=0; k < 20000; k++)
2102 for(i=0; i < 1000; i++) {
2103 single = PyLong_FromLong(i);
2104 Py_DECREF(single);
2105 }
2106 gettimeofday(&stop, NULL);
2107 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 /* Test 2: Allocate and immediately deallocate
2110 many large integers */
2111 gettimeofday(&start, NULL);
2112 for(k=0; k < 20000; k++)
2113 for(i=0; i < 1000; i++) {
2114 single = PyLong_FromLong(i+1000000);
2115 Py_DECREF(single);
2116 }
2117 gettimeofday(&stop, NULL);
2118 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 /* Test 3: Allocate a few integers, then release
2121 them all simultaneously. */
2122 multiple = malloc(sizeof(PyObject*) * 1000);
2123 gettimeofday(&start, NULL);
2124 for(k=0; k < 20000; k++) {
2125 for(i=0; i < 1000; i++) {
2126 multiple[i] = PyLong_FromLong(i+1000000);
2127 }
2128 for(i=0; i < 1000; i++) {
2129 Py_DECREF(multiple[i]);
2130 }
2131 }
2132 gettimeofday(&stop, NULL);
2133 print_delta(3, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 /* Test 4: Allocate many integers, then release
2136 them all simultaneously. */
2137 multiple = malloc(sizeof(PyObject*) * 1000000);
2138 gettimeofday(&start, NULL);
2139 for(k=0; k < 20; k++) {
2140 for(i=0; i < 1000000; i++) {
2141 multiple[i] = PyLong_FromLong(i+1000000);
2142 }
2143 for(i=0; i < 1000000; i++) {
2144 Py_DECREF(multiple[i]);
2145 }
2146 }
2147 gettimeofday(&stop, NULL);
2148 print_delta(4, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 /* Test 5: Allocate many integers < 32000 */
2151 multiple = malloc(sizeof(PyObject*) * 1000000);
2152 gettimeofday(&start, NULL);
2153 for(k=0; k < 10; k++) {
2154 for(i=0; i < 1000000; i++) {
2155 multiple[i] = PyLong_FromLong(i+1000);
2156 }
2157 for(i=0; i < 1000000; i++) {
2158 Py_DECREF(multiple[i]);
2159 }
2160 }
2161 gettimeofday(&stop, NULL);
2162 print_delta(5, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002164 /* Test 6: Perform small int addition */
2165 op1 = PyLong_FromLong(1);
2166 gettimeofday(&start, NULL);
2167 for(i=0; i < 10000000; i++) {
2168 result = PyNumber_Add(op1, op1);
2169 Py_DECREF(result);
2170 }
2171 gettimeofday(&stop, NULL);
2172 Py_DECREF(op1);
2173 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 /* Test 7: Perform medium int addition */
2176 op1 = PyLong_FromLong(1000);
2177 gettimeofday(&start, NULL);
2178 for(i=0; i < 10000000; i++) {
2179 result = PyNumber_Add(op1, op1);
2180 Py_DECREF(result);
2181 }
2182 gettimeofday(&stop, NULL);
2183 Py_DECREF(op1);
2184 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 Py_INCREF(Py_None);
2187 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002188}
2189#endif
2190
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002191/* To test the format of tracebacks as printed out. */
2192static PyObject *
2193traceback_print(PyObject *self, PyObject *args)
2194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 PyObject *file;
2196 PyObject *traceback;
2197 int result;
2198
2199 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2200 &traceback, &file))
2201 return NULL;
2202
2203 result = PyTraceBack_Print(traceback, file);
2204 if (result < 0)
2205 return NULL;
2206 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002207}
2208
Benjamin Petersone6528212008-07-15 15:32:09 +00002209/* To test the format of exceptions as printed out. */
2210static PyObject *
2211exception_print(PyObject *self, PyObject *args)
2212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 PyObject *value;
2214 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 if (!PyArg_ParseTuple(args, "O:exception_print",
2217 &value))
2218 return NULL;
2219 if (!PyExceptionInstance_Check(value)) {
2220 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2221 return NULL;
2222 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 tb = PyException_GetTraceback(value);
2225 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2226 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002229}
2230
2231
2232
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002233
2234/* reliably raise a MemoryError */
2235static PyObject *
2236raise_memoryerror(PyObject *self)
2237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 PyErr_NoMemory();
2239 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002240}
2241
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002242/* Issue 6012 */
2243static PyObject *str1, *str2;
2244static int
2245failing_converter(PyObject *obj, void *arg)
2246{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002247 /* Clone str1, then let the conversion fail. */
2248 assert(str1);
2249 str2 = str1;
2250 Py_INCREF(str2);
2251 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002252}
2253static PyObject*
2254argparsing(PyObject *o, PyObject *args)
2255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 PyObject *res;
2257 str1 = str2 = NULL;
2258 if (!PyArg_ParseTuple(args, "O&O&",
2259 PyUnicode_FSConverter, &str1,
2260 failing_converter, &str2)) {
2261 if (!str2)
2262 /* argument converter not called? */
2263 return NULL;
2264 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002265 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 Py_DECREF(str2);
2267 PyErr_Clear();
2268 return res;
2269 }
2270 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002271}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002272
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002273/* To test that the result of PyCode_NewEmpty has the right members. */
2274static PyObject *
2275code_newempty(PyObject *self, PyObject *args)
2276{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 const char *filename;
2278 const char *funcname;
2279 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2282 &filename, &funcname, &firstlineno))
2283 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002286}
2287
Georg Brandl1e28a272009-12-28 08:41:01 +00002288/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2289 Run via Lib/test/test_exceptions.py */
2290static PyObject *
2291make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2292{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002293 const char *name;
2294 const char *doc = NULL;
2295 PyObject *base = NULL;
2296 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2301 "s|sOO:make_exception_with_doc", kwlist,
2302 &name, &doc, &base, &dict))
2303 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002306}
2307
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002308static PyObject *
2309make_memoryview_from_NULL_pointer(PyObject *self)
2310{
2311 Py_buffer info;
2312 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2313 return NULL;
2314 return PyMemoryView_FromBuffer(&info);
2315}
2316
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002317/* Test that the fatal error from not having a current thread doesn't
2318 cause an infinite loop. Run via Lib/test/test_capi.py */
2319static PyObject *
2320crash_no_current_thread(PyObject *self)
2321{
2322 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002323 /* Using PyThreadState_Get() directly allows the test to pass in
2324 !pydebug mode. However, the test only actually tests anything
2325 in pydebug mode, since that's where the infinite loop was in
2326 the first place. */
2327 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002328 Py_END_ALLOW_THREADS
2329 return NULL;
2330}
2331
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002332/* To run some code in a sub-interpreter. */
2333static PyObject *
2334run_in_subinterp(PyObject *self, PyObject *args)
2335{
2336 const char *code;
2337 int r;
2338 PyThreadState *substate, *mainstate;
2339
2340 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2341 &code))
2342 return NULL;
2343
2344 mainstate = PyThreadState_Get();
2345
2346 PyThreadState_Swap(NULL);
2347
2348 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002349 if (substate == NULL) {
2350 /* Since no new thread state was created, there is no exception to
2351 propagate; raise a fresh one after swapping in the old thread
2352 state. */
2353 PyThreadState_Swap(mainstate);
2354 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2355 return NULL;
2356 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002357 r = PyRun_SimpleString(code);
2358 Py_EndInterpreter(substate);
2359
2360 PyThreadState_Swap(mainstate);
2361
2362 return PyLong_FromLong(r);
2363}
2364
Victor Stinner5d272cc2012-03-13 13:35:55 +01002365static PyObject *
2366test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2367{
2368 PyObject *obj;
2369 time_t sec;
2370 if (!PyArg_ParseTuple(args, "O:pytime_object_to_time_t", &obj))
2371 return NULL;
2372 if (_PyTime_ObjectToTime_t(obj, &sec) == -1)
2373 return NULL;
2374 return _PyLong_FromTime_t(sec);
2375}
2376
2377static PyObject *
2378test_pytime_object_to_timeval(PyObject *self, PyObject *args)
2379{
2380 PyObject *obj;
2381 time_t sec;
2382 long usec;
2383 if (!PyArg_ParseTuple(args, "O:pytime_object_to_timeval", &obj))
2384 return NULL;
2385 if (_PyTime_ObjectToTimeval(obj, &sec, &usec) == -1)
2386 return NULL;
2387 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
2388}
2389
Victor Stinner643cd682012-03-02 22:54:03 +01002390static PyObject *
2391test_pytime_object_to_timespec(PyObject *self, PyObject *args)
2392{
2393 PyObject *obj;
2394 time_t sec;
2395 long nsec;
2396 if (!PyArg_ParseTuple(args, "O:pytime_object_to_timespec", &obj))
2397 return NULL;
2398 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec) == -1)
2399 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01002400 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01002401}
2402
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002403
Tim Peters9ea17ac2001-02-02 05:57:15 +00002404static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 {"raise_exception", raise_exception, METH_VARARGS},
2406 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
2407 {"test_config", (PyCFunction)test_config, METH_NOARGS},
2408 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
2409 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
2410 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
2411 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
2413 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
2414 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02002415 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
2416 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
2418 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
2419 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
2420 {"test_bug_7414", (PyCFunction)test_bug_7414, METH_NOARGS},
2421 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
2422 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
2423 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
2424 PyDoc_STR("This is a pretty normal docstring.")},
2425 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
2426 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
2427 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
2428 {"getargs_tuple", getargs_tuple, METH_VARARGS},
2429 {"getargs_keywords", (PyCFunction)getargs_keywords,
2430 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00002431 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
2432 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 {"getargs_b", getargs_b, METH_VARARGS},
2434 {"getargs_B", getargs_B, METH_VARARGS},
2435 {"getargs_h", getargs_h, METH_VARARGS},
2436 {"getargs_H", getargs_H, METH_VARARGS},
2437 {"getargs_I", getargs_I, METH_VARARGS},
2438 {"getargs_k", getargs_k, METH_VARARGS},
2439 {"getargs_i", getargs_i, METH_VARARGS},
2440 {"getargs_l", getargs_l, METH_VARARGS},
2441 {"getargs_n", getargs_n, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00002442#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 {"getargs_L", getargs_L, METH_VARARGS},
2444 {"getargs_K", getargs_K, METH_VARARGS},
2445 {"test_longlong_api", test_longlong_api, METH_NOARGS},
2446 {"test_long_long_and_overflow",
2447 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
2448 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00002449#endif
Eli Bendersky906b88f2011-07-29 07:05:08 +03002450 {"getargs_c", getargs_c, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00002451 {"getargs_s", getargs_s, METH_VARARGS},
2452 {"getargs_s_star", getargs_s_star, METH_VARARGS},
2453 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
2454 {"getargs_z", getargs_z, METH_VARARGS},
2455 {"getargs_z_star", getargs_z_star, METH_VARARGS},
2456 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
2457 {"getargs_y", getargs_y, METH_VARARGS},
2458 {"getargs_y_star", getargs_y_star, METH_VARARGS},
2459 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
2460 {"getargs_u", getargs_u, METH_VARARGS},
2461 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
2462 {"getargs_Z", getargs_Z, METH_VARARGS},
2463 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00002464 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00002466 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00002468 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
2470 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
2471 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
2472 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01002473 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
2474 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
2475 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
2476 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002477#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00002478 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002480#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00002481#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00002482 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00002483#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00002484 {"traceback_print", traceback_print, METH_VARARGS},
2485 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002486 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00002487 {"argparsing", argparsing, METH_VARARGS},
2488 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
2490 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002491 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
2492 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002493 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002494 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01002495 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
2496 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01002497 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00002499};
2500
Thomas Hellera4ea6032003-04-17 18:55:45 +00002501#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
2502
Thomas Wouters89f507f2006-12-13 04:49:30 +00002503typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 char bool_member;
2505 char byte_member;
2506 unsigned char ubyte_member;
2507 short short_member;
2508 unsigned short ushort_member;
2509 int int_member;
2510 unsigned int uint_member;
2511 long long_member;
2512 unsigned long ulong_member;
2513 Py_ssize_t pyssizet_member;
2514 float float_member;
2515 double double_member;
2516 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002517#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 PY_LONG_LONG longlong_member;
2519 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002520#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00002521} all_structmembers;
2522
2523typedef struct {
2524 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002526} test_structmembers;
2527
2528static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
2530 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
2531 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
2532 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
2533 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
2534 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
2535 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
2536 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
2537 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
2538 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
2539 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
2540 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
2541 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002542#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
2544 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002545#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00002547};
2548
2549
Christian Heimes1af737c2008-01-23 08:24:23 +00002550static PyObject *
2551test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
2552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 static char *keywords[] = {
2554 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
2555 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
2556 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00002557#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00002559#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 NULL};
2561 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00002562#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002563 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00002564#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 ;
2566 test_structmembers *ob;
2567 const char *s = NULL;
2568 Py_ssize_t string_len = 0;
2569 ob = PyObject_New(test_structmembers, type);
2570 if (ob == NULL)
2571 return NULL;
2572 memset(&ob->structmembers, 0, sizeof(all_structmembers));
2573 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
2574 &ob->structmembers.bool_member,
2575 &ob->structmembers.byte_member,
2576 &ob->structmembers.ubyte_member,
2577 &ob->structmembers.short_member,
2578 &ob->structmembers.ushort_member,
2579 &ob->structmembers.int_member,
2580 &ob->structmembers.uint_member,
2581 &ob->structmembers.long_member,
2582 &ob->structmembers.ulong_member,
2583 &ob->structmembers.pyssizet_member,
2584 &ob->structmembers.float_member,
2585 &ob->structmembers.double_member,
2586 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00002587#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002588 , &ob->structmembers.longlong_member,
2589 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00002590#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 )) {
2592 Py_DECREF(ob);
2593 return NULL;
2594 }
2595 if (s != NULL) {
2596 if (string_len > 5) {
2597 Py_DECREF(ob);
2598 PyErr_SetString(PyExc_ValueError, "string too long");
2599 return NULL;
2600 }
2601 strcpy(ob->structmembers.inplace_member, s);
2602 }
2603 else {
2604 strcpy(ob->structmembers.inplace_member, "");
2605 }
2606 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002607}
2608
Christian Heimes1af737c2008-01-23 08:24:23 +00002609static void
2610test_structmembers_free(PyObject *ob)
2611{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002613}
2614
2615static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002616 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 "test_structmembersType",
2618 sizeof(test_structmembers), /* tp_basicsize */
2619 0, /* tp_itemsize */
2620 test_structmembers_free, /* destructor tp_dealloc */
2621 0, /* tp_print */
2622 0, /* tp_getattr */
2623 0, /* tp_setattr */
2624 0, /* tp_reserved */
2625 0, /* tp_repr */
2626 0, /* tp_as_number */
2627 0, /* tp_as_sequence */
2628 0, /* tp_as_mapping */
2629 0, /* tp_hash */
2630 0, /* tp_call */
2631 0, /* tp_str */
2632 PyObject_GenericGetAttr, /* tp_getattro */
2633 PyObject_GenericSetAttr, /* tp_setattro */
2634 0, /* tp_as_buffer */
2635 0, /* tp_flags */
2636 "Type containing all structmember types",
2637 0, /* traverseproc tp_traverse */
2638 0, /* tp_clear */
2639 0, /* tp_richcompare */
2640 0, /* tp_weaklistoffset */
2641 0, /* tp_iter */
2642 0, /* tp_iternext */
2643 0, /* tp_methods */
2644 test_members, /* tp_members */
2645 0,
2646 0,
2647 0,
2648 0,
2649 0,
2650 0,
2651 0,
2652 0,
2653 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002654};
2655
2656
Martin v. Löwis1a214512008-06-11 05:26:20 +00002657
2658static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 PyModuleDef_HEAD_INIT,
2660 "_testcapi",
2661 NULL,
2662 -1,
2663 TestMethods,
2664 NULL,
2665 NULL,
2666 NULL,
2667 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002668};
2669
Mark Hammond62b1ab12002-07-23 06:31:15 +00002670PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002671PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00002672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 m = PyModule_Create(&_testcapimodule);
2676 if (m == NULL)
2677 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002679 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00002680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 Py_TYPE(&test_structmembersType)=&PyType_Type;
2682 Py_INCREF(&test_structmembersType);
2683 /* don't use a name starting with "test", since we don't want
2684 test_capi to automatically call this */
2685 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
2688 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
2689 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
2690 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
2691 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
2692 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
2693 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
2694 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
2695 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
2696 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
2697 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
2698 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
2699 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
2700 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
2701 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
2702 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
2703 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
2704 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
2705 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
2706 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
2707 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
2708 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
2709 Py_INCREF(&PyInstanceMethod_Type);
2710 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00002711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
2713 Py_INCREF(TestError);
2714 PyModule_AddObject(m, "error", TestError);
2715 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002716}