blob: 245d4f63168838970030e1d90282fbd358d7b091 [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"
Victor Stinner56e8c292014-07-21 12:30:22 +020014#include <signal.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;
1519 buffer = PyMem_Malloc(buflen * sizeof(wchar_t));
1520 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}};
Victor Stinner706768c2014-08-16 01:03:39 +02001722 size_t 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}
2471
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002472/* Test that the fatal error from not having a current thread doesn't
2473 cause an infinite loop. Run via Lib/test/test_capi.py */
2474static PyObject *
2475crash_no_current_thread(PyObject *self)
2476{
2477 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002478 /* Using PyThreadState_Get() directly allows the test to pass in
2479 !pydebug mode. However, the test only actually tests anything
2480 in pydebug mode, since that's where the infinite loop was in
2481 the first place. */
2482 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002483 Py_END_ALLOW_THREADS
2484 return NULL;
2485}
2486
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002487/* To run some code in a sub-interpreter. */
2488static PyObject *
2489run_in_subinterp(PyObject *self, PyObject *args)
2490{
2491 const char *code;
2492 int r;
2493 PyThreadState *substate, *mainstate;
2494
2495 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2496 &code))
2497 return NULL;
2498
2499 mainstate = PyThreadState_Get();
2500
2501 PyThreadState_Swap(NULL);
2502
2503 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002504 if (substate == NULL) {
2505 /* Since no new thread state was created, there is no exception to
2506 propagate; raise a fresh one after swapping in the old thread
2507 state. */
2508 PyThreadState_Swap(mainstate);
2509 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2510 return NULL;
2511 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002512 r = PyRun_SimpleString(code);
2513 Py_EndInterpreter(substate);
2514
2515 PyThreadState_Swap(mainstate);
2516
2517 return PyLong_FromLong(r);
2518}
2519
Victor Stinner3c1b3792014-02-17 00:02:43 +01002520static int
2521check_time_rounding(int round)
2522{
2523 if (round != _PyTime_ROUND_DOWN && round != _PyTime_ROUND_UP) {
2524 PyErr_SetString(PyExc_ValueError, "invalid rounding");
2525 return -1;
2526 }
2527 return 0;
2528}
2529
Victor Stinner5d272cc2012-03-13 13:35:55 +01002530static PyObject *
2531test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2532{
2533 PyObject *obj;
2534 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002535 int round;
2536 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002537 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002538 if (check_time_rounding(round) < 0)
2539 return NULL;
2540 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002541 return NULL;
2542 return _PyLong_FromTime_t(sec);
2543}
2544
2545static PyObject *
2546test_pytime_object_to_timeval(PyObject *self, PyObject *args)
2547{
2548 PyObject *obj;
2549 time_t sec;
2550 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002551 int round;
2552 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002553 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002554 if (check_time_rounding(round) < 0)
2555 return NULL;
2556 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002557 return NULL;
2558 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
2559}
2560
Victor Stinner643cd682012-03-02 22:54:03 +01002561static PyObject *
2562test_pytime_object_to_timespec(PyObject *self, PyObject *args)
2563{
2564 PyObject *obj;
2565 time_t sec;
2566 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002567 int round;
2568 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01002569 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002570 if (check_time_rounding(round) < 0)
2571 return NULL;
2572 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01002573 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01002574 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01002575}
2576
Antoine Pitrou796564c2013-07-30 19:59:21 +02002577static void
2578slot_tp_del(PyObject *self)
2579{
2580 _Py_IDENTIFIER(__tp_del__);
2581 PyObject *del, *res;
2582 PyObject *error_type, *error_value, *error_traceback;
2583
2584 /* Temporarily resurrect the object. */
2585 assert(self->ob_refcnt == 0);
2586 self->ob_refcnt = 1;
2587
2588 /* Save the current exception, if any. */
2589 PyErr_Fetch(&error_type, &error_value, &error_traceback);
2590
2591 /* Execute __del__ method, if any. */
2592 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
2593 if (del != NULL) {
2594 res = PyEval_CallObject(del, NULL);
2595 if (res == NULL)
2596 PyErr_WriteUnraisable(del);
2597 else
2598 Py_DECREF(res);
2599 Py_DECREF(del);
2600 }
2601
2602 /* Restore the saved exception. */
2603 PyErr_Restore(error_type, error_value, error_traceback);
2604
2605 /* Undo the temporary resurrection; can't use DECREF here, it would
2606 * cause a recursive call.
2607 */
2608 assert(self->ob_refcnt > 0);
2609 if (--self->ob_refcnt == 0)
2610 return; /* this is the normal path out */
2611
2612 /* __del__ resurrected it! Make it look like the original Py_DECREF
2613 * never happened.
2614 */
2615 {
2616 Py_ssize_t refcnt = self->ob_refcnt;
2617 _Py_NewReference(self);
2618 self->ob_refcnt = refcnt;
2619 }
2620 assert(!PyType_IS_GC(Py_TYPE(self)) ||
2621 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
2622 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
2623 * we need to undo that. */
2624 _Py_DEC_REFTOTAL;
2625 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
2626 * chain, so no more to do there.
2627 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
2628 * _Py_NewReference bumped tp_allocs: both of those need to be
2629 * undone.
2630 */
2631#ifdef COUNT_ALLOCS
2632 --Py_TYPE(self)->tp_frees;
2633 --Py_TYPE(self)->tp_allocs;
2634#endif
2635}
2636
2637static PyObject *
2638with_tp_del(PyObject *self, PyObject *args)
2639{
2640 PyObject *obj;
2641 PyTypeObject *tp;
2642
2643 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
2644 return NULL;
2645 tp = (PyTypeObject *) obj;
2646 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
2647 PyErr_Format(PyExc_TypeError,
2648 "heap type expected, got %R", obj);
2649 return NULL;
2650 }
2651 tp->tp_del = slot_tp_del;
2652 Py_INCREF(obj);
2653 return obj;
2654}
2655
Antoine Pitroub349e4c2014-08-06 19:31:40 -04002656static PyMethodDef ml;
2657
2658static PyObject *
2659create_cfunction(PyObject *self, PyObject *args)
2660{
2661 return PyCFunction_NewEx(&ml, self, NULL);
2662}
2663
2664static PyMethodDef ml = {
2665 "create_cfunction",
2666 create_cfunction,
2667 METH_NOARGS,
2668 NULL
2669};
2670
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07002671static PyObject *
2672_test_incref(PyObject *ob)
2673{
2674 Py_INCREF(ob);
2675 return ob;
2676}
2677
2678static PyObject *
2679test_xincref_doesnt_leak(PyObject *ob)
2680{
2681 PyObject *obj = PyLong_FromLong(0);
2682 Py_XINCREF(_test_incref(obj));
2683 Py_DECREF(obj);
2684 Py_DECREF(obj);
2685 Py_DECREF(obj);
2686 Py_RETURN_NONE;
2687}
2688
2689static PyObject *
2690test_incref_doesnt_leak(PyObject *ob)
2691{
2692 PyObject *obj = PyLong_FromLong(0);
2693 Py_INCREF(_test_incref(obj));
2694 Py_DECREF(obj);
2695 Py_DECREF(obj);
2696 Py_DECREF(obj);
2697 Py_RETURN_NONE;
2698}
2699
2700static PyObject *
2701test_xdecref_doesnt_leak(PyObject *ob)
2702{
2703 Py_XDECREF(PyLong_FromLong(0));
2704 Py_RETURN_NONE;
2705}
2706
2707static PyObject *
2708test_decref_doesnt_leak(PyObject *ob)
2709{
2710 Py_DECREF(PyLong_FromLong(0));
2711 Py_RETURN_NONE;
2712}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002713
Victor Stinner0507bf52013-07-07 02:05:46 +02002714static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02002715test_incref_decref_API(PyObject *ob)
2716{
2717 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02002718 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02002719 Py_DecRef(obj);
2720 Py_DecRef(obj);
2721 Py_RETURN_NONE;
2722}
2723
2724static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02002725test_pymem_alloc0(PyObject *self)
2726{
2727 void *ptr;
2728
Victor Stinnerdb067af2014-05-02 22:31:14 +02002729 ptr = PyMem_RawMalloc(0);
2730 if (ptr == NULL) {
2731 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
2732 return NULL;
2733 }
2734 PyMem_RawFree(ptr);
2735
2736 ptr = PyMem_RawCalloc(0, 0);
2737 if (ptr == NULL) {
2738 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
2739 return NULL;
2740 }
2741 PyMem_RawFree(ptr);
2742
Victor Stinner0507bf52013-07-07 02:05:46 +02002743 ptr = PyMem_Malloc(0);
2744 if (ptr == NULL) {
2745 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
2746 return NULL;
2747 }
2748 PyMem_Free(ptr);
2749
Victor Stinnerdb067af2014-05-02 22:31:14 +02002750 ptr = PyMem_Calloc(0, 0);
2751 if (ptr == NULL) {
2752 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
2753 return NULL;
2754 }
2755 PyMem_Free(ptr);
2756
Victor Stinner0507bf52013-07-07 02:05:46 +02002757 ptr = PyObject_Malloc(0);
2758 if (ptr == NULL) {
2759 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
2760 return NULL;
2761 }
2762 PyObject_Free(ptr);
2763
Victor Stinnerdb067af2014-05-02 22:31:14 +02002764 ptr = PyObject_Calloc(0, 0);
2765 if (ptr == NULL) {
2766 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
2767 return NULL;
2768 }
2769 PyObject_Free(ptr);
2770
Victor Stinner0507bf52013-07-07 02:05:46 +02002771 Py_RETURN_NONE;
2772}
2773
2774typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02002775 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02002776
2777 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02002778 size_t calloc_nelem;
2779 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02002780 void *realloc_ptr;
2781 size_t realloc_new_size;
2782 void *free_ptr;
2783} alloc_hook_t;
2784
2785static void* hook_malloc (void* ctx, size_t size)
2786{
2787 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2788 hook->malloc_size = size;
2789 return hook->alloc.malloc(hook->alloc.ctx, size);
2790}
2791
Victor Stinnerdb067af2014-05-02 22:31:14 +02002792static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
2793{
2794 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2795 hook->calloc_nelem = nelem;
2796 hook->calloc_elsize = elsize;
2797 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
2798}
2799
Victor Stinner0507bf52013-07-07 02:05:46 +02002800static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
2801{
2802 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2803 hook->realloc_ptr = ptr;
2804 hook->realloc_new_size = new_size;
2805 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
2806}
2807
2808static void hook_free (void *ctx, void *ptr)
2809{
2810 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2811 hook->free_ptr = ptr;
2812 hook->alloc.free(hook->alloc.ctx, ptr);
2813}
2814
2815static PyObject *
2816test_setallocators(PyMemAllocatorDomain domain)
2817{
2818 PyObject *res = NULL;
2819 const char *error_msg;
2820 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02002821 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02002822 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02002823 void *ptr, *ptr2;
2824
Victor Stinnerdb067af2014-05-02 22:31:14 +02002825 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02002826
2827 alloc.ctx = &hook;
2828 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02002829 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02002830 alloc.realloc = &hook_realloc;
2831 alloc.free = &hook_free;
2832 PyMem_GetAllocator(domain, &hook.alloc);
2833 PyMem_SetAllocator(domain, &alloc);
2834
2835 size = 42;
2836 switch(domain)
2837 {
2838 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
2839 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
2840 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
2841 default: ptr = NULL; break;
2842 }
2843
2844 if (ptr == NULL) {
2845 error_msg = "malloc failed";
2846 goto fail;
2847 }
2848
2849 if (hook.malloc_size != size) {
2850 error_msg = "malloc invalid size";
2851 goto fail;
2852 }
2853
2854 size2 = 200;
2855 switch(domain)
2856 {
2857 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
2858 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
2859 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02002860 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02002861 }
2862
2863 if (ptr2 == NULL) {
2864 error_msg = "realloc failed";
2865 goto fail;
2866 }
2867
2868 if (hook.realloc_ptr != ptr
2869 || hook.realloc_new_size != size2) {
2870 error_msg = "realloc invalid parameters";
2871 goto fail;
2872 }
2873
2874 switch(domain)
2875 {
2876 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
2877 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
2878 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
2879 }
2880
2881 if (hook.free_ptr != ptr2) {
2882 error_msg = "free invalid pointer";
2883 goto fail;
2884 }
2885
Victor Stinnerdb067af2014-05-02 22:31:14 +02002886 nelem = 2;
2887 elsize = 5;
2888 switch(domain)
2889 {
2890 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
2891 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
2892 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
2893 default: ptr = NULL; break;
2894 }
2895
2896 if (ptr == NULL) {
2897 error_msg = "calloc failed";
2898 goto fail;
2899 }
2900
2901 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
2902 error_msg = "calloc invalid nelem or elsize";
2903 goto fail;
2904 }
2905
2906 switch(domain)
2907 {
2908 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
2909 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
2910 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
2911 }
2912
Victor Stinner0507bf52013-07-07 02:05:46 +02002913 Py_INCREF(Py_None);
2914 res = Py_None;
2915 goto finally;
2916
2917fail:
2918 PyErr_SetString(PyExc_RuntimeError, error_msg);
2919
2920finally:
2921 PyMem_SetAllocator(domain, &hook.alloc);
2922 return res;
2923}
2924
2925static PyObject *
2926test_pymem_setrawallocators(PyObject *self)
2927{
2928 return test_setallocators(PYMEM_DOMAIN_RAW);
2929}
2930
2931static PyObject *
2932test_pymem_setallocators(PyObject *self)
2933{
2934 return test_setallocators(PYMEM_DOMAIN_MEM);
2935}
2936
2937static PyObject *
2938test_pyobject_setallocators(PyObject *self)
2939{
2940 return test_setallocators(PYMEM_DOMAIN_OBJ);
2941}
2942
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002943PyDoc_STRVAR(docstring_empty,
2944""
2945);
2946
2947PyDoc_STRVAR(docstring_no_signature,
2948"This docstring has no signature."
2949);
2950
2951PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002952"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002953"\n"
2954"This docstring has an invalid signature."
2955);
2956
Larry Hastings2623c8c2014-02-08 22:15:29 -08002957PyDoc_STRVAR(docstring_with_invalid_signature2,
2958"docstring_with_invalid_signature2($module, /, boo)\n"
2959"\n"
2960"--\n"
2961"\n"
2962"This docstring also has an invalid signature."
2963);
2964
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002965PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002966"docstring_with_signature($module, /, sig)\n"
2967"--\n"
2968"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002969"This docstring has a valid signature."
2970);
2971
2972PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002973"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
2974"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002975"\n"
2976"\n"
2977"This docstring has a valid signature and some extra newlines."
2978);
2979
Larry Hastings16c51912014-01-07 11:53:01 -08002980PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002981"docstring_with_signature_with_defaults(module, s='avocado',\n"
2982" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
2983" local=the_number_three, sys=sys.maxsize,\n"
2984" exp=sys.maxsize - 1)\n"
2985"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08002986"\n"
2987"\n"
2988"\n"
2989"This docstring has a valid signature with parameters,\n"
2990"and the parameters take defaults of varying types."
2991);
2992
Victor Stinner258e4d32013-12-13 02:30:12 +01002993#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01002994typedef struct {
2995 PyThread_type_lock start_event;
2996 PyThread_type_lock exit_event;
2997 PyObject *callback;
2998} test_c_thread_t;
2999
3000static void
3001temporary_c_thread(void *data)
3002{
3003 test_c_thread_t *test_c_thread = data;
3004 PyGILState_STATE state;
3005 PyObject *res;
3006
3007 PyThread_release_lock(test_c_thread->start_event);
3008
3009 /* Allocate a Python thread state for this thread */
3010 state = PyGILState_Ensure();
3011
3012 res = PyObject_CallFunction(test_c_thread->callback, "", NULL);
3013 Py_CLEAR(test_c_thread->callback);
3014
3015 if (res == NULL) {
3016 PyErr_Print();
3017 }
3018 else {
3019 Py_DECREF(res);
3020 }
3021
3022 /* Destroy the Python thread state for this thread */
3023 PyGILState_Release(state);
3024
3025 PyThread_release_lock(test_c_thread->exit_event);
3026
3027 PyThread_exit_thread();
3028}
3029
3030static PyObject *
3031call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3032{
3033 PyObject *res = NULL;
3034 test_c_thread_t test_c_thread;
3035 long thread;
3036
3037 PyEval_InitThreads();
3038
3039 test_c_thread.start_event = PyThread_allocate_lock();
3040 test_c_thread.exit_event = PyThread_allocate_lock();
3041 test_c_thread.callback = NULL;
3042 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3043 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3044 goto exit;
3045 }
3046
3047 Py_INCREF(callback);
3048 test_c_thread.callback = callback;
3049
3050 PyThread_acquire_lock(test_c_thread.start_event, 1);
3051 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3052
3053 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3054 if (thread == -1) {
3055 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3056 PyThread_release_lock(test_c_thread.start_event);
3057 PyThread_release_lock(test_c_thread.exit_event);
3058 goto exit;
3059 }
3060
3061 PyThread_acquire_lock(test_c_thread.start_event, 1);
3062 PyThread_release_lock(test_c_thread.start_event);
3063
3064 Py_BEGIN_ALLOW_THREADS
3065 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3066 PyThread_release_lock(test_c_thread.exit_event);
3067 Py_END_ALLOW_THREADS
3068
3069 Py_INCREF(Py_None);
3070 res = Py_None;
3071
3072exit:
3073 Py_CLEAR(test_c_thread.callback);
3074 if (test_c_thread.start_event)
3075 PyThread_free_lock(test_c_thread.start_event);
3076 if (test_c_thread.exit_event)
3077 PyThread_free_lock(test_c_thread.exit_event);
3078 return res;
3079}
Victor Stinner258e4d32013-12-13 02:30:12 +01003080#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003081
Victor Stinner56e8c292014-07-21 12:30:22 +02003082static PyObject*
3083test_raise_signal(PyObject* self, PyObject *args)
3084{
3085 int signum, err;
3086
3087 if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0)
3088 return NULL;
3089
3090 err = raise(signum);
3091 if (err)
3092 return PyErr_SetFromErrno(PyExc_OSError);
3093
3094 if (PyErr_CheckSignals() < 0)
3095 return NULL;
3096
3097 Py_RETURN_NONE;
3098}
3099
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003100
Tim Peters9ea17ac2001-02-02 05:57:15 +00003101static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003102 {"raise_exception", raise_exception, METH_VARARGS},
3103 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
3104 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01003105 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003106 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
3107 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
3108 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
3109 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003110 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003111 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
3112 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
3113 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
3114 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02003115 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
3117 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02003118 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
3119 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
3121 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
3122 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07003123 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003124 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
3125 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
3126 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
3127 PyDoc_STR("This is a pretty normal docstring.")},
3128 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
3129 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
3130 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
3131 {"getargs_tuple", getargs_tuple, METH_VARARGS},
3132 {"getargs_keywords", (PyCFunction)getargs_keywords,
3133 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00003134 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
3135 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003136 {"getargs_b", getargs_b, METH_VARARGS},
3137 {"getargs_B", getargs_B, METH_VARARGS},
3138 {"getargs_h", getargs_h, METH_VARARGS},
3139 {"getargs_H", getargs_H, METH_VARARGS},
3140 {"getargs_I", getargs_I, METH_VARARGS},
3141 {"getargs_k", getargs_k, METH_VARARGS},
3142 {"getargs_i", getargs_i, METH_VARARGS},
3143 {"getargs_l", getargs_l, METH_VARARGS},
3144 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07003145 {"getargs_p", getargs_p, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00003146#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 {"getargs_L", getargs_L, METH_VARARGS},
3148 {"getargs_K", getargs_K, METH_VARARGS},
3149 {"test_longlong_api", test_longlong_api, METH_NOARGS},
3150 {"test_long_long_and_overflow",
3151 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
3152 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003153#endif
Eli Bendersky906b88f2011-07-29 07:05:08 +03003154 {"getargs_c", getargs_c, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003155 {"getargs_s", getargs_s, METH_VARARGS},
3156 {"getargs_s_star", getargs_s_star, METH_VARARGS},
3157 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
3158 {"getargs_z", getargs_z, METH_VARARGS},
3159 {"getargs_z_star", getargs_z_star, METH_VARARGS},
3160 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
3161 {"getargs_y", getargs_y, METH_VARARGS},
3162 {"getargs_y_star", getargs_y_star, METH_VARARGS},
3163 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
3164 {"getargs_u", getargs_u, METH_VARARGS},
3165 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
3166 {"getargs_Z", getargs_Z, METH_VARARGS},
3167 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00003168 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003170 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003171 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003172 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003173 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
3174 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
3175 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
3176 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01003177 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
3178 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
3179 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
3180 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01003181 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003182#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00003183 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003185#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00003186#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00003187 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00003188#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00003189 {"traceback_print", traceback_print, METH_VARARGS},
3190 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02003191 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00003192 {"argparsing", argparsing, METH_VARARGS},
3193 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
3195 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003196 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
3197 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003198 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003199 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01003200 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
3201 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01003202 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02003203 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003204 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02003205 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02003206 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
3207 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02003208 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
3209 {"test_pymem_setallocators",
3210 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
3211 {"test_pyobject_setallocators",
3212 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003213 {"no_docstring",
3214 (PyCFunction)test_with_docstring, METH_NOARGS},
3215 {"docstring_empty",
3216 (PyCFunction)test_with_docstring, METH_NOARGS,
3217 docstring_empty},
3218 {"docstring_no_signature",
3219 (PyCFunction)test_with_docstring, METH_NOARGS,
3220 docstring_no_signature},
3221 {"docstring_with_invalid_signature",
3222 (PyCFunction)test_with_docstring, METH_NOARGS,
3223 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08003224 {"docstring_with_invalid_signature2",
3225 (PyCFunction)test_with_docstring, METH_NOARGS,
3226 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003227 {"docstring_with_signature",
3228 (PyCFunction)test_with_docstring, METH_NOARGS,
3229 docstring_with_signature},
3230 {"docstring_with_signature_and_extra_newlines",
3231 (PyCFunction)test_with_docstring, METH_NOARGS,
3232 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08003233 {"docstring_with_signature_with_defaults",
3234 (PyCFunction)test_with_docstring, METH_NOARGS,
3235 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02003236 {"raise_signal",
3237 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01003238#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003239 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
3240 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01003241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00003243};
3244
Thomas Hellera4ea6032003-04-17 18:55:45 +00003245#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
3246
Thomas Wouters89f507f2006-12-13 04:49:30 +00003247typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003248 char bool_member;
3249 char byte_member;
3250 unsigned char ubyte_member;
3251 short short_member;
3252 unsigned short ushort_member;
3253 int int_member;
3254 unsigned int uint_member;
3255 long long_member;
3256 unsigned long ulong_member;
3257 Py_ssize_t pyssizet_member;
3258 float float_member;
3259 double double_member;
3260 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003261#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 PY_LONG_LONG longlong_member;
3263 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003264#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003265} all_structmembers;
3266
3267typedef struct {
3268 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003269 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003270} test_structmembers;
3271
3272static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003273 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
3274 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
3275 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
3276 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
3277 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
3278 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
3279 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
3280 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
3281 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
3282 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
3283 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
3284 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
3285 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003286#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
3288 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003290 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00003291};
3292
3293
Christian Heimes1af737c2008-01-23 08:24:23 +00003294static PyObject *
3295test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
3296{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003297 static char *keywords[] = {
3298 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
3299 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
3300 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00003301#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00003303#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 NULL};
3305 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00003306#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003307 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00003308#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 ;
3310 test_structmembers *ob;
3311 const char *s = NULL;
3312 Py_ssize_t string_len = 0;
3313 ob = PyObject_New(test_structmembers, type);
3314 if (ob == NULL)
3315 return NULL;
3316 memset(&ob->structmembers, 0, sizeof(all_structmembers));
3317 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
3318 &ob->structmembers.bool_member,
3319 &ob->structmembers.byte_member,
3320 &ob->structmembers.ubyte_member,
3321 &ob->structmembers.short_member,
3322 &ob->structmembers.ushort_member,
3323 &ob->structmembers.int_member,
3324 &ob->structmembers.uint_member,
3325 &ob->structmembers.long_member,
3326 &ob->structmembers.ulong_member,
3327 &ob->structmembers.pyssizet_member,
3328 &ob->structmembers.float_member,
3329 &ob->structmembers.double_member,
3330 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00003331#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 , &ob->structmembers.longlong_member,
3333 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00003334#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003335 )) {
3336 Py_DECREF(ob);
3337 return NULL;
3338 }
3339 if (s != NULL) {
3340 if (string_len > 5) {
3341 Py_DECREF(ob);
3342 PyErr_SetString(PyExc_ValueError, "string too long");
3343 return NULL;
3344 }
3345 strcpy(ob->structmembers.inplace_member, s);
3346 }
3347 else {
3348 strcpy(ob->structmembers.inplace_member, "");
3349 }
3350 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003351}
3352
Christian Heimes1af737c2008-01-23 08:24:23 +00003353static void
3354test_structmembers_free(PyObject *ob)
3355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003357}
3358
3359static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003360 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 "test_structmembersType",
3362 sizeof(test_structmembers), /* tp_basicsize */
3363 0, /* tp_itemsize */
3364 test_structmembers_free, /* destructor tp_dealloc */
3365 0, /* tp_print */
3366 0, /* tp_getattr */
3367 0, /* tp_setattr */
3368 0, /* tp_reserved */
3369 0, /* tp_repr */
3370 0, /* tp_as_number */
3371 0, /* tp_as_sequence */
3372 0, /* tp_as_mapping */
3373 0, /* tp_hash */
3374 0, /* tp_call */
3375 0, /* tp_str */
3376 PyObject_GenericGetAttr, /* tp_getattro */
3377 PyObject_GenericSetAttr, /* tp_setattro */
3378 0, /* tp_as_buffer */
3379 0, /* tp_flags */
3380 "Type containing all structmember types",
3381 0, /* traverseproc tp_traverse */
3382 0, /* tp_clear */
3383 0, /* tp_richcompare */
3384 0, /* tp_weaklistoffset */
3385 0, /* tp_iter */
3386 0, /* tp_iternext */
3387 0, /* tp_methods */
3388 test_members, /* tp_members */
3389 0,
3390 0,
3391 0,
3392 0,
3393 0,
3394 0,
3395 0,
3396 0,
3397 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003398};
3399
3400
Benjamin Petersond51374e2014-04-09 23:55:56 -04003401typedef struct {
3402 PyObject_HEAD
3403} matmulObject;
3404
3405static PyObject *
3406matmulType_matmul(PyObject *self, PyObject *other)
3407{
3408 return Py_BuildValue("(sOO)", "matmul", self, other);
3409}
3410
3411static PyObject *
3412matmulType_imatmul(PyObject *self, PyObject *other)
3413{
3414 return Py_BuildValue("(sOO)", "imatmul", self, other);
3415}
3416
3417static void
3418matmulType_dealloc(PyObject *self)
3419{
Zachary Ware420dc562014-04-23 13:51:27 -05003420 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04003421}
3422
3423static PyNumberMethods matmulType_as_number = {
3424 0, /* nb_add */
3425 0, /* nb_subtract */
3426 0, /* nb_multiply */
3427 0, /* nb_remainde r*/
3428 0, /* nb_divmod */
3429 0, /* nb_power */
3430 0, /* nb_negative */
3431 0, /* tp_positive */
3432 0, /* tp_absolute */
3433 0, /* tp_bool */
3434 0, /* nb_invert */
3435 0, /* nb_lshift */
3436 0, /* nb_rshift */
3437 0, /* nb_and */
3438 0, /* nb_xor */
3439 0, /* nb_or */
3440 0, /* nb_int */
3441 0, /* nb_reserved */
3442 0, /* nb_float */
3443 0, /* nb_inplace_add */
3444 0, /* nb_inplace_subtract */
3445 0, /* nb_inplace_multiply */
3446 0, /* nb_inplace_remainder */
3447 0, /* nb_inplace_power */
3448 0, /* nb_inplace_lshift */
3449 0, /* nb_inplace_rshift */
3450 0, /* nb_inplace_and */
3451 0, /* nb_inplace_xor */
3452 0, /* nb_inplace_or */
3453 0, /* nb_floor_divide */
3454 0, /* nb_true_divide */
3455 0, /* nb_inplace_floor_divide */
3456 0, /* nb_inplace_true_divide */
3457 0, /* nb_index */
3458 matmulType_matmul, /* nb_matrix_multiply */
3459 matmulType_imatmul /* nb_matrix_inplace_multiply */
3460};
3461
3462static PyTypeObject matmulType = {
3463 PyVarObject_HEAD_INIT(NULL, 0)
3464 "matmulType",
3465 sizeof(matmulObject), /* tp_basicsize */
3466 0, /* tp_itemsize */
3467 matmulType_dealloc, /* destructor tp_dealloc */
3468 0, /* tp_print */
3469 0, /* tp_getattr */
3470 0, /* tp_setattr */
3471 0, /* tp_reserved */
3472 0, /* tp_repr */
3473 &matmulType_as_number, /* tp_as_number */
3474 0, /* tp_as_sequence */
3475 0, /* tp_as_mapping */
3476 0, /* tp_hash */
3477 0, /* tp_call */
3478 0, /* tp_str */
3479 PyObject_GenericGetAttr, /* tp_getattro */
3480 PyObject_GenericSetAttr, /* tp_setattro */
3481 0, /* tp_as_buffer */
3482 0, /* tp_flags */
3483 "C level type with matrix operations defined",
3484 0, /* traverseproc tp_traverse */
3485 0, /* tp_clear */
3486 0, /* tp_richcompare */
3487 0, /* tp_weaklistoffset */
3488 0, /* tp_iter */
3489 0, /* tp_iternext */
3490 0, /* tp_methods */
3491 0, /* tp_members */
3492 0,
3493 0,
3494 0,
3495 0,
3496 0,
3497 0,
3498 0,
3499 0,
3500 PyType_GenericNew, /* tp_new */
3501 PyObject_Del, /* tp_free */
3502};
3503
Martin v. Löwis1a214512008-06-11 05:26:20 +00003504
3505static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003506 PyModuleDef_HEAD_INIT,
3507 "_testcapi",
3508 NULL,
3509 -1,
3510 TestMethods,
3511 NULL,
3512 NULL,
3513 NULL,
3514 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003515};
3516
Mark Hammond62b1ab12002-07-23 06:31:15 +00003517PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003518PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00003519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003520 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003522 m = PyModule_Create(&_testcapimodule);
3523 if (m == NULL)
3524 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003526 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00003527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003528 Py_TYPE(&test_structmembersType)=&PyType_Type;
3529 Py_INCREF(&test_structmembersType);
3530 /* don't use a name starting with "test", since we don't want
3531 test_capi to automatically call this */
3532 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04003533 if (PyType_Ready(&matmulType) < 0)
3534 return NULL;
3535 Py_INCREF(&matmulType);
3536 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003538 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
3539 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
3540 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
3541 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
3542 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
3543 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
3544 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
3545 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
3546 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
3547 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
3548 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
3549 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
3550 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
3551 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
3552 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
3553 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
3554 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
3555 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
3556 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
3557 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
3558 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
3559 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
3560 Py_INCREF(&PyInstanceMethod_Type);
3561 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00003562
Larry Hastings2a727912014-01-16 11:32:01 -08003563 PyModule_AddIntConstant(m, "the_number_three", 3);
3564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003565 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
3566 Py_INCREF(TestError);
3567 PyModule_AddObject(m, "error", TestError);
3568 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003569}