blob: ea0b1c79a4e3e105d1c1ac4c06fe52303a9f61b2 [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 */
Tim Peters9ea17ac2001-02-02 05:57:15 +000018static PyObject *TestError; /* set to exception object in init */
19
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{
25 char buf[2048];
26
27 if (strlen(test_name) + strlen(msg) > sizeof(buf) - 50)
28 PyErr_SetString(TestError, "internal error msg too large");
29 else {
Tim Peters885d4572001-11-28 20:27:42 +000030 PyOS_snprintf(buf, sizeof(buf), "%s: %s", test_name, msg);
Tim Peters91621db2001-06-12 20:10:01 +000031 PyErr_SetString(TestError, buf);
32 }
33 return NULL;
34}
35
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000036/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000037
38 The ones derived from autoconf on the UNIX-like OSes can be relied
39 upon (in the absence of sloppy cross-compiling), but the Windows
40 platforms have these hardcoded. Better safe than sorry.
41*/
42static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000043sizeof_error(const char* fatname, const char* typname,
Tim Peters9ea17ac2001-02-02 05:57:15 +000044 int expected, int got)
45{
46 char buf[1024];
Tim Petersbaefd9e2003-01-28 20:37:45 +000047 PyOS_snprintf(buf, sizeof(buf),
Tim Peters885d4572001-11-28 20:27:42 +000048 "%.200s #define == %d but sizeof(%.200s) == %d",
Thomas Wouters89f507f2006-12-13 04:49:30 +000049 fatname, expected, typname, got);
Tim Peters9ea17ac2001-02-02 05:57:15 +000050 PyErr_SetString(TestError, buf);
51 return (PyObject*)NULL;
52}
53
54static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000055test_config(PyObject *self)
Tim Peters9ea17ac2001-02-02 05:57:15 +000056{
Tim Peters9ea17ac2001-02-02 05:57:15 +000057#define CHECK_SIZEOF(FATNAME, TYPE) \
58 if (FATNAME != sizeof(TYPE)) \
59 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
60
Tim Peters208efe52001-06-26 22:40:47 +000061 CHECK_SIZEOF(SIZEOF_SHORT, short);
Tim Peters9ea17ac2001-02-02 05:57:15 +000062 CHECK_SIZEOF(SIZEOF_INT, int);
63 CHECK_SIZEOF(SIZEOF_LONG, long);
64 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
65 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
66#ifdef HAVE_LONG_LONG
Martin v. Löwisb9a0f912003-03-29 10:06:18 +000067 CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
Tim Peters9ea17ac2001-02-02 05:57:15 +000068#endif
69
70#undef CHECK_SIZEOF
71
72 Py_INCREF(Py_None);
73 return Py_None;
74}
75
Tim Peters5c4d5bf2001-02-12 22:13:26 +000076static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000077test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +000078{
79 PyObject* list;
80 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +000081
82 /* SF bug 132008: PyList_Reverse segfaults */
83#define NLIST 30
84 list = PyList_New(NLIST);
85 if (list == (PyObject*)NULL)
86 return (PyObject*)NULL;
87 /* list = range(NLIST) */
88 for (i = 0; i < NLIST; ++i) {
Christian Heimes217cfd12007-12-02 14:31:20 +000089 PyObject* anint = PyLong_FromLong(i);
Tim Peters5c4d5bf2001-02-12 22:13:26 +000090 if (anint == (PyObject*)NULL) {
91 Py_DECREF(list);
92 return (PyObject*)NULL;
93 }
94 PyList_SET_ITEM(list, i, anint);
95 }
96 /* list.reverse(), via PyList_Reverse() */
97 i = PyList_Reverse(list); /* should not blow up! */
98 if (i != 0) {
99 Py_DECREF(list);
100 return (PyObject*)NULL;
101 }
102 /* Check that list == range(29, -1, -1) now */
103 for (i = 0; i < NLIST; ++i) {
104 PyObject* anint = PyList_GET_ITEM(list, i);
Christian Heimes217cfd12007-12-02 14:31:20 +0000105 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000106 PyErr_SetString(TestError,
107 "test_list_api: reverse screwed up");
108 Py_DECREF(list);
109 return (PyObject*)NULL;
110 }
111 }
112 Py_DECREF(list);
113#undef NLIST
114
115 Py_INCREF(Py_None);
116 return Py_None;
117}
118
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000119static int
120test_dict_inner(int count)
121{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000122 Py_ssize_t pos = 0, iterations = 0;
123 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000124 PyObject *dict = PyDict_New();
125 PyObject *v, *k;
126
127 if (dict == NULL)
128 return -1;
129
130 for (i = 0; i < count; i++) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000131 v = PyLong_FromLong(i);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000132 PyDict_SetItem(dict, v, v);
133 Py_DECREF(v);
134 }
135
136 while (PyDict_Next(dict, &pos, &k, &v)) {
137 PyObject *o;
138 iterations++;
139
Christian Heimes217cfd12007-12-02 14:31:20 +0000140 i = PyLong_AS_LONG(v) + 1;
141 o = PyLong_FromLong(i);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000142 if (o == NULL)
143 return -1;
144 if (PyDict_SetItem(dict, k, o) < 0) {
145 Py_DECREF(o);
146 return -1;
147 }
148 Py_DECREF(o);
149 }
150
151 Py_DECREF(dict);
152
153 if (iterations != count) {
154 PyErr_SetString(
155 TestError,
156 "test_dict_iteration: dict iteration went wrong ");
157 return -1;
158 } else {
159 return 0;
160 }
161}
162
163static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000164test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000165{
166 int i;
167
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000168 for (i = 0; i < 200; i++) {
169 if (test_dict_inner(i) < 0) {
170 return NULL;
171 }
172 }
173
174 Py_INCREF(Py_None);
175 return Py_None;
176}
177
Tim Peters91621db2001-06-12 20:10:01 +0000178
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000179/* Issue #4701: Check that PyObject_Hash implicitly calls
180 * PyType_Ready if it hasn't already been called
181 */
182static PyTypeObject _HashInheritanceTester_Type = {
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +0000183 PyVarObject_HEAD_INIT(NULL, 0)
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000184 "hashinheritancetester", /* Name of this type */
185 sizeof(PyObject), /* Basic object size */
186 0, /* Item size for varobject */
187 (destructor)PyObject_Del, /* tp_dealloc */
188 0, /* tp_print */
189 0, /* tp_getattr */
190 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000191 0, /* tp_reserved */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000192 0, /* tp_repr */
193 0, /* tp_as_number */
194 0, /* tp_as_sequence */
195 0, /* tp_as_mapping */
196 0, /* tp_hash */
197 0, /* tp_call */
198 0, /* tp_str */
199 PyObject_GenericGetAttr, /* tp_getattro */
200 0, /* tp_setattro */
201 0, /* tp_as_buffer */
202 Py_TPFLAGS_DEFAULT, /* tp_flags */
203 0, /* tp_doc */
204 0, /* tp_traverse */
205 0, /* tp_clear */
206 0, /* tp_richcompare */
207 0, /* tp_weaklistoffset */
208 0, /* tp_iter */
209 0, /* tp_iternext */
210 0, /* tp_methods */
211 0, /* tp_members */
212 0, /* tp_getset */
213 0, /* tp_base */
214 0, /* tp_dict */
215 0, /* tp_descr_get */
216 0, /* tp_descr_set */
217 0, /* tp_dictoffset */
218 0, /* tp_init */
219 0, /* tp_alloc */
220 PyType_GenericNew, /* tp_new */
221};
222
223static PyObject*
224test_lazy_hash_inheritance(PyObject* self)
225{
226 PyTypeObject *type;
227 PyObject *obj;
228 long hash;
229
230 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000231
Benjamin Petersonb43d3252009-05-05 23:14:15 +0000232 if (type->tp_dict != NULL)
233 /* The type has already been initialized. This probably means
234 -R is being used. */
235 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000236
237
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000238 obj = PyObject_New(PyObject, type);
239 if (obj == NULL) {
240 PyErr_Clear();
241 PyErr_SetString(
242 TestError,
243 "test_lazy_hash_inheritance: failed to create object");
244 return NULL;
245 }
246
247 if (type->tp_dict != NULL) {
248 PyErr_SetString(
249 TestError,
250 "test_lazy_hash_inheritance: type initialised too soon");
251 Py_DECREF(obj);
252 return NULL;
253 }
254
255 hash = PyObject_Hash(obj);
256 if ((hash == -1) && PyErr_Occurred()) {
257 PyErr_Clear();
258 PyErr_SetString(
259 TestError,
260 "test_lazy_hash_inheritance: could not hash object");
261 Py_DECREF(obj);
262 return NULL;
263 }
264
265 if (type->tp_dict == NULL) {
266 PyErr_SetString(
267 TestError,
268 "test_lazy_hash_inheritance: type not initialised by hash()");
269 Py_DECREF(obj);
270 return NULL;
271 }
272
273 if (type->tp_hash != PyType_Type.tp_hash) {
274 PyErr_SetString(
275 TestError,
276 "test_lazy_hash_inheritance: unexpected hash function");
277 Py_DECREF(obj);
278 return NULL;
279 }
280
Benjamin Petersonb43d3252009-05-05 23:14:15 +0000281 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000282
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000283 Py_RETURN_NONE;
284}
285
286
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000287/* Issue #7385: Check that memoryview() does not crash
288 * when bf_getbuffer returns an error
289 */
290
291static int
292broken_buffer_getbuffer(PyObject *self, Py_buffer *view, int flags)
293{
294 PyErr_SetString(
295 TestError,
296 "test_broken_memoryview: expected error in bf_getbuffer");
297 return -1;
298}
299
300static PyBufferProcs memoryviewtester_as_buffer = {
301 (getbufferproc)broken_buffer_getbuffer, /* bf_getbuffer */
302 0, /* bf_releasebuffer */
303};
304
305static PyTypeObject _MemoryViewTester_Type = {
Antoine Pitrou8f0b31a2010-02-04 17:02:07 +0000306 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000307 "memoryviewtester", /* Name of this type */
308 sizeof(PyObject), /* Basic object size */
309 0, /* Item size for varobject */
310 (destructor)PyObject_Del, /* tp_dealloc */
311 0, /* tp_print */
312 0, /* tp_getattr */
313 0, /* tp_setattr */
314 0, /* tp_compare */
315 0, /* tp_repr */
316 0, /* tp_as_number */
317 0, /* tp_as_sequence */
318 0, /* tp_as_mapping */
319 0, /* tp_hash */
320 0, /* tp_call */
321 0, /* tp_str */
322 PyObject_GenericGetAttr, /* tp_getattro */
323 0, /* tp_setattro */
324 &memoryviewtester_as_buffer, /* tp_as_buffer */
325 Py_TPFLAGS_DEFAULT, /* tp_flags */
326 0, /* tp_doc */
327 0, /* tp_traverse */
328 0, /* tp_clear */
329 0, /* tp_richcompare */
330 0, /* tp_weaklistoffset */
331 0, /* tp_iter */
332 0, /* tp_iternext */
333 0, /* tp_methods */
334 0, /* tp_members */
335 0, /* tp_getset */
336 0, /* tp_base */
337 0, /* tp_dict */
338 0, /* tp_descr_get */
339 0, /* tp_descr_set */
340 0, /* tp_dictoffset */
341 0, /* tp_init */
342 0, /* tp_alloc */
343 PyType_GenericNew, /* tp_new */
344};
345
346static PyObject*
347test_broken_memoryview(PyObject* self)
348{
349 PyObject *obj = PyObject_New(PyObject, &_MemoryViewTester_Type);
350 PyObject *res;
351
352 if (obj == NULL) {
353 PyErr_Clear();
354 PyErr_SetString(
355 TestError,
356 "test_broken_memoryview: failed to create object");
357 return NULL;
358 }
359
360 res = PyMemoryView_FromObject(obj);
361 if (res || !PyErr_Occurred()){
362 PyErr_SetString(
363 TestError,
364 "test_broken_memoryview: memoryview() didn't raise an Exception");
365 Py_XDECREF(res);
366 Py_DECREF(obj);
367 return NULL;
368 }
369
370 PyErr_Clear();
371 Py_DECREF(obj);
372 Py_RETURN_NONE;
373}
374
375
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000376/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
Tim Petersff70d3c2001-06-14 01:11:03 +0000377 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000378
379 Note that the meat of the test is contained in testcapi_long.h.
380 This is revolting, but delicate code duplication is worse: "almost
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000381 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000382 dependence on type names makes it impossible to use a parameterized
383 function. A giant macro would be even worse than this. A C++ template
384 would be perfect.
385
386 The "report an error" functions are deliberately not part of the #include
387 file: if the test fails, you can set a breakpoint in the appropriate
388 error function directly, and crawl back from there in the debugger.
389*/
390
391#define UNBIND(X) Py_DECREF(X); (X) = NULL
392
393static PyObject *
394raise_test_long_error(const char* msg)
395{
396 return raiseTestError("test_long_api", msg);
397}
398
399#define TESTNAME test_long_api_inner
400#define TYPENAME long
401#define F_S_TO_PY PyLong_FromLong
402#define F_PY_TO_S PyLong_AsLong
403#define F_U_TO_PY PyLong_FromUnsignedLong
404#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000405
406#include "testcapi_long.h"
407
408static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000409test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000410{
Tim Peters83c9edc2001-06-16 08:10:13 +0000411 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000412}
413
414#undef TESTNAME
415#undef TYPENAME
416#undef F_S_TO_PY
417#undef F_PY_TO_S
418#undef F_U_TO_PY
419#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000420
421#ifdef HAVE_LONG_LONG
Tim Peters91621db2001-06-12 20:10:01 +0000422
423static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000424raise_test_longlong_error(const char* msg)
425{
426 return raiseTestError("test_longlong_api", msg);
427}
428
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000429#define TESTNAME test_longlong_api_inner
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000430#define TYPENAME PY_LONG_LONG
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000431#define F_S_TO_PY PyLong_FromLongLong
432#define F_PY_TO_S PyLong_AsLongLong
433#define F_U_TO_PY PyLong_FromUnsignedLongLong
434#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000435
436#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000437
438static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000439test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000440{
Tim Peters83c9edc2001-06-16 08:10:13 +0000441 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000442}
443
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000444#undef TESTNAME
445#undef TYPENAME
446#undef F_S_TO_PY
447#undef F_PY_TO_S
448#undef F_U_TO_PY
449#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000450
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000451/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
452 is tested by test_long_api_inner. This test will concentrate on proper
453 handling of overflow.
454*/
455
456static PyObject *
457test_long_and_overflow(PyObject *self)
458{
459 PyObject *num, *one, *temp;
460 long value;
461 int overflow;
462
463 /* Test that overflow is set properly for a large value. */
464 /* num is a number larger than LONG_MAX even on 64-bit platforms */
465 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
466 if (num == NULL)
467 return NULL;
468 overflow = 1234;
469 value = PyLong_AsLongAndOverflow(num, &overflow);
470 Py_DECREF(num);
471 if (value == -1 && PyErr_Occurred())
472 return NULL;
473 if (value != -1)
474 return raiseTestError("test_long_and_overflow",
475 "return value was not set to -1");
476 if (overflow != 1)
477 return raiseTestError("test_long_and_overflow",
478 "overflow was not set to 1");
479
480 /* Same again, with num = LONG_MAX + 1 */
481 num = PyLong_FromLong(LONG_MAX);
482 if (num == NULL)
483 return NULL;
484 one = PyLong_FromLong(1L);
485 if (one == NULL) {
486 Py_DECREF(num);
487 return NULL;
488 }
489 temp = PyNumber_Add(num, one);
490 Py_DECREF(one);
491 Py_DECREF(num);
492 num = temp;
493 if (num == NULL)
494 return NULL;
495 overflow = 0;
496 value = PyLong_AsLongAndOverflow(num, &overflow);
497 Py_DECREF(num);
498 if (value == -1 && PyErr_Occurred())
499 return NULL;
500 if (value != -1)
501 return raiseTestError("test_long_and_overflow",
502 "return value was not set to -1");
503 if (overflow != 1)
504 return raiseTestError("test_long_and_overflow",
505 "overflow was not set to 1");
506
507 /* Test that overflow is set properly for a large negative value. */
508 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
509 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
510 if (num == NULL)
511 return NULL;
512 overflow = 1234;
513 value = PyLong_AsLongAndOverflow(num, &overflow);
514 Py_DECREF(num);
515 if (value == -1 && PyErr_Occurred())
516 return NULL;
517 if (value != -1)
518 return raiseTestError("test_long_and_overflow",
519 "return value was not set to -1");
520 if (overflow != -1)
521 return raiseTestError("test_long_and_overflow",
522 "overflow was not set to -1");
523
524 /* Same again, with num = LONG_MIN - 1 */
525 num = PyLong_FromLong(LONG_MIN);
526 if (num == NULL)
527 return NULL;
528 one = PyLong_FromLong(1L);
529 if (one == NULL) {
530 Py_DECREF(num);
531 return NULL;
532 }
533 temp = PyNumber_Subtract(num, one);
534 Py_DECREF(one);
535 Py_DECREF(num);
536 num = temp;
537 if (num == NULL)
538 return NULL;
539 overflow = 0;
540 value = PyLong_AsLongAndOverflow(num, &overflow);
541 Py_DECREF(num);
542 if (value == -1 && PyErr_Occurred())
543 return NULL;
544 if (value != -1)
545 return raiseTestError("test_long_and_overflow",
546 "return value was not set to -1");
547 if (overflow != -1)
548 return raiseTestError("test_long_and_overflow",
549 "overflow was not set to -1");
550
551 /* Test that overflow is cleared properly for small values. */
552 num = PyLong_FromString("FF", NULL, 16);
553 if (num == NULL)
554 return NULL;
555 overflow = 1234;
556 value = PyLong_AsLongAndOverflow(num, &overflow);
557 Py_DECREF(num);
558 if (value == -1 && PyErr_Occurred())
559 return NULL;
560 if (value != 0xFF)
561 return raiseTestError("test_long_and_overflow",
562 "expected return value 0xFF");
563 if (overflow != 0)
564 return raiseTestError("test_long_and_overflow",
565 "overflow was not cleared");
566
567 num = PyLong_FromString("-FF", NULL, 16);
568 if (num == NULL)
569 return NULL;
570 overflow = 0;
571 value = PyLong_AsLongAndOverflow(num, &overflow);
572 Py_DECREF(num);
573 if (value == -1 && PyErr_Occurred())
574 return NULL;
575 if (value != -0xFF)
576 return raiseTestError("test_long_and_overflow",
577 "expected return value 0xFF");
578 if (overflow != 0)
579 return raiseTestError("test_long_and_overflow",
580 "overflow was set incorrectly");
581
582 num = PyLong_FromLong(LONG_MAX);
583 if (num == NULL)
584 return NULL;
585 overflow = 1234;
586 value = PyLong_AsLongAndOverflow(num, &overflow);
587 Py_DECREF(num);
588 if (value == -1 && PyErr_Occurred())
589 return NULL;
590 if (value != LONG_MAX)
591 return raiseTestError("test_long_and_overflow",
592 "expected return value LONG_MAX");
593 if (overflow != 0)
594 return raiseTestError("test_long_and_overflow",
595 "overflow was not cleared");
596
597 num = PyLong_FromLong(LONG_MIN);
598 if (num == NULL)
599 return NULL;
600 overflow = 0;
601 value = PyLong_AsLongAndOverflow(num, &overflow);
602 Py_DECREF(num);
603 if (value == -1 && PyErr_Occurred())
604 return NULL;
605 if (value != LONG_MIN)
606 return raiseTestError("test_long_and_overflow",
607 "expected return value LONG_MIN");
608 if (overflow != 0)
609 return raiseTestError("test_long_and_overflow",
610 "overflow was not cleared");
611
612 Py_INCREF(Py_None);
613 return Py_None;
614}
615
Mark Dickinson93f562c2010-01-30 10:30:15 +0000616/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
617 PY_LONG_LONG is tested by test_long_api_inner. This test will
618 concentrate on proper handling of overflow.
619*/
620
621static PyObject *
622test_long_long_and_overflow(PyObject *self)
623{
624 PyObject *num, *one, *temp;
625 PY_LONG_LONG value;
626 int overflow;
627
628 /* Test that overflow is set properly for a large value. */
629 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
630 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
631 if (num == NULL)
632 return NULL;
633 overflow = 1234;
634 value = PyLong_AsLongLongAndOverflow(num, &overflow);
635 Py_DECREF(num);
636 if (value == -1 && PyErr_Occurred())
637 return NULL;
638 if (value != -1)
639 return raiseTestError("test_long_long_and_overflow",
640 "return value was not set to -1");
641 if (overflow != 1)
642 return raiseTestError("test_long_long_and_overflow",
643 "overflow was not set to 1");
644
645 /* Same again, with num = PY_LLONG_MAX + 1 */
646 num = PyLong_FromLongLong(PY_LLONG_MAX);
647 if (num == NULL)
648 return NULL;
649 one = PyLong_FromLong(1L);
650 if (one == NULL) {
651 Py_DECREF(num);
652 return NULL;
653 }
654 temp = PyNumber_Add(num, one);
655 Py_DECREF(one);
656 Py_DECREF(num);
657 num = temp;
658 if (num == NULL)
659 return NULL;
660 overflow = 0;
661 value = PyLong_AsLongLongAndOverflow(num, &overflow);
662 Py_DECREF(num);
663 if (value == -1 && PyErr_Occurred())
664 return NULL;
665 if (value != -1)
666 return raiseTestError("test_long_long_and_overflow",
667 "return value was not set to -1");
668 if (overflow != 1)
669 return raiseTestError("test_long_long_and_overflow",
670 "overflow was not set to 1");
671
672 /* Test that overflow is set properly for a large negative value. */
673 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
674 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
675 if (num == NULL)
676 return NULL;
677 overflow = 1234;
678 value = PyLong_AsLongLongAndOverflow(num, &overflow);
679 Py_DECREF(num);
680 if (value == -1 && PyErr_Occurred())
681 return NULL;
682 if (value != -1)
683 return raiseTestError("test_long_long_and_overflow",
684 "return value was not set to -1");
685 if (overflow != -1)
686 return raiseTestError("test_long_long_and_overflow",
687 "overflow was not set to -1");
688
689 /* Same again, with num = PY_LLONG_MIN - 1 */
690 num = PyLong_FromLongLong(PY_LLONG_MIN);
691 if (num == NULL)
692 return NULL;
693 one = PyLong_FromLong(1L);
694 if (one == NULL) {
695 Py_DECREF(num);
696 return NULL;
697 }
698 temp = PyNumber_Subtract(num, one);
699 Py_DECREF(one);
700 Py_DECREF(num);
701 num = temp;
702 if (num == NULL)
703 return NULL;
704 overflow = 0;
705 value = PyLong_AsLongLongAndOverflow(num, &overflow);
706 Py_DECREF(num);
707 if (value == -1 && PyErr_Occurred())
708 return NULL;
709 if (value != -1)
710 return raiseTestError("test_long_long_and_overflow",
711 "return value was not set to -1");
712 if (overflow != -1)
713 return raiseTestError("test_long_long_and_overflow",
714 "overflow was not set to -1");
715
716 /* Test that overflow is cleared properly for small values. */
717 num = PyLong_FromString("FF", NULL, 16);
718 if (num == NULL)
719 return NULL;
720 overflow = 1234;
721 value = PyLong_AsLongLongAndOverflow(num, &overflow);
722 Py_DECREF(num);
723 if (value == -1 && PyErr_Occurred())
724 return NULL;
725 if (value != 0xFF)
726 return raiseTestError("test_long_long_and_overflow",
727 "expected return value 0xFF");
728 if (overflow != 0)
729 return raiseTestError("test_long_long_and_overflow",
730 "overflow was not cleared");
731
732 num = PyLong_FromString("-FF", NULL, 16);
733 if (num == NULL)
734 return NULL;
735 overflow = 0;
736 value = PyLong_AsLongLongAndOverflow(num, &overflow);
737 Py_DECREF(num);
738 if (value == -1 && PyErr_Occurred())
739 return NULL;
740 if (value != -0xFF)
741 return raiseTestError("test_long_long_and_overflow",
742 "expected return value 0xFF");
743 if (overflow != 0)
744 return raiseTestError("test_long_long_and_overflow",
745 "overflow was set incorrectly");
746
747 num = PyLong_FromLongLong(PY_LLONG_MAX);
748 if (num == NULL)
749 return NULL;
750 overflow = 1234;
751 value = PyLong_AsLongLongAndOverflow(num, &overflow);
752 Py_DECREF(num);
753 if (value == -1 && PyErr_Occurred())
754 return NULL;
755 if (value != PY_LLONG_MAX)
756 return raiseTestError("test_long_long_and_overflow",
757 "expected return value PY_LLONG_MAX");
758 if (overflow != 0)
759 return raiseTestError("test_long_long_and_overflow",
760 "overflow was not cleared");
761
762 num = PyLong_FromLongLong(PY_LLONG_MIN);
763 if (num == NULL)
764 return NULL;
765 overflow = 0;
766 value = PyLong_AsLongLongAndOverflow(num, &overflow);
767 Py_DECREF(num);
768 if (value == -1 && PyErr_Occurred())
769 return NULL;
770 if (value != PY_LLONG_MIN)
771 return raiseTestError("test_long_long_and_overflow",
772 "expected return value PY_LLONG_MIN");
773 if (overflow != 0)
774 return raiseTestError("test_long_long_and_overflow",
775 "overflow was not cleared");
776
777 Py_INCREF(Py_None);
778 return Py_None;
779}
780
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000781/* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
Tim Petersd38b1c72001-09-30 05:09:37 +0000782 for both long and int arguments. The test may leak a little memory if
783 it fails.
784*/
785static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000786test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000787{
788 PyObject *tuple, *num;
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000789 PY_LONG_LONG value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000790
Tim Petersd38b1c72001-09-30 05:09:37 +0000791 tuple = PyTuple_New(1);
792 if (tuple == NULL)
793 return NULL;
794
795 num = PyLong_FromLong(42);
796 if (num == NULL)
797 return NULL;
798
799 PyTuple_SET_ITEM(tuple, 0, num);
800
801 value = -1;
802 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
803 return NULL;
804 if (value != 42)
805 return raiseTestError("test_L_code",
806 "L code returned wrong value for long 42");
807
808 Py_DECREF(num);
Christian Heimes217cfd12007-12-02 14:31:20 +0000809 num = PyLong_FromLong(42);
Tim Petersd38b1c72001-09-30 05:09:37 +0000810 if (num == NULL)
811 return NULL;
812
813 PyTuple_SET_ITEM(tuple, 0, num);
814
815 value = -1;
816 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
817 return NULL;
818 if (value != 42)
819 return raiseTestError("test_L_code",
820 "L code returned wrong value for int 42");
821
822 Py_DECREF(tuple);
823 Py_INCREF(Py_None);
824 return Py_None;
825}
826
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000827#endif /* ifdef HAVE_LONG_LONG */
828
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000829/* Test tuple argument processing */
830static PyObject *
831getargs_tuple(PyObject *self, PyObject *args)
832{
833 int a, b, c;
834 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
835 return NULL;
836 return Py_BuildValue("iii", a, b, c);
837}
838
Christian Heimes380f7f22008-02-28 11:19:05 +0000839/* test PyArg_ParseTupleAndKeywords */
840static PyObject *getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
841{
842 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
843 static char *fmt="(ii)i|(i(ii))(iii)i";
844 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
845
846 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
847 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
848 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
849 return NULL;
850 return Py_BuildValue("iiiiiiiiii",
851 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
852 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
853}
854
Thomas Heller3457e4b2003-04-24 16:14:27 +0000855/* Functions to call PyArg_ParseTuple with integer format codes,
856 and return the result.
857*/
Thomas Hellera4ea6032003-04-17 18:55:45 +0000858static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000859getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000860{
Thomas Heller3457e4b2003-04-24 16:14:27 +0000861 unsigned char value;
862 if (!PyArg_ParseTuple(args, "b", &value))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000863 return NULL;
Thomas Heller3457e4b2003-04-24 16:14:27 +0000864 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000865}
866
Thomas Heller3457e4b2003-04-24 16:14:27 +0000867static PyObject *
868getargs_B(PyObject *self, PyObject *args)
869{
870 unsigned char value;
871 if (!PyArg_ParseTuple(args, "B", &value))
872 return NULL;
873 return PyLong_FromUnsignedLong((unsigned long)value);
874}
875
876static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +0000877getargs_h(PyObject *self, PyObject *args)
878{
879 short value;
880 if (!PyArg_ParseTuple(args, "h", &value))
881 return NULL;
882 return PyLong_FromLong((long)value);
883}
884
885static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000886getargs_H(PyObject *self, PyObject *args)
887{
888 unsigned short value;
889 if (!PyArg_ParseTuple(args, "H", &value))
890 return NULL;
891 return PyLong_FromUnsignedLong((unsigned long)value);
892}
893
894static PyObject *
895getargs_I(PyObject *self, PyObject *args)
896{
897 unsigned int value;
898 if (!PyArg_ParseTuple(args, "I", &value))
899 return NULL;
900 return PyLong_FromUnsignedLong((unsigned long)value);
901}
902
903static PyObject *
904getargs_k(PyObject *self, PyObject *args)
905{
906 unsigned long value;
907 if (!PyArg_ParseTuple(args, "k", &value))
908 return NULL;
909 return PyLong_FromUnsignedLong(value);
910}
911
912static PyObject *
913getargs_i(PyObject *self, PyObject *args)
914{
915 int value;
916 if (!PyArg_ParseTuple(args, "i", &value))
917 return NULL;
918 return PyLong_FromLong((long)value);
919}
920
Thomas Hellera4ea6032003-04-17 18:55:45 +0000921static PyObject *
922getargs_l(PyObject *self, PyObject *args)
923{
Thomas Heller3457e4b2003-04-24 16:14:27 +0000924 long value;
925 if (!PyArg_ParseTuple(args, "l", &value))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000926 return NULL;
Thomas Heller3457e4b2003-04-24 16:14:27 +0000927 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000928}
929
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000930static PyObject *
931getargs_n(PyObject *self, PyObject *args)
932{
933 Py_ssize_t value;
934 if (!PyArg_ParseTuple(args, "n", &value))
Neal Norwitz8866e0a2007-10-27 04:01:17 +0000935 return NULL;
936 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000937}
938
Thomas Hellera4ea6032003-04-17 18:55:45 +0000939#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +0000940static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000941getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000942{
Thomas Heller3457e4b2003-04-24 16:14:27 +0000943 PY_LONG_LONG value;
944 if (!PyArg_ParseTuple(args, "L", &value))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000945 return NULL;
Thomas Heller3457e4b2003-04-24 16:14:27 +0000946 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000947}
948
Thomas Hellera4ea6032003-04-17 18:55:45 +0000949static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000950getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000951{
Thomas Heller3457e4b2003-04-24 16:14:27 +0000952 unsigned PY_LONG_LONG value;
953 if (!PyArg_ParseTuple(args, "K", &value))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000954 return NULL;
Thomas Heller3457e4b2003-04-24 16:14:27 +0000955 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000956}
957#endif
958
959/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +0000960 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +0000961static PyObject *
962test_k_code(PyObject *self)
963{
964 PyObject *tuple, *num;
965 unsigned long value;
966
967 tuple = PyTuple_New(1);
968 if (tuple == NULL)
969 return NULL;
970
Neal Norwitz699cbb72003-04-22 01:28:57 +0000971 /* a number larger than ULONG_MAX even on 64-bit platforms */
Thomas Hellera4ea6032003-04-17 18:55:45 +0000972 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
973 if (num == NULL)
974 return NULL;
975
Christian Heimes217cfd12007-12-02 14:31:20 +0000976 value = PyLong_AsUnsignedLongMask(num);
Neal Norwitz699cbb72003-04-22 01:28:57 +0000977 if (value != ULONG_MAX)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000978 return raiseTestError("test_k_code",
Christian Heimes217cfd12007-12-02 14:31:20 +0000979 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000980
981 PyTuple_SET_ITEM(tuple, 0, num);
982
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000983 value = 0;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000984 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
985 return NULL;
Neal Norwitz699cbb72003-04-22 01:28:57 +0000986 if (value != ULONG_MAX)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000987 return raiseTestError("test_k_code",
988 "k code returned wrong value for long 0xFFF...FFF");
989
990 Py_DECREF(num);
991 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
992 if (num == NULL)
993 return NULL;
994
Christian Heimes217cfd12007-12-02 14:31:20 +0000995 value = PyLong_AsUnsignedLongMask(num);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000996 if (value != (unsigned long)-0x42)
997 return raiseTestError("test_k_code",
Christian Heimes217cfd12007-12-02 14:31:20 +0000998 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000999
1000 PyTuple_SET_ITEM(tuple, 0, num);
1001
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001002 value = 0;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001003 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1004 return NULL;
1005 if (value != (unsigned long)-0x42)
1006 return raiseTestError("test_k_code",
1007 "k code returned wrong value for long -0xFFF..000042");
1008
1009 Py_DECREF(tuple);
1010 Py_INCREF(Py_None);
1011 return Py_None;
1012}
1013
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001014
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001015/* Test the s and z codes for PyArg_ParseTuple.
1016*/
1017static PyObject *
1018test_s_code(PyObject *self)
1019{
1020 /* Unicode strings should be accepted */
1021 PyObject *tuple, *obj;
1022 char *value;
1023
1024 tuple = PyTuple_New(1);
1025 if (tuple == NULL)
1026 return NULL;
1027
1028 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
1029 "latin-1", NULL);
1030 if (obj == NULL)
1031 return NULL;
1032
1033 PyTuple_SET_ITEM(tuple, 0, obj);
1034
1035 /* These two blocks used to raise a TypeError:
1036 * "argument must be string without null bytes, not str"
1037 */
1038 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
1039 return NULL;
1040
1041 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
1042 return NULL;
1043
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001044 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001045 Py_RETURN_NONE;
1046}
1047
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001048static PyObject *
1049test_bug_7414(PyObject *self)
1050{
1051 /* Issue #7414: for PyArg_ParseTupleAndKeywords, 'C' code wasn't being
1052 skipped properly in skipitem() */
1053 int a = 0, b = 0, result;
1054 char *kwlist[] = {"a", "b", NULL};
1055 PyObject *tuple = NULL, *dict = NULL, *b_str;
1056
1057 tuple = PyTuple_New(0);
1058 if (tuple == NULL)
1059 goto failure;
1060 dict = PyDict_New();
1061 if (dict == NULL)
1062 goto failure;
1063 b_str = PyUnicode_FromString("b");
1064 if (b_str == NULL)
1065 goto failure;
1066 result = PyDict_SetItemString(dict, "b", b_str);
1067 Py_DECREF(b_str);
1068 if (result < 0)
1069 goto failure;
1070
1071 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|CC",
1072 kwlist, &a, &b);
1073 if (!result)
1074 goto failure;
1075
1076 if (a != 0)
1077 return raiseTestError("test_bug_7414",
1078 "C format code not skipped properly");
1079 if (b != 'b')
1080 return raiseTestError("test_bug_7414",
1081 "C format code returned wrong value");
1082
1083 Py_DECREF(dict);
1084 Py_DECREF(tuple);
1085 Py_RETURN_NONE;
1086
1087 failure:
1088 Py_XDECREF(dict);
1089 Py_XDECREF(tuple);
1090 return NULL;
1091}
1092
1093
Benjamin Peterson92035012008-12-27 16:00:54 +00001094static volatile int x;
1095
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001096/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1097 of an error.
1098*/
1099static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001100test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001101{
1102 PyObject *tuple, *obj;
1103 Py_UNICODE *value;
Neal Norwitz8866e0a2007-10-27 04:01:17 +00001104 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001105
Benjamin Peterson206e3072008-10-19 14:07:49 +00001106 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1107 /* Just use the macro and check that it compiles */
Christian Heimes727c2c52008-11-12 09:04:04 +00001108 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001109
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001110 tuple = PyTuple_New(1);
1111 if (tuple == NULL)
1112 return NULL;
1113
1114 obj = PyUnicode_Decode("test", strlen("test"),
1115 "ascii", NULL);
1116 if (obj == NULL)
1117 return NULL;
1118
1119 PyTuple_SET_ITEM(tuple, 0, obj);
1120
1121 value = 0;
1122 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1123 return NULL;
1124 if (value != PyUnicode_AS_UNICODE(obj))
1125 return raiseTestError("test_u_code",
1126 "u code returned wrong value for u'test'");
1127 value = 0;
1128 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1129 return NULL;
1130 if (value != PyUnicode_AS_UNICODE(obj) ||
1131 len != PyUnicode_GET_SIZE(obj))
1132 return raiseTestError("test_u_code",
1133 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001134
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001135 Py_DECREF(tuple);
1136 Py_INCREF(Py_None);
1137 return Py_None;
1138}
1139
Guido van Rossumfb67be22007-08-29 18:38:11 +00001140/* Test Z and Z# codes for PyArg_ParseTuple */
1141static PyObject *
1142test_Z_code(PyObject *self)
1143{
1144 PyObject *tuple, *obj;
1145 Py_UNICODE *value1, *value2;
Neal Norwitz8866e0a2007-10-27 04:01:17 +00001146 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001147
1148 tuple = PyTuple_New(2);
1149 if (tuple == NULL)
1150 return NULL;
1151
1152 obj = PyUnicode_FromString("test");
1153 PyTuple_SET_ITEM(tuple, 0, obj);
1154 Py_INCREF(Py_None);
1155 PyTuple_SET_ITEM(tuple, 1, Py_None);
1156
1157 /* swap values on purpose */
1158 value1 = NULL;
1159 value2 = PyUnicode_AS_UNICODE(obj);
1160
1161 /* Test Z for both values */
1162 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1163 return NULL;
1164 if (value1 != PyUnicode_AS_UNICODE(obj))
1165 return raiseTestError("test_Z_code",
1166 "Z code returned wrong value for 'test'");
1167 if (value2 != NULL)
1168 return raiseTestError("test_Z_code",
1169 "Z code returned wrong value for None");
1170
1171 value1 = NULL;
1172 value2 = PyUnicode_AS_UNICODE(obj);
1173 len1 = -1;
1174 len2 = -1;
1175
1176 /* Test Z# for both values */
1177 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1178 &value2, &len2) < 0)
1179 return NULL;
1180 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1181 len1 != PyUnicode_GET_SIZE(obj))
1182 return raiseTestError("test_Z_code",
1183 "Z# code returned wrong values for 'test'");
1184 if (value2 != NULL ||
1185 len2 != 0)
1186 return raiseTestError("test_Z_code",
1187 "Z# code returned wrong values for None'");
1188
1189 Py_DECREF(tuple);
1190 Py_RETURN_NONE;
1191}
1192
Thomas Wouters477c8d52006-05-27 19:21:47 +00001193static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001194test_widechar(PyObject *self)
1195{
1196#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1197 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1198 size_t wtextlen = 1;
1199#else
1200 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1201 size_t wtextlen = 2;
1202#endif
1203 PyObject *wide, *utf8;
1204
1205 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1206 if (wide == NULL)
1207 return NULL;
1208
1209 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1210 if (utf8 == NULL) {
1211 Py_DECREF(wide);
1212 return NULL;
1213 }
1214
1215 if (PyUnicode_GET_SIZE(wide) != PyUnicode_GET_SIZE(utf8)) {
1216 Py_DECREF(wide);
1217 Py_DECREF(utf8);
1218 return raiseTestError("test_widechar",
1219 "wide string and utf8 string "
1220 "have different length");
1221 }
1222 if (PyUnicode_Compare(wide, utf8)) {
1223 Py_DECREF(wide);
1224 Py_DECREF(utf8);
1225 if (PyErr_Occurred())
1226 return NULL;
1227 return raiseTestError("test_widechar",
1228 "wide string and utf8 string "
1229 "are different");
1230 }
1231
1232 Py_DECREF(wide);
1233 Py_DECREF(utf8);
1234 Py_RETURN_NONE;
1235}
1236
1237static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001238test_empty_argparse(PyObject *self)
1239{
1240 /* Test that formats can begin with '|'. See issue #4720. */
1241 PyObject *tuple, *dict = NULL;
1242 static char *kwlist[] = {NULL};
1243 int result;
1244 tuple = PyTuple_New(0);
1245 if (!tuple)
1246 return NULL;
1247 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1248 goto done;
1249 dict = PyDict_New();
1250 if (!dict)
1251 goto done;
1252 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
1253 done:
1254 Py_DECREF(tuple);
1255 Py_XDECREF(dict);
1256 if (result < 0)
1257 return NULL;
1258 else {
1259 Py_RETURN_NONE;
1260 }
1261}
1262
1263static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001264codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001265{
1266 const char *encoding, *errors = NULL;
1267 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1268 &encoding, &errors))
1269 return NULL;
1270 return PyCodec_IncrementalEncoder(encoding, errors);
1271}
1272
Thomas Wouters477c8d52006-05-27 19:21:47 +00001273static PyObject *
1274codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001275{
1276 const char *encoding, *errors = NULL;
1277 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1278 &encoding, &errors))
1279 return NULL;
1280 return PyCodec_IncrementalDecoder(encoding, errors);
1281}
1282
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001283
Tim Peters5b8132f2003-01-31 15:52:05 +00001284/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001285static PyObject *
1286test_long_numbits(PyObject *self)
1287{
Tim Peters5b8132f2003-01-31 15:52:05 +00001288 struct triple {
Tim Petersbaefd9e2003-01-28 20:37:45 +00001289 long input;
Tim Peters5b8132f2003-01-31 15:52:05 +00001290 size_t nbits;
1291 int sign;
1292 } testcases[] = {{0, 0, 0},
1293 {1L, 1, 1},
1294 {-1L, 1, -1},
1295 {2L, 2, 1},
1296 {-2L, 2, -1},
1297 {3L, 2, 1},
1298 {-3L, 2, -1},
1299 {4L, 3, 1},
1300 {-4L, 3, -1},
1301 {0x7fffL, 15, 1}, /* one Python long digit */
1302 {-0x7fffL, 15, -1},
1303 {0xffffL, 16, 1},
1304 {-0xffffL, 16, -1},
1305 {0xfffffffL, 28, 1},
1306 {-0xfffffffL, 28, -1}};
Tim Petersbaefd9e2003-01-28 20:37:45 +00001307 int i;
1308
Tim Peters5b8132f2003-01-31 15:52:05 +00001309 for (i = 0; i < sizeof(testcases) / sizeof(struct triple); ++i) {
1310 PyObject *plong = PyLong_FromLong(testcases[i].input);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001311 size_t nbits = _PyLong_NumBits(plong);
Tim Peters5b8132f2003-01-31 15:52:05 +00001312 int sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001313
1314 Py_DECREF(plong);
Tim Peters5b8132f2003-01-31 15:52:05 +00001315 if (nbits != testcases[i].nbits)
Tim Petersbaefd9e2003-01-28 20:37:45 +00001316 return raiseTestError("test_long_numbits",
Tim Peters5b8132f2003-01-31 15:52:05 +00001317 "wrong result for _PyLong_NumBits");
1318 if (sign != testcases[i].sign)
1319 return raiseTestError("test_long_numbits",
1320 "wrong result for _PyLong_Sign");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001321 }
1322 Py_INCREF(Py_None);
1323 return Py_None;
1324}
1325
Thomas Heller519a0422007-11-15 20:48:54 +00001326/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00001327
1328static PyObject *
1329test_null_strings(PyObject *self)
1330{
Thomas Heller519a0422007-11-15 20:48:54 +00001331 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
Thomas Woutersa9773292006-04-21 09:43:23 +00001332 PyObject *tuple = PyTuple_Pack(2, o1, o2);
1333 Py_XDECREF(o1);
1334 Py_XDECREF(o2);
1335 return tuple;
1336}
1337
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001338static PyObject *
1339raise_exception(PyObject *self, PyObject *args)
1340{
1341 PyObject *exc;
1342 PyObject *exc_args, *v;
1343 int num_args, i;
1344
1345 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
1346 &exc, &num_args))
1347 return NULL;
1348
1349 exc_args = PyTuple_New(num_args);
1350 if (exc_args == NULL)
1351 return NULL;
1352 for (i = 0; i < num_args; ++i) {
Christian Heimes217cfd12007-12-02 14:31:20 +00001353 v = PyLong_FromLong(i);
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001354 if (v == NULL) {
1355 Py_DECREF(exc_args);
1356 return NULL;
1357 }
1358 PyTuple_SET_ITEM(exc_args, i, v);
1359 }
1360 PyErr_SetObject(exc, exc_args);
Michael W. Hudsonf02bcee2003-08-15 13:03:30 +00001361 Py_DECREF(exc_args);
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001362 return NULL;
1363}
Tim Peters91621db2001-06-12 20:10:01 +00001364
Benjamin Peterson16323982010-02-03 01:13:41 +00001365
1366static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001367
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001368static PyObject *
1369test_datetime_capi(PyObject *self, PyObject *args) {
1370 if (PyDateTimeAPI) {
Benjamin Peterson16323982010-02-03 01:13:41 +00001371 if (test_run_counter) {
1372 /* Probably regrtest.py -R */
1373 Py_RETURN_NONE;
1374 }
1375 else {
1376 PyErr_SetString(PyExc_AssertionError,
1377 "PyDateTime_CAPI somehow initialized");
1378 return NULL;
1379 }
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001380 }
Benjamin Peterson16323982010-02-03 01:13:41 +00001381 test_run_counter++;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001382 PyDateTime_IMPORT;
1383 if (PyDateTimeAPI)
1384 Py_RETURN_NONE;
1385 else
1386 return NULL;
1387}
1388
Benjamin Peterson16323982010-02-03 01:13:41 +00001389
1390#ifdef WITH_THREAD
1391
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001392/* test_thread_state spawns a thread of its own, and that thread releases
1393 * `thread_done` when it's finished. The driver code has to know when the
1394 * thread finishes, because the thread uses a PyObject (the callable) that
1395 * may go away when the driver finishes. The former lack of this explicit
1396 * synchronization caused rare segfaults, so rare that they were seen only
1397 * on a Mac buildbot (although they were possible on any box).
1398 */
1399static PyThread_type_lock thread_done = NULL;
1400
Benjamin Petersona786b022008-08-25 21:05:21 +00001401static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001402_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001403{
1404 PyObject *rc;
Benjamin Petersona786b022008-08-25 21:05:21 +00001405 int success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001406 PyGILState_STATE s = PyGILState_Ensure();
Thomas Wouters89f507f2006-12-13 04:49:30 +00001407 rc = PyObject_CallFunction((PyObject *)callable, "");
Benjamin Petersona786b022008-08-25 21:05:21 +00001408 success = (rc != NULL);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001409 Py_XDECREF(rc);
1410 PyGILState_Release(s);
Benjamin Petersona786b022008-08-25 21:05:21 +00001411 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001412}
1413
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001414/* Same thing, but releases `thread_done` when it returns. This variant
1415 * should be called only from threads spawned by test_thread_state().
1416 */
1417static void
1418_make_call_from_thread(void *callable)
1419{
1420 _make_call(callable);
1421 PyThread_release_lock(thread_done);
1422}
1423
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001424static PyObject *
1425test_thread_state(PyObject *self, PyObject *args)
1426{
1427 PyObject *fn;
Benjamin Petersona786b022008-08-25 21:05:21 +00001428 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001429
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001430 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1431 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001432
Benjamin Petersona786b022008-08-25 21:05:21 +00001433 if (!PyCallable_Check(fn)) {
1434 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1435 fn->ob_type->tp_name);
1436 return NULL;
1437 }
1438
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001439 /* Ensure Python is set up for threading */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001440 PyEval_InitThreads();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001441 thread_done = PyThread_allocate_lock();
1442 if (thread_done == NULL)
1443 return PyErr_NoMemory();
1444 PyThread_acquire_lock(thread_done, 1);
1445
1446 /* Start a new thread with our callback. */
1447 PyThread_start_new_thread(_make_call_from_thread, fn);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001448 /* Make the callback with the thread lock held by this thread */
Benjamin Petersona786b022008-08-25 21:05:21 +00001449 success &= _make_call(fn);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001450 /* Do it all again, but this time with the thread-lock released */
1451 Py_BEGIN_ALLOW_THREADS
Benjamin Petersona786b022008-08-25 21:05:21 +00001452 success &= _make_call(fn);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001453 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001454 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001455
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001456 /* And once more with and without a thread
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001457 XXX - should use a lock and work out exactly what we are trying
1458 to test <wink>
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001459 */
1460 Py_BEGIN_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001461 PyThread_start_new_thread(_make_call_from_thread, fn);
Benjamin Petersona786b022008-08-25 21:05:21 +00001462 success &= _make_call(fn);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001463 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001464 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001465
Thomas Wouters89f507f2006-12-13 04:49:30 +00001466 /* Release lock we acquired above. This is required on HP-UX. */
1467 PyThread_release_lock(thread_done);
1468
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001469 PyThread_free_lock(thread_done);
Benjamin Petersona786b022008-08-25 21:05:21 +00001470 if (!success)
1471 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001472 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001473}
Benjamin Petersona54c9092009-01-13 02:11:23 +00001474
1475/* test Py_AddPendingCalls using threads */
1476static int _pending_callback(void *arg)
1477{
1478 /* we assume the argument is callable object to which we own a reference */
1479 PyObject *callable = (PyObject *)arg;
1480 PyObject *r = PyObject_CallObject(callable, NULL);
1481 Py_DECREF(callable);
1482 Py_XDECREF(r);
1483 return r != NULL ? 0 : -1;
1484}
1485
1486/* The following requests n callbacks to _pending_callback. It can be
1487 * run from any python thread.
1488 */
1489PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
1490{
1491 PyObject *callable;
1492 int r;
1493 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
1494 return NULL;
1495
1496 /* create the reference for the callbackwhile we hold the lock */
1497 Py_INCREF(callable);
1498
1499 Py_BEGIN_ALLOW_THREADS
1500 r = Py_AddPendingCall(&_pending_callback, callable);
1501 Py_END_ALLOW_THREADS
1502
1503 if (r<0) {
1504 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
1505 Py_INCREF(Py_False);
1506 return Py_False;
1507 }
1508 Py_INCREF(Py_True);
1509 return Py_True;
1510}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001511#endif
1512
Neal Norwitzb0d26332007-08-25 00:49:05 +00001513/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001514static PyObject *
1515test_string_from_format(PyObject *self, PyObject *args)
1516{
1517 PyObject *result;
1518 char *msg;
1519
1520#define CHECK_1_FORMAT(FORMAT, TYPE) \
Neal Norwitzb0d26332007-08-25 00:49:05 +00001521 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
Thomas Wouters477c8d52006-05-27 19:21:47 +00001522 if (result == NULL) \
1523 return NULL; \
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001524 if (strcmp(_PyUnicode_AsString(result), "1")) { \
Thomas Wouters477c8d52006-05-27 19:21:47 +00001525 msg = FORMAT " failed at 1"; \
1526 goto Fail; \
1527 } \
1528 Py_DECREF(result)
1529
1530 CHECK_1_FORMAT("%d", int);
1531 CHECK_1_FORMAT("%ld", long);
1532 /* The z width modifier was added in Python 2.5. */
1533 CHECK_1_FORMAT("%zd", Py_ssize_t);
1534
1535 /* The u type code was added in Python 2.5. */
1536 CHECK_1_FORMAT("%u", unsigned int);
1537 CHECK_1_FORMAT("%lu", unsigned long);
1538 CHECK_1_FORMAT("%zu", size_t);
1539
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001540 /* "%lld" and "%llu" support added in Python 2.7. */
1541#ifdef HAVE_LONG_LONG
1542 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
1543 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
1544#endif
1545
Thomas Wouters477c8d52006-05-27 19:21:47 +00001546 Py_RETURN_NONE;
1547
1548 Fail:
1549 Py_XDECREF(result);
1550 return raiseTestError("test_string_from_format", msg);
1551
1552#undef CHECK_1_FORMAT
1553}
1554
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001555
1556static PyObject *
1557test_unicode_compare_with_ascii(PyObject *self) {
1558 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
1559 int result;
1560 if (py_s == NULL)
1561 return NULL;
1562 result = PyUnicode_CompareWithASCIIString(py_s, "str");
1563 Py_DECREF(py_s);
1564 if (!result) {
1565 PyErr_SetString(TestError, "Python string ending in NULL "
1566 "should not compare equal to c string.");
1567 return NULL;
1568 }
1569 Py_RETURN_NONE;
1570};
1571
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001572/* This is here to provide a docstring for test_descr. */
1573static PyObject *
1574test_with_docstring(PyObject *self)
1575{
1576 Py_RETURN_NONE;
1577}
1578
Mark Dickinson725bfd82009-05-03 20:33:40 +00001579/* Test PyOS_string_to_double. */
1580static PyObject *
1581test_string_to_double(PyObject *self) {
1582 double result;
1583 char *msg;
1584
1585#define CHECK_STRING(STR, expected) \
1586 result = PyOS_string_to_double(STR, NULL, NULL); \
1587 if (result == -1.0 && PyErr_Occurred()) \
1588 return NULL; \
1589 if (result != expected) { \
1590 msg = "conversion of " STR " to float failed"; \
1591 goto fail; \
1592 }
1593
1594#define CHECK_INVALID(STR) \
1595 result = PyOS_string_to_double(STR, NULL, NULL); \
1596 if (result == -1.0 && PyErr_Occurred()) { \
1597 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
1598 PyErr_Clear(); \
1599 else \
1600 return NULL; \
1601 } \
1602 else { \
1603 msg = "conversion of " STR " didn't raise ValueError"; \
1604 goto fail; \
1605 }
1606
1607 CHECK_STRING("0.1", 0.1);
1608 CHECK_STRING("1.234", 1.234);
1609 CHECK_STRING("-1.35", -1.35);
1610 CHECK_STRING(".1e01", 1.0);
1611 CHECK_STRING("2.e-2", 0.02);
1612
1613 CHECK_INVALID(" 0.1");
1614 CHECK_INVALID("\t\n-3");
1615 CHECK_INVALID(".123 ");
1616 CHECK_INVALID("3\n");
1617 CHECK_INVALID("123abc");
1618
1619 Py_RETURN_NONE;
1620 fail:
1621 return raiseTestError("test_string_to_double", msg);
1622#undef CHECK_STRING
1623#undef CHECK_INVALID
1624}
1625
1626
Benjamin Petersonb173f782009-05-05 22:31:58 +00001627/* Coverage testing of capsule objects. */
1628
1629static const char *capsule_name = "capsule name";
1630static char *capsule_pointer = "capsule pointer";
1631static char *capsule_context = "capsule context";
1632static const char *capsule_error = NULL;
1633static int
1634capsule_destructor_call_count = 0;
1635
1636static void
1637capsule_destructor(PyObject *o) {
1638 capsule_destructor_call_count++;
1639 if (PyCapsule_GetContext(o) != capsule_context) {
1640 capsule_error = "context did not match in destructor!";
1641 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
1642 capsule_error = "destructor did not match in destructor! (woah!)";
1643 } else if (PyCapsule_GetName(o) != capsule_name) {
1644 capsule_error = "name did not match in destructor!";
1645 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
1646 capsule_error = "pointer did not match in destructor!";
1647 }
1648}
1649
1650typedef struct {
1651 char *name;
1652 char *module;
1653 char *attribute;
1654} known_capsule;
1655
1656static PyObject *
1657test_capsule(PyObject *self, PyObject *args)
1658{
1659 PyObject *object;
1660 const char *error = NULL;
1661 void *pointer;
1662 void *pointer2;
1663 known_capsule known_capsules[] = {
1664 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
1665 KNOWN_CAPSULE("_socket", "CAPI"),
1666 KNOWN_CAPSULE("_curses", "_C_API"),
1667 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
1668 { NULL, NULL },
1669 };
1670 known_capsule *known = &known_capsules[0];
1671
1672#define FAIL(x) { error = (x); goto exit; }
1673
1674#define CHECK_DESTRUCTOR \
1675 if (capsule_error) { \
1676 FAIL(capsule_error); \
1677 } \
1678 else if (!capsule_destructor_call_count) { \
1679 FAIL("destructor not called!"); \
1680 } \
1681 capsule_destructor_call_count = 0; \
1682
1683 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
1684 PyCapsule_SetContext(object, capsule_context);
1685 capsule_destructor(object);
1686 CHECK_DESTRUCTOR;
1687 Py_DECREF(object);
1688 CHECK_DESTRUCTOR;
1689
1690 object = PyCapsule_New(known, "ignored", NULL);
1691 PyCapsule_SetPointer(object, capsule_pointer);
1692 PyCapsule_SetName(object, capsule_name);
1693 PyCapsule_SetDestructor(object, capsule_destructor);
1694 PyCapsule_SetContext(object, capsule_context);
1695 capsule_destructor(object);
1696 CHECK_DESTRUCTOR;
1697 /* intentionally access using the wrong name */
1698 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
1699 if (!PyErr_Occurred()) {
1700 FAIL("PyCapsule_GetPointer should have failed but did not!");
1701 }
1702 PyErr_Clear();
1703 if (pointer2) {
1704 if (pointer2 == capsule_pointer) {
1705 FAIL("PyCapsule_GetPointer should not have"
1706 " returned the internal pointer!");
1707 } else {
1708 FAIL("PyCapsule_GetPointer should have "
1709 "returned NULL pointer but did not!");
1710 }
1711 }
1712 PyCapsule_SetDestructor(object, NULL);
1713 Py_DECREF(object);
1714 if (capsule_destructor_call_count) {
1715 FAIL("destructor called when it should not have been!");
1716 }
1717
1718 for (known = &known_capsules[0]; known->module != NULL; known++) {
1719 /* yeah, ordinarily I wouldn't do this either,
1720 but it's fine for this test harness.
1721 */
1722 static char buffer[256];
1723#undef FAIL
1724#define FAIL(x) \
1725 { \
1726 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
1727 x, known->module, known->attribute); \
1728 error = buffer; \
1729 goto exit; \
1730 } \
1731
1732 PyObject *module = PyImport_ImportModule(known->module);
1733 if (module) {
1734 pointer = PyCapsule_Import(known->name, 0);
1735 if (!pointer) {
1736 Py_DECREF(module);
1737 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
1738 }
1739 object = PyObject_GetAttrString(module, known->attribute);
1740 if (!object) {
1741 Py_DECREF(module);
1742 return NULL;
1743 }
1744 pointer2 = PyCapsule_GetPointer(object,
1745 "weebles wobble but they don't fall down");
1746 if (!PyErr_Occurred()) {
1747 Py_DECREF(object);
1748 Py_DECREF(module);
1749 FAIL("PyCapsule_GetPointer should have failed but did not!");
1750 }
1751 PyErr_Clear();
1752 if (pointer2) {
1753 Py_DECREF(module);
1754 Py_DECREF(object);
1755 if (pointer2 == pointer) {
1756 FAIL("PyCapsule_GetPointer should not have"
1757 " returned its internal pointer!");
1758 } else {
1759 FAIL("PyCapsule_GetPointer should have"
1760 " returned NULL pointer but did not!");
1761 }
1762 }
1763 Py_DECREF(object);
1764 Py_DECREF(module);
1765 }
Mark Dickinsonedff7af2010-02-13 18:34:53 +00001766 else
1767 PyErr_Clear();
Benjamin Petersonb173f782009-05-05 22:31:58 +00001768 }
1769
1770 exit:
1771 if (error) {
1772 return raiseTestError("test_capsule", error);
1773 }
1774 Py_RETURN_NONE;
1775#undef FAIL
1776}
1777
Guido van Rossumddefaf32007-01-14 03:31:43 +00001778#ifdef HAVE_GETTIMEOFDAY
1779/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00001780static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00001781{
1782 e->tv_sec -= s->tv_sec;
1783 e->tv_usec -= s->tv_usec;
1784 if (e->tv_usec < 0) {
1785 e->tv_sec -=1;
1786 e->tv_usec += 1000000;
1787 }
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001788 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001789}
1790
1791static PyObject *
1792profile_int(PyObject *self, PyObject* args)
1793{
1794 int i, k;
1795 struct timeval start, stop;
1796 PyObject *single, **multiple, *op1, *result;
1797
1798 /* Test 1: Allocate and immediately deallocate
1799 many small integers */
1800 gettimeofday(&start, NULL);
1801 for(k=0; k < 20000; k++)
1802 for(i=0; i < 1000; i++) {
Christian Heimes217cfd12007-12-02 14:31:20 +00001803 single = PyLong_FromLong(i);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001804 Py_DECREF(single);
1805 }
1806 gettimeofday(&stop, NULL);
1807 print_delta(1, &start, &stop);
1808
1809 /* Test 2: Allocate and immediately deallocate
1810 many large integers */
1811 gettimeofday(&start, NULL);
1812 for(k=0; k < 20000; k++)
1813 for(i=0; i < 1000; i++) {
Christian Heimes217cfd12007-12-02 14:31:20 +00001814 single = PyLong_FromLong(i+1000000);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001815 Py_DECREF(single);
1816 }
1817 gettimeofday(&stop, NULL);
1818 print_delta(2, &start, &stop);
1819
1820 /* Test 3: Allocate a few integers, then release
1821 them all simultaneously. */
1822 multiple = malloc(sizeof(PyObject*) * 1000);
1823 gettimeofday(&start, NULL);
1824 for(k=0; k < 20000; k++) {
1825 for(i=0; i < 1000; i++) {
Christian Heimes217cfd12007-12-02 14:31:20 +00001826 multiple[i] = PyLong_FromLong(i+1000000);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001827 }
1828 for(i=0; i < 1000; i++) {
1829 Py_DECREF(multiple[i]);
1830 }
1831 }
1832 gettimeofday(&stop, NULL);
1833 print_delta(3, &start, &stop);
1834
1835 /* Test 4: Allocate many integers, then release
1836 them all simultaneously. */
1837 multiple = malloc(sizeof(PyObject*) * 1000000);
1838 gettimeofday(&start, NULL);
1839 for(k=0; k < 20; k++) {
1840 for(i=0; i < 1000000; i++) {
Christian Heimes217cfd12007-12-02 14:31:20 +00001841 multiple[i] = PyLong_FromLong(i+1000000);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001842 }
1843 for(i=0; i < 1000000; i++) {
1844 Py_DECREF(multiple[i]);
1845 }
1846 }
1847 gettimeofday(&stop, NULL);
1848 print_delta(4, &start, &stop);
1849
1850 /* Test 5: Allocate many integers < 32000 */
1851 multiple = malloc(sizeof(PyObject*) * 1000000);
1852 gettimeofday(&start, NULL);
1853 for(k=0; k < 10; k++) {
1854 for(i=0; i < 1000000; i++) {
Christian Heimes217cfd12007-12-02 14:31:20 +00001855 multiple[i] = PyLong_FromLong(i+1000);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001856 }
1857 for(i=0; i < 1000000; i++) {
1858 Py_DECREF(multiple[i]);
1859 }
1860 }
1861 gettimeofday(&stop, NULL);
1862 print_delta(5, &start, &stop);
1863
1864 /* Test 6: Perform small int addition */
Christian Heimes217cfd12007-12-02 14:31:20 +00001865 op1 = PyLong_FromLong(1);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001866 gettimeofday(&start, NULL);
1867 for(i=0; i < 10000000; i++) {
1868 result = PyNumber_Add(op1, op1);
1869 Py_DECREF(result);
1870 }
1871 gettimeofday(&stop, NULL);
1872 Py_DECREF(op1);
1873 print_delta(6, &start, &stop);
1874
1875 /* Test 7: Perform medium int addition */
Christian Heimes217cfd12007-12-02 14:31:20 +00001876 op1 = PyLong_FromLong(1000);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001877 gettimeofday(&start, NULL);
1878 for(i=0; i < 10000000; i++) {
1879 result = PyNumber_Add(op1, op1);
1880 Py_DECREF(result);
1881 }
1882 gettimeofday(&stop, NULL);
1883 Py_DECREF(op1);
1884 print_delta(7, &start, &stop);
1885
1886 Py_INCREF(Py_None);
1887 return Py_None;
1888}
1889#endif
1890
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001891/* To test the format of tracebacks as printed out. */
1892static PyObject *
1893traceback_print(PyObject *self, PyObject *args)
1894{
1895 PyObject *file;
1896 PyObject *traceback;
1897 int result;
1898
1899 if (!PyArg_ParseTuple(args, "OO:traceback_print",
1900 &traceback, &file))
1901 return NULL;
1902
1903 result = PyTraceBack_Print(traceback, file);
1904 if (result < 0)
1905 return NULL;
1906 Py_RETURN_NONE;
1907}
1908
Benjamin Petersone6528212008-07-15 15:32:09 +00001909/* To test the format of exceptions as printed out. */
1910static PyObject *
1911exception_print(PyObject *self, PyObject *args)
1912{
1913 PyObject *value;
1914 PyObject *tb;
1915
1916 if (!PyArg_ParseTuple(args, "O:exception_print",
1917 &value))
1918 return NULL;
Benjamin Peterson6784eb72008-08-23 20:32:27 +00001919 if (!PyExceptionInstance_Check(value)) {
1920 PyErr_Format(PyExc_TypeError, "an exception instance is required");
1921 return NULL;
1922 }
Benjamin Petersone6528212008-07-15 15:32:09 +00001923
1924 tb = PyException_GetTraceback(value);
1925 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
1926 Py_XDECREF(tb);
1927
1928 Py_RETURN_NONE;
1929}
1930
1931
1932
Benjamin Peterson0067bd62008-08-16 16:11:03 +00001933
1934/* reliably raise a MemoryError */
1935static PyObject *
1936raise_memoryerror(PyObject *self)
1937{
1938 PyErr_NoMemory();
1939 return NULL;
1940}
1941
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00001942/* Issue 6012 */
1943static PyObject *str1, *str2;
1944static int
1945failing_converter(PyObject *obj, void *arg)
1946{
1947 /* Clone str1, then let the conversion fail. */
1948 assert(str1);
1949 str2 = str1;
1950 Py_INCREF(str2);
1951 return 0;
1952}
1953static PyObject*
1954argparsing(PyObject *o, PyObject *args)
1955{
1956 PyObject *res;
1957 str1 = str2 = NULL;
1958 if (!PyArg_ParseTuple(args, "O&O&",
1959 PyUnicode_FSConverter, &str1,
1960 failing_converter, &str2)) {
1961 if (!str2)
1962 /* argument converter not called? */
1963 return NULL;
1964 /* Should be 1 */
1965 res = PyLong_FromLong(Py_REFCNT(str2));
1966 Py_DECREF(str2);
1967 PyErr_Clear();
1968 return res;
1969 }
1970 Py_RETURN_NONE;
1971}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00001972
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00001973/* To test that the result of PyCode_NewEmpty has the right members. */
1974static PyObject *
1975code_newempty(PyObject *self, PyObject *args)
1976{
1977 const char *filename;
1978 const char *funcname;
1979 int firstlineno;
1980
1981 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
1982 &filename, &funcname, &firstlineno))
1983 return NULL;
1984
1985 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
1986}
1987
Georg Brandl1e28a272009-12-28 08:41:01 +00001988/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
1989 Run via Lib/test/test_exceptions.py */
1990static PyObject *
1991make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
1992{
1993 const char *name;
1994 const char *doc = NULL;
1995 PyObject *base = NULL;
1996 PyObject *dict = NULL;
1997
1998 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
1999
2000 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2001 "s|sOO:make_exception_with_doc", kwlist,
2002 &name, &doc, &base, &dict))
2003 return NULL;
2004
2005 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
2006}
2007
Tim Peters9ea17ac2001-02-02 05:57:15 +00002008static PyMethodDef TestMethods[] = {
Fred Drakeacee69f2002-04-01 14:28:58 +00002009 {"raise_exception", raise_exception, METH_VARARGS},
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002010 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Fred Drakeacee69f2002-04-01 14:28:58 +00002011 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002012 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Fred Drakeacee69f2002-04-01 14:28:58 +00002013 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
2014 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
Nick Coghlanf1f2f682008-12-30 07:29:12 +00002015 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrou05b7c562010-02-02 22:47:00 +00002016 {"test_broken_memoryview", (PyCFunction)test_broken_memoryview,METH_NOARGS},
Fred Drakeacee69f2002-04-01 14:28:58 +00002017 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Mark Dickinson309aa2d2009-12-21 12:37:06 +00002018 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
2019 METH_NOARGS},
Tim Petersbaefd9e2003-01-28 20:37:45 +00002020 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
Thomas Hellera4ea6032003-04-17 18:55:45 +00002021 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
Benjamin Peterson92035012008-12-27 16:00:54 +00002022 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Mark Dickinsonf08173b2009-12-03 10:59:46 +00002023 {"test_bug_7414", (PyCFunction)test_bug_7414, METH_NOARGS},
Thomas Woutersa9773292006-04-21 09:43:23 +00002024 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00002025 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002026 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
2027 PyDoc_STR("This is a pretty normal docstring.")},
Benjamin Petersonb173f782009-05-05 22:31:58 +00002028 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002029 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
Benjamin Petersonb173f782009-05-05 22:31:58 +00002030 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002031 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Christian Heimes380f7f22008-02-28 11:19:05 +00002032 {"getargs_keywords", (PyCFunction)getargs_keywords,
2033 METH_VARARGS|METH_KEYWORDS},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002034 {"getargs_b", getargs_b, METH_VARARGS},
2035 {"getargs_B", getargs_B, METH_VARARGS},
Mark Dickinson1554b182009-12-20 16:03:30 +00002036 {"getargs_h", getargs_h, METH_VARARGS},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002037 {"getargs_H", getargs_H, METH_VARARGS},
2038 {"getargs_I", getargs_I, METH_VARARGS},
2039 {"getargs_k", getargs_k, METH_VARARGS},
2040 {"getargs_i", getargs_i, METH_VARARGS},
2041 {"getargs_l", getargs_l, METH_VARARGS},
2042 {"getargs_n", getargs_n, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00002043#ifdef HAVE_LONG_LONG
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002044 {"getargs_L", getargs_L, METH_VARARGS},
2045 {"getargs_K", getargs_K, METH_VARARGS},
2046 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Mark Dickinson93f562c2010-01-30 10:30:15 +00002047 {"test_long_long_and_overflow",
2048 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
Fred Drakeacee69f2002-04-01 14:28:58 +00002049 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002050 {"codec_incrementalencoder",
2051 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
2052 {"codec_incrementaldecoder",
2053 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00002054#endif
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00002055 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
Fred Drakeacee69f2002-04-01 14:28:58 +00002056 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
Guido van Rossumfb67be22007-08-29 18:38:11 +00002057 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
Mark Dickinson081dfee2009-03-18 14:47:41 +00002058 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002059#ifdef WITH_THREAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002060 {"_test_thread_state", test_thread_state, METH_VARARGS},
Benjamin Petersona54c9092009-01-13 02:11:23 +00002061 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002062#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00002063#ifdef HAVE_GETTIMEOFDAY
2064 {"profile_int", profile_int, METH_NOARGS},
2065#endif
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002066 {"traceback_print", traceback_print, METH_VARARGS},
Benjamin Petersone6528212008-07-15 15:32:09 +00002067 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002068 {"argparsing", argparsing, METH_VARARGS},
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002069 {"code_newempty", code_newempty, METH_VARARGS},
Georg Brandl1e28a272009-12-28 08:41:01 +00002070 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
2071 METH_VARARGS | METH_KEYWORDS},
Tim Peters9ea17ac2001-02-02 05:57:15 +00002072 {NULL, NULL} /* sentinel */
2073};
2074
Thomas Hellera4ea6032003-04-17 18:55:45 +00002075#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
2076
Thomas Wouters89f507f2006-12-13 04:49:30 +00002077typedef struct {
Christian Heimes1af737c2008-01-23 08:24:23 +00002078 char bool_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002079 char byte_member;
2080 unsigned char ubyte_member;
2081 short short_member;
2082 unsigned short ushort_member;
2083 int int_member;
2084 unsigned int uint_member;
2085 long long_member;
2086 unsigned long ulong_member;
Mark Dickinsond59b4162010-03-13 11:34:40 +00002087 Py_ssize_t pyssizet_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002088 float float_member;
2089 double double_member;
Mark Dickinson5fc16b42010-04-03 10:49:56 +00002090 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002091#ifdef HAVE_LONG_LONG
2092 PY_LONG_LONG longlong_member;
2093 unsigned PY_LONG_LONG ulonglong_member;
2094#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00002095} all_structmembers;
2096
2097typedef struct {
2098 PyObject_HEAD
2099 all_structmembers structmembers;
2100} test_structmembers;
2101
2102static struct PyMemberDef test_members[] = {
Christian Heimes1af737c2008-01-23 08:24:23 +00002103 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
Thomas Wouters89f507f2006-12-13 04:49:30 +00002104 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
2105 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
2106 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
2107 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
2108 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
2109 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
2110 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
2111 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
Mark Dickinsond59b4162010-03-13 11:34:40 +00002112 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
Thomas Wouters89f507f2006-12-13 04:49:30 +00002113 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
2114 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
Benjamin Peterson80d8fd82010-04-03 01:40:24 +00002115 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002116#ifdef HAVE_LONG_LONG
2117 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
2118 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
2119#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00002120 {NULL}
2121};
2122
2123
Christian Heimes1af737c2008-01-23 08:24:23 +00002124static PyObject *
2125test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
2126{
2127 static char *keywords[] = {
2128 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
Mark Dickinsond59b4162010-03-13 11:34:40 +00002129 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
Mark Dickinson5fc16b42010-04-03 10:49:56 +00002130 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00002131#ifdef HAVE_LONG_LONG
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002132 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00002133#endif
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002134 NULL};
Benjamin Peterson80d8fd82010-04-03 01:40:24 +00002135 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00002136#ifdef HAVE_LONG_LONG
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002137 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00002138#endif
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002139 ;
Christian Heimes1af737c2008-01-23 08:24:23 +00002140 test_structmembers *ob;
Mark Dickinson5fc16b42010-04-03 10:49:56 +00002141 const char *s = NULL;
Benjamin Peterson80d8fd82010-04-03 01:40:24 +00002142 Py_ssize_t string_len = 0;
Christian Heimes1af737c2008-01-23 08:24:23 +00002143 ob = PyObject_New(test_structmembers, type);
2144 if (ob == NULL)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002145 return NULL;
2146 memset(&ob->structmembers, 0, sizeof(all_structmembers));
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002147 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
Christian Heimes1af737c2008-01-23 08:24:23 +00002148 &ob->structmembers.bool_member,
2149 &ob->structmembers.byte_member,
2150 &ob->structmembers.ubyte_member,
2151 &ob->structmembers.short_member,
2152 &ob->structmembers.ushort_member,
2153 &ob->structmembers.int_member,
Mark Dickinsond59b4162010-03-13 11:34:40 +00002154 &ob->structmembers.uint_member,
Christian Heimes1af737c2008-01-23 08:24:23 +00002155 &ob->structmembers.long_member,
2156 &ob->structmembers.ulong_member,
Mark Dickinsond59b4162010-03-13 11:34:40 +00002157 &ob->structmembers.pyssizet_member,
Christian Heimes1af737c2008-01-23 08:24:23 +00002158 &ob->structmembers.float_member,
Benjamin Peterson80d8fd82010-04-03 01:40:24 +00002159 &ob->structmembers.double_member,
2160 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00002161#ifdef HAVE_LONG_LONG
2162 , &ob->structmembers.longlong_member,
2163 &ob->structmembers.ulonglong_member
2164#endif
2165 )) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002166 Py_DECREF(ob);
2167 return NULL;
Christian Heimes1af737c2008-01-23 08:24:23 +00002168 }
Mark Dickinson5fc16b42010-04-03 10:49:56 +00002169 if (s != NULL) {
2170 if (string_len > 5) {
2171 Py_DECREF(ob);
2172 PyErr_SetString(PyExc_ValueError, "string too long");
2173 return NULL;
2174 }
2175 strcpy(ob->structmembers.inplace_member, s);
Benjamin Peterson80d8fd82010-04-03 01:40:24 +00002176 }
Mark Dickinson5fc16b42010-04-03 10:49:56 +00002177 else {
2178 strcpy(ob->structmembers.inplace_member, "");
2179 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002180 return (PyObject *)ob;
2181}
2182
Christian Heimes1af737c2008-01-23 08:24:23 +00002183static void
2184test_structmembers_free(PyObject *ob)
2185{
Thomas Wouters89f507f2006-12-13 04:49:30 +00002186 PyObject_FREE(ob);
2187}
2188
2189static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002190 PyVarObject_HEAD_INIT(NULL, 0)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002191 "test_structmembersType",
2192 sizeof(test_structmembers), /* tp_basicsize */
2193 0, /* tp_itemsize */
2194 test_structmembers_free, /* destructor tp_dealloc */
2195 0, /* tp_print */
2196 0, /* tp_getattr */
2197 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002198 0, /* tp_reserved */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002199 0, /* tp_repr */
2200 0, /* tp_as_number */
2201 0, /* tp_as_sequence */
2202 0, /* tp_as_mapping */
2203 0, /* tp_hash */
2204 0, /* tp_call */
2205 0, /* tp_str */
Christian Heimes1af737c2008-01-23 08:24:23 +00002206 PyObject_GenericGetAttr, /* tp_getattro */
2207 PyObject_GenericSetAttr, /* tp_setattro */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002208 0, /* tp_as_buffer */
2209 0, /* tp_flags */
2210 "Type containing all structmember types",
2211 0, /* traverseproc tp_traverse */
2212 0, /* tp_clear */
2213 0, /* tp_richcompare */
2214 0, /* tp_weaklistoffset */
2215 0, /* tp_iter */
2216 0, /* tp_iternext */
2217 0, /* tp_methods */
Christian Heimes1af737c2008-01-23 08:24:23 +00002218 test_members, /* tp_members */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002219 0,
2220 0,
2221 0,
2222 0,
2223 0,
2224 0,
2225 0,
2226 0,
Christian Heimes1af737c2008-01-23 08:24:23 +00002227 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002228};
2229
2230
Martin v. Löwis1a214512008-06-11 05:26:20 +00002231
2232static struct PyModuleDef _testcapimodule = {
2233 PyModuleDef_HEAD_INIT,
2234 "_testcapi",
2235 NULL,
2236 -1,
2237 TestMethods,
2238 NULL,
2239 NULL,
2240 NULL,
2241 NULL
2242};
2243
Mark Hammond62b1ab12002-07-23 06:31:15 +00002244PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002245PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00002246{
Fred Drakeacee69f2002-04-01 14:28:58 +00002247 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002248
Martin v. Löwis1a214512008-06-11 05:26:20 +00002249 m = PyModule_Create(&_testcapimodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002250 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002251 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002252
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00002253 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Antoine Pitrou8f0b31a2010-02-04 17:02:07 +00002254 Py_TYPE(&_MemoryViewTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00002255
Christian Heimes90aa7642007-12-19 02:45:37 +00002256 Py_TYPE(&test_structmembersType)=&PyType_Type;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002257 Py_INCREF(&test_structmembersType);
Mark Dickinson5fc16b42010-04-03 10:49:56 +00002258 /* don't use a name starting with "test", since we don't want
2259 test_capi to automatically call this */
2260 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002261
Christian Heimes217cfd12007-12-02 14:31:20 +00002262 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
2263 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
2264 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
2265 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
2266 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
2267 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002268 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
2269 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
Thomas Hellera4ea6032003-04-17 18:55:45 +00002270 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
Christian Heimes217cfd12007-12-02 14:31:20 +00002271 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
2272 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002273 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
2274 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
2275 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
2276 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
2277 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002278 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
2279 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
2280 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
Christian Heimes217cfd12007-12-02 14:31:20 +00002281 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
2282 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002283 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Benjamin Peterson9b6df6a2008-10-16 23:56:29 +00002284 Py_INCREF(&PyInstanceMethod_Type);
2285 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00002286
Tim Petersd66595f2001-02-04 03:09:53 +00002287 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
Fred Drakeacee69f2002-04-01 14:28:58 +00002288 Py_INCREF(TestError);
2289 PyModule_AddObject(m, "error", TestError);
Martin v. Löwis1a214512008-06-11 05:26:20 +00002290 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002291}