blob: cf4b0e14f012a11c7e435ac78e0b65caeafbd97c [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 *
1787test_set_exc_info(PyObject *self, PyObject *args)
1788{
1789 PyObject *orig_exc;
1790 PyObject *new_type, *new_value, *new_tb;
1791 PyObject *type, *value, *tb;
1792 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
1793 &new_type, &new_value, &new_tb))
1794 return NULL;
1795
1796 PyErr_GetExcInfo(&type, &value, &tb);
1797
1798 Py_INCREF(new_type);
1799 Py_INCREF(new_value);
1800 Py_INCREF(new_tb);
1801 PyErr_SetExcInfo(new_type, new_value, new_tb);
1802
1803 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
1804 Py_XDECREF(type);
1805 Py_XDECREF(value);
1806 Py_XDECREF(tb);
1807 return orig_exc;
1808}
Benjamin Peterson16323982010-02-03 01:13:41 +00001809
1810static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001811
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001812static PyObject *
1813test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 if (PyDateTimeAPI) {
1815 if (test_run_counter) {
1816 /* Probably regrtest.py -R */
1817 Py_RETURN_NONE;
1818 }
1819 else {
1820 PyErr_SetString(PyExc_AssertionError,
1821 "PyDateTime_CAPI somehow initialized");
1822 return NULL;
1823 }
1824 }
1825 test_run_counter++;
1826 PyDateTime_IMPORT;
1827 if (PyDateTimeAPI)
1828 Py_RETURN_NONE;
1829 else
1830 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001831}
1832
Benjamin Peterson16323982010-02-03 01:13:41 +00001833
1834#ifdef WITH_THREAD
1835
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001836/* test_thread_state spawns a thread of its own, and that thread releases
1837 * `thread_done` when it's finished. The driver code has to know when the
1838 * thread finishes, because the thread uses a PyObject (the callable) that
1839 * may go away when the driver finishes. The former lack of this explicit
1840 * synchronization caused rare segfaults, so rare that they were seen only
1841 * on a Mac buildbot (although they were possible on any box).
1842 */
1843static PyThread_type_lock thread_done = NULL;
1844
Benjamin Petersona786b022008-08-25 21:05:21 +00001845static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001846_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 PyObject *rc;
1849 int success;
1850 PyGILState_STATE s = PyGILState_Ensure();
1851 rc = PyObject_CallFunction((PyObject *)callable, "");
1852 success = (rc != NULL);
1853 Py_XDECREF(rc);
1854 PyGILState_Release(s);
1855 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001856}
1857
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001858/* Same thing, but releases `thread_done` when it returns. This variant
1859 * should be called only from threads spawned by test_thread_state().
1860 */
1861static void
1862_make_call_from_thread(void *callable)
1863{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 _make_call(callable);
1865 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001866}
1867
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001868static PyObject *
1869test_thread_state(PyObject *self, PyObject *args)
1870{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 PyObject *fn;
1872 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1875 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 if (!PyCallable_Check(fn)) {
1878 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1879 fn->ob_type->tp_name);
1880 return NULL;
1881 }
Benjamin Petersona786b022008-08-25 21:05:21 +00001882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 /* Ensure Python is set up for threading */
1884 PyEval_InitThreads();
1885 thread_done = PyThread_allocate_lock();
1886 if (thread_done == NULL)
1887 return PyErr_NoMemory();
1888 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 /* Start a new thread with our callback. */
1891 PyThread_start_new_thread(_make_call_from_thread, fn);
1892 /* Make the callback with the thread lock held by this thread */
1893 success &= _make_call(fn);
1894 /* Do it all again, but this time with the thread-lock released */
1895 Py_BEGIN_ALLOW_THREADS
1896 success &= _make_call(fn);
1897 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1898 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 /* And once more with and without a thread
1901 XXX - should use a lock and work out exactly what we are trying
1902 to test <wink>
1903 */
1904 Py_BEGIN_ALLOW_THREADS
1905 PyThread_start_new_thread(_make_call_from_thread, fn);
1906 success &= _make_call(fn);
1907 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1908 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 /* Release lock we acquired above. This is required on HP-UX. */
1911 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 PyThread_free_lock(thread_done);
1914 if (!success)
1915 return NULL;
1916 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001917}
Benjamin Petersona54c9092009-01-13 02:11:23 +00001918
1919/* test Py_AddPendingCalls using threads */
1920static int _pending_callback(void *arg)
1921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 /* we assume the argument is callable object to which we own a reference */
1923 PyObject *callable = (PyObject *)arg;
1924 PyObject *r = PyObject_CallObject(callable, NULL);
1925 Py_DECREF(callable);
1926 Py_XDECREF(r);
1927 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001928}
1929
1930/* The following requests n callbacks to _pending_callback. It can be
1931 * run from any python thread.
1932 */
1933PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
1934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 PyObject *callable;
1936 int r;
1937 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
1938 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 /* create the reference for the callbackwhile we hold the lock */
1941 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00001942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 Py_BEGIN_ALLOW_THREADS
1944 r = Py_AddPendingCall(&_pending_callback, callable);
1945 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00001946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 if (r<0) {
1948 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
1949 Py_INCREF(Py_False);
1950 return Py_False;
1951 }
1952 Py_INCREF(Py_True);
1953 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001954}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001955#endif
1956
Neal Norwitzb0d26332007-08-25 00:49:05 +00001957/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001958static PyObject *
1959test_string_from_format(PyObject *self, PyObject *args)
1960{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 PyObject *result;
1962 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001963
Alexander Belopolskye239d232010-12-08 23:31:48 +00001964#define CHECK_1_FORMAT(FORMAT, TYPE) \
1965 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
1966 if (result == NULL) \
1967 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01001968 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00001969 msg = FORMAT " failed at 1"; \
1970 goto Fail; \
1971 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001972 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 CHECK_1_FORMAT("%d", int);
1975 CHECK_1_FORMAT("%ld", long);
1976 /* The z width modifier was added in Python 2.5. */
1977 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 /* The u type code was added in Python 2.5. */
1980 CHECK_1_FORMAT("%u", unsigned int);
1981 CHECK_1_FORMAT("%lu", unsigned long);
1982 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001985#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
1987 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001988#endif
1989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001991
1992 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 Py_XDECREF(result);
1994 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001995
1996#undef CHECK_1_FORMAT
1997}
1998
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001999
2000static PyObject *
2001test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2003 int result;
2004 if (py_s == NULL)
2005 return NULL;
2006 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2007 Py_DECREF(py_s);
2008 if (!result) {
2009 PyErr_SetString(TestError, "Python string ending in NULL "
2010 "should not compare equal to c string.");
2011 return NULL;
2012 }
2013 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002014}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002015
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002016/* This is here to provide a docstring for test_descr. */
2017static PyObject *
2018test_with_docstring(PyObject *self)
2019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002021}
2022
Mark Dickinson725bfd82009-05-03 20:33:40 +00002023/* Test PyOS_string_to_double. */
2024static PyObject *
2025test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 double result;
2027 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029#define CHECK_STRING(STR, expected) \
2030 result = PyOS_string_to_double(STR, NULL, NULL); \
2031 if (result == -1.0 && PyErr_Occurred()) \
2032 return NULL; \
2033 if (result != expected) { \
2034 msg = "conversion of " STR " to float failed"; \
2035 goto fail; \
2036 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038#define CHECK_INVALID(STR) \
2039 result = PyOS_string_to_double(STR, NULL, NULL); \
2040 if (result == -1.0 && PyErr_Occurred()) { \
2041 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2042 PyErr_Clear(); \
2043 else \
2044 return NULL; \
2045 } \
2046 else { \
2047 msg = "conversion of " STR " didn't raise ValueError"; \
2048 goto fail; \
2049 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 CHECK_STRING("0.1", 0.1);
2052 CHECK_STRING("1.234", 1.234);
2053 CHECK_STRING("-1.35", -1.35);
2054 CHECK_STRING(".1e01", 1.0);
2055 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 CHECK_INVALID(" 0.1");
2058 CHECK_INVALID("\t\n-3");
2059 CHECK_INVALID(".123 ");
2060 CHECK_INVALID("3\n");
2061 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002064 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002066#undef CHECK_STRING
2067#undef CHECK_INVALID
2068}
2069
2070
Benjamin Petersonb173f782009-05-05 22:31:58 +00002071/* Coverage testing of capsule objects. */
2072
2073static const char *capsule_name = "capsule name";
2074static char *capsule_pointer = "capsule pointer";
2075static char *capsule_context = "capsule context";
2076static const char *capsule_error = NULL;
2077static int
2078capsule_destructor_call_count = 0;
2079
2080static void
2081capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 capsule_destructor_call_count++;
2083 if (PyCapsule_GetContext(o) != capsule_context) {
2084 capsule_error = "context did not match in destructor!";
2085 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2086 capsule_error = "destructor did not match in destructor! (woah!)";
2087 } else if (PyCapsule_GetName(o) != capsule_name) {
2088 capsule_error = "name did not match in destructor!";
2089 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2090 capsule_error = "pointer did not match in destructor!";
2091 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002092}
2093
2094typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 char *name;
2096 char *module;
2097 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002098} known_capsule;
2099
2100static PyObject *
2101test_capsule(PyObject *self, PyObject *args)
2102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 PyObject *object;
2104 const char *error = NULL;
2105 void *pointer;
2106 void *pointer2;
2107 known_capsule known_capsules[] = {
2108 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2109 KNOWN_CAPSULE("_socket", "CAPI"),
2110 KNOWN_CAPSULE("_curses", "_C_API"),
2111 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2112 { NULL, NULL },
2113 };
2114 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002115
2116#define FAIL(x) { error = (x); goto exit; }
2117
2118#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 if (capsule_error) { \
2120 FAIL(capsule_error); \
2121 } \
2122 else if (!capsule_destructor_call_count) { \
2123 FAIL("destructor not called!"); \
2124 } \
2125 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002127 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2128 PyCapsule_SetContext(object, capsule_context);
2129 capsule_destructor(object);
2130 CHECK_DESTRUCTOR;
2131 Py_DECREF(object);
2132 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002134 object = PyCapsule_New(known, "ignored", NULL);
2135 PyCapsule_SetPointer(object, capsule_pointer);
2136 PyCapsule_SetName(object, capsule_name);
2137 PyCapsule_SetDestructor(object, capsule_destructor);
2138 PyCapsule_SetContext(object, capsule_context);
2139 capsule_destructor(object);
2140 CHECK_DESTRUCTOR;
2141 /* intentionally access using the wrong name */
2142 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2143 if (!PyErr_Occurred()) {
2144 FAIL("PyCapsule_GetPointer should have failed but did not!");
2145 }
2146 PyErr_Clear();
2147 if (pointer2) {
2148 if (pointer2 == capsule_pointer) {
2149 FAIL("PyCapsule_GetPointer should not have"
2150 " returned the internal pointer!");
2151 } else {
2152 FAIL("PyCapsule_GetPointer should have "
2153 "returned NULL pointer but did not!");
2154 }
2155 }
2156 PyCapsule_SetDestructor(object, NULL);
2157 Py_DECREF(object);
2158 if (capsule_destructor_call_count) {
2159 FAIL("destructor called when it should not have been!");
2160 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 for (known = &known_capsules[0]; known->module != NULL; known++) {
2163 /* yeah, ordinarily I wouldn't do this either,
2164 but it's fine for this test harness.
2165 */
2166 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002167#undef FAIL
2168#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 { \
2170 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2171 x, known->module, known->attribute); \
2172 error = buffer; \
2173 goto exit; \
2174 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002176 PyObject *module = PyImport_ImportModule(known->module);
2177 if (module) {
2178 pointer = PyCapsule_Import(known->name, 0);
2179 if (!pointer) {
2180 Py_DECREF(module);
2181 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2182 }
2183 object = PyObject_GetAttrString(module, known->attribute);
2184 if (!object) {
2185 Py_DECREF(module);
2186 return NULL;
2187 }
2188 pointer2 = PyCapsule_GetPointer(object,
2189 "weebles wobble but they don't fall down");
2190 if (!PyErr_Occurred()) {
2191 Py_DECREF(object);
2192 Py_DECREF(module);
2193 FAIL("PyCapsule_GetPointer should have failed but did not!");
2194 }
2195 PyErr_Clear();
2196 if (pointer2) {
2197 Py_DECREF(module);
2198 Py_DECREF(object);
2199 if (pointer2 == pointer) {
2200 FAIL("PyCapsule_GetPointer should not have"
2201 " returned its internal pointer!");
2202 } else {
2203 FAIL("PyCapsule_GetPointer should have"
2204 " returned NULL pointer but did not!");
2205 }
2206 }
2207 Py_DECREF(object);
2208 Py_DECREF(module);
2209 }
2210 else
2211 PyErr_Clear();
2212 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002213
2214 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002215 if (error) {
2216 return raiseTestError("test_capsule", error);
2217 }
2218 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002219#undef FAIL
2220}
2221
Guido van Rossumddefaf32007-01-14 03:31:43 +00002222#ifdef HAVE_GETTIMEOFDAY
2223/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002224static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002226 e->tv_sec -= s->tv_sec;
2227 e->tv_usec -= s->tv_usec;
2228 if (e->tv_usec < 0) {
2229 e->tv_sec -=1;
2230 e->tv_usec += 1000000;
2231 }
2232 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002233}
2234
2235static PyObject *
2236profile_int(PyObject *self, PyObject* args)
2237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 int i, k;
2239 struct timeval start, stop;
2240 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242 /* Test 1: Allocate and immediately deallocate
2243 many small integers */
2244 gettimeofday(&start, NULL);
2245 for(k=0; k < 20000; k++)
2246 for(i=0; i < 1000; i++) {
2247 single = PyLong_FromLong(i);
2248 Py_DECREF(single);
2249 }
2250 gettimeofday(&stop, NULL);
2251 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 /* Test 2: Allocate and immediately deallocate
2254 many large integers */
2255 gettimeofday(&start, NULL);
2256 for(k=0; k < 20000; k++)
2257 for(i=0; i < 1000; i++) {
2258 single = PyLong_FromLong(i+1000000);
2259 Py_DECREF(single);
2260 }
2261 gettimeofday(&stop, NULL);
2262 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 /* Test 3: Allocate a few integers, then release
2265 them all simultaneously. */
2266 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002267 if (multiple == NULL)
2268 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 gettimeofday(&start, NULL);
2270 for(k=0; k < 20000; k++) {
2271 for(i=0; i < 1000; i++) {
2272 multiple[i] = PyLong_FromLong(i+1000000);
2273 }
2274 for(i=0; i < 1000; i++) {
2275 Py_DECREF(multiple[i]);
2276 }
2277 }
2278 gettimeofday(&stop, NULL);
2279 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002280 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 /* Test 4: Allocate many integers, then release
2283 them all simultaneously. */
2284 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002285 if (multiple == NULL)
2286 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287 gettimeofday(&start, NULL);
2288 for(k=0; k < 20; k++) {
2289 for(i=0; i < 1000000; i++) {
2290 multiple[i] = PyLong_FromLong(i+1000000);
2291 }
2292 for(i=0; i < 1000000; i++) {
2293 Py_DECREF(multiple[i]);
2294 }
2295 }
2296 gettimeofday(&stop, NULL);
2297 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002298 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 /* Test 5: Allocate many integers < 32000 */
2301 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002302 if (multiple == NULL)
2303 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002304 gettimeofday(&start, NULL);
2305 for(k=0; k < 10; k++) {
2306 for(i=0; i < 1000000; i++) {
2307 multiple[i] = PyLong_FromLong(i+1000);
2308 }
2309 for(i=0; i < 1000000; i++) {
2310 Py_DECREF(multiple[i]);
2311 }
2312 }
2313 gettimeofday(&stop, NULL);
2314 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002315 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317 /* Test 6: Perform small int addition */
2318 op1 = PyLong_FromLong(1);
2319 gettimeofday(&start, NULL);
2320 for(i=0; i < 10000000; i++) {
2321 result = PyNumber_Add(op1, op1);
2322 Py_DECREF(result);
2323 }
2324 gettimeofday(&stop, NULL);
2325 Py_DECREF(op1);
2326 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 /* Test 7: Perform medium int addition */
2329 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002330 if (op1 == NULL)
2331 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 gettimeofday(&start, NULL);
2333 for(i=0; i < 10000000; i++) {
2334 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002335 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 }
2337 gettimeofday(&stop, NULL);
2338 Py_DECREF(op1);
2339 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 Py_INCREF(Py_None);
2342 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002343}
2344#endif
2345
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002346/* To test the format of tracebacks as printed out. */
2347static PyObject *
2348traceback_print(PyObject *self, PyObject *args)
2349{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 PyObject *file;
2351 PyObject *traceback;
2352 int result;
2353
2354 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2355 &traceback, &file))
2356 return NULL;
2357
2358 result = PyTraceBack_Print(traceback, file);
2359 if (result < 0)
2360 return NULL;
2361 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002362}
2363
Benjamin Petersone6528212008-07-15 15:32:09 +00002364/* To test the format of exceptions as printed out. */
2365static PyObject *
2366exception_print(PyObject *self, PyObject *args)
2367{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 PyObject *value;
2369 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 if (!PyArg_ParseTuple(args, "O:exception_print",
2372 &value))
2373 return NULL;
2374 if (!PyExceptionInstance_Check(value)) {
2375 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2376 return NULL;
2377 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 tb = PyException_GetTraceback(value);
2380 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2381 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002384}
2385
2386
2387
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002388
2389/* reliably raise a MemoryError */
2390static PyObject *
2391raise_memoryerror(PyObject *self)
2392{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393 PyErr_NoMemory();
2394 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002395}
2396
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002397/* Issue 6012 */
2398static PyObject *str1, *str2;
2399static int
2400failing_converter(PyObject *obj, void *arg)
2401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 /* Clone str1, then let the conversion fail. */
2403 assert(str1);
2404 str2 = str1;
2405 Py_INCREF(str2);
2406 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002407}
2408static PyObject*
2409argparsing(PyObject *o, PyObject *args)
2410{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 PyObject *res;
2412 str1 = str2 = NULL;
2413 if (!PyArg_ParseTuple(args, "O&O&",
2414 PyUnicode_FSConverter, &str1,
2415 failing_converter, &str2)) {
2416 if (!str2)
2417 /* argument converter not called? */
2418 return NULL;
2419 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002420 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 Py_DECREF(str2);
2422 PyErr_Clear();
2423 return res;
2424 }
2425 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002426}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002427
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002428/* To test that the result of PyCode_NewEmpty has the right members. */
2429static PyObject *
2430code_newempty(PyObject *self, PyObject *args)
2431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 const char *filename;
2433 const char *funcname;
2434 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2437 &filename, &funcname, &firstlineno))
2438 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002441}
2442
Georg Brandl1e28a272009-12-28 08:41:01 +00002443/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2444 Run via Lib/test/test_exceptions.py */
2445static PyObject *
2446make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 const char *name;
2449 const char *doc = NULL;
2450 PyObject *base = NULL;
2451 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2456 "s|sOO:make_exception_with_doc", kwlist,
2457 &name, &doc, &base, &dict))
2458 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002461}
2462
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002463static PyObject *
2464make_memoryview_from_NULL_pointer(PyObject *self)
2465{
2466 Py_buffer info;
2467 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2468 return NULL;
2469 return PyMemoryView_FromBuffer(&info);
2470}
Stefan Krah7213fcc2015-02-01 16:19:23 +01002471
2472static PyObject *
2473test_from_contiguous(PyObject* self, PyObject *noargs)
2474{
2475 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2476 int init[5] = {0, 1, 2, 3, 4};
2477 Py_ssize_t itemsize = sizeof(int);
2478 Py_ssize_t shape = 5;
2479 Py_ssize_t strides = 2 * itemsize;
2480 Py_buffer view = {
2481 data,
2482 NULL,
2483 5 * itemsize,
2484 itemsize,
2485 1,
2486 1,
2487 NULL,
2488 &shape,
2489 &strides,
2490 NULL,
2491 NULL
2492 };
2493 int *ptr;
2494 int i;
2495
2496 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2497 ptr = view.buf;
2498 for (i = 0; i < 5; i++) {
2499 if (ptr[2*i] != i) {
2500 PyErr_SetString(TestError,
2501 "test_from_contiguous: incorrect result");
2502 return NULL;
2503 }
2504 }
2505
2506 view.buf = &data[8];
2507 view.strides[0] = -2 * itemsize;
2508
2509 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2510 ptr = view.buf;
2511 for (i = 0; i < 5; i++) {
2512 if (*(ptr-2*i) != i) {
2513 PyErr_SetString(TestError,
2514 "test_from_contiguous: incorrect result");
2515 return NULL;
2516 }
2517 }
2518
2519 Py_RETURN_NONE;
2520}
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002521
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002522/* Test that the fatal error from not having a current thread doesn't
2523 cause an infinite loop. Run via Lib/test/test_capi.py */
2524static PyObject *
2525crash_no_current_thread(PyObject *self)
2526{
2527 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002528 /* Using PyThreadState_Get() directly allows the test to pass in
2529 !pydebug mode. However, the test only actually tests anything
2530 in pydebug mode, since that's where the infinite loop was in
2531 the first place. */
2532 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002533 Py_END_ALLOW_THREADS
2534 return NULL;
2535}
2536
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002537/* To run some code in a sub-interpreter. */
2538static PyObject *
2539run_in_subinterp(PyObject *self, PyObject *args)
2540{
2541 const char *code;
2542 int r;
2543 PyThreadState *substate, *mainstate;
2544
2545 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2546 &code))
2547 return NULL;
2548
2549 mainstate = PyThreadState_Get();
2550
2551 PyThreadState_Swap(NULL);
2552
2553 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002554 if (substate == NULL) {
2555 /* Since no new thread state was created, there is no exception to
2556 propagate; raise a fresh one after swapping in the old thread
2557 state. */
2558 PyThreadState_Swap(mainstate);
2559 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2560 return NULL;
2561 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002562 r = PyRun_SimpleString(code);
2563 Py_EndInterpreter(substate);
2564
2565 PyThreadState_Swap(mainstate);
2566
2567 return PyLong_FromLong(r);
2568}
2569
Victor Stinner3c1b3792014-02-17 00:02:43 +01002570static int
2571check_time_rounding(int round)
2572{
2573 if (round != _PyTime_ROUND_DOWN && round != _PyTime_ROUND_UP) {
2574 PyErr_SetString(PyExc_ValueError, "invalid rounding");
2575 return -1;
2576 }
2577 return 0;
2578}
2579
Victor Stinner5d272cc2012-03-13 13:35:55 +01002580static PyObject *
2581test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2582{
2583 PyObject *obj;
2584 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002585 int round;
2586 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002587 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002588 if (check_time_rounding(round) < 0)
2589 return NULL;
2590 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002591 return NULL;
2592 return _PyLong_FromTime_t(sec);
2593}
2594
2595static PyObject *
2596test_pytime_object_to_timeval(PyObject *self, PyObject *args)
2597{
2598 PyObject *obj;
2599 time_t sec;
2600 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002601 int round;
2602 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002603 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002604 if (check_time_rounding(round) < 0)
2605 return NULL;
2606 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002607 return NULL;
2608 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
2609}
2610
Victor Stinner643cd682012-03-02 22:54:03 +01002611static PyObject *
2612test_pytime_object_to_timespec(PyObject *self, PyObject *args)
2613{
2614 PyObject *obj;
2615 time_t sec;
2616 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002617 int round;
2618 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01002619 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002620 if (check_time_rounding(round) < 0)
2621 return NULL;
2622 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01002623 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01002624 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01002625}
2626
Antoine Pitrou796564c2013-07-30 19:59:21 +02002627static void
2628slot_tp_del(PyObject *self)
2629{
2630 _Py_IDENTIFIER(__tp_del__);
2631 PyObject *del, *res;
2632 PyObject *error_type, *error_value, *error_traceback;
2633
2634 /* Temporarily resurrect the object. */
2635 assert(self->ob_refcnt == 0);
2636 self->ob_refcnt = 1;
2637
2638 /* Save the current exception, if any. */
2639 PyErr_Fetch(&error_type, &error_value, &error_traceback);
2640
2641 /* Execute __del__ method, if any. */
2642 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
2643 if (del != NULL) {
2644 res = PyEval_CallObject(del, NULL);
2645 if (res == NULL)
2646 PyErr_WriteUnraisable(del);
2647 else
2648 Py_DECREF(res);
2649 Py_DECREF(del);
2650 }
2651
2652 /* Restore the saved exception. */
2653 PyErr_Restore(error_type, error_value, error_traceback);
2654
2655 /* Undo the temporary resurrection; can't use DECREF here, it would
2656 * cause a recursive call.
2657 */
2658 assert(self->ob_refcnt > 0);
2659 if (--self->ob_refcnt == 0)
2660 return; /* this is the normal path out */
2661
2662 /* __del__ resurrected it! Make it look like the original Py_DECREF
2663 * never happened.
2664 */
2665 {
2666 Py_ssize_t refcnt = self->ob_refcnt;
2667 _Py_NewReference(self);
2668 self->ob_refcnt = refcnt;
2669 }
2670 assert(!PyType_IS_GC(Py_TYPE(self)) ||
2671 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
2672 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
2673 * we need to undo that. */
2674 _Py_DEC_REFTOTAL;
2675 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
2676 * chain, so no more to do there.
2677 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
2678 * _Py_NewReference bumped tp_allocs: both of those need to be
2679 * undone.
2680 */
2681#ifdef COUNT_ALLOCS
2682 --Py_TYPE(self)->tp_frees;
2683 --Py_TYPE(self)->tp_allocs;
2684#endif
2685}
2686
2687static PyObject *
2688with_tp_del(PyObject *self, PyObject *args)
2689{
2690 PyObject *obj;
2691 PyTypeObject *tp;
2692
2693 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
2694 return NULL;
2695 tp = (PyTypeObject *) obj;
2696 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
2697 PyErr_Format(PyExc_TypeError,
2698 "heap type expected, got %R", obj);
2699 return NULL;
2700 }
2701 tp->tp_del = slot_tp_del;
2702 Py_INCREF(obj);
2703 return obj;
2704}
2705
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07002706static PyObject *
2707_test_incref(PyObject *ob)
2708{
2709 Py_INCREF(ob);
2710 return ob;
2711}
2712
2713static PyObject *
2714test_xincref_doesnt_leak(PyObject *ob)
2715{
2716 PyObject *obj = PyLong_FromLong(0);
2717 Py_XINCREF(_test_incref(obj));
2718 Py_DECREF(obj);
2719 Py_DECREF(obj);
2720 Py_DECREF(obj);
2721 Py_RETURN_NONE;
2722}
2723
2724static PyObject *
2725test_incref_doesnt_leak(PyObject *ob)
2726{
2727 PyObject *obj = PyLong_FromLong(0);
2728 Py_INCREF(_test_incref(obj));
2729 Py_DECREF(obj);
2730 Py_DECREF(obj);
2731 Py_DECREF(obj);
2732 Py_RETURN_NONE;
2733}
2734
2735static PyObject *
2736test_xdecref_doesnt_leak(PyObject *ob)
2737{
2738 Py_XDECREF(PyLong_FromLong(0));
2739 Py_RETURN_NONE;
2740}
2741
2742static PyObject *
2743test_decref_doesnt_leak(PyObject *ob)
2744{
2745 Py_DECREF(PyLong_FromLong(0));
2746 Py_RETURN_NONE;
2747}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002748
Victor Stinner0507bf52013-07-07 02:05:46 +02002749static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02002750test_incref_decref_API(PyObject *ob)
2751{
2752 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02002753 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02002754 Py_DecRef(obj);
2755 Py_DecRef(obj);
2756 Py_RETURN_NONE;
2757}
2758
2759static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02002760test_pymem_alloc0(PyObject *self)
2761{
2762 void *ptr;
2763
2764 ptr = PyMem_Malloc(0);
2765 if (ptr == NULL) {
2766 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
2767 return NULL;
2768 }
2769 PyMem_Free(ptr);
2770
2771 ptr = PyObject_Malloc(0);
2772 if (ptr == NULL) {
2773 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
2774 return NULL;
2775 }
2776 PyObject_Free(ptr);
2777
2778 Py_RETURN_NONE;
2779}
2780
2781typedef struct {
2782 PyMemAllocator alloc;
2783
2784 size_t malloc_size;
2785 void *realloc_ptr;
2786 size_t realloc_new_size;
2787 void *free_ptr;
2788} alloc_hook_t;
2789
2790static void* hook_malloc (void* ctx, size_t size)
2791{
2792 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2793 hook->malloc_size = size;
2794 return hook->alloc.malloc(hook->alloc.ctx, size);
2795}
2796
2797static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
2798{
2799 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2800 hook->realloc_ptr = ptr;
2801 hook->realloc_new_size = new_size;
2802 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
2803}
2804
2805static void hook_free (void *ctx, void *ptr)
2806{
2807 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2808 hook->free_ptr = ptr;
2809 hook->alloc.free(hook->alloc.ctx, ptr);
2810}
2811
2812static PyObject *
2813test_setallocators(PyMemAllocatorDomain domain)
2814{
2815 PyObject *res = NULL;
2816 const char *error_msg;
2817 alloc_hook_t hook;
2818 PyMemAllocator alloc;
2819 size_t size, size2;
2820 void *ptr, *ptr2;
2821
2822 hook.malloc_size = 0;
2823 hook.realloc_ptr = NULL;
2824 hook.realloc_new_size = 0;
2825 hook.free_ptr = NULL;
2826
2827 alloc.ctx = &hook;
2828 alloc.malloc = &hook_malloc;
2829 alloc.realloc = &hook_realloc;
2830 alloc.free = &hook_free;
2831 PyMem_GetAllocator(domain, &hook.alloc);
2832 PyMem_SetAllocator(domain, &alloc);
2833
2834 size = 42;
2835 switch(domain)
2836 {
2837 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
2838 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
2839 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
2840 default: ptr = NULL; break;
2841 }
2842
2843 if (ptr == NULL) {
2844 error_msg = "malloc failed";
2845 goto fail;
2846 }
2847
2848 if (hook.malloc_size != size) {
2849 error_msg = "malloc invalid size";
2850 goto fail;
2851 }
2852
2853 size2 = 200;
2854 switch(domain)
2855 {
2856 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
2857 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
2858 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02002859 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02002860 }
2861
2862 if (ptr2 == NULL) {
2863 error_msg = "realloc failed";
2864 goto fail;
2865 }
2866
2867 if (hook.realloc_ptr != ptr
2868 || hook.realloc_new_size != size2) {
2869 error_msg = "realloc invalid parameters";
2870 goto fail;
2871 }
2872
2873 switch(domain)
2874 {
2875 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
2876 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
2877 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
2878 }
2879
2880 if (hook.free_ptr != ptr2) {
2881 error_msg = "free invalid pointer";
2882 goto fail;
2883 }
2884
2885 Py_INCREF(Py_None);
2886 res = Py_None;
2887 goto finally;
2888
2889fail:
2890 PyErr_SetString(PyExc_RuntimeError, error_msg);
2891
2892finally:
2893 PyMem_SetAllocator(domain, &hook.alloc);
2894 return res;
2895}
2896
2897static PyObject *
2898test_pymem_setrawallocators(PyObject *self)
2899{
2900 return test_setallocators(PYMEM_DOMAIN_RAW);
2901}
2902
2903static PyObject *
2904test_pymem_setallocators(PyObject *self)
2905{
2906 return test_setallocators(PYMEM_DOMAIN_MEM);
2907}
2908
2909static PyObject *
2910test_pyobject_setallocators(PyObject *self)
2911{
2912 return test_setallocators(PYMEM_DOMAIN_OBJ);
2913}
2914
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002915PyDoc_STRVAR(docstring_empty,
2916""
2917);
2918
2919PyDoc_STRVAR(docstring_no_signature,
2920"This docstring has no signature."
2921);
2922
2923PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002924"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002925"\n"
2926"This docstring has an invalid signature."
2927);
2928
Larry Hastings2623c8c2014-02-08 22:15:29 -08002929PyDoc_STRVAR(docstring_with_invalid_signature2,
2930"docstring_with_invalid_signature2($module, /, boo)\n"
2931"\n"
2932"--\n"
2933"\n"
2934"This docstring also has an invalid signature."
2935);
2936
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002937PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002938"docstring_with_signature($module, /, sig)\n"
2939"--\n"
2940"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002941"This docstring has a valid signature."
2942);
2943
2944PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002945"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
2946"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002947"\n"
2948"\n"
2949"This docstring has a valid signature and some extra newlines."
2950);
2951
Larry Hastings16c51912014-01-07 11:53:01 -08002952PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002953"docstring_with_signature_with_defaults(module, s='avocado',\n"
2954" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
2955" local=the_number_three, sys=sys.maxsize,\n"
2956" exp=sys.maxsize - 1)\n"
2957"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08002958"\n"
2959"\n"
2960"\n"
2961"This docstring has a valid signature with parameters,\n"
2962"and the parameters take defaults of varying types."
2963);
2964
Victor Stinner258e4d32013-12-13 02:30:12 +01002965#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01002966typedef struct {
2967 PyThread_type_lock start_event;
2968 PyThread_type_lock exit_event;
2969 PyObject *callback;
2970} test_c_thread_t;
2971
2972static void
2973temporary_c_thread(void *data)
2974{
2975 test_c_thread_t *test_c_thread = data;
2976 PyGILState_STATE state;
2977 PyObject *res;
2978
2979 PyThread_release_lock(test_c_thread->start_event);
2980
2981 /* Allocate a Python thread state for this thread */
2982 state = PyGILState_Ensure();
2983
2984 res = PyObject_CallFunction(test_c_thread->callback, "", NULL);
2985 Py_CLEAR(test_c_thread->callback);
2986
2987 if (res == NULL) {
2988 PyErr_Print();
2989 }
2990 else {
2991 Py_DECREF(res);
2992 }
2993
2994 /* Destroy the Python thread state for this thread */
2995 PyGILState_Release(state);
2996
2997 PyThread_release_lock(test_c_thread->exit_event);
2998
2999 PyThread_exit_thread();
3000}
3001
3002static PyObject *
3003call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3004{
3005 PyObject *res = NULL;
3006 test_c_thread_t test_c_thread;
3007 long thread;
3008
3009 PyEval_InitThreads();
3010
3011 test_c_thread.start_event = PyThread_allocate_lock();
3012 test_c_thread.exit_event = PyThread_allocate_lock();
3013 test_c_thread.callback = NULL;
3014 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3015 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3016 goto exit;
3017 }
3018
3019 Py_INCREF(callback);
3020 test_c_thread.callback = callback;
3021
3022 PyThread_acquire_lock(test_c_thread.start_event, 1);
3023 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3024
3025 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3026 if (thread == -1) {
3027 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3028 PyThread_release_lock(test_c_thread.start_event);
3029 PyThread_release_lock(test_c_thread.exit_event);
3030 goto exit;
3031 }
3032
3033 PyThread_acquire_lock(test_c_thread.start_event, 1);
3034 PyThread_release_lock(test_c_thread.start_event);
3035
3036 Py_BEGIN_ALLOW_THREADS
3037 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3038 PyThread_release_lock(test_c_thread.exit_event);
3039 Py_END_ALLOW_THREADS
3040
3041 Py_INCREF(Py_None);
3042 res = Py_None;
3043
3044exit:
3045 Py_CLEAR(test_c_thread.callback);
3046 if (test_c_thread.start_event)
3047 PyThread_free_lock(test_c_thread.start_event);
3048 if (test_c_thread.exit_event)
3049 PyThread_free_lock(test_c_thread.exit_event);
3050 return res;
3051}
Victor Stinner258e4d32013-12-13 02:30:12 +01003052#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003053
Serhiy Storchakab5181342015-02-06 08:58:56 +02003054/* marshal */
3055
3056static PyObject*
3057pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3058{
3059 long value;
3060 char *filename;
3061 int version;
3062 FILE *fp;
3063
3064 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3065 &value, &filename, &version))
3066 return NULL;
3067
3068 fp = fopen(filename, "wb");
3069 if (fp == NULL) {
3070 PyErr_SetFromErrno(PyExc_OSError);
3071 return NULL;
3072 }
3073
3074 PyMarshal_WriteLongToFile(value, fp, version);
3075
3076 fclose(fp);
3077 if (PyErr_Occurred())
3078 return NULL;
3079 Py_RETURN_NONE;
3080}
3081
3082static PyObject*
3083pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3084{
3085 PyObject *obj;
3086 char *filename;
3087 int version;
3088 FILE *fp;
3089
3090 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3091 &obj, &filename, &version))
3092 return NULL;
3093
3094 fp = fopen(filename, "wb");
3095 if (fp == NULL) {
3096 PyErr_SetFromErrno(PyExc_OSError);
3097 return NULL;
3098 }
3099
3100 PyMarshal_WriteObjectToFile(obj, fp, version);
3101
3102 fclose(fp);
3103 if (PyErr_Occurred())
3104 return NULL;
3105 Py_RETURN_NONE;
3106}
3107
3108static PyObject*
3109pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3110{
3111 int value;
3112 long pos;
3113 char *filename;
3114 FILE *fp;
3115
3116 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3117 return NULL;
3118
3119 fp = fopen(filename, "rb");
3120 if (fp == NULL) {
3121 PyErr_SetFromErrno(PyExc_OSError);
3122 return NULL;
3123 }
3124
3125 value = PyMarshal_ReadShortFromFile(fp);
3126 pos = ftell(fp);
3127
3128 fclose(fp);
3129 if (PyErr_Occurred())
3130 return NULL;
3131 return Py_BuildValue("il", value, pos);
3132}
3133
3134static PyObject*
3135pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3136{
3137 long value, pos;
3138 char *filename;
3139 FILE *fp;
3140
3141 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3142 return NULL;
3143
3144 fp = fopen(filename, "rb");
3145 if (fp == NULL) {
3146 PyErr_SetFromErrno(PyExc_OSError);
3147 return NULL;
3148 }
3149
3150 value = PyMarshal_ReadLongFromFile(fp);
3151 pos = ftell(fp);
3152
3153 fclose(fp);
3154 if (PyErr_Occurred())
3155 return NULL;
3156 return Py_BuildValue("ll", value, pos);
3157}
3158
3159static PyObject*
3160pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3161{
3162 PyObject *obj;
3163 long pos;
3164 char *filename;
3165 FILE *fp;
3166
3167 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3168 return NULL;
3169
3170 fp = fopen(filename, "rb");
3171 if (fp == NULL) {
3172 PyErr_SetFromErrno(PyExc_OSError);
3173 return NULL;
3174 }
3175
3176 obj = PyMarshal_ReadLastObjectFromFile(fp);
3177 pos = ftell(fp);
3178
3179 fclose(fp);
3180 return Py_BuildValue("Nl", obj, pos);
3181}
3182
3183static PyObject*
3184pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3185{
3186 PyObject *obj;
3187 long pos;
3188 char *filename;
3189 FILE *fp;
3190
3191 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3192 return NULL;
3193
3194 fp = fopen(filename, "rb");
3195 if (fp == NULL) {
3196 PyErr_SetFromErrno(PyExc_OSError);
3197 return NULL;
3198 }
3199
3200 obj = PyMarshal_ReadObjectFromFile(fp);
3201 pos = ftell(fp);
3202
3203 fclose(fp);
3204 return Py_BuildValue("Nl", obj, pos);
3205}
3206
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003207
Tim Peters9ea17ac2001-02-02 05:57:15 +00003208static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 {"raise_exception", raise_exception, METH_VARARGS},
3210 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
3211 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01003212 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
3214 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
3215 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
3216 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003218 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
3219 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
3220 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
3221 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02003222 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
3224 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02003225 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
3226 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
3228 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
3229 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07003230 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003231 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
3232 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
3233 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
3234 PyDoc_STR("This is a pretty normal docstring.")},
3235 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
3236 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
3237 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01003238 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003239 {"getargs_tuple", getargs_tuple, METH_VARARGS},
3240 {"getargs_keywords", (PyCFunction)getargs_keywords,
3241 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00003242 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
3243 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003244 {"getargs_b", getargs_b, METH_VARARGS},
3245 {"getargs_B", getargs_B, METH_VARARGS},
3246 {"getargs_h", getargs_h, METH_VARARGS},
3247 {"getargs_H", getargs_H, METH_VARARGS},
3248 {"getargs_I", getargs_I, METH_VARARGS},
3249 {"getargs_k", getargs_k, METH_VARARGS},
3250 {"getargs_i", getargs_i, METH_VARARGS},
3251 {"getargs_l", getargs_l, METH_VARARGS},
3252 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07003253 {"getargs_p", getargs_p, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00003254#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003255 {"getargs_L", getargs_L, METH_VARARGS},
3256 {"getargs_K", getargs_K, METH_VARARGS},
3257 {"test_longlong_api", test_longlong_api, METH_NOARGS},
3258 {"test_long_long_and_overflow",
3259 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
3260 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003261#endif
Eli Bendersky906b88f2011-07-29 07:05:08 +03003262 {"getargs_c", getargs_c, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003263 {"getargs_s", getargs_s, METH_VARARGS},
3264 {"getargs_s_star", getargs_s_star, METH_VARARGS},
3265 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
3266 {"getargs_z", getargs_z, METH_VARARGS},
3267 {"getargs_z_star", getargs_z_star, METH_VARARGS},
3268 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
3269 {"getargs_y", getargs_y, METH_VARARGS},
3270 {"getargs_y_star", getargs_y_star, METH_VARARGS},
3271 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
3272 {"getargs_u", getargs_u, METH_VARARGS},
3273 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
3274 {"getargs_Z", getargs_Z, METH_VARARGS},
3275 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00003276 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003277 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003278 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003279 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003280 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003281 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
3282 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
3283 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
3284 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01003285 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
3286 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
3287 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
3288 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01003289 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003290#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00003291 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003293#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00003294#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00003295 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00003296#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00003297 {"traceback_print", traceback_print, METH_VARARGS},
3298 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02003299 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00003300 {"argparsing", argparsing, METH_VARARGS},
3301 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
3303 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003304 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
3305 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003306 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003307 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01003308 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
3309 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01003310 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02003311 {"with_tp_del", with_tp_del, METH_VARARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02003312 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02003313 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
3314 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02003315 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
3316 {"test_pymem_setallocators",
3317 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
3318 {"test_pyobject_setallocators",
3319 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003320 {"no_docstring",
3321 (PyCFunction)test_with_docstring, METH_NOARGS},
3322 {"docstring_empty",
3323 (PyCFunction)test_with_docstring, METH_NOARGS,
3324 docstring_empty},
3325 {"docstring_no_signature",
3326 (PyCFunction)test_with_docstring, METH_NOARGS,
3327 docstring_no_signature},
3328 {"docstring_with_invalid_signature",
3329 (PyCFunction)test_with_docstring, METH_NOARGS,
3330 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08003331 {"docstring_with_invalid_signature2",
3332 (PyCFunction)test_with_docstring, METH_NOARGS,
3333 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003334 {"docstring_with_signature",
3335 (PyCFunction)test_with_docstring, METH_NOARGS,
3336 docstring_with_signature},
3337 {"docstring_with_signature_and_extra_newlines",
3338 (PyCFunction)test_with_docstring, METH_NOARGS,
3339 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08003340 {"docstring_with_signature_with_defaults",
3341 (PyCFunction)test_with_docstring, METH_NOARGS,
3342 docstring_with_signature_with_defaults},
Victor Stinner258e4d32013-12-13 02:30:12 +01003343#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003344 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
3345 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01003346#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02003347 {"pymarshal_write_long_to_file",
3348 pymarshal_write_long_to_file, METH_VARARGS},
3349 {"pymarshal_write_object_to_file",
3350 pymarshal_write_object_to_file, METH_VARARGS},
3351 {"pymarshal_read_short_from_file",
3352 pymarshal_read_short_from_file, METH_VARARGS},
3353 {"pymarshal_read_long_from_file",
3354 pymarshal_read_long_from_file, METH_VARARGS},
3355 {"pymarshal_read_last_object_from_file",
3356 pymarshal_read_last_object_from_file, METH_VARARGS},
3357 {"pymarshal_read_object_from_file",
3358 pymarshal_read_object_from_file, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00003360};
3361
Thomas Hellera4ea6032003-04-17 18:55:45 +00003362#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
3363
Thomas Wouters89f507f2006-12-13 04:49:30 +00003364typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003365 char bool_member;
3366 char byte_member;
3367 unsigned char ubyte_member;
3368 short short_member;
3369 unsigned short ushort_member;
3370 int int_member;
3371 unsigned int uint_member;
3372 long long_member;
3373 unsigned long ulong_member;
3374 Py_ssize_t pyssizet_member;
3375 float float_member;
3376 double double_member;
3377 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003378#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 PY_LONG_LONG longlong_member;
3380 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003381#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003382} all_structmembers;
3383
3384typedef struct {
3385 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003386 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003387} test_structmembers;
3388
3389static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003390 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
3391 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
3392 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
3393 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
3394 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
3395 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
3396 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
3397 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
3398 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
3399 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
3400 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
3401 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
3402 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003403#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
3405 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003406#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003407 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00003408};
3409
3410
Christian Heimes1af737c2008-01-23 08:24:23 +00003411static PyObject *
3412test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
3413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003414 static char *keywords[] = {
3415 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
3416 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
3417 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00003418#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00003420#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003421 NULL};
3422 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00003423#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00003425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426 ;
3427 test_structmembers *ob;
3428 const char *s = NULL;
3429 Py_ssize_t string_len = 0;
3430 ob = PyObject_New(test_structmembers, type);
3431 if (ob == NULL)
3432 return NULL;
3433 memset(&ob->structmembers, 0, sizeof(all_structmembers));
3434 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
3435 &ob->structmembers.bool_member,
3436 &ob->structmembers.byte_member,
3437 &ob->structmembers.ubyte_member,
3438 &ob->structmembers.short_member,
3439 &ob->structmembers.ushort_member,
3440 &ob->structmembers.int_member,
3441 &ob->structmembers.uint_member,
3442 &ob->structmembers.long_member,
3443 &ob->structmembers.ulong_member,
3444 &ob->structmembers.pyssizet_member,
3445 &ob->structmembers.float_member,
3446 &ob->structmembers.double_member,
3447 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00003448#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 , &ob->structmembers.longlong_member,
3450 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00003451#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003452 )) {
3453 Py_DECREF(ob);
3454 return NULL;
3455 }
3456 if (s != NULL) {
3457 if (string_len > 5) {
3458 Py_DECREF(ob);
3459 PyErr_SetString(PyExc_ValueError, "string too long");
3460 return NULL;
3461 }
3462 strcpy(ob->structmembers.inplace_member, s);
3463 }
3464 else {
3465 strcpy(ob->structmembers.inplace_member, "");
3466 }
3467 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003468}
3469
Christian Heimes1af737c2008-01-23 08:24:23 +00003470static void
3471test_structmembers_free(PyObject *ob)
3472{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003473 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003474}
3475
3476static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003477 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003478 "test_structmembersType",
3479 sizeof(test_structmembers), /* tp_basicsize */
3480 0, /* tp_itemsize */
3481 test_structmembers_free, /* destructor tp_dealloc */
3482 0, /* tp_print */
3483 0, /* tp_getattr */
3484 0, /* tp_setattr */
3485 0, /* tp_reserved */
3486 0, /* tp_repr */
3487 0, /* tp_as_number */
3488 0, /* tp_as_sequence */
3489 0, /* tp_as_mapping */
3490 0, /* tp_hash */
3491 0, /* tp_call */
3492 0, /* tp_str */
3493 PyObject_GenericGetAttr, /* tp_getattro */
3494 PyObject_GenericSetAttr, /* tp_setattro */
3495 0, /* tp_as_buffer */
3496 0, /* tp_flags */
3497 "Type containing all structmember types",
3498 0, /* traverseproc tp_traverse */
3499 0, /* tp_clear */
3500 0, /* tp_richcompare */
3501 0, /* tp_weaklistoffset */
3502 0, /* tp_iter */
3503 0, /* tp_iternext */
3504 0, /* tp_methods */
3505 test_members, /* tp_members */
3506 0,
3507 0,
3508 0,
3509 0,
3510 0,
3511 0,
3512 0,
3513 0,
3514 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003515};
3516
3517
Martin v. Löwis1a214512008-06-11 05:26:20 +00003518
3519static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003520 PyModuleDef_HEAD_INIT,
3521 "_testcapi",
3522 NULL,
3523 -1,
3524 TestMethods,
3525 NULL,
3526 NULL,
3527 NULL,
3528 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003529};
3530
Mark Hammond62b1ab12002-07-23 06:31:15 +00003531PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003532PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00003533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003534 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003536 m = PyModule_Create(&_testcapimodule);
3537 if (m == NULL)
3538 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003540 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00003541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003542 Py_TYPE(&test_structmembersType)=&PyType_Type;
3543 Py_INCREF(&test_structmembersType);
3544 /* don't use a name starting with "test", since we don't want
3545 test_capi to automatically call this */
3546 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003548 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
3549 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
3550 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
3551 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
3552 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
3553 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
3554 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
3555 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
3556 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
3557 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
3558 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
3559 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
3560 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
3561 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
3562 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
3563 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
3564 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
3565 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
3566 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
3567 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
3568 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
3569 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
3570 Py_INCREF(&PyInstanceMethod_Type);
3571 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00003572
Larry Hastings2a727912014-01-16 11:32:01 -08003573 PyModule_AddIntConstant(m, "the_number_three", 3);
3574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003575 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
3576 Py_INCREF(TestError);
3577 PyModule_AddObject(m, "error", TestError);
3578 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003579}