blob: e1dc5f4aa9c13aa6aa2bbd728e19cc6b52486f63 [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
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002014 /* Using PyThreadState_Get() directly allows the test to pass in
2015 !pydebug mode. However, the test only actually tests anything
2016 in pydebug mode, since that's where the infinite loop was in
2017 the first place. */
2018 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002019 Py_END_ALLOW_THREADS
2020 return NULL;
2021}
2022
Tim Peters9ea17ac2001-02-02 05:57:15 +00002023static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 {"raise_exception", raise_exception, METH_VARARGS},
2025 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
2026 {"test_config", (PyCFunction)test_config, METH_NOARGS},
2027 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
2028 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
2029 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
2030 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
2031 {"test_broken_memoryview", (PyCFunction)test_broken_memoryview,METH_NOARGS},
2032 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
2033 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
2034 METH_NOARGS},
2035 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
2036 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
2037 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
2038 {"test_bug_7414", (PyCFunction)test_bug_7414, METH_NOARGS},
2039 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
2040 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
2041 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
2042 PyDoc_STR("This is a pretty normal docstring.")},
2043 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
2044 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
2045 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
2046 {"getargs_tuple", getargs_tuple, METH_VARARGS},
2047 {"getargs_keywords", (PyCFunction)getargs_keywords,
2048 METH_VARARGS|METH_KEYWORDS},
2049 {"getargs_b", getargs_b, METH_VARARGS},
2050 {"getargs_B", getargs_B, METH_VARARGS},
2051 {"getargs_h", getargs_h, METH_VARARGS},
2052 {"getargs_H", getargs_H, METH_VARARGS},
2053 {"getargs_I", getargs_I, METH_VARARGS},
2054 {"getargs_k", getargs_k, METH_VARARGS},
2055 {"getargs_i", getargs_i, METH_VARARGS},
2056 {"getargs_l", getargs_l, METH_VARARGS},
2057 {"getargs_n", getargs_n, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00002058#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 {"getargs_L", getargs_L, METH_VARARGS},
2060 {"getargs_K", getargs_K, METH_VARARGS},
2061 {"test_longlong_api", test_longlong_api, METH_NOARGS},
2062 {"test_long_long_and_overflow",
2063 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
2064 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
2065 {"codec_incrementalencoder",
2066 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
2067 {"codec_incrementaldecoder",
2068 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00002069#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
2071 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
2072 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
2073 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002074#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 {"_test_thread_state", test_thread_state, METH_VARARGS},
2076 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002077#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00002078#ifdef HAVE_GETTIMEOFDAY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00002080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 {"traceback_print", traceback_print, METH_VARARGS},
2082 {"exception_print", exception_print, METH_VARARGS},
2083 {"argparsing", argparsing, METH_VARARGS},
2084 {"code_newempty", code_newempty, METH_VARARGS},
2085 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
2086 METH_VARARGS | METH_KEYWORDS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002087 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00002089};
2090
Thomas Hellera4ea6032003-04-17 18:55:45 +00002091#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
2092
Thomas Wouters89f507f2006-12-13 04:49:30 +00002093typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 char bool_member;
2095 char byte_member;
2096 unsigned char ubyte_member;
2097 short short_member;
2098 unsigned short ushort_member;
2099 int int_member;
2100 unsigned int uint_member;
2101 long long_member;
2102 unsigned long ulong_member;
2103 Py_ssize_t pyssizet_member;
2104 float float_member;
2105 double double_member;
2106 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002107#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 PY_LONG_LONG longlong_member;
2109 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002110#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00002111} all_structmembers;
2112
2113typedef struct {
2114 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002116} test_structmembers;
2117
2118static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
2120 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
2121 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
2122 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
2123 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
2124 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
2125 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
2126 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
2127 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
2128 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
2129 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
2130 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
2131 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002132#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
2134 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002135#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00002137};
2138
2139
Christian Heimes1af737c2008-01-23 08:24:23 +00002140static PyObject *
2141test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
2142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143 static char *keywords[] = {
2144 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
2145 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
2146 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00002147#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00002149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 NULL};
2151 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00002152#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00002154#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002155 ;
2156 test_structmembers *ob;
2157 const char *s = NULL;
2158 Py_ssize_t string_len = 0;
2159 ob = PyObject_New(test_structmembers, type);
2160 if (ob == NULL)
2161 return NULL;
2162 memset(&ob->structmembers, 0, sizeof(all_structmembers));
2163 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
2164 &ob->structmembers.bool_member,
2165 &ob->structmembers.byte_member,
2166 &ob->structmembers.ubyte_member,
2167 &ob->structmembers.short_member,
2168 &ob->structmembers.ushort_member,
2169 &ob->structmembers.int_member,
2170 &ob->structmembers.uint_member,
2171 &ob->structmembers.long_member,
2172 &ob->structmembers.ulong_member,
2173 &ob->structmembers.pyssizet_member,
2174 &ob->structmembers.float_member,
2175 &ob->structmembers.double_member,
2176 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00002177#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 , &ob->structmembers.longlong_member,
2179 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00002180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 )) {
2182 Py_DECREF(ob);
2183 return NULL;
2184 }
2185 if (s != NULL) {
2186 if (string_len > 5) {
2187 Py_DECREF(ob);
2188 PyErr_SetString(PyExc_ValueError, "string too long");
2189 return NULL;
2190 }
2191 strcpy(ob->structmembers.inplace_member, s);
2192 }
2193 else {
2194 strcpy(ob->structmembers.inplace_member, "");
2195 }
2196 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002197}
2198
Christian Heimes1af737c2008-01-23 08:24:23 +00002199static void
2200test_structmembers_free(PyObject *ob)
2201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002203}
2204
2205static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002206 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002207 "test_structmembersType",
2208 sizeof(test_structmembers), /* tp_basicsize */
2209 0, /* tp_itemsize */
2210 test_structmembers_free, /* destructor tp_dealloc */
2211 0, /* tp_print */
2212 0, /* tp_getattr */
2213 0, /* tp_setattr */
2214 0, /* tp_reserved */
2215 0, /* tp_repr */
2216 0, /* tp_as_number */
2217 0, /* tp_as_sequence */
2218 0, /* tp_as_mapping */
2219 0, /* tp_hash */
2220 0, /* tp_call */
2221 0, /* tp_str */
2222 PyObject_GenericGetAttr, /* tp_getattro */
2223 PyObject_GenericSetAttr, /* tp_setattro */
2224 0, /* tp_as_buffer */
2225 0, /* tp_flags */
2226 "Type containing all structmember types",
2227 0, /* traverseproc tp_traverse */
2228 0, /* tp_clear */
2229 0, /* tp_richcompare */
2230 0, /* tp_weaklistoffset */
2231 0, /* tp_iter */
2232 0, /* tp_iternext */
2233 0, /* tp_methods */
2234 test_members, /* tp_members */
2235 0,
2236 0,
2237 0,
2238 0,
2239 0,
2240 0,
2241 0,
2242 0,
2243 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002244};
2245
2246
Martin v. Löwis1a214512008-06-11 05:26:20 +00002247
2248static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002249 PyModuleDef_HEAD_INIT,
2250 "_testcapi",
2251 NULL,
2252 -1,
2253 TestMethods,
2254 NULL,
2255 NULL,
2256 NULL,
2257 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002258};
2259
Mark Hammond62b1ab12002-07-23 06:31:15 +00002260PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002261PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00002262{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 m = PyModule_Create(&_testcapimodule);
2266 if (m == NULL)
2267 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
2270 Py_TYPE(&_MemoryViewTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00002271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 Py_TYPE(&test_structmembersType)=&PyType_Type;
2273 Py_INCREF(&test_structmembersType);
2274 /* don't use a name starting with "test", since we don't want
2275 test_capi to automatically call this */
2276 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
2279 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
2280 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
2281 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
2282 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
2283 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
2284 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
2285 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
2286 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
2287 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
2288 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
2289 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
2290 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
2291 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
2292 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
2293 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
2294 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
2295 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
2296 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
2297 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
2298 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
2299 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
2300 Py_INCREF(&PyInstanceMethod_Type);
2301 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00002302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
2304 Py_INCREF(TestError);
2305 PyModule_AddObject(m, "error", TestError);
2306 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002307}