blob: a9bb5bec6d2dadcfc47cf7286b6aac123aa14131 [file] [log] [blame]
Tim Peters9ea17ac2001-02-02 05:57:15 +00001/*
2 * C Extension module to test Python interpreter C APIs.
3 *
4 * The 'test_*' functions exported by this module are run as part of the
5 * standard Python regression test, via Lib/test/test_capi.py.
6 */
7
Neal Norwitz8866e0a2007-10-27 04:01:17 +00008#define PY_SSIZE_T_CLEAN
9
Tim Peters9ea17ac2001-02-02 05:57:15 +000010#include "Python.h"
Thomas Wouters89f507f2006-12-13 04:49:30 +000011#include <float.h>
12#include "structmember.h"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000013#include "datetime.h"
Tim Peters9ea17ac2001-02-02 05:57:15 +000014
Mark Hammond8d98d2c2003-04-19 15:41:53 +000015#ifdef WITH_THREAD
16#include "pythread.h"
17#endif /* WITH_THREAD */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000018static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000019
Tim Peters91621db2001-06-12 20:10:01 +000020/* Raise TestError with test_name + ": " + msg, and return NULL. */
21
22static PyObject *
23raiseTestError(const char* test_name, const char* msg)
24{
Victor Stinner6ced7c42011-03-21 18:15:42 +010025 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000026 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000027}
28
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000029/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000030
31 The ones derived from autoconf on the UNIX-like OSes can be relied
32 upon (in the absence of sloppy cross-compiling), but the Windows
33 platforms have these hardcoded. Better safe than sorry.
34*/
35static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000036sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000038{
Victor Stinner499dfcf2011-03-21 13:26:24 +010039 PyErr_Format(TestError,
40 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000041 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000043}
44
45static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000046test_config(PyObject *self)
Tim Peters9ea17ac2001-02-02 05:57:15 +000047{
Tim Peters9ea17ac2001-02-02 05:57:15 +000048#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 if (FATNAME != sizeof(TYPE)) \
50 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 CHECK_SIZEOF(SIZEOF_SHORT, short);
53 CHECK_SIZEOF(SIZEOF_INT, int);
54 CHECK_SIZEOF(SIZEOF_LONG, long);
55 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
56 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Tim Peters9ea17ac2001-02-02 05:57:15 +000057#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
Tim Peters9ea17ac2001-02-02 05:57:15 +000059#endif
60
61#undef CHECK_SIZEOF
62
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 Py_INCREF(Py_None);
64 return Py_None;
Tim Peters9ea17ac2001-02-02 05:57:15 +000065}
66
Tim Peters5c4d5bf2001-02-12 22:13:26 +000067static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000068test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +000069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 PyObject* list;
71 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +000072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +000074#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 list = PyList_New(NLIST);
76 if (list == (PyObject*)NULL)
77 return (PyObject*)NULL;
78 /* list = range(NLIST) */
79 for (i = 0; i < NLIST; ++i) {
80 PyObject* anint = PyLong_FromLong(i);
81 if (anint == (PyObject*)NULL) {
82 Py_DECREF(list);
83 return (PyObject*)NULL;
84 }
85 PyList_SET_ITEM(list, i, anint);
86 }
87 /* list.reverse(), via PyList_Reverse() */
88 i = PyList_Reverse(list); /* should not blow up! */
89 if (i != 0) {
90 Py_DECREF(list);
91 return (PyObject*)NULL;
92 }
93 /* Check that list == range(29, -1, -1) now */
94 for (i = 0; i < NLIST; ++i) {
95 PyObject* anint = PyList_GET_ITEM(list, i);
96 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
97 PyErr_SetString(TestError,
98 "test_list_api: reverse screwed up");
99 Py_DECREF(list);
100 return (PyObject*)NULL;
101 }
102 }
103 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000104#undef NLIST
105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 Py_INCREF(Py_None);
107 return Py_None;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000108}
109
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000110static int
111test_dict_inner(int count)
112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 Py_ssize_t pos = 0, iterations = 0;
114 int i;
115 PyObject *dict = PyDict_New();
116 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 if (dict == NULL)
119 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 for (i = 0; i < count; i++) {
122 v = PyLong_FromLong(i);
123 PyDict_SetItem(dict, v, v);
124 Py_DECREF(v);
125 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 while (PyDict_Next(dict, &pos, &k, &v)) {
128 PyObject *o;
129 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 i = PyLong_AS_LONG(v) + 1;
132 o = PyLong_FromLong(i);
133 if (o == NULL)
134 return -1;
135 if (PyDict_SetItem(dict, k, o) < 0) {
136 Py_DECREF(o);
137 return -1;
138 }
139 Py_DECREF(o);
140 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 if (iterations != count) {
145 PyErr_SetString(
146 TestError,
147 "test_dict_iteration: dict iteration went wrong ");
148 return -1;
149 } else {
150 return 0;
151 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000152}
153
154static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000155test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000156{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000159 for (i = 0; i < 200; i++) {
160 if (test_dict_inner(i) < 0) {
161 return NULL;
162 }
163 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 Py_INCREF(Py_None);
166 return Py_None;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000167}
168
Tim Peters91621db2001-06-12 20:10:01 +0000169
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000170/* Issue #4701: Check that PyObject_Hash implicitly calls
171 * PyType_Ready if it hasn't already been called
172 */
173static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 PyVarObject_HEAD_INIT(NULL, 0)
175 "hashinheritancetester", /* Name of this type */
176 sizeof(PyObject), /* Basic object size */
177 0, /* Item size for varobject */
178 (destructor)PyObject_Del, /* tp_dealloc */
179 0, /* tp_print */
180 0, /* tp_getattr */
181 0, /* tp_setattr */
182 0, /* tp_reserved */
183 0, /* tp_repr */
184 0, /* tp_as_number */
185 0, /* tp_as_sequence */
186 0, /* tp_as_mapping */
187 0, /* tp_hash */
188 0, /* tp_call */
189 0, /* tp_str */
190 PyObject_GenericGetAttr, /* tp_getattro */
191 0, /* tp_setattro */
192 0, /* tp_as_buffer */
193 Py_TPFLAGS_DEFAULT, /* tp_flags */
194 0, /* tp_doc */
195 0, /* tp_traverse */
196 0, /* tp_clear */
197 0, /* tp_richcompare */
198 0, /* tp_weaklistoffset */
199 0, /* tp_iter */
200 0, /* tp_iternext */
201 0, /* tp_methods */
202 0, /* tp_members */
203 0, /* tp_getset */
204 0, /* tp_base */
205 0, /* tp_dict */
206 0, /* tp_descr_get */
207 0, /* tp_descr_set */
208 0, /* tp_dictoffset */
209 0, /* tp_init */
210 0, /* tp_alloc */
211 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000212};
213
214static PyObject*
215test_lazy_hash_inheritance(PyObject* self)
216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 PyTypeObject *type;
218 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000219 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 if (type->tp_dict != NULL)
224 /* The type has already been initialized. This probably means
225 -R is being used. */
226 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000227
228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 obj = PyObject_New(PyObject, type);
230 if (obj == NULL) {
231 PyErr_Clear();
232 PyErr_SetString(
233 TestError,
234 "test_lazy_hash_inheritance: failed to create object");
235 return NULL;
236 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 if (type->tp_dict != NULL) {
239 PyErr_SetString(
240 TestError,
241 "test_lazy_hash_inheritance: type initialised too soon");
242 Py_DECREF(obj);
243 return NULL;
244 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 hash = PyObject_Hash(obj);
247 if ((hash == -1) && PyErr_Occurred()) {
248 PyErr_Clear();
249 PyErr_SetString(
250 TestError,
251 "test_lazy_hash_inheritance: could not hash object");
252 Py_DECREF(obj);
253 return NULL;
254 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 if (type->tp_dict == NULL) {
257 PyErr_SetString(
258 TestError,
259 "test_lazy_hash_inheritance: type not initialised by hash()");
260 Py_DECREF(obj);
261 return NULL;
262 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 if (type->tp_hash != PyType_Type.tp_hash) {
265 PyErr_SetString(
266 TestError,
267 "test_lazy_hash_inheritance: unexpected hash function");
268 Py_DECREF(obj);
269 return NULL;
270 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000275}
276
277
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000278/* Issue #7385: Check that memoryview() does not crash
279 * when bf_getbuffer returns an error
280 */
281
282static int
283broken_buffer_getbuffer(PyObject *self, Py_buffer *view, int flags)
284{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 PyErr_SetString(
286 TestError,
287 "test_broken_memoryview: expected error in bf_getbuffer");
288 return -1;
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000289}
290
291static PyBufferProcs memoryviewtester_as_buffer = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 (getbufferproc)broken_buffer_getbuffer, /* bf_getbuffer */
293 0, /* bf_releasebuffer */
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000294};
295
296static PyTypeObject _MemoryViewTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 PyVarObject_HEAD_INIT(NULL, 0)
298 "memoryviewtester", /* Name of this type */
299 sizeof(PyObject), /* Basic object size */
300 0, /* Item size for varobject */
301 (destructor)PyObject_Del, /* tp_dealloc */
302 0, /* tp_print */
303 0, /* tp_getattr */
304 0, /* tp_setattr */
305 0, /* tp_compare */
306 0, /* tp_repr */
307 0, /* tp_as_number */
308 0, /* tp_as_sequence */
309 0, /* tp_as_mapping */
310 0, /* tp_hash */
311 0, /* tp_call */
312 0, /* tp_str */
313 PyObject_GenericGetAttr, /* tp_getattro */
314 0, /* tp_setattro */
315 &memoryviewtester_as_buffer, /* tp_as_buffer */
316 Py_TPFLAGS_DEFAULT, /* tp_flags */
317 0, /* tp_doc */
318 0, /* tp_traverse */
319 0, /* tp_clear */
320 0, /* tp_richcompare */
321 0, /* tp_weaklistoffset */
322 0, /* tp_iter */
323 0, /* tp_iternext */
324 0, /* tp_methods */
325 0, /* tp_members */
326 0, /* tp_getset */
327 0, /* tp_base */
328 0, /* tp_dict */
329 0, /* tp_descr_get */
330 0, /* tp_descr_set */
331 0, /* tp_dictoffset */
332 0, /* tp_init */
333 0, /* tp_alloc */
334 PyType_GenericNew, /* tp_new */
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000335};
336
337static PyObject*
338test_broken_memoryview(PyObject* self)
339{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 PyObject *obj = PyObject_New(PyObject, &_MemoryViewTester_Type);
341 PyObject *res;
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 if (obj == NULL) {
344 PyErr_Clear();
345 PyErr_SetString(
346 TestError,
347 "test_broken_memoryview: failed to create object");
348 return NULL;
349 }
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 res = PyMemoryView_FromObject(obj);
352 if (res || !PyErr_Occurred()){
353 PyErr_SetString(
354 TestError,
355 "test_broken_memoryview: memoryview() didn't raise an Exception");
356 Py_XDECREF(res);
357 Py_DECREF(obj);
358 return NULL;
359 }
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 PyErr_Clear();
362 Py_DECREF(obj);
363 Py_RETURN_NONE;
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000364}
365
366
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000367/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
Tim Petersff70d3c2001-06-14 01:11:03 +0000368 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000369
370 Note that the meat of the test is contained in testcapi_long.h.
371 This is revolting, but delicate code duplication is worse: "almost
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000372 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000373 dependence on type names makes it impossible to use a parameterized
374 function. A giant macro would be even worse than this. A C++ template
375 would be perfect.
376
377 The "report an error" functions are deliberately not part of the #include
378 file: if the test fails, you can set a breakpoint in the appropriate
379 error function directly, and crawl back from there in the debugger.
380*/
381
382#define UNBIND(X) Py_DECREF(X); (X) = NULL
383
384static PyObject *
385raise_test_long_error(const char* msg)
386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000388}
389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390#define TESTNAME test_long_api_inner
391#define TYPENAME long
392#define F_S_TO_PY PyLong_FromLong
393#define F_PY_TO_S PyLong_AsLong
394#define F_U_TO_PY PyLong_FromUnsignedLong
395#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000396
397#include "testcapi_long.h"
398
399static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000400test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000403}
404
405#undef TESTNAME
406#undef TYPENAME
407#undef F_S_TO_PY
408#undef F_PY_TO_S
409#undef F_U_TO_PY
410#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000411
412#ifdef HAVE_LONG_LONG
Tim Peters91621db2001-06-12 20:10:01 +0000413
414static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000415raise_test_longlong_error(const char* msg)
416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000418}
419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420#define TESTNAME test_longlong_api_inner
421#define TYPENAME PY_LONG_LONG
422#define F_S_TO_PY PyLong_FromLongLong
423#define F_PY_TO_S PyLong_AsLongLong
424#define F_U_TO_PY PyLong_FromUnsignedLongLong
425#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000426
427#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000428
429static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000430test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000433}
434
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000435#undef TESTNAME
436#undef TYPENAME
437#undef F_S_TO_PY
438#undef F_PY_TO_S
439#undef F_U_TO_PY
440#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000441
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000442/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
443 is tested by test_long_api_inner. This test will concentrate on proper
444 handling of overflow.
445*/
446
447static PyObject *
448test_long_and_overflow(PyObject *self)
449{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 PyObject *num, *one, *temp;
451 long value;
452 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 /* Test that overflow is set properly for a large value. */
455 /* num is a number larger than LONG_MAX even on 64-bit platforms */
456 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
457 if (num == NULL)
458 return NULL;
459 overflow = 1234;
460 value = PyLong_AsLongAndOverflow(num, &overflow);
461 Py_DECREF(num);
462 if (value == -1 && PyErr_Occurred())
463 return NULL;
464 if (value != -1)
465 return raiseTestError("test_long_and_overflow",
466 "return value was not set to -1");
467 if (overflow != 1)
468 return raiseTestError("test_long_and_overflow",
469 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 /* Same again, with num = LONG_MAX + 1 */
472 num = PyLong_FromLong(LONG_MAX);
473 if (num == NULL)
474 return NULL;
475 one = PyLong_FromLong(1L);
476 if (one == NULL) {
477 Py_DECREF(num);
478 return NULL;
479 }
480 temp = PyNumber_Add(num, one);
481 Py_DECREF(one);
482 Py_DECREF(num);
483 num = temp;
484 if (num == NULL)
485 return NULL;
486 overflow = 0;
487 value = PyLong_AsLongAndOverflow(num, &overflow);
488 Py_DECREF(num);
489 if (value == -1 && PyErr_Occurred())
490 return NULL;
491 if (value != -1)
492 return raiseTestError("test_long_and_overflow",
493 "return value was not set to -1");
494 if (overflow != 1)
495 return raiseTestError("test_long_and_overflow",
496 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 /* Test that overflow is set properly for a large negative value. */
499 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
500 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
501 if (num == NULL)
502 return NULL;
503 overflow = 1234;
504 value = PyLong_AsLongAndOverflow(num, &overflow);
505 Py_DECREF(num);
506 if (value == -1 && PyErr_Occurred())
507 return NULL;
508 if (value != -1)
509 return raiseTestError("test_long_and_overflow",
510 "return value was not set to -1");
511 if (overflow != -1)
512 return raiseTestError("test_long_and_overflow",
513 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 /* Same again, with num = LONG_MIN - 1 */
516 num = PyLong_FromLong(LONG_MIN);
517 if (num == NULL)
518 return NULL;
519 one = PyLong_FromLong(1L);
520 if (one == NULL) {
521 Py_DECREF(num);
522 return NULL;
523 }
524 temp = PyNumber_Subtract(num, one);
525 Py_DECREF(one);
526 Py_DECREF(num);
527 num = temp;
528 if (num == NULL)
529 return NULL;
530 overflow = 0;
531 value = PyLong_AsLongAndOverflow(num, &overflow);
532 Py_DECREF(num);
533 if (value == -1 && PyErr_Occurred())
534 return NULL;
535 if (value != -1)
536 return raiseTestError("test_long_and_overflow",
537 "return value was not set to -1");
538 if (overflow != -1)
539 return raiseTestError("test_long_and_overflow",
540 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 /* Test that overflow is cleared properly for small values. */
543 num = PyLong_FromString("FF", NULL, 16);
544 if (num == NULL)
545 return NULL;
546 overflow = 1234;
547 value = PyLong_AsLongAndOverflow(num, &overflow);
548 Py_DECREF(num);
549 if (value == -1 && PyErr_Occurred())
550 return NULL;
551 if (value != 0xFF)
552 return raiseTestError("test_long_and_overflow",
553 "expected return value 0xFF");
554 if (overflow != 0)
555 return raiseTestError("test_long_and_overflow",
556 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 num = PyLong_FromString("-FF", NULL, 16);
559 if (num == NULL)
560 return NULL;
561 overflow = 0;
562 value = PyLong_AsLongAndOverflow(num, &overflow);
563 Py_DECREF(num);
564 if (value == -1 && PyErr_Occurred())
565 return NULL;
566 if (value != -0xFF)
567 return raiseTestError("test_long_and_overflow",
568 "expected return value 0xFF");
569 if (overflow != 0)
570 return raiseTestError("test_long_and_overflow",
571 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 num = PyLong_FromLong(LONG_MAX);
574 if (num == NULL)
575 return NULL;
576 overflow = 1234;
577 value = PyLong_AsLongAndOverflow(num, &overflow);
578 Py_DECREF(num);
579 if (value == -1 && PyErr_Occurred())
580 return NULL;
581 if (value != LONG_MAX)
582 return raiseTestError("test_long_and_overflow",
583 "expected return value LONG_MAX");
584 if (overflow != 0)
585 return raiseTestError("test_long_and_overflow",
586 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 num = PyLong_FromLong(LONG_MIN);
589 if (num == NULL)
590 return NULL;
591 overflow = 0;
592 value = PyLong_AsLongAndOverflow(num, &overflow);
593 Py_DECREF(num);
594 if (value == -1 && PyErr_Occurred())
595 return NULL;
596 if (value != LONG_MIN)
597 return raiseTestError("test_long_and_overflow",
598 "expected return value LONG_MIN");
599 if (overflow != 0)
600 return raiseTestError("test_long_and_overflow",
601 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 Py_INCREF(Py_None);
604 return Py_None;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000605}
606
Mark Dickinson93f562c2010-01-30 10:30:15 +0000607/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
608 PY_LONG_LONG is tested by test_long_api_inner. This test will
609 concentrate on proper handling of overflow.
610*/
611
612static PyObject *
613test_long_long_and_overflow(PyObject *self)
614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 PyObject *num, *one, *temp;
616 PY_LONG_LONG value;
617 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 /* Test that overflow is set properly for a large value. */
620 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
621 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
622 if (num == NULL)
623 return NULL;
624 overflow = 1234;
625 value = PyLong_AsLongLongAndOverflow(num, &overflow);
626 Py_DECREF(num);
627 if (value == -1 && PyErr_Occurred())
628 return NULL;
629 if (value != -1)
630 return raiseTestError("test_long_long_and_overflow",
631 "return value was not set to -1");
632 if (overflow != 1)
633 return raiseTestError("test_long_long_and_overflow",
634 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 /* Same again, with num = PY_LLONG_MAX + 1 */
637 num = PyLong_FromLongLong(PY_LLONG_MAX);
638 if (num == NULL)
639 return NULL;
640 one = PyLong_FromLong(1L);
641 if (one == NULL) {
642 Py_DECREF(num);
643 return NULL;
644 }
645 temp = PyNumber_Add(num, one);
646 Py_DECREF(one);
647 Py_DECREF(num);
648 num = temp;
649 if (num == NULL)
650 return NULL;
651 overflow = 0;
652 value = PyLong_AsLongLongAndOverflow(num, &overflow);
653 Py_DECREF(num);
654 if (value == -1 && PyErr_Occurred())
655 return NULL;
656 if (value != -1)
657 return raiseTestError("test_long_long_and_overflow",
658 "return value was not set to -1");
659 if (overflow != 1)
660 return raiseTestError("test_long_long_and_overflow",
661 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 /* Test that overflow is set properly for a large negative value. */
664 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
665 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
666 if (num == NULL)
667 return NULL;
668 overflow = 1234;
669 value = PyLong_AsLongLongAndOverflow(num, &overflow);
670 Py_DECREF(num);
671 if (value == -1 && PyErr_Occurred())
672 return NULL;
673 if (value != -1)
674 return raiseTestError("test_long_long_and_overflow",
675 "return value was not set to -1");
676 if (overflow != -1)
677 return raiseTestError("test_long_long_and_overflow",
678 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 /* Same again, with num = PY_LLONG_MIN - 1 */
681 num = PyLong_FromLongLong(PY_LLONG_MIN);
682 if (num == NULL)
683 return NULL;
684 one = PyLong_FromLong(1L);
685 if (one == NULL) {
686 Py_DECREF(num);
687 return NULL;
688 }
689 temp = PyNumber_Subtract(num, one);
690 Py_DECREF(one);
691 Py_DECREF(num);
692 num = temp;
693 if (num == NULL)
694 return NULL;
695 overflow = 0;
696 value = PyLong_AsLongLongAndOverflow(num, &overflow);
697 Py_DECREF(num);
698 if (value == -1 && PyErr_Occurred())
699 return NULL;
700 if (value != -1)
701 return raiseTestError("test_long_long_and_overflow",
702 "return value was not set to -1");
703 if (overflow != -1)
704 return raiseTestError("test_long_long_and_overflow",
705 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 /* Test that overflow is cleared properly for small values. */
708 num = PyLong_FromString("FF", NULL, 16);
709 if (num == NULL)
710 return NULL;
711 overflow = 1234;
712 value = PyLong_AsLongLongAndOverflow(num, &overflow);
713 Py_DECREF(num);
714 if (value == -1 && PyErr_Occurred())
715 return NULL;
716 if (value != 0xFF)
717 return raiseTestError("test_long_long_and_overflow",
718 "expected return value 0xFF");
719 if (overflow != 0)
720 return raiseTestError("test_long_long_and_overflow",
721 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 num = PyLong_FromString("-FF", NULL, 16);
724 if (num == NULL)
725 return NULL;
726 overflow = 0;
727 value = PyLong_AsLongLongAndOverflow(num, &overflow);
728 Py_DECREF(num);
729 if (value == -1 && PyErr_Occurred())
730 return NULL;
731 if (value != -0xFF)
732 return raiseTestError("test_long_long_and_overflow",
733 "expected return value 0xFF");
734 if (overflow != 0)
735 return raiseTestError("test_long_long_and_overflow",
736 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 num = PyLong_FromLongLong(PY_LLONG_MAX);
739 if (num == NULL)
740 return NULL;
741 overflow = 1234;
742 value = PyLong_AsLongLongAndOverflow(num, &overflow);
743 Py_DECREF(num);
744 if (value == -1 && PyErr_Occurred())
745 return NULL;
746 if (value != PY_LLONG_MAX)
747 return raiseTestError("test_long_long_and_overflow",
748 "expected return value PY_LLONG_MAX");
749 if (overflow != 0)
750 return raiseTestError("test_long_long_and_overflow",
751 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 num = PyLong_FromLongLong(PY_LLONG_MIN);
754 if (num == NULL)
755 return NULL;
756 overflow = 0;
757 value = PyLong_AsLongLongAndOverflow(num, &overflow);
758 Py_DECREF(num);
759 if (value == -1 && PyErr_Occurred())
760 return NULL;
761 if (value != PY_LLONG_MIN)
762 return raiseTestError("test_long_long_and_overflow",
763 "expected return value PY_LLONG_MIN");
764 if (overflow != 0)
765 return raiseTestError("test_long_long_and_overflow",
766 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 Py_INCREF(Py_None);
769 return Py_None;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000770}
771
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200772/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
773 non-integer arguments are handled correctly. It should be extended to
774 test overflow handling.
775 */
776
777static PyObject *
778test_long_as_size_t(PyObject *self)
779{
780 size_t out_u;
781 Py_ssize_t out_s;
782
783 Py_INCREF(Py_None);
784
785 out_u = PyLong_AsSize_t(Py_None);
786 if (out_u != (size_t)-1 || !PyErr_Occurred())
787 return raiseTestError("test_long_as_size_t",
788 "PyLong_AsSize_t(None) didn't complain");
789 if (!PyErr_ExceptionMatches(PyExc_TypeError))
790 return raiseTestError("test_long_as_size_t",
791 "PyLong_AsSize_t(None) raised "
792 "something other than TypeError");
793 PyErr_Clear();
794
795 out_s = PyLong_AsSsize_t(Py_None);
796 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
797 return raiseTestError("test_long_as_size_t",
798 "PyLong_AsSsize_t(None) didn't complain");
799 if (!PyErr_ExceptionMatches(PyExc_TypeError))
800 return raiseTestError("test_long_as_size_t",
801 "PyLong_AsSsize_t(None) raised "
802 "something other than TypeError");
803 PyErr_Clear();
804
805 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
806 return Py_None;
807}
808
809/* Test the PyLong_AsDouble API. At present this just tests that
810 non-integer arguments are handled correctly.
811 */
812
813static PyObject *
814test_long_as_double(PyObject *self)
815{
816 double out;
817
818 Py_INCREF(Py_None);
819
820 out = PyLong_AsDouble(Py_None);
821 if (out != -1.0 || !PyErr_Occurred())
822 return raiseTestError("test_long_as_double",
823 "PyLong_AsDouble(None) didn't complain");
824 if (!PyErr_ExceptionMatches(PyExc_TypeError))
825 return raiseTestError("test_long_as_double",
826 "PyLong_AsDouble(None) raised "
827 "something other than TypeError");
828 PyErr_Clear();
829
830 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
831 return Py_None;
832}
833
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000834/* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
Tim Petersd38b1c72001-09-30 05:09:37 +0000835 for both long and int arguments. The test may leak a little memory if
836 it fails.
837*/
838static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000839test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000840{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 PyObject *tuple, *num;
842 PY_LONG_LONG value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 tuple = PyTuple_New(1);
845 if (tuple == NULL)
846 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 num = PyLong_FromLong(42);
849 if (num == NULL)
850 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 value = -1;
855 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
856 return NULL;
857 if (value != 42)
858 return raiseTestError("test_L_code",
859 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 Py_DECREF(num);
862 num = PyLong_FromLong(42);
863 if (num == NULL)
864 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 value = -1;
869 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
870 return NULL;
871 if (value != 42)
872 return raiseTestError("test_L_code",
873 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 Py_DECREF(tuple);
876 Py_INCREF(Py_None);
877 return Py_None;
Tim Petersd38b1c72001-09-30 05:09:37 +0000878}
879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880#endif /* ifdef HAVE_LONG_LONG */
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000881
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000882/* Test tuple argument processing */
883static PyObject *
884getargs_tuple(PyObject *self, PyObject *args)
885{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 int a, b, c;
887 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
888 return NULL;
889 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000890}
891
Christian Heimes380f7f22008-02-28 11:19:05 +0000892/* test PyArg_ParseTupleAndKeywords */
893static PyObject *getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
894{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
896 static char *fmt="(ii)i|(i(ii))(iii)i";
897 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +0000898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
900 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
901 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
902 return NULL;
903 return Py_BuildValue("iiiiiiiiii",
904 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
905 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +0000906}
907
Thomas Heller3457e4b2003-04-24 16:14:27 +0000908/* Functions to call PyArg_ParseTuple with integer format codes,
909 and return the result.
910*/
Thomas Hellera4ea6032003-04-17 18:55:45 +0000911static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000912getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 unsigned char value;
915 if (!PyArg_ParseTuple(args, "b", &value))
916 return NULL;
917 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000918}
919
Thomas Heller3457e4b2003-04-24 16:14:27 +0000920static PyObject *
921getargs_B(PyObject *self, PyObject *args)
922{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 unsigned char value;
924 if (!PyArg_ParseTuple(args, "B", &value))
925 return NULL;
926 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000927}
928
929static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +0000930getargs_h(PyObject *self, PyObject *args)
931{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 short value;
933 if (!PyArg_ParseTuple(args, "h", &value))
934 return NULL;
935 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +0000936}
937
938static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000939getargs_H(PyObject *self, PyObject *args)
940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 unsigned short value;
942 if (!PyArg_ParseTuple(args, "H", &value))
943 return NULL;
944 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000945}
946
947static PyObject *
948getargs_I(PyObject *self, PyObject *args)
949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 unsigned int value;
951 if (!PyArg_ParseTuple(args, "I", &value))
952 return NULL;
953 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000954}
955
956static PyObject *
957getargs_k(PyObject *self, PyObject *args)
958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 unsigned long value;
960 if (!PyArg_ParseTuple(args, "k", &value))
961 return NULL;
962 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000963}
964
965static PyObject *
966getargs_i(PyObject *self, PyObject *args)
967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 int value;
969 if (!PyArg_ParseTuple(args, "i", &value))
970 return NULL;
971 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000972}
973
Thomas Hellera4ea6032003-04-17 18:55:45 +0000974static PyObject *
975getargs_l(PyObject *self, PyObject *args)
976{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 long value;
978 if (!PyArg_ParseTuple(args, "l", &value))
979 return NULL;
980 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000981}
982
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000983static PyObject *
984getargs_n(PyObject *self, PyObject *args)
985{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 Py_ssize_t value;
987 if (!PyArg_ParseTuple(args, "n", &value))
988 return NULL;
989 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000990}
991
Thomas Hellera4ea6032003-04-17 18:55:45 +0000992#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +0000993static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000994getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000995{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 PY_LONG_LONG value;
997 if (!PyArg_ParseTuple(args, "L", &value))
998 return NULL;
999 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001000}
1001
Thomas Hellera4ea6032003-04-17 18:55:45 +00001002static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001003getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001004{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 unsigned PY_LONG_LONG value;
1006 if (!PyArg_ParseTuple(args, "K", &value))
1007 return NULL;
1008 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001009}
1010#endif
1011
1012/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +00001013 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001014static PyObject *
1015test_k_code(PyObject *self)
1016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 PyObject *tuple, *num;
1018 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 tuple = PyTuple_New(1);
1021 if (tuple == NULL)
1022 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 /* a number larger than ULONG_MAX even on 64-bit platforms */
1025 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1026 if (num == NULL)
1027 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 value = PyLong_AsUnsignedLongMask(num);
1030 if (value != ULONG_MAX)
1031 return raiseTestError("test_k_code",
1032 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 value = 0;
1037 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1038 return NULL;
1039 if (value != ULONG_MAX)
1040 return raiseTestError("test_k_code",
1041 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 Py_DECREF(num);
1044 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1045 if (num == NULL)
1046 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 value = PyLong_AsUnsignedLongMask(num);
1049 if (value != (unsigned long)-0x42)
1050 return raiseTestError("test_k_code",
1051 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 value = 0;
1056 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1057 return NULL;
1058 if (value != (unsigned long)-0x42)
1059 return raiseTestError("test_k_code",
1060 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 Py_DECREF(tuple);
1063 Py_INCREF(Py_None);
1064 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001065}
1066
Victor Stinner06e49dd2010-06-13 18:21:50 +00001067static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001068getargs_c(PyObject *self, PyObject *args)
1069{
1070 char c;
1071 if (!PyArg_ParseTuple(args, "c", &c))
1072 return NULL;
1073 return PyBytes_FromStringAndSize(&c, 1);
1074}
1075
1076static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001077getargs_s(PyObject *self, PyObject *args)
1078{
1079 char *str;
1080 if (!PyArg_ParseTuple(args, "s", &str))
1081 return NULL;
1082 return PyBytes_FromString(str);
1083}
1084
1085static PyObject *
1086getargs_s_star(PyObject *self, PyObject *args)
1087{
1088 Py_buffer buffer;
1089 PyObject *bytes;
1090 if (!PyArg_ParseTuple(args, "s*", &buffer))
1091 return NULL;
1092 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1093 PyBuffer_Release(&buffer);
1094 return bytes;
1095}
1096
1097static PyObject *
1098getargs_s_hash(PyObject *self, PyObject *args)
1099{
1100 char *str;
1101 Py_ssize_t size;
1102 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1103 return NULL;
1104 return PyBytes_FromStringAndSize(str, size);
1105}
1106
1107static PyObject *
1108getargs_z(PyObject *self, PyObject *args)
1109{
1110 char *str;
1111 if (!PyArg_ParseTuple(args, "z", &str))
1112 return NULL;
1113 if (str != NULL)
1114 return PyBytes_FromString(str);
1115 else
1116 Py_RETURN_NONE;
1117}
1118
1119static PyObject *
1120getargs_z_star(PyObject *self, PyObject *args)
1121{
1122 Py_buffer buffer;
1123 PyObject *bytes;
1124 if (!PyArg_ParseTuple(args, "z*", &buffer))
1125 return NULL;
1126 if (buffer.buf != NULL)
1127 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1128 else {
1129 Py_INCREF(Py_None);
1130 bytes = Py_None;
1131 }
1132 PyBuffer_Release(&buffer);
1133 return bytes;
1134}
1135
1136static PyObject *
1137getargs_z_hash(PyObject *self, PyObject *args)
1138{
1139 char *str;
1140 Py_ssize_t size;
1141 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1142 return NULL;
1143 if (str != NULL)
1144 return PyBytes_FromStringAndSize(str, size);
1145 else
1146 Py_RETURN_NONE;
1147}
1148
1149static PyObject *
1150getargs_y(PyObject *self, PyObject *args)
1151{
1152 char *str;
1153 if (!PyArg_ParseTuple(args, "y", &str))
1154 return NULL;
1155 return PyBytes_FromString(str);
1156}
1157
1158static PyObject *
1159getargs_y_star(PyObject *self, PyObject *args)
1160{
1161 Py_buffer buffer;
1162 PyObject *bytes;
1163 if (!PyArg_ParseTuple(args, "y*", &buffer))
1164 return NULL;
1165 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1166 PyBuffer_Release(&buffer);
1167 return bytes;
1168}
1169
1170static PyObject *
1171getargs_y_hash(PyObject *self, PyObject *args)
1172{
1173 char *str;
1174 Py_ssize_t size;
1175 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1176 return NULL;
1177 return PyBytes_FromStringAndSize(str, size);
1178}
1179
1180static PyObject *
1181getargs_u(PyObject *self, PyObject *args)
1182{
1183 Py_UNICODE *str;
1184 Py_ssize_t size;
1185 if (!PyArg_ParseTuple(args, "u", &str))
1186 return NULL;
1187 size = Py_UNICODE_strlen(str);
1188 return PyUnicode_FromUnicode(str, size);
1189}
1190
1191static PyObject *
1192getargs_u_hash(PyObject *self, PyObject *args)
1193{
1194 Py_UNICODE *str;
1195 Py_ssize_t size;
1196 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1197 return NULL;
1198 return PyUnicode_FromUnicode(str, size);
1199}
1200
1201static PyObject *
1202getargs_Z(PyObject *self, PyObject *args)
1203{
1204 Py_UNICODE *str;
1205 Py_ssize_t size;
1206 if (!PyArg_ParseTuple(args, "Z", &str))
1207 return NULL;
1208 if (str != NULL) {
1209 size = Py_UNICODE_strlen(str);
1210 return PyUnicode_FromUnicode(str, size);
1211 } else
1212 Py_RETURN_NONE;
1213}
1214
1215static PyObject *
1216getargs_Z_hash(PyObject *self, PyObject *args)
1217{
1218 Py_UNICODE *str;
1219 Py_ssize_t size;
1220 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1221 return NULL;
1222 if (str != NULL)
1223 return PyUnicode_FromUnicode(str, size);
1224 else
1225 Py_RETURN_NONE;
1226}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001227
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001228/* Test the s and z codes for PyArg_ParseTuple.
1229*/
1230static PyObject *
1231test_s_code(PyObject *self)
1232{
1233 /* Unicode strings should be accepted */
1234 PyObject *tuple, *obj;
1235 char *value;
1236
1237 tuple = PyTuple_New(1);
1238 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001240
1241 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001243 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001245
1246 PyTuple_SET_ITEM(tuple, 0, obj);
1247
1248 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001250 */
1251 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001253
1254 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001256
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001257 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001258 Py_RETURN_NONE;
1259}
1260
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001261static PyObject *
1262test_bug_7414(PyObject *self)
1263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 /* Issue #7414: for PyArg_ParseTupleAndKeywords, 'C' code wasn't being
1265 skipped properly in skipitem() */
1266 int a = 0, b = 0, result;
1267 char *kwlist[] = {"a", "b", NULL};
1268 PyObject *tuple = NULL, *dict = NULL, *b_str;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 tuple = PyTuple_New(0);
1271 if (tuple == NULL)
1272 goto failure;
1273 dict = PyDict_New();
1274 if (dict == NULL)
1275 goto failure;
1276 b_str = PyUnicode_FromString("b");
1277 if (b_str == NULL)
1278 goto failure;
1279 result = PyDict_SetItemString(dict, "b", b_str);
1280 Py_DECREF(b_str);
1281 if (result < 0)
1282 goto failure;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|CC",
1285 kwlist, &a, &b);
1286 if (!result)
1287 goto failure;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 if (a != 0)
1290 return raiseTestError("test_bug_7414",
1291 "C format code not skipped properly");
1292 if (b != 'b')
1293 return raiseTestError("test_bug_7414",
1294 "C format code returned wrong value");
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 Py_DECREF(dict);
1297 Py_DECREF(tuple);
1298 Py_RETURN_NONE;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001299
1300 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 Py_XDECREF(dict);
1302 Py_XDECREF(tuple);
1303 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001304}
1305
1306
Benjamin Peterson92035012008-12-27 16:00:54 +00001307static volatile int x;
1308
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001309/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1310 of an error.
1311*/
1312static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001313test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 PyObject *tuple, *obj;
1316 Py_UNICODE *value;
1317 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1320 /* Just use the macro and check that it compiles */
1321 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 tuple = PyTuple_New(1);
1324 if (tuple == NULL)
1325 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 obj = PyUnicode_Decode("test", strlen("test"),
1328 "ascii", NULL);
1329 if (obj == NULL)
1330 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001332 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 value = 0;
1335 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1336 return NULL;
1337 if (value != PyUnicode_AS_UNICODE(obj))
1338 return raiseTestError("test_u_code",
1339 "u code returned wrong value for u'test'");
1340 value = 0;
1341 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1342 return NULL;
1343 if (value != PyUnicode_AS_UNICODE(obj) ||
1344 len != PyUnicode_GET_SIZE(obj))
1345 return raiseTestError("test_u_code",
1346 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 Py_DECREF(tuple);
1349 Py_INCREF(Py_None);
1350 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001351}
1352
Guido van Rossumfb67be22007-08-29 18:38:11 +00001353/* Test Z and Z# codes for PyArg_ParseTuple */
1354static PyObject *
1355test_Z_code(PyObject *self)
1356{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001358 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 tuple = PyTuple_New(2);
1362 if (tuple == NULL)
1363 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 obj = PyUnicode_FromString("test");
1366 PyTuple_SET_ITEM(tuple, 0, obj);
1367 Py_INCREF(Py_None);
1368 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 /* swap values on purpose */
1371 value1 = NULL;
1372 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 /* Test Z for both values */
1375 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1376 return NULL;
1377 if (value1 != PyUnicode_AS_UNICODE(obj))
1378 return raiseTestError("test_Z_code",
1379 "Z code returned wrong value for 'test'");
1380 if (value2 != NULL)
1381 return raiseTestError("test_Z_code",
1382 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 value1 = NULL;
1385 value2 = PyUnicode_AS_UNICODE(obj);
1386 len1 = -1;
1387 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 /* Test Z# for both values */
1390 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1391 &value2, &len2) < 0)
1392 return NULL;
1393 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1394 len1 != PyUnicode_GET_SIZE(obj))
1395 return raiseTestError("test_Z_code",
1396 "Z# code returned wrong values for 'test'");
1397 if (value2 != NULL ||
1398 len2 != 0)
1399 return raiseTestError("test_Z_code",
1400 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 Py_DECREF(tuple);
1403 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001404}
1405
Thomas Wouters477c8d52006-05-27 19:21:47 +00001406static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001407test_widechar(PyObject *self)
1408{
1409#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1411 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001412 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001413#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1415 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1420 if (wide == NULL)
1421 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1424 if (utf8 == NULL) {
1425 Py_DECREF(wide);
1426 return NULL;
1427 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001428
Victor Stinner8ef18872011-11-21 02:06:57 +01001429 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 Py_DECREF(wide);
1431 Py_DECREF(utf8);
1432 return raiseTestError("test_widechar",
1433 "wide string and utf8 string "
1434 "have different length");
1435 }
1436 if (PyUnicode_Compare(wide, utf8)) {
1437 Py_DECREF(wide);
1438 Py_DECREF(utf8);
1439 if (PyErr_Occurred())
1440 return NULL;
1441 return raiseTestError("test_widechar",
1442 "wide string and utf8 string "
1443 "are different");
1444 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 Py_DECREF(wide);
1447 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001448
1449#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1450 wide = PyUnicode_FromWideChar(invalid, 1);
1451 if (wide == NULL)
1452 PyErr_Clear();
1453 else
1454 return raiseTestError("test_widechar",
1455 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1456
1457 wide = PyUnicode_FromUnicode(invalid, 1);
1458 if (wide == NULL)
1459 PyErr_Clear();
1460 else
1461 return raiseTestError("test_widechar",
1462 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
1463#endif
1464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001466}
1467
1468static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001469unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001470{
1471 PyObject *unicode, *result;
1472 Py_ssize_t buflen, size;
1473 wchar_t *buffer;
1474
1475 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1476 return NULL;
1477 buffer = PyMem_Malloc(buflen * sizeof(wchar_t));
1478 if (buffer == NULL)
1479 return PyErr_NoMemory();
1480
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001481 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001482 if (size == -1) {
1483 PyMem_Free(buffer);
1484 return NULL;
1485 }
1486
1487 if (size < buflen)
1488 buflen = size + 1;
1489 else
1490 buflen = size;
1491 result = PyUnicode_FromWideChar(buffer, buflen);
1492 PyMem_Free(buffer);
1493 if (result == NULL)
1494 return NULL;
1495
1496 return Py_BuildValue("(Nn)", result, size);
1497}
1498
1499static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001500unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001501{
1502 PyObject *unicode, *result;
1503 Py_ssize_t size;
1504 wchar_t *buffer;
1505
1506 if (!PyArg_ParseTuple(args, "U", &unicode))
1507 return NULL;
1508
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001509 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001510 if (buffer == NULL)
1511 return NULL;
1512
1513 result = PyUnicode_FromWideChar(buffer, size + 1);
1514 PyMem_Free(buffer);
1515 if (result == NULL)
1516 return NULL;
1517 return Py_BuildValue("(Nn)", result, size);
1518}
1519
1520static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001521unicode_encodedecimal(PyObject *self, PyObject *args)
1522{
1523 Py_UNICODE *unicode;
1524 Py_ssize_t length;
1525 char *errors = NULL;
1526 PyObject *decimal;
1527 Py_ssize_t decimal_length, new_length;
1528 int res;
1529
1530 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1531 return NULL;
1532
1533 decimal_length = length * 7; /* len('&#8364;') */
1534 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1535 if (decimal == NULL)
1536 return NULL;
1537
1538 res = PyUnicode_EncodeDecimal(unicode, length,
1539 PyBytes_AS_STRING(decimal),
1540 errors);
1541 if (res < 0) {
1542 Py_DECREF(decimal);
1543 return NULL;
1544 }
1545
1546 new_length = strlen(PyBytes_AS_STRING(decimal));
1547 assert(new_length <= decimal_length);
1548 res = _PyBytes_Resize(&decimal, new_length);
1549 if (res < 0)
1550 return NULL;
1551
1552 return decimal;
1553}
1554
1555static PyObject *
1556unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1557{
1558 Py_UNICODE *unicode;
1559 Py_ssize_t length;
1560 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1561 return NULL;
1562 return PyUnicode_TransformDecimalToASCII(unicode, length);
1563}
1564
1565static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001566getargs_w_star(PyObject *self, PyObject *args)
1567{
1568 Py_buffer buffer;
1569 PyObject *result;
1570 char *str;
1571
1572 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1573 return NULL;
1574
1575 if (2 <= buffer.len) {
1576 str = buffer.buf;
1577 str[0] = '[';
1578 str[buffer.len-1] = ']';
1579 }
1580
1581 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1582 PyBuffer_Release(&buffer);
1583 return result;
1584}
1585
1586
1587static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001588test_empty_argparse(PyObject *self)
1589{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 /* Test that formats can begin with '|'. See issue #4720. */
1591 PyObject *tuple, *dict = NULL;
1592 static char *kwlist[] = {NULL};
1593 int result;
1594 tuple = PyTuple_New(0);
1595 if (!tuple)
1596 return NULL;
1597 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1598 goto done;
1599 dict = PyDict_New();
1600 if (!dict)
1601 goto done;
1602 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00001603 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 Py_DECREF(tuple);
1605 Py_XDECREF(dict);
1606 if (result < 0)
1607 return NULL;
1608 else {
1609 Py_RETURN_NONE;
1610 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001611}
1612
1613static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001614codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 const char *encoding, *errors = NULL;
1617 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1618 &encoding, &errors))
1619 return NULL;
1620 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001621}
1622
Thomas Wouters477c8d52006-05-27 19:21:47 +00001623static PyObject *
1624codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 const char *encoding, *errors = NULL;
1627 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1628 &encoding, &errors))
1629 return NULL;
1630 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001631}
1632
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001633
Tim Peters5b8132f2003-01-31 15:52:05 +00001634/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001635static PyObject *
1636test_long_numbits(PyObject *self)
1637{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 struct triple {
1639 long input;
1640 size_t nbits;
1641 int sign;
1642 } testcases[] = {{0, 0, 0},
1643 {1L, 1, 1},
1644 {-1L, 1, -1},
1645 {2L, 2, 1},
1646 {-2L, 2, -1},
1647 {3L, 2, 1},
1648 {-3L, 2, -1},
1649 {4L, 3, 1},
1650 {-4L, 3, -1},
1651 {0x7fffL, 15, 1}, /* one Python long digit */
1652 {-0x7fffL, 15, -1},
1653 {0xffffL, 16, 1},
1654 {-0xffffL, 16, -1},
1655 {0xfffffffL, 28, 1},
1656 {-0xfffffffL, 28, -1}};
1657 int i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001658
Victor Stinner63941882011-09-29 00:42:28 +02001659 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 PyObject *plong = PyLong_FromLong(testcases[i].input);
1661 size_t nbits = _PyLong_NumBits(plong);
1662 int sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 Py_DECREF(plong);
1665 if (nbits != testcases[i].nbits)
1666 return raiseTestError("test_long_numbits",
1667 "wrong result for _PyLong_NumBits");
1668 if (sign != testcases[i].sign)
1669 return raiseTestError("test_long_numbits",
1670 "wrong result for _PyLong_Sign");
1671 }
1672 Py_INCREF(Py_None);
1673 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001674}
1675
Thomas Heller519a0422007-11-15 20:48:54 +00001676/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00001677
1678static PyObject *
1679test_null_strings(PyObject *self)
1680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
1682 PyObject *tuple = PyTuple_Pack(2, o1, o2);
1683 Py_XDECREF(o1);
1684 Py_XDECREF(o2);
1685 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00001686}
1687
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001688static PyObject *
1689raise_exception(PyObject *self, PyObject *args)
1690{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 PyObject *exc;
1692 PyObject *exc_args, *v;
1693 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
1696 &exc, &num_args))
1697 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 exc_args = PyTuple_New(num_args);
1700 if (exc_args == NULL)
1701 return NULL;
1702 for (i = 0; i < num_args; ++i) {
1703 v = PyLong_FromLong(i);
1704 if (v == NULL) {
1705 Py_DECREF(exc_args);
1706 return NULL;
1707 }
1708 PyTuple_SET_ITEM(exc_args, i, v);
1709 }
1710 PyErr_SetObject(exc, exc_args);
1711 Py_DECREF(exc_args);
1712 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001713}
Tim Peters91621db2001-06-12 20:10:01 +00001714
Benjamin Peterson16323982010-02-03 01:13:41 +00001715
1716static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001717
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001718static PyObject *
1719test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 if (PyDateTimeAPI) {
1721 if (test_run_counter) {
1722 /* Probably regrtest.py -R */
1723 Py_RETURN_NONE;
1724 }
1725 else {
1726 PyErr_SetString(PyExc_AssertionError,
1727 "PyDateTime_CAPI somehow initialized");
1728 return NULL;
1729 }
1730 }
1731 test_run_counter++;
1732 PyDateTime_IMPORT;
1733 if (PyDateTimeAPI)
1734 Py_RETURN_NONE;
1735 else
1736 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001737}
1738
Benjamin Peterson16323982010-02-03 01:13:41 +00001739
1740#ifdef WITH_THREAD
1741
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001742/* test_thread_state spawns a thread of its own, and that thread releases
1743 * `thread_done` when it's finished. The driver code has to know when the
1744 * thread finishes, because the thread uses a PyObject (the callable) that
1745 * may go away when the driver finishes. The former lack of this explicit
1746 * synchronization caused rare segfaults, so rare that they were seen only
1747 * on a Mac buildbot (although they were possible on any box).
1748 */
1749static PyThread_type_lock thread_done = NULL;
1750
Benjamin Petersona786b022008-08-25 21:05:21 +00001751static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001752_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 PyObject *rc;
1755 int success;
1756 PyGILState_STATE s = PyGILState_Ensure();
1757 rc = PyObject_CallFunction((PyObject *)callable, "");
1758 success = (rc != NULL);
1759 Py_XDECREF(rc);
1760 PyGILState_Release(s);
1761 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001762}
1763
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001764/* Same thing, but releases `thread_done` when it returns. This variant
1765 * should be called only from threads spawned by test_thread_state().
1766 */
1767static void
1768_make_call_from_thread(void *callable)
1769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 _make_call(callable);
1771 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001772}
1773
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001774static PyObject *
1775test_thread_state(PyObject *self, PyObject *args)
1776{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 PyObject *fn;
1778 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1781 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 if (!PyCallable_Check(fn)) {
1784 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1785 fn->ob_type->tp_name);
1786 return NULL;
1787 }
Benjamin Petersona786b022008-08-25 21:05:21 +00001788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 /* Ensure Python is set up for threading */
1790 PyEval_InitThreads();
1791 thread_done = PyThread_allocate_lock();
1792 if (thread_done == NULL)
1793 return PyErr_NoMemory();
1794 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 /* Start a new thread with our callback. */
1797 PyThread_start_new_thread(_make_call_from_thread, fn);
1798 /* Make the callback with the thread lock held by this thread */
1799 success &= _make_call(fn);
1800 /* Do it all again, but this time with the thread-lock released */
1801 Py_BEGIN_ALLOW_THREADS
1802 success &= _make_call(fn);
1803 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1804 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 /* And once more with and without a thread
1807 XXX - should use a lock and work out exactly what we are trying
1808 to test <wink>
1809 */
1810 Py_BEGIN_ALLOW_THREADS
1811 PyThread_start_new_thread(_make_call_from_thread, fn);
1812 success &= _make_call(fn);
1813 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1814 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 /* Release lock we acquired above. This is required on HP-UX. */
1817 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 PyThread_free_lock(thread_done);
1820 if (!success)
1821 return NULL;
1822 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001823}
Benjamin Petersona54c9092009-01-13 02:11:23 +00001824
1825/* test Py_AddPendingCalls using threads */
1826static int _pending_callback(void *arg)
1827{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 /* we assume the argument is callable object to which we own a reference */
1829 PyObject *callable = (PyObject *)arg;
1830 PyObject *r = PyObject_CallObject(callable, NULL);
1831 Py_DECREF(callable);
1832 Py_XDECREF(r);
1833 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001834}
1835
1836/* The following requests n callbacks to _pending_callback. It can be
1837 * run from any python thread.
1838 */
1839PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
1840{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 PyObject *callable;
1842 int r;
1843 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
1844 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 /* create the reference for the callbackwhile we hold the lock */
1847 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00001848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 Py_BEGIN_ALLOW_THREADS
1850 r = Py_AddPendingCall(&_pending_callback, callable);
1851 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00001852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 if (r<0) {
1854 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
1855 Py_INCREF(Py_False);
1856 return Py_False;
1857 }
1858 Py_INCREF(Py_True);
1859 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001860}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001861#endif
1862
Neal Norwitzb0d26332007-08-25 00:49:05 +00001863/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001864static PyObject *
1865test_string_from_format(PyObject *self, PyObject *args)
1866{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 PyObject *result;
1868 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001869
Alexander Belopolskye239d232010-12-08 23:31:48 +00001870#define CHECK_1_FORMAT(FORMAT, TYPE) \
1871 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
1872 if (result == NULL) \
1873 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01001874 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00001875 msg = FORMAT " failed at 1"; \
1876 goto Fail; \
1877 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 CHECK_1_FORMAT("%d", int);
1881 CHECK_1_FORMAT("%ld", long);
1882 /* The z width modifier was added in Python 2.5. */
1883 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 /* The u type code was added in Python 2.5. */
1886 CHECK_1_FORMAT("%u", unsigned int);
1887 CHECK_1_FORMAT("%lu", unsigned long);
1888 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001891#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
1893 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001894#endif
1895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001897
1898 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 Py_XDECREF(result);
1900 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001901
1902#undef CHECK_1_FORMAT
1903}
1904
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001905
1906static PyObject *
1907test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
1909 int result;
1910 if (py_s == NULL)
1911 return NULL;
1912 result = PyUnicode_CompareWithASCIIString(py_s, "str");
1913 Py_DECREF(py_s);
1914 if (!result) {
1915 PyErr_SetString(TestError, "Python string ending in NULL "
1916 "should not compare equal to c string.");
1917 return NULL;
1918 }
1919 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00001920}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001921
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001922/* This is here to provide a docstring for test_descr. */
1923static PyObject *
1924test_with_docstring(PyObject *self)
1925{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001927}
1928
Mark Dickinson725bfd82009-05-03 20:33:40 +00001929/* Test PyOS_string_to_double. */
1930static PyObject *
1931test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932 double result;
1933 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00001934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935#define CHECK_STRING(STR, expected) \
1936 result = PyOS_string_to_double(STR, NULL, NULL); \
1937 if (result == -1.0 && PyErr_Occurred()) \
1938 return NULL; \
1939 if (result != expected) { \
1940 msg = "conversion of " STR " to float failed"; \
1941 goto fail; \
1942 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00001943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944#define CHECK_INVALID(STR) \
1945 result = PyOS_string_to_double(STR, NULL, NULL); \
1946 if (result == -1.0 && PyErr_Occurred()) { \
1947 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
1948 PyErr_Clear(); \
1949 else \
1950 return NULL; \
1951 } \
1952 else { \
1953 msg = "conversion of " STR " didn't raise ValueError"; \
1954 goto fail; \
1955 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00001956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957 CHECK_STRING("0.1", 0.1);
1958 CHECK_STRING("1.234", 1.234);
1959 CHECK_STRING("-1.35", -1.35);
1960 CHECK_STRING(".1e01", 1.0);
1961 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00001962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 CHECK_INVALID(" 0.1");
1964 CHECK_INVALID("\t\n-3");
1965 CHECK_INVALID(".123 ");
1966 CHECK_INVALID("3\n");
1967 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00001968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00001970 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00001972#undef CHECK_STRING
1973#undef CHECK_INVALID
1974}
1975
1976
Benjamin Petersonb173f782009-05-05 22:31:58 +00001977/* Coverage testing of capsule objects. */
1978
1979static const char *capsule_name = "capsule name";
1980static char *capsule_pointer = "capsule pointer";
1981static char *capsule_context = "capsule context";
1982static const char *capsule_error = NULL;
1983static int
1984capsule_destructor_call_count = 0;
1985
1986static void
1987capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 capsule_destructor_call_count++;
1989 if (PyCapsule_GetContext(o) != capsule_context) {
1990 capsule_error = "context did not match in destructor!";
1991 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
1992 capsule_error = "destructor did not match in destructor! (woah!)";
1993 } else if (PyCapsule_GetName(o) != capsule_name) {
1994 capsule_error = "name did not match in destructor!";
1995 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
1996 capsule_error = "pointer did not match in destructor!";
1997 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00001998}
1999
2000typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 char *name;
2002 char *module;
2003 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002004} known_capsule;
2005
2006static PyObject *
2007test_capsule(PyObject *self, PyObject *args)
2008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002009 PyObject *object;
2010 const char *error = NULL;
2011 void *pointer;
2012 void *pointer2;
2013 known_capsule known_capsules[] = {
2014 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2015 KNOWN_CAPSULE("_socket", "CAPI"),
2016 KNOWN_CAPSULE("_curses", "_C_API"),
2017 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2018 { NULL, NULL },
2019 };
2020 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002021
2022#define FAIL(x) { error = (x); goto exit; }
2023
2024#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 if (capsule_error) { \
2026 FAIL(capsule_error); \
2027 } \
2028 else if (!capsule_destructor_call_count) { \
2029 FAIL("destructor not called!"); \
2030 } \
2031 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2034 PyCapsule_SetContext(object, capsule_context);
2035 capsule_destructor(object);
2036 CHECK_DESTRUCTOR;
2037 Py_DECREF(object);
2038 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 object = PyCapsule_New(known, "ignored", NULL);
2041 PyCapsule_SetPointer(object, capsule_pointer);
2042 PyCapsule_SetName(object, capsule_name);
2043 PyCapsule_SetDestructor(object, capsule_destructor);
2044 PyCapsule_SetContext(object, capsule_context);
2045 capsule_destructor(object);
2046 CHECK_DESTRUCTOR;
2047 /* intentionally access using the wrong name */
2048 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2049 if (!PyErr_Occurred()) {
2050 FAIL("PyCapsule_GetPointer should have failed but did not!");
2051 }
2052 PyErr_Clear();
2053 if (pointer2) {
2054 if (pointer2 == capsule_pointer) {
2055 FAIL("PyCapsule_GetPointer should not have"
2056 " returned the internal pointer!");
2057 } else {
2058 FAIL("PyCapsule_GetPointer should have "
2059 "returned NULL pointer but did not!");
2060 }
2061 }
2062 PyCapsule_SetDestructor(object, NULL);
2063 Py_DECREF(object);
2064 if (capsule_destructor_call_count) {
2065 FAIL("destructor called when it should not have been!");
2066 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 for (known = &known_capsules[0]; known->module != NULL; known++) {
2069 /* yeah, ordinarily I wouldn't do this either,
2070 but it's fine for this test harness.
2071 */
2072 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002073#undef FAIL
2074#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 { \
2076 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2077 x, known->module, known->attribute); \
2078 error = buffer; \
2079 goto exit; \
2080 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 PyObject *module = PyImport_ImportModule(known->module);
2083 if (module) {
2084 pointer = PyCapsule_Import(known->name, 0);
2085 if (!pointer) {
2086 Py_DECREF(module);
2087 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2088 }
2089 object = PyObject_GetAttrString(module, known->attribute);
2090 if (!object) {
2091 Py_DECREF(module);
2092 return NULL;
2093 }
2094 pointer2 = PyCapsule_GetPointer(object,
2095 "weebles wobble but they don't fall down");
2096 if (!PyErr_Occurred()) {
2097 Py_DECREF(object);
2098 Py_DECREF(module);
2099 FAIL("PyCapsule_GetPointer should have failed but did not!");
2100 }
2101 PyErr_Clear();
2102 if (pointer2) {
2103 Py_DECREF(module);
2104 Py_DECREF(object);
2105 if (pointer2 == pointer) {
2106 FAIL("PyCapsule_GetPointer should not have"
2107 " returned its internal pointer!");
2108 } else {
2109 FAIL("PyCapsule_GetPointer should have"
2110 " returned NULL pointer but did not!");
2111 }
2112 }
2113 Py_DECREF(object);
2114 Py_DECREF(module);
2115 }
2116 else
2117 PyErr_Clear();
2118 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002119
2120 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 if (error) {
2122 return raiseTestError("test_capsule", error);
2123 }
2124 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002125#undef FAIL
2126}
2127
Guido van Rossumddefaf32007-01-14 03:31:43 +00002128#ifdef HAVE_GETTIMEOFDAY
2129/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002130static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002131{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 e->tv_sec -= s->tv_sec;
2133 e->tv_usec -= s->tv_usec;
2134 if (e->tv_usec < 0) {
2135 e->tv_sec -=1;
2136 e->tv_usec += 1000000;
2137 }
2138 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002139}
2140
2141static PyObject *
2142profile_int(PyObject *self, PyObject* args)
2143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 int i, k;
2145 struct timeval start, stop;
2146 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 /* Test 1: Allocate and immediately deallocate
2149 many small integers */
2150 gettimeofday(&start, NULL);
2151 for(k=0; k < 20000; k++)
2152 for(i=0; i < 1000; i++) {
2153 single = PyLong_FromLong(i);
2154 Py_DECREF(single);
2155 }
2156 gettimeofday(&stop, NULL);
2157 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 /* Test 2: Allocate and immediately deallocate
2160 many large integers */
2161 gettimeofday(&start, NULL);
2162 for(k=0; k < 20000; k++)
2163 for(i=0; i < 1000; i++) {
2164 single = PyLong_FromLong(i+1000000);
2165 Py_DECREF(single);
2166 }
2167 gettimeofday(&stop, NULL);
2168 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 /* Test 3: Allocate a few integers, then release
2171 them all simultaneously. */
2172 multiple = malloc(sizeof(PyObject*) * 1000);
2173 gettimeofday(&start, NULL);
2174 for(k=0; k < 20000; k++) {
2175 for(i=0; i < 1000; i++) {
2176 multiple[i] = PyLong_FromLong(i+1000000);
2177 }
2178 for(i=0; i < 1000; i++) {
2179 Py_DECREF(multiple[i]);
2180 }
2181 }
2182 gettimeofday(&stop, NULL);
2183 print_delta(3, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 /* Test 4: Allocate many integers, then release
2186 them all simultaneously. */
2187 multiple = malloc(sizeof(PyObject*) * 1000000);
2188 gettimeofday(&start, NULL);
2189 for(k=0; k < 20; k++) {
2190 for(i=0; i < 1000000; i++) {
2191 multiple[i] = PyLong_FromLong(i+1000000);
2192 }
2193 for(i=0; i < 1000000; i++) {
2194 Py_DECREF(multiple[i]);
2195 }
2196 }
2197 gettimeofday(&stop, NULL);
2198 print_delta(4, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200 /* Test 5: Allocate many integers < 32000 */
2201 multiple = malloc(sizeof(PyObject*) * 1000000);
2202 gettimeofday(&start, NULL);
2203 for(k=0; k < 10; k++) {
2204 for(i=0; i < 1000000; i++) {
2205 multiple[i] = PyLong_FromLong(i+1000);
2206 }
2207 for(i=0; i < 1000000; i++) {
2208 Py_DECREF(multiple[i]);
2209 }
2210 }
2211 gettimeofday(&stop, NULL);
2212 print_delta(5, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214 /* Test 6: Perform small int addition */
2215 op1 = PyLong_FromLong(1);
2216 gettimeofday(&start, NULL);
2217 for(i=0; i < 10000000; i++) {
2218 result = PyNumber_Add(op1, op1);
2219 Py_DECREF(result);
2220 }
2221 gettimeofday(&stop, NULL);
2222 Py_DECREF(op1);
2223 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002225 /* Test 7: Perform medium int addition */
2226 op1 = PyLong_FromLong(1000);
2227 gettimeofday(&start, NULL);
2228 for(i=0; i < 10000000; i++) {
2229 result = PyNumber_Add(op1, op1);
2230 Py_DECREF(result);
2231 }
2232 gettimeofday(&stop, NULL);
2233 Py_DECREF(op1);
2234 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 Py_INCREF(Py_None);
2237 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002238}
2239#endif
2240
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002241/* To test the format of tracebacks as printed out. */
2242static PyObject *
2243traceback_print(PyObject *self, PyObject *args)
2244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 PyObject *file;
2246 PyObject *traceback;
2247 int result;
2248
2249 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2250 &traceback, &file))
2251 return NULL;
2252
2253 result = PyTraceBack_Print(traceback, file);
2254 if (result < 0)
2255 return NULL;
2256 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002257}
2258
Benjamin Petersone6528212008-07-15 15:32:09 +00002259/* To test the format of exceptions as printed out. */
2260static PyObject *
2261exception_print(PyObject *self, PyObject *args)
2262{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 PyObject *value;
2264 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 if (!PyArg_ParseTuple(args, "O:exception_print",
2267 &value))
2268 return NULL;
2269 if (!PyExceptionInstance_Check(value)) {
2270 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2271 return NULL;
2272 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 tb = PyException_GetTraceback(value);
2275 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2276 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002279}
2280
2281
2282
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002283
2284/* reliably raise a MemoryError */
2285static PyObject *
2286raise_memoryerror(PyObject *self)
2287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 PyErr_NoMemory();
2289 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002290}
2291
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002292/* Issue 6012 */
2293static PyObject *str1, *str2;
2294static int
2295failing_converter(PyObject *obj, void *arg)
2296{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 /* Clone str1, then let the conversion fail. */
2298 assert(str1);
2299 str2 = str1;
2300 Py_INCREF(str2);
2301 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002302}
2303static PyObject*
2304argparsing(PyObject *o, PyObject *args)
2305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 PyObject *res;
2307 str1 = str2 = NULL;
2308 if (!PyArg_ParseTuple(args, "O&O&",
2309 PyUnicode_FSConverter, &str1,
2310 failing_converter, &str2)) {
2311 if (!str2)
2312 /* argument converter not called? */
2313 return NULL;
2314 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002315 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 Py_DECREF(str2);
2317 PyErr_Clear();
2318 return res;
2319 }
2320 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002321}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002322
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002323/* To test that the result of PyCode_NewEmpty has the right members. */
2324static PyObject *
2325code_newempty(PyObject *self, PyObject *args)
2326{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 const char *filename;
2328 const char *funcname;
2329 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2332 &filename, &funcname, &firstlineno))
2333 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002336}
2337
Georg Brandl1e28a272009-12-28 08:41:01 +00002338/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2339 Run via Lib/test/test_exceptions.py */
2340static PyObject *
2341make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 const char *name;
2344 const char *doc = NULL;
2345 PyObject *base = NULL;
2346 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2351 "s|sOO:make_exception_with_doc", kwlist,
2352 &name, &doc, &base, &dict))
2353 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002356}
2357
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002358static PyObject *
2359make_memoryview_from_NULL_pointer(PyObject *self)
2360{
2361 Py_buffer info;
2362 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2363 return NULL;
2364 return PyMemoryView_FromBuffer(&info);
2365}
2366
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002367/* Test that the fatal error from not having a current thread doesn't
2368 cause an infinite loop. Run via Lib/test/test_capi.py */
2369static PyObject *
2370crash_no_current_thread(PyObject *self)
2371{
2372 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002373 /* Using PyThreadState_Get() directly allows the test to pass in
2374 !pydebug mode. However, the test only actually tests anything
2375 in pydebug mode, since that's where the infinite loop was in
2376 the first place. */
2377 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002378 Py_END_ALLOW_THREADS
2379 return NULL;
2380}
2381
Tim Peters9ea17ac2001-02-02 05:57:15 +00002382static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 {"raise_exception", raise_exception, METH_VARARGS},
2384 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
2385 {"test_config", (PyCFunction)test_config, METH_NOARGS},
2386 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
2387 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
2388 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
2389 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
2390 {"test_broken_memoryview", (PyCFunction)test_broken_memoryview,METH_NOARGS},
2391 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
2392 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
2393 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02002394 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
2395 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
2397 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
2398 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
2399 {"test_bug_7414", (PyCFunction)test_bug_7414, METH_NOARGS},
2400 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
2401 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
2402 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
2403 PyDoc_STR("This is a pretty normal docstring.")},
2404 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
2405 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
2406 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
2407 {"getargs_tuple", getargs_tuple, METH_VARARGS},
2408 {"getargs_keywords", (PyCFunction)getargs_keywords,
2409 METH_VARARGS|METH_KEYWORDS},
2410 {"getargs_b", getargs_b, METH_VARARGS},
2411 {"getargs_B", getargs_B, METH_VARARGS},
2412 {"getargs_h", getargs_h, METH_VARARGS},
2413 {"getargs_H", getargs_H, METH_VARARGS},
2414 {"getargs_I", getargs_I, METH_VARARGS},
2415 {"getargs_k", getargs_k, METH_VARARGS},
2416 {"getargs_i", getargs_i, METH_VARARGS},
2417 {"getargs_l", getargs_l, METH_VARARGS},
2418 {"getargs_n", getargs_n, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00002419#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 {"getargs_L", getargs_L, METH_VARARGS},
2421 {"getargs_K", getargs_K, METH_VARARGS},
2422 {"test_longlong_api", test_longlong_api, METH_NOARGS},
2423 {"test_long_long_and_overflow",
2424 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
2425 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00002426#endif
Eli Bendersky906b88f2011-07-29 07:05:08 +03002427 {"getargs_c", getargs_c, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00002428 {"getargs_s", getargs_s, METH_VARARGS},
2429 {"getargs_s_star", getargs_s_star, METH_VARARGS},
2430 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
2431 {"getargs_z", getargs_z, METH_VARARGS},
2432 {"getargs_z_star", getargs_z_star, METH_VARARGS},
2433 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
2434 {"getargs_y", getargs_y, METH_VARARGS},
2435 {"getargs_y_star", getargs_y_star, METH_VARARGS},
2436 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
2437 {"getargs_u", getargs_u, METH_VARARGS},
2438 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
2439 {"getargs_Z", getargs_Z, METH_VARARGS},
2440 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00002441 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00002443 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00002445 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
2447 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
2448 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
2449 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01002450 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
2451 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
2452 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
2453 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002454#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00002455 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002457#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00002458#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00002459 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00002460#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00002461 {"traceback_print", traceback_print, METH_VARARGS},
2462 {"exception_print", exception_print, METH_VARARGS},
2463 {"argparsing", argparsing, METH_VARARGS},
2464 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
2466 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002467 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
2468 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002469 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00002471};
2472
Thomas Hellera4ea6032003-04-17 18:55:45 +00002473#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
2474
Thomas Wouters89f507f2006-12-13 04:49:30 +00002475typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 char bool_member;
2477 char byte_member;
2478 unsigned char ubyte_member;
2479 short short_member;
2480 unsigned short ushort_member;
2481 int int_member;
2482 unsigned int uint_member;
2483 long long_member;
2484 unsigned long ulong_member;
2485 Py_ssize_t pyssizet_member;
2486 float float_member;
2487 double double_member;
2488 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002489#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 PY_LONG_LONG longlong_member;
2491 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002492#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00002493} all_structmembers;
2494
2495typedef struct {
2496 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002498} test_structmembers;
2499
2500static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
2502 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
2503 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
2504 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
2505 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
2506 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
2507 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
2508 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
2509 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
2510 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
2511 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
2512 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
2513 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002514#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
2516 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00002519};
2520
2521
Christian Heimes1af737c2008-01-23 08:24:23 +00002522static PyObject *
2523test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
2524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 static char *keywords[] = {
2526 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
2527 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
2528 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00002529#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00002531#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 NULL};
2533 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00002534#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00002536#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 ;
2538 test_structmembers *ob;
2539 const char *s = NULL;
2540 Py_ssize_t string_len = 0;
2541 ob = PyObject_New(test_structmembers, type);
2542 if (ob == NULL)
2543 return NULL;
2544 memset(&ob->structmembers, 0, sizeof(all_structmembers));
2545 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
2546 &ob->structmembers.bool_member,
2547 &ob->structmembers.byte_member,
2548 &ob->structmembers.ubyte_member,
2549 &ob->structmembers.short_member,
2550 &ob->structmembers.ushort_member,
2551 &ob->structmembers.int_member,
2552 &ob->structmembers.uint_member,
2553 &ob->structmembers.long_member,
2554 &ob->structmembers.ulong_member,
2555 &ob->structmembers.pyssizet_member,
2556 &ob->structmembers.float_member,
2557 &ob->structmembers.double_member,
2558 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00002559#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 , &ob->structmembers.longlong_member,
2561 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00002562#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002563 )) {
2564 Py_DECREF(ob);
2565 return NULL;
2566 }
2567 if (s != NULL) {
2568 if (string_len > 5) {
2569 Py_DECREF(ob);
2570 PyErr_SetString(PyExc_ValueError, "string too long");
2571 return NULL;
2572 }
2573 strcpy(ob->structmembers.inplace_member, s);
2574 }
2575 else {
2576 strcpy(ob->structmembers.inplace_member, "");
2577 }
2578 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002579}
2580
Christian Heimes1af737c2008-01-23 08:24:23 +00002581static void
2582test_structmembers_free(PyObject *ob)
2583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002584 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002585}
2586
2587static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002588 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 "test_structmembersType",
2590 sizeof(test_structmembers), /* tp_basicsize */
2591 0, /* tp_itemsize */
2592 test_structmembers_free, /* destructor tp_dealloc */
2593 0, /* tp_print */
2594 0, /* tp_getattr */
2595 0, /* tp_setattr */
2596 0, /* tp_reserved */
2597 0, /* tp_repr */
2598 0, /* tp_as_number */
2599 0, /* tp_as_sequence */
2600 0, /* tp_as_mapping */
2601 0, /* tp_hash */
2602 0, /* tp_call */
2603 0, /* tp_str */
2604 PyObject_GenericGetAttr, /* tp_getattro */
2605 PyObject_GenericSetAttr, /* tp_setattro */
2606 0, /* tp_as_buffer */
2607 0, /* tp_flags */
2608 "Type containing all structmember types",
2609 0, /* traverseproc tp_traverse */
2610 0, /* tp_clear */
2611 0, /* tp_richcompare */
2612 0, /* tp_weaklistoffset */
2613 0, /* tp_iter */
2614 0, /* tp_iternext */
2615 0, /* tp_methods */
2616 test_members, /* tp_members */
2617 0,
2618 0,
2619 0,
2620 0,
2621 0,
2622 0,
2623 0,
2624 0,
2625 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002626};
2627
2628
Martin v. Löwis1a214512008-06-11 05:26:20 +00002629
2630static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 PyModuleDef_HEAD_INIT,
2632 "_testcapi",
2633 NULL,
2634 -1,
2635 TestMethods,
2636 NULL,
2637 NULL,
2638 NULL,
2639 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002640};
2641
Mark Hammond62b1ab12002-07-23 06:31:15 +00002642PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002643PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00002644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002645 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 m = PyModule_Create(&_testcapimodule);
2648 if (m == NULL)
2649 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
2652 Py_TYPE(&_MemoryViewTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00002653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 Py_TYPE(&test_structmembersType)=&PyType_Type;
2655 Py_INCREF(&test_structmembersType);
2656 /* don't use a name starting with "test", since we don't want
2657 test_capi to automatically call this */
2658 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
2661 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
2662 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
2663 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
2664 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
2665 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
2666 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
2667 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
2668 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
2669 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
2670 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
2671 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
2672 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
2673 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
2674 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
2675 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
2676 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
2677 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
2678 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
2679 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
2680 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
2681 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
2682 Py_INCREF(&PyInstanceMethod_Type);
2683 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00002684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
2686 Py_INCREF(TestError);
2687 PyModule_AddObject(m, "error", TestError);
2688 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002689}