blob: 9294df3e63b7143b1bfed005d5e6a345e9379578 [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 */
804static PyObject *getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
805{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
807 static char *fmt="(ii)i|(i(ii))(iii)i";
808 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +0000809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
811 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
812 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
813 return NULL;
814 return Py_BuildValue("iiiiiiiiii",
815 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
816 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +0000817}
818
Thomas Heller3457e4b2003-04-24 16:14:27 +0000819/* Functions to call PyArg_ParseTuple with integer format codes,
820 and return the result.
821*/
Thomas Hellera4ea6032003-04-17 18:55:45 +0000822static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000823getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000824{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 unsigned char value;
826 if (!PyArg_ParseTuple(args, "b", &value))
827 return NULL;
828 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000829}
830
Thomas Heller3457e4b2003-04-24 16:14:27 +0000831static PyObject *
832getargs_B(PyObject *self, PyObject *args)
833{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 unsigned char value;
835 if (!PyArg_ParseTuple(args, "B", &value))
836 return NULL;
837 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000838}
839
840static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +0000841getargs_h(PyObject *self, PyObject *args)
842{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 short value;
844 if (!PyArg_ParseTuple(args, "h", &value))
845 return NULL;
846 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +0000847}
848
849static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000850getargs_H(PyObject *self, PyObject *args)
851{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 unsigned short value;
853 if (!PyArg_ParseTuple(args, "H", &value))
854 return NULL;
855 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000856}
857
858static PyObject *
859getargs_I(PyObject *self, PyObject *args)
860{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 unsigned int value;
862 if (!PyArg_ParseTuple(args, "I", &value))
863 return NULL;
864 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000865}
866
867static PyObject *
868getargs_k(PyObject *self, PyObject *args)
869{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 unsigned long value;
871 if (!PyArg_ParseTuple(args, "k", &value))
872 return NULL;
873 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000874}
875
876static PyObject *
877getargs_i(PyObject *self, PyObject *args)
878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 int value;
880 if (!PyArg_ParseTuple(args, "i", &value))
881 return NULL;
882 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000883}
884
Thomas Hellera4ea6032003-04-17 18:55:45 +0000885static PyObject *
886getargs_l(PyObject *self, PyObject *args)
887{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 long value;
889 if (!PyArg_ParseTuple(args, "l", &value))
890 return NULL;
891 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000892}
893
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000894static PyObject *
895getargs_n(PyObject *self, PyObject *args)
896{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 Py_ssize_t value;
898 if (!PyArg_ParseTuple(args, "n", &value))
899 return NULL;
900 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000901}
902
Thomas Hellera4ea6032003-04-17 18:55:45 +0000903#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +0000904static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000905getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 PY_LONG_LONG value;
908 if (!PyArg_ParseTuple(args, "L", &value))
909 return NULL;
910 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000911}
912
Thomas Hellera4ea6032003-04-17 18:55:45 +0000913static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000914getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 unsigned PY_LONG_LONG value;
917 if (!PyArg_ParseTuple(args, "K", &value))
918 return NULL;
919 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000920}
921#endif
922
923/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +0000924 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +0000925static PyObject *
926test_k_code(PyObject *self)
927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 PyObject *tuple, *num;
929 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 tuple = PyTuple_New(1);
932 if (tuple == NULL)
933 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 /* a number larger than ULONG_MAX even on 64-bit platforms */
936 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
937 if (num == NULL)
938 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 value = PyLong_AsUnsignedLongMask(num);
941 if (value != ULONG_MAX)
942 return raiseTestError("test_k_code",
943 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 value = 0;
948 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
949 return NULL;
950 if (value != ULONG_MAX)
951 return raiseTestError("test_k_code",
952 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 Py_DECREF(num);
955 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
956 if (num == NULL)
957 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 value = PyLong_AsUnsignedLongMask(num);
960 if (value != (unsigned long)-0x42)
961 return raiseTestError("test_k_code",
962 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 value = 0;
967 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
968 return NULL;
969 if (value != (unsigned long)-0x42)
970 return raiseTestError("test_k_code",
971 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 Py_DECREF(tuple);
974 Py_INCREF(Py_None);
975 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000976}
977
Victor Stinner06e49dd2010-06-13 18:21:50 +0000978static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +0300979getargs_c(PyObject *self, PyObject *args)
980{
981 char c;
982 if (!PyArg_ParseTuple(args, "c", &c))
983 return NULL;
984 return PyBytes_FromStringAndSize(&c, 1);
985}
986
987static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +0000988getargs_s(PyObject *self, PyObject *args)
989{
990 char *str;
991 if (!PyArg_ParseTuple(args, "s", &str))
992 return NULL;
993 return PyBytes_FromString(str);
994}
995
996static PyObject *
997getargs_s_star(PyObject *self, PyObject *args)
998{
999 Py_buffer buffer;
1000 PyObject *bytes;
1001 if (!PyArg_ParseTuple(args, "s*", &buffer))
1002 return NULL;
1003 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1004 PyBuffer_Release(&buffer);
1005 return bytes;
1006}
1007
1008static PyObject *
1009getargs_s_hash(PyObject *self, PyObject *args)
1010{
1011 char *str;
1012 Py_ssize_t size;
1013 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1014 return NULL;
1015 return PyBytes_FromStringAndSize(str, size);
1016}
1017
1018static PyObject *
1019getargs_z(PyObject *self, PyObject *args)
1020{
1021 char *str;
1022 if (!PyArg_ParseTuple(args, "z", &str))
1023 return NULL;
1024 if (str != NULL)
1025 return PyBytes_FromString(str);
1026 else
1027 Py_RETURN_NONE;
1028}
1029
1030static PyObject *
1031getargs_z_star(PyObject *self, PyObject *args)
1032{
1033 Py_buffer buffer;
1034 PyObject *bytes;
1035 if (!PyArg_ParseTuple(args, "z*", &buffer))
1036 return NULL;
1037 if (buffer.buf != NULL)
1038 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1039 else {
1040 Py_INCREF(Py_None);
1041 bytes = Py_None;
1042 }
1043 PyBuffer_Release(&buffer);
1044 return bytes;
1045}
1046
1047static PyObject *
1048getargs_z_hash(PyObject *self, PyObject *args)
1049{
1050 char *str;
1051 Py_ssize_t size;
1052 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1053 return NULL;
1054 if (str != NULL)
1055 return PyBytes_FromStringAndSize(str, size);
1056 else
1057 Py_RETURN_NONE;
1058}
1059
1060static PyObject *
1061getargs_y(PyObject *self, PyObject *args)
1062{
1063 char *str;
1064 if (!PyArg_ParseTuple(args, "y", &str))
1065 return NULL;
1066 return PyBytes_FromString(str);
1067}
1068
1069static PyObject *
1070getargs_y_star(PyObject *self, PyObject *args)
1071{
1072 Py_buffer buffer;
1073 PyObject *bytes;
1074 if (!PyArg_ParseTuple(args, "y*", &buffer))
1075 return NULL;
1076 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1077 PyBuffer_Release(&buffer);
1078 return bytes;
1079}
1080
1081static PyObject *
1082getargs_y_hash(PyObject *self, PyObject *args)
1083{
1084 char *str;
1085 Py_ssize_t size;
1086 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1087 return NULL;
1088 return PyBytes_FromStringAndSize(str, size);
1089}
1090
1091static PyObject *
1092getargs_u(PyObject *self, PyObject *args)
1093{
1094 Py_UNICODE *str;
1095 Py_ssize_t size;
1096 if (!PyArg_ParseTuple(args, "u", &str))
1097 return NULL;
1098 size = Py_UNICODE_strlen(str);
1099 return PyUnicode_FromUnicode(str, size);
1100}
1101
1102static PyObject *
1103getargs_u_hash(PyObject *self, PyObject *args)
1104{
1105 Py_UNICODE *str;
1106 Py_ssize_t size;
1107 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1108 return NULL;
1109 return PyUnicode_FromUnicode(str, size);
1110}
1111
1112static PyObject *
1113getargs_Z(PyObject *self, PyObject *args)
1114{
1115 Py_UNICODE *str;
1116 Py_ssize_t size;
1117 if (!PyArg_ParseTuple(args, "Z", &str))
1118 return NULL;
1119 if (str != NULL) {
1120 size = Py_UNICODE_strlen(str);
1121 return PyUnicode_FromUnicode(str, size);
1122 } else
1123 Py_RETURN_NONE;
1124}
1125
1126static PyObject *
1127getargs_Z_hash(PyObject *self, PyObject *args)
1128{
1129 Py_UNICODE *str;
1130 Py_ssize_t size;
1131 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1132 return NULL;
1133 if (str != NULL)
1134 return PyUnicode_FromUnicode(str, size);
1135 else
1136 Py_RETURN_NONE;
1137}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001138
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001139/* Test the s and z codes for PyArg_ParseTuple.
1140*/
1141static PyObject *
1142test_s_code(PyObject *self)
1143{
1144 /* Unicode strings should be accepted */
1145 PyObject *tuple, *obj;
1146 char *value;
1147
1148 tuple = PyTuple_New(1);
1149 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001151
1152 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001154 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001156
1157 PyTuple_SET_ITEM(tuple, 0, obj);
1158
1159 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001161 */
1162 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001164
1165 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001167
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001168 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001169 Py_RETURN_NONE;
1170}
1171
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001172static PyObject *
1173test_bug_7414(PyObject *self)
1174{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 /* Issue #7414: for PyArg_ParseTupleAndKeywords, 'C' code wasn't being
1176 skipped properly in skipitem() */
1177 int a = 0, b = 0, result;
1178 char *kwlist[] = {"a", "b", NULL};
1179 PyObject *tuple = NULL, *dict = NULL, *b_str;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 tuple = PyTuple_New(0);
1182 if (tuple == NULL)
1183 goto failure;
1184 dict = PyDict_New();
1185 if (dict == NULL)
1186 goto failure;
1187 b_str = PyUnicode_FromString("b");
1188 if (b_str == NULL)
1189 goto failure;
1190 result = PyDict_SetItemString(dict, "b", b_str);
1191 Py_DECREF(b_str);
1192 if (result < 0)
1193 goto failure;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|CC",
1196 kwlist, &a, &b);
1197 if (!result)
1198 goto failure;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 if (a != 0)
1201 return raiseTestError("test_bug_7414",
1202 "C format code not skipped properly");
1203 if (b != 'b')
1204 return raiseTestError("test_bug_7414",
1205 "C format code returned wrong value");
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 Py_DECREF(dict);
1208 Py_DECREF(tuple);
1209 Py_RETURN_NONE;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001210
1211 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 Py_XDECREF(dict);
1213 Py_XDECREF(tuple);
1214 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001215}
1216
1217
Benjamin Peterson92035012008-12-27 16:00:54 +00001218static volatile int x;
1219
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001220/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1221 of an error.
1222*/
1223static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001224test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 PyObject *tuple, *obj;
1227 Py_UNICODE *value;
1228 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1231 /* Just use the macro and check that it compiles */
1232 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 tuple = PyTuple_New(1);
1235 if (tuple == NULL)
1236 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 obj = PyUnicode_Decode("test", strlen("test"),
1239 "ascii", NULL);
1240 if (obj == NULL)
1241 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 value = 0;
1246 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1247 return NULL;
1248 if (value != PyUnicode_AS_UNICODE(obj))
1249 return raiseTestError("test_u_code",
1250 "u code returned wrong value for u'test'");
1251 value = 0;
1252 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1253 return NULL;
1254 if (value != PyUnicode_AS_UNICODE(obj) ||
1255 len != PyUnicode_GET_SIZE(obj))
1256 return raiseTestError("test_u_code",
1257 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 Py_DECREF(tuple);
1260 Py_INCREF(Py_None);
1261 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001262}
1263
Guido van Rossumfb67be22007-08-29 18:38:11 +00001264/* Test Z and Z# codes for PyArg_ParseTuple */
1265static PyObject *
1266test_Z_code(PyObject *self)
1267{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001269 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 tuple = PyTuple_New(2);
1273 if (tuple == NULL)
1274 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 obj = PyUnicode_FromString("test");
1277 PyTuple_SET_ITEM(tuple, 0, obj);
1278 Py_INCREF(Py_None);
1279 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 /* swap values on purpose */
1282 value1 = NULL;
1283 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 /* Test Z for both values */
1286 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1287 return NULL;
1288 if (value1 != PyUnicode_AS_UNICODE(obj))
1289 return raiseTestError("test_Z_code",
1290 "Z code returned wrong value for 'test'");
1291 if (value2 != NULL)
1292 return raiseTestError("test_Z_code",
1293 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 value1 = NULL;
1296 value2 = PyUnicode_AS_UNICODE(obj);
1297 len1 = -1;
1298 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 /* Test Z# for both values */
1301 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1302 &value2, &len2) < 0)
1303 return NULL;
1304 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1305 len1 != PyUnicode_GET_SIZE(obj))
1306 return raiseTestError("test_Z_code",
1307 "Z# code returned wrong values for 'test'");
1308 if (value2 != NULL ||
1309 len2 != 0)
1310 return raiseTestError("test_Z_code",
1311 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 Py_DECREF(tuple);
1314 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001315}
1316
Thomas Wouters477c8d52006-05-27 19:21:47 +00001317static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001318test_widechar(PyObject *self)
1319{
1320#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1322 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001323 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001324#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1326 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001327#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1331 if (wide == NULL)
1332 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1335 if (utf8 == NULL) {
1336 Py_DECREF(wide);
1337 return NULL;
1338 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001339
Victor Stinner8ef18872011-11-21 02:06:57 +01001340 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 Py_DECREF(wide);
1342 Py_DECREF(utf8);
1343 return raiseTestError("test_widechar",
1344 "wide string and utf8 string "
1345 "have different length");
1346 }
1347 if (PyUnicode_Compare(wide, utf8)) {
1348 Py_DECREF(wide);
1349 Py_DECREF(utf8);
1350 if (PyErr_Occurred())
1351 return NULL;
1352 return raiseTestError("test_widechar",
1353 "wide string and utf8 string "
1354 "are different");
1355 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 Py_DECREF(wide);
1358 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001359
1360#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1361 wide = PyUnicode_FromWideChar(invalid, 1);
1362 if (wide == NULL)
1363 PyErr_Clear();
1364 else
1365 return raiseTestError("test_widechar",
1366 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1367
1368 wide = PyUnicode_FromUnicode(invalid, 1);
1369 if (wide == NULL)
1370 PyErr_Clear();
1371 else
1372 return raiseTestError("test_widechar",
1373 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
1374#endif
1375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001377}
1378
1379static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001380unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001381{
1382 PyObject *unicode, *result;
1383 Py_ssize_t buflen, size;
1384 wchar_t *buffer;
1385
1386 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1387 return NULL;
1388 buffer = PyMem_Malloc(buflen * sizeof(wchar_t));
1389 if (buffer == NULL)
1390 return PyErr_NoMemory();
1391
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001392 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001393 if (size == -1) {
1394 PyMem_Free(buffer);
1395 return NULL;
1396 }
1397
1398 if (size < buflen)
1399 buflen = size + 1;
1400 else
1401 buflen = size;
1402 result = PyUnicode_FromWideChar(buffer, buflen);
1403 PyMem_Free(buffer);
1404 if (result == NULL)
1405 return NULL;
1406
1407 return Py_BuildValue("(Nn)", result, size);
1408}
1409
1410static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001411unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001412{
1413 PyObject *unicode, *result;
1414 Py_ssize_t size;
1415 wchar_t *buffer;
1416
1417 if (!PyArg_ParseTuple(args, "U", &unicode))
1418 return NULL;
1419
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001420 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001421 if (buffer == NULL)
1422 return NULL;
1423
1424 result = PyUnicode_FromWideChar(buffer, size + 1);
1425 PyMem_Free(buffer);
1426 if (result == NULL)
1427 return NULL;
1428 return Py_BuildValue("(Nn)", result, size);
1429}
1430
1431static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001432unicode_encodedecimal(PyObject *self, PyObject *args)
1433{
1434 Py_UNICODE *unicode;
1435 Py_ssize_t length;
1436 char *errors = NULL;
1437 PyObject *decimal;
1438 Py_ssize_t decimal_length, new_length;
1439 int res;
1440
1441 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1442 return NULL;
1443
1444 decimal_length = length * 7; /* len('&#8364;') */
1445 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1446 if (decimal == NULL)
1447 return NULL;
1448
1449 res = PyUnicode_EncodeDecimal(unicode, length,
1450 PyBytes_AS_STRING(decimal),
1451 errors);
1452 if (res < 0) {
1453 Py_DECREF(decimal);
1454 return NULL;
1455 }
1456
1457 new_length = strlen(PyBytes_AS_STRING(decimal));
1458 assert(new_length <= decimal_length);
1459 res = _PyBytes_Resize(&decimal, new_length);
1460 if (res < 0)
1461 return NULL;
1462
1463 return decimal;
1464}
1465
1466static PyObject *
1467unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1468{
1469 Py_UNICODE *unicode;
1470 Py_ssize_t length;
1471 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1472 return NULL;
1473 return PyUnicode_TransformDecimalToASCII(unicode, length);
1474}
1475
1476static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001477getargs_w_star(PyObject *self, PyObject *args)
1478{
1479 Py_buffer buffer;
1480 PyObject *result;
1481 char *str;
1482
1483 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1484 return NULL;
1485
1486 if (2 <= buffer.len) {
1487 str = buffer.buf;
1488 str[0] = '[';
1489 str[buffer.len-1] = ']';
1490 }
1491
1492 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1493 PyBuffer_Release(&buffer);
1494 return result;
1495}
1496
1497
1498static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001499test_empty_argparse(PyObject *self)
1500{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 /* Test that formats can begin with '|'. See issue #4720. */
1502 PyObject *tuple, *dict = NULL;
1503 static char *kwlist[] = {NULL};
1504 int result;
1505 tuple = PyTuple_New(0);
1506 if (!tuple)
1507 return NULL;
1508 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1509 goto done;
1510 dict = PyDict_New();
1511 if (!dict)
1512 goto done;
1513 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00001514 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 Py_DECREF(tuple);
1516 Py_XDECREF(dict);
1517 if (result < 0)
1518 return NULL;
1519 else {
1520 Py_RETURN_NONE;
1521 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001522}
1523
1524static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001525codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001526{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 const char *encoding, *errors = NULL;
1528 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1529 &encoding, &errors))
1530 return NULL;
1531 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001532}
1533
Thomas Wouters477c8d52006-05-27 19:21:47 +00001534static PyObject *
1535codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 const char *encoding, *errors = NULL;
1538 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1539 &encoding, &errors))
1540 return NULL;
1541 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001542}
1543
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001544
Tim Peters5b8132f2003-01-31 15:52:05 +00001545/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001546static PyObject *
1547test_long_numbits(PyObject *self)
1548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 struct triple {
1550 long input;
1551 size_t nbits;
1552 int sign;
1553 } testcases[] = {{0, 0, 0},
1554 {1L, 1, 1},
1555 {-1L, 1, -1},
1556 {2L, 2, 1},
1557 {-2L, 2, -1},
1558 {3L, 2, 1},
1559 {-3L, 2, -1},
1560 {4L, 3, 1},
1561 {-4L, 3, -1},
1562 {0x7fffL, 15, 1}, /* one Python long digit */
1563 {-0x7fffL, 15, -1},
1564 {0xffffL, 16, 1},
1565 {-0xffffL, 16, -1},
1566 {0xfffffffL, 28, 1},
1567 {-0xfffffffL, 28, -1}};
1568 int i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001569
Victor Stinner63941882011-09-29 00:42:28 +02001570 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 PyObject *plong = PyLong_FromLong(testcases[i].input);
1572 size_t nbits = _PyLong_NumBits(plong);
1573 int sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 Py_DECREF(plong);
1576 if (nbits != testcases[i].nbits)
1577 return raiseTestError("test_long_numbits",
1578 "wrong result for _PyLong_NumBits");
1579 if (sign != testcases[i].sign)
1580 return raiseTestError("test_long_numbits",
1581 "wrong result for _PyLong_Sign");
1582 }
1583 Py_INCREF(Py_None);
1584 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001585}
1586
Thomas Heller519a0422007-11-15 20:48:54 +00001587/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00001588
1589static PyObject *
1590test_null_strings(PyObject *self)
1591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
1593 PyObject *tuple = PyTuple_Pack(2, o1, o2);
1594 Py_XDECREF(o1);
1595 Py_XDECREF(o2);
1596 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00001597}
1598
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001599static PyObject *
1600raise_exception(PyObject *self, PyObject *args)
1601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 PyObject *exc;
1603 PyObject *exc_args, *v;
1604 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
1607 &exc, &num_args))
1608 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 exc_args = PyTuple_New(num_args);
1611 if (exc_args == NULL)
1612 return NULL;
1613 for (i = 0; i < num_args; ++i) {
1614 v = PyLong_FromLong(i);
1615 if (v == NULL) {
1616 Py_DECREF(exc_args);
1617 return NULL;
1618 }
1619 PyTuple_SET_ITEM(exc_args, i, v);
1620 }
1621 PyErr_SetObject(exc, exc_args);
1622 Py_DECREF(exc_args);
1623 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001624}
Tim Peters91621db2001-06-12 20:10:01 +00001625
Benjamin Peterson16323982010-02-03 01:13:41 +00001626
1627static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001628
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001629static PyObject *
1630test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 if (PyDateTimeAPI) {
1632 if (test_run_counter) {
1633 /* Probably regrtest.py -R */
1634 Py_RETURN_NONE;
1635 }
1636 else {
1637 PyErr_SetString(PyExc_AssertionError,
1638 "PyDateTime_CAPI somehow initialized");
1639 return NULL;
1640 }
1641 }
1642 test_run_counter++;
1643 PyDateTime_IMPORT;
1644 if (PyDateTimeAPI)
1645 Py_RETURN_NONE;
1646 else
1647 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001648}
1649
Benjamin Peterson16323982010-02-03 01:13:41 +00001650
1651#ifdef WITH_THREAD
1652
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001653/* test_thread_state spawns a thread of its own, and that thread releases
1654 * `thread_done` when it's finished. The driver code has to know when the
1655 * thread finishes, because the thread uses a PyObject (the callable) that
1656 * may go away when the driver finishes. The former lack of this explicit
1657 * synchronization caused rare segfaults, so rare that they were seen only
1658 * on a Mac buildbot (although they were possible on any box).
1659 */
1660static PyThread_type_lock thread_done = NULL;
1661
Benjamin Petersona786b022008-08-25 21:05:21 +00001662static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001663_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001664{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 PyObject *rc;
1666 int success;
1667 PyGILState_STATE s = PyGILState_Ensure();
1668 rc = PyObject_CallFunction((PyObject *)callable, "");
1669 success = (rc != NULL);
1670 Py_XDECREF(rc);
1671 PyGILState_Release(s);
1672 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001673}
1674
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001675/* Same thing, but releases `thread_done` when it returns. This variant
1676 * should be called only from threads spawned by test_thread_state().
1677 */
1678static void
1679_make_call_from_thread(void *callable)
1680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 _make_call(callable);
1682 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001683}
1684
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001685static PyObject *
1686test_thread_state(PyObject *self, PyObject *args)
1687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 PyObject *fn;
1689 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1692 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 if (!PyCallable_Check(fn)) {
1695 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1696 fn->ob_type->tp_name);
1697 return NULL;
1698 }
Benjamin Petersona786b022008-08-25 21:05:21 +00001699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 /* Ensure Python is set up for threading */
1701 PyEval_InitThreads();
1702 thread_done = PyThread_allocate_lock();
1703 if (thread_done == NULL)
1704 return PyErr_NoMemory();
1705 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 /* Start a new thread with our callback. */
1708 PyThread_start_new_thread(_make_call_from_thread, fn);
1709 /* Make the callback with the thread lock held by this thread */
1710 success &= _make_call(fn);
1711 /* Do it all again, but this time with the thread-lock released */
1712 Py_BEGIN_ALLOW_THREADS
1713 success &= _make_call(fn);
1714 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1715 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 /* And once more with and without a thread
1718 XXX - should use a lock and work out exactly what we are trying
1719 to test <wink>
1720 */
1721 Py_BEGIN_ALLOW_THREADS
1722 PyThread_start_new_thread(_make_call_from_thread, fn);
1723 success &= _make_call(fn);
1724 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1725 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 /* Release lock we acquired above. This is required on HP-UX. */
1728 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 PyThread_free_lock(thread_done);
1731 if (!success)
1732 return NULL;
1733 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001734}
Benjamin Petersona54c9092009-01-13 02:11:23 +00001735
1736/* test Py_AddPendingCalls using threads */
1737static int _pending_callback(void *arg)
1738{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 /* we assume the argument is callable object to which we own a reference */
1740 PyObject *callable = (PyObject *)arg;
1741 PyObject *r = PyObject_CallObject(callable, NULL);
1742 Py_DECREF(callable);
1743 Py_XDECREF(r);
1744 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001745}
1746
1747/* The following requests n callbacks to _pending_callback. It can be
1748 * run from any python thread.
1749 */
1750PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
1751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 PyObject *callable;
1753 int r;
1754 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
1755 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 /* create the reference for the callbackwhile we hold the lock */
1758 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00001759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 Py_BEGIN_ALLOW_THREADS
1761 r = Py_AddPendingCall(&_pending_callback, callable);
1762 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00001763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 if (r<0) {
1765 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
1766 Py_INCREF(Py_False);
1767 return Py_False;
1768 }
1769 Py_INCREF(Py_True);
1770 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001771}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001772#endif
1773
Neal Norwitzb0d26332007-08-25 00:49:05 +00001774/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001775static PyObject *
1776test_string_from_format(PyObject *self, PyObject *args)
1777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 PyObject *result;
1779 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001780
Alexander Belopolskye239d232010-12-08 23:31:48 +00001781#define CHECK_1_FORMAT(FORMAT, TYPE) \
1782 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
1783 if (result == NULL) \
1784 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01001785 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00001786 msg = FORMAT " failed at 1"; \
1787 goto Fail; \
1788 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 CHECK_1_FORMAT("%d", int);
1792 CHECK_1_FORMAT("%ld", long);
1793 /* The z width modifier was added in Python 2.5. */
1794 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 /* The u type code was added in Python 2.5. */
1797 CHECK_1_FORMAT("%u", unsigned int);
1798 CHECK_1_FORMAT("%lu", unsigned long);
1799 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001802#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
1804 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001805#endif
1806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001808
1809 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 Py_XDECREF(result);
1811 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001812
1813#undef CHECK_1_FORMAT
1814}
1815
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001816
1817static PyObject *
1818test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
1820 int result;
1821 if (py_s == NULL)
1822 return NULL;
1823 result = PyUnicode_CompareWithASCIIString(py_s, "str");
1824 Py_DECREF(py_s);
1825 if (!result) {
1826 PyErr_SetString(TestError, "Python string ending in NULL "
1827 "should not compare equal to c string.");
1828 return NULL;
1829 }
1830 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00001831}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001832
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001833/* This is here to provide a docstring for test_descr. */
1834static PyObject *
1835test_with_docstring(PyObject *self)
1836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001838}
1839
Mark Dickinson725bfd82009-05-03 20:33:40 +00001840/* Test PyOS_string_to_double. */
1841static PyObject *
1842test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 double result;
1844 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00001845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846#define CHECK_STRING(STR, expected) \
1847 result = PyOS_string_to_double(STR, NULL, NULL); \
1848 if (result == -1.0 && PyErr_Occurred()) \
1849 return NULL; \
1850 if (result != expected) { \
1851 msg = "conversion of " STR " to float failed"; \
1852 goto fail; \
1853 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00001854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855#define CHECK_INVALID(STR) \
1856 result = PyOS_string_to_double(STR, NULL, NULL); \
1857 if (result == -1.0 && PyErr_Occurred()) { \
1858 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
1859 PyErr_Clear(); \
1860 else \
1861 return NULL; \
1862 } \
1863 else { \
1864 msg = "conversion of " STR " didn't raise ValueError"; \
1865 goto fail; \
1866 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00001867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 CHECK_STRING("0.1", 0.1);
1869 CHECK_STRING("1.234", 1.234);
1870 CHECK_STRING("-1.35", -1.35);
1871 CHECK_STRING(".1e01", 1.0);
1872 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00001873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 CHECK_INVALID(" 0.1");
1875 CHECK_INVALID("\t\n-3");
1876 CHECK_INVALID(".123 ");
1877 CHECK_INVALID("3\n");
1878 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00001879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00001881 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00001883#undef CHECK_STRING
1884#undef CHECK_INVALID
1885}
1886
1887
Benjamin Petersonb173f782009-05-05 22:31:58 +00001888/* Coverage testing of capsule objects. */
1889
1890static const char *capsule_name = "capsule name";
1891static char *capsule_pointer = "capsule pointer";
1892static char *capsule_context = "capsule context";
1893static const char *capsule_error = NULL;
1894static int
1895capsule_destructor_call_count = 0;
1896
1897static void
1898capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 capsule_destructor_call_count++;
1900 if (PyCapsule_GetContext(o) != capsule_context) {
1901 capsule_error = "context did not match in destructor!";
1902 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
1903 capsule_error = "destructor did not match in destructor! (woah!)";
1904 } else if (PyCapsule_GetName(o) != capsule_name) {
1905 capsule_error = "name did not match in destructor!";
1906 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
1907 capsule_error = "pointer did not match in destructor!";
1908 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00001909}
1910
1911typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 char *name;
1913 char *module;
1914 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001915} known_capsule;
1916
1917static PyObject *
1918test_capsule(PyObject *self, PyObject *args)
1919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 PyObject *object;
1921 const char *error = NULL;
1922 void *pointer;
1923 void *pointer2;
1924 known_capsule known_capsules[] = {
1925 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
1926 KNOWN_CAPSULE("_socket", "CAPI"),
1927 KNOWN_CAPSULE("_curses", "_C_API"),
1928 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
1929 { NULL, NULL },
1930 };
1931 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00001932
1933#define FAIL(x) { error = (x); goto exit; }
1934
1935#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 if (capsule_error) { \
1937 FAIL(capsule_error); \
1938 } \
1939 else if (!capsule_destructor_call_count) { \
1940 FAIL("destructor not called!"); \
1941 } \
1942 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00001943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
1945 PyCapsule_SetContext(object, capsule_context);
1946 capsule_destructor(object);
1947 CHECK_DESTRUCTOR;
1948 Py_DECREF(object);
1949 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 object = PyCapsule_New(known, "ignored", NULL);
1952 PyCapsule_SetPointer(object, capsule_pointer);
1953 PyCapsule_SetName(object, capsule_name);
1954 PyCapsule_SetDestructor(object, capsule_destructor);
1955 PyCapsule_SetContext(object, capsule_context);
1956 capsule_destructor(object);
1957 CHECK_DESTRUCTOR;
1958 /* intentionally access using the wrong name */
1959 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
1960 if (!PyErr_Occurred()) {
1961 FAIL("PyCapsule_GetPointer should have failed but did not!");
1962 }
1963 PyErr_Clear();
1964 if (pointer2) {
1965 if (pointer2 == capsule_pointer) {
1966 FAIL("PyCapsule_GetPointer should not have"
1967 " returned the internal pointer!");
1968 } else {
1969 FAIL("PyCapsule_GetPointer should have "
1970 "returned NULL pointer but did not!");
1971 }
1972 }
1973 PyCapsule_SetDestructor(object, NULL);
1974 Py_DECREF(object);
1975 if (capsule_destructor_call_count) {
1976 FAIL("destructor called when it should not have been!");
1977 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00001978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 for (known = &known_capsules[0]; known->module != NULL; known++) {
1980 /* yeah, ordinarily I wouldn't do this either,
1981 but it's fine for this test harness.
1982 */
1983 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00001984#undef FAIL
1985#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 { \
1987 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
1988 x, known->module, known->attribute); \
1989 error = buffer; \
1990 goto exit; \
1991 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00001992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 PyObject *module = PyImport_ImportModule(known->module);
1994 if (module) {
1995 pointer = PyCapsule_Import(known->name, 0);
1996 if (!pointer) {
1997 Py_DECREF(module);
1998 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
1999 }
2000 object = PyObject_GetAttrString(module, known->attribute);
2001 if (!object) {
2002 Py_DECREF(module);
2003 return NULL;
2004 }
2005 pointer2 = PyCapsule_GetPointer(object,
2006 "weebles wobble but they don't fall down");
2007 if (!PyErr_Occurred()) {
2008 Py_DECREF(object);
2009 Py_DECREF(module);
2010 FAIL("PyCapsule_GetPointer should have failed but did not!");
2011 }
2012 PyErr_Clear();
2013 if (pointer2) {
2014 Py_DECREF(module);
2015 Py_DECREF(object);
2016 if (pointer2 == pointer) {
2017 FAIL("PyCapsule_GetPointer should not have"
2018 " returned its internal pointer!");
2019 } else {
2020 FAIL("PyCapsule_GetPointer should have"
2021 " returned NULL pointer but did not!");
2022 }
2023 }
2024 Py_DECREF(object);
2025 Py_DECREF(module);
2026 }
2027 else
2028 PyErr_Clear();
2029 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002030
2031 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 if (error) {
2033 return raiseTestError("test_capsule", error);
2034 }
2035 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002036#undef FAIL
2037}
2038
Guido van Rossumddefaf32007-01-14 03:31:43 +00002039#ifdef HAVE_GETTIMEOFDAY
2040/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002041static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 e->tv_sec -= s->tv_sec;
2044 e->tv_usec -= s->tv_usec;
2045 if (e->tv_usec < 0) {
2046 e->tv_sec -=1;
2047 e->tv_usec += 1000000;
2048 }
2049 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002050}
2051
2052static PyObject *
2053profile_int(PyObject *self, PyObject* args)
2054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 int i, k;
2056 struct timeval start, stop;
2057 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 /* Test 1: Allocate and immediately deallocate
2060 many small integers */
2061 gettimeofday(&start, NULL);
2062 for(k=0; k < 20000; k++)
2063 for(i=0; i < 1000; i++) {
2064 single = PyLong_FromLong(i);
2065 Py_DECREF(single);
2066 }
2067 gettimeofday(&stop, NULL);
2068 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 /* Test 2: Allocate and immediately deallocate
2071 many large integers */
2072 gettimeofday(&start, NULL);
2073 for(k=0; k < 20000; k++)
2074 for(i=0; i < 1000; i++) {
2075 single = PyLong_FromLong(i+1000000);
2076 Py_DECREF(single);
2077 }
2078 gettimeofday(&stop, NULL);
2079 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 /* Test 3: Allocate a few integers, then release
2082 them all simultaneously. */
2083 multiple = malloc(sizeof(PyObject*) * 1000);
2084 gettimeofday(&start, NULL);
2085 for(k=0; k < 20000; k++) {
2086 for(i=0; i < 1000; i++) {
2087 multiple[i] = PyLong_FromLong(i+1000000);
2088 }
2089 for(i=0; i < 1000; i++) {
2090 Py_DECREF(multiple[i]);
2091 }
2092 }
2093 gettimeofday(&stop, NULL);
2094 print_delta(3, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 /* Test 4: Allocate many integers, then release
2097 them all simultaneously. */
2098 multiple = malloc(sizeof(PyObject*) * 1000000);
2099 gettimeofday(&start, NULL);
2100 for(k=0; k < 20; k++) {
2101 for(i=0; i < 1000000; i++) {
2102 multiple[i] = PyLong_FromLong(i+1000000);
2103 }
2104 for(i=0; i < 1000000; i++) {
2105 Py_DECREF(multiple[i]);
2106 }
2107 }
2108 gettimeofday(&stop, NULL);
2109 print_delta(4, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 /* Test 5: Allocate many integers < 32000 */
2112 multiple = malloc(sizeof(PyObject*) * 1000000);
2113 gettimeofday(&start, NULL);
2114 for(k=0; k < 10; k++) {
2115 for(i=0; i < 1000000; i++) {
2116 multiple[i] = PyLong_FromLong(i+1000);
2117 }
2118 for(i=0; i < 1000000; i++) {
2119 Py_DECREF(multiple[i]);
2120 }
2121 }
2122 gettimeofday(&stop, NULL);
2123 print_delta(5, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 /* Test 6: Perform small int addition */
2126 op1 = PyLong_FromLong(1);
2127 gettimeofday(&start, NULL);
2128 for(i=0; i < 10000000; i++) {
2129 result = PyNumber_Add(op1, op1);
2130 Py_DECREF(result);
2131 }
2132 gettimeofday(&stop, NULL);
2133 Py_DECREF(op1);
2134 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 /* Test 7: Perform medium int addition */
2137 op1 = PyLong_FromLong(1000);
2138 gettimeofday(&start, NULL);
2139 for(i=0; i < 10000000; i++) {
2140 result = PyNumber_Add(op1, op1);
2141 Py_DECREF(result);
2142 }
2143 gettimeofday(&stop, NULL);
2144 Py_DECREF(op1);
2145 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 Py_INCREF(Py_None);
2148 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002149}
2150#endif
2151
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002152/* To test the format of tracebacks as printed out. */
2153static PyObject *
2154traceback_print(PyObject *self, PyObject *args)
2155{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 PyObject *file;
2157 PyObject *traceback;
2158 int result;
2159
2160 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2161 &traceback, &file))
2162 return NULL;
2163
2164 result = PyTraceBack_Print(traceback, file);
2165 if (result < 0)
2166 return NULL;
2167 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002168}
2169
Benjamin Petersone6528212008-07-15 15:32:09 +00002170/* To test the format of exceptions as printed out. */
2171static PyObject *
2172exception_print(PyObject *self, PyObject *args)
2173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 PyObject *value;
2175 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 if (!PyArg_ParseTuple(args, "O:exception_print",
2178 &value))
2179 return NULL;
2180 if (!PyExceptionInstance_Check(value)) {
2181 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2182 return NULL;
2183 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 tb = PyException_GetTraceback(value);
2186 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2187 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002190}
2191
2192
2193
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002194
2195/* reliably raise a MemoryError */
2196static PyObject *
2197raise_memoryerror(PyObject *self)
2198{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 PyErr_NoMemory();
2200 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002201}
2202
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002203/* Issue 6012 */
2204static PyObject *str1, *str2;
2205static int
2206failing_converter(PyObject *obj, void *arg)
2207{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002208 /* Clone str1, then let the conversion fail. */
2209 assert(str1);
2210 str2 = str1;
2211 Py_INCREF(str2);
2212 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002213}
2214static PyObject*
2215argparsing(PyObject *o, PyObject *args)
2216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 PyObject *res;
2218 str1 = str2 = NULL;
2219 if (!PyArg_ParseTuple(args, "O&O&",
2220 PyUnicode_FSConverter, &str1,
2221 failing_converter, &str2)) {
2222 if (!str2)
2223 /* argument converter not called? */
2224 return NULL;
2225 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002226 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 Py_DECREF(str2);
2228 PyErr_Clear();
2229 return res;
2230 }
2231 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002232}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002233
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002234/* To test that the result of PyCode_NewEmpty has the right members. */
2235static PyObject *
2236code_newempty(PyObject *self, PyObject *args)
2237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 const char *filename;
2239 const char *funcname;
2240 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2243 &filename, &funcname, &firstlineno))
2244 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002247}
2248
Georg Brandl1e28a272009-12-28 08:41:01 +00002249/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2250 Run via Lib/test/test_exceptions.py */
2251static PyObject *
2252make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 const char *name;
2255 const char *doc = NULL;
2256 PyObject *base = NULL;
2257 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2262 "s|sOO:make_exception_with_doc", kwlist,
2263 &name, &doc, &base, &dict))
2264 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002267}
2268
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002269static PyObject *
2270make_memoryview_from_NULL_pointer(PyObject *self)
2271{
2272 Py_buffer info;
2273 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2274 return NULL;
2275 return PyMemoryView_FromBuffer(&info);
2276}
2277
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002278/* Test that the fatal error from not having a current thread doesn't
2279 cause an infinite loop. Run via Lib/test/test_capi.py */
2280static PyObject *
2281crash_no_current_thread(PyObject *self)
2282{
2283 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002284 /* Using PyThreadState_Get() directly allows the test to pass in
2285 !pydebug mode. However, the test only actually tests anything
2286 in pydebug mode, since that's where the infinite loop was in
2287 the first place. */
2288 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002289 Py_END_ALLOW_THREADS
2290 return NULL;
2291}
2292
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002293/* To run some code in a sub-interpreter. */
2294static PyObject *
2295run_in_subinterp(PyObject *self, PyObject *args)
2296{
2297 const char *code;
2298 int r;
2299 PyThreadState *substate, *mainstate;
2300
2301 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2302 &code))
2303 return NULL;
2304
2305 mainstate = PyThreadState_Get();
2306
2307 PyThreadState_Swap(NULL);
2308
2309 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002310 if (substate == NULL) {
2311 /* Since no new thread state was created, there is no exception to
2312 propagate; raise a fresh one after swapping in the old thread
2313 state. */
2314 PyThreadState_Swap(mainstate);
2315 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2316 return NULL;
2317 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002318 r = PyRun_SimpleString(code);
2319 Py_EndInterpreter(substate);
2320
2321 PyThreadState_Swap(mainstate);
2322
2323 return PyLong_FromLong(r);
2324}
2325
Victor Stinner643cd682012-03-02 22:54:03 +01002326static PyObject *
2327test_pytime_object_to_timespec(PyObject *self, PyObject *args)
2328{
2329 PyObject *obj;
2330 time_t sec;
2331 long nsec;
2332 if (!PyArg_ParseTuple(args, "O:pytime_object_to_timespec", &obj))
2333 return NULL;
2334 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec) == -1)
2335 return NULL;
2336#if defined(HAVE_LONG_LONG) && SIZEOF_TIME_T == SIZEOF_LONG_LONG
2337 return Py_BuildValue("Ll", (PY_LONG_LONG)sec, nsec);
2338#else
2339 assert(sizeof(time_t) <= sizeof(long));
2340 return Py_BuildValue("ll", (long)sec, nsec);
2341#endif
2342}
2343
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002344
Tim Peters9ea17ac2001-02-02 05:57:15 +00002345static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 {"raise_exception", raise_exception, METH_VARARGS},
2347 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
2348 {"test_config", (PyCFunction)test_config, METH_NOARGS},
2349 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
2350 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
2351 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
2352 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
2354 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
2355 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02002356 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
2357 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
2359 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
2360 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
2361 {"test_bug_7414", (PyCFunction)test_bug_7414, METH_NOARGS},
2362 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
2363 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
2364 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
2365 PyDoc_STR("This is a pretty normal docstring.")},
2366 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
2367 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
2368 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
2369 {"getargs_tuple", getargs_tuple, METH_VARARGS},
2370 {"getargs_keywords", (PyCFunction)getargs_keywords,
2371 METH_VARARGS|METH_KEYWORDS},
2372 {"getargs_b", getargs_b, METH_VARARGS},
2373 {"getargs_B", getargs_B, METH_VARARGS},
2374 {"getargs_h", getargs_h, METH_VARARGS},
2375 {"getargs_H", getargs_H, METH_VARARGS},
2376 {"getargs_I", getargs_I, METH_VARARGS},
2377 {"getargs_k", getargs_k, METH_VARARGS},
2378 {"getargs_i", getargs_i, METH_VARARGS},
2379 {"getargs_l", getargs_l, METH_VARARGS},
2380 {"getargs_n", getargs_n, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00002381#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 {"getargs_L", getargs_L, METH_VARARGS},
2383 {"getargs_K", getargs_K, METH_VARARGS},
2384 {"test_longlong_api", test_longlong_api, METH_NOARGS},
2385 {"test_long_long_and_overflow",
2386 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
2387 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00002388#endif
Eli Bendersky906b88f2011-07-29 07:05:08 +03002389 {"getargs_c", getargs_c, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00002390 {"getargs_s", getargs_s, METH_VARARGS},
2391 {"getargs_s_star", getargs_s_star, METH_VARARGS},
2392 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
2393 {"getargs_z", getargs_z, METH_VARARGS},
2394 {"getargs_z_star", getargs_z_star, METH_VARARGS},
2395 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
2396 {"getargs_y", getargs_y, METH_VARARGS},
2397 {"getargs_y_star", getargs_y_star, METH_VARARGS},
2398 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
2399 {"getargs_u", getargs_u, METH_VARARGS},
2400 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
2401 {"getargs_Z", getargs_Z, METH_VARARGS},
2402 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00002403 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00002405 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00002407 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002408 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
2409 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
2410 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
2411 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01002412 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
2413 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
2414 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
2415 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002416#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00002417 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002419#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00002420#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00002421 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00002422#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00002423 {"traceback_print", traceback_print, METH_VARARGS},
2424 {"exception_print", exception_print, METH_VARARGS},
2425 {"argparsing", argparsing, METH_VARARGS},
2426 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
2428 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002429 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
2430 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002431 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002432 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01002433 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002434 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00002435};
2436
Thomas Hellera4ea6032003-04-17 18:55:45 +00002437#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
2438
Thomas Wouters89f507f2006-12-13 04:49:30 +00002439typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 char bool_member;
2441 char byte_member;
2442 unsigned char ubyte_member;
2443 short short_member;
2444 unsigned short ushort_member;
2445 int int_member;
2446 unsigned int uint_member;
2447 long long_member;
2448 unsigned long ulong_member;
2449 Py_ssize_t pyssizet_member;
2450 float float_member;
2451 double double_member;
2452 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002453#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 PY_LONG_LONG longlong_member;
2455 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002456#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00002457} all_structmembers;
2458
2459typedef struct {
2460 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002462} test_structmembers;
2463
2464static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
2466 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
2467 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
2468 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
2469 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
2470 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
2471 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
2472 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
2473 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
2474 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
2475 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
2476 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
2477 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002478#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
2480 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002481#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00002483};
2484
2485
Christian Heimes1af737c2008-01-23 08:24:23 +00002486static PyObject *
2487test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
2488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 static char *keywords[] = {
2490 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
2491 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
2492 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00002493#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00002495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 NULL};
2497 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00002498#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00002500#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 ;
2502 test_structmembers *ob;
2503 const char *s = NULL;
2504 Py_ssize_t string_len = 0;
2505 ob = PyObject_New(test_structmembers, type);
2506 if (ob == NULL)
2507 return NULL;
2508 memset(&ob->structmembers, 0, sizeof(all_structmembers));
2509 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
2510 &ob->structmembers.bool_member,
2511 &ob->structmembers.byte_member,
2512 &ob->structmembers.ubyte_member,
2513 &ob->structmembers.short_member,
2514 &ob->structmembers.ushort_member,
2515 &ob->structmembers.int_member,
2516 &ob->structmembers.uint_member,
2517 &ob->structmembers.long_member,
2518 &ob->structmembers.ulong_member,
2519 &ob->structmembers.pyssizet_member,
2520 &ob->structmembers.float_member,
2521 &ob->structmembers.double_member,
2522 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00002523#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 , &ob->structmembers.longlong_member,
2525 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00002526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 )) {
2528 Py_DECREF(ob);
2529 return NULL;
2530 }
2531 if (s != NULL) {
2532 if (string_len > 5) {
2533 Py_DECREF(ob);
2534 PyErr_SetString(PyExc_ValueError, "string too long");
2535 return NULL;
2536 }
2537 strcpy(ob->structmembers.inplace_member, s);
2538 }
2539 else {
2540 strcpy(ob->structmembers.inplace_member, "");
2541 }
2542 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002543}
2544
Christian Heimes1af737c2008-01-23 08:24:23 +00002545static void
2546test_structmembers_free(PyObject *ob)
2547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002548 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002549}
2550
2551static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002552 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 "test_structmembersType",
2554 sizeof(test_structmembers), /* tp_basicsize */
2555 0, /* tp_itemsize */
2556 test_structmembers_free, /* destructor tp_dealloc */
2557 0, /* tp_print */
2558 0, /* tp_getattr */
2559 0, /* tp_setattr */
2560 0, /* tp_reserved */
2561 0, /* tp_repr */
2562 0, /* tp_as_number */
2563 0, /* tp_as_sequence */
2564 0, /* tp_as_mapping */
2565 0, /* tp_hash */
2566 0, /* tp_call */
2567 0, /* tp_str */
2568 PyObject_GenericGetAttr, /* tp_getattro */
2569 PyObject_GenericSetAttr, /* tp_setattro */
2570 0, /* tp_as_buffer */
2571 0, /* tp_flags */
2572 "Type containing all structmember types",
2573 0, /* traverseproc tp_traverse */
2574 0, /* tp_clear */
2575 0, /* tp_richcompare */
2576 0, /* tp_weaklistoffset */
2577 0, /* tp_iter */
2578 0, /* tp_iternext */
2579 0, /* tp_methods */
2580 test_members, /* tp_members */
2581 0,
2582 0,
2583 0,
2584 0,
2585 0,
2586 0,
2587 0,
2588 0,
2589 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002590};
2591
2592
Martin v. Löwis1a214512008-06-11 05:26:20 +00002593
2594static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 PyModuleDef_HEAD_INIT,
2596 "_testcapi",
2597 NULL,
2598 -1,
2599 TestMethods,
2600 NULL,
2601 NULL,
2602 NULL,
2603 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002604};
2605
Mark Hammond62b1ab12002-07-23 06:31:15 +00002606PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002607PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00002608{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 m = PyModule_Create(&_testcapimodule);
2612 if (m == NULL)
2613 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00002616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 Py_TYPE(&test_structmembersType)=&PyType_Type;
2618 Py_INCREF(&test_structmembersType);
2619 /* don't use a name starting with "test", since we don't want
2620 test_capi to automatically call this */
2621 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
2624 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
2625 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
2626 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
2627 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
2628 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
2629 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
2630 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
2631 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
2632 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
2633 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
2634 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
2635 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
2636 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
2637 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
2638 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
2639 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
2640 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
2641 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
2642 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
2643 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
2644 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
2645 Py_INCREF(&PyInstanceMethod_Type);
2646 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00002647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
2649 Py_INCREF(TestError);
2650 PyModule_AddObject(m, "error", TestError);
2651 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002652}