blob: 91f291a011ff68f8f3b153b55223553b5a027cfb [file] [log] [blame]
Tim Peters9ea17ac2001-02-02 05:57:15 +00001/*
2 * C Extension module to test Python interpreter C APIs.
3 *
4 * The 'test_*' functions exported by this module are run as part of the
5 * standard Python regression test, via Lib/test/test_capi.py.
6 */
7
Neal Norwitz8866e0a2007-10-27 04:01:17 +00008#define PY_SSIZE_T_CLEAN
9
Tim Peters9ea17ac2001-02-02 05:57:15 +000010#include "Python.h"
Thomas Wouters89f507f2006-12-13 04:49:30 +000011#include <float.h>
12#include "structmember.h"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000013#include "datetime.h"
Tim Peters9ea17ac2001-02-02 05:57:15 +000014
Mark Hammond8d98d2c2003-04-19 15:41:53 +000015#ifdef WITH_THREAD
16#include "pythread.h"
17#endif /* WITH_THREAD */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000018static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000019
Tim Peters91621db2001-06-12 20:10:01 +000020/* Raise TestError with test_name + ": " + msg, and return NULL. */
21
22static PyObject *
23raiseTestError(const char* test_name, const char* msg)
24{
Victor Stinner6ced7c42011-03-21 18:15:42 +010025 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000026 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000027}
28
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000029/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000030
31 The ones derived from autoconf on the UNIX-like OSes can be relied
32 upon (in the absence of sloppy cross-compiling), but the Windows
33 platforms have these hardcoded. Better safe than sorry.
34*/
35static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000036sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000038{
Victor Stinner499dfcf2011-03-21 13:26:24 +010039 PyErr_Format(TestError,
40 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000041 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000043}
44
45static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000046test_config(PyObject *self)
Tim Peters9ea17ac2001-02-02 05:57:15 +000047{
Tim Peters9ea17ac2001-02-02 05:57:15 +000048#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 if (FATNAME != sizeof(TYPE)) \
50 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 CHECK_SIZEOF(SIZEOF_SHORT, short);
53 CHECK_SIZEOF(SIZEOF_INT, int);
54 CHECK_SIZEOF(SIZEOF_LONG, long);
55 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
56 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Tim Peters9ea17ac2001-02-02 05:57:15 +000057#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
Tim Peters9ea17ac2001-02-02 05:57:15 +000059#endif
60
61#undef CHECK_SIZEOF
62
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 Py_INCREF(Py_None);
64 return Py_None;
Tim Peters9ea17ac2001-02-02 05:57:15 +000065}
66
Tim Peters5c4d5bf2001-02-12 22:13:26 +000067static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000068test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +000069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 PyObject* list;
71 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +000072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +000074#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 list = PyList_New(NLIST);
76 if (list == (PyObject*)NULL)
77 return (PyObject*)NULL;
78 /* list = range(NLIST) */
79 for (i = 0; i < NLIST; ++i) {
80 PyObject* anint = PyLong_FromLong(i);
81 if (anint == (PyObject*)NULL) {
82 Py_DECREF(list);
83 return (PyObject*)NULL;
84 }
85 PyList_SET_ITEM(list, i, anint);
86 }
87 /* list.reverse(), via PyList_Reverse() */
88 i = PyList_Reverse(list); /* should not blow up! */
89 if (i != 0) {
90 Py_DECREF(list);
91 return (PyObject*)NULL;
92 }
93 /* Check that list == range(29, -1, -1) now */
94 for (i = 0; i < NLIST; ++i) {
95 PyObject* anint = PyList_GET_ITEM(list, i);
96 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
97 PyErr_SetString(TestError,
98 "test_list_api: reverse screwed up");
99 Py_DECREF(list);
100 return (PyObject*)NULL;
101 }
102 }
103 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000104#undef NLIST
105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 Py_INCREF(Py_None);
107 return Py_None;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000108}
109
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000110static int
111test_dict_inner(int count)
112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 Py_ssize_t pos = 0, iterations = 0;
114 int i;
115 PyObject *dict = PyDict_New();
116 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 if (dict == NULL)
119 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 for (i = 0; i < count; i++) {
122 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200123 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200124 return -1;
125 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200126 if (PyDict_SetItem(dict, v, v) < 0) {
127 Py_DECREF(v);
128 return -1;
129 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 Py_DECREF(v);
131 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000133 while (PyDict_Next(dict, &pos, &k, &v)) {
134 PyObject *o;
135 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 i = PyLong_AS_LONG(v) + 1;
138 o = PyLong_FromLong(i);
139 if (o == NULL)
140 return -1;
141 if (PyDict_SetItem(dict, k, o) < 0) {
142 Py_DECREF(o);
143 return -1;
144 }
145 Py_DECREF(o);
146 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000150 if (iterations != count) {
151 PyErr_SetString(
152 TestError,
153 "test_dict_iteration: dict iteration went wrong ");
154 return -1;
155 } else {
156 return 0;
157 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000158}
159
160static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000161test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 for (i = 0; i < 200; i++) {
166 if (test_dict_inner(i) < 0) {
167 return NULL;
168 }
169 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 Py_INCREF(Py_None);
172 return Py_None;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000173}
174
Tim Peters91621db2001-06-12 20:10:01 +0000175
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000176/* Issue #4701: Check that PyObject_Hash implicitly calls
177 * PyType_Ready if it hasn't already been called
178 */
179static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 PyVarObject_HEAD_INIT(NULL, 0)
181 "hashinheritancetester", /* Name of this type */
182 sizeof(PyObject), /* Basic object size */
183 0, /* Item size for varobject */
184 (destructor)PyObject_Del, /* tp_dealloc */
185 0, /* tp_print */
186 0, /* tp_getattr */
187 0, /* tp_setattr */
188 0, /* tp_reserved */
189 0, /* tp_repr */
190 0, /* tp_as_number */
191 0, /* tp_as_sequence */
192 0, /* tp_as_mapping */
193 0, /* tp_hash */
194 0, /* tp_call */
195 0, /* tp_str */
196 PyObject_GenericGetAttr, /* tp_getattro */
197 0, /* tp_setattro */
198 0, /* tp_as_buffer */
199 Py_TPFLAGS_DEFAULT, /* tp_flags */
200 0, /* tp_doc */
201 0, /* tp_traverse */
202 0, /* tp_clear */
203 0, /* tp_richcompare */
204 0, /* tp_weaklistoffset */
205 0, /* tp_iter */
206 0, /* tp_iternext */
207 0, /* tp_methods */
208 0, /* tp_members */
209 0, /* tp_getset */
210 0, /* tp_base */
211 0, /* tp_dict */
212 0, /* tp_descr_get */
213 0, /* tp_descr_set */
214 0, /* tp_dictoffset */
215 0, /* tp_init */
216 0, /* tp_alloc */
217 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000218};
219
220static PyObject*
221test_lazy_hash_inheritance(PyObject* self)
222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 PyTypeObject *type;
224 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000225 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 if (type->tp_dict != NULL)
230 /* The type has already been initialized. This probably means
231 -R is being used. */
232 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000233
234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 obj = PyObject_New(PyObject, type);
236 if (obj == NULL) {
237 PyErr_Clear();
238 PyErr_SetString(
239 TestError,
240 "test_lazy_hash_inheritance: failed to create object");
241 return NULL;
242 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 if (type->tp_dict != NULL) {
245 PyErr_SetString(
246 TestError,
247 "test_lazy_hash_inheritance: type initialised too soon");
248 Py_DECREF(obj);
249 return NULL;
250 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 hash = PyObject_Hash(obj);
253 if ((hash == -1) && PyErr_Occurred()) {
254 PyErr_Clear();
255 PyErr_SetString(
256 TestError,
257 "test_lazy_hash_inheritance: could not hash object");
258 Py_DECREF(obj);
259 return NULL;
260 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 if (type->tp_dict == NULL) {
263 PyErr_SetString(
264 TestError,
265 "test_lazy_hash_inheritance: type not initialised by hash()");
266 Py_DECREF(obj);
267 return NULL;
268 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 if (type->tp_hash != PyType_Type.tp_hash) {
271 PyErr_SetString(
272 TestError,
273 "test_lazy_hash_inheritance: unexpected hash function");
274 Py_DECREF(obj);
275 return NULL;
276 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000281}
282
283
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000284/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
Tim Petersff70d3c2001-06-14 01:11:03 +0000285 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000286
287 Note that the meat of the test is contained in testcapi_long.h.
288 This is revolting, but delicate code duplication is worse: "almost
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000289 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000290 dependence on type names makes it impossible to use a parameterized
291 function. A giant macro would be even worse than this. A C++ template
292 would be perfect.
293
294 The "report an error" functions are deliberately not part of the #include
295 file: if the test fails, you can set a breakpoint in the appropriate
296 error function directly, and crawl back from there in the debugger.
297*/
298
299#define UNBIND(X) Py_DECREF(X); (X) = NULL
300
301static PyObject *
302raise_test_long_error(const char* msg)
303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000305}
306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307#define TESTNAME test_long_api_inner
308#define TYPENAME long
309#define F_S_TO_PY PyLong_FromLong
310#define F_PY_TO_S PyLong_AsLong
311#define F_U_TO_PY PyLong_FromUnsignedLong
312#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000313
314#include "testcapi_long.h"
315
316static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000317test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000320}
321
322#undef TESTNAME
323#undef TYPENAME
324#undef F_S_TO_PY
325#undef F_PY_TO_S
326#undef F_U_TO_PY
327#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000328
329#ifdef HAVE_LONG_LONG
Tim Peters91621db2001-06-12 20:10:01 +0000330
331static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000332raise_test_longlong_error(const char* msg)
333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000335}
336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337#define TESTNAME test_longlong_api_inner
338#define TYPENAME PY_LONG_LONG
339#define F_S_TO_PY PyLong_FromLongLong
340#define F_PY_TO_S PyLong_AsLongLong
341#define F_U_TO_PY PyLong_FromUnsignedLongLong
342#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000343
344#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000345
346static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000347test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000350}
351
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000352#undef TESTNAME
353#undef TYPENAME
354#undef F_S_TO_PY
355#undef F_PY_TO_S
356#undef F_U_TO_PY
357#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000358
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000359/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
360 is tested by test_long_api_inner. This test will concentrate on proper
361 handling of overflow.
362*/
363
364static PyObject *
365test_long_and_overflow(PyObject *self)
366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 PyObject *num, *one, *temp;
368 long value;
369 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 /* Test that overflow is set properly for a large value. */
372 /* num is a number larger than LONG_MAX even on 64-bit platforms */
373 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
374 if (num == NULL)
375 return NULL;
376 overflow = 1234;
377 value = PyLong_AsLongAndOverflow(num, &overflow);
378 Py_DECREF(num);
379 if (value == -1 && PyErr_Occurred())
380 return NULL;
381 if (value != -1)
382 return raiseTestError("test_long_and_overflow",
383 "return value was not set to -1");
384 if (overflow != 1)
385 return raiseTestError("test_long_and_overflow",
386 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 /* Same again, with num = LONG_MAX + 1 */
389 num = PyLong_FromLong(LONG_MAX);
390 if (num == NULL)
391 return NULL;
392 one = PyLong_FromLong(1L);
393 if (one == NULL) {
394 Py_DECREF(num);
395 return NULL;
396 }
397 temp = PyNumber_Add(num, one);
398 Py_DECREF(one);
399 Py_DECREF(num);
400 num = temp;
401 if (num == NULL)
402 return NULL;
403 overflow = 0;
404 value = PyLong_AsLongAndOverflow(num, &overflow);
405 Py_DECREF(num);
406 if (value == -1 && PyErr_Occurred())
407 return NULL;
408 if (value != -1)
409 return raiseTestError("test_long_and_overflow",
410 "return value was not set to -1");
411 if (overflow != 1)
412 return raiseTestError("test_long_and_overflow",
413 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 /* Test that overflow is set properly for a large negative value. */
416 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
417 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
418 if (num == NULL)
419 return NULL;
420 overflow = 1234;
421 value = PyLong_AsLongAndOverflow(num, &overflow);
422 Py_DECREF(num);
423 if (value == -1 && PyErr_Occurred())
424 return NULL;
425 if (value != -1)
426 return raiseTestError("test_long_and_overflow",
427 "return value was not set to -1");
428 if (overflow != -1)
429 return raiseTestError("test_long_and_overflow",
430 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 /* Same again, with num = LONG_MIN - 1 */
433 num = PyLong_FromLong(LONG_MIN);
434 if (num == NULL)
435 return NULL;
436 one = PyLong_FromLong(1L);
437 if (one == NULL) {
438 Py_DECREF(num);
439 return NULL;
440 }
441 temp = PyNumber_Subtract(num, one);
442 Py_DECREF(one);
443 Py_DECREF(num);
444 num = temp;
445 if (num == NULL)
446 return NULL;
447 overflow = 0;
448 value = PyLong_AsLongAndOverflow(num, &overflow);
449 Py_DECREF(num);
450 if (value == -1 && PyErr_Occurred())
451 return NULL;
452 if (value != -1)
453 return raiseTestError("test_long_and_overflow",
454 "return value was not set to -1");
455 if (overflow != -1)
456 return raiseTestError("test_long_and_overflow",
457 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 /* Test that overflow is cleared properly for small values. */
460 num = PyLong_FromString("FF", NULL, 16);
461 if (num == NULL)
462 return NULL;
463 overflow = 1234;
464 value = PyLong_AsLongAndOverflow(num, &overflow);
465 Py_DECREF(num);
466 if (value == -1 && PyErr_Occurred())
467 return NULL;
468 if (value != 0xFF)
469 return raiseTestError("test_long_and_overflow",
470 "expected return value 0xFF");
471 if (overflow != 0)
472 return raiseTestError("test_long_and_overflow",
473 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 num = PyLong_FromString("-FF", NULL, 16);
476 if (num == NULL)
477 return NULL;
478 overflow = 0;
479 value = PyLong_AsLongAndOverflow(num, &overflow);
480 Py_DECREF(num);
481 if (value == -1 && PyErr_Occurred())
482 return NULL;
483 if (value != -0xFF)
484 return raiseTestError("test_long_and_overflow",
485 "expected return value 0xFF");
486 if (overflow != 0)
487 return raiseTestError("test_long_and_overflow",
488 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 num = PyLong_FromLong(LONG_MAX);
491 if (num == NULL)
492 return NULL;
493 overflow = 1234;
494 value = PyLong_AsLongAndOverflow(num, &overflow);
495 Py_DECREF(num);
496 if (value == -1 && PyErr_Occurred())
497 return NULL;
498 if (value != LONG_MAX)
499 return raiseTestError("test_long_and_overflow",
500 "expected return value LONG_MAX");
501 if (overflow != 0)
502 return raiseTestError("test_long_and_overflow",
503 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 num = PyLong_FromLong(LONG_MIN);
506 if (num == NULL)
507 return NULL;
508 overflow = 0;
509 value = PyLong_AsLongAndOverflow(num, &overflow);
510 Py_DECREF(num);
511 if (value == -1 && PyErr_Occurred())
512 return NULL;
513 if (value != LONG_MIN)
514 return raiseTestError("test_long_and_overflow",
515 "expected return value LONG_MIN");
516 if (overflow != 0)
517 return raiseTestError("test_long_and_overflow",
518 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 Py_INCREF(Py_None);
521 return Py_None;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000522}
523
Mark Dickinson93f562c2010-01-30 10:30:15 +0000524/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
525 PY_LONG_LONG is tested by test_long_api_inner. This test will
526 concentrate on proper handling of overflow.
527*/
528
529static PyObject *
530test_long_long_and_overflow(PyObject *self)
531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 PyObject *num, *one, *temp;
533 PY_LONG_LONG value;
534 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 /* Test that overflow is set properly for a large value. */
537 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
538 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
539 if (num == NULL)
540 return NULL;
541 overflow = 1234;
542 value = PyLong_AsLongLongAndOverflow(num, &overflow);
543 Py_DECREF(num);
544 if (value == -1 && PyErr_Occurred())
545 return NULL;
546 if (value != -1)
547 return raiseTestError("test_long_long_and_overflow",
548 "return value was not set to -1");
549 if (overflow != 1)
550 return raiseTestError("test_long_long_and_overflow",
551 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 /* Same again, with num = PY_LLONG_MAX + 1 */
554 num = PyLong_FromLongLong(PY_LLONG_MAX);
555 if (num == NULL)
556 return NULL;
557 one = PyLong_FromLong(1L);
558 if (one == NULL) {
559 Py_DECREF(num);
560 return NULL;
561 }
562 temp = PyNumber_Add(num, one);
563 Py_DECREF(one);
564 Py_DECREF(num);
565 num = temp;
566 if (num == NULL)
567 return NULL;
568 overflow = 0;
569 value = PyLong_AsLongLongAndOverflow(num, &overflow);
570 Py_DECREF(num);
571 if (value == -1 && PyErr_Occurred())
572 return NULL;
573 if (value != -1)
574 return raiseTestError("test_long_long_and_overflow",
575 "return value was not set to -1");
576 if (overflow != 1)
577 return raiseTestError("test_long_long_and_overflow",
578 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 /* Test that overflow is set properly for a large negative value. */
581 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
582 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
583 if (num == NULL)
584 return NULL;
585 overflow = 1234;
586 value = PyLong_AsLongLongAndOverflow(num, &overflow);
587 Py_DECREF(num);
588 if (value == -1 && PyErr_Occurred())
589 return NULL;
590 if (value != -1)
591 return raiseTestError("test_long_long_and_overflow",
592 "return value was not set to -1");
593 if (overflow != -1)
594 return raiseTestError("test_long_long_and_overflow",
595 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 /* Same again, with num = PY_LLONG_MIN - 1 */
598 num = PyLong_FromLongLong(PY_LLONG_MIN);
599 if (num == NULL)
600 return NULL;
601 one = PyLong_FromLong(1L);
602 if (one == NULL) {
603 Py_DECREF(num);
604 return NULL;
605 }
606 temp = PyNumber_Subtract(num, one);
607 Py_DECREF(one);
608 Py_DECREF(num);
609 num = temp;
610 if (num == NULL)
611 return NULL;
612 overflow = 0;
613 value = PyLong_AsLongLongAndOverflow(num, &overflow);
614 Py_DECREF(num);
615 if (value == -1 && PyErr_Occurred())
616 return NULL;
617 if (value != -1)
618 return raiseTestError("test_long_long_and_overflow",
619 "return value was not set to -1");
620 if (overflow != -1)
621 return raiseTestError("test_long_long_and_overflow",
622 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 /* Test that overflow is cleared properly for small values. */
625 num = PyLong_FromString("FF", NULL, 16);
626 if (num == NULL)
627 return NULL;
628 overflow = 1234;
629 value = PyLong_AsLongLongAndOverflow(num, &overflow);
630 Py_DECREF(num);
631 if (value == -1 && PyErr_Occurred())
632 return NULL;
633 if (value != 0xFF)
634 return raiseTestError("test_long_long_and_overflow",
635 "expected return value 0xFF");
636 if (overflow != 0)
637 return raiseTestError("test_long_long_and_overflow",
638 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 num = PyLong_FromString("-FF", NULL, 16);
641 if (num == NULL)
642 return NULL;
643 overflow = 0;
644 value = PyLong_AsLongLongAndOverflow(num, &overflow);
645 Py_DECREF(num);
646 if (value == -1 && PyErr_Occurred())
647 return NULL;
648 if (value != -0xFF)
649 return raiseTestError("test_long_long_and_overflow",
650 "expected return value 0xFF");
651 if (overflow != 0)
652 return raiseTestError("test_long_long_and_overflow",
653 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 num = PyLong_FromLongLong(PY_LLONG_MAX);
656 if (num == NULL)
657 return NULL;
658 overflow = 1234;
659 value = PyLong_AsLongLongAndOverflow(num, &overflow);
660 Py_DECREF(num);
661 if (value == -1 && PyErr_Occurred())
662 return NULL;
663 if (value != PY_LLONG_MAX)
664 return raiseTestError("test_long_long_and_overflow",
665 "expected return value PY_LLONG_MAX");
666 if (overflow != 0)
667 return raiseTestError("test_long_long_and_overflow",
668 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 num = PyLong_FromLongLong(PY_LLONG_MIN);
671 if (num == NULL)
672 return NULL;
673 overflow = 0;
674 value = PyLong_AsLongLongAndOverflow(num, &overflow);
675 Py_DECREF(num);
676 if (value == -1 && PyErr_Occurred())
677 return NULL;
678 if (value != PY_LLONG_MIN)
679 return raiseTestError("test_long_long_and_overflow",
680 "expected return value PY_LLONG_MIN");
681 if (overflow != 0)
682 return raiseTestError("test_long_long_and_overflow",
683 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 Py_INCREF(Py_None);
686 return Py_None;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000687}
688
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200689/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
690 non-integer arguments are handled correctly. It should be extended to
691 test overflow handling.
692 */
693
694static PyObject *
695test_long_as_size_t(PyObject *self)
696{
697 size_t out_u;
698 Py_ssize_t out_s;
699
700 Py_INCREF(Py_None);
701
702 out_u = PyLong_AsSize_t(Py_None);
703 if (out_u != (size_t)-1 || !PyErr_Occurred())
704 return raiseTestError("test_long_as_size_t",
705 "PyLong_AsSize_t(None) didn't complain");
706 if (!PyErr_ExceptionMatches(PyExc_TypeError))
707 return raiseTestError("test_long_as_size_t",
708 "PyLong_AsSize_t(None) raised "
709 "something other than TypeError");
710 PyErr_Clear();
711
712 out_s = PyLong_AsSsize_t(Py_None);
713 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
714 return raiseTestError("test_long_as_size_t",
715 "PyLong_AsSsize_t(None) didn't complain");
716 if (!PyErr_ExceptionMatches(PyExc_TypeError))
717 return raiseTestError("test_long_as_size_t",
718 "PyLong_AsSsize_t(None) raised "
719 "something other than TypeError");
720 PyErr_Clear();
721
722 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
723 return Py_None;
724}
725
726/* Test the PyLong_AsDouble API. At present this just tests that
727 non-integer arguments are handled correctly.
728 */
729
730static PyObject *
731test_long_as_double(PyObject *self)
732{
733 double out;
734
735 Py_INCREF(Py_None);
736
737 out = PyLong_AsDouble(Py_None);
738 if (out != -1.0 || !PyErr_Occurred())
739 return raiseTestError("test_long_as_double",
740 "PyLong_AsDouble(None) didn't complain");
741 if (!PyErr_ExceptionMatches(PyExc_TypeError))
742 return raiseTestError("test_long_as_double",
743 "PyLong_AsDouble(None) raised "
744 "something other than TypeError");
745 PyErr_Clear();
746
747 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
748 return Py_None;
749}
750
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000751/* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
Tim Petersd38b1c72001-09-30 05:09:37 +0000752 for both long and int arguments. The test may leak a little memory if
753 it fails.
754*/
755static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000756test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000757{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 PyObject *tuple, *num;
759 PY_LONG_LONG value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 tuple = PyTuple_New(1);
762 if (tuple == NULL)
763 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 num = PyLong_FromLong(42);
766 if (num == NULL)
767 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 value = -1;
772 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
773 return NULL;
774 if (value != 42)
775 return raiseTestError("test_L_code",
776 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 Py_DECREF(num);
779 num = PyLong_FromLong(42);
780 if (num == NULL)
781 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 value = -1;
786 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
787 return NULL;
788 if (value != 42)
789 return raiseTestError("test_L_code",
790 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 Py_DECREF(tuple);
793 Py_INCREF(Py_None);
794 return Py_None;
Tim Petersd38b1c72001-09-30 05:09:37 +0000795}
796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797#endif /* ifdef HAVE_LONG_LONG */
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000798
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000799/* Test tuple argument processing */
800static PyObject *
801getargs_tuple(PyObject *self, PyObject *args)
802{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 int a, b, c;
804 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
805 return NULL;
806 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000807}
808
Christian Heimes380f7f22008-02-28 11:19:05 +0000809/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +0000810static PyObject *
811getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +0000812{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
814 static char *fmt="(ii)i|(i(ii))(iii)i";
815 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +0000816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
818 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
819 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
820 return NULL;
821 return Py_BuildValue("iiiiiiiiii",
822 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
823 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +0000824}
825
Larry Hastings83a9f482012-03-20 20:06:16 +0000826/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
827static PyObject *
828getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
829{
830 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
831 int required = -1;
832 int optional = -1;
833 int keyword_only = -1;
834
835 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
836 &required, &optional, &keyword_only))
837 return NULL;
838 return Py_BuildValue("iii", required, optional, keyword_only);
839}
840
Thomas Heller3457e4b2003-04-24 16:14:27 +0000841/* Functions to call PyArg_ParseTuple with integer format codes,
842 and return the result.
843*/
Thomas Hellera4ea6032003-04-17 18:55:45 +0000844static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000845getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000846{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 unsigned char value;
848 if (!PyArg_ParseTuple(args, "b", &value))
849 return NULL;
850 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000851}
852
Thomas Heller3457e4b2003-04-24 16:14:27 +0000853static PyObject *
854getargs_B(PyObject *self, PyObject *args)
855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 unsigned char value;
857 if (!PyArg_ParseTuple(args, "B", &value))
858 return NULL;
859 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000860}
861
862static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +0000863getargs_h(PyObject *self, PyObject *args)
864{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 short value;
866 if (!PyArg_ParseTuple(args, "h", &value))
867 return NULL;
868 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +0000869}
870
871static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000872getargs_H(PyObject *self, PyObject *args)
873{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 unsigned short value;
875 if (!PyArg_ParseTuple(args, "H", &value))
876 return NULL;
877 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000878}
879
880static PyObject *
881getargs_I(PyObject *self, PyObject *args)
882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 unsigned int value;
884 if (!PyArg_ParseTuple(args, "I", &value))
885 return NULL;
886 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000887}
888
889static PyObject *
890getargs_k(PyObject *self, PyObject *args)
891{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 unsigned long value;
893 if (!PyArg_ParseTuple(args, "k", &value))
894 return NULL;
895 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000896}
897
898static PyObject *
899getargs_i(PyObject *self, PyObject *args)
900{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 int value;
902 if (!PyArg_ParseTuple(args, "i", &value))
903 return NULL;
904 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000905}
906
Thomas Hellera4ea6032003-04-17 18:55:45 +0000907static PyObject *
908getargs_l(PyObject *self, PyObject *args)
909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 long value;
911 if (!PyArg_ParseTuple(args, "l", &value))
912 return NULL;
913 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000914}
915
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000916static PyObject *
917getargs_n(PyObject *self, PyObject *args)
918{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 Py_ssize_t value;
920 if (!PyArg_ParseTuple(args, "n", &value))
921 return NULL;
922 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000923}
924
Larry Hastingsfaf91e72012-05-05 16:54:29 -0700925static PyObject *
926getargs_p(PyObject *self, PyObject *args)
927{
928 int value;
929 if (!PyArg_ParseTuple(args, "p", &value))
930 return NULL;
931 return PyLong_FromLong(value);
932}
933
Thomas Hellera4ea6032003-04-17 18:55:45 +0000934#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +0000935static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000936getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 PY_LONG_LONG value;
939 if (!PyArg_ParseTuple(args, "L", &value))
940 return NULL;
941 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000942}
943
Thomas Hellera4ea6032003-04-17 18:55:45 +0000944static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000945getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 unsigned PY_LONG_LONG value;
948 if (!PyArg_ParseTuple(args, "K", &value))
949 return NULL;
950 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000951}
952#endif
953
954/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +0000955 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +0000956static PyObject *
957test_k_code(PyObject *self)
958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 PyObject *tuple, *num;
960 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 tuple = PyTuple_New(1);
963 if (tuple == NULL)
964 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 /* a number larger than ULONG_MAX even on 64-bit platforms */
967 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
968 if (num == NULL)
969 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 value = PyLong_AsUnsignedLongMask(num);
972 if (value != ULONG_MAX)
973 return raiseTestError("test_k_code",
974 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 value = 0;
979 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
980 return NULL;
981 if (value != ULONG_MAX)
982 return raiseTestError("test_k_code",
983 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 Py_DECREF(num);
986 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
987 if (num == NULL)
988 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 value = PyLong_AsUnsignedLongMask(num);
991 if (value != (unsigned long)-0x42)
992 return raiseTestError("test_k_code",
993 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +0000994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 value = 0;
998 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
999 return NULL;
1000 if (value != (unsigned long)-0x42)
1001 return raiseTestError("test_k_code",
1002 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 Py_DECREF(tuple);
1005 Py_INCREF(Py_None);
1006 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001007}
1008
Victor Stinner06e49dd2010-06-13 18:21:50 +00001009static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001010getargs_c(PyObject *self, PyObject *args)
1011{
1012 char c;
1013 if (!PyArg_ParseTuple(args, "c", &c))
1014 return NULL;
1015 return PyBytes_FromStringAndSize(&c, 1);
1016}
1017
1018static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001019getargs_s(PyObject *self, PyObject *args)
1020{
1021 char *str;
1022 if (!PyArg_ParseTuple(args, "s", &str))
1023 return NULL;
1024 return PyBytes_FromString(str);
1025}
1026
1027static PyObject *
1028getargs_s_star(PyObject *self, PyObject *args)
1029{
1030 Py_buffer buffer;
1031 PyObject *bytes;
1032 if (!PyArg_ParseTuple(args, "s*", &buffer))
1033 return NULL;
1034 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1035 PyBuffer_Release(&buffer);
1036 return bytes;
1037}
1038
1039static PyObject *
1040getargs_s_hash(PyObject *self, PyObject *args)
1041{
1042 char *str;
1043 Py_ssize_t size;
1044 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1045 return NULL;
1046 return PyBytes_FromStringAndSize(str, size);
1047}
1048
1049static PyObject *
1050getargs_z(PyObject *self, PyObject *args)
1051{
1052 char *str;
1053 if (!PyArg_ParseTuple(args, "z", &str))
1054 return NULL;
1055 if (str != NULL)
1056 return PyBytes_FromString(str);
1057 else
1058 Py_RETURN_NONE;
1059}
1060
1061static PyObject *
1062getargs_z_star(PyObject *self, PyObject *args)
1063{
1064 Py_buffer buffer;
1065 PyObject *bytes;
1066 if (!PyArg_ParseTuple(args, "z*", &buffer))
1067 return NULL;
1068 if (buffer.buf != NULL)
1069 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1070 else {
1071 Py_INCREF(Py_None);
1072 bytes = Py_None;
1073 }
1074 PyBuffer_Release(&buffer);
1075 return bytes;
1076}
1077
1078static PyObject *
1079getargs_z_hash(PyObject *self, PyObject *args)
1080{
1081 char *str;
1082 Py_ssize_t size;
1083 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1084 return NULL;
1085 if (str != NULL)
1086 return PyBytes_FromStringAndSize(str, size);
1087 else
1088 Py_RETURN_NONE;
1089}
1090
1091static PyObject *
1092getargs_y(PyObject *self, PyObject *args)
1093{
1094 char *str;
1095 if (!PyArg_ParseTuple(args, "y", &str))
1096 return NULL;
1097 return PyBytes_FromString(str);
1098}
1099
1100static PyObject *
1101getargs_y_star(PyObject *self, PyObject *args)
1102{
1103 Py_buffer buffer;
1104 PyObject *bytes;
1105 if (!PyArg_ParseTuple(args, "y*", &buffer))
1106 return NULL;
1107 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1108 PyBuffer_Release(&buffer);
1109 return bytes;
1110}
1111
1112static PyObject *
1113getargs_y_hash(PyObject *self, PyObject *args)
1114{
1115 char *str;
1116 Py_ssize_t size;
1117 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1118 return NULL;
1119 return PyBytes_FromStringAndSize(str, size);
1120}
1121
1122static PyObject *
1123getargs_u(PyObject *self, PyObject *args)
1124{
1125 Py_UNICODE *str;
1126 Py_ssize_t size;
1127 if (!PyArg_ParseTuple(args, "u", &str))
1128 return NULL;
1129 size = Py_UNICODE_strlen(str);
1130 return PyUnicode_FromUnicode(str, size);
1131}
1132
1133static PyObject *
1134getargs_u_hash(PyObject *self, PyObject *args)
1135{
1136 Py_UNICODE *str;
1137 Py_ssize_t size;
1138 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1139 return NULL;
1140 return PyUnicode_FromUnicode(str, size);
1141}
1142
1143static PyObject *
1144getargs_Z(PyObject *self, PyObject *args)
1145{
1146 Py_UNICODE *str;
1147 Py_ssize_t size;
1148 if (!PyArg_ParseTuple(args, "Z", &str))
1149 return NULL;
1150 if (str != NULL) {
1151 size = Py_UNICODE_strlen(str);
1152 return PyUnicode_FromUnicode(str, size);
1153 } else
1154 Py_RETURN_NONE;
1155}
1156
1157static PyObject *
1158getargs_Z_hash(PyObject *self, PyObject *args)
1159{
1160 Py_UNICODE *str;
1161 Py_ssize_t size;
1162 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1163 return NULL;
1164 if (str != NULL)
1165 return PyUnicode_FromUnicode(str, size);
1166 else
1167 Py_RETURN_NONE;
1168}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001169
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001170/* Test the s and z codes for PyArg_ParseTuple.
1171*/
1172static PyObject *
1173test_s_code(PyObject *self)
1174{
1175 /* Unicode strings should be accepted */
1176 PyObject *tuple, *obj;
1177 char *value;
1178
1179 tuple = PyTuple_New(1);
1180 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001182
1183 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001185 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001187
1188 PyTuple_SET_ITEM(tuple, 0, obj);
1189
1190 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001192 */
1193 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001195
1196 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001198
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001199 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001200 Py_RETURN_NONE;
1201}
1202
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001203static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001204parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001205{
Larry Hastings8f904da2012-06-22 03:56:29 -07001206 PyObject *sub_args;
1207 PyObject *sub_kwargs;
1208 char *sub_format;
1209 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001210
Larry Hastings8f904da2012-06-22 03:56:29 -07001211 Py_ssize_t i, size;
1212 char *keywords[8 + 1]; /* space for NULL at end */
1213 PyObject *o;
1214 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001215
Larry Hastings8f904da2012-06-22 03:56:29 -07001216 int result;
1217 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001218
Larry Hastings22701e82012-08-08 14:52:22 -07001219 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001220
Larry Hastings8f904da2012-06-22 03:56:29 -07001221 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1222 &sub_args, &sub_kwargs,
1223 &sub_format, &sub_keywords))
1224 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001225
Larry Hastings8f904da2012-06-22 03:56:29 -07001226 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1227 PyErr_SetString(PyExc_ValueError,
1228 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1229 return NULL;
1230 }
1231
1232 memset(buffers, 0, sizeof(buffers));
1233 memset(converted, 0, sizeof(converted));
1234 memset(keywords, 0, sizeof(keywords));
1235
1236 size = PySequence_Fast_GET_SIZE(sub_keywords);
1237 if (size > 8) {
1238 PyErr_SetString(PyExc_ValueError,
1239 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1240 goto exit;
1241 }
1242
1243 for (i = 0; i < size; i++) {
1244 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1245 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1246 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001247 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001248 goto exit;
1249 }
1250 keywords[i] = PyBytes_AS_STRING(converted[i]);
1251 }
1252
1253 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1254 sub_format, keywords,
1255 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1256 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1257
1258 if (result) {
1259 return_value = Py_None;
1260 Py_INCREF(Py_None);
1261 }
1262
1263exit:
1264 size = sizeof(converted) / sizeof(converted[0]);
1265 for (i = 0; i < size; i++) {
1266 Py_XDECREF(converted[i]);
1267 }
1268 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001269}
1270
Benjamin Peterson92035012008-12-27 16:00:54 +00001271static volatile int x;
1272
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001273/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1274 of an error.
1275*/
1276static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001277test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 PyObject *tuple, *obj;
1280 Py_UNICODE *value;
1281 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1284 /* Just use the macro and check that it compiles */
1285 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 tuple = PyTuple_New(1);
1288 if (tuple == NULL)
1289 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 obj = PyUnicode_Decode("test", strlen("test"),
1292 "ascii", NULL);
1293 if (obj == NULL)
1294 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 value = 0;
1299 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1300 return NULL;
1301 if (value != PyUnicode_AS_UNICODE(obj))
1302 return raiseTestError("test_u_code",
1303 "u code returned wrong value for u'test'");
1304 value = 0;
1305 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1306 return NULL;
1307 if (value != PyUnicode_AS_UNICODE(obj) ||
1308 len != PyUnicode_GET_SIZE(obj))
1309 return raiseTestError("test_u_code",
1310 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 Py_DECREF(tuple);
1313 Py_INCREF(Py_None);
1314 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001315}
1316
Guido van Rossumfb67be22007-08-29 18:38:11 +00001317/* Test Z and Z# codes for PyArg_ParseTuple */
1318static PyObject *
1319test_Z_code(PyObject *self)
1320{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001322 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 tuple = PyTuple_New(2);
1326 if (tuple == NULL)
1327 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 obj = PyUnicode_FromString("test");
1330 PyTuple_SET_ITEM(tuple, 0, obj);
1331 Py_INCREF(Py_None);
1332 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 /* swap values on purpose */
1335 value1 = NULL;
1336 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 /* Test Z for both values */
1339 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1340 return NULL;
1341 if (value1 != PyUnicode_AS_UNICODE(obj))
1342 return raiseTestError("test_Z_code",
1343 "Z code returned wrong value for 'test'");
1344 if (value2 != NULL)
1345 return raiseTestError("test_Z_code",
1346 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 value1 = NULL;
1349 value2 = PyUnicode_AS_UNICODE(obj);
1350 len1 = -1;
1351 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 /* Test Z# for both values */
1354 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1355 &value2, &len2) < 0)
1356 return NULL;
1357 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1358 len1 != PyUnicode_GET_SIZE(obj))
1359 return raiseTestError("test_Z_code",
1360 "Z# code returned wrong values for 'test'");
1361 if (value2 != NULL ||
1362 len2 != 0)
1363 return raiseTestError("test_Z_code",
1364 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 Py_DECREF(tuple);
1367 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001368}
1369
Thomas Wouters477c8d52006-05-27 19:21:47 +00001370static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001371test_widechar(PyObject *self)
1372{
1373#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1375 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001376 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001377#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1379 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001380#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1384 if (wide == NULL)
1385 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1388 if (utf8 == NULL) {
1389 Py_DECREF(wide);
1390 return NULL;
1391 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001392
Victor Stinner8ef18872011-11-21 02:06:57 +01001393 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 Py_DECREF(wide);
1395 Py_DECREF(utf8);
1396 return raiseTestError("test_widechar",
1397 "wide string and utf8 string "
1398 "have different length");
1399 }
1400 if (PyUnicode_Compare(wide, utf8)) {
1401 Py_DECREF(wide);
1402 Py_DECREF(utf8);
1403 if (PyErr_Occurred())
1404 return NULL;
1405 return raiseTestError("test_widechar",
1406 "wide string and utf8 string "
1407 "are different");
1408 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 Py_DECREF(wide);
1411 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001412
1413#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1414 wide = PyUnicode_FromWideChar(invalid, 1);
1415 if (wide == NULL)
1416 PyErr_Clear();
1417 else
1418 return raiseTestError("test_widechar",
1419 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1420
1421 wide = PyUnicode_FromUnicode(invalid, 1);
1422 if (wide == NULL)
1423 PyErr_Clear();
1424 else
1425 return raiseTestError("test_widechar",
1426 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
1427#endif
1428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001430}
1431
1432static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001433unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001434{
1435 PyObject *unicode, *result;
1436 Py_ssize_t buflen, size;
1437 wchar_t *buffer;
1438
1439 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1440 return NULL;
1441 buffer = PyMem_Malloc(buflen * sizeof(wchar_t));
1442 if (buffer == NULL)
1443 return PyErr_NoMemory();
1444
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001445 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001446 if (size == -1) {
1447 PyMem_Free(buffer);
1448 return NULL;
1449 }
1450
1451 if (size < buflen)
1452 buflen = size + 1;
1453 else
1454 buflen = size;
1455 result = PyUnicode_FromWideChar(buffer, buflen);
1456 PyMem_Free(buffer);
1457 if (result == NULL)
1458 return NULL;
1459
1460 return Py_BuildValue("(Nn)", result, size);
1461}
1462
1463static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001464unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001465{
1466 PyObject *unicode, *result;
1467 Py_ssize_t size;
1468 wchar_t *buffer;
1469
1470 if (!PyArg_ParseTuple(args, "U", &unicode))
1471 return NULL;
1472
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001473 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001474 if (buffer == NULL)
1475 return NULL;
1476
1477 result = PyUnicode_FromWideChar(buffer, size + 1);
1478 PyMem_Free(buffer);
1479 if (result == NULL)
1480 return NULL;
1481 return Py_BuildValue("(Nn)", result, size);
1482}
1483
1484static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001485unicode_encodedecimal(PyObject *self, PyObject *args)
1486{
1487 Py_UNICODE *unicode;
1488 Py_ssize_t length;
1489 char *errors = NULL;
1490 PyObject *decimal;
1491 Py_ssize_t decimal_length, new_length;
1492 int res;
1493
1494 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1495 return NULL;
1496
1497 decimal_length = length * 7; /* len('&#8364;') */
1498 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1499 if (decimal == NULL)
1500 return NULL;
1501
1502 res = PyUnicode_EncodeDecimal(unicode, length,
1503 PyBytes_AS_STRING(decimal),
1504 errors);
1505 if (res < 0) {
1506 Py_DECREF(decimal);
1507 return NULL;
1508 }
1509
1510 new_length = strlen(PyBytes_AS_STRING(decimal));
1511 assert(new_length <= decimal_length);
1512 res = _PyBytes_Resize(&decimal, new_length);
1513 if (res < 0)
1514 return NULL;
1515
1516 return decimal;
1517}
1518
1519static PyObject *
1520unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1521{
1522 Py_UNICODE *unicode;
1523 Py_ssize_t length;
1524 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1525 return NULL;
1526 return PyUnicode_TransformDecimalToASCII(unicode, length);
1527}
1528
1529static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001530unicode_legacy_string(PyObject *self, PyObject *args)
1531{
1532 Py_UNICODE *data;
1533 Py_ssize_t len;
1534 PyObject *u;
1535
1536 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1537 return NULL;
1538
1539 u = PyUnicode_FromUnicode(NULL, len);
1540 if (u == NULL)
1541 return NULL;
1542
1543 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1544
1545 if (len > 0) { /* The empty string is always ready. */
1546 assert(!PyUnicode_IS_READY(u));
1547 }
1548
1549 return u;
1550}
1551
1552static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001553getargs_w_star(PyObject *self, PyObject *args)
1554{
1555 Py_buffer buffer;
1556 PyObject *result;
1557 char *str;
1558
1559 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1560 return NULL;
1561
1562 if (2 <= buffer.len) {
1563 str = buffer.buf;
1564 str[0] = '[';
1565 str[buffer.len-1] = ']';
1566 }
1567
1568 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1569 PyBuffer_Release(&buffer);
1570 return result;
1571}
1572
1573
1574static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001575test_empty_argparse(PyObject *self)
1576{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 /* Test that formats can begin with '|'. See issue #4720. */
1578 PyObject *tuple, *dict = NULL;
1579 static char *kwlist[] = {NULL};
1580 int result;
1581 tuple = PyTuple_New(0);
1582 if (!tuple)
1583 return NULL;
1584 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1585 goto done;
1586 dict = PyDict_New();
1587 if (!dict)
1588 goto done;
1589 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00001590 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 Py_DECREF(tuple);
1592 Py_XDECREF(dict);
1593 if (result < 0)
1594 return NULL;
1595 else {
1596 Py_RETURN_NONE;
1597 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001598}
1599
1600static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001601codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001602{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 const char *encoding, *errors = NULL;
1604 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1605 &encoding, &errors))
1606 return NULL;
1607 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001608}
1609
Thomas Wouters477c8d52006-05-27 19:21:47 +00001610static PyObject *
1611codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001612{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 const char *encoding, *errors = NULL;
1614 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1615 &encoding, &errors))
1616 return NULL;
1617 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001618}
1619
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001620
Tim Peters5b8132f2003-01-31 15:52:05 +00001621/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001622static PyObject *
1623test_long_numbits(PyObject *self)
1624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 struct triple {
1626 long input;
1627 size_t nbits;
1628 int sign;
1629 } testcases[] = {{0, 0, 0},
1630 {1L, 1, 1},
1631 {-1L, 1, -1},
1632 {2L, 2, 1},
1633 {-2L, 2, -1},
1634 {3L, 2, 1},
1635 {-3L, 2, -1},
1636 {4L, 3, 1},
1637 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03001638 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 {-0x7fffL, 15, -1},
1640 {0xffffL, 16, 1},
1641 {-0xffffL, 16, -1},
1642 {0xfffffffL, 28, 1},
1643 {-0xfffffffL, 28, -1}};
1644 int i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001645
Victor Stinner63941882011-09-29 00:42:28 +02001646 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02001647 size_t nbits;
1648 int sign;
1649 PyObject *plong;
1650
1651 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02001652 if (plong == NULL)
1653 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02001654 nbits = _PyLong_NumBits(plong);
1655 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 Py_DECREF(plong);
1658 if (nbits != testcases[i].nbits)
1659 return raiseTestError("test_long_numbits",
1660 "wrong result for _PyLong_NumBits");
1661 if (sign != testcases[i].sign)
1662 return raiseTestError("test_long_numbits",
1663 "wrong result for _PyLong_Sign");
1664 }
1665 Py_INCREF(Py_None);
1666 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001667}
1668
Thomas Heller519a0422007-11-15 20:48:54 +00001669/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00001670
1671static PyObject *
1672test_null_strings(PyObject *self)
1673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
1675 PyObject *tuple = PyTuple_Pack(2, o1, o2);
1676 Py_XDECREF(o1);
1677 Py_XDECREF(o2);
1678 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00001679}
1680
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001681static PyObject *
1682raise_exception(PyObject *self, PyObject *args)
1683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001684 PyObject *exc;
1685 PyObject *exc_args, *v;
1686 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
1689 &exc, &num_args))
1690 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 exc_args = PyTuple_New(num_args);
1693 if (exc_args == NULL)
1694 return NULL;
1695 for (i = 0; i < num_args; ++i) {
1696 v = PyLong_FromLong(i);
1697 if (v == NULL) {
1698 Py_DECREF(exc_args);
1699 return NULL;
1700 }
1701 PyTuple_SET_ITEM(exc_args, i, v);
1702 }
1703 PyErr_SetObject(exc, exc_args);
1704 Py_DECREF(exc_args);
1705 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001706}
Tim Peters91621db2001-06-12 20:10:01 +00001707
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02001708static PyObject *
1709test_set_exc_info(PyObject *self, PyObject *args)
1710{
1711 PyObject *orig_exc;
1712 PyObject *new_type, *new_value, *new_tb;
1713 PyObject *type, *value, *tb;
1714 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
1715 &new_type, &new_value, &new_tb))
1716 return NULL;
1717
1718 PyErr_GetExcInfo(&type, &value, &tb);
1719
1720 Py_INCREF(new_type);
1721 Py_INCREF(new_value);
1722 Py_INCREF(new_tb);
1723 PyErr_SetExcInfo(new_type, new_value, new_tb);
1724
1725 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
1726 Py_XDECREF(type);
1727 Py_XDECREF(value);
1728 Py_XDECREF(tb);
1729 return orig_exc;
1730}
Benjamin Peterson16323982010-02-03 01:13:41 +00001731
1732static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001733
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001734static PyObject *
1735test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 if (PyDateTimeAPI) {
1737 if (test_run_counter) {
1738 /* Probably regrtest.py -R */
1739 Py_RETURN_NONE;
1740 }
1741 else {
1742 PyErr_SetString(PyExc_AssertionError,
1743 "PyDateTime_CAPI somehow initialized");
1744 return NULL;
1745 }
1746 }
1747 test_run_counter++;
1748 PyDateTime_IMPORT;
1749 if (PyDateTimeAPI)
1750 Py_RETURN_NONE;
1751 else
1752 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001753}
1754
Benjamin Peterson16323982010-02-03 01:13:41 +00001755
1756#ifdef WITH_THREAD
1757
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001758/* test_thread_state spawns a thread of its own, and that thread releases
1759 * `thread_done` when it's finished. The driver code has to know when the
1760 * thread finishes, because the thread uses a PyObject (the callable) that
1761 * may go away when the driver finishes. The former lack of this explicit
1762 * synchronization caused rare segfaults, so rare that they were seen only
1763 * on a Mac buildbot (although they were possible on any box).
1764 */
1765static PyThread_type_lock thread_done = NULL;
1766
Benjamin Petersona786b022008-08-25 21:05:21 +00001767static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001768_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 PyObject *rc;
1771 int success;
1772 PyGILState_STATE s = PyGILState_Ensure();
1773 rc = PyObject_CallFunction((PyObject *)callable, "");
1774 success = (rc != NULL);
1775 Py_XDECREF(rc);
1776 PyGILState_Release(s);
1777 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001778}
1779
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001780/* Same thing, but releases `thread_done` when it returns. This variant
1781 * should be called only from threads spawned by test_thread_state().
1782 */
1783static void
1784_make_call_from_thread(void *callable)
1785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 _make_call(callable);
1787 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001788}
1789
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001790static PyObject *
1791test_thread_state(PyObject *self, PyObject *args)
1792{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 PyObject *fn;
1794 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1797 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 if (!PyCallable_Check(fn)) {
1800 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1801 fn->ob_type->tp_name);
1802 return NULL;
1803 }
Benjamin Petersona786b022008-08-25 21:05:21 +00001804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 /* Ensure Python is set up for threading */
1806 PyEval_InitThreads();
1807 thread_done = PyThread_allocate_lock();
1808 if (thread_done == NULL)
1809 return PyErr_NoMemory();
1810 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 /* Start a new thread with our callback. */
1813 PyThread_start_new_thread(_make_call_from_thread, fn);
1814 /* Make the callback with the thread lock held by this thread */
1815 success &= _make_call(fn);
1816 /* Do it all again, but this time with the thread-lock released */
1817 Py_BEGIN_ALLOW_THREADS
1818 success &= _make_call(fn);
1819 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1820 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 /* And once more with and without a thread
1823 XXX - should use a lock and work out exactly what we are trying
1824 to test <wink>
1825 */
1826 Py_BEGIN_ALLOW_THREADS
1827 PyThread_start_new_thread(_make_call_from_thread, fn);
1828 success &= _make_call(fn);
1829 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1830 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 /* Release lock we acquired above. This is required on HP-UX. */
1833 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 PyThread_free_lock(thread_done);
1836 if (!success)
1837 return NULL;
1838 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001839}
Benjamin Petersona54c9092009-01-13 02:11:23 +00001840
1841/* test Py_AddPendingCalls using threads */
1842static int _pending_callback(void *arg)
1843{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 /* we assume the argument is callable object to which we own a reference */
1845 PyObject *callable = (PyObject *)arg;
1846 PyObject *r = PyObject_CallObject(callable, NULL);
1847 Py_DECREF(callable);
1848 Py_XDECREF(r);
1849 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001850}
1851
1852/* The following requests n callbacks to _pending_callback. It can be
1853 * run from any python thread.
1854 */
1855PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
1856{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 PyObject *callable;
1858 int r;
1859 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
1860 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 /* create the reference for the callbackwhile we hold the lock */
1863 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00001864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 Py_BEGIN_ALLOW_THREADS
1866 r = Py_AddPendingCall(&_pending_callback, callable);
1867 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00001868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 if (r<0) {
1870 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
1871 Py_INCREF(Py_False);
1872 return Py_False;
1873 }
1874 Py_INCREF(Py_True);
1875 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001876}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001877#endif
1878
Neal Norwitzb0d26332007-08-25 00:49:05 +00001879/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001880static PyObject *
1881test_string_from_format(PyObject *self, PyObject *args)
1882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 PyObject *result;
1884 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001885
Alexander Belopolskye239d232010-12-08 23:31:48 +00001886#define CHECK_1_FORMAT(FORMAT, TYPE) \
1887 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
1888 if (result == NULL) \
1889 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01001890 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00001891 msg = FORMAT " failed at 1"; \
1892 goto Fail; \
1893 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 CHECK_1_FORMAT("%d", int);
1897 CHECK_1_FORMAT("%ld", long);
1898 /* The z width modifier was added in Python 2.5. */
1899 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 /* The u type code was added in Python 2.5. */
1902 CHECK_1_FORMAT("%u", unsigned int);
1903 CHECK_1_FORMAT("%lu", unsigned long);
1904 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001907#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
1909 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001910#endif
1911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001913
1914 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 Py_XDECREF(result);
1916 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001917
1918#undef CHECK_1_FORMAT
1919}
1920
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001921
1922static PyObject *
1923test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
1925 int result;
1926 if (py_s == NULL)
1927 return NULL;
1928 result = PyUnicode_CompareWithASCIIString(py_s, "str");
1929 Py_DECREF(py_s);
1930 if (!result) {
1931 PyErr_SetString(TestError, "Python string ending in NULL "
1932 "should not compare equal to c string.");
1933 return NULL;
1934 }
1935 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00001936}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001937
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001938/* This is here to provide a docstring for test_descr. */
1939static PyObject *
1940test_with_docstring(PyObject *self)
1941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001943}
1944
Mark Dickinson725bfd82009-05-03 20:33:40 +00001945/* Test PyOS_string_to_double. */
1946static PyObject *
1947test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 double result;
1949 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00001950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951#define CHECK_STRING(STR, expected) \
1952 result = PyOS_string_to_double(STR, NULL, NULL); \
1953 if (result == -1.0 && PyErr_Occurred()) \
1954 return NULL; \
1955 if (result != expected) { \
1956 msg = "conversion of " STR " to float failed"; \
1957 goto fail; \
1958 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00001959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960#define CHECK_INVALID(STR) \
1961 result = PyOS_string_to_double(STR, NULL, NULL); \
1962 if (result == -1.0 && PyErr_Occurred()) { \
1963 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
1964 PyErr_Clear(); \
1965 else \
1966 return NULL; \
1967 } \
1968 else { \
1969 msg = "conversion of " STR " didn't raise ValueError"; \
1970 goto fail; \
1971 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00001972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 CHECK_STRING("0.1", 0.1);
1974 CHECK_STRING("1.234", 1.234);
1975 CHECK_STRING("-1.35", -1.35);
1976 CHECK_STRING(".1e01", 1.0);
1977 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00001978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 CHECK_INVALID(" 0.1");
1980 CHECK_INVALID("\t\n-3");
1981 CHECK_INVALID(".123 ");
1982 CHECK_INVALID("3\n");
1983 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00001984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00001986 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00001988#undef CHECK_STRING
1989#undef CHECK_INVALID
1990}
1991
1992
Benjamin Petersonb173f782009-05-05 22:31:58 +00001993/* Coverage testing of capsule objects. */
1994
1995static const char *capsule_name = "capsule name";
1996static char *capsule_pointer = "capsule pointer";
1997static char *capsule_context = "capsule context";
1998static const char *capsule_error = NULL;
1999static int
2000capsule_destructor_call_count = 0;
2001
2002static void
2003capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 capsule_destructor_call_count++;
2005 if (PyCapsule_GetContext(o) != capsule_context) {
2006 capsule_error = "context did not match in destructor!";
2007 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2008 capsule_error = "destructor did not match in destructor! (woah!)";
2009 } else if (PyCapsule_GetName(o) != capsule_name) {
2010 capsule_error = "name did not match in destructor!";
2011 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2012 capsule_error = "pointer did not match in destructor!";
2013 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002014}
2015
2016typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 char *name;
2018 char *module;
2019 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002020} known_capsule;
2021
2022static PyObject *
2023test_capsule(PyObject *self, PyObject *args)
2024{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 PyObject *object;
2026 const char *error = NULL;
2027 void *pointer;
2028 void *pointer2;
2029 known_capsule known_capsules[] = {
2030 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2031 KNOWN_CAPSULE("_socket", "CAPI"),
2032 KNOWN_CAPSULE("_curses", "_C_API"),
2033 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2034 { NULL, NULL },
2035 };
2036 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002037
2038#define FAIL(x) { error = (x); goto exit; }
2039
2040#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 if (capsule_error) { \
2042 FAIL(capsule_error); \
2043 } \
2044 else if (!capsule_destructor_call_count) { \
2045 FAIL("destructor not called!"); \
2046 } \
2047 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2050 PyCapsule_SetContext(object, capsule_context);
2051 capsule_destructor(object);
2052 CHECK_DESTRUCTOR;
2053 Py_DECREF(object);
2054 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 object = PyCapsule_New(known, "ignored", NULL);
2057 PyCapsule_SetPointer(object, capsule_pointer);
2058 PyCapsule_SetName(object, capsule_name);
2059 PyCapsule_SetDestructor(object, capsule_destructor);
2060 PyCapsule_SetContext(object, capsule_context);
2061 capsule_destructor(object);
2062 CHECK_DESTRUCTOR;
2063 /* intentionally access using the wrong name */
2064 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2065 if (!PyErr_Occurred()) {
2066 FAIL("PyCapsule_GetPointer should have failed but did not!");
2067 }
2068 PyErr_Clear();
2069 if (pointer2) {
2070 if (pointer2 == capsule_pointer) {
2071 FAIL("PyCapsule_GetPointer should not have"
2072 " returned the internal pointer!");
2073 } else {
2074 FAIL("PyCapsule_GetPointer should have "
2075 "returned NULL pointer but did not!");
2076 }
2077 }
2078 PyCapsule_SetDestructor(object, NULL);
2079 Py_DECREF(object);
2080 if (capsule_destructor_call_count) {
2081 FAIL("destructor called when it should not have been!");
2082 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 for (known = &known_capsules[0]; known->module != NULL; known++) {
2085 /* yeah, ordinarily I wouldn't do this either,
2086 but it's fine for this test harness.
2087 */
2088 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002089#undef FAIL
2090#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 { \
2092 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2093 x, known->module, known->attribute); \
2094 error = buffer; \
2095 goto exit; \
2096 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 PyObject *module = PyImport_ImportModule(known->module);
2099 if (module) {
2100 pointer = PyCapsule_Import(known->name, 0);
2101 if (!pointer) {
2102 Py_DECREF(module);
2103 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2104 }
2105 object = PyObject_GetAttrString(module, known->attribute);
2106 if (!object) {
2107 Py_DECREF(module);
2108 return NULL;
2109 }
2110 pointer2 = PyCapsule_GetPointer(object,
2111 "weebles wobble but they don't fall down");
2112 if (!PyErr_Occurred()) {
2113 Py_DECREF(object);
2114 Py_DECREF(module);
2115 FAIL("PyCapsule_GetPointer should have failed but did not!");
2116 }
2117 PyErr_Clear();
2118 if (pointer2) {
2119 Py_DECREF(module);
2120 Py_DECREF(object);
2121 if (pointer2 == pointer) {
2122 FAIL("PyCapsule_GetPointer should not have"
2123 " returned its internal pointer!");
2124 } else {
2125 FAIL("PyCapsule_GetPointer should have"
2126 " returned NULL pointer but did not!");
2127 }
2128 }
2129 Py_DECREF(object);
2130 Py_DECREF(module);
2131 }
2132 else
2133 PyErr_Clear();
2134 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002135
2136 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 if (error) {
2138 return raiseTestError("test_capsule", error);
2139 }
2140 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002141#undef FAIL
2142}
2143
Guido van Rossumddefaf32007-01-14 03:31:43 +00002144#ifdef HAVE_GETTIMEOFDAY
2145/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002146static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 e->tv_sec -= s->tv_sec;
2149 e->tv_usec -= s->tv_usec;
2150 if (e->tv_usec < 0) {
2151 e->tv_sec -=1;
2152 e->tv_usec += 1000000;
2153 }
2154 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002155}
2156
2157static PyObject *
2158profile_int(PyObject *self, PyObject* args)
2159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 int i, k;
2161 struct timeval start, stop;
2162 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002164 /* Test 1: Allocate and immediately deallocate
2165 many small integers */
2166 gettimeofday(&start, NULL);
2167 for(k=0; k < 20000; k++)
2168 for(i=0; i < 1000; i++) {
2169 single = PyLong_FromLong(i);
2170 Py_DECREF(single);
2171 }
2172 gettimeofday(&stop, NULL);
2173 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 /* Test 2: Allocate and immediately deallocate
2176 many large integers */
2177 gettimeofday(&start, NULL);
2178 for(k=0; k < 20000; k++)
2179 for(i=0; i < 1000; i++) {
2180 single = PyLong_FromLong(i+1000000);
2181 Py_DECREF(single);
2182 }
2183 gettimeofday(&stop, NULL);
2184 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 /* Test 3: Allocate a few integers, then release
2187 them all simultaneously. */
2188 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002189 if (multiple == NULL)
2190 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 gettimeofday(&start, NULL);
2192 for(k=0; k < 20000; k++) {
2193 for(i=0; i < 1000; i++) {
2194 multiple[i] = PyLong_FromLong(i+1000000);
2195 }
2196 for(i=0; i < 1000; i++) {
2197 Py_DECREF(multiple[i]);
2198 }
2199 }
2200 gettimeofday(&stop, NULL);
2201 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002202 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 /* Test 4: Allocate many integers, then release
2205 them all simultaneously. */
2206 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002207 if (multiple == NULL)
2208 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002209 gettimeofday(&start, NULL);
2210 for(k=0; k < 20; k++) {
2211 for(i=0; i < 1000000; i++) {
2212 multiple[i] = PyLong_FromLong(i+1000000);
2213 }
2214 for(i=0; i < 1000000; i++) {
2215 Py_DECREF(multiple[i]);
2216 }
2217 }
2218 gettimeofday(&stop, NULL);
2219 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002220 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002222 /* Test 5: Allocate many integers < 32000 */
2223 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002224 if (multiple == NULL)
2225 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002226 gettimeofday(&start, NULL);
2227 for(k=0; k < 10; k++) {
2228 for(i=0; i < 1000000; i++) {
2229 multiple[i] = PyLong_FromLong(i+1000);
2230 }
2231 for(i=0; i < 1000000; i++) {
2232 Py_DECREF(multiple[i]);
2233 }
2234 }
2235 gettimeofday(&stop, NULL);
2236 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002237 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002239 /* Test 6: Perform small int addition */
2240 op1 = PyLong_FromLong(1);
2241 gettimeofday(&start, NULL);
2242 for(i=0; i < 10000000; i++) {
2243 result = PyNumber_Add(op1, op1);
2244 Py_DECREF(result);
2245 }
2246 gettimeofday(&stop, NULL);
2247 Py_DECREF(op1);
2248 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 /* Test 7: Perform medium int addition */
2251 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002252 if (op1 == NULL)
2253 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 gettimeofday(&start, NULL);
2255 for(i=0; i < 10000000; i++) {
2256 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002257 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 }
2259 gettimeofday(&stop, NULL);
2260 Py_DECREF(op1);
2261 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 Py_INCREF(Py_None);
2264 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002265}
2266#endif
2267
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002268/* To test the format of tracebacks as printed out. */
2269static PyObject *
2270traceback_print(PyObject *self, PyObject *args)
2271{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 PyObject *file;
2273 PyObject *traceback;
2274 int result;
2275
2276 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2277 &traceback, &file))
2278 return NULL;
2279
2280 result = PyTraceBack_Print(traceback, file);
2281 if (result < 0)
2282 return NULL;
2283 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002284}
2285
Benjamin Petersone6528212008-07-15 15:32:09 +00002286/* To test the format of exceptions as printed out. */
2287static PyObject *
2288exception_print(PyObject *self, PyObject *args)
2289{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 PyObject *value;
2291 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002293 if (!PyArg_ParseTuple(args, "O:exception_print",
2294 &value))
2295 return NULL;
2296 if (!PyExceptionInstance_Check(value)) {
2297 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2298 return NULL;
2299 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 tb = PyException_GetTraceback(value);
2302 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2303 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002306}
2307
2308
2309
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002310
2311/* reliably raise a MemoryError */
2312static PyObject *
2313raise_memoryerror(PyObject *self)
2314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 PyErr_NoMemory();
2316 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002317}
2318
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002319/* Issue 6012 */
2320static PyObject *str1, *str2;
2321static int
2322failing_converter(PyObject *obj, void *arg)
2323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 /* Clone str1, then let the conversion fail. */
2325 assert(str1);
2326 str2 = str1;
2327 Py_INCREF(str2);
2328 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002329}
2330static PyObject*
2331argparsing(PyObject *o, PyObject *args)
2332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002333 PyObject *res;
2334 str1 = str2 = NULL;
2335 if (!PyArg_ParseTuple(args, "O&O&",
2336 PyUnicode_FSConverter, &str1,
2337 failing_converter, &str2)) {
2338 if (!str2)
2339 /* argument converter not called? */
2340 return NULL;
2341 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002342 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 Py_DECREF(str2);
2344 PyErr_Clear();
2345 return res;
2346 }
2347 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002348}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002349
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002350/* To test that the result of PyCode_NewEmpty has the right members. */
2351static PyObject *
2352code_newempty(PyObject *self, PyObject *args)
2353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 const char *filename;
2355 const char *funcname;
2356 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2359 &filename, &funcname, &firstlineno))
2360 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002363}
2364
Georg Brandl1e28a272009-12-28 08:41:01 +00002365/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2366 Run via Lib/test/test_exceptions.py */
2367static PyObject *
2368make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2369{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 const char *name;
2371 const char *doc = NULL;
2372 PyObject *base = NULL;
2373 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2378 "s|sOO:make_exception_with_doc", kwlist,
2379 &name, &doc, &base, &dict))
2380 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002383}
2384
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002385static PyObject *
2386make_memoryview_from_NULL_pointer(PyObject *self)
2387{
2388 Py_buffer info;
2389 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2390 return NULL;
2391 return PyMemoryView_FromBuffer(&info);
2392}
2393
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002394/* Test that the fatal error from not having a current thread doesn't
2395 cause an infinite loop. Run via Lib/test/test_capi.py */
2396static PyObject *
2397crash_no_current_thread(PyObject *self)
2398{
2399 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002400 /* Using PyThreadState_Get() directly allows the test to pass in
2401 !pydebug mode. However, the test only actually tests anything
2402 in pydebug mode, since that's where the infinite loop was in
2403 the first place. */
2404 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002405 Py_END_ALLOW_THREADS
2406 return NULL;
2407}
2408
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002409/* To run some code in a sub-interpreter. */
2410static PyObject *
2411run_in_subinterp(PyObject *self, PyObject *args)
2412{
2413 const char *code;
2414 int r;
2415 PyThreadState *substate, *mainstate;
2416
2417 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2418 &code))
2419 return NULL;
2420
2421 mainstate = PyThreadState_Get();
2422
2423 PyThreadState_Swap(NULL);
2424
2425 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002426 if (substate == NULL) {
2427 /* Since no new thread state was created, there is no exception to
2428 propagate; raise a fresh one after swapping in the old thread
2429 state. */
2430 PyThreadState_Swap(mainstate);
2431 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2432 return NULL;
2433 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002434 r = PyRun_SimpleString(code);
2435 Py_EndInterpreter(substate);
2436
2437 PyThreadState_Swap(mainstate);
2438
2439 return PyLong_FromLong(r);
2440}
2441
Victor Stinner5d272cc2012-03-13 13:35:55 +01002442static PyObject *
2443test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2444{
2445 PyObject *obj;
2446 time_t sec;
2447 if (!PyArg_ParseTuple(args, "O:pytime_object_to_time_t", &obj))
2448 return NULL;
2449 if (_PyTime_ObjectToTime_t(obj, &sec) == -1)
2450 return NULL;
2451 return _PyLong_FromTime_t(sec);
2452}
2453
2454static PyObject *
2455test_pytime_object_to_timeval(PyObject *self, PyObject *args)
2456{
2457 PyObject *obj;
2458 time_t sec;
2459 long usec;
2460 if (!PyArg_ParseTuple(args, "O:pytime_object_to_timeval", &obj))
2461 return NULL;
2462 if (_PyTime_ObjectToTimeval(obj, &sec, &usec) == -1)
2463 return NULL;
2464 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
2465}
2466
Victor Stinner643cd682012-03-02 22:54:03 +01002467static PyObject *
2468test_pytime_object_to_timespec(PyObject *self, PyObject *args)
2469{
2470 PyObject *obj;
2471 time_t sec;
2472 long nsec;
2473 if (!PyArg_ParseTuple(args, "O:pytime_object_to_timespec", &obj))
2474 return NULL;
2475 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec) == -1)
2476 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01002477 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01002478}
2479
Victor Stinner258e4d32013-12-13 02:30:12 +01002480#ifdef WITH_THREAD
Victor Stinner13105102013-12-13 02:17:29 +01002481typedef struct {
2482 PyThread_type_lock start_event;
2483 PyThread_type_lock exit_event;
2484 PyObject *callback;
2485} test_c_thread_t;
2486
2487static void
2488temporary_c_thread(void *data)
2489{
2490 test_c_thread_t *test_c_thread = data;
2491 PyGILState_STATE state;
2492 PyObject *res;
2493
2494 PyThread_release_lock(test_c_thread->start_event);
2495
2496 /* Allocate a Python thread state for this thread */
2497 state = PyGILState_Ensure();
2498
2499 res = PyObject_CallFunction(test_c_thread->callback, "", NULL);
2500 Py_CLEAR(test_c_thread->callback);
2501
2502 if (res == NULL) {
2503 PyErr_Print();
2504 }
2505 else {
2506 Py_DECREF(res);
2507 }
2508
2509 /* Destroy the Python thread state for this thread */
2510 PyGILState_Release(state);
2511
2512 PyThread_release_lock(test_c_thread->exit_event);
2513
2514 PyThread_exit_thread();
2515}
2516
2517static PyObject *
2518call_in_temporary_c_thread(PyObject *self, PyObject *callback)
2519{
2520 PyObject *res = NULL;
2521 test_c_thread_t test_c_thread;
2522 long thread;
2523
2524 PyEval_InitThreads();
2525
2526 test_c_thread.start_event = PyThread_allocate_lock();
2527 test_c_thread.exit_event = PyThread_allocate_lock();
2528 test_c_thread.callback = NULL;
2529 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
2530 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
2531 goto exit;
2532 }
2533
2534 Py_INCREF(callback);
2535 test_c_thread.callback = callback;
2536
2537 PyThread_acquire_lock(test_c_thread.start_event, 1);
2538 PyThread_acquire_lock(test_c_thread.exit_event, 1);
2539
2540 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
2541 if (thread == -1) {
2542 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
2543 PyThread_release_lock(test_c_thread.start_event);
2544 PyThread_release_lock(test_c_thread.exit_event);
2545 goto exit;
2546 }
2547
2548 PyThread_acquire_lock(test_c_thread.start_event, 1);
2549 PyThread_release_lock(test_c_thread.start_event);
2550
2551 Py_BEGIN_ALLOW_THREADS
2552 PyThread_acquire_lock(test_c_thread.exit_event, 1);
2553 PyThread_release_lock(test_c_thread.exit_event);
2554 Py_END_ALLOW_THREADS
2555
2556 Py_INCREF(Py_None);
2557 res = Py_None;
2558
2559exit:
2560 Py_CLEAR(test_c_thread.callback);
2561 if (test_c_thread.start_event)
2562 PyThread_free_lock(test_c_thread.start_event);
2563 if (test_c_thread.exit_event)
2564 PyThread_free_lock(test_c_thread.exit_event);
2565 return res;
2566}
Victor Stinner258e4d32013-12-13 02:30:12 +01002567#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01002568
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002569
Tim Peters9ea17ac2001-02-02 05:57:15 +00002570static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 {"raise_exception", raise_exception, METH_VARARGS},
2572 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
2573 {"test_config", (PyCFunction)test_config, METH_NOARGS},
2574 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
2575 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
2576 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
2577 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
2579 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
2580 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02002581 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
2582 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
2584 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
2585 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07002586 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
2588 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
2589 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
2590 PyDoc_STR("This is a pretty normal docstring.")},
2591 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
2592 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
2593 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
2594 {"getargs_tuple", getargs_tuple, METH_VARARGS},
2595 {"getargs_keywords", (PyCFunction)getargs_keywords,
2596 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00002597 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
2598 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 {"getargs_b", getargs_b, METH_VARARGS},
2600 {"getargs_B", getargs_B, METH_VARARGS},
2601 {"getargs_h", getargs_h, METH_VARARGS},
2602 {"getargs_H", getargs_H, METH_VARARGS},
2603 {"getargs_I", getargs_I, METH_VARARGS},
2604 {"getargs_k", getargs_k, METH_VARARGS},
2605 {"getargs_i", getargs_i, METH_VARARGS},
2606 {"getargs_l", getargs_l, METH_VARARGS},
2607 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07002608 {"getargs_p", getargs_p, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00002609#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 {"getargs_L", getargs_L, METH_VARARGS},
2611 {"getargs_K", getargs_K, METH_VARARGS},
2612 {"test_longlong_api", test_longlong_api, METH_NOARGS},
2613 {"test_long_long_and_overflow",
2614 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
2615 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00002616#endif
Eli Bendersky906b88f2011-07-29 07:05:08 +03002617 {"getargs_c", getargs_c, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00002618 {"getargs_s", getargs_s, METH_VARARGS},
2619 {"getargs_s_star", getargs_s_star, METH_VARARGS},
2620 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
2621 {"getargs_z", getargs_z, METH_VARARGS},
2622 {"getargs_z_star", getargs_z_star, METH_VARARGS},
2623 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
2624 {"getargs_y", getargs_y, METH_VARARGS},
2625 {"getargs_y_star", getargs_y_star, METH_VARARGS},
2626 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
2627 {"getargs_u", getargs_u, METH_VARARGS},
2628 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
2629 {"getargs_Z", getargs_Z, METH_VARARGS},
2630 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00002631 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00002633 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00002635 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002636 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
2637 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
2638 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
2639 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01002640 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
2641 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
2642 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
2643 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01002644 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002645#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00002646 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002648#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00002649#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00002650 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00002651#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00002652 {"traceback_print", traceback_print, METH_VARARGS},
2653 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002654 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00002655 {"argparsing", argparsing, METH_VARARGS},
2656 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
2658 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002659 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
2660 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002661 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002662 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01002663 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
2664 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01002665 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01002666#ifdef WITH_THREAD
Victor Stinner13105102013-12-13 02:17:29 +01002667 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
2668 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01002669#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00002671};
2672
Thomas Hellera4ea6032003-04-17 18:55:45 +00002673#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
2674
Thomas Wouters89f507f2006-12-13 04:49:30 +00002675typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002676 char bool_member;
2677 char byte_member;
2678 unsigned char ubyte_member;
2679 short short_member;
2680 unsigned short ushort_member;
2681 int int_member;
2682 unsigned int uint_member;
2683 long long_member;
2684 unsigned long ulong_member;
2685 Py_ssize_t pyssizet_member;
2686 float float_member;
2687 double double_member;
2688 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002689#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 PY_LONG_LONG longlong_member;
2691 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002692#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00002693} all_structmembers;
2694
2695typedef struct {
2696 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002698} test_structmembers;
2699
2700static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
2702 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
2703 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
2704 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
2705 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
2706 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
2707 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
2708 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
2709 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
2710 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
2711 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
2712 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
2713 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002714#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
2716 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002717#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00002719};
2720
2721
Christian Heimes1af737c2008-01-23 08:24:23 +00002722static PyObject *
2723test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
2724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 static char *keywords[] = {
2726 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
2727 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
2728 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00002729#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00002731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002732 NULL};
2733 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00002734#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00002736#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 ;
2738 test_structmembers *ob;
2739 const char *s = NULL;
2740 Py_ssize_t string_len = 0;
2741 ob = PyObject_New(test_structmembers, type);
2742 if (ob == NULL)
2743 return NULL;
2744 memset(&ob->structmembers, 0, sizeof(all_structmembers));
2745 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
2746 &ob->structmembers.bool_member,
2747 &ob->structmembers.byte_member,
2748 &ob->structmembers.ubyte_member,
2749 &ob->structmembers.short_member,
2750 &ob->structmembers.ushort_member,
2751 &ob->structmembers.int_member,
2752 &ob->structmembers.uint_member,
2753 &ob->structmembers.long_member,
2754 &ob->structmembers.ulong_member,
2755 &ob->structmembers.pyssizet_member,
2756 &ob->structmembers.float_member,
2757 &ob->structmembers.double_member,
2758 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00002759#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 , &ob->structmembers.longlong_member,
2761 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00002762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 )) {
2764 Py_DECREF(ob);
2765 return NULL;
2766 }
2767 if (s != NULL) {
2768 if (string_len > 5) {
2769 Py_DECREF(ob);
2770 PyErr_SetString(PyExc_ValueError, "string too long");
2771 return NULL;
2772 }
2773 strcpy(ob->structmembers.inplace_member, s);
2774 }
2775 else {
2776 strcpy(ob->structmembers.inplace_member, "");
2777 }
2778 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002779}
2780
Christian Heimes1af737c2008-01-23 08:24:23 +00002781static void
2782test_structmembers_free(PyObject *ob)
2783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002785}
2786
2787static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002788 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 "test_structmembersType",
2790 sizeof(test_structmembers), /* tp_basicsize */
2791 0, /* tp_itemsize */
2792 test_structmembers_free, /* destructor tp_dealloc */
2793 0, /* tp_print */
2794 0, /* tp_getattr */
2795 0, /* tp_setattr */
2796 0, /* tp_reserved */
2797 0, /* tp_repr */
2798 0, /* tp_as_number */
2799 0, /* tp_as_sequence */
2800 0, /* tp_as_mapping */
2801 0, /* tp_hash */
2802 0, /* tp_call */
2803 0, /* tp_str */
2804 PyObject_GenericGetAttr, /* tp_getattro */
2805 PyObject_GenericSetAttr, /* tp_setattro */
2806 0, /* tp_as_buffer */
2807 0, /* tp_flags */
2808 "Type containing all structmember types",
2809 0, /* traverseproc tp_traverse */
2810 0, /* tp_clear */
2811 0, /* tp_richcompare */
2812 0, /* tp_weaklistoffset */
2813 0, /* tp_iter */
2814 0, /* tp_iternext */
2815 0, /* tp_methods */
2816 test_members, /* tp_members */
2817 0,
2818 0,
2819 0,
2820 0,
2821 0,
2822 0,
2823 0,
2824 0,
2825 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002826};
2827
2828
Martin v. Löwis1a214512008-06-11 05:26:20 +00002829
2830static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 PyModuleDef_HEAD_INIT,
2832 "_testcapi",
2833 NULL,
2834 -1,
2835 TestMethods,
2836 NULL,
2837 NULL,
2838 NULL,
2839 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002840};
2841
Mark Hammond62b1ab12002-07-23 06:31:15 +00002842PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002843PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00002844{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 m = PyModule_Create(&_testcapimodule);
2848 if (m == NULL)
2849 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00002852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002853 Py_TYPE(&test_structmembersType)=&PyType_Type;
2854 Py_INCREF(&test_structmembersType);
2855 /* don't use a name starting with "test", since we don't want
2856 test_capi to automatically call this */
2857 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
2860 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
2861 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
2862 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
2863 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
2864 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
2865 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
2866 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
2867 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
2868 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
2869 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
2870 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
2871 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
2872 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
2873 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
2874 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
2875 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
2876 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
2877 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
2878 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
2879 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
2880 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
2881 Py_INCREF(&PyInstanceMethod_Type);
2882 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00002883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
2885 Py_INCREF(TestError);
2886 PyModule_AddObject(m, "error", TestError);
2887 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00002888}