blob: 75dbe572128736fc594700f40dd99ba54dd1904f [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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000025 char buf[2048];
Tim Peters91621db2001-06-12 20:10:01 +000026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000027 if (strlen(test_name) + strlen(msg) > sizeof(buf) - 50)
28 PyErr_SetString(TestError, "internal error msg too large");
29 else {
30 PyOS_snprintf(buf, sizeof(buf), "%s: %s", test_name, msg);
31 PyErr_SetString(TestError, buf);
32 }
33 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000034}
35
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000036/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000037
38 The ones derived from autoconf on the UNIX-like OSes can be relied
39 upon (in the absence of sloppy cross-compiling), but the Windows
40 platforms have these hardcoded. Better safe than sorry.
41*/
42static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000043sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000045{
Victor Stinner499dfcf2011-03-21 13:26:24 +010046 PyErr_Format(TestError,
47 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000050}
51
52static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000053test_config(PyObject *self)
Tim Peters9ea17ac2001-02-02 05:57:15 +000054{
Tim Peters9ea17ac2001-02-02 05:57:15 +000055#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000056 if (FATNAME != sizeof(TYPE)) \
57 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 CHECK_SIZEOF(SIZEOF_SHORT, short);
60 CHECK_SIZEOF(SIZEOF_INT, int);
61 CHECK_SIZEOF(SIZEOF_LONG, long);
62 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
63 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Tim Peters9ea17ac2001-02-02 05:57:15 +000064#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
Tim Peters9ea17ac2001-02-02 05:57:15 +000066#endif
67
68#undef CHECK_SIZEOF
69
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 Py_INCREF(Py_None);
71 return Py_None;
Tim Peters9ea17ac2001-02-02 05:57:15 +000072}
73
Tim Peters5c4d5bf2001-02-12 22:13:26 +000074static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000075test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +000076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077 PyObject* list;
78 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +000079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +000081#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 list = PyList_New(NLIST);
83 if (list == (PyObject*)NULL)
84 return (PyObject*)NULL;
85 /* list = range(NLIST) */
86 for (i = 0; i < NLIST; ++i) {
87 PyObject* anint = PyLong_FromLong(i);
88 if (anint == (PyObject*)NULL) {
89 Py_DECREF(list);
90 return (PyObject*)NULL;
91 }
92 PyList_SET_ITEM(list, i, anint);
93 }
94 /* list.reverse(), via PyList_Reverse() */
95 i = PyList_Reverse(list); /* should not blow up! */
96 if (i != 0) {
97 Py_DECREF(list);
98 return (PyObject*)NULL;
99 }
100 /* Check that list == range(29, -1, -1) now */
101 for (i = 0; i < NLIST; ++i) {
102 PyObject* anint = PyList_GET_ITEM(list, i);
103 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
104 PyErr_SetString(TestError,
105 "test_list_api: reverse screwed up");
106 Py_DECREF(list);
107 return (PyObject*)NULL;
108 }
109 }
110 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000111#undef NLIST
112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 Py_INCREF(Py_None);
114 return Py_None;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000115}
116
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000117static int
118test_dict_inner(int count)
119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 Py_ssize_t pos = 0, iterations = 0;
121 int i;
122 PyObject *dict = PyDict_New();
123 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 if (dict == NULL)
126 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 for (i = 0; i < count; i++) {
129 v = PyLong_FromLong(i);
130 PyDict_SetItem(dict, v, v);
131 Py_DECREF(v);
132 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 while (PyDict_Next(dict, &pos, &k, &v)) {
135 PyObject *o;
136 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 i = PyLong_AS_LONG(v) + 1;
139 o = PyLong_FromLong(i);
140 if (o == NULL)
141 return -1;
142 if (PyDict_SetItem(dict, k, o) < 0) {
143 Py_DECREF(o);
144 return -1;
145 }
146 Py_DECREF(o);
147 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 if (iterations != count) {
152 PyErr_SetString(
153 TestError,
154 "test_dict_iteration: dict iteration went wrong ");
155 return -1;
156 } else {
157 return 0;
158 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000159}
160
161static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000162test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000164 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 for (i = 0; i < 200; i++) {
167 if (test_dict_inner(i) < 0) {
168 return NULL;
169 }
170 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 Py_INCREF(Py_None);
173 return Py_None;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000174}
175
Tim Peters91621db2001-06-12 20:10:01 +0000176
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000177/* Issue #4701: Check that PyObject_Hash implicitly calls
178 * PyType_Ready if it hasn't already been called
179 */
180static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 PyVarObject_HEAD_INIT(NULL, 0)
182 "hashinheritancetester", /* Name of this type */
183 sizeof(PyObject), /* Basic object size */
184 0, /* Item size for varobject */
185 (destructor)PyObject_Del, /* tp_dealloc */
186 0, /* tp_print */
187 0, /* tp_getattr */
188 0, /* tp_setattr */
189 0, /* tp_reserved */
190 0, /* tp_repr */
191 0, /* tp_as_number */
192 0, /* tp_as_sequence */
193 0, /* tp_as_mapping */
194 0, /* tp_hash */
195 0, /* tp_call */
196 0, /* tp_str */
197 PyObject_GenericGetAttr, /* tp_getattro */
198 0, /* tp_setattro */
199 0, /* tp_as_buffer */
200 Py_TPFLAGS_DEFAULT, /* tp_flags */
201 0, /* tp_doc */
202 0, /* tp_traverse */
203 0, /* tp_clear */
204 0, /* tp_richcompare */
205 0, /* tp_weaklistoffset */
206 0, /* tp_iter */
207 0, /* tp_iternext */
208 0, /* tp_methods */
209 0, /* tp_members */
210 0, /* tp_getset */
211 0, /* tp_base */
212 0, /* tp_dict */
213 0, /* tp_descr_get */
214 0, /* tp_descr_set */
215 0, /* tp_dictoffset */
216 0, /* tp_init */
217 0, /* tp_alloc */
218 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000219};
220
221static PyObject*
222test_lazy_hash_inheritance(PyObject* self)
223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 PyTypeObject *type;
225 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000226 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 if (type->tp_dict != NULL)
231 /* The type has already been initialized. This probably means
232 -R is being used. */
233 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000234
235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 obj = PyObject_New(PyObject, type);
237 if (obj == NULL) {
238 PyErr_Clear();
239 PyErr_SetString(
240 TestError,
241 "test_lazy_hash_inheritance: failed to create object");
242 return NULL;
243 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 if (type->tp_dict != NULL) {
246 PyErr_SetString(
247 TestError,
248 "test_lazy_hash_inheritance: type initialised too soon");
249 Py_DECREF(obj);
250 return NULL;
251 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 hash = PyObject_Hash(obj);
254 if ((hash == -1) && PyErr_Occurred()) {
255 PyErr_Clear();
256 PyErr_SetString(
257 TestError,
258 "test_lazy_hash_inheritance: could not hash object");
259 Py_DECREF(obj);
260 return NULL;
261 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 if (type->tp_dict == NULL) {
264 PyErr_SetString(
265 TestError,
266 "test_lazy_hash_inheritance: type not initialised by hash()");
267 Py_DECREF(obj);
268 return NULL;
269 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 if (type->tp_hash != PyType_Type.tp_hash) {
272 PyErr_SetString(
273 TestError,
274 "test_lazy_hash_inheritance: unexpected hash function");
275 Py_DECREF(obj);
276 return NULL;
277 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000282}
283
284
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000285/* Issue #7385: Check that memoryview() does not crash
286 * when bf_getbuffer returns an error
287 */
288
289static int
290broken_buffer_getbuffer(PyObject *self, Py_buffer *view, int flags)
291{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 PyErr_SetString(
293 TestError,
294 "test_broken_memoryview: expected error in bf_getbuffer");
295 return -1;
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000296}
297
298static PyBufferProcs memoryviewtester_as_buffer = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 (getbufferproc)broken_buffer_getbuffer, /* bf_getbuffer */
300 0, /* bf_releasebuffer */
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000301};
302
303static PyTypeObject _MemoryViewTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 PyVarObject_HEAD_INIT(NULL, 0)
305 "memoryviewtester", /* Name of this type */
306 sizeof(PyObject), /* Basic object size */
307 0, /* Item size for varobject */
308 (destructor)PyObject_Del, /* tp_dealloc */
309 0, /* tp_print */
310 0, /* tp_getattr */
311 0, /* tp_setattr */
312 0, /* tp_compare */
313 0, /* tp_repr */
314 0, /* tp_as_number */
315 0, /* tp_as_sequence */
316 0, /* tp_as_mapping */
317 0, /* tp_hash */
318 0, /* tp_call */
319 0, /* tp_str */
320 PyObject_GenericGetAttr, /* tp_getattro */
321 0, /* tp_setattro */
322 &memoryviewtester_as_buffer, /* tp_as_buffer */
323 Py_TPFLAGS_DEFAULT, /* tp_flags */
324 0, /* tp_doc */
325 0, /* tp_traverse */
326 0, /* tp_clear */
327 0, /* tp_richcompare */
328 0, /* tp_weaklistoffset */
329 0, /* tp_iter */
330 0, /* tp_iternext */
331 0, /* tp_methods */
332 0, /* tp_members */
333 0, /* tp_getset */
334 0, /* tp_base */
335 0, /* tp_dict */
336 0, /* tp_descr_get */
337 0, /* tp_descr_set */
338 0, /* tp_dictoffset */
339 0, /* tp_init */
340 0, /* tp_alloc */
341 PyType_GenericNew, /* tp_new */
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000342};
343
344static PyObject*
345test_broken_memoryview(PyObject* self)
346{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 PyObject *obj = PyObject_New(PyObject, &_MemoryViewTester_Type);
348 PyObject *res;
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 if (obj == NULL) {
351 PyErr_Clear();
352 PyErr_SetString(
353 TestError,
354 "test_broken_memoryview: failed to create object");
355 return NULL;
356 }
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 res = PyMemoryView_FromObject(obj);
359 if (res || !PyErr_Occurred()){
360 PyErr_SetString(
361 TestError,
362 "test_broken_memoryview: memoryview() didn't raise an Exception");
363 Py_XDECREF(res);
364 Py_DECREF(obj);
365 return NULL;
366 }
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 PyErr_Clear();
369 Py_DECREF(obj);
370 Py_RETURN_NONE;
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000371}
372
373
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000374/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
Tim Petersff70d3c2001-06-14 01:11:03 +0000375 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000376
377 Note that the meat of the test is contained in testcapi_long.h.
378 This is revolting, but delicate code duplication is worse: "almost
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000379 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000380 dependence on type names makes it impossible to use a parameterized
381 function. A giant macro would be even worse than this. A C++ template
382 would be perfect.
383
384 The "report an error" functions are deliberately not part of the #include
385 file: if the test fails, you can set a breakpoint in the appropriate
386 error function directly, and crawl back from there in the debugger.
387*/
388
389#define UNBIND(X) Py_DECREF(X); (X) = NULL
390
391static PyObject *
392raise_test_long_error(const char* msg)
393{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000395}
396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397#define TESTNAME test_long_api_inner
398#define TYPENAME long
399#define F_S_TO_PY PyLong_FromLong
400#define F_PY_TO_S PyLong_AsLong
401#define F_U_TO_PY PyLong_FromUnsignedLong
402#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000403
404#include "testcapi_long.h"
405
406static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000407test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000408{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000410}
411
412#undef TESTNAME
413#undef TYPENAME
414#undef F_S_TO_PY
415#undef F_PY_TO_S
416#undef F_U_TO_PY
417#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000418
419#ifdef HAVE_LONG_LONG
Tim Peters91621db2001-06-12 20:10:01 +0000420
421static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000422raise_test_longlong_error(const char* msg)
423{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000425}
426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427#define TESTNAME test_longlong_api_inner
428#define TYPENAME PY_LONG_LONG
429#define F_S_TO_PY PyLong_FromLongLong
430#define F_PY_TO_S PyLong_AsLongLong
431#define F_U_TO_PY PyLong_FromUnsignedLongLong
432#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000433
434#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000435
436static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000437test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000440}
441
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000442#undef TESTNAME
443#undef TYPENAME
444#undef F_S_TO_PY
445#undef F_PY_TO_S
446#undef F_U_TO_PY
447#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000448
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000449/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
450 is tested by test_long_api_inner. This test will concentrate on proper
451 handling of overflow.
452*/
453
454static PyObject *
455test_long_and_overflow(PyObject *self)
456{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 PyObject *num, *one, *temp;
458 long value;
459 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 /* Test that overflow is set properly for a large value. */
462 /* num is a number larger than LONG_MAX even on 64-bit platforms */
463 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
464 if (num == NULL)
465 return NULL;
466 overflow = 1234;
467 value = PyLong_AsLongAndOverflow(num, &overflow);
468 Py_DECREF(num);
469 if (value == -1 && PyErr_Occurred())
470 return NULL;
471 if (value != -1)
472 return raiseTestError("test_long_and_overflow",
473 "return value was not set to -1");
474 if (overflow != 1)
475 return raiseTestError("test_long_and_overflow",
476 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 /* Same again, with num = LONG_MAX + 1 */
479 num = PyLong_FromLong(LONG_MAX);
480 if (num == NULL)
481 return NULL;
482 one = PyLong_FromLong(1L);
483 if (one == NULL) {
484 Py_DECREF(num);
485 return NULL;
486 }
487 temp = PyNumber_Add(num, one);
488 Py_DECREF(one);
489 Py_DECREF(num);
490 num = temp;
491 if (num == NULL)
492 return NULL;
493 overflow = 0;
494 value = PyLong_AsLongAndOverflow(num, &overflow);
495 Py_DECREF(num);
496 if (value == -1 && PyErr_Occurred())
497 return NULL;
498 if (value != -1)
499 return raiseTestError("test_long_and_overflow",
500 "return value was not set to -1");
501 if (overflow != 1)
502 return raiseTestError("test_long_and_overflow",
503 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 /* Test that overflow is set properly for a large negative value. */
506 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
507 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
508 if (num == NULL)
509 return NULL;
510 overflow = 1234;
511 value = PyLong_AsLongAndOverflow(num, &overflow);
512 Py_DECREF(num);
513 if (value == -1 && PyErr_Occurred())
514 return NULL;
515 if (value != -1)
516 return raiseTestError("test_long_and_overflow",
517 "return value was not set to -1");
518 if (overflow != -1)
519 return raiseTestError("test_long_and_overflow",
520 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 /* Same again, with num = LONG_MIN - 1 */
523 num = PyLong_FromLong(LONG_MIN);
524 if (num == NULL)
525 return NULL;
526 one = PyLong_FromLong(1L);
527 if (one == NULL) {
528 Py_DECREF(num);
529 return NULL;
530 }
531 temp = PyNumber_Subtract(num, one);
532 Py_DECREF(one);
533 Py_DECREF(num);
534 num = temp;
535 if (num == NULL)
536 return NULL;
537 overflow = 0;
538 value = PyLong_AsLongAndOverflow(num, &overflow);
539 Py_DECREF(num);
540 if (value == -1 && PyErr_Occurred())
541 return NULL;
542 if (value != -1)
543 return raiseTestError("test_long_and_overflow",
544 "return value was not set to -1");
545 if (overflow != -1)
546 return raiseTestError("test_long_and_overflow",
547 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 /* Test that overflow is cleared properly for small values. */
550 num = PyLong_FromString("FF", NULL, 16);
551 if (num == NULL)
552 return NULL;
553 overflow = 1234;
554 value = PyLong_AsLongAndOverflow(num, &overflow);
555 Py_DECREF(num);
556 if (value == -1 && PyErr_Occurred())
557 return NULL;
558 if (value != 0xFF)
559 return raiseTestError("test_long_and_overflow",
560 "expected return value 0xFF");
561 if (overflow != 0)
562 return raiseTestError("test_long_and_overflow",
563 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 num = PyLong_FromString("-FF", NULL, 16);
566 if (num == NULL)
567 return NULL;
568 overflow = 0;
569 value = PyLong_AsLongAndOverflow(num, &overflow);
570 Py_DECREF(num);
571 if (value == -1 && PyErr_Occurred())
572 return NULL;
573 if (value != -0xFF)
574 return raiseTestError("test_long_and_overflow",
575 "expected return value 0xFF");
576 if (overflow != 0)
577 return raiseTestError("test_long_and_overflow",
578 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 num = PyLong_FromLong(LONG_MAX);
581 if (num == NULL)
582 return NULL;
583 overflow = 1234;
584 value = PyLong_AsLongAndOverflow(num, &overflow);
585 Py_DECREF(num);
586 if (value == -1 && PyErr_Occurred())
587 return NULL;
588 if (value != LONG_MAX)
589 return raiseTestError("test_long_and_overflow",
590 "expected return value LONG_MAX");
591 if (overflow != 0)
592 return raiseTestError("test_long_and_overflow",
593 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 num = PyLong_FromLong(LONG_MIN);
596 if (num == NULL)
597 return NULL;
598 overflow = 0;
599 value = PyLong_AsLongAndOverflow(num, &overflow);
600 Py_DECREF(num);
601 if (value == -1 && PyErr_Occurred())
602 return NULL;
603 if (value != LONG_MIN)
604 return raiseTestError("test_long_and_overflow",
605 "expected return value LONG_MIN");
606 if (overflow != 0)
607 return raiseTestError("test_long_and_overflow",
608 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 Py_INCREF(Py_None);
611 return Py_None;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000612}
613
Mark Dickinson93f562c2010-01-30 10:30:15 +0000614/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
615 PY_LONG_LONG is tested by test_long_api_inner. This test will
616 concentrate on proper handling of overflow.
617*/
618
619static PyObject *
620test_long_long_and_overflow(PyObject *self)
621{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 PyObject *num, *one, *temp;
623 PY_LONG_LONG value;
624 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 /* Test that overflow is set properly for a large value. */
627 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
628 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
629 if (num == NULL)
630 return NULL;
631 overflow = 1234;
632 value = PyLong_AsLongLongAndOverflow(num, &overflow);
633 Py_DECREF(num);
634 if (value == -1 && PyErr_Occurred())
635 return NULL;
636 if (value != -1)
637 return raiseTestError("test_long_long_and_overflow",
638 "return value was not set to -1");
639 if (overflow != 1)
640 return raiseTestError("test_long_long_and_overflow",
641 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 /* Same again, with num = PY_LLONG_MAX + 1 */
644 num = PyLong_FromLongLong(PY_LLONG_MAX);
645 if (num == NULL)
646 return NULL;
647 one = PyLong_FromLong(1L);
648 if (one == NULL) {
649 Py_DECREF(num);
650 return NULL;
651 }
652 temp = PyNumber_Add(num, one);
653 Py_DECREF(one);
654 Py_DECREF(num);
655 num = temp;
656 if (num == NULL)
657 return NULL;
658 overflow = 0;
659 value = PyLong_AsLongLongAndOverflow(num, &overflow);
660 Py_DECREF(num);
661 if (value == -1 && PyErr_Occurred())
662 return NULL;
663 if (value != -1)
664 return raiseTestError("test_long_long_and_overflow",
665 "return value was not set to -1");
666 if (overflow != 1)
667 return raiseTestError("test_long_long_and_overflow",
668 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 /* Test that overflow is set properly for a large negative value. */
671 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
672 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
673 if (num == NULL)
674 return NULL;
675 overflow = 1234;
676 value = PyLong_AsLongLongAndOverflow(num, &overflow);
677 Py_DECREF(num);
678 if (value == -1 && PyErr_Occurred())
679 return NULL;
680 if (value != -1)
681 return raiseTestError("test_long_long_and_overflow",
682 "return value was not set to -1");
683 if (overflow != -1)
684 return raiseTestError("test_long_long_and_overflow",
685 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 /* Same again, with num = PY_LLONG_MIN - 1 */
688 num = PyLong_FromLongLong(PY_LLONG_MIN);
689 if (num == NULL)
690 return NULL;
691 one = PyLong_FromLong(1L);
692 if (one == NULL) {
693 Py_DECREF(num);
694 return NULL;
695 }
696 temp = PyNumber_Subtract(num, one);
697 Py_DECREF(one);
698 Py_DECREF(num);
699 num = temp;
700 if (num == NULL)
701 return NULL;
702 overflow = 0;
703 value = PyLong_AsLongLongAndOverflow(num, &overflow);
704 Py_DECREF(num);
705 if (value == -1 && PyErr_Occurred())
706 return NULL;
707 if (value != -1)
708 return raiseTestError("test_long_long_and_overflow",
709 "return value was not set to -1");
710 if (overflow != -1)
711 return raiseTestError("test_long_long_and_overflow",
712 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 /* Test that overflow is cleared properly for small values. */
715 num = PyLong_FromString("FF", NULL, 16);
716 if (num == NULL)
717 return NULL;
718 overflow = 1234;
719 value = PyLong_AsLongLongAndOverflow(num, &overflow);
720 Py_DECREF(num);
721 if (value == -1 && PyErr_Occurred())
722 return NULL;
723 if (value != 0xFF)
724 return raiseTestError("test_long_long_and_overflow",
725 "expected return value 0xFF");
726 if (overflow != 0)
727 return raiseTestError("test_long_long_and_overflow",
728 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 num = PyLong_FromString("-FF", NULL, 16);
731 if (num == NULL)
732 return NULL;
733 overflow = 0;
734 value = PyLong_AsLongLongAndOverflow(num, &overflow);
735 Py_DECREF(num);
736 if (value == -1 && PyErr_Occurred())
737 return NULL;
738 if (value != -0xFF)
739 return raiseTestError("test_long_long_and_overflow",
740 "expected return value 0xFF");
741 if (overflow != 0)
742 return raiseTestError("test_long_long_and_overflow",
743 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 num = PyLong_FromLongLong(PY_LLONG_MAX);
746 if (num == NULL)
747 return NULL;
748 overflow = 1234;
749 value = PyLong_AsLongLongAndOverflow(num, &overflow);
750 Py_DECREF(num);
751 if (value == -1 && PyErr_Occurred())
752 return NULL;
753 if (value != PY_LLONG_MAX)
754 return raiseTestError("test_long_long_and_overflow",
755 "expected return value PY_LLONG_MAX");
756 if (overflow != 0)
757 return raiseTestError("test_long_long_and_overflow",
758 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 num = PyLong_FromLongLong(PY_LLONG_MIN);
761 if (num == NULL)
762 return NULL;
763 overflow = 0;
764 value = PyLong_AsLongLongAndOverflow(num, &overflow);
765 Py_DECREF(num);
766 if (value == -1 && PyErr_Occurred())
767 return NULL;
768 if (value != PY_LLONG_MIN)
769 return raiseTestError("test_long_long_and_overflow",
770 "expected return value PY_LLONG_MIN");
771 if (overflow != 0)
772 return raiseTestError("test_long_long_and_overflow",
773 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 Py_INCREF(Py_None);
776 return Py_None;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000777}
778
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000779/* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
Tim Petersd38b1c72001-09-30 05:09:37 +0000780 for both long and int arguments. The test may leak a little memory if
781 it fails.
782*/
783static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000784test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 PyObject *tuple, *num;
787 PY_LONG_LONG value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 tuple = PyTuple_New(1);
790 if (tuple == NULL)
791 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 num = PyLong_FromLong(42);
794 if (num == NULL)
795 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 value = -1;
800 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
801 return NULL;
802 if (value != 42)
803 return raiseTestError("test_L_code",
804 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 Py_DECREF(num);
807 num = PyLong_FromLong(42);
808 if (num == NULL)
809 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 value = -1;
814 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
815 return NULL;
816 if (value != 42)
817 return raiseTestError("test_L_code",
818 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 Py_DECREF(tuple);
821 Py_INCREF(Py_None);
822 return Py_None;
Tim Petersd38b1c72001-09-30 05:09:37 +0000823}
824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825#endif /* ifdef HAVE_LONG_LONG */
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000826
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000827/* Test tuple argument processing */
828static PyObject *
829getargs_tuple(PyObject *self, PyObject *args)
830{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 int a, b, c;
832 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
833 return NULL;
834 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000835}
836
Christian Heimes380f7f22008-02-28 11:19:05 +0000837/* test PyArg_ParseTupleAndKeywords */
838static PyObject *getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
839{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
841 static char *fmt="(ii)i|(i(ii))(iii)i";
842 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +0000843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
845 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
846 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
847 return NULL;
848 return Py_BuildValue("iiiiiiiiii",
849 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
850 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +0000851}
852
Thomas Heller3457e4b2003-04-24 16:14:27 +0000853/* Functions to call PyArg_ParseTuple with integer format codes,
854 and return the result.
855*/
Thomas Hellera4ea6032003-04-17 18:55:45 +0000856static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000857getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 unsigned char value;
860 if (!PyArg_ParseTuple(args, "b", &value))
861 return NULL;
862 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000863}
864
Thomas Heller3457e4b2003-04-24 16:14:27 +0000865static PyObject *
866getargs_B(PyObject *self, PyObject *args)
867{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 unsigned char value;
869 if (!PyArg_ParseTuple(args, "B", &value))
870 return NULL;
871 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000872}
873
874static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +0000875getargs_h(PyObject *self, PyObject *args)
876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 short value;
878 if (!PyArg_ParseTuple(args, "h", &value))
879 return NULL;
880 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +0000881}
882
883static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000884getargs_H(PyObject *self, PyObject *args)
885{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 unsigned short value;
887 if (!PyArg_ParseTuple(args, "H", &value))
888 return NULL;
889 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000890}
891
892static PyObject *
893getargs_I(PyObject *self, PyObject *args)
894{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 unsigned int value;
896 if (!PyArg_ParseTuple(args, "I", &value))
897 return NULL;
898 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000899}
900
901static PyObject *
902getargs_k(PyObject *self, PyObject *args)
903{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 unsigned long value;
905 if (!PyArg_ParseTuple(args, "k", &value))
906 return NULL;
907 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000908}
909
910static PyObject *
911getargs_i(PyObject *self, PyObject *args)
912{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 int value;
914 if (!PyArg_ParseTuple(args, "i", &value))
915 return NULL;
916 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000917}
918
Thomas Hellera4ea6032003-04-17 18:55:45 +0000919static PyObject *
920getargs_l(PyObject *self, PyObject *args)
921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 long value;
923 if (!PyArg_ParseTuple(args, "l", &value))
924 return NULL;
925 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000926}
927
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000928static PyObject *
929getargs_n(PyObject *self, PyObject *args)
930{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 Py_ssize_t value;
932 if (!PyArg_ParseTuple(args, "n", &value))
933 return NULL;
934 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000935}
936
Thomas Hellera4ea6032003-04-17 18:55:45 +0000937#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +0000938static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000939getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 PY_LONG_LONG value;
942 if (!PyArg_ParseTuple(args, "L", &value))
943 return NULL;
944 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000945}
946
Thomas Hellera4ea6032003-04-17 18:55:45 +0000947static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000948getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 unsigned PY_LONG_LONG value;
951 if (!PyArg_ParseTuple(args, "K", &value))
952 return NULL;
953 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000954}
955#endif
956
957/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +0000958 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +0000959static PyObject *
960test_k_code(PyObject *self)
961{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 PyObject *tuple, *num;
963 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 tuple = PyTuple_New(1);
966 if (tuple == NULL)
967 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 /* a number larger than ULONG_MAX even on 64-bit platforms */
970 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
971 if (num == NULL)
972 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 value = PyLong_AsUnsignedLongMask(num);
975 if (value != ULONG_MAX)
976 return raiseTestError("test_k_code",
977 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 value = 0;
982 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
983 return NULL;
984 if (value != ULONG_MAX)
985 return raiseTestError("test_k_code",
986 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 Py_DECREF(num);
989 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
990 if (num == NULL)
991 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 value = PyLong_AsUnsignedLongMask(num);
994 if (value != (unsigned long)-0x42)
995 return raiseTestError("test_k_code",
996 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 value = 0;
1001 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1002 return NULL;
1003 if (value != (unsigned long)-0x42)
1004 return raiseTestError("test_k_code",
1005 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 Py_DECREF(tuple);
1008 Py_INCREF(Py_None);
1009 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001010}
1011
Victor Stinner06e49dd2010-06-13 18:21:50 +00001012static PyObject *
1013getargs_s(PyObject *self, PyObject *args)
1014{
1015 char *str;
1016 if (!PyArg_ParseTuple(args, "s", &str))
1017 return NULL;
1018 return PyBytes_FromString(str);
1019}
1020
1021static PyObject *
1022getargs_s_star(PyObject *self, PyObject *args)
1023{
1024 Py_buffer buffer;
1025 PyObject *bytes;
1026 if (!PyArg_ParseTuple(args, "s*", &buffer))
1027 return NULL;
1028 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1029 PyBuffer_Release(&buffer);
1030 return bytes;
1031}
1032
1033static PyObject *
1034getargs_s_hash(PyObject *self, PyObject *args)
1035{
1036 char *str;
1037 Py_ssize_t size;
1038 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1039 return NULL;
1040 return PyBytes_FromStringAndSize(str, size);
1041}
1042
1043static PyObject *
1044getargs_z(PyObject *self, PyObject *args)
1045{
1046 char *str;
1047 if (!PyArg_ParseTuple(args, "z", &str))
1048 return NULL;
1049 if (str != NULL)
1050 return PyBytes_FromString(str);
1051 else
1052 Py_RETURN_NONE;
1053}
1054
1055static PyObject *
1056getargs_z_star(PyObject *self, PyObject *args)
1057{
1058 Py_buffer buffer;
1059 PyObject *bytes;
1060 if (!PyArg_ParseTuple(args, "z*", &buffer))
1061 return NULL;
1062 if (buffer.buf != NULL)
1063 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1064 else {
1065 Py_INCREF(Py_None);
1066 bytes = Py_None;
1067 }
1068 PyBuffer_Release(&buffer);
1069 return bytes;
1070}
1071
1072static PyObject *
1073getargs_z_hash(PyObject *self, PyObject *args)
1074{
1075 char *str;
1076 Py_ssize_t size;
1077 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1078 return NULL;
1079 if (str != NULL)
1080 return PyBytes_FromStringAndSize(str, size);
1081 else
1082 Py_RETURN_NONE;
1083}
1084
1085static PyObject *
1086getargs_y(PyObject *self, PyObject *args)
1087{
1088 char *str;
1089 if (!PyArg_ParseTuple(args, "y", &str))
1090 return NULL;
1091 return PyBytes_FromString(str);
1092}
1093
1094static PyObject *
1095getargs_y_star(PyObject *self, PyObject *args)
1096{
1097 Py_buffer buffer;
1098 PyObject *bytes;
1099 if (!PyArg_ParseTuple(args, "y*", &buffer))
1100 return NULL;
1101 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1102 PyBuffer_Release(&buffer);
1103 return bytes;
1104}
1105
1106static PyObject *
1107getargs_y_hash(PyObject *self, PyObject *args)
1108{
1109 char *str;
1110 Py_ssize_t size;
1111 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1112 return NULL;
1113 return PyBytes_FromStringAndSize(str, size);
1114}
1115
1116static PyObject *
1117getargs_u(PyObject *self, PyObject *args)
1118{
1119 Py_UNICODE *str;
1120 Py_ssize_t size;
1121 if (!PyArg_ParseTuple(args, "u", &str))
1122 return NULL;
1123 size = Py_UNICODE_strlen(str);
1124 return PyUnicode_FromUnicode(str, size);
1125}
1126
1127static PyObject *
1128getargs_u_hash(PyObject *self, PyObject *args)
1129{
1130 Py_UNICODE *str;
1131 Py_ssize_t size;
1132 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1133 return NULL;
1134 return PyUnicode_FromUnicode(str, size);
1135}
1136
1137static PyObject *
1138getargs_Z(PyObject *self, PyObject *args)
1139{
1140 Py_UNICODE *str;
1141 Py_ssize_t size;
1142 if (!PyArg_ParseTuple(args, "Z", &str))
1143 return NULL;
1144 if (str != NULL) {
1145 size = Py_UNICODE_strlen(str);
1146 return PyUnicode_FromUnicode(str, size);
1147 } else
1148 Py_RETURN_NONE;
1149}
1150
1151static PyObject *
1152getargs_Z_hash(PyObject *self, PyObject *args)
1153{
1154 Py_UNICODE *str;
1155 Py_ssize_t size;
1156 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1157 return NULL;
1158 if (str != NULL)
1159 return PyUnicode_FromUnicode(str, size);
1160 else
1161 Py_RETURN_NONE;
1162}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001163
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001164/* Test the s and z codes for PyArg_ParseTuple.
1165*/
1166static PyObject *
1167test_s_code(PyObject *self)
1168{
1169 /* Unicode strings should be accepted */
1170 PyObject *tuple, *obj;
1171 char *value;
1172
1173 tuple = PyTuple_New(1);
1174 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001176
1177 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001179 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001181
1182 PyTuple_SET_ITEM(tuple, 0, obj);
1183
1184 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001186 */
1187 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001189
1190 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001192
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001193 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001194 Py_RETURN_NONE;
1195}
1196
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001197static PyObject *
1198test_bug_7414(PyObject *self)
1199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 /* Issue #7414: for PyArg_ParseTupleAndKeywords, 'C' code wasn't being
1201 skipped properly in skipitem() */
1202 int a = 0, b = 0, result;
1203 char *kwlist[] = {"a", "b", NULL};
1204 PyObject *tuple = NULL, *dict = NULL, *b_str;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 tuple = PyTuple_New(0);
1207 if (tuple == NULL)
1208 goto failure;
1209 dict = PyDict_New();
1210 if (dict == NULL)
1211 goto failure;
1212 b_str = PyUnicode_FromString("b");
1213 if (b_str == NULL)
1214 goto failure;
1215 result = PyDict_SetItemString(dict, "b", b_str);
1216 Py_DECREF(b_str);
1217 if (result < 0)
1218 goto failure;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|CC",
1221 kwlist, &a, &b);
1222 if (!result)
1223 goto failure;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 if (a != 0)
1226 return raiseTestError("test_bug_7414",
1227 "C format code not skipped properly");
1228 if (b != 'b')
1229 return raiseTestError("test_bug_7414",
1230 "C format code returned wrong value");
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 Py_DECREF(dict);
1233 Py_DECREF(tuple);
1234 Py_RETURN_NONE;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001235
1236 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 Py_XDECREF(dict);
1238 Py_XDECREF(tuple);
1239 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001240}
1241
1242
Benjamin Peterson92035012008-12-27 16:00:54 +00001243static volatile int x;
1244
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001245/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1246 of an error.
1247*/
1248static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001249test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 PyObject *tuple, *obj;
1252 Py_UNICODE *value;
1253 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1256 /* Just use the macro and check that it compiles */
1257 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 tuple = PyTuple_New(1);
1260 if (tuple == NULL)
1261 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 obj = PyUnicode_Decode("test", strlen("test"),
1264 "ascii", NULL);
1265 if (obj == NULL)
1266 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 value = 0;
1271 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1272 return NULL;
1273 if (value != PyUnicode_AS_UNICODE(obj))
1274 return raiseTestError("test_u_code",
1275 "u code returned wrong value for u'test'");
1276 value = 0;
1277 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1278 return NULL;
1279 if (value != PyUnicode_AS_UNICODE(obj) ||
1280 len != PyUnicode_GET_SIZE(obj))
1281 return raiseTestError("test_u_code",
1282 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 Py_DECREF(tuple);
1285 Py_INCREF(Py_None);
1286 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001287}
1288
Guido van Rossumfb67be22007-08-29 18:38:11 +00001289/* Test Z and Z# codes for PyArg_ParseTuple */
1290static PyObject *
1291test_Z_code(PyObject *self)
1292{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 PyObject *tuple, *obj;
1294 Py_UNICODE *value1, *value2;
1295 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 tuple = PyTuple_New(2);
1298 if (tuple == NULL)
1299 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 obj = PyUnicode_FromString("test");
1302 PyTuple_SET_ITEM(tuple, 0, obj);
1303 Py_INCREF(Py_None);
1304 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 /* swap values on purpose */
1307 value1 = NULL;
1308 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 /* Test Z for both values */
1311 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1312 return NULL;
1313 if (value1 != PyUnicode_AS_UNICODE(obj))
1314 return raiseTestError("test_Z_code",
1315 "Z code returned wrong value for 'test'");
1316 if (value2 != NULL)
1317 return raiseTestError("test_Z_code",
1318 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 value1 = NULL;
1321 value2 = PyUnicode_AS_UNICODE(obj);
1322 len1 = -1;
1323 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 /* Test Z# for both values */
1326 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1327 &value2, &len2) < 0)
1328 return NULL;
1329 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1330 len1 != PyUnicode_GET_SIZE(obj))
1331 return raiseTestError("test_Z_code",
1332 "Z# code returned wrong values for 'test'");
1333 if (value2 != NULL ||
1334 len2 != 0)
1335 return raiseTestError("test_Z_code",
1336 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 Py_DECREF(tuple);
1339 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001340}
1341
Thomas Wouters477c8d52006-05-27 19:21:47 +00001342static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001343test_widechar(PyObject *self)
1344{
1345#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1347 size_t wtextlen = 1;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001348#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1350 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1355 if (wide == NULL)
1356 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1359 if (utf8 == NULL) {
1360 Py_DECREF(wide);
1361 return NULL;
1362 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 if (PyUnicode_GET_SIZE(wide) != PyUnicode_GET_SIZE(utf8)) {
1365 Py_DECREF(wide);
1366 Py_DECREF(utf8);
1367 return raiseTestError("test_widechar",
1368 "wide string and utf8 string "
1369 "have different length");
1370 }
1371 if (PyUnicode_Compare(wide, utf8)) {
1372 Py_DECREF(wide);
1373 Py_DECREF(utf8);
1374 if (PyErr_Occurred())
1375 return NULL;
1376 return raiseTestError("test_widechar",
1377 "wide string and utf8 string "
1378 "are different");
1379 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 Py_DECREF(wide);
1382 Py_DECREF(utf8);
1383 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001384}
1385
1386static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001387unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001388{
1389 PyObject *unicode, *result;
1390 Py_ssize_t buflen, size;
1391 wchar_t *buffer;
1392
1393 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1394 return NULL;
1395 buffer = PyMem_Malloc(buflen * sizeof(wchar_t));
1396 if (buffer == NULL)
1397 return PyErr_NoMemory();
1398
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001399 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001400 if (size == -1) {
1401 PyMem_Free(buffer);
1402 return NULL;
1403 }
1404
1405 if (size < buflen)
1406 buflen = size + 1;
1407 else
1408 buflen = size;
1409 result = PyUnicode_FromWideChar(buffer, buflen);
1410 PyMem_Free(buffer);
1411 if (result == NULL)
1412 return NULL;
1413
1414 return Py_BuildValue("(Nn)", result, size);
1415}
1416
1417static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001418unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001419{
1420 PyObject *unicode, *result;
1421 Py_ssize_t size;
1422 wchar_t *buffer;
1423
1424 if (!PyArg_ParseTuple(args, "U", &unicode))
1425 return NULL;
1426
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001427 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001428 if (buffer == NULL)
1429 return NULL;
1430
1431 result = PyUnicode_FromWideChar(buffer, size + 1);
1432 PyMem_Free(buffer);
1433 if (result == NULL)
1434 return NULL;
1435 return Py_BuildValue("(Nn)", result, size);
1436}
1437
1438static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001439getargs_w_star(PyObject *self, PyObject *args)
1440{
1441 Py_buffer buffer;
1442 PyObject *result;
1443 char *str;
1444
1445 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1446 return NULL;
1447
1448 if (2 <= buffer.len) {
1449 str = buffer.buf;
1450 str[0] = '[';
1451 str[buffer.len-1] = ']';
1452 }
1453
1454 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1455 PyBuffer_Release(&buffer);
1456 return result;
1457}
1458
1459
1460static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001461test_empty_argparse(PyObject *self)
1462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 /* Test that formats can begin with '|'. See issue #4720. */
1464 PyObject *tuple, *dict = NULL;
1465 static char *kwlist[] = {NULL};
1466 int result;
1467 tuple = PyTuple_New(0);
1468 if (!tuple)
1469 return NULL;
1470 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1471 goto done;
1472 dict = PyDict_New();
1473 if (!dict)
1474 goto done;
1475 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00001476 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 Py_DECREF(tuple);
1478 Py_XDECREF(dict);
1479 if (result < 0)
1480 return NULL;
1481 else {
1482 Py_RETURN_NONE;
1483 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001484}
1485
1486static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001487codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 const char *encoding, *errors = NULL;
1490 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1491 &encoding, &errors))
1492 return NULL;
1493 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001494}
1495
Thomas Wouters477c8d52006-05-27 19:21:47 +00001496static PyObject *
1497codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 const char *encoding, *errors = NULL;
1500 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1501 &encoding, &errors))
1502 return NULL;
1503 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001504}
1505
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001506
Tim Peters5b8132f2003-01-31 15:52:05 +00001507/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001508static PyObject *
1509test_long_numbits(PyObject *self)
1510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 struct triple {
1512 long input;
1513 size_t nbits;
1514 int sign;
1515 } testcases[] = {{0, 0, 0},
1516 {1L, 1, 1},
1517 {-1L, 1, -1},
1518 {2L, 2, 1},
1519 {-2L, 2, -1},
1520 {3L, 2, 1},
1521 {-3L, 2, -1},
1522 {4L, 3, 1},
1523 {-4L, 3, -1},
1524 {0x7fffL, 15, 1}, /* one Python long digit */
1525 {-0x7fffL, 15, -1},
1526 {0xffffL, 16, 1},
1527 {-0xffffL, 16, -1},
1528 {0xfffffffL, 28, 1},
1529 {-0xfffffffL, 28, -1}};
1530 int i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 for (i = 0; i < sizeof(testcases) / sizeof(struct triple); ++i) {
1533 PyObject *plong = PyLong_FromLong(testcases[i].input);
1534 size_t nbits = _PyLong_NumBits(plong);
1535 int sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 Py_DECREF(plong);
1538 if (nbits != testcases[i].nbits)
1539 return raiseTestError("test_long_numbits",
1540 "wrong result for _PyLong_NumBits");
1541 if (sign != testcases[i].sign)
1542 return raiseTestError("test_long_numbits",
1543 "wrong result for _PyLong_Sign");
1544 }
1545 Py_INCREF(Py_None);
1546 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001547}
1548
Thomas Heller519a0422007-11-15 20:48:54 +00001549/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00001550
1551static PyObject *
1552test_null_strings(PyObject *self)
1553{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
1555 PyObject *tuple = PyTuple_Pack(2, o1, o2);
1556 Py_XDECREF(o1);
1557 Py_XDECREF(o2);
1558 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00001559}
1560
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001561static PyObject *
1562raise_exception(PyObject *self, PyObject *args)
1563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 PyObject *exc;
1565 PyObject *exc_args, *v;
1566 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
1569 &exc, &num_args))
1570 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 exc_args = PyTuple_New(num_args);
1573 if (exc_args == NULL)
1574 return NULL;
1575 for (i = 0; i < num_args; ++i) {
1576 v = PyLong_FromLong(i);
1577 if (v == NULL) {
1578 Py_DECREF(exc_args);
1579 return NULL;
1580 }
1581 PyTuple_SET_ITEM(exc_args, i, v);
1582 }
1583 PyErr_SetObject(exc, exc_args);
1584 Py_DECREF(exc_args);
1585 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001586}
Tim Peters91621db2001-06-12 20:10:01 +00001587
Benjamin Peterson16323982010-02-03 01:13:41 +00001588
1589static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001590
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001591static PyObject *
1592test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 if (PyDateTimeAPI) {
1594 if (test_run_counter) {
1595 /* Probably regrtest.py -R */
1596 Py_RETURN_NONE;
1597 }
1598 else {
1599 PyErr_SetString(PyExc_AssertionError,
1600 "PyDateTime_CAPI somehow initialized");
1601 return NULL;
1602 }
1603 }
1604 test_run_counter++;
1605 PyDateTime_IMPORT;
1606 if (PyDateTimeAPI)
1607 Py_RETURN_NONE;
1608 else
1609 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001610}
1611
Benjamin Peterson16323982010-02-03 01:13:41 +00001612
1613#ifdef WITH_THREAD
1614
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001615/* test_thread_state spawns a thread of its own, and that thread releases
1616 * `thread_done` when it's finished. The driver code has to know when the
1617 * thread finishes, because the thread uses a PyObject (the callable) that
1618 * may go away when the driver finishes. The former lack of this explicit
1619 * synchronization caused rare segfaults, so rare that they were seen only
1620 * on a Mac buildbot (although they were possible on any box).
1621 */
1622static PyThread_type_lock thread_done = NULL;
1623
Benjamin Petersona786b022008-08-25 21:05:21 +00001624static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001625_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001626{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 PyObject *rc;
1628 int success;
1629 PyGILState_STATE s = PyGILState_Ensure();
1630 rc = PyObject_CallFunction((PyObject *)callable, "");
1631 success = (rc != NULL);
1632 Py_XDECREF(rc);
1633 PyGILState_Release(s);
1634 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001635}
1636
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001637/* Same thing, but releases `thread_done` when it returns. This variant
1638 * should be called only from threads spawned by test_thread_state().
1639 */
1640static void
1641_make_call_from_thread(void *callable)
1642{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 _make_call(callable);
1644 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001645}
1646
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001647static PyObject *
1648test_thread_state(PyObject *self, PyObject *args)
1649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 PyObject *fn;
1651 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1654 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 if (!PyCallable_Check(fn)) {
1657 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1658 fn->ob_type->tp_name);
1659 return NULL;
1660 }
Benjamin Petersona786b022008-08-25 21:05:21 +00001661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 /* Ensure Python is set up for threading */
1663 PyEval_InitThreads();
1664 thread_done = PyThread_allocate_lock();
1665 if (thread_done == NULL)
1666 return PyErr_NoMemory();
1667 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 /* Start a new thread with our callback. */
1670 PyThread_start_new_thread(_make_call_from_thread, fn);
1671 /* Make the callback with the thread lock held by this thread */
1672 success &= _make_call(fn);
1673 /* Do it all again, but this time with the thread-lock released */
1674 Py_BEGIN_ALLOW_THREADS
1675 success &= _make_call(fn);
1676 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1677 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 /* And once more with and without a thread
1680 XXX - should use a lock and work out exactly what we are trying
1681 to test <wink>
1682 */
1683 Py_BEGIN_ALLOW_THREADS
1684 PyThread_start_new_thread(_make_call_from_thread, fn);
1685 success &= _make_call(fn);
1686 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1687 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 /* Release lock we acquired above. This is required on HP-UX. */
1690 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 PyThread_free_lock(thread_done);
1693 if (!success)
1694 return NULL;
1695 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001696}
Benjamin Petersona54c9092009-01-13 02:11:23 +00001697
1698/* test Py_AddPendingCalls using threads */
1699static int _pending_callback(void *arg)
1700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 /* we assume the argument is callable object to which we own a reference */
1702 PyObject *callable = (PyObject *)arg;
1703 PyObject *r = PyObject_CallObject(callable, NULL);
1704 Py_DECREF(callable);
1705 Py_XDECREF(r);
1706 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001707}
1708
1709/* The following requests n callbacks to _pending_callback. It can be
1710 * run from any python thread.
1711 */
1712PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
1713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 PyObject *callable;
1715 int r;
1716 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
1717 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 /* create the reference for the callbackwhile we hold the lock */
1720 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00001721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 Py_BEGIN_ALLOW_THREADS
1723 r = Py_AddPendingCall(&_pending_callback, callable);
1724 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00001725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 if (r<0) {
1727 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
1728 Py_INCREF(Py_False);
1729 return Py_False;
1730 }
1731 Py_INCREF(Py_True);
1732 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001733}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001734#endif
1735
Neal Norwitzb0d26332007-08-25 00:49:05 +00001736/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001737static PyObject *
1738test_string_from_format(PyObject *self, PyObject *args)
1739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 PyObject *result;
1741 char *msg;
Alexander Belopolskye239d232010-12-08 23:31:48 +00001742 static const Py_UNICODE one[] = {'1', 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00001743
Alexander Belopolskye239d232010-12-08 23:31:48 +00001744#define CHECK_1_FORMAT(FORMAT, TYPE) \
1745 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
1746 if (result == NULL) \
1747 return NULL; \
1748 if (Py_UNICODE_strcmp(PyUnicode_AS_UNICODE(result), one)) { \
1749 msg = FORMAT " failed at 1"; \
1750 goto Fail; \
1751 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 CHECK_1_FORMAT("%d", int);
1755 CHECK_1_FORMAT("%ld", long);
1756 /* The z width modifier was added in Python 2.5. */
1757 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 /* The u type code was added in Python 2.5. */
1760 CHECK_1_FORMAT("%u", unsigned int);
1761 CHECK_1_FORMAT("%lu", unsigned long);
1762 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001765#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
1767 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001768#endif
1769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001771
1772 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 Py_XDECREF(result);
1774 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001775
1776#undef CHECK_1_FORMAT
1777}
1778
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001779
1780static PyObject *
1781test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
1783 int result;
1784 if (py_s == NULL)
1785 return NULL;
1786 result = PyUnicode_CompareWithASCIIString(py_s, "str");
1787 Py_DECREF(py_s);
1788 if (!result) {
1789 PyErr_SetString(TestError, "Python string ending in NULL "
1790 "should not compare equal to c string.");
1791 return NULL;
1792 }
1793 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00001794}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001795
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001796/* This is here to provide a docstring for test_descr. */
1797static PyObject *
1798test_with_docstring(PyObject *self)
1799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001801}
1802
Mark Dickinson725bfd82009-05-03 20:33:40 +00001803/* Test PyOS_string_to_double. */
1804static PyObject *
1805test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 double result;
1807 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00001808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809#define CHECK_STRING(STR, expected) \
1810 result = PyOS_string_to_double(STR, NULL, NULL); \
1811 if (result == -1.0 && PyErr_Occurred()) \
1812 return NULL; \
1813 if (result != expected) { \
1814 msg = "conversion of " STR " to float failed"; \
1815 goto fail; \
1816 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00001817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818#define CHECK_INVALID(STR) \
1819 result = PyOS_string_to_double(STR, NULL, NULL); \
1820 if (result == -1.0 && PyErr_Occurred()) { \
1821 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
1822 PyErr_Clear(); \
1823 else \
1824 return NULL; \
1825 } \
1826 else { \
1827 msg = "conversion of " STR " didn't raise ValueError"; \
1828 goto fail; \
1829 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00001830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 CHECK_STRING("0.1", 0.1);
1832 CHECK_STRING("1.234", 1.234);
1833 CHECK_STRING("-1.35", -1.35);
1834 CHECK_STRING(".1e01", 1.0);
1835 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00001836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 CHECK_INVALID(" 0.1");
1838 CHECK_INVALID("\t\n-3");
1839 CHECK_INVALID(".123 ");
1840 CHECK_INVALID("3\n");
1841 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00001842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00001844 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00001846#undef CHECK_STRING
1847#undef CHECK_INVALID
1848}
1849
1850
Benjamin Petersonb173f782009-05-05 22:31:58 +00001851/* Coverage testing of capsule objects. */
1852
1853static const char *capsule_name = "capsule name";
1854static char *capsule_pointer = "capsule pointer";
1855static char *capsule_context = "capsule context";
1856static const char *capsule_error = NULL;
1857static int
1858capsule_destructor_call_count = 0;
1859
1860static void
1861capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 capsule_destructor_call_count++;
1863 if (PyCapsule_GetContext(o) != capsule_context) {
1864 capsule_error = "context did not match in destructor!";
1865 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
1866 capsule_error = "destructor did not match in destructor! (woah!)";
1867 } else if (PyCapsule_GetName(o) != capsule_name) {
1868 capsule_error = "name did not match in destructor!";
1869 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
1870 capsule_error = "pointer did not match in destructor!";
1871 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00001872}
1873
1874typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 char *name;
1876 char *module;
1877 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001878} known_capsule;
1879
1880static PyObject *
1881test_capsule(PyObject *self, PyObject *args)
1882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 PyObject *object;
1884 const char *error = NULL;
1885 void *pointer;
1886 void *pointer2;
1887 known_capsule known_capsules[] = {
1888 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
1889 KNOWN_CAPSULE("_socket", "CAPI"),
1890 KNOWN_CAPSULE("_curses", "_C_API"),
1891 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
1892 { NULL, NULL },
1893 };
1894 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00001895
1896#define FAIL(x) { error = (x); goto exit; }
1897
1898#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 if (capsule_error) { \
1900 FAIL(capsule_error); \
1901 } \
1902 else if (!capsule_destructor_call_count) { \
1903 FAIL("destructor not called!"); \
1904 } \
1905 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00001906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
1908 PyCapsule_SetContext(object, capsule_context);
1909 capsule_destructor(object);
1910 CHECK_DESTRUCTOR;
1911 Py_DECREF(object);
1912 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 object = PyCapsule_New(known, "ignored", NULL);
1915 PyCapsule_SetPointer(object, capsule_pointer);
1916 PyCapsule_SetName(object, capsule_name);
1917 PyCapsule_SetDestructor(object, capsule_destructor);
1918 PyCapsule_SetContext(object, capsule_context);
1919 capsule_destructor(object);
1920 CHECK_DESTRUCTOR;
1921 /* intentionally access using the wrong name */
1922 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
1923 if (!PyErr_Occurred()) {
1924 FAIL("PyCapsule_GetPointer should have failed but did not!");
1925 }
1926 PyErr_Clear();
1927 if (pointer2) {
1928 if (pointer2 == capsule_pointer) {
1929 FAIL("PyCapsule_GetPointer should not have"
1930 " returned the internal pointer!");
1931 } else {
1932 FAIL("PyCapsule_GetPointer should have "
1933 "returned NULL pointer but did not!");
1934 }
1935 }
1936 PyCapsule_SetDestructor(object, NULL);
1937 Py_DECREF(object);
1938 if (capsule_destructor_call_count) {
1939 FAIL("destructor called when it should not have been!");
1940 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00001941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 for (known = &known_capsules[0]; known->module != NULL; known++) {
1943 /* yeah, ordinarily I wouldn't do this either,
1944 but it's fine for this test harness.
1945 */
1946 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00001947#undef FAIL
1948#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 { \
1950 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
1951 x, known->module, known->attribute); \
1952 error = buffer; \
1953 goto exit; \
1954 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00001955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 PyObject *module = PyImport_ImportModule(known->module);
1957 if (module) {
1958 pointer = PyCapsule_Import(known->name, 0);
1959 if (!pointer) {
1960 Py_DECREF(module);
1961 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
1962 }
1963 object = PyObject_GetAttrString(module, known->attribute);
1964 if (!object) {
1965 Py_DECREF(module);
1966 return NULL;
1967 }
1968 pointer2 = PyCapsule_GetPointer(object,
1969 "weebles wobble but they don't fall down");
1970 if (!PyErr_Occurred()) {
1971 Py_DECREF(object);
1972 Py_DECREF(module);
1973 FAIL("PyCapsule_GetPointer should have failed but did not!");
1974 }
1975 PyErr_Clear();
1976 if (pointer2) {
1977 Py_DECREF(module);
1978 Py_DECREF(object);
1979 if (pointer2 == pointer) {
1980 FAIL("PyCapsule_GetPointer should not have"
1981 " returned its internal pointer!");
1982 } else {
1983 FAIL("PyCapsule_GetPointer should have"
1984 " returned NULL pointer but did not!");
1985 }
1986 }
1987 Py_DECREF(object);
1988 Py_DECREF(module);
1989 }
1990 else
1991 PyErr_Clear();
1992 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00001993
1994 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 if (error) {
1996 return raiseTestError("test_capsule", error);
1997 }
1998 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001999#undef FAIL
2000}
2001
Guido van Rossumddefaf32007-01-14 03:31:43 +00002002#ifdef HAVE_GETTIMEOFDAY
2003/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002004static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002005{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 e->tv_sec -= s->tv_sec;
2007 e->tv_usec -= s->tv_usec;
2008 if (e->tv_usec < 0) {
2009 e->tv_sec -=1;
2010 e->tv_usec += 1000000;
2011 }
2012 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002013}
2014
2015static PyObject *
2016profile_int(PyObject *self, PyObject* args)
2017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 int i, k;
2019 struct timeval start, stop;
2020 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 /* Test 1: Allocate and immediately deallocate
2023 many small integers */
2024 gettimeofday(&start, NULL);
2025 for(k=0; k < 20000; k++)
2026 for(i=0; i < 1000; i++) {
2027 single = PyLong_FromLong(i);
2028 Py_DECREF(single);
2029 }
2030 gettimeofday(&stop, NULL);
2031 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 /* Test 2: Allocate and immediately deallocate
2034 many large integers */
2035 gettimeofday(&start, NULL);
2036 for(k=0; k < 20000; k++)
2037 for(i=0; i < 1000; i++) {
2038 single = PyLong_FromLong(i+1000000);
2039 Py_DECREF(single);
2040 }
2041 gettimeofday(&stop, NULL);
2042 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 /* Test 3: Allocate a few integers, then release
2045 them all simultaneously. */
2046 multiple = malloc(sizeof(PyObject*) * 1000);
2047 gettimeofday(&start, NULL);
2048 for(k=0; k < 20000; k++) {
2049 for(i=0; i < 1000; i++) {
2050 multiple[i] = PyLong_FromLong(i+1000000);
2051 }
2052 for(i=0; i < 1000; i++) {
2053 Py_DECREF(multiple[i]);
2054 }
2055 }
2056 gettimeofday(&stop, NULL);
2057 print_delta(3, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 /* Test 4: Allocate many integers, then release
2060 them all simultaneously. */
2061 multiple = malloc(sizeof(PyObject*) * 1000000);
2062 gettimeofday(&start, NULL);
2063 for(k=0; k < 20; k++) {
2064 for(i=0; i < 1000000; i++) {
2065 multiple[i] = PyLong_FromLong(i+1000000);
2066 }
2067 for(i=0; i < 1000000; i++) {
2068 Py_DECREF(multiple[i]);
2069 }
2070 }
2071 gettimeofday(&stop, NULL);
2072 print_delta(4, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 /* Test 5: Allocate many integers < 32000 */
2075 multiple = malloc(sizeof(PyObject*) * 1000000);
2076 gettimeofday(&start, NULL);
2077 for(k=0; k < 10; k++) {
2078 for(i=0; i < 1000000; i++) {
2079 multiple[i] = PyLong_FromLong(i+1000);
2080 }
2081 for(i=0; i < 1000000; i++) {
2082 Py_DECREF(multiple[i]);
2083 }
2084 }
2085 gettimeofday(&stop, NULL);
2086 print_delta(5, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 /* Test 6: Perform small int addition */
2089 op1 = PyLong_FromLong(1);
2090 gettimeofday(&start, NULL);
2091 for(i=0; i < 10000000; i++) {
2092 result = PyNumber_Add(op1, op1);
2093 Py_DECREF(result);
2094 }
2095 gettimeofday(&stop, NULL);
2096 Py_DECREF(op1);
2097 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 /* Test 7: Perform medium int addition */
2100 op1 = PyLong_FromLong(1000);
2101 gettimeofday(&start, NULL);
2102 for(i=0; i < 10000000; i++) {
2103 result = PyNumber_Add(op1, op1);
2104 Py_DECREF(result);
2105 }
2106 gettimeofday(&stop, NULL);
2107 Py_DECREF(op1);
2108 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 Py_INCREF(Py_None);
2111 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002112}
2113#endif
2114
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002115/* To test the format of tracebacks as printed out. */
2116static PyObject *
2117traceback_print(PyObject *self, PyObject *args)
2118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 PyObject *file;
2120 PyObject *traceback;
2121 int result;
2122
2123 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2124 &traceback, &file))
2125 return NULL;
2126
2127 result = PyTraceBack_Print(traceback, file);
2128 if (result < 0)
2129 return NULL;
2130 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002131}
2132
Benjamin Petersone6528212008-07-15 15:32:09 +00002133/* To test the format of exceptions as printed out. */
2134static PyObject *
2135exception_print(PyObject *self, PyObject *args)
2136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 PyObject *value;
2138 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 if (!PyArg_ParseTuple(args, "O:exception_print",
2141 &value))
2142 return NULL;
2143 if (!PyExceptionInstance_Check(value)) {
2144 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2145 return NULL;
2146 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 tb = PyException_GetTraceback(value);
2149 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2150 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002152 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002153}
2154
2155
2156
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002157
2158/* reliably raise a MemoryError */
2159static PyObject *
2160raise_memoryerror(PyObject *self)
2161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 PyErr_NoMemory();
2163 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002164}
2165
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002166/* Issue 6012 */
2167static PyObject *str1, *str2;
2168static int
2169failing_converter(PyObject *obj, void *arg)
2170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 /* Clone str1, then let the conversion fail. */
2172 assert(str1);
2173 str2 = str1;
2174 Py_INCREF(str2);
2175 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002176}
2177static PyObject*
2178argparsing(PyObject *o, PyObject *args)
2179{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 PyObject *res;
2181 str1 = str2 = NULL;
2182 if (!PyArg_ParseTuple(args, "O&O&",
2183 PyUnicode_FSConverter, &str1,
2184 failing_converter, &str2)) {
2185 if (!str2)
2186 /* argument converter not called? */
2187 return NULL;
2188 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002189 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 Py_DECREF(str2);
2191 PyErr_Clear();
2192 return res;
2193 }
2194 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002195}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002196
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002197/* To test that the result of PyCode_NewEmpty has the right members. */
2198static PyObject *
2199code_newempty(PyObject *self, PyObject *args)
2200{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002201 const char *filename;
2202 const char *funcname;
2203 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002205 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2206 &filename, &funcname, &firstlineno))
2207 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002209 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002210}
2211
Georg Brandl1e28a272009-12-28 08:41:01 +00002212/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2213 Run via Lib/test/test_exceptions.py */
2214static PyObject *
2215make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 const char *name;
2218 const char *doc = NULL;
2219 PyObject *base = NULL;
2220 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002222 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2225 "s|sOO:make_exception_with_doc", kwlist,
2226 &name, &doc, &base, &dict))
2227 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002230}
2231
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002232static PyObject *
2233make_memoryview_from_NULL_pointer(PyObject *self)
2234{
2235 Py_buffer info;
2236 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2237 return NULL;
2238 return PyMemoryView_FromBuffer(&info);
2239}
2240
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002241/* Test that the fatal error from not having a current thread doesn't
2242 cause an infinite loop. Run via Lib/test/test_capi.py */
2243static PyObject *
2244crash_no_current_thread(PyObject *self)
2245{
2246 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002247 /* Using PyThreadState_Get() directly allows the test to pass in
2248 !pydebug mode. However, the test only actually tests anything
2249 in pydebug mode, since that's where the infinite loop was in
2250 the first place. */
2251 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002252 Py_END_ALLOW_THREADS
2253 return NULL;
2254}
2255
Tim Peters9ea17ac2001-02-02 05:57:15 +00002256static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 {"raise_exception", raise_exception, METH_VARARGS},
2258 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
2259 {"test_config", (PyCFunction)test_config, METH_NOARGS},
2260 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
2261 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
2262 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
2263 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
2264 {"test_broken_memoryview", (PyCFunction)test_broken_memoryview,METH_NOARGS},
2265 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
2266 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
2267 METH_NOARGS},
2268 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
2269 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
2270 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
2271 {"test_bug_7414", (PyCFunction)test_bug_7414, METH_NOARGS},
2272 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
2273 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
2274 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
2275 PyDoc_STR("This is a pretty normal docstring.")},
2276 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
2277 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
2278 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
2279 {"getargs_tuple", getargs_tuple, METH_VARARGS},
2280 {"getargs_keywords", (PyCFunction)getargs_keywords,
2281 METH_VARARGS|METH_KEYWORDS},
2282 {"getargs_b", getargs_b, METH_VARARGS},
2283 {"getargs_B", getargs_B, METH_VARARGS},
2284 {"getargs_h", getargs_h, METH_VARARGS},
2285 {"getargs_H", getargs_H, METH_VARARGS},
2286 {"getargs_I", getargs_I, METH_VARARGS},
2287 {"getargs_k", getargs_k, METH_VARARGS},
2288 {"getargs_i", getargs_i, METH_VARARGS},
2289 {"getargs_l", getargs_l, METH_VARARGS},
2290 {"getargs_n", getargs_n, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00002291#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002292 {"getargs_L", getargs_L, METH_VARARGS},
2293 {"getargs_K", getargs_K, METH_VARARGS},
2294 {"test_longlong_api", test_longlong_api, METH_NOARGS},
2295 {"test_long_long_and_overflow",
2296 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
2297 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00002298#endif
2299 {"getargs_s", getargs_s, METH_VARARGS},
2300 {"getargs_s_star", getargs_s_star, METH_VARARGS},
2301 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
2302 {"getargs_z", getargs_z, METH_VARARGS},
2303 {"getargs_z_star", getargs_z_star, METH_VARARGS},
2304 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
2305 {"getargs_y", getargs_y, METH_VARARGS},
2306 {"getargs_y_star", getargs_y_star, METH_VARARGS},
2307 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
2308 {"getargs_u", getargs_u, METH_VARARGS},
2309 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
2310 {"getargs_Z", getargs_Z, METH_VARARGS},
2311 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00002312 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002313 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00002314 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00002316 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
2318 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
2319 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
2320 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner46c7b3b2010-10-02 11:49:31 +00002321 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
2322 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002323#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00002324 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002326#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00002327#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00002328 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00002329#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00002330 {"traceback_print", traceback_print, METH_VARARGS},
2331 {"exception_print", exception_print, METH_VARARGS},
2332 {"argparsing", argparsing, METH_VARARGS},
2333 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
2335 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002336 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
2337 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002338 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00002340};
2341
Thomas Hellera4ea6032003-04-17 18:55:45 +00002342#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
2343
Thomas Wouters89f507f2006-12-13 04:49:30 +00002344typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 char bool_member;
2346 char byte_member;
2347 unsigned char ubyte_member;
2348 short short_member;
2349 unsigned short ushort_member;
2350 int int_member;
2351 unsigned int uint_member;
2352 long long_member;
2353 unsigned long ulong_member;
2354 Py_ssize_t pyssizet_member;
2355 float float_member;
2356 double double_member;
2357 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002358#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002359 PY_LONG_LONG longlong_member;
2360 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002361#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00002362} all_structmembers;
2363
2364typedef struct {
2365 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002367} test_structmembers;
2368
2369static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
2371 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
2372 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
2373 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
2374 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
2375 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
2376 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
2377 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
2378 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
2379 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
2380 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
2381 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
2382 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002383#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
2385 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00002388};
2389
2390
Christian Heimes1af737c2008-01-23 08:24:23 +00002391static PyObject *
2392test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
2393{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002394 static char *keywords[] = {
2395 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
2396 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
2397 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00002398#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00002400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 NULL};
2402 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00002403#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00002405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 ;
2407 test_structmembers *ob;
2408 const char *s = NULL;
2409 Py_ssize_t string_len = 0;
2410 ob = PyObject_New(test_structmembers, type);
2411 if (ob == NULL)
2412 return NULL;
2413 memset(&ob->structmembers, 0, sizeof(all_structmembers));
2414 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
2415 &ob->structmembers.bool_member,
2416 &ob->structmembers.byte_member,
2417 &ob->structmembers.ubyte_member,
2418 &ob->structmembers.short_member,
2419 &ob->structmembers.ushort_member,
2420 &ob->structmembers.int_member,
2421 &ob->structmembers.uint_member,
2422 &ob->structmembers.long_member,
2423 &ob->structmembers.ulong_member,
2424 &ob->structmembers.pyssizet_member,
2425 &ob->structmembers.float_member,
2426 &ob->structmembers.double_member,
2427 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00002428#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 , &ob->structmembers.longlong_member,
2430 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00002431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 )) {
2433 Py_DECREF(ob);
2434 return NULL;
2435 }
2436 if (s != NULL) {
2437 if (string_len > 5) {
2438 Py_DECREF(ob);
2439 PyErr_SetString(PyExc_ValueError, "string too long");
2440 return NULL;
2441 }
2442 strcpy(ob->structmembers.inplace_member, s);
2443 }
2444 else {
2445 strcpy(ob->structmembers.inplace_member, "");
2446 }
2447 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002448}
2449
Christian Heimes1af737c2008-01-23 08:24:23 +00002450static void
2451test_structmembers_free(PyObject *ob)
2452{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002454}
2455
2456static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002457 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 "test_structmembersType",
2459 sizeof(test_structmembers), /* tp_basicsize */
2460 0, /* tp_itemsize */
2461 test_structmembers_free, /* destructor tp_dealloc */
2462 0, /* tp_print */
2463 0, /* tp_getattr */
2464 0, /* tp_setattr */
2465 0, /* tp_reserved */
2466 0, /* tp_repr */
2467 0, /* tp_as_number */
2468 0, /* tp_as_sequence */
2469 0, /* tp_as_mapping */
2470 0, /* tp_hash */
2471 0, /* tp_call */
2472 0, /* tp_str */
2473 PyObject_GenericGetAttr, /* tp_getattro */
2474 PyObject_GenericSetAttr, /* tp_setattro */
2475 0, /* tp_as_buffer */
2476 0, /* tp_flags */
2477 "Type containing all structmember types",
2478 0, /* traverseproc tp_traverse */
2479 0, /* tp_clear */
2480 0, /* tp_richcompare */
2481 0, /* tp_weaklistoffset */
2482 0, /* tp_iter */
2483 0, /* tp_iternext */
2484 0, /* tp_methods */
2485 test_members, /* tp_members */
2486 0,
2487 0,
2488 0,
2489 0,
2490 0,
2491 0,
2492 0,
2493 0,
2494 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002495};
2496
2497
Martin v. Löwis1a214512008-06-11 05:26:20 +00002498
2499static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002500 PyModuleDef_HEAD_INIT,
2501 "_testcapi",
2502 NULL,
2503 -1,
2504 TestMethods,
2505 NULL,
2506 NULL,
2507 NULL,
2508 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002509};
2510
Mark Hammond62b1ab12002-07-23 06:31:15 +00002511PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002512PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00002513{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 m = PyModule_Create(&_testcapimodule);
2517 if (m == NULL)
2518 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
2521 Py_TYPE(&_MemoryViewTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00002522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 Py_TYPE(&test_structmembersType)=&PyType_Type;
2524 Py_INCREF(&test_structmembersType);
2525 /* don't use a name starting with "test", since we don't want
2526 test_capi to automatically call this */
2527 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
2530 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
2531 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
2532 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
2533 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
2534 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
2535 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
2536 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
2537 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
2538 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
2539 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
2540 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
2541 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
2542 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
2543 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
2544 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
2545 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
2546 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
2547 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
2548 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
2549 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
2550 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
2551 Py_INCREF(&PyInstanceMethod_Type);
2552 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00002553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
2555 Py_INCREF(TestError);
2556 PyModule_AddObject(m, "error", TestError);
2557 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002558}