blob: ba81f717d4062bb37977bec07c7e29a0a9d935d7 [file] [log] [blame]
Tim Peters9ea17ac2001-02-02 05:57:15 +00001/*
2 * C Extension module to test Python interpreter C APIs.
3 *
4 * The 'test_*' functions exported by this module are run as part of the
5 * standard Python regression test, via Lib/test/test_capi.py.
6 */
7
Neal Norwitz8866e0a2007-10-27 04:01:17 +00008#define PY_SSIZE_T_CLEAN
9
Tim Peters9ea17ac2001-02-02 05:57:15 +000010#include "Python.h"
Thomas Wouters89f507f2006-12-13 04:49:30 +000011#include <float.h>
12#include "structmember.h"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000013#include "datetime.h"
Tim Peters9ea17ac2001-02-02 05:57:15 +000014
Mark Hammond8d98d2c2003-04-19 15:41:53 +000015#ifdef WITH_THREAD
16#include "pythread.h"
17#endif /* WITH_THREAD */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000018static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000019
Tim Peters91621db2001-06-12 20:10:01 +000020/* Raise TestError with test_name + ": " + msg, and return NULL. */
21
22static PyObject *
23raiseTestError(const char* test_name, const char* msg)
24{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000025 char buf[2048];
Tim Peters91621db2001-06-12 20:10:01 +000026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000027 if (strlen(test_name) + strlen(msg) > sizeof(buf) - 50)
28 PyErr_SetString(TestError, "internal error msg too large");
29 else {
30 PyOS_snprintf(buf, sizeof(buf), "%s: %s", test_name, msg);
31 PyErr_SetString(TestError, buf);
32 }
33 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000034}
35
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000036/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000037
38 The ones derived from autoconf on the UNIX-like OSes can be relied
39 upon (in the absence of sloppy cross-compiling), but the Windows
40 platforms have these hardcoded. Better safe than sorry.
41*/
42static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000043sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000046 char buf[1024];
47 PyOS_snprintf(buf, sizeof(buf),
48 "%.200s #define == %d but sizeof(%.200s) == %d",
49 fatname, expected, typname, got);
50 PyErr_SetString(TestError, buf);
51 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000052}
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) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 if (FATNAME != sizeof(TYPE)) \
59 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 CHECK_SIZEOF(SIZEOF_SHORT, short);
62 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);
Tim Peters9ea17ac2001-02-02 05:57:15 +000066#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
Tim Peters9ea17ac2001-02-02 05:57:15 +000068#endif
69
70#undef CHECK_SIZEOF
71
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 Py_INCREF(Py_None);
73 return Py_None;
Tim Peters9ea17ac2001-02-02 05:57:15 +000074}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079 PyObject* list;
80 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +000081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +000083#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 list = PyList_New(NLIST);
85 if (list == (PyObject*)NULL)
86 return (PyObject*)NULL;
87 /* list = range(NLIST) */
88 for (i = 0; i < NLIST; ++i) {
89 PyObject* anint = PyLong_FromLong(i);
90 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);
105 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
106 PyErr_SetString(TestError,
107 "test_list_api: reverse screwed up");
108 Py_DECREF(list);
109 return (PyObject*)NULL;
110 }
111 }
112 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000113#undef NLIST
114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 Py_INCREF(Py_None);
116 return Py_None;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000117}
118
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000119static int
120test_dict_inner(int count)
121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 Py_ssize_t pos = 0, iterations = 0;
123 int i;
124 PyObject *dict = PyDict_New();
125 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 if (dict == NULL)
128 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 for (i = 0; i < count; i++) {
131 v = PyLong_FromLong(i);
132 PyDict_SetItem(dict, v, v);
133 Py_DECREF(v);
134 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 while (PyDict_Next(dict, &pos, &k, &v)) {
137 PyObject *o;
138 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 i = PyLong_AS_LONG(v) + 1;
141 o = PyLong_FromLong(i);
142 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 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000153 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 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000161}
162
163static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000164test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 for (i = 0; i < 200; i++) {
169 if (test_dict_inner(i) < 0) {
170 return NULL;
171 }
172 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 Py_INCREF(Py_None);
175 return Py_None;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000176}
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 = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 PyVarObject_HEAD_INIT(NULL, 0)
184 "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 */
191 0, /* tp_reserved */
192 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 */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000221};
222
223static PyObject*
224test_lazy_hash_inheritance(PyObject* self)
225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 PyTypeObject *type;
227 PyObject *obj;
228 long hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +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 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 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 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 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 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 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 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 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 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000284}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 PyErr_SetString(
295 TestError,
296 "test_broken_memoryview: expected error in bf_getbuffer");
297 return -1;
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000298}
299
300static PyBufferProcs memoryviewtester_as_buffer = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 (getbufferproc)broken_buffer_getbuffer, /* bf_getbuffer */
302 0, /* bf_releasebuffer */
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000303};
304
305static PyTypeObject _MemoryViewTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 PyVarObject_HEAD_INIT(NULL, 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 */
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000344};
345
346static PyObject*
347test_broken_memoryview(PyObject* self)
348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 PyObject *obj = PyObject_New(PyObject, &_MemoryViewTester_Type);
350 PyObject *res;
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 if (obj == NULL) {
353 PyErr_Clear();
354 PyErr_SetString(
355 TestError,
356 "test_broken_memoryview: failed to create object");
357 return NULL;
358 }
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 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 }
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 PyErr_Clear();
371 Py_DECREF(obj);
372 Py_RETURN_NONE;
Antoine Pitrou05b7c562010-02-02 22:47:00 +0000373}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000397}
398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399#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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000427}
428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429#define TESTNAME test_longlong_api_inner
430#define TYPENAME PY_LONG_LONG
431#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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 PyObject *num, *one, *temp;
460 long value;
461 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 /* 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");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 /* 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");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 /* 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");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 /* 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");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 /* 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");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 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");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 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");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 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");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 Py_INCREF(Py_None);
613 return Py_None;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000614}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 PyObject *num, *one, *temp;
625 PY_LONG_LONG value;
626 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 /* 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");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 /* 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");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 /* 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");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 /* 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");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 /* 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");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 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");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 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");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 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");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 Py_INCREF(Py_None);
778 return Py_None;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000779}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 PyObject *tuple, *num;
789 PY_LONG_LONG value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 tuple = PyTuple_New(1);
792 if (tuple == NULL)
793 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 num = PyLong_FromLong(42);
796 if (num == NULL)
797 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 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");
Tim Petersd38b1c72001-09-30 05:09:37 +0000807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 Py_DECREF(num);
809 num = PyLong_FromLong(42);
810 if (num == NULL)
811 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 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");
Tim Petersd38b1c72001-09-30 05:09:37 +0000821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 Py_DECREF(tuple);
823 Py_INCREF(Py_None);
824 return Py_None;
Tim Petersd38b1c72001-09-30 05:09:37 +0000825}
826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827#endif /* ifdef HAVE_LONG_LONG */
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000828
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000829/* Test tuple argument processing */
830static PyObject *
831getargs_tuple(PyObject *self, PyObject *args)
832{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 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);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000837}
838
Christian Heimes380f7f22008-02-28 11:19:05 +0000839/* test PyArg_ParseTupleAndKeywords */
840static PyObject *getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 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};
Christian Heimes380f7f22008-02-28 11:19:05 +0000845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 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]);
Christian Heimes380f7f22008-02-28 11:19:05 +0000853}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 unsigned char value;
862 if (!PyArg_ParseTuple(args, "b", &value))
863 return NULL;
864 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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 unsigned char value;
871 if (!PyArg_ParseTuple(args, "B", &value))
872 return NULL;
873 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000874}
875
876static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +0000877getargs_h(PyObject *self, PyObject *args)
878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 short value;
880 if (!PyArg_ParseTuple(args, "h", &value))
881 return NULL;
882 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +0000883}
884
885static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000886getargs_H(PyObject *self, PyObject *args)
887{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 unsigned short value;
889 if (!PyArg_ParseTuple(args, "H", &value))
890 return NULL;
891 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000892}
893
894static PyObject *
895getargs_I(PyObject *self, PyObject *args)
896{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 unsigned int value;
898 if (!PyArg_ParseTuple(args, "I", &value))
899 return NULL;
900 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000901}
902
903static PyObject *
904getargs_k(PyObject *self, PyObject *args)
905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 unsigned long value;
907 if (!PyArg_ParseTuple(args, "k", &value))
908 return NULL;
909 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000910}
911
912static PyObject *
913getargs_i(PyObject *self, PyObject *args)
914{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 int value;
916 if (!PyArg_ParseTuple(args, "i", &value))
917 return NULL;
918 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000919}
920
Thomas Hellera4ea6032003-04-17 18:55:45 +0000921static PyObject *
922getargs_l(PyObject *self, PyObject *args)
923{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 long value;
925 if (!PyArg_ParseTuple(args, "l", &value))
926 return NULL;
927 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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 Py_ssize_t value;
934 if (!PyArg_ParseTuple(args, "n", &value))
935 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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 PY_LONG_LONG value;
944 if (!PyArg_ParseTuple(args, "L", &value))
945 return NULL;
946 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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 unsigned PY_LONG_LONG value;
953 if (!PyArg_ParseTuple(args, "K", &value))
954 return NULL;
955 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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 PyObject *tuple, *num;
965 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 tuple = PyTuple_New(1);
968 if (tuple == NULL)
969 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 /* a number larger than ULONG_MAX even on 64-bit platforms */
972 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
973 if (num == NULL)
974 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 value = PyLong_AsUnsignedLongMask(num);
977 if (value != ULONG_MAX)
978 return raiseTestError("test_k_code",
979 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 value = 0;
984 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
985 return NULL;
986 if (value != ULONG_MAX)
987 return raiseTestError("test_k_code",
988 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 Py_DECREF(num);
991 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
992 if (num == NULL)
993 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 value = PyLong_AsUnsignedLongMask(num);
996 if (value != (unsigned long)-0x42)
997 return raiseTestError("test_k_code",
998 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 value = 0;
1003 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");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 Py_DECREF(tuple);
1010 Py_INCREF(Py_None);
1011 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001012}
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)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001027
1028 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001030 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001032
1033 PyTuple_SET_ITEM(tuple, 0, obj);
1034
1035 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001037 */
1038 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001040
1041 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001043
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 /* 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;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 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;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|CC",
1072 kwlist, &a, &b);
1073 if (!result)
1074 goto failure;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 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");
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 Py_DECREF(dict);
1084 Py_DECREF(tuple);
1085 Py_RETURN_NONE;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001086
1087 failure:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 Py_XDECREF(dict);
1089 Py_XDECREF(tuple);
1090 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001091}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 PyObject *tuple, *obj;
1103 Py_UNICODE *value;
1104 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1107 /* Just use the macro and check that it compiles */
1108 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 tuple = PyTuple_New(1);
1111 if (tuple == NULL)
1112 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 obj = PyUnicode_Decode("test", strlen("test"),
1115 "ascii", NULL);
1116 if (obj == NULL)
1117 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 Py_DECREF(tuple);
1136 Py_INCREF(Py_None);
1137 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001138}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 PyObject *tuple, *obj;
1145 Py_UNICODE *value1, *value2;
1146 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 tuple = PyTuple_New(2);
1149 if (tuple == NULL)
1150 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 obj = PyUnicode_FromString("test");
1153 PyTuple_SET_ITEM(tuple, 0, obj);
1154 Py_INCREF(Py_None);
1155 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 /* swap values on purpose */
1158 value1 = NULL;
1159 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 /* 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");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 value1 = NULL;
1172 value2 = PyUnicode_AS_UNICODE(obj);
1173 len1 = -1;
1174 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 /* 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'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 Py_DECREF(tuple);
1190 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001191}
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)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1198 size_t wtextlen = 1;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001199#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1201 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1206 if (wide == NULL)
1207 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1210 if (utf8 == NULL) {
1211 Py_DECREF(wide);
1212 return NULL;
1213 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 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 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 Py_DECREF(wide);
1233 Py_DECREF(utf8);
1234 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001235}
1236
1237static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001238test_empty_argparse(PyObject *self)
1239{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 /* 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);
Benjamin Peterson92035012008-12-27 16:00:54 +00001253 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 Py_DECREF(tuple);
1255 Py_XDECREF(dict);
1256 if (result < 0)
1257 return NULL;
1258 else {
1259 Py_RETURN_NONE;
1260 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001261}
1262
1263static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001264codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001265{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 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);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001271}
1272
Thomas Wouters477c8d52006-05-27 19:21:47 +00001273static PyObject *
1274codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 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);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001281}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 struct triple {
1289 long input;
1290 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}};
1307 int i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 for (i = 0; i < sizeof(testcases) / sizeof(struct triple); ++i) {
1310 PyObject *plong = PyLong_FromLong(testcases[i].input);
1311 size_t nbits = _PyLong_NumBits(plong);
1312 int sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 Py_DECREF(plong);
1315 if (nbits != testcases[i].nbits)
1316 return raiseTestError("test_long_numbits",
1317 "wrong result for _PyLong_NumBits");
1318 if (sign != testcases[i].sign)
1319 return raiseTestError("test_long_numbits",
1320 "wrong result for _PyLong_Sign");
1321 }
1322 Py_INCREF(Py_None);
1323 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001324}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
1332 PyObject *tuple = PyTuple_Pack(2, o1, o2);
1333 Py_XDECREF(o1);
1334 Py_XDECREF(o2);
1335 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00001336}
1337
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001338static PyObject *
1339raise_exception(PyObject *self, PyObject *args)
1340{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 PyObject *exc;
1342 PyObject *exc_args, *v;
1343 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
1346 &exc, &num_args))
1347 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 exc_args = PyTuple_New(num_args);
1350 if (exc_args == NULL)
1351 return NULL;
1352 for (i = 0; i < num_args; ++i) {
1353 v = PyLong_FromLong(i);
1354 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);
1361 Py_DECREF(exc_args);
1362 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001363}
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) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 if (PyDateTimeAPI) {
1371 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 }
1380 }
1381 test_run_counter++;
1382 PyDateTime_IMPORT;
1383 if (PyDateTimeAPI)
1384 Py_RETURN_NONE;
1385 else
1386 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001387}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 PyObject *rc;
1405 int success;
1406 PyGILState_STATE s = PyGILState_Ensure();
1407 rc = PyObject_CallFunction((PyObject *)callable, "");
1408 success = (rc != NULL);
1409 Py_XDECREF(rc);
1410 PyGILState_Release(s);
1411 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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 _make_call(callable);
1421 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001422}
1423
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001424static PyObject *
1425test_thread_state(PyObject *self, PyObject *args)
1426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 PyObject *fn;
1428 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1431 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +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 }
Benjamin Petersona786b022008-08-25 21:05:21 +00001438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 /* Ensure Python is set up for threading */
1440 PyEval_InitThreads();
1441 thread_done = PyThread_allocate_lock();
1442 if (thread_done == NULL)
1443 return PyErr_NoMemory();
1444 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 /* Start a new thread with our callback. */
1447 PyThread_start_new_thread(_make_call_from_thread, fn);
1448 /* Make the callback with the thread lock held by this thread */
1449 success &= _make_call(fn);
1450 /* Do it all again, but this time with the thread-lock released */
1451 Py_BEGIN_ALLOW_THREADS
1452 success &= _make_call(fn);
1453 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1454 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 /* And once more with and without a thread
1457 XXX - should use a lock and work out exactly what we are trying
1458 to test <wink>
1459 */
1460 Py_BEGIN_ALLOW_THREADS
1461 PyThread_start_new_thread(_make_call_from_thread, fn);
1462 success &= _make_call(fn);
1463 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1464 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 /* Release lock we acquired above. This is required on HP-UX. */
1467 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 PyThread_free_lock(thread_done);
1470 if (!success)
1471 return NULL;
1472 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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 /* 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;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001484}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 PyObject *callable;
1492 int r;
1493 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
1494 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 /* create the reference for the callbackwhile we hold the lock */
1497 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00001498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 Py_BEGIN_ALLOW_THREADS
1500 r = Py_AddPendingCall(&_pending_callback, callable);
1501 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00001502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 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;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001510}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 PyObject *result;
1518 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520#define CHECK_1_FORMAT(FORMAT, TYPE) \
1521 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
1522 if (result == NULL) \
1523 return NULL; \
1524 if (strcmp(_PyUnicode_AsString(result), "1")) { \
1525 msg = FORMAT " failed at 1"; \
1526 goto Fail; \
1527 } \
1528 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 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);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 /* 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);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001541#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
1543 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001544#endif
1545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001547
1548 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 Py_XDECREF(result);
1550 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001551
1552#undef CHECK_1_FORMAT
1553}
1554
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001555
1556static PyObject *
1557test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 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;
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001570};
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001577}
1578
Mark Dickinson725bfd82009-05-03 20:33:40 +00001579/* Test PyOS_string_to_double. */
1580static PyObject *
1581test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 double result;
1583 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00001584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585#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 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00001593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594#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 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00001606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 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);
Mark Dickinson725bfd82009-05-03 20:33:40 +00001612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 CHECK_INVALID(" 0.1");
1614 CHECK_INVALID("\t\n-3");
1615 CHECK_INVALID(".123 ");
1616 CHECK_INVALID("3\n");
1617 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00001618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00001620 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00001622#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) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 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 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00001648}
1649
1650typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 char *name;
1652 char *module;
1653 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001654} known_capsule;
1655
1656static PyObject *
1657test_capsule(PyObject *self, PyObject *args)
1658{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 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];
Benjamin Petersonb173f782009-05-05 22:31:58 +00001671
1672#define FAIL(x) { error = (x); goto exit; }
1673
1674#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 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; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00001682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 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;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 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 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00001717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 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];
Benjamin Petersonb173f782009-05-05 22:31:58 +00001723#undef FAIL
1724#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 { \
1726 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
1727 x, known->module, known->attribute); \
1728 error = buffer; \
1729 goto exit; \
1730 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00001731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 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 }
1766 else
1767 PyErr_Clear();
1768 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00001769
1770 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 if (error) {
1772 return raiseTestError("test_capsule", error);
1773 }
1774 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001775#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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 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 }
1788 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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 int i, k;
1795 struct timeval start, stop;
1796 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00001797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 /* 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++) {
1803 single = PyLong_FromLong(i);
1804 Py_DECREF(single);
1805 }
1806 gettimeofday(&stop, NULL);
1807 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 /* 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++) {
1814 single = PyLong_FromLong(i+1000000);
1815 Py_DECREF(single);
1816 }
1817 gettimeofday(&stop, NULL);
1818 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 /* 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++) {
1826 multiple[i] = PyLong_FromLong(i+1000000);
1827 }
1828 for(i=0; i < 1000; i++) {
1829 Py_DECREF(multiple[i]);
1830 }
1831 }
1832 gettimeofday(&stop, NULL);
1833 print_delta(3, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 /* 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++) {
1841 multiple[i] = PyLong_FromLong(i+1000000);
1842 }
1843 for(i=0; i < 1000000; i++) {
1844 Py_DECREF(multiple[i]);
1845 }
1846 }
1847 gettimeofday(&stop, NULL);
1848 print_delta(4, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 /* 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++) {
1855 multiple[i] = PyLong_FromLong(i+1000);
1856 }
1857 for(i=0; i < 1000000; i++) {
1858 Py_DECREF(multiple[i]);
1859 }
1860 }
1861 gettimeofday(&stop, NULL);
1862 print_delta(5, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 /* Test 6: Perform small int addition */
1865 op1 = PyLong_FromLong(1);
1866 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);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 /* Test 7: Perform medium int addition */
1876 op1 = PyLong_FromLong(1000);
1877 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);
Guido van Rossumddefaf32007-01-14 03:31:43 +00001885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 Py_INCREF(Py_None);
1887 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00001888}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 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;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001907}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 PyObject *value;
1914 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00001915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 if (!PyArg_ParseTuple(args, "O:exception_print",
1917 &value))
1918 return NULL;
1919 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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 tb = PyException_GetTraceback(value);
1925 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
1926 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00001927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00001929}
1930
1931
1932
Benjamin Peterson0067bd62008-08-16 16:11:03 +00001933
1934/* reliably raise a MemoryError */
1935static PyObject *
1936raise_memoryerror(PyObject *self)
1937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 PyErr_NoMemory();
1939 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00001940}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 /* Clone str1, then let the conversion fail. */
1948 assert(str1);
1949 str2 = str1;
1950 Py_INCREF(str2);
1951 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00001952}
1953static PyObject*
1954argparsing(PyObject *o, PyObject *args)
1955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 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;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00001971}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 const char *filename;
1978 const char *funcname;
1979 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00001980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
1982 &filename, &funcname, &firstlineno))
1983 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00001984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00001986}
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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 const char *name;
1994 const char *doc = NULL;
1995 PyObject *base = NULL;
1996 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00001997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00001999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2001 "s|sOO:make_exception_with_doc", kwlist,
2002 &name, &doc, &base, &dict))
2003 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002006}
2007
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002008/* Test that the fatal error from not having a current thread doesn't
2009 cause an infinite loop. Run via Lib/test/test_capi.py */
2010static PyObject *
2011crash_no_current_thread(PyObject *self)
2012{
2013 Py_BEGIN_ALLOW_THREADS
2014 PyErr_SetString(PyExc_SystemError, "bork bork bork");
2015 Py_END_ALLOW_THREADS
2016 return NULL;
2017}
2018
Tim Peters9ea17ac2001-02-02 05:57:15 +00002019static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 {"raise_exception", raise_exception, METH_VARARGS},
2021 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
2022 {"test_config", (PyCFunction)test_config, METH_NOARGS},
2023 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
2024 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
2025 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
2026 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
2027 {"test_broken_memoryview", (PyCFunction)test_broken_memoryview,METH_NOARGS},
2028 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
2029 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
2030 METH_NOARGS},
2031 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
2032 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
2033 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
2034 {"test_bug_7414", (PyCFunction)test_bug_7414, METH_NOARGS},
2035 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
2036 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
2037 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
2038 PyDoc_STR("This is a pretty normal docstring.")},
2039 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
2040 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
2041 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
2042 {"getargs_tuple", getargs_tuple, METH_VARARGS},
2043 {"getargs_keywords", (PyCFunction)getargs_keywords,
2044 METH_VARARGS|METH_KEYWORDS},
2045 {"getargs_b", getargs_b, METH_VARARGS},
2046 {"getargs_B", getargs_B, METH_VARARGS},
2047 {"getargs_h", getargs_h, METH_VARARGS},
2048 {"getargs_H", getargs_H, METH_VARARGS},
2049 {"getargs_I", getargs_I, METH_VARARGS},
2050 {"getargs_k", getargs_k, METH_VARARGS},
2051 {"getargs_i", getargs_i, METH_VARARGS},
2052 {"getargs_l", getargs_l, METH_VARARGS},
2053 {"getargs_n", getargs_n, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00002054#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 {"getargs_L", getargs_L, METH_VARARGS},
2056 {"getargs_K", getargs_K, METH_VARARGS},
2057 {"test_longlong_api", test_longlong_api, METH_NOARGS},
2058 {"test_long_long_and_overflow",
2059 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
2060 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
2061 {"codec_incrementalencoder",
2062 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
2063 {"codec_incrementaldecoder",
2064 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00002065#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
2067 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
2068 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
2069 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002070#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 {"_test_thread_state", test_thread_state, METH_VARARGS},
2072 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002073#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00002074#ifdef HAVE_GETTIMEOFDAY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00002076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 {"traceback_print", traceback_print, METH_VARARGS},
2078 {"exception_print", exception_print, METH_VARARGS},
2079 {"argparsing", argparsing, METH_VARARGS},
2080 {"code_newempty", code_newempty, METH_VARARGS},
2081 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
2082 METH_VARARGS | METH_KEYWORDS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002083 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00002085};
2086
Thomas Hellera4ea6032003-04-17 18:55:45 +00002087#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
2088
Thomas Wouters89f507f2006-12-13 04:49:30 +00002089typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 char bool_member;
2091 char byte_member;
2092 unsigned char ubyte_member;
2093 short short_member;
2094 unsigned short ushort_member;
2095 int int_member;
2096 unsigned int uint_member;
2097 long long_member;
2098 unsigned long ulong_member;
2099 Py_ssize_t pyssizet_member;
2100 float float_member;
2101 double double_member;
2102 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002103#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 PY_LONG_LONG longlong_member;
2105 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002106#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00002107} all_structmembers;
2108
2109typedef struct {
2110 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002112} test_structmembers;
2113
2114static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
2116 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
2117 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
2118 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
2119 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
2120 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
2121 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
2122 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
2123 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
2124 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
2125 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
2126 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
2127 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002128#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
2130 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00002133};
2134
2135
Christian Heimes1af737c2008-01-23 08:24:23 +00002136static PyObject *
2137test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
2138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 static char *keywords[] = {
2140 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
2141 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
2142 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00002143#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00002145#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 NULL};
2147 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00002148#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00002150#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 ;
2152 test_structmembers *ob;
2153 const char *s = NULL;
2154 Py_ssize_t string_len = 0;
2155 ob = PyObject_New(test_structmembers, type);
2156 if (ob == NULL)
2157 return NULL;
2158 memset(&ob->structmembers, 0, sizeof(all_structmembers));
2159 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
2160 &ob->structmembers.bool_member,
2161 &ob->structmembers.byte_member,
2162 &ob->structmembers.ubyte_member,
2163 &ob->structmembers.short_member,
2164 &ob->structmembers.ushort_member,
2165 &ob->structmembers.int_member,
2166 &ob->structmembers.uint_member,
2167 &ob->structmembers.long_member,
2168 &ob->structmembers.ulong_member,
2169 &ob->structmembers.pyssizet_member,
2170 &ob->structmembers.float_member,
2171 &ob->structmembers.double_member,
2172 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00002173#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 , &ob->structmembers.longlong_member,
2175 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00002176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 )) {
2178 Py_DECREF(ob);
2179 return NULL;
2180 }
2181 if (s != NULL) {
2182 if (string_len > 5) {
2183 Py_DECREF(ob);
2184 PyErr_SetString(PyExc_ValueError, "string too long");
2185 return NULL;
2186 }
2187 strcpy(ob->structmembers.inplace_member, s);
2188 }
2189 else {
2190 strcpy(ob->structmembers.inplace_member, "");
2191 }
2192 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002193}
2194
Christian Heimes1af737c2008-01-23 08:24:23 +00002195static void
2196test_structmembers_free(PyObject *ob)
2197{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002199}
2200
2201static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002202 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002203 "test_structmembersType",
2204 sizeof(test_structmembers), /* tp_basicsize */
2205 0, /* tp_itemsize */
2206 test_structmembers_free, /* destructor tp_dealloc */
2207 0, /* tp_print */
2208 0, /* tp_getattr */
2209 0, /* tp_setattr */
2210 0, /* tp_reserved */
2211 0, /* tp_repr */
2212 0, /* tp_as_number */
2213 0, /* tp_as_sequence */
2214 0, /* tp_as_mapping */
2215 0, /* tp_hash */
2216 0, /* tp_call */
2217 0, /* tp_str */
2218 PyObject_GenericGetAttr, /* tp_getattro */
2219 PyObject_GenericSetAttr, /* tp_setattro */
2220 0, /* tp_as_buffer */
2221 0, /* tp_flags */
2222 "Type containing all structmember types",
2223 0, /* traverseproc tp_traverse */
2224 0, /* tp_clear */
2225 0, /* tp_richcompare */
2226 0, /* tp_weaklistoffset */
2227 0, /* tp_iter */
2228 0, /* tp_iternext */
2229 0, /* tp_methods */
2230 test_members, /* tp_members */
2231 0,
2232 0,
2233 0,
2234 0,
2235 0,
2236 0,
2237 0,
2238 0,
2239 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002240};
2241
2242
Martin v. Löwis1a214512008-06-11 05:26:20 +00002243
2244static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 PyModuleDef_HEAD_INIT,
2246 "_testcapi",
2247 NULL,
2248 -1,
2249 TestMethods,
2250 NULL,
2251 NULL,
2252 NULL,
2253 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002254};
2255
Mark Hammond62b1ab12002-07-23 06:31:15 +00002256PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002257PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00002258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 m = PyModule_Create(&_testcapimodule);
2262 if (m == NULL)
2263 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
2266 Py_TYPE(&_MemoryViewTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00002267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 Py_TYPE(&test_structmembersType)=&PyType_Type;
2269 Py_INCREF(&test_structmembersType);
2270 /* don't use a name starting with "test", since we don't want
2271 test_capi to automatically call this */
2272 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
2275 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
2276 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
2277 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
2278 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
2279 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
2280 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
2281 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
2282 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
2283 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
2284 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
2285 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
2286 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
2287 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
2288 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
2289 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
2290 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
2291 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
2292 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
2293 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
2294 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
2295 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
2296 Py_INCREF(&PyInstanceMethod_Type);
2297 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00002298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
2300 Py_INCREF(TestError);
2301 PyModule_AddObject(m, "error", TestError);
2302 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002303}