blob: 8ebe9709b7923121f921059c26c496a55674875d [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"
Serhiy Storchakab5181342015-02-06 08:58:56 +020014#include "marshal.h"
Tim Peters9ea17ac2001-02-02 05:57:15 +000015
Mark Hammond8d98d2c2003-04-19 15:41:53 +000016#ifdef WITH_THREAD
17#include "pythread.h"
18#endif /* WITH_THREAD */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000019static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000020
Tim Peters91621db2001-06-12 20:10:01 +000021/* Raise TestError with test_name + ": " + msg, and return NULL. */
22
23static PyObject *
24raiseTestError(const char* test_name, const char* msg)
25{
Victor Stinner6ced7c42011-03-21 18:15:42 +010026 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000027 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000028}
29
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000030/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000031
32 The ones derived from autoconf on the UNIX-like OSes can be relied
33 upon (in the absence of sloppy cross-compiling), but the Windows
34 platforms have these hardcoded. Better safe than sorry.
35*/
36static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000037sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000038 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000039{
Victor Stinner499dfcf2011-03-21 13:26:24 +010040 PyErr_Format(TestError,
41 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000044}
45
46static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000047test_config(PyObject *self)
Tim Peters9ea17ac2001-02-02 05:57:15 +000048{
Tim Peters9ea17ac2001-02-02 05:57:15 +000049#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 if (FATNAME != sizeof(TYPE)) \
51 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053 CHECK_SIZEOF(SIZEOF_SHORT, short);
54 CHECK_SIZEOF(SIZEOF_INT, int);
55 CHECK_SIZEOF(SIZEOF_LONG, long);
56 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
57 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Tim Peters9ea17ac2001-02-02 05:57:15 +000058#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
Tim Peters9ea17ac2001-02-02 05:57:15 +000060#endif
61
62#undef CHECK_SIZEOF
63
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 Py_INCREF(Py_None);
65 return Py_None;
Tim Peters9ea17ac2001-02-02 05:57:15 +000066}
67
Tim Peters5c4d5bf2001-02-12 22:13:26 +000068static PyObject*
Victor Stinner01076552013-10-29 19:39:52 +010069test_sizeof_c_types(PyObject *self)
70{
Victor Stinnerf866f972013-10-29 19:59:31 +010071#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010072 if (EXPECTED != sizeof(TYPE)) { \
73 PyErr_Format(TestError, \
74 "sizeof(%s) = %u instead of %u", \
75 #TYPE, sizeof(TYPE), EXPECTED); \
76 return (PyObject*)NULL; \
77 }
Victor Stinnerf866f972013-10-29 19:59:31 +010078#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
79#define CHECK_SIGNNESS(TYPE, SIGNED) \
80 if (IS_SIGNED(TYPE) != SIGNED) { \
81 PyErr_Format(TestError, \
82 "%s signness is, instead of %i", \
83 #TYPE, IS_SIGNED(TYPE), SIGNED); \
84 return (PyObject*)NULL; \
85 }
Victor Stinner01076552013-10-29 19:39:52 +010086
87 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +010088 CHECK_SIZEOF(Py_UCS1, 1);
89 CHECK_SIZEOF(Py_UCS2, 2);
90 CHECK_SIZEOF(Py_UCS4, 4);
91 CHECK_SIGNNESS(Py_UCS1, 0);
92 CHECK_SIGNNESS(Py_UCS2, 0);
93 CHECK_SIGNNESS(Py_UCS4, 0);
Victor Stinner01076552013-10-29 19:39:52 +010094#ifdef HAVE_INT32_T
Victor Stinnerf866f972013-10-29 19:59:31 +010095 CHECK_SIZEOF(PY_INT32_T, 4);
96 CHECK_SIGNNESS(PY_INT32_T, 1);
Victor Stinner01076552013-10-29 19:39:52 +010097#endif
98#ifdef HAVE_UINT32_T
Victor Stinnerf866f972013-10-29 19:59:31 +010099 CHECK_SIZEOF(PY_UINT32_T, 4);
100 CHECK_SIGNNESS(PY_UINT32_T, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100101#endif
102#ifdef HAVE_INT64_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100103 CHECK_SIZEOF(PY_INT64_T, 8);
104 CHECK_SIGNNESS(PY_INT64_T, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100105#endif
106#ifdef HAVE_UINT64_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100107 CHECK_SIZEOF(PY_UINT64_T, 8);
108 CHECK_SIGNNESS(PY_UINT64_T, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100109#endif
110
111 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100112 CHECK_SIZEOF(size_t, sizeof(void *));
113 CHECK_SIGNNESS(size_t, 0);
114 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
115 CHECK_SIGNNESS(Py_ssize_t, 1);
116
117 CHECK_SIZEOF(Py_uintptr_t, sizeof(void *));
118 CHECK_SIGNNESS(Py_uintptr_t, 0);
119 CHECK_SIZEOF(Py_intptr_t, sizeof(void *));
120 CHECK_SIGNNESS(Py_intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100121
122 Py_INCREF(Py_None);
123 return Py_None;
124
Victor Stinnerf866f972013-10-29 19:59:31 +0100125#undef IS_SIGNED
126#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100127#undef CHECK_SIZEOF
128}
129
130
131static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000132test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 PyObject* list;
135 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000138#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 list = PyList_New(NLIST);
140 if (list == (PyObject*)NULL)
141 return (PyObject*)NULL;
142 /* list = range(NLIST) */
143 for (i = 0; i < NLIST; ++i) {
144 PyObject* anint = PyLong_FromLong(i);
145 if (anint == (PyObject*)NULL) {
146 Py_DECREF(list);
147 return (PyObject*)NULL;
148 }
149 PyList_SET_ITEM(list, i, anint);
150 }
151 /* list.reverse(), via PyList_Reverse() */
152 i = PyList_Reverse(list); /* should not blow up! */
153 if (i != 0) {
154 Py_DECREF(list);
155 return (PyObject*)NULL;
156 }
157 /* Check that list == range(29, -1, -1) now */
158 for (i = 0; i < NLIST; ++i) {
159 PyObject* anint = PyList_GET_ITEM(list, i);
160 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
161 PyErr_SetString(TestError,
162 "test_list_api: reverse screwed up");
163 Py_DECREF(list);
164 return (PyObject*)NULL;
165 }
166 }
167 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000168#undef NLIST
169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000170 Py_INCREF(Py_None);
171 return Py_None;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000172}
173
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000174static int
175test_dict_inner(int count)
176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000177 Py_ssize_t pos = 0, iterations = 0;
178 int i;
179 PyObject *dict = PyDict_New();
180 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 if (dict == NULL)
183 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 for (i = 0; i < count; i++) {
186 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200187 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200188 return -1;
189 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200190 if (PyDict_SetItem(dict, v, v) < 0) {
191 Py_DECREF(v);
192 return -1;
193 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 Py_DECREF(v);
195 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 while (PyDict_Next(dict, &pos, &k, &v)) {
198 PyObject *o;
199 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 i = PyLong_AS_LONG(v) + 1;
202 o = PyLong_FromLong(i);
203 if (o == NULL)
204 return -1;
205 if (PyDict_SetItem(dict, k, o) < 0) {
206 Py_DECREF(o);
207 return -1;
208 }
209 Py_DECREF(o);
210 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 if (iterations != count) {
215 PyErr_SetString(
216 TestError,
217 "test_dict_iteration: dict iteration went wrong ");
218 return -1;
219 } else {
220 return 0;
221 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000222}
223
224static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000225test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 for (i = 0; i < 200; i++) {
230 if (test_dict_inner(i) < 0) {
231 return NULL;
232 }
233 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 Py_INCREF(Py_None);
236 return Py_None;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000237}
238
Tim Peters91621db2001-06-12 20:10:01 +0000239
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000240/* Issue #4701: Check that PyObject_Hash implicitly calls
241 * PyType_Ready if it hasn't already been called
242 */
243static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 PyVarObject_HEAD_INIT(NULL, 0)
245 "hashinheritancetester", /* Name of this type */
246 sizeof(PyObject), /* Basic object size */
247 0, /* Item size for varobject */
248 (destructor)PyObject_Del, /* tp_dealloc */
249 0, /* tp_print */
250 0, /* tp_getattr */
251 0, /* tp_setattr */
252 0, /* tp_reserved */
253 0, /* tp_repr */
254 0, /* tp_as_number */
255 0, /* tp_as_sequence */
256 0, /* tp_as_mapping */
257 0, /* tp_hash */
258 0, /* tp_call */
259 0, /* tp_str */
260 PyObject_GenericGetAttr, /* tp_getattro */
261 0, /* tp_setattro */
262 0, /* tp_as_buffer */
263 Py_TPFLAGS_DEFAULT, /* tp_flags */
264 0, /* tp_doc */
265 0, /* tp_traverse */
266 0, /* tp_clear */
267 0, /* tp_richcompare */
268 0, /* tp_weaklistoffset */
269 0, /* tp_iter */
270 0, /* tp_iternext */
271 0, /* tp_methods */
272 0, /* tp_members */
273 0, /* tp_getset */
274 0, /* tp_base */
275 0, /* tp_dict */
276 0, /* tp_descr_get */
277 0, /* tp_descr_set */
278 0, /* tp_dictoffset */
279 0, /* tp_init */
280 0, /* tp_alloc */
281 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000282};
283
284static PyObject*
285test_lazy_hash_inheritance(PyObject* self)
286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 PyTypeObject *type;
288 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000289 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 if (type->tp_dict != NULL)
294 /* The type has already been initialized. This probably means
295 -R is being used. */
296 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000297
298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 obj = PyObject_New(PyObject, type);
300 if (obj == NULL) {
301 PyErr_Clear();
302 PyErr_SetString(
303 TestError,
304 "test_lazy_hash_inheritance: failed to create object");
305 return NULL;
306 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 if (type->tp_dict != NULL) {
309 PyErr_SetString(
310 TestError,
311 "test_lazy_hash_inheritance: type initialised too soon");
312 Py_DECREF(obj);
313 return NULL;
314 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 hash = PyObject_Hash(obj);
317 if ((hash == -1) && PyErr_Occurred()) {
318 PyErr_Clear();
319 PyErr_SetString(
320 TestError,
321 "test_lazy_hash_inheritance: could not hash object");
322 Py_DECREF(obj);
323 return NULL;
324 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 if (type->tp_dict == NULL) {
327 PyErr_SetString(
328 TestError,
329 "test_lazy_hash_inheritance: type not initialised by hash()");
330 Py_DECREF(obj);
331 return NULL;
332 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 if (type->tp_hash != PyType_Type.tp_hash) {
335 PyErr_SetString(
336 TestError,
337 "test_lazy_hash_inheritance: unexpected hash function");
338 Py_DECREF(obj);
339 return NULL;
340 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000345}
346
347
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000348/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
Tim Petersff70d3c2001-06-14 01:11:03 +0000349 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000350
351 Note that the meat of the test is contained in testcapi_long.h.
352 This is revolting, but delicate code duplication is worse: "almost
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000353 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000354 dependence on type names makes it impossible to use a parameterized
355 function. A giant macro would be even worse than this. A C++ template
356 would be perfect.
357
358 The "report an error" functions are deliberately not part of the #include
359 file: if the test fails, you can set a breakpoint in the appropriate
360 error function directly, and crawl back from there in the debugger.
361*/
362
363#define UNBIND(X) Py_DECREF(X); (X) = NULL
364
365static PyObject *
366raise_test_long_error(const char* msg)
367{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000369}
370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371#define TESTNAME test_long_api_inner
372#define TYPENAME long
373#define F_S_TO_PY PyLong_FromLong
374#define F_PY_TO_S PyLong_AsLong
375#define F_U_TO_PY PyLong_FromUnsignedLong
376#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000377
378#include "testcapi_long.h"
379
380static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000381test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000384}
385
386#undef TESTNAME
387#undef TYPENAME
388#undef F_S_TO_PY
389#undef F_PY_TO_S
390#undef F_U_TO_PY
391#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000392
393#ifdef HAVE_LONG_LONG
Tim Peters91621db2001-06-12 20:10:01 +0000394
395static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000396raise_test_longlong_error(const char* msg)
397{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000399}
400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401#define TESTNAME test_longlong_api_inner
402#define TYPENAME PY_LONG_LONG
403#define F_S_TO_PY PyLong_FromLongLong
404#define F_PY_TO_S PyLong_AsLongLong
405#define F_U_TO_PY PyLong_FromUnsignedLongLong
406#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000407
408#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000409
410static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000411test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000414}
415
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000416#undef TESTNAME
417#undef TYPENAME
418#undef F_S_TO_PY
419#undef F_PY_TO_S
420#undef F_U_TO_PY
421#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000422
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000423/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
424 is tested by test_long_api_inner. This test will concentrate on proper
425 handling of overflow.
426*/
427
428static PyObject *
429test_long_and_overflow(PyObject *self)
430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 PyObject *num, *one, *temp;
432 long value;
433 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 /* Test that overflow is set properly for a large value. */
436 /* num is a number larger than LONG_MAX even on 64-bit platforms */
437 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
438 if (num == NULL)
439 return NULL;
440 overflow = 1234;
441 value = PyLong_AsLongAndOverflow(num, &overflow);
442 Py_DECREF(num);
443 if (value == -1 && PyErr_Occurred())
444 return NULL;
445 if (value != -1)
446 return raiseTestError("test_long_and_overflow",
447 "return value was not set to -1");
448 if (overflow != 1)
449 return raiseTestError("test_long_and_overflow",
450 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 /* Same again, with num = LONG_MAX + 1 */
453 num = PyLong_FromLong(LONG_MAX);
454 if (num == NULL)
455 return NULL;
456 one = PyLong_FromLong(1L);
457 if (one == NULL) {
458 Py_DECREF(num);
459 return NULL;
460 }
461 temp = PyNumber_Add(num, one);
462 Py_DECREF(one);
463 Py_DECREF(num);
464 num = temp;
465 if (num == NULL)
466 return NULL;
467 overflow = 0;
468 value = PyLong_AsLongAndOverflow(num, &overflow);
469 Py_DECREF(num);
470 if (value == -1 && PyErr_Occurred())
471 return NULL;
472 if (value != -1)
473 return raiseTestError("test_long_and_overflow",
474 "return value was not set to -1");
475 if (overflow != 1)
476 return raiseTestError("test_long_and_overflow",
477 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 /* Test that overflow is set properly for a large negative value. */
480 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
481 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
482 if (num == NULL)
483 return NULL;
484 overflow = 1234;
485 value = PyLong_AsLongAndOverflow(num, &overflow);
486 Py_DECREF(num);
487 if (value == -1 && PyErr_Occurred())
488 return NULL;
489 if (value != -1)
490 return raiseTestError("test_long_and_overflow",
491 "return value was not set to -1");
492 if (overflow != -1)
493 return raiseTestError("test_long_and_overflow",
494 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 /* Same again, with num = LONG_MIN - 1 */
497 num = PyLong_FromLong(LONG_MIN);
498 if (num == NULL)
499 return NULL;
500 one = PyLong_FromLong(1L);
501 if (one == NULL) {
502 Py_DECREF(num);
503 return NULL;
504 }
505 temp = PyNumber_Subtract(num, one);
506 Py_DECREF(one);
507 Py_DECREF(num);
508 num = temp;
509 if (num == NULL)
510 return NULL;
511 overflow = 0;
512 value = PyLong_AsLongAndOverflow(num, &overflow);
513 Py_DECREF(num);
514 if (value == -1 && PyErr_Occurred())
515 return NULL;
516 if (value != -1)
517 return raiseTestError("test_long_and_overflow",
518 "return value was not set to -1");
519 if (overflow != -1)
520 return raiseTestError("test_long_and_overflow",
521 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 /* Test that overflow is cleared properly for small values. */
524 num = PyLong_FromString("FF", NULL, 16);
525 if (num == NULL)
526 return NULL;
527 overflow = 1234;
528 value = PyLong_AsLongAndOverflow(num, &overflow);
529 Py_DECREF(num);
530 if (value == -1 && PyErr_Occurred())
531 return NULL;
532 if (value != 0xFF)
533 return raiseTestError("test_long_and_overflow",
534 "expected return value 0xFF");
535 if (overflow != 0)
536 return raiseTestError("test_long_and_overflow",
537 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 num = PyLong_FromString("-FF", NULL, 16);
540 if (num == NULL)
541 return NULL;
542 overflow = 0;
543 value = PyLong_AsLongAndOverflow(num, &overflow);
544 Py_DECREF(num);
545 if (value == -1 && PyErr_Occurred())
546 return NULL;
547 if (value != -0xFF)
548 return raiseTestError("test_long_and_overflow",
549 "expected return value 0xFF");
550 if (overflow != 0)
551 return raiseTestError("test_long_and_overflow",
552 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 num = PyLong_FromLong(LONG_MAX);
555 if (num == NULL)
556 return NULL;
557 overflow = 1234;
558 value = PyLong_AsLongAndOverflow(num, &overflow);
559 Py_DECREF(num);
560 if (value == -1 && PyErr_Occurred())
561 return NULL;
562 if (value != LONG_MAX)
563 return raiseTestError("test_long_and_overflow",
564 "expected return value LONG_MAX");
565 if (overflow != 0)
566 return raiseTestError("test_long_and_overflow",
567 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 num = PyLong_FromLong(LONG_MIN);
570 if (num == NULL)
571 return NULL;
572 overflow = 0;
573 value = PyLong_AsLongAndOverflow(num, &overflow);
574 Py_DECREF(num);
575 if (value == -1 && PyErr_Occurred())
576 return NULL;
577 if (value != LONG_MIN)
578 return raiseTestError("test_long_and_overflow",
579 "expected return value LONG_MIN");
580 if (overflow != 0)
581 return raiseTestError("test_long_and_overflow",
582 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 Py_INCREF(Py_None);
585 return Py_None;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000586}
587
Mark Dickinson93f562c2010-01-30 10:30:15 +0000588/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
589 PY_LONG_LONG is tested by test_long_api_inner. This test will
590 concentrate on proper handling of overflow.
591*/
592
593static PyObject *
594test_long_long_and_overflow(PyObject *self)
595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 PyObject *num, *one, *temp;
597 PY_LONG_LONG value;
598 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 /* Test that overflow is set properly for a large value. */
601 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
602 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
603 if (num == NULL)
604 return NULL;
605 overflow = 1234;
606 value = PyLong_AsLongLongAndOverflow(num, &overflow);
607 Py_DECREF(num);
608 if (value == -1 && PyErr_Occurred())
609 return NULL;
610 if (value != -1)
611 return raiseTestError("test_long_long_and_overflow",
612 "return value was not set to -1");
613 if (overflow != 1)
614 return raiseTestError("test_long_long_and_overflow",
615 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 /* Same again, with num = PY_LLONG_MAX + 1 */
618 num = PyLong_FromLongLong(PY_LLONG_MAX);
619 if (num == NULL)
620 return NULL;
621 one = PyLong_FromLong(1L);
622 if (one == NULL) {
623 Py_DECREF(num);
624 return NULL;
625 }
626 temp = PyNumber_Add(num, one);
627 Py_DECREF(one);
628 Py_DECREF(num);
629 num = temp;
630 if (num == NULL)
631 return NULL;
632 overflow = 0;
633 value = PyLong_AsLongLongAndOverflow(num, &overflow);
634 Py_DECREF(num);
635 if (value == -1 && PyErr_Occurred())
636 return NULL;
637 if (value != -1)
638 return raiseTestError("test_long_long_and_overflow",
639 "return value was not set to -1");
640 if (overflow != 1)
641 return raiseTestError("test_long_long_and_overflow",
642 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 /* Test that overflow is set properly for a large negative value. */
645 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
646 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
647 if (num == NULL)
648 return NULL;
649 overflow = 1234;
650 value = PyLong_AsLongLongAndOverflow(num, &overflow);
651 Py_DECREF(num);
652 if (value == -1 && PyErr_Occurred())
653 return NULL;
654 if (value != -1)
655 return raiseTestError("test_long_long_and_overflow",
656 "return value was not set to -1");
657 if (overflow != -1)
658 return raiseTestError("test_long_long_and_overflow",
659 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 /* Same again, with num = PY_LLONG_MIN - 1 */
662 num = PyLong_FromLongLong(PY_LLONG_MIN);
663 if (num == NULL)
664 return NULL;
665 one = PyLong_FromLong(1L);
666 if (one == NULL) {
667 Py_DECREF(num);
668 return NULL;
669 }
670 temp = PyNumber_Subtract(num, one);
671 Py_DECREF(one);
672 Py_DECREF(num);
673 num = temp;
674 if (num == NULL)
675 return NULL;
676 overflow = 0;
677 value = PyLong_AsLongLongAndOverflow(num, &overflow);
678 Py_DECREF(num);
679 if (value == -1 && PyErr_Occurred())
680 return NULL;
681 if (value != -1)
682 return raiseTestError("test_long_long_and_overflow",
683 "return value was not set to -1");
684 if (overflow != -1)
685 return raiseTestError("test_long_long_and_overflow",
686 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 /* Test that overflow is cleared properly for small values. */
689 num = PyLong_FromString("FF", NULL, 16);
690 if (num == NULL)
691 return NULL;
692 overflow = 1234;
693 value = PyLong_AsLongLongAndOverflow(num, &overflow);
694 Py_DECREF(num);
695 if (value == -1 && PyErr_Occurred())
696 return NULL;
697 if (value != 0xFF)
698 return raiseTestError("test_long_long_and_overflow",
699 "expected return value 0xFF");
700 if (overflow != 0)
701 return raiseTestError("test_long_long_and_overflow",
702 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 num = PyLong_FromString("-FF", NULL, 16);
705 if (num == NULL)
706 return NULL;
707 overflow = 0;
708 value = PyLong_AsLongLongAndOverflow(num, &overflow);
709 Py_DECREF(num);
710 if (value == -1 && PyErr_Occurred())
711 return NULL;
712 if (value != -0xFF)
713 return raiseTestError("test_long_long_and_overflow",
714 "expected return value 0xFF");
715 if (overflow != 0)
716 return raiseTestError("test_long_long_and_overflow",
717 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 num = PyLong_FromLongLong(PY_LLONG_MAX);
720 if (num == NULL)
721 return NULL;
722 overflow = 1234;
723 value = PyLong_AsLongLongAndOverflow(num, &overflow);
724 Py_DECREF(num);
725 if (value == -1 && PyErr_Occurred())
726 return NULL;
727 if (value != PY_LLONG_MAX)
728 return raiseTestError("test_long_long_and_overflow",
729 "expected return value PY_LLONG_MAX");
730 if (overflow != 0)
731 return raiseTestError("test_long_long_and_overflow",
732 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 num = PyLong_FromLongLong(PY_LLONG_MIN);
735 if (num == NULL)
736 return NULL;
737 overflow = 0;
738 value = PyLong_AsLongLongAndOverflow(num, &overflow);
739 Py_DECREF(num);
740 if (value == -1 && PyErr_Occurred())
741 return NULL;
742 if (value != PY_LLONG_MIN)
743 return raiseTestError("test_long_long_and_overflow",
744 "expected return value PY_LLONG_MIN");
745 if (overflow != 0)
746 return raiseTestError("test_long_long_and_overflow",
747 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 Py_INCREF(Py_None);
750 return Py_None;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000751}
752
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200753/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
754 non-integer arguments are handled correctly. It should be extended to
755 test overflow handling.
756 */
757
758static PyObject *
759test_long_as_size_t(PyObject *self)
760{
761 size_t out_u;
762 Py_ssize_t out_s;
763
764 Py_INCREF(Py_None);
765
766 out_u = PyLong_AsSize_t(Py_None);
767 if (out_u != (size_t)-1 || !PyErr_Occurred())
768 return raiseTestError("test_long_as_size_t",
769 "PyLong_AsSize_t(None) didn't complain");
770 if (!PyErr_ExceptionMatches(PyExc_TypeError))
771 return raiseTestError("test_long_as_size_t",
772 "PyLong_AsSize_t(None) raised "
773 "something other than TypeError");
774 PyErr_Clear();
775
776 out_s = PyLong_AsSsize_t(Py_None);
777 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
778 return raiseTestError("test_long_as_size_t",
779 "PyLong_AsSsize_t(None) didn't complain");
780 if (!PyErr_ExceptionMatches(PyExc_TypeError))
781 return raiseTestError("test_long_as_size_t",
782 "PyLong_AsSsize_t(None) raised "
783 "something other than TypeError");
784 PyErr_Clear();
785
786 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
787 return Py_None;
788}
789
790/* Test the PyLong_AsDouble API. At present this just tests that
791 non-integer arguments are handled correctly.
792 */
793
794static PyObject *
795test_long_as_double(PyObject *self)
796{
797 double out;
798
799 Py_INCREF(Py_None);
800
801 out = PyLong_AsDouble(Py_None);
802 if (out != -1.0 || !PyErr_Occurred())
803 return raiseTestError("test_long_as_double",
804 "PyLong_AsDouble(None) didn't complain");
805 if (!PyErr_ExceptionMatches(PyExc_TypeError))
806 return raiseTestError("test_long_as_double",
807 "PyLong_AsDouble(None) raised "
808 "something other than TypeError");
809 PyErr_Clear();
810
811 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
812 return Py_None;
813}
814
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000815/* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
Tim Petersd38b1c72001-09-30 05:09:37 +0000816 for both long and int arguments. The test may leak a little memory if
817 it fails.
818*/
819static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000820test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000821{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 PyObject *tuple, *num;
823 PY_LONG_LONG value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 tuple = PyTuple_New(1);
826 if (tuple == NULL)
827 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 num = PyLong_FromLong(42);
830 if (num == NULL)
831 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 value = -1;
836 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
837 return NULL;
838 if (value != 42)
839 return raiseTestError("test_L_code",
840 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 Py_DECREF(num);
843 num = PyLong_FromLong(42);
844 if (num == NULL)
845 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 value = -1;
850 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
851 return NULL;
852 if (value != 42)
853 return raiseTestError("test_L_code",
854 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 Py_DECREF(tuple);
857 Py_INCREF(Py_None);
858 return Py_None;
Tim Petersd38b1c72001-09-30 05:09:37 +0000859}
860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861#endif /* ifdef HAVE_LONG_LONG */
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000862
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000863/* Test tuple argument processing */
864static PyObject *
865getargs_tuple(PyObject *self, PyObject *args)
866{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 int a, b, c;
868 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
869 return NULL;
870 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000871}
872
Christian Heimes380f7f22008-02-28 11:19:05 +0000873/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +0000874static PyObject *
875getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +0000876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
878 static char *fmt="(ii)i|(i(ii))(iii)i";
879 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +0000880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
882 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
883 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
884 return NULL;
885 return Py_BuildValue("iiiiiiiiii",
886 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
887 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +0000888}
889
Larry Hastings83a9f482012-03-20 20:06:16 +0000890/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
891static PyObject *
892getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
893{
894 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
895 int required = -1;
896 int optional = -1;
897 int keyword_only = -1;
898
899 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
900 &required, &optional, &keyword_only))
901 return NULL;
902 return Py_BuildValue("iii", required, optional, keyword_only);
903}
904
Thomas Heller3457e4b2003-04-24 16:14:27 +0000905/* Functions to call PyArg_ParseTuple with integer format codes,
906 and return the result.
907*/
Thomas Hellera4ea6032003-04-17 18:55:45 +0000908static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000909getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000910{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 unsigned char value;
912 if (!PyArg_ParseTuple(args, "b", &value))
913 return NULL;
914 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000915}
916
Thomas Heller3457e4b2003-04-24 16:14:27 +0000917static PyObject *
918getargs_B(PyObject *self, PyObject *args)
919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 unsigned char value;
921 if (!PyArg_ParseTuple(args, "B", &value))
922 return NULL;
923 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000924}
925
926static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +0000927getargs_h(PyObject *self, PyObject *args)
928{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 short value;
930 if (!PyArg_ParseTuple(args, "h", &value))
931 return NULL;
932 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +0000933}
934
935static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000936getargs_H(PyObject *self, PyObject *args)
937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 unsigned short value;
939 if (!PyArg_ParseTuple(args, "H", &value))
940 return NULL;
941 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000942}
943
944static PyObject *
945getargs_I(PyObject *self, PyObject *args)
946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 unsigned int value;
948 if (!PyArg_ParseTuple(args, "I", &value))
949 return NULL;
950 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000951}
952
953static PyObject *
954getargs_k(PyObject *self, PyObject *args)
955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 unsigned long value;
957 if (!PyArg_ParseTuple(args, "k", &value))
958 return NULL;
959 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000960}
961
962static PyObject *
963getargs_i(PyObject *self, PyObject *args)
964{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 int value;
966 if (!PyArg_ParseTuple(args, "i", &value))
967 return NULL;
968 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000969}
970
Thomas Hellera4ea6032003-04-17 18:55:45 +0000971static PyObject *
972getargs_l(PyObject *self, PyObject *args)
973{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 long value;
975 if (!PyArg_ParseTuple(args, "l", &value))
976 return NULL;
977 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000978}
979
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000980static PyObject *
981getargs_n(PyObject *self, PyObject *args)
982{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 Py_ssize_t value;
984 if (!PyArg_ParseTuple(args, "n", &value))
985 return NULL;
986 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000987}
988
Larry Hastingsfaf91e72012-05-05 16:54:29 -0700989static PyObject *
990getargs_p(PyObject *self, PyObject *args)
991{
992 int value;
993 if (!PyArg_ParseTuple(args, "p", &value))
994 return NULL;
995 return PyLong_FromLong(value);
996}
997
Thomas Hellera4ea6032003-04-17 18:55:45 +0000998#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +0000999static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001000getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001001{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 PY_LONG_LONG value;
1003 if (!PyArg_ParseTuple(args, "L", &value))
1004 return NULL;
1005 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001006}
1007
Thomas Hellera4ea6032003-04-17 18:55:45 +00001008static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001009getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001010{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 unsigned PY_LONG_LONG value;
1012 if (!PyArg_ParseTuple(args, "K", &value))
1013 return NULL;
1014 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001015}
1016#endif
1017
1018/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +00001019 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001020static PyObject *
1021test_k_code(PyObject *self)
1022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 PyObject *tuple, *num;
1024 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 tuple = PyTuple_New(1);
1027 if (tuple == NULL)
1028 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 /* a number larger than ULONG_MAX even on 64-bit platforms */
1031 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1032 if (num == NULL)
1033 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 value = PyLong_AsUnsignedLongMask(num);
1036 if (value != ULONG_MAX)
1037 return raiseTestError("test_k_code",
1038 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 value = 0;
1043 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1044 return NULL;
1045 if (value != ULONG_MAX)
1046 return raiseTestError("test_k_code",
1047 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 Py_DECREF(num);
1050 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1051 if (num == NULL)
1052 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 value = PyLong_AsUnsignedLongMask(num);
1055 if (value != (unsigned long)-0x42)
1056 return raiseTestError("test_k_code",
1057 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 value = 0;
1062 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1063 return NULL;
1064 if (value != (unsigned long)-0x42)
1065 return raiseTestError("test_k_code",
1066 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 Py_DECREF(tuple);
1069 Py_INCREF(Py_None);
1070 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001071}
1072
Victor Stinner06e49dd2010-06-13 18:21:50 +00001073static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001074getargs_c(PyObject *self, PyObject *args)
1075{
1076 char c;
1077 if (!PyArg_ParseTuple(args, "c", &c))
1078 return NULL;
1079 return PyBytes_FromStringAndSize(&c, 1);
1080}
1081
1082static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001083getargs_s(PyObject *self, PyObject *args)
1084{
1085 char *str;
1086 if (!PyArg_ParseTuple(args, "s", &str))
1087 return NULL;
1088 return PyBytes_FromString(str);
1089}
1090
1091static PyObject *
1092getargs_s_star(PyObject *self, PyObject *args)
1093{
1094 Py_buffer buffer;
1095 PyObject *bytes;
1096 if (!PyArg_ParseTuple(args, "s*", &buffer))
1097 return NULL;
1098 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1099 PyBuffer_Release(&buffer);
1100 return bytes;
1101}
1102
1103static PyObject *
1104getargs_s_hash(PyObject *self, PyObject *args)
1105{
1106 char *str;
1107 Py_ssize_t size;
1108 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1109 return NULL;
1110 return PyBytes_FromStringAndSize(str, size);
1111}
1112
1113static PyObject *
1114getargs_z(PyObject *self, PyObject *args)
1115{
1116 char *str;
1117 if (!PyArg_ParseTuple(args, "z", &str))
1118 return NULL;
1119 if (str != NULL)
1120 return PyBytes_FromString(str);
1121 else
1122 Py_RETURN_NONE;
1123}
1124
1125static PyObject *
1126getargs_z_star(PyObject *self, PyObject *args)
1127{
1128 Py_buffer buffer;
1129 PyObject *bytes;
1130 if (!PyArg_ParseTuple(args, "z*", &buffer))
1131 return NULL;
1132 if (buffer.buf != NULL)
1133 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1134 else {
1135 Py_INCREF(Py_None);
1136 bytes = Py_None;
1137 }
1138 PyBuffer_Release(&buffer);
1139 return bytes;
1140}
1141
1142static PyObject *
1143getargs_z_hash(PyObject *self, PyObject *args)
1144{
1145 char *str;
1146 Py_ssize_t size;
1147 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1148 return NULL;
1149 if (str != NULL)
1150 return PyBytes_FromStringAndSize(str, size);
1151 else
1152 Py_RETURN_NONE;
1153}
1154
1155static PyObject *
1156getargs_y(PyObject *self, PyObject *args)
1157{
1158 char *str;
1159 if (!PyArg_ParseTuple(args, "y", &str))
1160 return NULL;
1161 return PyBytes_FromString(str);
1162}
1163
1164static PyObject *
1165getargs_y_star(PyObject *self, PyObject *args)
1166{
1167 Py_buffer buffer;
1168 PyObject *bytes;
1169 if (!PyArg_ParseTuple(args, "y*", &buffer))
1170 return NULL;
1171 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1172 PyBuffer_Release(&buffer);
1173 return bytes;
1174}
1175
1176static PyObject *
1177getargs_y_hash(PyObject *self, PyObject *args)
1178{
1179 char *str;
1180 Py_ssize_t size;
1181 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1182 return NULL;
1183 return PyBytes_FromStringAndSize(str, size);
1184}
1185
1186static PyObject *
1187getargs_u(PyObject *self, PyObject *args)
1188{
1189 Py_UNICODE *str;
1190 Py_ssize_t size;
1191 if (!PyArg_ParseTuple(args, "u", &str))
1192 return NULL;
1193 size = Py_UNICODE_strlen(str);
1194 return PyUnicode_FromUnicode(str, size);
1195}
1196
1197static PyObject *
1198getargs_u_hash(PyObject *self, PyObject *args)
1199{
1200 Py_UNICODE *str;
1201 Py_ssize_t size;
1202 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1203 return NULL;
1204 return PyUnicode_FromUnicode(str, size);
1205}
1206
1207static PyObject *
1208getargs_Z(PyObject *self, PyObject *args)
1209{
1210 Py_UNICODE *str;
1211 Py_ssize_t size;
1212 if (!PyArg_ParseTuple(args, "Z", &str))
1213 return NULL;
1214 if (str != NULL) {
1215 size = Py_UNICODE_strlen(str);
1216 return PyUnicode_FromUnicode(str, size);
1217 } else
1218 Py_RETURN_NONE;
1219}
1220
1221static PyObject *
1222getargs_Z_hash(PyObject *self, PyObject *args)
1223{
1224 Py_UNICODE *str;
1225 Py_ssize_t size;
1226 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1227 return NULL;
1228 if (str != NULL)
1229 return PyUnicode_FromUnicode(str, size);
1230 else
1231 Py_RETURN_NONE;
1232}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001233
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001234/* Test the s and z codes for PyArg_ParseTuple.
1235*/
1236static PyObject *
1237test_s_code(PyObject *self)
1238{
1239 /* Unicode strings should be accepted */
1240 PyObject *tuple, *obj;
1241 char *value;
1242
1243 tuple = PyTuple_New(1);
1244 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001246
1247 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001249 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001251
1252 PyTuple_SET_ITEM(tuple, 0, obj);
1253
1254 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001256 */
1257 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001259
1260 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001262
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001263 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001264 Py_RETURN_NONE;
1265}
1266
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001267static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001268parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001269{
Larry Hastings8f904da2012-06-22 03:56:29 -07001270 PyObject *sub_args;
1271 PyObject *sub_kwargs;
1272 char *sub_format;
1273 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001274
Larry Hastings8f904da2012-06-22 03:56:29 -07001275 Py_ssize_t i, size;
1276 char *keywords[8 + 1]; /* space for NULL at end */
1277 PyObject *o;
1278 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001279
Larry Hastings8f904da2012-06-22 03:56:29 -07001280 int result;
1281 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001282
Larry Hastings22701e82012-08-08 14:52:22 -07001283 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001284
Larry Hastings8f904da2012-06-22 03:56:29 -07001285 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1286 &sub_args, &sub_kwargs,
1287 &sub_format, &sub_keywords))
1288 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001289
Larry Hastings8f904da2012-06-22 03:56:29 -07001290 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1291 PyErr_SetString(PyExc_ValueError,
1292 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1293 return NULL;
1294 }
1295
1296 memset(buffers, 0, sizeof(buffers));
1297 memset(converted, 0, sizeof(converted));
1298 memset(keywords, 0, sizeof(keywords));
1299
1300 size = PySequence_Fast_GET_SIZE(sub_keywords);
1301 if (size > 8) {
1302 PyErr_SetString(PyExc_ValueError,
1303 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1304 goto exit;
1305 }
1306
1307 for (i = 0; i < size; i++) {
1308 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1309 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1310 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001311 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001312 goto exit;
1313 }
1314 keywords[i] = PyBytes_AS_STRING(converted[i]);
1315 }
1316
1317 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1318 sub_format, keywords,
1319 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1320 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1321
1322 if (result) {
1323 return_value = Py_None;
1324 Py_INCREF(Py_None);
1325 }
1326
1327exit:
1328 size = sizeof(converted) / sizeof(converted[0]);
1329 for (i = 0; i < size; i++) {
1330 Py_XDECREF(converted[i]);
1331 }
1332 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001333}
1334
Benjamin Peterson92035012008-12-27 16:00:54 +00001335static volatile int x;
1336
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001337/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1338 of an error.
1339*/
1340static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001341test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 PyObject *tuple, *obj;
1344 Py_UNICODE *value;
1345 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1348 /* Just use the macro and check that it compiles */
1349 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 tuple = PyTuple_New(1);
1352 if (tuple == NULL)
1353 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 obj = PyUnicode_Decode("test", strlen("test"),
1356 "ascii", NULL);
1357 if (obj == NULL)
1358 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 value = 0;
1363 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1364 return NULL;
1365 if (value != PyUnicode_AS_UNICODE(obj))
1366 return raiseTestError("test_u_code",
1367 "u code returned wrong value for u'test'");
1368 value = 0;
1369 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1370 return NULL;
1371 if (value != PyUnicode_AS_UNICODE(obj) ||
1372 len != PyUnicode_GET_SIZE(obj))
1373 return raiseTestError("test_u_code",
1374 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 Py_DECREF(tuple);
1377 Py_INCREF(Py_None);
1378 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001379}
1380
Guido van Rossumfb67be22007-08-29 18:38:11 +00001381/* Test Z and Z# codes for PyArg_ParseTuple */
1382static PyObject *
1383test_Z_code(PyObject *self)
1384{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001386 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 tuple = PyTuple_New(2);
1390 if (tuple == NULL)
1391 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 obj = PyUnicode_FromString("test");
1394 PyTuple_SET_ITEM(tuple, 0, obj);
1395 Py_INCREF(Py_None);
1396 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 /* swap values on purpose */
1399 value1 = NULL;
1400 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 /* Test Z for both values */
1403 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1404 return NULL;
1405 if (value1 != PyUnicode_AS_UNICODE(obj))
1406 return raiseTestError("test_Z_code",
1407 "Z code returned wrong value for 'test'");
1408 if (value2 != NULL)
1409 return raiseTestError("test_Z_code",
1410 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 value1 = NULL;
1413 value2 = PyUnicode_AS_UNICODE(obj);
1414 len1 = -1;
1415 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 /* Test Z# for both values */
1418 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1419 &value2, &len2) < 0)
1420 return NULL;
1421 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1422 len1 != PyUnicode_GET_SIZE(obj))
1423 return raiseTestError("test_Z_code",
1424 "Z# code returned wrong values for 'test'");
1425 if (value2 != NULL ||
1426 len2 != 0)
1427 return raiseTestError("test_Z_code",
1428 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 Py_DECREF(tuple);
1431 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001432}
1433
Thomas Wouters477c8d52006-05-27 19:21:47 +00001434static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001435test_widechar(PyObject *self)
1436{
1437#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1439 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001440 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001441#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1443 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001444#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1448 if (wide == NULL)
1449 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1452 if (utf8 == NULL) {
1453 Py_DECREF(wide);
1454 return NULL;
1455 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001456
Victor Stinner8ef18872011-11-21 02:06:57 +01001457 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 Py_DECREF(wide);
1459 Py_DECREF(utf8);
1460 return raiseTestError("test_widechar",
1461 "wide string and utf8 string "
1462 "have different length");
1463 }
1464 if (PyUnicode_Compare(wide, utf8)) {
1465 Py_DECREF(wide);
1466 Py_DECREF(utf8);
1467 if (PyErr_Occurred())
1468 return NULL;
1469 return raiseTestError("test_widechar",
1470 "wide string and utf8 string "
1471 "are different");
1472 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 Py_DECREF(wide);
1475 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001476
1477#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1478 wide = PyUnicode_FromWideChar(invalid, 1);
1479 if (wide == NULL)
1480 PyErr_Clear();
1481 else
1482 return raiseTestError("test_widechar",
1483 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1484
1485 wide = PyUnicode_FromUnicode(invalid, 1);
1486 if (wide == NULL)
1487 PyErr_Clear();
1488 else
1489 return raiseTestError("test_widechar",
1490 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001491
1492 wide = PyUnicode_FromUnicode(NULL, 1);
1493 if (wide == NULL)
1494 return NULL;
1495 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001496 if (_PyUnicode_Ready(wide) < 0) {
1497 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001498 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001499 }
1500 else {
1501 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001502 return raiseTestError("test_widechar",
1503 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001504 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001505#endif
1506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001507 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001508}
1509
1510static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001511unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001512{
1513 PyObject *unicode, *result;
1514 Py_ssize_t buflen, size;
1515 wchar_t *buffer;
1516
1517 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1518 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001519 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001520 if (buffer == NULL)
1521 return PyErr_NoMemory();
1522
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001523 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001524 if (size == -1) {
1525 PyMem_Free(buffer);
1526 return NULL;
1527 }
1528
1529 if (size < buflen)
1530 buflen = size + 1;
1531 else
1532 buflen = size;
1533 result = PyUnicode_FromWideChar(buffer, buflen);
1534 PyMem_Free(buffer);
1535 if (result == NULL)
1536 return NULL;
1537
1538 return Py_BuildValue("(Nn)", result, size);
1539}
1540
1541static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001542unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001543{
1544 PyObject *unicode, *result;
1545 Py_ssize_t size;
1546 wchar_t *buffer;
1547
1548 if (!PyArg_ParseTuple(args, "U", &unicode))
1549 return NULL;
1550
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001551 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001552 if (buffer == NULL)
1553 return NULL;
1554
1555 result = PyUnicode_FromWideChar(buffer, size + 1);
1556 PyMem_Free(buffer);
1557 if (result == NULL)
1558 return NULL;
1559 return Py_BuildValue("(Nn)", result, size);
1560}
1561
1562static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001563unicode_encodedecimal(PyObject *self, PyObject *args)
1564{
1565 Py_UNICODE *unicode;
1566 Py_ssize_t length;
1567 char *errors = NULL;
1568 PyObject *decimal;
1569 Py_ssize_t decimal_length, new_length;
1570 int res;
1571
1572 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1573 return NULL;
1574
1575 decimal_length = length * 7; /* len('&#8364;') */
1576 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1577 if (decimal == NULL)
1578 return NULL;
1579
1580 res = PyUnicode_EncodeDecimal(unicode, length,
1581 PyBytes_AS_STRING(decimal),
1582 errors);
1583 if (res < 0) {
1584 Py_DECREF(decimal);
1585 return NULL;
1586 }
1587
1588 new_length = strlen(PyBytes_AS_STRING(decimal));
1589 assert(new_length <= decimal_length);
1590 res = _PyBytes_Resize(&decimal, new_length);
1591 if (res < 0)
1592 return NULL;
1593
1594 return decimal;
1595}
1596
1597static PyObject *
1598unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1599{
1600 Py_UNICODE *unicode;
1601 Py_ssize_t length;
1602 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1603 return NULL;
1604 return PyUnicode_TransformDecimalToASCII(unicode, length);
1605}
1606
1607static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001608unicode_legacy_string(PyObject *self, PyObject *args)
1609{
1610 Py_UNICODE *data;
1611 Py_ssize_t len;
1612 PyObject *u;
1613
1614 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1615 return NULL;
1616
1617 u = PyUnicode_FromUnicode(NULL, len);
1618 if (u == NULL)
1619 return NULL;
1620
1621 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1622
1623 if (len > 0) { /* The empty string is always ready. */
1624 assert(!PyUnicode_IS_READY(u));
1625 }
1626
1627 return u;
1628}
1629
1630static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001631getargs_w_star(PyObject *self, PyObject *args)
1632{
1633 Py_buffer buffer;
1634 PyObject *result;
1635 char *str;
1636
1637 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1638 return NULL;
1639
1640 if (2 <= buffer.len) {
1641 str = buffer.buf;
1642 str[0] = '[';
1643 str[buffer.len-1] = ']';
1644 }
1645
1646 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1647 PyBuffer_Release(&buffer);
1648 return result;
1649}
1650
1651
1652static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001653test_empty_argparse(PyObject *self)
1654{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 /* Test that formats can begin with '|'. See issue #4720. */
1656 PyObject *tuple, *dict = NULL;
1657 static char *kwlist[] = {NULL};
1658 int result;
1659 tuple = PyTuple_New(0);
1660 if (!tuple)
1661 return NULL;
1662 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1663 goto done;
1664 dict = PyDict_New();
1665 if (!dict)
1666 goto done;
1667 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00001668 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 Py_DECREF(tuple);
1670 Py_XDECREF(dict);
1671 if (result < 0)
1672 return NULL;
1673 else {
1674 Py_RETURN_NONE;
1675 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001676}
1677
1678static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001679codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 const char *encoding, *errors = NULL;
1682 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1683 &encoding, &errors))
1684 return NULL;
1685 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001686}
1687
Thomas Wouters477c8d52006-05-27 19:21:47 +00001688static PyObject *
1689codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001690{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 const char *encoding, *errors = NULL;
1692 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1693 &encoding, &errors))
1694 return NULL;
1695 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001696}
1697
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001698
Tim Peters5b8132f2003-01-31 15:52:05 +00001699/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001700static PyObject *
1701test_long_numbits(PyObject *self)
1702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 struct triple {
1704 long input;
1705 size_t nbits;
1706 int sign;
1707 } testcases[] = {{0, 0, 0},
1708 {1L, 1, 1},
1709 {-1L, 1, -1},
1710 {2L, 2, 1},
1711 {-2L, 2, -1},
1712 {3L, 2, 1},
1713 {-3L, 2, -1},
1714 {4L, 3, 1},
1715 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03001716 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 {-0x7fffL, 15, -1},
1718 {0xffffL, 16, 1},
1719 {-0xffffL, 16, -1},
1720 {0xfffffffL, 28, 1},
1721 {-0xfffffffL, 28, -1}};
1722 int i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001723
Victor Stinner63941882011-09-29 00:42:28 +02001724 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02001725 size_t nbits;
1726 int sign;
1727 PyObject *plong;
1728
1729 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02001730 if (plong == NULL)
1731 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02001732 nbits = _PyLong_NumBits(plong);
1733 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 Py_DECREF(plong);
1736 if (nbits != testcases[i].nbits)
1737 return raiseTestError("test_long_numbits",
1738 "wrong result for _PyLong_NumBits");
1739 if (sign != testcases[i].sign)
1740 return raiseTestError("test_long_numbits",
1741 "wrong result for _PyLong_Sign");
1742 }
1743 Py_INCREF(Py_None);
1744 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001745}
1746
Thomas Heller519a0422007-11-15 20:48:54 +00001747/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00001748
1749static PyObject *
1750test_null_strings(PyObject *self)
1751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
1753 PyObject *tuple = PyTuple_Pack(2, o1, o2);
1754 Py_XDECREF(o1);
1755 Py_XDECREF(o2);
1756 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00001757}
1758
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001759static PyObject *
1760raise_exception(PyObject *self, PyObject *args)
1761{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 PyObject *exc;
1763 PyObject *exc_args, *v;
1764 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
1767 &exc, &num_args))
1768 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 exc_args = PyTuple_New(num_args);
1771 if (exc_args == NULL)
1772 return NULL;
1773 for (i = 0; i < num_args; ++i) {
1774 v = PyLong_FromLong(i);
1775 if (v == NULL) {
1776 Py_DECREF(exc_args);
1777 return NULL;
1778 }
1779 PyTuple_SET_ITEM(exc_args, i, v);
1780 }
1781 PyErr_SetObject(exc, exc_args);
1782 Py_DECREF(exc_args);
1783 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001784}
Tim Peters91621db2001-06-12 20:10:01 +00001785
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02001786static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02001787set_errno(PyObject *self, PyObject *args)
1788{
1789 int new_errno;
1790
1791 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
1792 return NULL;
1793
1794 errno = new_errno;
1795 Py_RETURN_NONE;
1796}
1797
1798static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02001799test_set_exc_info(PyObject *self, PyObject *args)
1800{
1801 PyObject *orig_exc;
1802 PyObject *new_type, *new_value, *new_tb;
1803 PyObject *type, *value, *tb;
1804 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
1805 &new_type, &new_value, &new_tb))
1806 return NULL;
1807
1808 PyErr_GetExcInfo(&type, &value, &tb);
1809
1810 Py_INCREF(new_type);
1811 Py_INCREF(new_value);
1812 Py_INCREF(new_tb);
1813 PyErr_SetExcInfo(new_type, new_value, new_tb);
1814
1815 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
1816 Py_XDECREF(type);
1817 Py_XDECREF(value);
1818 Py_XDECREF(tb);
1819 return orig_exc;
1820}
Benjamin Peterson16323982010-02-03 01:13:41 +00001821
1822static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001823
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001824static PyObject *
1825test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 if (PyDateTimeAPI) {
1827 if (test_run_counter) {
1828 /* Probably regrtest.py -R */
1829 Py_RETURN_NONE;
1830 }
1831 else {
1832 PyErr_SetString(PyExc_AssertionError,
1833 "PyDateTime_CAPI somehow initialized");
1834 return NULL;
1835 }
1836 }
1837 test_run_counter++;
1838 PyDateTime_IMPORT;
1839 if (PyDateTimeAPI)
1840 Py_RETURN_NONE;
1841 else
1842 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001843}
1844
Benjamin Peterson16323982010-02-03 01:13:41 +00001845
1846#ifdef WITH_THREAD
1847
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001848/* test_thread_state spawns a thread of its own, and that thread releases
1849 * `thread_done` when it's finished. The driver code has to know when the
1850 * thread finishes, because the thread uses a PyObject (the callable) that
1851 * may go away when the driver finishes. The former lack of this explicit
1852 * synchronization caused rare segfaults, so rare that they were seen only
1853 * on a Mac buildbot (although they were possible on any box).
1854 */
1855static PyThread_type_lock thread_done = NULL;
1856
Benjamin Petersona786b022008-08-25 21:05:21 +00001857static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001858_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 PyObject *rc;
1861 int success;
1862 PyGILState_STATE s = PyGILState_Ensure();
1863 rc = PyObject_CallFunction((PyObject *)callable, "");
1864 success = (rc != NULL);
1865 Py_XDECREF(rc);
1866 PyGILState_Release(s);
1867 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001868}
1869
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001870/* Same thing, but releases `thread_done` when it returns. This variant
1871 * should be called only from threads spawned by test_thread_state().
1872 */
1873static void
1874_make_call_from_thread(void *callable)
1875{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 _make_call(callable);
1877 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001878}
1879
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001880static PyObject *
1881test_thread_state(PyObject *self, PyObject *args)
1882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 PyObject *fn;
1884 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1887 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 if (!PyCallable_Check(fn)) {
1890 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1891 fn->ob_type->tp_name);
1892 return NULL;
1893 }
Benjamin Petersona786b022008-08-25 21:05:21 +00001894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 /* Ensure Python is set up for threading */
1896 PyEval_InitThreads();
1897 thread_done = PyThread_allocate_lock();
1898 if (thread_done == NULL)
1899 return PyErr_NoMemory();
1900 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 /* Start a new thread with our callback. */
1903 PyThread_start_new_thread(_make_call_from_thread, fn);
1904 /* Make the callback with the thread lock held by this thread */
1905 success &= _make_call(fn);
1906 /* Do it all again, but this time with the thread-lock released */
1907 Py_BEGIN_ALLOW_THREADS
1908 success &= _make_call(fn);
1909 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1910 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 /* And once more with and without a thread
1913 XXX - should use a lock and work out exactly what we are trying
1914 to test <wink>
1915 */
1916 Py_BEGIN_ALLOW_THREADS
1917 PyThread_start_new_thread(_make_call_from_thread, fn);
1918 success &= _make_call(fn);
1919 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1920 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 /* Release lock we acquired above. This is required on HP-UX. */
1923 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 PyThread_free_lock(thread_done);
1926 if (!success)
1927 return NULL;
1928 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001929}
Benjamin Petersona54c9092009-01-13 02:11:23 +00001930
1931/* test Py_AddPendingCalls using threads */
1932static int _pending_callback(void *arg)
1933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 /* we assume the argument is callable object to which we own a reference */
1935 PyObject *callable = (PyObject *)arg;
1936 PyObject *r = PyObject_CallObject(callable, NULL);
1937 Py_DECREF(callable);
1938 Py_XDECREF(r);
1939 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001940}
1941
1942/* The following requests n callbacks to _pending_callback. It can be
1943 * run from any python thread.
1944 */
1945PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
1946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 PyObject *callable;
1948 int r;
1949 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
1950 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 /* create the reference for the callbackwhile we hold the lock */
1953 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00001954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 Py_BEGIN_ALLOW_THREADS
1956 r = Py_AddPendingCall(&_pending_callback, callable);
1957 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00001958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 if (r<0) {
1960 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
1961 Py_INCREF(Py_False);
1962 return Py_False;
1963 }
1964 Py_INCREF(Py_True);
1965 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001966}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001967#endif
1968
Neal Norwitzb0d26332007-08-25 00:49:05 +00001969/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001970static PyObject *
1971test_string_from_format(PyObject *self, PyObject *args)
1972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 PyObject *result;
1974 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001975
Alexander Belopolskye239d232010-12-08 23:31:48 +00001976#define CHECK_1_FORMAT(FORMAT, TYPE) \
1977 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
1978 if (result == NULL) \
1979 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01001980 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00001981 msg = FORMAT " failed at 1"; \
1982 goto Fail; \
1983 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 CHECK_1_FORMAT("%d", int);
1987 CHECK_1_FORMAT("%ld", long);
1988 /* The z width modifier was added in Python 2.5. */
1989 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 /* The u type code was added in Python 2.5. */
1992 CHECK_1_FORMAT("%u", unsigned int);
1993 CHECK_1_FORMAT("%lu", unsigned long);
1994 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001997#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
1999 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002000#endif
2001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002003
2004 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 Py_XDECREF(result);
2006 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002007
2008#undef CHECK_1_FORMAT
2009}
2010
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002011
2012static PyObject *
2013test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2015 int result;
2016 if (py_s == NULL)
2017 return NULL;
2018 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2019 Py_DECREF(py_s);
2020 if (!result) {
2021 PyErr_SetString(TestError, "Python string ending in NULL "
2022 "should not compare equal to c string.");
2023 return NULL;
2024 }
2025 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002026}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002027
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002028/* This is here to provide a docstring for test_descr. */
2029static PyObject *
2030test_with_docstring(PyObject *self)
2031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002033}
2034
Mark Dickinson725bfd82009-05-03 20:33:40 +00002035/* Test PyOS_string_to_double. */
2036static PyObject *
2037test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 double result;
2039 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041#define CHECK_STRING(STR, expected) \
2042 result = PyOS_string_to_double(STR, NULL, NULL); \
2043 if (result == -1.0 && PyErr_Occurred()) \
2044 return NULL; \
2045 if (result != expected) { \
2046 msg = "conversion of " STR " to float failed"; \
2047 goto fail; \
2048 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050#define CHECK_INVALID(STR) \
2051 result = PyOS_string_to_double(STR, NULL, NULL); \
2052 if (result == -1.0 && PyErr_Occurred()) { \
2053 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2054 PyErr_Clear(); \
2055 else \
2056 return NULL; \
2057 } \
2058 else { \
2059 msg = "conversion of " STR " didn't raise ValueError"; \
2060 goto fail; \
2061 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 CHECK_STRING("0.1", 0.1);
2064 CHECK_STRING("1.234", 1.234);
2065 CHECK_STRING("-1.35", -1.35);
2066 CHECK_STRING(".1e01", 1.0);
2067 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 CHECK_INVALID(" 0.1");
2070 CHECK_INVALID("\t\n-3");
2071 CHECK_INVALID(".123 ");
2072 CHECK_INVALID("3\n");
2073 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002076 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002078#undef CHECK_STRING
2079#undef CHECK_INVALID
2080}
2081
2082
Benjamin Petersonb173f782009-05-05 22:31:58 +00002083/* Coverage testing of capsule objects. */
2084
2085static const char *capsule_name = "capsule name";
2086static char *capsule_pointer = "capsule pointer";
2087static char *capsule_context = "capsule context";
2088static const char *capsule_error = NULL;
2089static int
2090capsule_destructor_call_count = 0;
2091
2092static void
2093capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 capsule_destructor_call_count++;
2095 if (PyCapsule_GetContext(o) != capsule_context) {
2096 capsule_error = "context did not match in destructor!";
2097 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2098 capsule_error = "destructor did not match in destructor! (woah!)";
2099 } else if (PyCapsule_GetName(o) != capsule_name) {
2100 capsule_error = "name did not match in destructor!";
2101 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2102 capsule_error = "pointer did not match in destructor!";
2103 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002104}
2105
2106typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 char *name;
2108 char *module;
2109 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002110} known_capsule;
2111
2112static PyObject *
2113test_capsule(PyObject *self, PyObject *args)
2114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 PyObject *object;
2116 const char *error = NULL;
2117 void *pointer;
2118 void *pointer2;
2119 known_capsule known_capsules[] = {
2120 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2121 KNOWN_CAPSULE("_socket", "CAPI"),
2122 KNOWN_CAPSULE("_curses", "_C_API"),
2123 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2124 { NULL, NULL },
2125 };
2126 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002127
2128#define FAIL(x) { error = (x); goto exit; }
2129
2130#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 if (capsule_error) { \
2132 FAIL(capsule_error); \
2133 } \
2134 else if (!capsule_destructor_call_count) { \
2135 FAIL("destructor not called!"); \
2136 } \
2137 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2140 PyCapsule_SetContext(object, capsule_context);
2141 capsule_destructor(object);
2142 CHECK_DESTRUCTOR;
2143 Py_DECREF(object);
2144 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 object = PyCapsule_New(known, "ignored", NULL);
2147 PyCapsule_SetPointer(object, capsule_pointer);
2148 PyCapsule_SetName(object, capsule_name);
2149 PyCapsule_SetDestructor(object, capsule_destructor);
2150 PyCapsule_SetContext(object, capsule_context);
2151 capsule_destructor(object);
2152 CHECK_DESTRUCTOR;
2153 /* intentionally access using the wrong name */
2154 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2155 if (!PyErr_Occurred()) {
2156 FAIL("PyCapsule_GetPointer should have failed but did not!");
2157 }
2158 PyErr_Clear();
2159 if (pointer2) {
2160 if (pointer2 == capsule_pointer) {
2161 FAIL("PyCapsule_GetPointer should not have"
2162 " returned the internal pointer!");
2163 } else {
2164 FAIL("PyCapsule_GetPointer should have "
2165 "returned NULL pointer but did not!");
2166 }
2167 }
2168 PyCapsule_SetDestructor(object, NULL);
2169 Py_DECREF(object);
2170 if (capsule_destructor_call_count) {
2171 FAIL("destructor called when it should not have been!");
2172 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 for (known = &known_capsules[0]; known->module != NULL; known++) {
2175 /* yeah, ordinarily I wouldn't do this either,
2176 but it's fine for this test harness.
2177 */
2178 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002179#undef FAIL
2180#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 { \
2182 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2183 x, known->module, known->attribute); \
2184 error = buffer; \
2185 goto exit; \
2186 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002188 PyObject *module = PyImport_ImportModule(known->module);
2189 if (module) {
2190 pointer = PyCapsule_Import(known->name, 0);
2191 if (!pointer) {
2192 Py_DECREF(module);
2193 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2194 }
2195 object = PyObject_GetAttrString(module, known->attribute);
2196 if (!object) {
2197 Py_DECREF(module);
2198 return NULL;
2199 }
2200 pointer2 = PyCapsule_GetPointer(object,
2201 "weebles wobble but they don't fall down");
2202 if (!PyErr_Occurred()) {
2203 Py_DECREF(object);
2204 Py_DECREF(module);
2205 FAIL("PyCapsule_GetPointer should have failed but did not!");
2206 }
2207 PyErr_Clear();
2208 if (pointer2) {
2209 Py_DECREF(module);
2210 Py_DECREF(object);
2211 if (pointer2 == pointer) {
2212 FAIL("PyCapsule_GetPointer should not have"
2213 " returned its internal pointer!");
2214 } else {
2215 FAIL("PyCapsule_GetPointer should have"
2216 " returned NULL pointer but did not!");
2217 }
2218 }
2219 Py_DECREF(object);
2220 Py_DECREF(module);
2221 }
2222 else
2223 PyErr_Clear();
2224 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002225
2226 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 if (error) {
2228 return raiseTestError("test_capsule", error);
2229 }
2230 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002231#undef FAIL
2232}
2233
Guido van Rossumddefaf32007-01-14 03:31:43 +00002234#ifdef HAVE_GETTIMEOFDAY
2235/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002236static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 e->tv_sec -= s->tv_sec;
2239 e->tv_usec -= s->tv_usec;
2240 if (e->tv_usec < 0) {
2241 e->tv_sec -=1;
2242 e->tv_usec += 1000000;
2243 }
2244 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002245}
2246
2247static PyObject *
2248profile_int(PyObject *self, PyObject* args)
2249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 int i, k;
2251 struct timeval start, stop;
2252 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 /* Test 1: Allocate and immediately deallocate
2255 many small integers */
2256 gettimeofday(&start, NULL);
2257 for(k=0; k < 20000; k++)
2258 for(i=0; i < 1000; i++) {
2259 single = PyLong_FromLong(i);
2260 Py_DECREF(single);
2261 }
2262 gettimeofday(&stop, NULL);
2263 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 /* Test 2: Allocate and immediately deallocate
2266 many large integers */
2267 gettimeofday(&start, NULL);
2268 for(k=0; k < 20000; k++)
2269 for(i=0; i < 1000; i++) {
2270 single = PyLong_FromLong(i+1000000);
2271 Py_DECREF(single);
2272 }
2273 gettimeofday(&stop, NULL);
2274 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 /* Test 3: Allocate a few integers, then release
2277 them all simultaneously. */
2278 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002279 if (multiple == NULL)
2280 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 gettimeofday(&start, NULL);
2282 for(k=0; k < 20000; k++) {
2283 for(i=0; i < 1000; i++) {
2284 multiple[i] = PyLong_FromLong(i+1000000);
2285 }
2286 for(i=0; i < 1000; i++) {
2287 Py_DECREF(multiple[i]);
2288 }
2289 }
2290 gettimeofday(&stop, NULL);
2291 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002292 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 /* Test 4: Allocate many integers, then release
2295 them all simultaneously. */
2296 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002297 if (multiple == NULL)
2298 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 gettimeofday(&start, NULL);
2300 for(k=0; k < 20; k++) {
2301 for(i=0; i < 1000000; i++) {
2302 multiple[i] = PyLong_FromLong(i+1000000);
2303 }
2304 for(i=0; i < 1000000; i++) {
2305 Py_DECREF(multiple[i]);
2306 }
2307 }
2308 gettimeofday(&stop, NULL);
2309 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002310 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 /* Test 5: Allocate many integers < 32000 */
2313 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002314 if (multiple == NULL)
2315 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 gettimeofday(&start, NULL);
2317 for(k=0; k < 10; k++) {
2318 for(i=0; i < 1000000; i++) {
2319 multiple[i] = PyLong_FromLong(i+1000);
2320 }
2321 for(i=0; i < 1000000; i++) {
2322 Py_DECREF(multiple[i]);
2323 }
2324 }
2325 gettimeofday(&stop, NULL);
2326 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002327 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 /* Test 6: Perform small int addition */
2330 op1 = PyLong_FromLong(1);
2331 gettimeofday(&start, NULL);
2332 for(i=0; i < 10000000; i++) {
2333 result = PyNumber_Add(op1, op1);
2334 Py_DECREF(result);
2335 }
2336 gettimeofday(&stop, NULL);
2337 Py_DECREF(op1);
2338 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 /* Test 7: Perform medium int addition */
2341 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002342 if (op1 == NULL)
2343 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 gettimeofday(&start, NULL);
2345 for(i=0; i < 10000000; i++) {
2346 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002347 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 }
2349 gettimeofday(&stop, NULL);
2350 Py_DECREF(op1);
2351 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 Py_INCREF(Py_None);
2354 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002355}
2356#endif
2357
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002358/* To test the format of tracebacks as printed out. */
2359static PyObject *
2360traceback_print(PyObject *self, PyObject *args)
2361{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 PyObject *file;
2363 PyObject *traceback;
2364 int result;
2365
2366 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2367 &traceback, &file))
2368 return NULL;
2369
2370 result = PyTraceBack_Print(traceback, file);
2371 if (result < 0)
2372 return NULL;
2373 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002374}
2375
Benjamin Petersone6528212008-07-15 15:32:09 +00002376/* To test the format of exceptions as printed out. */
2377static PyObject *
2378exception_print(PyObject *self, PyObject *args)
2379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 PyObject *value;
2381 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 if (!PyArg_ParseTuple(args, "O:exception_print",
2384 &value))
2385 return NULL;
2386 if (!PyExceptionInstance_Check(value)) {
2387 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2388 return NULL;
2389 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 tb = PyException_GetTraceback(value);
2392 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2393 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002396}
2397
2398
2399
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002400
2401/* reliably raise a MemoryError */
2402static PyObject *
2403raise_memoryerror(PyObject *self)
2404{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 PyErr_NoMemory();
2406 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002407}
2408
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002409/* Issue 6012 */
2410static PyObject *str1, *str2;
2411static int
2412failing_converter(PyObject *obj, void *arg)
2413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414 /* Clone str1, then let the conversion fail. */
2415 assert(str1);
2416 str2 = str1;
2417 Py_INCREF(str2);
2418 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002419}
2420static PyObject*
2421argparsing(PyObject *o, PyObject *args)
2422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 PyObject *res;
2424 str1 = str2 = NULL;
2425 if (!PyArg_ParseTuple(args, "O&O&",
2426 PyUnicode_FSConverter, &str1,
2427 failing_converter, &str2)) {
2428 if (!str2)
2429 /* argument converter not called? */
2430 return NULL;
2431 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002432 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 Py_DECREF(str2);
2434 PyErr_Clear();
2435 return res;
2436 }
2437 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002438}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002439
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002440/* To test that the result of PyCode_NewEmpty has the right members. */
2441static PyObject *
2442code_newempty(PyObject *self, PyObject *args)
2443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 const char *filename;
2445 const char *funcname;
2446 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2449 &filename, &funcname, &firstlineno))
2450 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002453}
2454
Georg Brandl1e28a272009-12-28 08:41:01 +00002455/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2456 Run via Lib/test/test_exceptions.py */
2457static PyObject *
2458make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 const char *name;
2461 const char *doc = NULL;
2462 PyObject *base = NULL;
2463 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2468 "s|sOO:make_exception_with_doc", kwlist,
2469 &name, &doc, &base, &dict))
2470 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002472 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002473}
2474
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002475static PyObject *
2476make_memoryview_from_NULL_pointer(PyObject *self)
2477{
2478 Py_buffer info;
2479 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2480 return NULL;
2481 return PyMemoryView_FromBuffer(&info);
2482}
Stefan Krah7213fcc2015-02-01 16:19:23 +01002483
2484static PyObject *
2485test_from_contiguous(PyObject* self, PyObject *noargs)
2486{
2487 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2488 int init[5] = {0, 1, 2, 3, 4};
2489 Py_ssize_t itemsize = sizeof(int);
2490 Py_ssize_t shape = 5;
2491 Py_ssize_t strides = 2 * itemsize;
2492 Py_buffer view = {
2493 data,
2494 NULL,
2495 5 * itemsize,
2496 itemsize,
2497 1,
2498 1,
2499 NULL,
2500 &shape,
2501 &strides,
2502 NULL,
2503 NULL
2504 };
2505 int *ptr;
2506 int i;
2507
2508 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2509 ptr = view.buf;
2510 for (i = 0; i < 5; i++) {
2511 if (ptr[2*i] != i) {
2512 PyErr_SetString(TestError,
2513 "test_from_contiguous: incorrect result");
2514 return NULL;
2515 }
2516 }
2517
2518 view.buf = &data[8];
2519 view.strides[0] = -2 * itemsize;
2520
2521 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2522 ptr = view.buf;
2523 for (i = 0; i < 5; i++) {
2524 if (*(ptr-2*i) != i) {
2525 PyErr_SetString(TestError,
2526 "test_from_contiguous: incorrect result");
2527 return NULL;
2528 }
2529 }
2530
2531 Py_RETURN_NONE;
2532}
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002533
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002534/* Test that the fatal error from not having a current thread doesn't
2535 cause an infinite loop. Run via Lib/test/test_capi.py */
2536static PyObject *
2537crash_no_current_thread(PyObject *self)
2538{
2539 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002540 /* Using PyThreadState_Get() directly allows the test to pass in
2541 !pydebug mode. However, the test only actually tests anything
2542 in pydebug mode, since that's where the infinite loop was in
2543 the first place. */
2544 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002545 Py_END_ALLOW_THREADS
2546 return NULL;
2547}
2548
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002549/* To run some code in a sub-interpreter. */
2550static PyObject *
2551run_in_subinterp(PyObject *self, PyObject *args)
2552{
2553 const char *code;
2554 int r;
2555 PyThreadState *substate, *mainstate;
2556
2557 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2558 &code))
2559 return NULL;
2560
2561 mainstate = PyThreadState_Get();
2562
2563 PyThreadState_Swap(NULL);
2564
2565 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002566 if (substate == NULL) {
2567 /* Since no new thread state was created, there is no exception to
2568 propagate; raise a fresh one after swapping in the old thread
2569 state. */
2570 PyThreadState_Swap(mainstate);
2571 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2572 return NULL;
2573 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002574 r = PyRun_SimpleString(code);
2575 Py_EndInterpreter(substate);
2576
2577 PyThreadState_Swap(mainstate);
2578
2579 return PyLong_FromLong(r);
2580}
2581
Victor Stinner3c1b3792014-02-17 00:02:43 +01002582static int
2583check_time_rounding(int round)
2584{
2585 if (round != _PyTime_ROUND_DOWN && round != _PyTime_ROUND_UP) {
2586 PyErr_SetString(PyExc_ValueError, "invalid rounding");
2587 return -1;
2588 }
2589 return 0;
2590}
2591
Victor Stinner5d272cc2012-03-13 13:35:55 +01002592static PyObject *
2593test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2594{
2595 PyObject *obj;
2596 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002597 int round;
2598 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002599 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002600 if (check_time_rounding(round) < 0)
2601 return NULL;
2602 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002603 return NULL;
2604 return _PyLong_FromTime_t(sec);
2605}
2606
2607static PyObject *
2608test_pytime_object_to_timeval(PyObject *self, PyObject *args)
2609{
2610 PyObject *obj;
2611 time_t sec;
2612 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002613 int round;
2614 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002615 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002616 if (check_time_rounding(round) < 0)
2617 return NULL;
2618 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002619 return NULL;
2620 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
2621}
2622
Victor Stinner643cd682012-03-02 22:54:03 +01002623static PyObject *
2624test_pytime_object_to_timespec(PyObject *self, PyObject *args)
2625{
2626 PyObject *obj;
2627 time_t sec;
2628 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002629 int round;
2630 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01002631 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002632 if (check_time_rounding(round) < 0)
2633 return NULL;
2634 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01002635 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01002636 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01002637}
2638
Antoine Pitrou796564c2013-07-30 19:59:21 +02002639static void
2640slot_tp_del(PyObject *self)
2641{
2642 _Py_IDENTIFIER(__tp_del__);
2643 PyObject *del, *res;
2644 PyObject *error_type, *error_value, *error_traceback;
2645
2646 /* Temporarily resurrect the object. */
2647 assert(self->ob_refcnt == 0);
2648 self->ob_refcnt = 1;
2649
2650 /* Save the current exception, if any. */
2651 PyErr_Fetch(&error_type, &error_value, &error_traceback);
2652
2653 /* Execute __del__ method, if any. */
2654 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
2655 if (del != NULL) {
2656 res = PyEval_CallObject(del, NULL);
2657 if (res == NULL)
2658 PyErr_WriteUnraisable(del);
2659 else
2660 Py_DECREF(res);
2661 Py_DECREF(del);
2662 }
2663
2664 /* Restore the saved exception. */
2665 PyErr_Restore(error_type, error_value, error_traceback);
2666
2667 /* Undo the temporary resurrection; can't use DECREF here, it would
2668 * cause a recursive call.
2669 */
2670 assert(self->ob_refcnt > 0);
2671 if (--self->ob_refcnt == 0)
2672 return; /* this is the normal path out */
2673
2674 /* __del__ resurrected it! Make it look like the original Py_DECREF
2675 * never happened.
2676 */
2677 {
2678 Py_ssize_t refcnt = self->ob_refcnt;
2679 _Py_NewReference(self);
2680 self->ob_refcnt = refcnt;
2681 }
2682 assert(!PyType_IS_GC(Py_TYPE(self)) ||
2683 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
2684 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
2685 * we need to undo that. */
2686 _Py_DEC_REFTOTAL;
2687 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
2688 * chain, so no more to do there.
2689 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
2690 * _Py_NewReference bumped tp_allocs: both of those need to be
2691 * undone.
2692 */
2693#ifdef COUNT_ALLOCS
2694 --Py_TYPE(self)->tp_frees;
2695 --Py_TYPE(self)->tp_allocs;
2696#endif
2697}
2698
2699static PyObject *
2700with_tp_del(PyObject *self, PyObject *args)
2701{
2702 PyObject *obj;
2703 PyTypeObject *tp;
2704
2705 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
2706 return NULL;
2707 tp = (PyTypeObject *) obj;
2708 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
2709 PyErr_Format(PyExc_TypeError,
2710 "heap type expected, got %R", obj);
2711 return NULL;
2712 }
2713 tp->tp_del = slot_tp_del;
2714 Py_INCREF(obj);
2715 return obj;
2716}
2717
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07002718static PyObject *
2719_test_incref(PyObject *ob)
2720{
2721 Py_INCREF(ob);
2722 return ob;
2723}
2724
2725static PyObject *
2726test_xincref_doesnt_leak(PyObject *ob)
2727{
2728 PyObject *obj = PyLong_FromLong(0);
2729 Py_XINCREF(_test_incref(obj));
2730 Py_DECREF(obj);
2731 Py_DECREF(obj);
2732 Py_DECREF(obj);
2733 Py_RETURN_NONE;
2734}
2735
2736static PyObject *
2737test_incref_doesnt_leak(PyObject *ob)
2738{
2739 PyObject *obj = PyLong_FromLong(0);
2740 Py_INCREF(_test_incref(obj));
2741 Py_DECREF(obj);
2742 Py_DECREF(obj);
2743 Py_DECREF(obj);
2744 Py_RETURN_NONE;
2745}
2746
2747static PyObject *
2748test_xdecref_doesnt_leak(PyObject *ob)
2749{
2750 Py_XDECREF(PyLong_FromLong(0));
2751 Py_RETURN_NONE;
2752}
2753
2754static PyObject *
2755test_decref_doesnt_leak(PyObject *ob)
2756{
2757 Py_DECREF(PyLong_FromLong(0));
2758 Py_RETURN_NONE;
2759}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002760
Victor Stinner0507bf52013-07-07 02:05:46 +02002761static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02002762test_incref_decref_API(PyObject *ob)
2763{
2764 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02002765 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02002766 Py_DecRef(obj);
2767 Py_DecRef(obj);
2768 Py_RETURN_NONE;
2769}
2770
2771static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02002772test_pymem_alloc0(PyObject *self)
2773{
2774 void *ptr;
2775
2776 ptr = PyMem_Malloc(0);
2777 if (ptr == NULL) {
2778 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
2779 return NULL;
2780 }
2781 PyMem_Free(ptr);
2782
2783 ptr = PyObject_Malloc(0);
2784 if (ptr == NULL) {
2785 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
2786 return NULL;
2787 }
2788 PyObject_Free(ptr);
2789
2790 Py_RETURN_NONE;
2791}
2792
2793typedef struct {
2794 PyMemAllocator alloc;
2795
2796 size_t malloc_size;
2797 void *realloc_ptr;
2798 size_t realloc_new_size;
2799 void *free_ptr;
2800} alloc_hook_t;
2801
2802static void* hook_malloc (void* ctx, size_t size)
2803{
2804 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2805 hook->malloc_size = size;
2806 return hook->alloc.malloc(hook->alloc.ctx, size);
2807}
2808
2809static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
2810{
2811 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2812 hook->realloc_ptr = ptr;
2813 hook->realloc_new_size = new_size;
2814 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
2815}
2816
2817static void hook_free (void *ctx, void *ptr)
2818{
2819 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2820 hook->free_ptr = ptr;
2821 hook->alloc.free(hook->alloc.ctx, ptr);
2822}
2823
2824static PyObject *
2825test_setallocators(PyMemAllocatorDomain domain)
2826{
2827 PyObject *res = NULL;
2828 const char *error_msg;
2829 alloc_hook_t hook;
2830 PyMemAllocator alloc;
2831 size_t size, size2;
2832 void *ptr, *ptr2;
2833
2834 hook.malloc_size = 0;
2835 hook.realloc_ptr = NULL;
2836 hook.realloc_new_size = 0;
2837 hook.free_ptr = NULL;
2838
2839 alloc.ctx = &hook;
2840 alloc.malloc = &hook_malloc;
2841 alloc.realloc = &hook_realloc;
2842 alloc.free = &hook_free;
2843 PyMem_GetAllocator(domain, &hook.alloc);
2844 PyMem_SetAllocator(domain, &alloc);
2845
2846 size = 42;
2847 switch(domain)
2848 {
2849 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
2850 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
2851 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
2852 default: ptr = NULL; break;
2853 }
2854
2855 if (ptr == NULL) {
2856 error_msg = "malloc failed";
2857 goto fail;
2858 }
2859
2860 if (hook.malloc_size != size) {
2861 error_msg = "malloc invalid size";
2862 goto fail;
2863 }
2864
2865 size2 = 200;
2866 switch(domain)
2867 {
2868 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
2869 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
2870 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02002871 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02002872 }
2873
2874 if (ptr2 == NULL) {
2875 error_msg = "realloc failed";
2876 goto fail;
2877 }
2878
2879 if (hook.realloc_ptr != ptr
2880 || hook.realloc_new_size != size2) {
2881 error_msg = "realloc invalid parameters";
2882 goto fail;
2883 }
2884
2885 switch(domain)
2886 {
2887 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
2888 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
2889 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
2890 }
2891
2892 if (hook.free_ptr != ptr2) {
2893 error_msg = "free invalid pointer";
2894 goto fail;
2895 }
2896
2897 Py_INCREF(Py_None);
2898 res = Py_None;
2899 goto finally;
2900
2901fail:
2902 PyErr_SetString(PyExc_RuntimeError, error_msg);
2903
2904finally:
2905 PyMem_SetAllocator(domain, &hook.alloc);
2906 return res;
2907}
2908
2909static PyObject *
2910test_pymem_setrawallocators(PyObject *self)
2911{
2912 return test_setallocators(PYMEM_DOMAIN_RAW);
2913}
2914
2915static PyObject *
2916test_pymem_setallocators(PyObject *self)
2917{
2918 return test_setallocators(PYMEM_DOMAIN_MEM);
2919}
2920
2921static PyObject *
2922test_pyobject_setallocators(PyObject *self)
2923{
2924 return test_setallocators(PYMEM_DOMAIN_OBJ);
2925}
2926
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002927PyDoc_STRVAR(docstring_empty,
2928""
2929);
2930
2931PyDoc_STRVAR(docstring_no_signature,
2932"This docstring has no signature."
2933);
2934
2935PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002936"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002937"\n"
2938"This docstring has an invalid signature."
2939);
2940
Larry Hastings2623c8c2014-02-08 22:15:29 -08002941PyDoc_STRVAR(docstring_with_invalid_signature2,
2942"docstring_with_invalid_signature2($module, /, boo)\n"
2943"\n"
2944"--\n"
2945"\n"
2946"This docstring also has an invalid signature."
2947);
2948
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002949PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002950"docstring_with_signature($module, /, sig)\n"
2951"--\n"
2952"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002953"This docstring has a valid signature."
2954);
2955
2956PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002957"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
2958"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002959"\n"
2960"\n"
2961"This docstring has a valid signature and some extra newlines."
2962);
2963
Larry Hastings16c51912014-01-07 11:53:01 -08002964PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002965"docstring_with_signature_with_defaults(module, s='avocado',\n"
2966" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
2967" local=the_number_three, sys=sys.maxsize,\n"
2968" exp=sys.maxsize - 1)\n"
2969"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08002970"\n"
2971"\n"
2972"\n"
2973"This docstring has a valid signature with parameters,\n"
2974"and the parameters take defaults of varying types."
2975);
2976
Victor Stinner258e4d32013-12-13 02:30:12 +01002977#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01002978typedef struct {
2979 PyThread_type_lock start_event;
2980 PyThread_type_lock exit_event;
2981 PyObject *callback;
2982} test_c_thread_t;
2983
2984static void
2985temporary_c_thread(void *data)
2986{
2987 test_c_thread_t *test_c_thread = data;
2988 PyGILState_STATE state;
2989 PyObject *res;
2990
2991 PyThread_release_lock(test_c_thread->start_event);
2992
2993 /* Allocate a Python thread state for this thread */
2994 state = PyGILState_Ensure();
2995
2996 res = PyObject_CallFunction(test_c_thread->callback, "", NULL);
2997 Py_CLEAR(test_c_thread->callback);
2998
2999 if (res == NULL) {
3000 PyErr_Print();
3001 }
3002 else {
3003 Py_DECREF(res);
3004 }
3005
3006 /* Destroy the Python thread state for this thread */
3007 PyGILState_Release(state);
3008
3009 PyThread_release_lock(test_c_thread->exit_event);
3010
3011 PyThread_exit_thread();
3012}
3013
3014static PyObject *
3015call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3016{
3017 PyObject *res = NULL;
3018 test_c_thread_t test_c_thread;
3019 long thread;
3020
3021 PyEval_InitThreads();
3022
3023 test_c_thread.start_event = PyThread_allocate_lock();
3024 test_c_thread.exit_event = PyThread_allocate_lock();
3025 test_c_thread.callback = NULL;
3026 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3027 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3028 goto exit;
3029 }
3030
3031 Py_INCREF(callback);
3032 test_c_thread.callback = callback;
3033
3034 PyThread_acquire_lock(test_c_thread.start_event, 1);
3035 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3036
3037 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3038 if (thread == -1) {
3039 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3040 PyThread_release_lock(test_c_thread.start_event);
3041 PyThread_release_lock(test_c_thread.exit_event);
3042 goto exit;
3043 }
3044
3045 PyThread_acquire_lock(test_c_thread.start_event, 1);
3046 PyThread_release_lock(test_c_thread.start_event);
3047
3048 Py_BEGIN_ALLOW_THREADS
3049 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3050 PyThread_release_lock(test_c_thread.exit_event);
3051 Py_END_ALLOW_THREADS
3052
3053 Py_INCREF(Py_None);
3054 res = Py_None;
3055
3056exit:
3057 Py_CLEAR(test_c_thread.callback);
3058 if (test_c_thread.start_event)
3059 PyThread_free_lock(test_c_thread.start_event);
3060 if (test_c_thread.exit_event)
3061 PyThread_free_lock(test_c_thread.exit_event);
3062 return res;
3063}
Victor Stinner258e4d32013-12-13 02:30:12 +01003064#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003065
Serhiy Storchakab5181342015-02-06 08:58:56 +02003066/* marshal */
3067
3068static PyObject*
3069pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3070{
3071 long value;
3072 char *filename;
3073 int version;
3074 FILE *fp;
3075
3076 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3077 &value, &filename, &version))
3078 return NULL;
3079
3080 fp = fopen(filename, "wb");
3081 if (fp == NULL) {
3082 PyErr_SetFromErrno(PyExc_OSError);
3083 return NULL;
3084 }
3085
3086 PyMarshal_WriteLongToFile(value, fp, version);
3087
3088 fclose(fp);
3089 if (PyErr_Occurred())
3090 return NULL;
3091 Py_RETURN_NONE;
3092}
3093
3094static PyObject*
3095pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3096{
3097 PyObject *obj;
3098 char *filename;
3099 int version;
3100 FILE *fp;
3101
3102 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3103 &obj, &filename, &version))
3104 return NULL;
3105
3106 fp = fopen(filename, "wb");
3107 if (fp == NULL) {
3108 PyErr_SetFromErrno(PyExc_OSError);
3109 return NULL;
3110 }
3111
3112 PyMarshal_WriteObjectToFile(obj, fp, version);
3113
3114 fclose(fp);
3115 if (PyErr_Occurred())
3116 return NULL;
3117 Py_RETURN_NONE;
3118}
3119
3120static PyObject*
3121pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3122{
3123 int value;
3124 long pos;
3125 char *filename;
3126 FILE *fp;
3127
3128 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3129 return NULL;
3130
3131 fp = fopen(filename, "rb");
3132 if (fp == NULL) {
3133 PyErr_SetFromErrno(PyExc_OSError);
3134 return NULL;
3135 }
3136
3137 value = PyMarshal_ReadShortFromFile(fp);
3138 pos = ftell(fp);
3139
3140 fclose(fp);
3141 if (PyErr_Occurred())
3142 return NULL;
3143 return Py_BuildValue("il", value, pos);
3144}
3145
3146static PyObject*
3147pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3148{
3149 long value, pos;
3150 char *filename;
3151 FILE *fp;
3152
3153 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3154 return NULL;
3155
3156 fp = fopen(filename, "rb");
3157 if (fp == NULL) {
3158 PyErr_SetFromErrno(PyExc_OSError);
3159 return NULL;
3160 }
3161
3162 value = PyMarshal_ReadLongFromFile(fp);
3163 pos = ftell(fp);
3164
3165 fclose(fp);
3166 if (PyErr_Occurred())
3167 return NULL;
3168 return Py_BuildValue("ll", value, pos);
3169}
3170
3171static PyObject*
3172pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3173{
3174 PyObject *obj;
3175 long pos;
3176 char *filename;
3177 FILE *fp;
3178
3179 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3180 return NULL;
3181
3182 fp = fopen(filename, "rb");
3183 if (fp == NULL) {
3184 PyErr_SetFromErrno(PyExc_OSError);
3185 return NULL;
3186 }
3187
3188 obj = PyMarshal_ReadLastObjectFromFile(fp);
3189 pos = ftell(fp);
3190
3191 fclose(fp);
3192 return Py_BuildValue("Nl", obj, pos);
3193}
3194
3195static PyObject*
3196pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3197{
3198 PyObject *obj;
3199 long pos;
3200 char *filename;
3201 FILE *fp;
3202
3203 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3204 return NULL;
3205
3206 fp = fopen(filename, "rb");
3207 if (fp == NULL) {
3208 PyErr_SetFromErrno(PyExc_OSError);
3209 return NULL;
3210 }
3211
3212 obj = PyMarshal_ReadObjectFromFile(fp);
3213 pos = ftell(fp);
3214
3215 fclose(fp);
3216 return Py_BuildValue("Nl", obj, pos);
3217}
3218
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003219
Tim Peters9ea17ac2001-02-02 05:57:15 +00003220static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 {"raise_exception", raise_exception, METH_VARARGS},
3222 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02003223 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003224 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01003225 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003226 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
3227 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
3228 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
3229 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003230 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003231 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
3232 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
3233 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
3234 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02003235 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
3237 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02003238 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
3239 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
3241 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
3242 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07003243 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003244 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
3245 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
3246 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
3247 PyDoc_STR("This is a pretty normal docstring.")},
3248 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
3249 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
3250 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01003251 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 {"getargs_tuple", getargs_tuple, METH_VARARGS},
3253 {"getargs_keywords", (PyCFunction)getargs_keywords,
3254 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00003255 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
3256 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 {"getargs_b", getargs_b, METH_VARARGS},
3258 {"getargs_B", getargs_B, METH_VARARGS},
3259 {"getargs_h", getargs_h, METH_VARARGS},
3260 {"getargs_H", getargs_H, METH_VARARGS},
3261 {"getargs_I", getargs_I, METH_VARARGS},
3262 {"getargs_k", getargs_k, METH_VARARGS},
3263 {"getargs_i", getargs_i, METH_VARARGS},
3264 {"getargs_l", getargs_l, METH_VARARGS},
3265 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07003266 {"getargs_p", getargs_p, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00003267#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 {"getargs_L", getargs_L, METH_VARARGS},
3269 {"getargs_K", getargs_K, METH_VARARGS},
3270 {"test_longlong_api", test_longlong_api, METH_NOARGS},
3271 {"test_long_long_and_overflow",
3272 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
3273 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003274#endif
Eli Bendersky906b88f2011-07-29 07:05:08 +03003275 {"getargs_c", getargs_c, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003276 {"getargs_s", getargs_s, METH_VARARGS},
3277 {"getargs_s_star", getargs_s_star, METH_VARARGS},
3278 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
3279 {"getargs_z", getargs_z, METH_VARARGS},
3280 {"getargs_z_star", getargs_z_star, METH_VARARGS},
3281 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
3282 {"getargs_y", getargs_y, METH_VARARGS},
3283 {"getargs_y_star", getargs_y_star, METH_VARARGS},
3284 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
3285 {"getargs_u", getargs_u, METH_VARARGS},
3286 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
3287 {"getargs_Z", getargs_Z, METH_VARARGS},
3288 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00003289 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003290 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003291 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003293 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
3295 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
3296 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
3297 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01003298 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
3299 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
3300 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
3301 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01003302 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003303#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00003304 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003306#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00003307#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00003308 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00003309#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00003310 {"traceback_print", traceback_print, METH_VARARGS},
3311 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02003312 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00003313 {"argparsing", argparsing, METH_VARARGS},
3314 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003315 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
3316 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003317 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
3318 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003319 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003320 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01003321 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
3322 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01003323 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02003324 {"with_tp_del", with_tp_del, METH_VARARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02003325 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02003326 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
3327 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02003328 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
3329 {"test_pymem_setallocators",
3330 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
3331 {"test_pyobject_setallocators",
3332 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003333 {"no_docstring",
3334 (PyCFunction)test_with_docstring, METH_NOARGS},
3335 {"docstring_empty",
3336 (PyCFunction)test_with_docstring, METH_NOARGS,
3337 docstring_empty},
3338 {"docstring_no_signature",
3339 (PyCFunction)test_with_docstring, METH_NOARGS,
3340 docstring_no_signature},
3341 {"docstring_with_invalid_signature",
3342 (PyCFunction)test_with_docstring, METH_NOARGS,
3343 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08003344 {"docstring_with_invalid_signature2",
3345 (PyCFunction)test_with_docstring, METH_NOARGS,
3346 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003347 {"docstring_with_signature",
3348 (PyCFunction)test_with_docstring, METH_NOARGS,
3349 docstring_with_signature},
3350 {"docstring_with_signature_and_extra_newlines",
3351 (PyCFunction)test_with_docstring, METH_NOARGS,
3352 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08003353 {"docstring_with_signature_with_defaults",
3354 (PyCFunction)test_with_docstring, METH_NOARGS,
3355 docstring_with_signature_with_defaults},
Victor Stinner258e4d32013-12-13 02:30:12 +01003356#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003357 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
3358 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01003359#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02003360 {"pymarshal_write_long_to_file",
3361 pymarshal_write_long_to_file, METH_VARARGS},
3362 {"pymarshal_write_object_to_file",
3363 pymarshal_write_object_to_file, METH_VARARGS},
3364 {"pymarshal_read_short_from_file",
3365 pymarshal_read_short_from_file, METH_VARARGS},
3366 {"pymarshal_read_long_from_file",
3367 pymarshal_read_long_from_file, METH_VARARGS},
3368 {"pymarshal_read_last_object_from_file",
3369 pymarshal_read_last_object_from_file, METH_VARARGS},
3370 {"pymarshal_read_object_from_file",
3371 pymarshal_read_object_from_file, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00003373};
3374
Thomas Hellera4ea6032003-04-17 18:55:45 +00003375#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
3376
Thomas Wouters89f507f2006-12-13 04:49:30 +00003377typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003378 char bool_member;
3379 char byte_member;
3380 unsigned char ubyte_member;
3381 short short_member;
3382 unsigned short ushort_member;
3383 int int_member;
3384 unsigned int uint_member;
3385 long long_member;
3386 unsigned long ulong_member;
3387 Py_ssize_t pyssizet_member;
3388 float float_member;
3389 double double_member;
3390 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003391#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003392 PY_LONG_LONG longlong_member;
3393 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003394#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003395} all_structmembers;
3396
3397typedef struct {
3398 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003400} test_structmembers;
3401
3402static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
3404 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
3405 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
3406 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
3407 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
3408 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
3409 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
3410 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
3411 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
3412 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
3413 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
3414 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
3415 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003416#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
3418 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003420 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00003421};
3422
3423
Christian Heimes1af737c2008-01-23 08:24:23 +00003424static PyObject *
3425test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
3426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003427 static char *keywords[] = {
3428 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
3429 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
3430 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00003431#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003432 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00003433#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 NULL};
3435 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00003436#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00003438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 ;
3440 test_structmembers *ob;
3441 const char *s = NULL;
3442 Py_ssize_t string_len = 0;
3443 ob = PyObject_New(test_structmembers, type);
3444 if (ob == NULL)
3445 return NULL;
3446 memset(&ob->structmembers, 0, sizeof(all_structmembers));
3447 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
3448 &ob->structmembers.bool_member,
3449 &ob->structmembers.byte_member,
3450 &ob->structmembers.ubyte_member,
3451 &ob->structmembers.short_member,
3452 &ob->structmembers.ushort_member,
3453 &ob->structmembers.int_member,
3454 &ob->structmembers.uint_member,
3455 &ob->structmembers.long_member,
3456 &ob->structmembers.ulong_member,
3457 &ob->structmembers.pyssizet_member,
3458 &ob->structmembers.float_member,
3459 &ob->structmembers.double_member,
3460 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00003461#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003462 , &ob->structmembers.longlong_member,
3463 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00003464#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003465 )) {
3466 Py_DECREF(ob);
3467 return NULL;
3468 }
3469 if (s != NULL) {
3470 if (string_len > 5) {
3471 Py_DECREF(ob);
3472 PyErr_SetString(PyExc_ValueError, "string too long");
3473 return NULL;
3474 }
3475 strcpy(ob->structmembers.inplace_member, s);
3476 }
3477 else {
3478 strcpy(ob->structmembers.inplace_member, "");
3479 }
3480 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003481}
3482
Christian Heimes1af737c2008-01-23 08:24:23 +00003483static void
3484test_structmembers_free(PyObject *ob)
3485{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003486 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003487}
3488
3489static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003490 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003491 "test_structmembersType",
3492 sizeof(test_structmembers), /* tp_basicsize */
3493 0, /* tp_itemsize */
3494 test_structmembers_free, /* destructor tp_dealloc */
3495 0, /* tp_print */
3496 0, /* tp_getattr */
3497 0, /* tp_setattr */
3498 0, /* tp_reserved */
3499 0, /* tp_repr */
3500 0, /* tp_as_number */
3501 0, /* tp_as_sequence */
3502 0, /* tp_as_mapping */
3503 0, /* tp_hash */
3504 0, /* tp_call */
3505 0, /* tp_str */
3506 PyObject_GenericGetAttr, /* tp_getattro */
3507 PyObject_GenericSetAttr, /* tp_setattro */
3508 0, /* tp_as_buffer */
3509 0, /* tp_flags */
3510 "Type containing all structmember types",
3511 0, /* traverseproc tp_traverse */
3512 0, /* tp_clear */
3513 0, /* tp_richcompare */
3514 0, /* tp_weaklistoffset */
3515 0, /* tp_iter */
3516 0, /* tp_iternext */
3517 0, /* tp_methods */
3518 test_members, /* tp_members */
3519 0,
3520 0,
3521 0,
3522 0,
3523 0,
3524 0,
3525 0,
3526 0,
3527 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003528};
3529
3530
Martin v. Löwis1a214512008-06-11 05:26:20 +00003531
3532static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003533 PyModuleDef_HEAD_INIT,
3534 "_testcapi",
3535 NULL,
3536 -1,
3537 TestMethods,
3538 NULL,
3539 NULL,
3540 NULL,
3541 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003542};
3543
Mark Hammond62b1ab12002-07-23 06:31:15 +00003544PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003545PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00003546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003547 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003549 m = PyModule_Create(&_testcapimodule);
3550 if (m == NULL)
3551 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00003554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003555 Py_TYPE(&test_structmembersType)=&PyType_Type;
3556 Py_INCREF(&test_structmembersType);
3557 /* don't use a name starting with "test", since we don't want
3558 test_capi to automatically call this */
3559 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003561 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
3562 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
3563 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
3564 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
3565 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
3566 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
3567 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
3568 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
3569 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
3570 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
3571 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
3572 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
3573 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
3574 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
3575 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
3576 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
3577 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
3578 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
3579 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
3580 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
3581 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
3582 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
3583 Py_INCREF(&PyInstanceMethod_Type);
3584 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00003585
Larry Hastings2a727912014-01-16 11:32:01 -08003586 PyModule_AddIntConstant(m, "the_number_three", 3);
3587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003588 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
3589 Py_INCREF(TestError);
3590 PyModule_AddObject(m, "error", TestError);
3591 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003592}