blob: 55475c742f6f8572eaec0ed2263cdb4db4573ea4 [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 = {
306 PyVarObject_HEAD_INIT(&PyType_Type, 0)
307 "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
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001365#ifdef WITH_THREAD
1366
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001367static PyObject *
1368test_datetime_capi(PyObject *self, PyObject *args) {
1369 if (PyDateTimeAPI) {
1370 PyErr_SetString(PyExc_AssertionError,
1371 "PyDateTime_CAPI somehow initialized");
1372 return NULL;
1373 }
1374 PyDateTime_IMPORT;
1375 if (PyDateTimeAPI)
1376 Py_RETURN_NONE;
1377 else
1378 return NULL;
1379}
1380
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001381/* test_thread_state spawns a thread of its own, and that thread releases
1382 * `thread_done` when it's finished. The driver code has to know when the
1383 * thread finishes, because the thread uses a PyObject (the callable) that
1384 * may go away when the driver finishes. The former lack of this explicit
1385 * synchronization caused rare segfaults, so rare that they were seen only
1386 * on a Mac buildbot (although they were possible on any box).
1387 */
1388static PyThread_type_lock thread_done = NULL;
1389
Benjamin Petersona786b022008-08-25 21:05:21 +00001390static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001391_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001392{
1393 PyObject *rc;
Benjamin Petersona786b022008-08-25 21:05:21 +00001394 int success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001395 PyGILState_STATE s = PyGILState_Ensure();
Thomas Wouters89f507f2006-12-13 04:49:30 +00001396 rc = PyObject_CallFunction((PyObject *)callable, "");
Benjamin Petersona786b022008-08-25 21:05:21 +00001397 success = (rc != NULL);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001398 Py_XDECREF(rc);
1399 PyGILState_Release(s);
Benjamin Petersona786b022008-08-25 21:05:21 +00001400 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001401}
1402
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001403/* Same thing, but releases `thread_done` when it returns. This variant
1404 * should be called only from threads spawned by test_thread_state().
1405 */
1406static void
1407_make_call_from_thread(void *callable)
1408{
1409 _make_call(callable);
1410 PyThread_release_lock(thread_done);
1411}
1412
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001413static PyObject *
1414test_thread_state(PyObject *self, PyObject *args)
1415{
1416 PyObject *fn;
Benjamin Petersona786b022008-08-25 21:05:21 +00001417 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001418
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001419 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1420 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001421
Benjamin Petersona786b022008-08-25 21:05:21 +00001422 if (!PyCallable_Check(fn)) {
1423 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1424 fn->ob_type->tp_name);
1425 return NULL;
1426 }
1427
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001428 /* Ensure Python is set up for threading */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001429 PyEval_InitThreads();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001430 thread_done = PyThread_allocate_lock();
1431 if (thread_done == NULL)
1432 return PyErr_NoMemory();
1433 PyThread_acquire_lock(thread_done, 1);
1434
1435 /* Start a new thread with our callback. */
1436 PyThread_start_new_thread(_make_call_from_thread, fn);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001437 /* Make the callback with the thread lock held by this thread */
Benjamin Petersona786b022008-08-25 21:05:21 +00001438 success &= _make_call(fn);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001439 /* Do it all again, but this time with the thread-lock released */
1440 Py_BEGIN_ALLOW_THREADS
Benjamin Petersona786b022008-08-25 21:05:21 +00001441 success &= _make_call(fn);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001442 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001443 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001444
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001445 /* And once more with and without a thread
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001446 XXX - should use a lock and work out exactly what we are trying
1447 to test <wink>
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001448 */
1449 Py_BEGIN_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001450 PyThread_start_new_thread(_make_call_from_thread, fn);
Benjamin Petersona786b022008-08-25 21:05:21 +00001451 success &= _make_call(fn);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001452 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001453 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001454
Thomas Wouters89f507f2006-12-13 04:49:30 +00001455 /* Release lock we acquired above. This is required on HP-UX. */
1456 PyThread_release_lock(thread_done);
1457
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001458 PyThread_free_lock(thread_done);
Benjamin Petersona786b022008-08-25 21:05:21 +00001459 if (!success)
1460 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001461 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001462}
Benjamin Petersona54c9092009-01-13 02:11:23 +00001463
1464/* test Py_AddPendingCalls using threads */
1465static int _pending_callback(void *arg)
1466{
1467 /* we assume the argument is callable object to which we own a reference */
1468 PyObject *callable = (PyObject *)arg;
1469 PyObject *r = PyObject_CallObject(callable, NULL);
1470 Py_DECREF(callable);
1471 Py_XDECREF(r);
1472 return r != NULL ? 0 : -1;
1473}
1474
1475/* The following requests n callbacks to _pending_callback. It can be
1476 * run from any python thread.
1477 */
1478PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
1479{
1480 PyObject *callable;
1481 int r;
1482 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
1483 return NULL;
1484
1485 /* create the reference for the callbackwhile we hold the lock */
1486 Py_INCREF(callable);
1487
1488 Py_BEGIN_ALLOW_THREADS
1489 r = Py_AddPendingCall(&_pending_callback, callable);
1490 Py_END_ALLOW_THREADS
1491
1492 if (r<0) {
1493 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
1494 Py_INCREF(Py_False);
1495 return Py_False;
1496 }
1497 Py_INCREF(Py_True);
1498 return Py_True;
1499}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001500#endif
1501
Neal Norwitzb0d26332007-08-25 00:49:05 +00001502/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001503static PyObject *
1504test_string_from_format(PyObject *self, PyObject *args)
1505{
1506 PyObject *result;
1507 char *msg;
1508
1509#define CHECK_1_FORMAT(FORMAT, TYPE) \
Neal Norwitzb0d26332007-08-25 00:49:05 +00001510 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
Thomas Wouters477c8d52006-05-27 19:21:47 +00001511 if (result == NULL) \
1512 return NULL; \
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001513 if (strcmp(_PyUnicode_AsString(result), "1")) { \
Thomas Wouters477c8d52006-05-27 19:21:47 +00001514 msg = FORMAT " failed at 1"; \
1515 goto Fail; \
1516 } \
1517 Py_DECREF(result)
1518
1519 CHECK_1_FORMAT("%d", int);
1520 CHECK_1_FORMAT("%ld", long);
1521 /* The z width modifier was added in Python 2.5. */
1522 CHECK_1_FORMAT("%zd", Py_ssize_t);
1523
1524 /* The u type code was added in Python 2.5. */
1525 CHECK_1_FORMAT("%u", unsigned int);
1526 CHECK_1_FORMAT("%lu", unsigned long);
1527 CHECK_1_FORMAT("%zu", size_t);
1528
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001529 /* "%lld" and "%llu" support added in Python 2.7. */
1530#ifdef HAVE_LONG_LONG
1531 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
1532 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
1533#endif
1534
Thomas Wouters477c8d52006-05-27 19:21:47 +00001535 Py_RETURN_NONE;
1536
1537 Fail:
1538 Py_XDECREF(result);
1539 return raiseTestError("test_string_from_format", msg);
1540
1541#undef CHECK_1_FORMAT
1542}
1543
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001544
1545static PyObject *
1546test_unicode_compare_with_ascii(PyObject *self) {
1547 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
1548 int result;
1549 if (py_s == NULL)
1550 return NULL;
1551 result = PyUnicode_CompareWithASCIIString(py_s, "str");
1552 Py_DECREF(py_s);
1553 if (!result) {
1554 PyErr_SetString(TestError, "Python string ending in NULL "
1555 "should not compare equal to c string.");
1556 return NULL;
1557 }
1558 Py_RETURN_NONE;
1559};
1560
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001561/* This is here to provide a docstring for test_descr. */
1562static PyObject *
1563test_with_docstring(PyObject *self)
1564{
1565 Py_RETURN_NONE;
1566}
1567
Mark Dickinson725bfd82009-05-03 20:33:40 +00001568/* Test PyOS_string_to_double. */
1569static PyObject *
1570test_string_to_double(PyObject *self) {
1571 double result;
1572 char *msg;
1573
1574#define CHECK_STRING(STR, expected) \
1575 result = PyOS_string_to_double(STR, NULL, NULL); \
1576 if (result == -1.0 && PyErr_Occurred()) \
1577 return NULL; \
1578 if (result != expected) { \
1579 msg = "conversion of " STR " to float failed"; \
1580 goto fail; \
1581 }
1582
1583#define CHECK_INVALID(STR) \
1584 result = PyOS_string_to_double(STR, NULL, NULL); \
1585 if (result == -1.0 && PyErr_Occurred()) { \
1586 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
1587 PyErr_Clear(); \
1588 else \
1589 return NULL; \
1590 } \
1591 else { \
1592 msg = "conversion of " STR " didn't raise ValueError"; \
1593 goto fail; \
1594 }
1595
1596 CHECK_STRING("0.1", 0.1);
1597 CHECK_STRING("1.234", 1.234);
1598 CHECK_STRING("-1.35", -1.35);
1599 CHECK_STRING(".1e01", 1.0);
1600 CHECK_STRING("2.e-2", 0.02);
1601
1602 CHECK_INVALID(" 0.1");
1603 CHECK_INVALID("\t\n-3");
1604 CHECK_INVALID(".123 ");
1605 CHECK_INVALID("3\n");
1606 CHECK_INVALID("123abc");
1607
1608 Py_RETURN_NONE;
1609 fail:
1610 return raiseTestError("test_string_to_double", msg);
1611#undef CHECK_STRING
1612#undef CHECK_INVALID
1613}
1614
1615
Benjamin Petersonb173f782009-05-05 22:31:58 +00001616/* Coverage testing of capsule objects. */
1617
1618static const char *capsule_name = "capsule name";
1619static char *capsule_pointer = "capsule pointer";
1620static char *capsule_context = "capsule context";
1621static const char *capsule_error = NULL;
1622static int
1623capsule_destructor_call_count = 0;
1624
1625static void
1626capsule_destructor(PyObject *o) {
1627 capsule_destructor_call_count++;
1628 if (PyCapsule_GetContext(o) != capsule_context) {
1629 capsule_error = "context did not match in destructor!";
1630 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
1631 capsule_error = "destructor did not match in destructor! (woah!)";
1632 } else if (PyCapsule_GetName(o) != capsule_name) {
1633 capsule_error = "name did not match in destructor!";
1634 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
1635 capsule_error = "pointer did not match in destructor!";
1636 }
1637}
1638
1639typedef struct {
1640 char *name;
1641 char *module;
1642 char *attribute;
1643} known_capsule;
1644
1645static PyObject *
1646test_capsule(PyObject *self, PyObject *args)
1647{
1648 PyObject *object;
1649 const char *error = NULL;
1650 void *pointer;
1651 void *pointer2;
1652 known_capsule known_capsules[] = {
1653 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
1654 KNOWN_CAPSULE("_socket", "CAPI"),
1655 KNOWN_CAPSULE("_curses", "_C_API"),
1656 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
1657 { NULL, NULL },
1658 };
1659 known_capsule *known = &known_capsules[0];
1660
1661#define FAIL(x) { error = (x); goto exit; }
1662
1663#define CHECK_DESTRUCTOR \
1664 if (capsule_error) { \
1665 FAIL(capsule_error); \
1666 } \
1667 else if (!capsule_destructor_call_count) { \
1668 FAIL("destructor not called!"); \
1669 } \
1670 capsule_destructor_call_count = 0; \
1671
1672 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
1673 PyCapsule_SetContext(object, capsule_context);
1674 capsule_destructor(object);
1675 CHECK_DESTRUCTOR;
1676 Py_DECREF(object);
1677 CHECK_DESTRUCTOR;
1678
1679 object = PyCapsule_New(known, "ignored", NULL);
1680 PyCapsule_SetPointer(object, capsule_pointer);
1681 PyCapsule_SetName(object, capsule_name);
1682 PyCapsule_SetDestructor(object, capsule_destructor);
1683 PyCapsule_SetContext(object, capsule_context);
1684 capsule_destructor(object);
1685 CHECK_DESTRUCTOR;
1686 /* intentionally access using the wrong name */
1687 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
1688 if (!PyErr_Occurred()) {
1689 FAIL("PyCapsule_GetPointer should have failed but did not!");
1690 }
1691 PyErr_Clear();
1692 if (pointer2) {
1693 if (pointer2 == capsule_pointer) {
1694 FAIL("PyCapsule_GetPointer should not have"
1695 " returned the internal pointer!");
1696 } else {
1697 FAIL("PyCapsule_GetPointer should have "
1698 "returned NULL pointer but did not!");
1699 }
1700 }
1701 PyCapsule_SetDestructor(object, NULL);
1702 Py_DECREF(object);
1703 if (capsule_destructor_call_count) {
1704 FAIL("destructor called when it should not have been!");
1705 }
1706
1707 for (known = &known_capsules[0]; known->module != NULL; known++) {
1708 /* yeah, ordinarily I wouldn't do this either,
1709 but it's fine for this test harness.
1710 */
1711 static char buffer[256];
1712#undef FAIL
1713#define FAIL(x) \
1714 { \
1715 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
1716 x, known->module, known->attribute); \
1717 error = buffer; \
1718 goto exit; \
1719 } \
1720
1721 PyObject *module = PyImport_ImportModule(known->module);
1722 if (module) {
1723 pointer = PyCapsule_Import(known->name, 0);
1724 if (!pointer) {
1725 Py_DECREF(module);
1726 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
1727 }
1728 object = PyObject_GetAttrString(module, known->attribute);
1729 if (!object) {
1730 Py_DECREF(module);
1731 return NULL;
1732 }
1733 pointer2 = PyCapsule_GetPointer(object,
1734 "weebles wobble but they don't fall down");
1735 if (!PyErr_Occurred()) {
1736 Py_DECREF(object);
1737 Py_DECREF(module);
1738 FAIL("PyCapsule_GetPointer should have failed but did not!");
1739 }
1740 PyErr_Clear();
1741 if (pointer2) {
1742 Py_DECREF(module);
1743 Py_DECREF(object);
1744 if (pointer2 == pointer) {
1745 FAIL("PyCapsule_GetPointer should not have"
1746 " returned its internal pointer!");
1747 } else {
1748 FAIL("PyCapsule_GetPointer should have"
1749 " returned NULL pointer but did not!");
1750 }
1751 }
1752 Py_DECREF(object);
1753 Py_DECREF(module);
1754 }
1755 }
1756
1757 exit:
1758 if (error) {
1759 return raiseTestError("test_capsule", error);
1760 }
Mark Dickinson6d138f12009-12-13 20:03:21 +00001761 /* 13/12/2009: something is causing test_capi to fail occasionally on
1762 the Solaris buildbot, with the output:
1763
1764 internal test_L_code
1765 internal test_Z_code
1766 internal test_bug_7414
1767 internal test_capsule
1768 XXX undetected error
1769 internaltest test_capi crashed -- <class 'ImportError'>: No module named datetime
1770
1771 It seems possible that test_capsule is raising an exception but
1772 failing to return NULL. Do a PyErr_Occurred check to find out.
1773 */
1774 if (PyErr_Occurred())
1775 return NULL;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001776 Py_RETURN_NONE;
1777#undef FAIL
1778}
1779
Guido van Rossumddefaf32007-01-14 03:31:43 +00001780#ifdef HAVE_GETTIMEOFDAY
1781/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00001782static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00001783{
1784 e->tv_sec -= s->tv_sec;
1785 e->tv_usec -= s->tv_usec;
1786 if (e->tv_usec < 0) {
1787 e->tv_sec -=1;
1788 e->tv_usec += 1000000;
1789 }
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001790 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001791}
1792
1793static PyObject *
1794profile_int(PyObject *self, PyObject* args)
1795{
1796 int i, k;
1797 struct timeval start, stop;
1798 PyObject *single, **multiple, *op1, *result;
1799
1800 /* Test 1: Allocate and immediately deallocate
1801 many small integers */
1802 gettimeofday(&start, NULL);
1803 for(k=0; k < 20000; k++)
1804 for(i=0; i < 1000; i++) {
Christian Heimes217cfd12007-12-02 14:31:20 +00001805 single = PyLong_FromLong(i);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001806 Py_DECREF(single);
1807 }
1808 gettimeofday(&stop, NULL);
1809 print_delta(1, &start, &stop);
1810
1811 /* Test 2: Allocate and immediately deallocate
1812 many large integers */
1813 gettimeofday(&start, NULL);
1814 for(k=0; k < 20000; k++)
1815 for(i=0; i < 1000; i++) {
Christian Heimes217cfd12007-12-02 14:31:20 +00001816 single = PyLong_FromLong(i+1000000);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001817 Py_DECREF(single);
1818 }
1819 gettimeofday(&stop, NULL);
1820 print_delta(2, &start, &stop);
1821
1822 /* Test 3: Allocate a few integers, then release
1823 them all simultaneously. */
1824 multiple = malloc(sizeof(PyObject*) * 1000);
1825 gettimeofday(&start, NULL);
1826 for(k=0; k < 20000; k++) {
1827 for(i=0; i < 1000; i++) {
Christian Heimes217cfd12007-12-02 14:31:20 +00001828 multiple[i] = PyLong_FromLong(i+1000000);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001829 }
1830 for(i=0; i < 1000; i++) {
1831 Py_DECREF(multiple[i]);
1832 }
1833 }
1834 gettimeofday(&stop, NULL);
1835 print_delta(3, &start, &stop);
1836
1837 /* Test 4: Allocate many integers, then release
1838 them all simultaneously. */
1839 multiple = malloc(sizeof(PyObject*) * 1000000);
1840 gettimeofday(&start, NULL);
1841 for(k=0; k < 20; k++) {
1842 for(i=0; i < 1000000; i++) {
Christian Heimes217cfd12007-12-02 14:31:20 +00001843 multiple[i] = PyLong_FromLong(i+1000000);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001844 }
1845 for(i=0; i < 1000000; i++) {
1846 Py_DECREF(multiple[i]);
1847 }
1848 }
1849 gettimeofday(&stop, NULL);
1850 print_delta(4, &start, &stop);
1851
1852 /* Test 5: Allocate many integers < 32000 */
1853 multiple = malloc(sizeof(PyObject*) * 1000000);
1854 gettimeofday(&start, NULL);
1855 for(k=0; k < 10; k++) {
1856 for(i=0; i < 1000000; i++) {
Christian Heimes217cfd12007-12-02 14:31:20 +00001857 multiple[i] = PyLong_FromLong(i+1000);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001858 }
1859 for(i=0; i < 1000000; i++) {
1860 Py_DECREF(multiple[i]);
1861 }
1862 }
1863 gettimeofday(&stop, NULL);
1864 print_delta(5, &start, &stop);
1865
1866 /* Test 6: Perform small int addition */
Christian Heimes217cfd12007-12-02 14:31:20 +00001867 op1 = PyLong_FromLong(1);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001868 gettimeofday(&start, NULL);
1869 for(i=0; i < 10000000; i++) {
1870 result = PyNumber_Add(op1, op1);
1871 Py_DECREF(result);
1872 }
1873 gettimeofday(&stop, NULL);
1874 Py_DECREF(op1);
1875 print_delta(6, &start, &stop);
1876
1877 /* Test 7: Perform medium int addition */
Christian Heimes217cfd12007-12-02 14:31:20 +00001878 op1 = PyLong_FromLong(1000);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001879 gettimeofday(&start, NULL);
1880 for(i=0; i < 10000000; i++) {
1881 result = PyNumber_Add(op1, op1);
1882 Py_DECREF(result);
1883 }
1884 gettimeofday(&stop, NULL);
1885 Py_DECREF(op1);
1886 print_delta(7, &start, &stop);
1887
1888 Py_INCREF(Py_None);
1889 return Py_None;
1890}
1891#endif
1892
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001893/* To test the format of tracebacks as printed out. */
1894static PyObject *
1895traceback_print(PyObject *self, PyObject *args)
1896{
1897 PyObject *file;
1898 PyObject *traceback;
1899 int result;
1900
1901 if (!PyArg_ParseTuple(args, "OO:traceback_print",
1902 &traceback, &file))
1903 return NULL;
1904
1905 result = PyTraceBack_Print(traceback, file);
1906 if (result < 0)
1907 return NULL;
1908 Py_RETURN_NONE;
1909}
1910
Benjamin Petersone6528212008-07-15 15:32:09 +00001911/* To test the format of exceptions as printed out. */
1912static PyObject *
1913exception_print(PyObject *self, PyObject *args)
1914{
1915 PyObject *value;
1916 PyObject *tb;
1917
1918 if (!PyArg_ParseTuple(args, "O:exception_print",
1919 &value))
1920 return NULL;
Benjamin Peterson6784eb72008-08-23 20:32:27 +00001921 if (!PyExceptionInstance_Check(value)) {
1922 PyErr_Format(PyExc_TypeError, "an exception instance is required");
1923 return NULL;
1924 }
Benjamin Petersone6528212008-07-15 15:32:09 +00001925
1926 tb = PyException_GetTraceback(value);
1927 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
1928 Py_XDECREF(tb);
1929
1930 Py_RETURN_NONE;
1931}
1932
1933
1934
Benjamin Peterson0067bd62008-08-16 16:11:03 +00001935
1936/* reliably raise a MemoryError */
1937static PyObject *
1938raise_memoryerror(PyObject *self)
1939{
1940 PyErr_NoMemory();
1941 return NULL;
1942}
1943
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00001944/* Issue 6012 */
1945static PyObject *str1, *str2;
1946static int
1947failing_converter(PyObject *obj, void *arg)
1948{
1949 /* Clone str1, then let the conversion fail. */
1950 assert(str1);
1951 str2 = str1;
1952 Py_INCREF(str2);
1953 return 0;
1954}
1955static PyObject*
1956argparsing(PyObject *o, PyObject *args)
1957{
1958 PyObject *res;
1959 str1 = str2 = NULL;
1960 if (!PyArg_ParseTuple(args, "O&O&",
1961 PyUnicode_FSConverter, &str1,
1962 failing_converter, &str2)) {
1963 if (!str2)
1964 /* argument converter not called? */
1965 return NULL;
1966 /* Should be 1 */
1967 res = PyLong_FromLong(Py_REFCNT(str2));
1968 Py_DECREF(str2);
1969 PyErr_Clear();
1970 return res;
1971 }
1972 Py_RETURN_NONE;
1973}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00001974
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00001975/* To test that the result of PyCode_NewEmpty has the right members. */
1976static PyObject *
1977code_newempty(PyObject *self, PyObject *args)
1978{
1979 const char *filename;
1980 const char *funcname;
1981 int firstlineno;
1982
1983 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
1984 &filename, &funcname, &firstlineno))
1985 return NULL;
1986
1987 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
1988}
1989
Georg Brandl1e28a272009-12-28 08:41:01 +00001990/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
1991 Run via Lib/test/test_exceptions.py */
1992static PyObject *
1993make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
1994{
1995 const char *name;
1996 const char *doc = NULL;
1997 PyObject *base = NULL;
1998 PyObject *dict = NULL;
1999
2000 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
2001
2002 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2003 "s|sOO:make_exception_with_doc", kwlist,
2004 &name, &doc, &base, &dict))
2005 return NULL;
2006
2007 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
2008}
2009
Tim Peters9ea17ac2001-02-02 05:57:15 +00002010static PyMethodDef TestMethods[] = {
Fred Drakeacee69f2002-04-01 14:28:58 +00002011 {"raise_exception", raise_exception, METH_VARARGS},
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002012 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Fred Drakeacee69f2002-04-01 14:28:58 +00002013 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002014 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Fred Drakeacee69f2002-04-01 14:28:58 +00002015 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
2016 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
Nick Coghlanf1f2f682008-12-30 07:29:12 +00002017 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrou05b7c562010-02-02 22:47:00 +00002018 {"test_broken_memoryview", (PyCFunction)test_broken_memoryview,METH_NOARGS},
Fred Drakeacee69f2002-04-01 14:28:58 +00002019 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Mark Dickinson309aa2d2009-12-21 12:37:06 +00002020 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
2021 METH_NOARGS},
Tim Petersbaefd9e2003-01-28 20:37:45 +00002022 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
Thomas Hellera4ea6032003-04-17 18:55:45 +00002023 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
Benjamin Peterson92035012008-12-27 16:00:54 +00002024 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Mark Dickinsonf08173b2009-12-03 10:59:46 +00002025 {"test_bug_7414", (PyCFunction)test_bug_7414, METH_NOARGS},
Thomas Woutersa9773292006-04-21 09:43:23 +00002026 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00002027 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002028 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
2029 PyDoc_STR("This is a pretty normal docstring.")},
Benjamin Petersonb173f782009-05-05 22:31:58 +00002030 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002031 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
Benjamin Petersonb173f782009-05-05 22:31:58 +00002032 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002033 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Christian Heimes380f7f22008-02-28 11:19:05 +00002034 {"getargs_keywords", (PyCFunction)getargs_keywords,
2035 METH_VARARGS|METH_KEYWORDS},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002036 {"getargs_b", getargs_b, METH_VARARGS},
2037 {"getargs_B", getargs_B, METH_VARARGS},
Mark Dickinson1554b182009-12-20 16:03:30 +00002038 {"getargs_h", getargs_h, METH_VARARGS},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002039 {"getargs_H", getargs_H, METH_VARARGS},
2040 {"getargs_I", getargs_I, METH_VARARGS},
2041 {"getargs_k", getargs_k, METH_VARARGS},
2042 {"getargs_i", getargs_i, METH_VARARGS},
2043 {"getargs_l", getargs_l, METH_VARARGS},
2044 {"getargs_n", getargs_n, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00002045#ifdef HAVE_LONG_LONG
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002046 {"getargs_L", getargs_L, METH_VARARGS},
2047 {"getargs_K", getargs_K, METH_VARARGS},
2048 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Mark Dickinson93f562c2010-01-30 10:30:15 +00002049 {"test_long_long_and_overflow",
2050 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
Fred Drakeacee69f2002-04-01 14:28:58 +00002051 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002052 {"codec_incrementalencoder",
2053 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
2054 {"codec_incrementaldecoder",
2055 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00002056#endif
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00002057 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
Fred Drakeacee69f2002-04-01 14:28:58 +00002058 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
Guido van Rossumfb67be22007-08-29 18:38:11 +00002059 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
Mark Dickinson081dfee2009-03-18 14:47:41 +00002060 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002061#ifdef WITH_THREAD
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002062 {"_test_thread_state", test_thread_state, METH_VARARGS},
Benjamin Petersona54c9092009-01-13 02:11:23 +00002063 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002064#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00002065#ifdef HAVE_GETTIMEOFDAY
2066 {"profile_int", profile_int, METH_NOARGS},
2067#endif
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002068 {"traceback_print", traceback_print, METH_VARARGS},
Benjamin Petersone6528212008-07-15 15:32:09 +00002069 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002070 {"argparsing", argparsing, METH_VARARGS},
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002071 {"code_newempty", code_newempty, METH_VARARGS},
Georg Brandl1e28a272009-12-28 08:41:01 +00002072 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
2073 METH_VARARGS | METH_KEYWORDS},
Tim Peters9ea17ac2001-02-02 05:57:15 +00002074 {NULL, NULL} /* sentinel */
2075};
2076
Thomas Hellera4ea6032003-04-17 18:55:45 +00002077#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
2078
Thomas Wouters89f507f2006-12-13 04:49:30 +00002079typedef struct {
Christian Heimes1af737c2008-01-23 08:24:23 +00002080 char bool_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002081 char byte_member;
2082 unsigned char ubyte_member;
2083 short short_member;
2084 unsigned short ushort_member;
2085 int int_member;
2086 unsigned int uint_member;
2087 long long_member;
2088 unsigned long ulong_member;
2089 float float_member;
2090 double double_member;
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},
2112 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
2113 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002114#ifdef HAVE_LONG_LONG
2115 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
2116 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
2117#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00002118 {NULL}
2119};
2120
2121
Christian Heimes1af737c2008-01-23 08:24:23 +00002122static PyObject *
2123test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
2124{
2125 static char *keywords[] = {
2126 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
2127 "T_INT", "T_UINT", "T_LONG", "T_ULONG",
2128 "T_FLOAT", "T_DOUBLE",
2129#ifdef HAVE_LONG_LONG
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002130 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00002131#endif
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002132 NULL};
Christian Heimes1af737c2008-01-23 08:24:23 +00002133 static char *fmt = "|bbBhHiIlkfd"
2134#ifdef HAVE_LONG_LONG
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002135 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00002136#endif
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002137 ;
Christian Heimes1af737c2008-01-23 08:24:23 +00002138 test_structmembers *ob;
2139 ob = PyObject_New(test_structmembers, type);
2140 if (ob == NULL)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002141 return NULL;
2142 memset(&ob->structmembers, 0, sizeof(all_structmembers));
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002143 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
Christian Heimes1af737c2008-01-23 08:24:23 +00002144 &ob->structmembers.bool_member,
2145 &ob->structmembers.byte_member,
2146 &ob->structmembers.ubyte_member,
2147 &ob->structmembers.short_member,
2148 &ob->structmembers.ushort_member,
2149 &ob->structmembers.int_member,
2150 &ob->structmembers.uint_member,
2151 &ob->structmembers.long_member,
2152 &ob->structmembers.ulong_member,
2153 &ob->structmembers.float_member,
2154 &ob->structmembers.double_member
2155#ifdef HAVE_LONG_LONG
2156 , &ob->structmembers.longlong_member,
2157 &ob->structmembers.ulonglong_member
2158#endif
2159 )) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002160 Py_DECREF(ob);
2161 return NULL;
Christian Heimes1af737c2008-01-23 08:24:23 +00002162 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002163 return (PyObject *)ob;
2164}
2165
Christian Heimes1af737c2008-01-23 08:24:23 +00002166static void
2167test_structmembers_free(PyObject *ob)
2168{
Thomas Wouters89f507f2006-12-13 04:49:30 +00002169 PyObject_FREE(ob);
2170}
2171
2172static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002173 PyVarObject_HEAD_INIT(NULL, 0)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002174 "test_structmembersType",
2175 sizeof(test_structmembers), /* tp_basicsize */
2176 0, /* tp_itemsize */
2177 test_structmembers_free, /* destructor tp_dealloc */
2178 0, /* tp_print */
2179 0, /* tp_getattr */
2180 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002181 0, /* tp_reserved */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002182 0, /* tp_repr */
2183 0, /* tp_as_number */
2184 0, /* tp_as_sequence */
2185 0, /* tp_as_mapping */
2186 0, /* tp_hash */
2187 0, /* tp_call */
2188 0, /* tp_str */
Christian Heimes1af737c2008-01-23 08:24:23 +00002189 PyObject_GenericGetAttr, /* tp_getattro */
2190 PyObject_GenericSetAttr, /* tp_setattro */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002191 0, /* tp_as_buffer */
2192 0, /* tp_flags */
2193 "Type containing all structmember types",
2194 0, /* traverseproc tp_traverse */
2195 0, /* tp_clear */
2196 0, /* tp_richcompare */
2197 0, /* tp_weaklistoffset */
2198 0, /* tp_iter */
2199 0, /* tp_iternext */
2200 0, /* tp_methods */
Christian Heimes1af737c2008-01-23 08:24:23 +00002201 test_members, /* tp_members */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002202 0,
2203 0,
2204 0,
2205 0,
2206 0,
2207 0,
2208 0,
2209 0,
Christian Heimes1af737c2008-01-23 08:24:23 +00002210 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002211};
2212
2213
Martin v. Löwis1a214512008-06-11 05:26:20 +00002214
2215static struct PyModuleDef _testcapimodule = {
2216 PyModuleDef_HEAD_INIT,
2217 "_testcapi",
2218 NULL,
2219 -1,
2220 TestMethods,
2221 NULL,
2222 NULL,
2223 NULL,
2224 NULL
2225};
2226
Mark Hammond62b1ab12002-07-23 06:31:15 +00002227PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002228PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00002229{
Fred Drakeacee69f2002-04-01 14:28:58 +00002230 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002231
Martin v. Löwis1a214512008-06-11 05:26:20 +00002232 m = PyModule_Create(&_testcapimodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002233 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002234 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002235
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00002236 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
2237
Christian Heimes90aa7642007-12-19 02:45:37 +00002238 Py_TYPE(&test_structmembersType)=&PyType_Type;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002239 Py_INCREF(&test_structmembersType);
2240 PyModule_AddObject(m, "test_structmembersType", (PyObject *)&test_structmembersType);
2241
Christian Heimes217cfd12007-12-02 14:31:20 +00002242 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
2243 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
2244 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
2245 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
2246 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
2247 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002248 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
2249 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
Thomas Hellera4ea6032003-04-17 18:55:45 +00002250 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
Christian Heimes217cfd12007-12-02 14:31:20 +00002251 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
2252 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002253 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
2254 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
2255 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
2256 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
2257 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002258 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
2259 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
2260 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
Christian Heimes217cfd12007-12-02 14:31:20 +00002261 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
2262 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00002263 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Benjamin Peterson9b6df6a2008-10-16 23:56:29 +00002264 Py_INCREF(&PyInstanceMethod_Type);
2265 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00002266
Tim Petersd66595f2001-02-04 03:09:53 +00002267 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
Fred Drakeacee69f2002-04-01 14:28:58 +00002268 Py_INCREF(TestError);
2269 PyModule_AddObject(m, "error", TestError);
Martin v. Löwis1a214512008-06-11 05:26:20 +00002270 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002271}