blob: 750e90fa4cb7b024a29ec1e2424e61512f63c10d [file] [log] [blame]
Tim Peters9ea17ac2001-02-02 05:57:15 +00001/*
2 * C Extension module to test Python interpreter C APIs.
3 *
4 * The 'test_*' functions exported by this module are run as part of the
5 * standard Python regression test, via Lib/test/test_capi.py.
6 */
7
Neal Norwitz8866e0a2007-10-27 04:01:17 +00008#define PY_SSIZE_T_CLEAN
9
Tim Peters9ea17ac2001-02-02 05:57:15 +000010#include "Python.h"
Thomas Wouters89f507f2006-12-13 04:49:30 +000011#include <float.h>
12#include "structmember.h"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000013#include "datetime.h"
Tim Peters9ea17ac2001-02-02 05:57:15 +000014
Mark Hammond8d98d2c2003-04-19 15:41:53 +000015#ifdef WITH_THREAD
16#include "pythread.h"
17#endif /* WITH_THREAD */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000018static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000019
Tim Peters91621db2001-06-12 20:10:01 +000020/* Raise TestError with test_name + ": " + msg, and return NULL. */
21
22static PyObject *
23raiseTestError(const char* test_name, const char* msg)
24{
Victor Stinner6ced7c42011-03-21 18:15:42 +010025 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000026 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000027}
28
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000029/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000030
31 The ones derived from autoconf on the UNIX-like OSes can be relied
32 upon (in the absence of sloppy cross-compiling), but the Windows
33 platforms have these hardcoded. Better safe than sorry.
34*/
35static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000036sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000038{
Victor Stinner499dfcf2011-03-21 13:26:24 +010039 PyErr_Format(TestError,
40 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000041 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000043}
44
45static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000046test_config(PyObject *self)
Tim Peters9ea17ac2001-02-02 05:57:15 +000047{
Tim Peters9ea17ac2001-02-02 05:57:15 +000048#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 if (FATNAME != sizeof(TYPE)) \
50 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 CHECK_SIZEOF(SIZEOF_SHORT, short);
53 CHECK_SIZEOF(SIZEOF_INT, int);
54 CHECK_SIZEOF(SIZEOF_LONG, long);
55 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
56 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Tim Peters9ea17ac2001-02-02 05:57:15 +000057#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
Tim Peters9ea17ac2001-02-02 05:57:15 +000059#endif
60
61#undef CHECK_SIZEOF
62
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 Py_INCREF(Py_None);
64 return Py_None;
Tim Peters9ea17ac2001-02-02 05:57:15 +000065}
66
Tim Peters5c4d5bf2001-02-12 22:13:26 +000067static PyObject*
Victor Stinner01076552013-10-29 19:39:52 +010068test_sizeof_c_types(PyObject *self)
69{
Victor Stinnerf866f972013-10-29 19:59:31 +010070#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010071 if (EXPECTED != sizeof(TYPE)) { \
72 PyErr_Format(TestError, \
73 "sizeof(%s) = %u instead of %u", \
74 #TYPE, sizeof(TYPE), EXPECTED); \
75 return (PyObject*)NULL; \
76 }
Victor Stinnerf866f972013-10-29 19:59:31 +010077#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
78#define CHECK_SIGNNESS(TYPE, SIGNED) \
79 if (IS_SIGNED(TYPE) != SIGNED) { \
80 PyErr_Format(TestError, \
81 "%s signness is, instead of %i", \
82 #TYPE, IS_SIGNED(TYPE), SIGNED); \
83 return (PyObject*)NULL; \
84 }
Victor Stinner01076552013-10-29 19:39:52 +010085
86 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +010087 CHECK_SIZEOF(Py_UCS1, 1);
88 CHECK_SIZEOF(Py_UCS2, 2);
89 CHECK_SIZEOF(Py_UCS4, 4);
90 CHECK_SIGNNESS(Py_UCS1, 0);
91 CHECK_SIGNNESS(Py_UCS2, 0);
92 CHECK_SIGNNESS(Py_UCS4, 0);
Victor Stinner01076552013-10-29 19:39:52 +010093#ifdef HAVE_INT32_T
Victor Stinnerf866f972013-10-29 19:59:31 +010094 CHECK_SIZEOF(PY_INT32_T, 4);
95 CHECK_SIGNNESS(PY_INT32_T, 1);
Victor Stinner01076552013-10-29 19:39:52 +010096#endif
97#ifdef HAVE_UINT32_T
Victor Stinnerf866f972013-10-29 19:59:31 +010098 CHECK_SIZEOF(PY_UINT32_T, 4);
99 CHECK_SIGNNESS(PY_UINT32_T, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100100#endif
101#ifdef HAVE_INT64_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100102 CHECK_SIZEOF(PY_INT64_T, 8);
103 CHECK_SIGNNESS(PY_INT64_T, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100104#endif
105#ifdef HAVE_UINT64_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100106 CHECK_SIZEOF(PY_UINT64_T, 8);
107 CHECK_SIGNNESS(PY_UINT64_T, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100108#endif
109
110 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100111 CHECK_SIZEOF(size_t, sizeof(void *));
112 CHECK_SIGNNESS(size_t, 0);
113 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
114 CHECK_SIGNNESS(Py_ssize_t, 1);
115
116 CHECK_SIZEOF(Py_uintptr_t, sizeof(void *));
117 CHECK_SIGNNESS(Py_uintptr_t, 0);
118 CHECK_SIZEOF(Py_intptr_t, sizeof(void *));
119 CHECK_SIGNNESS(Py_intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100120
121 Py_INCREF(Py_None);
122 return Py_None;
123
Victor Stinnerf866f972013-10-29 19:59:31 +0100124#undef IS_SIGNED
125#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100126#undef CHECK_SIZEOF
127}
128
129
130static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000131test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000132{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000133 PyObject* list;
134 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000137#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 list = PyList_New(NLIST);
139 if (list == (PyObject*)NULL)
140 return (PyObject*)NULL;
141 /* list = range(NLIST) */
142 for (i = 0; i < NLIST; ++i) {
143 PyObject* anint = PyLong_FromLong(i);
144 if (anint == (PyObject*)NULL) {
145 Py_DECREF(list);
146 return (PyObject*)NULL;
147 }
148 PyList_SET_ITEM(list, i, anint);
149 }
150 /* list.reverse(), via PyList_Reverse() */
151 i = PyList_Reverse(list); /* should not blow up! */
152 if (i != 0) {
153 Py_DECREF(list);
154 return (PyObject*)NULL;
155 }
156 /* Check that list == range(29, -1, -1) now */
157 for (i = 0; i < NLIST; ++i) {
158 PyObject* anint = PyList_GET_ITEM(list, i);
159 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
160 PyErr_SetString(TestError,
161 "test_list_api: reverse screwed up");
162 Py_DECREF(list);
163 return (PyObject*)NULL;
164 }
165 }
166 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000167#undef NLIST
168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 Py_INCREF(Py_None);
170 return Py_None;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000171}
172
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000173static int
174test_dict_inner(int count)
175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 Py_ssize_t pos = 0, iterations = 0;
177 int i;
178 PyObject *dict = PyDict_New();
179 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 if (dict == NULL)
182 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 for (i = 0; i < count; i++) {
185 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200186 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200187 return -1;
188 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200189 if (PyDict_SetItem(dict, v, v) < 0) {
190 Py_DECREF(v);
191 return -1;
192 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193 Py_DECREF(v);
194 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000196 while (PyDict_Next(dict, &pos, &k, &v)) {
197 PyObject *o;
198 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 i = PyLong_AS_LONG(v) + 1;
201 o = PyLong_FromLong(i);
202 if (o == NULL)
203 return -1;
204 if (PyDict_SetItem(dict, k, o) < 0) {
205 Py_DECREF(o);
206 return -1;
207 }
208 Py_DECREF(o);
209 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 if (iterations != count) {
214 PyErr_SetString(
215 TestError,
216 "test_dict_iteration: dict iteration went wrong ");
217 return -1;
218 } else {
219 return 0;
220 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000221}
222
223static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000224test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 for (i = 0; i < 200; i++) {
229 if (test_dict_inner(i) < 0) {
230 return NULL;
231 }
232 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 Py_INCREF(Py_None);
235 return Py_None;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000236}
237
Tim Peters91621db2001-06-12 20:10:01 +0000238
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000239/* Issue #4701: Check that PyObject_Hash implicitly calls
240 * PyType_Ready if it hasn't already been called
241 */
242static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 PyVarObject_HEAD_INIT(NULL, 0)
244 "hashinheritancetester", /* Name of this type */
245 sizeof(PyObject), /* Basic object size */
246 0, /* Item size for varobject */
247 (destructor)PyObject_Del, /* tp_dealloc */
248 0, /* tp_print */
249 0, /* tp_getattr */
250 0, /* tp_setattr */
251 0, /* tp_reserved */
252 0, /* tp_repr */
253 0, /* tp_as_number */
254 0, /* tp_as_sequence */
255 0, /* tp_as_mapping */
256 0, /* tp_hash */
257 0, /* tp_call */
258 0, /* tp_str */
259 PyObject_GenericGetAttr, /* tp_getattro */
260 0, /* tp_setattro */
261 0, /* tp_as_buffer */
262 Py_TPFLAGS_DEFAULT, /* tp_flags */
263 0, /* tp_doc */
264 0, /* tp_traverse */
265 0, /* tp_clear */
266 0, /* tp_richcompare */
267 0, /* tp_weaklistoffset */
268 0, /* tp_iter */
269 0, /* tp_iternext */
270 0, /* tp_methods */
271 0, /* tp_members */
272 0, /* tp_getset */
273 0, /* tp_base */
274 0, /* tp_dict */
275 0, /* tp_descr_get */
276 0, /* tp_descr_set */
277 0, /* tp_dictoffset */
278 0, /* tp_init */
279 0, /* tp_alloc */
280 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000281};
282
283static PyObject*
284test_lazy_hash_inheritance(PyObject* self)
285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 PyTypeObject *type;
287 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000288 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 if (type->tp_dict != NULL)
293 /* The type has already been initialized. This probably means
294 -R is being used. */
295 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000296
297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 obj = PyObject_New(PyObject, type);
299 if (obj == NULL) {
300 PyErr_Clear();
301 PyErr_SetString(
302 TestError,
303 "test_lazy_hash_inheritance: failed to create object");
304 return NULL;
305 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 if (type->tp_dict != NULL) {
308 PyErr_SetString(
309 TestError,
310 "test_lazy_hash_inheritance: type initialised too soon");
311 Py_DECREF(obj);
312 return NULL;
313 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 hash = PyObject_Hash(obj);
316 if ((hash == -1) && PyErr_Occurred()) {
317 PyErr_Clear();
318 PyErr_SetString(
319 TestError,
320 "test_lazy_hash_inheritance: could not hash object");
321 Py_DECREF(obj);
322 return NULL;
323 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 if (type->tp_dict == NULL) {
326 PyErr_SetString(
327 TestError,
328 "test_lazy_hash_inheritance: type not initialised by hash()");
329 Py_DECREF(obj);
330 return NULL;
331 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 if (type->tp_hash != PyType_Type.tp_hash) {
334 PyErr_SetString(
335 TestError,
336 "test_lazy_hash_inheritance: unexpected hash function");
337 Py_DECREF(obj);
338 return NULL;
339 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000344}
345
346
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000347/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
Tim Petersff70d3c2001-06-14 01:11:03 +0000348 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000349
350 Note that the meat of the test is contained in testcapi_long.h.
351 This is revolting, but delicate code duplication is worse: "almost
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000352 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000353 dependence on type names makes it impossible to use a parameterized
354 function. A giant macro would be even worse than this. A C++ template
355 would be perfect.
356
357 The "report an error" functions are deliberately not part of the #include
358 file: if the test fails, you can set a breakpoint in the appropriate
359 error function directly, and crawl back from there in the debugger.
360*/
361
362#define UNBIND(X) Py_DECREF(X); (X) = NULL
363
364static PyObject *
365raise_test_long_error(const char* msg)
366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000368}
369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370#define TESTNAME test_long_api_inner
371#define TYPENAME long
372#define F_S_TO_PY PyLong_FromLong
373#define F_PY_TO_S PyLong_AsLong
374#define F_U_TO_PY PyLong_FromUnsignedLong
375#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000376
377#include "testcapi_long.h"
378
379static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000380test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000383}
384
385#undef TESTNAME
386#undef TYPENAME
387#undef F_S_TO_PY
388#undef F_PY_TO_S
389#undef F_U_TO_PY
390#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000391
392#ifdef HAVE_LONG_LONG
Tim Peters91621db2001-06-12 20:10:01 +0000393
394static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000395raise_test_longlong_error(const char* msg)
396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000398}
399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400#define TESTNAME test_longlong_api_inner
401#define TYPENAME PY_LONG_LONG
402#define F_S_TO_PY PyLong_FromLongLong
403#define F_PY_TO_S PyLong_AsLongLong
404#define F_U_TO_PY PyLong_FromUnsignedLongLong
405#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000406
407#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000408
409static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000410test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000411{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000413}
414
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000415#undef TESTNAME
416#undef TYPENAME
417#undef F_S_TO_PY
418#undef F_PY_TO_S
419#undef F_U_TO_PY
420#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000421
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000422/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
423 is tested by test_long_api_inner. This test will concentrate on proper
424 handling of overflow.
425*/
426
427static PyObject *
428test_long_and_overflow(PyObject *self)
429{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 PyObject *num, *one, *temp;
431 long value;
432 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 /* Test that overflow is set properly for a large value. */
435 /* num is a number larger than LONG_MAX even on 64-bit platforms */
436 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
437 if (num == NULL)
438 return NULL;
439 overflow = 1234;
440 value = PyLong_AsLongAndOverflow(num, &overflow);
441 Py_DECREF(num);
442 if (value == -1 && PyErr_Occurred())
443 return NULL;
444 if (value != -1)
445 return raiseTestError("test_long_and_overflow",
446 "return value was not set to -1");
447 if (overflow != 1)
448 return raiseTestError("test_long_and_overflow",
449 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 /* Same again, with num = LONG_MAX + 1 */
452 num = PyLong_FromLong(LONG_MAX);
453 if (num == NULL)
454 return NULL;
455 one = PyLong_FromLong(1L);
456 if (one == NULL) {
457 Py_DECREF(num);
458 return NULL;
459 }
460 temp = PyNumber_Add(num, one);
461 Py_DECREF(one);
462 Py_DECREF(num);
463 num = temp;
464 if (num == NULL)
465 return NULL;
466 overflow = 0;
467 value = PyLong_AsLongAndOverflow(num, &overflow);
468 Py_DECREF(num);
469 if (value == -1 && PyErr_Occurred())
470 return NULL;
471 if (value != -1)
472 return raiseTestError("test_long_and_overflow",
473 "return value was not set to -1");
474 if (overflow != 1)
475 return raiseTestError("test_long_and_overflow",
476 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 /* Test that overflow is set properly for a large negative value. */
479 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
480 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
481 if (num == NULL)
482 return NULL;
483 overflow = 1234;
484 value = PyLong_AsLongAndOverflow(num, &overflow);
485 Py_DECREF(num);
486 if (value == -1 && PyErr_Occurred())
487 return NULL;
488 if (value != -1)
489 return raiseTestError("test_long_and_overflow",
490 "return value was not set to -1");
491 if (overflow != -1)
492 return raiseTestError("test_long_and_overflow",
493 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 /* Same again, with num = LONG_MIN - 1 */
496 num = PyLong_FromLong(LONG_MIN);
497 if (num == NULL)
498 return NULL;
499 one = PyLong_FromLong(1L);
500 if (one == NULL) {
501 Py_DECREF(num);
502 return NULL;
503 }
504 temp = PyNumber_Subtract(num, one);
505 Py_DECREF(one);
506 Py_DECREF(num);
507 num = temp;
508 if (num == NULL)
509 return NULL;
510 overflow = 0;
511 value = PyLong_AsLongAndOverflow(num, &overflow);
512 Py_DECREF(num);
513 if (value == -1 && PyErr_Occurred())
514 return NULL;
515 if (value != -1)
516 return raiseTestError("test_long_and_overflow",
517 "return value was not set to -1");
518 if (overflow != -1)
519 return raiseTestError("test_long_and_overflow",
520 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 /* Test that overflow is cleared properly for small values. */
523 num = PyLong_FromString("FF", NULL, 16);
524 if (num == NULL)
525 return NULL;
526 overflow = 1234;
527 value = PyLong_AsLongAndOverflow(num, &overflow);
528 Py_DECREF(num);
529 if (value == -1 && PyErr_Occurred())
530 return NULL;
531 if (value != 0xFF)
532 return raiseTestError("test_long_and_overflow",
533 "expected return value 0xFF");
534 if (overflow != 0)
535 return raiseTestError("test_long_and_overflow",
536 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 num = PyLong_FromString("-FF", NULL, 16);
539 if (num == NULL)
540 return NULL;
541 overflow = 0;
542 value = PyLong_AsLongAndOverflow(num, &overflow);
543 Py_DECREF(num);
544 if (value == -1 && PyErr_Occurred())
545 return NULL;
546 if (value != -0xFF)
547 return raiseTestError("test_long_and_overflow",
548 "expected return value 0xFF");
549 if (overflow != 0)
550 return raiseTestError("test_long_and_overflow",
551 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 num = PyLong_FromLong(LONG_MAX);
554 if (num == NULL)
555 return NULL;
556 overflow = 1234;
557 value = PyLong_AsLongAndOverflow(num, &overflow);
558 Py_DECREF(num);
559 if (value == -1 && PyErr_Occurred())
560 return NULL;
561 if (value != LONG_MAX)
562 return raiseTestError("test_long_and_overflow",
563 "expected return value LONG_MAX");
564 if (overflow != 0)
565 return raiseTestError("test_long_and_overflow",
566 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 num = PyLong_FromLong(LONG_MIN);
569 if (num == NULL)
570 return NULL;
571 overflow = 0;
572 value = PyLong_AsLongAndOverflow(num, &overflow);
573 Py_DECREF(num);
574 if (value == -1 && PyErr_Occurred())
575 return NULL;
576 if (value != LONG_MIN)
577 return raiseTestError("test_long_and_overflow",
578 "expected return value LONG_MIN");
579 if (overflow != 0)
580 return raiseTestError("test_long_and_overflow",
581 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 Py_INCREF(Py_None);
584 return Py_None;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000585}
586
Mark Dickinson93f562c2010-01-30 10:30:15 +0000587/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
588 PY_LONG_LONG is tested by test_long_api_inner. This test will
589 concentrate on proper handling of overflow.
590*/
591
592static PyObject *
593test_long_long_and_overflow(PyObject *self)
594{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 PyObject *num, *one, *temp;
596 PY_LONG_LONG value;
597 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 /* Test that overflow is set properly for a large value. */
600 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
601 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
602 if (num == NULL)
603 return NULL;
604 overflow = 1234;
605 value = PyLong_AsLongLongAndOverflow(num, &overflow);
606 Py_DECREF(num);
607 if (value == -1 && PyErr_Occurred())
608 return NULL;
609 if (value != -1)
610 return raiseTestError("test_long_long_and_overflow",
611 "return value was not set to -1");
612 if (overflow != 1)
613 return raiseTestError("test_long_long_and_overflow",
614 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 /* Same again, with num = PY_LLONG_MAX + 1 */
617 num = PyLong_FromLongLong(PY_LLONG_MAX);
618 if (num == NULL)
619 return NULL;
620 one = PyLong_FromLong(1L);
621 if (one == NULL) {
622 Py_DECREF(num);
623 return NULL;
624 }
625 temp = PyNumber_Add(num, one);
626 Py_DECREF(one);
627 Py_DECREF(num);
628 num = temp;
629 if (num == NULL)
630 return NULL;
631 overflow = 0;
632 value = PyLong_AsLongLongAndOverflow(num, &overflow);
633 Py_DECREF(num);
634 if (value == -1 && PyErr_Occurred())
635 return NULL;
636 if (value != -1)
637 return raiseTestError("test_long_long_and_overflow",
638 "return value was not set to -1");
639 if (overflow != 1)
640 return raiseTestError("test_long_long_and_overflow",
641 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 /* Test that overflow is set properly for a large negative value. */
644 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
645 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
646 if (num == NULL)
647 return NULL;
648 overflow = 1234;
649 value = PyLong_AsLongLongAndOverflow(num, &overflow);
650 Py_DECREF(num);
651 if (value == -1 && PyErr_Occurred())
652 return NULL;
653 if (value != -1)
654 return raiseTestError("test_long_long_and_overflow",
655 "return value was not set to -1");
656 if (overflow != -1)
657 return raiseTestError("test_long_long_and_overflow",
658 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 /* Same again, with num = PY_LLONG_MIN - 1 */
661 num = PyLong_FromLongLong(PY_LLONG_MIN);
662 if (num == NULL)
663 return NULL;
664 one = PyLong_FromLong(1L);
665 if (one == NULL) {
666 Py_DECREF(num);
667 return NULL;
668 }
669 temp = PyNumber_Subtract(num, one);
670 Py_DECREF(one);
671 Py_DECREF(num);
672 num = temp;
673 if (num == NULL)
674 return NULL;
675 overflow = 0;
676 value = PyLong_AsLongLongAndOverflow(num, &overflow);
677 Py_DECREF(num);
678 if (value == -1 && PyErr_Occurred())
679 return NULL;
680 if (value != -1)
681 return raiseTestError("test_long_long_and_overflow",
682 "return value was not set to -1");
683 if (overflow != -1)
684 return raiseTestError("test_long_long_and_overflow",
685 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 /* Test that overflow is cleared properly for small values. */
688 num = PyLong_FromString("FF", NULL, 16);
689 if (num == NULL)
690 return NULL;
691 overflow = 1234;
692 value = PyLong_AsLongLongAndOverflow(num, &overflow);
693 Py_DECREF(num);
694 if (value == -1 && PyErr_Occurred())
695 return NULL;
696 if (value != 0xFF)
697 return raiseTestError("test_long_long_and_overflow",
698 "expected return value 0xFF");
699 if (overflow != 0)
700 return raiseTestError("test_long_long_and_overflow",
701 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 num = PyLong_FromString("-FF", NULL, 16);
704 if (num == NULL)
705 return NULL;
706 overflow = 0;
707 value = PyLong_AsLongLongAndOverflow(num, &overflow);
708 Py_DECREF(num);
709 if (value == -1 && PyErr_Occurred())
710 return NULL;
711 if (value != -0xFF)
712 return raiseTestError("test_long_long_and_overflow",
713 "expected return value 0xFF");
714 if (overflow != 0)
715 return raiseTestError("test_long_long_and_overflow",
716 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 num = PyLong_FromLongLong(PY_LLONG_MAX);
719 if (num == NULL)
720 return NULL;
721 overflow = 1234;
722 value = PyLong_AsLongLongAndOverflow(num, &overflow);
723 Py_DECREF(num);
724 if (value == -1 && PyErr_Occurred())
725 return NULL;
726 if (value != PY_LLONG_MAX)
727 return raiseTestError("test_long_long_and_overflow",
728 "expected return value PY_LLONG_MAX");
729 if (overflow != 0)
730 return raiseTestError("test_long_long_and_overflow",
731 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 num = PyLong_FromLongLong(PY_LLONG_MIN);
734 if (num == NULL)
735 return NULL;
736 overflow = 0;
737 value = PyLong_AsLongLongAndOverflow(num, &overflow);
738 Py_DECREF(num);
739 if (value == -1 && PyErr_Occurred())
740 return NULL;
741 if (value != PY_LLONG_MIN)
742 return raiseTestError("test_long_long_and_overflow",
743 "expected return value PY_LLONG_MIN");
744 if (overflow != 0)
745 return raiseTestError("test_long_long_and_overflow",
746 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 Py_INCREF(Py_None);
749 return Py_None;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000750}
751
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200752/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
753 non-integer arguments are handled correctly. It should be extended to
754 test overflow handling.
755 */
756
757static PyObject *
758test_long_as_size_t(PyObject *self)
759{
760 size_t out_u;
761 Py_ssize_t out_s;
762
763 Py_INCREF(Py_None);
764
765 out_u = PyLong_AsSize_t(Py_None);
766 if (out_u != (size_t)-1 || !PyErr_Occurred())
767 return raiseTestError("test_long_as_size_t",
768 "PyLong_AsSize_t(None) didn't complain");
769 if (!PyErr_ExceptionMatches(PyExc_TypeError))
770 return raiseTestError("test_long_as_size_t",
771 "PyLong_AsSize_t(None) raised "
772 "something other than TypeError");
773 PyErr_Clear();
774
775 out_s = PyLong_AsSsize_t(Py_None);
776 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
777 return raiseTestError("test_long_as_size_t",
778 "PyLong_AsSsize_t(None) didn't complain");
779 if (!PyErr_ExceptionMatches(PyExc_TypeError))
780 return raiseTestError("test_long_as_size_t",
781 "PyLong_AsSsize_t(None) raised "
782 "something other than TypeError");
783 PyErr_Clear();
784
785 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
786 return Py_None;
787}
788
789/* Test the PyLong_AsDouble API. At present this just tests that
790 non-integer arguments are handled correctly.
791 */
792
793static PyObject *
794test_long_as_double(PyObject *self)
795{
796 double out;
797
798 Py_INCREF(Py_None);
799
800 out = PyLong_AsDouble(Py_None);
801 if (out != -1.0 || !PyErr_Occurred())
802 return raiseTestError("test_long_as_double",
803 "PyLong_AsDouble(None) didn't complain");
804 if (!PyErr_ExceptionMatches(PyExc_TypeError))
805 return raiseTestError("test_long_as_double",
806 "PyLong_AsDouble(None) raised "
807 "something other than TypeError");
808 PyErr_Clear();
809
810 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
811 return Py_None;
812}
813
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000814/* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
Tim Petersd38b1c72001-09-30 05:09:37 +0000815 for both long and int arguments. The test may leak a little memory if
816 it fails.
817*/
818static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000819test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000820{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 PyObject *tuple, *num;
822 PY_LONG_LONG value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 tuple = PyTuple_New(1);
825 if (tuple == NULL)
826 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 num = PyLong_FromLong(42);
829 if (num == NULL)
830 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 value = -1;
835 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
836 return NULL;
837 if (value != 42)
838 return raiseTestError("test_L_code",
839 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 Py_DECREF(num);
842 num = PyLong_FromLong(42);
843 if (num == NULL)
844 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 value = -1;
849 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
850 return NULL;
851 if (value != 42)
852 return raiseTestError("test_L_code",
853 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 Py_DECREF(tuple);
856 Py_INCREF(Py_None);
857 return Py_None;
Tim Petersd38b1c72001-09-30 05:09:37 +0000858}
859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860#endif /* ifdef HAVE_LONG_LONG */
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000861
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000862/* Test tuple argument processing */
863static PyObject *
864getargs_tuple(PyObject *self, PyObject *args)
865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 int a, b, c;
867 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
868 return NULL;
869 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000870}
871
Christian Heimes380f7f22008-02-28 11:19:05 +0000872/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +0000873static PyObject *
874getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +0000875{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
877 static char *fmt="(ii)i|(i(ii))(iii)i";
878 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +0000879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
881 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
882 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
883 return NULL;
884 return Py_BuildValue("iiiiiiiiii",
885 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
886 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +0000887}
888
Larry Hastings83a9f482012-03-20 20:06:16 +0000889/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
890static PyObject *
891getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
892{
893 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
894 int required = -1;
895 int optional = -1;
896 int keyword_only = -1;
897
898 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
899 &required, &optional, &keyword_only))
900 return NULL;
901 return Py_BuildValue("iii", required, optional, keyword_only);
902}
903
Thomas Heller3457e4b2003-04-24 16:14:27 +0000904/* Functions to call PyArg_ParseTuple with integer format codes,
905 and return the result.
906*/
Thomas Hellera4ea6032003-04-17 18:55:45 +0000907static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000908getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 unsigned char value;
911 if (!PyArg_ParseTuple(args, "b", &value))
912 return NULL;
913 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000914}
915
Thomas Heller3457e4b2003-04-24 16:14:27 +0000916static PyObject *
917getargs_B(PyObject *self, PyObject *args)
918{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 unsigned char value;
920 if (!PyArg_ParseTuple(args, "B", &value))
921 return NULL;
922 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000923}
924
925static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +0000926getargs_h(PyObject *self, PyObject *args)
927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 short value;
929 if (!PyArg_ParseTuple(args, "h", &value))
930 return NULL;
931 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +0000932}
933
934static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000935getargs_H(PyObject *self, PyObject *args)
936{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 unsigned short value;
938 if (!PyArg_ParseTuple(args, "H", &value))
939 return NULL;
940 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000941}
942
943static PyObject *
944getargs_I(PyObject *self, PyObject *args)
945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 unsigned int value;
947 if (!PyArg_ParseTuple(args, "I", &value))
948 return NULL;
949 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000950}
951
952static PyObject *
953getargs_k(PyObject *self, PyObject *args)
954{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 unsigned long value;
956 if (!PyArg_ParseTuple(args, "k", &value))
957 return NULL;
958 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000959}
960
961static PyObject *
962getargs_i(PyObject *self, PyObject *args)
963{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 int value;
965 if (!PyArg_ParseTuple(args, "i", &value))
966 return NULL;
967 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000968}
969
Thomas Hellera4ea6032003-04-17 18:55:45 +0000970static PyObject *
971getargs_l(PyObject *self, PyObject *args)
972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 long value;
974 if (!PyArg_ParseTuple(args, "l", &value))
975 return NULL;
976 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000977}
978
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000979static PyObject *
980getargs_n(PyObject *self, PyObject *args)
981{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 Py_ssize_t value;
983 if (!PyArg_ParseTuple(args, "n", &value))
984 return NULL;
985 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000986}
987
Larry Hastingsfaf91e72012-05-05 16:54:29 -0700988static PyObject *
989getargs_p(PyObject *self, PyObject *args)
990{
991 int value;
992 if (!PyArg_ParseTuple(args, "p", &value))
993 return NULL;
994 return PyLong_FromLong(value);
995}
996
Thomas Hellera4ea6032003-04-17 18:55:45 +0000997#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +0000998static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000999getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 PY_LONG_LONG value;
1002 if (!PyArg_ParseTuple(args, "L", &value))
1003 return NULL;
1004 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001005}
1006
Thomas Hellera4ea6032003-04-17 18:55:45 +00001007static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001008getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001009{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 unsigned PY_LONG_LONG value;
1011 if (!PyArg_ParseTuple(args, "K", &value))
1012 return NULL;
1013 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001014}
1015#endif
1016
1017/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +00001018 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001019static PyObject *
1020test_k_code(PyObject *self)
1021{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 PyObject *tuple, *num;
1023 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 tuple = PyTuple_New(1);
1026 if (tuple == NULL)
1027 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 /* a number larger than ULONG_MAX even on 64-bit platforms */
1030 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1031 if (num == NULL)
1032 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 value = PyLong_AsUnsignedLongMask(num);
1035 if (value != ULONG_MAX)
1036 return raiseTestError("test_k_code",
1037 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 value = 0;
1042 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1043 return NULL;
1044 if (value != ULONG_MAX)
1045 return raiseTestError("test_k_code",
1046 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 Py_DECREF(num);
1049 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1050 if (num == NULL)
1051 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 value = PyLong_AsUnsignedLongMask(num);
1054 if (value != (unsigned long)-0x42)
1055 return raiseTestError("test_k_code",
1056 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 value = 0;
1061 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1062 return NULL;
1063 if (value != (unsigned long)-0x42)
1064 return raiseTestError("test_k_code",
1065 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 Py_DECREF(tuple);
1068 Py_INCREF(Py_None);
1069 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001070}
1071
Victor Stinner06e49dd2010-06-13 18:21:50 +00001072static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001073getargs_c(PyObject *self, PyObject *args)
1074{
1075 char c;
1076 if (!PyArg_ParseTuple(args, "c", &c))
1077 return NULL;
1078 return PyBytes_FromStringAndSize(&c, 1);
1079}
1080
1081static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001082getargs_s(PyObject *self, PyObject *args)
1083{
1084 char *str;
1085 if (!PyArg_ParseTuple(args, "s", &str))
1086 return NULL;
1087 return PyBytes_FromString(str);
1088}
1089
1090static PyObject *
1091getargs_s_star(PyObject *self, PyObject *args)
1092{
1093 Py_buffer buffer;
1094 PyObject *bytes;
1095 if (!PyArg_ParseTuple(args, "s*", &buffer))
1096 return NULL;
1097 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1098 PyBuffer_Release(&buffer);
1099 return bytes;
1100}
1101
1102static PyObject *
1103getargs_s_hash(PyObject *self, PyObject *args)
1104{
1105 char *str;
1106 Py_ssize_t size;
1107 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1108 return NULL;
1109 return PyBytes_FromStringAndSize(str, size);
1110}
1111
1112static PyObject *
1113getargs_z(PyObject *self, PyObject *args)
1114{
1115 char *str;
1116 if (!PyArg_ParseTuple(args, "z", &str))
1117 return NULL;
1118 if (str != NULL)
1119 return PyBytes_FromString(str);
1120 else
1121 Py_RETURN_NONE;
1122}
1123
1124static PyObject *
1125getargs_z_star(PyObject *self, PyObject *args)
1126{
1127 Py_buffer buffer;
1128 PyObject *bytes;
1129 if (!PyArg_ParseTuple(args, "z*", &buffer))
1130 return NULL;
1131 if (buffer.buf != NULL)
1132 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1133 else {
1134 Py_INCREF(Py_None);
1135 bytes = Py_None;
1136 }
1137 PyBuffer_Release(&buffer);
1138 return bytes;
1139}
1140
1141static PyObject *
1142getargs_z_hash(PyObject *self, PyObject *args)
1143{
1144 char *str;
1145 Py_ssize_t size;
1146 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1147 return NULL;
1148 if (str != NULL)
1149 return PyBytes_FromStringAndSize(str, size);
1150 else
1151 Py_RETURN_NONE;
1152}
1153
1154static PyObject *
1155getargs_y(PyObject *self, PyObject *args)
1156{
1157 char *str;
1158 if (!PyArg_ParseTuple(args, "y", &str))
1159 return NULL;
1160 return PyBytes_FromString(str);
1161}
1162
1163static PyObject *
1164getargs_y_star(PyObject *self, PyObject *args)
1165{
1166 Py_buffer buffer;
1167 PyObject *bytes;
1168 if (!PyArg_ParseTuple(args, "y*", &buffer))
1169 return NULL;
1170 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1171 PyBuffer_Release(&buffer);
1172 return bytes;
1173}
1174
1175static PyObject *
1176getargs_y_hash(PyObject *self, PyObject *args)
1177{
1178 char *str;
1179 Py_ssize_t size;
1180 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1181 return NULL;
1182 return PyBytes_FromStringAndSize(str, size);
1183}
1184
1185static PyObject *
1186getargs_u(PyObject *self, PyObject *args)
1187{
1188 Py_UNICODE *str;
1189 Py_ssize_t size;
1190 if (!PyArg_ParseTuple(args, "u", &str))
1191 return NULL;
1192 size = Py_UNICODE_strlen(str);
1193 return PyUnicode_FromUnicode(str, size);
1194}
1195
1196static PyObject *
1197getargs_u_hash(PyObject *self, PyObject *args)
1198{
1199 Py_UNICODE *str;
1200 Py_ssize_t size;
1201 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1202 return NULL;
1203 return PyUnicode_FromUnicode(str, size);
1204}
1205
1206static PyObject *
1207getargs_Z(PyObject *self, PyObject *args)
1208{
1209 Py_UNICODE *str;
1210 Py_ssize_t size;
1211 if (!PyArg_ParseTuple(args, "Z", &str))
1212 return NULL;
1213 if (str != NULL) {
1214 size = Py_UNICODE_strlen(str);
1215 return PyUnicode_FromUnicode(str, size);
1216 } else
1217 Py_RETURN_NONE;
1218}
1219
1220static PyObject *
1221getargs_Z_hash(PyObject *self, PyObject *args)
1222{
1223 Py_UNICODE *str;
1224 Py_ssize_t size;
1225 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1226 return NULL;
1227 if (str != NULL)
1228 return PyUnicode_FromUnicode(str, size);
1229 else
1230 Py_RETURN_NONE;
1231}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001232
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001233/* Test the s and z codes for PyArg_ParseTuple.
1234*/
1235static PyObject *
1236test_s_code(PyObject *self)
1237{
1238 /* Unicode strings should be accepted */
1239 PyObject *tuple, *obj;
1240 char *value;
1241
1242 tuple = PyTuple_New(1);
1243 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001245
1246 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001248 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001250
1251 PyTuple_SET_ITEM(tuple, 0, obj);
1252
1253 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001255 */
1256 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001258
1259 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001261
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001262 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001263 Py_RETURN_NONE;
1264}
1265
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001266static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001267parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001268{
Larry Hastings8f904da2012-06-22 03:56:29 -07001269 PyObject *sub_args;
1270 PyObject *sub_kwargs;
1271 char *sub_format;
1272 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001273
Larry Hastings8f904da2012-06-22 03:56:29 -07001274 Py_ssize_t i, size;
1275 char *keywords[8 + 1]; /* space for NULL at end */
1276 PyObject *o;
1277 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001278
Larry Hastings8f904da2012-06-22 03:56:29 -07001279 int result;
1280 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001281
Larry Hastings22701e82012-08-08 14:52:22 -07001282 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001283
Larry Hastings8f904da2012-06-22 03:56:29 -07001284 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1285 &sub_args, &sub_kwargs,
1286 &sub_format, &sub_keywords))
1287 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001288
Larry Hastings8f904da2012-06-22 03:56:29 -07001289 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1290 PyErr_SetString(PyExc_ValueError,
1291 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1292 return NULL;
1293 }
1294
1295 memset(buffers, 0, sizeof(buffers));
1296 memset(converted, 0, sizeof(converted));
1297 memset(keywords, 0, sizeof(keywords));
1298
1299 size = PySequence_Fast_GET_SIZE(sub_keywords);
1300 if (size > 8) {
1301 PyErr_SetString(PyExc_ValueError,
1302 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1303 goto exit;
1304 }
1305
1306 for (i = 0; i < size; i++) {
1307 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1308 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1309 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001310 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001311 goto exit;
1312 }
1313 keywords[i] = PyBytes_AS_STRING(converted[i]);
1314 }
1315
1316 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1317 sub_format, keywords,
1318 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1319 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1320
1321 if (result) {
1322 return_value = Py_None;
1323 Py_INCREF(Py_None);
1324 }
1325
1326exit:
1327 size = sizeof(converted) / sizeof(converted[0]);
1328 for (i = 0; i < size; i++) {
1329 Py_XDECREF(converted[i]);
1330 }
1331 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001332}
1333
Benjamin Peterson92035012008-12-27 16:00:54 +00001334static volatile int x;
1335
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001336/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1337 of an error.
1338*/
1339static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001340test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001341{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 PyObject *tuple, *obj;
1343 Py_UNICODE *value;
1344 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1347 /* Just use the macro and check that it compiles */
1348 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 tuple = PyTuple_New(1);
1351 if (tuple == NULL)
1352 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 obj = PyUnicode_Decode("test", strlen("test"),
1355 "ascii", NULL);
1356 if (obj == NULL)
1357 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 value = 0;
1362 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1363 return NULL;
1364 if (value != PyUnicode_AS_UNICODE(obj))
1365 return raiseTestError("test_u_code",
1366 "u code returned wrong value for u'test'");
1367 value = 0;
1368 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1369 return NULL;
1370 if (value != PyUnicode_AS_UNICODE(obj) ||
1371 len != PyUnicode_GET_SIZE(obj))
1372 return raiseTestError("test_u_code",
1373 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 Py_DECREF(tuple);
1376 Py_INCREF(Py_None);
1377 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001378}
1379
Guido van Rossumfb67be22007-08-29 18:38:11 +00001380/* Test Z and Z# codes for PyArg_ParseTuple */
1381static PyObject *
1382test_Z_code(PyObject *self)
1383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001385 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 tuple = PyTuple_New(2);
1389 if (tuple == NULL)
1390 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 obj = PyUnicode_FromString("test");
1393 PyTuple_SET_ITEM(tuple, 0, obj);
1394 Py_INCREF(Py_None);
1395 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 /* swap values on purpose */
1398 value1 = NULL;
1399 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 /* Test Z for both values */
1402 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1403 return NULL;
1404 if (value1 != PyUnicode_AS_UNICODE(obj))
1405 return raiseTestError("test_Z_code",
1406 "Z code returned wrong value for 'test'");
1407 if (value2 != NULL)
1408 return raiseTestError("test_Z_code",
1409 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 value1 = NULL;
1412 value2 = PyUnicode_AS_UNICODE(obj);
1413 len1 = -1;
1414 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 /* Test Z# for both values */
1417 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1418 &value2, &len2) < 0)
1419 return NULL;
1420 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1421 len1 != PyUnicode_GET_SIZE(obj))
1422 return raiseTestError("test_Z_code",
1423 "Z# code returned wrong values for 'test'");
1424 if (value2 != NULL ||
1425 len2 != 0)
1426 return raiseTestError("test_Z_code",
1427 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 Py_DECREF(tuple);
1430 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001431}
1432
Thomas Wouters477c8d52006-05-27 19:21:47 +00001433static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001434test_widechar(PyObject *self)
1435{
1436#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1438 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001439 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001440#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1442 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1447 if (wide == NULL)
1448 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1451 if (utf8 == NULL) {
1452 Py_DECREF(wide);
1453 return NULL;
1454 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001455
Victor Stinner8ef18872011-11-21 02:06:57 +01001456 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 Py_DECREF(wide);
1458 Py_DECREF(utf8);
1459 return raiseTestError("test_widechar",
1460 "wide string and utf8 string "
1461 "have different length");
1462 }
1463 if (PyUnicode_Compare(wide, utf8)) {
1464 Py_DECREF(wide);
1465 Py_DECREF(utf8);
1466 if (PyErr_Occurred())
1467 return NULL;
1468 return raiseTestError("test_widechar",
1469 "wide string and utf8 string "
1470 "are different");
1471 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 Py_DECREF(wide);
1474 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001475
1476#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1477 wide = PyUnicode_FromWideChar(invalid, 1);
1478 if (wide == NULL)
1479 PyErr_Clear();
1480 else
1481 return raiseTestError("test_widechar",
1482 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1483
1484 wide = PyUnicode_FromUnicode(invalid, 1);
1485 if (wide == NULL)
1486 PyErr_Clear();
1487 else
1488 return raiseTestError("test_widechar",
1489 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001490
1491 wide = PyUnicode_FromUnicode(NULL, 1);
1492 if (wide == NULL)
1493 return NULL;
1494 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001495 if (_PyUnicode_Ready(wide) < 0) {
1496 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001497 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001498 }
1499 else {
1500 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001501 return raiseTestError("test_widechar",
1502 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001503 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001504#endif
1505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001507}
1508
1509static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001510unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001511{
1512 PyObject *unicode, *result;
1513 Py_ssize_t buflen, size;
1514 wchar_t *buffer;
1515
1516 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1517 return NULL;
1518 buffer = PyMem_Malloc(buflen * sizeof(wchar_t));
1519 if (buffer == NULL)
1520 return PyErr_NoMemory();
1521
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001522 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001523 if (size == -1) {
1524 PyMem_Free(buffer);
1525 return NULL;
1526 }
1527
1528 if (size < buflen)
1529 buflen = size + 1;
1530 else
1531 buflen = size;
1532 result = PyUnicode_FromWideChar(buffer, buflen);
1533 PyMem_Free(buffer);
1534 if (result == NULL)
1535 return NULL;
1536
1537 return Py_BuildValue("(Nn)", result, size);
1538}
1539
1540static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001541unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001542{
1543 PyObject *unicode, *result;
1544 Py_ssize_t size;
1545 wchar_t *buffer;
1546
1547 if (!PyArg_ParseTuple(args, "U", &unicode))
1548 return NULL;
1549
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001550 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001551 if (buffer == NULL)
1552 return NULL;
1553
1554 result = PyUnicode_FromWideChar(buffer, size + 1);
1555 PyMem_Free(buffer);
1556 if (result == NULL)
1557 return NULL;
1558 return Py_BuildValue("(Nn)", result, size);
1559}
1560
1561static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001562unicode_encodedecimal(PyObject *self, PyObject *args)
1563{
1564 Py_UNICODE *unicode;
1565 Py_ssize_t length;
1566 char *errors = NULL;
1567 PyObject *decimal;
1568 Py_ssize_t decimal_length, new_length;
1569 int res;
1570
1571 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1572 return NULL;
1573
1574 decimal_length = length * 7; /* len('&#8364;') */
1575 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1576 if (decimal == NULL)
1577 return NULL;
1578
1579 res = PyUnicode_EncodeDecimal(unicode, length,
1580 PyBytes_AS_STRING(decimal),
1581 errors);
1582 if (res < 0) {
1583 Py_DECREF(decimal);
1584 return NULL;
1585 }
1586
1587 new_length = strlen(PyBytes_AS_STRING(decimal));
1588 assert(new_length <= decimal_length);
1589 res = _PyBytes_Resize(&decimal, new_length);
1590 if (res < 0)
1591 return NULL;
1592
1593 return decimal;
1594}
1595
1596static PyObject *
1597unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1598{
1599 Py_UNICODE *unicode;
1600 Py_ssize_t length;
1601 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1602 return NULL;
1603 return PyUnicode_TransformDecimalToASCII(unicode, length);
1604}
1605
1606static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001607unicode_legacy_string(PyObject *self, PyObject *args)
1608{
1609 Py_UNICODE *data;
1610 Py_ssize_t len;
1611 PyObject *u;
1612
1613 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1614 return NULL;
1615
1616 u = PyUnicode_FromUnicode(NULL, len);
1617 if (u == NULL)
1618 return NULL;
1619
1620 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1621
1622 if (len > 0) { /* The empty string is always ready. */
1623 assert(!PyUnicode_IS_READY(u));
1624 }
1625
1626 return u;
1627}
1628
1629static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001630getargs_w_star(PyObject *self, PyObject *args)
1631{
1632 Py_buffer buffer;
1633 PyObject *result;
1634 char *str;
1635
1636 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1637 return NULL;
1638
1639 if (2 <= buffer.len) {
1640 str = buffer.buf;
1641 str[0] = '[';
1642 str[buffer.len-1] = ']';
1643 }
1644
1645 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1646 PyBuffer_Release(&buffer);
1647 return result;
1648}
1649
1650
1651static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001652test_empty_argparse(PyObject *self)
1653{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 /* Test that formats can begin with '|'. See issue #4720. */
1655 PyObject *tuple, *dict = NULL;
1656 static char *kwlist[] = {NULL};
1657 int result;
1658 tuple = PyTuple_New(0);
1659 if (!tuple)
1660 return NULL;
1661 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1662 goto done;
1663 dict = PyDict_New();
1664 if (!dict)
1665 goto done;
1666 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00001667 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 Py_DECREF(tuple);
1669 Py_XDECREF(dict);
1670 if (result < 0)
1671 return NULL;
1672 else {
1673 Py_RETURN_NONE;
1674 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001675}
1676
1677static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001678codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001679{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 const char *encoding, *errors = NULL;
1681 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1682 &encoding, &errors))
1683 return NULL;
1684 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001685}
1686
Thomas Wouters477c8d52006-05-27 19:21:47 +00001687static PyObject *
1688codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 const char *encoding, *errors = NULL;
1691 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1692 &encoding, &errors))
1693 return NULL;
1694 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001695}
1696
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001697
Tim Peters5b8132f2003-01-31 15:52:05 +00001698/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001699static PyObject *
1700test_long_numbits(PyObject *self)
1701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 struct triple {
1703 long input;
1704 size_t nbits;
1705 int sign;
1706 } testcases[] = {{0, 0, 0},
1707 {1L, 1, 1},
1708 {-1L, 1, -1},
1709 {2L, 2, 1},
1710 {-2L, 2, -1},
1711 {3L, 2, 1},
1712 {-3L, 2, -1},
1713 {4L, 3, 1},
1714 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03001715 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 {-0x7fffL, 15, -1},
1717 {0xffffL, 16, 1},
1718 {-0xffffL, 16, -1},
1719 {0xfffffffL, 28, 1},
1720 {-0xfffffffL, 28, -1}};
1721 int i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001722
Victor Stinner63941882011-09-29 00:42:28 +02001723 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02001724 size_t nbits;
1725 int sign;
1726 PyObject *plong;
1727
1728 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02001729 if (plong == NULL)
1730 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02001731 nbits = _PyLong_NumBits(plong);
1732 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 Py_DECREF(plong);
1735 if (nbits != testcases[i].nbits)
1736 return raiseTestError("test_long_numbits",
1737 "wrong result for _PyLong_NumBits");
1738 if (sign != testcases[i].sign)
1739 return raiseTestError("test_long_numbits",
1740 "wrong result for _PyLong_Sign");
1741 }
1742 Py_INCREF(Py_None);
1743 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001744}
1745
Thomas Heller519a0422007-11-15 20:48:54 +00001746/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00001747
1748static PyObject *
1749test_null_strings(PyObject *self)
1750{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
1752 PyObject *tuple = PyTuple_Pack(2, o1, o2);
1753 Py_XDECREF(o1);
1754 Py_XDECREF(o2);
1755 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00001756}
1757
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001758static PyObject *
1759raise_exception(PyObject *self, PyObject *args)
1760{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 PyObject *exc;
1762 PyObject *exc_args, *v;
1763 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
1766 &exc, &num_args))
1767 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 exc_args = PyTuple_New(num_args);
1770 if (exc_args == NULL)
1771 return NULL;
1772 for (i = 0; i < num_args; ++i) {
1773 v = PyLong_FromLong(i);
1774 if (v == NULL) {
1775 Py_DECREF(exc_args);
1776 return NULL;
1777 }
1778 PyTuple_SET_ITEM(exc_args, i, v);
1779 }
1780 PyErr_SetObject(exc, exc_args);
1781 Py_DECREF(exc_args);
1782 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001783}
Tim Peters91621db2001-06-12 20:10:01 +00001784
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02001785static PyObject *
1786test_set_exc_info(PyObject *self, PyObject *args)
1787{
1788 PyObject *orig_exc;
1789 PyObject *new_type, *new_value, *new_tb;
1790 PyObject *type, *value, *tb;
1791 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
1792 &new_type, &new_value, &new_tb))
1793 return NULL;
1794
1795 PyErr_GetExcInfo(&type, &value, &tb);
1796
1797 Py_INCREF(new_type);
1798 Py_INCREF(new_value);
1799 Py_INCREF(new_tb);
1800 PyErr_SetExcInfo(new_type, new_value, new_tb);
1801
1802 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
1803 Py_XDECREF(type);
1804 Py_XDECREF(value);
1805 Py_XDECREF(tb);
1806 return orig_exc;
1807}
Benjamin Peterson16323982010-02-03 01:13:41 +00001808
1809static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001810
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001811static PyObject *
1812test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 if (PyDateTimeAPI) {
1814 if (test_run_counter) {
1815 /* Probably regrtest.py -R */
1816 Py_RETURN_NONE;
1817 }
1818 else {
1819 PyErr_SetString(PyExc_AssertionError,
1820 "PyDateTime_CAPI somehow initialized");
1821 return NULL;
1822 }
1823 }
1824 test_run_counter++;
1825 PyDateTime_IMPORT;
1826 if (PyDateTimeAPI)
1827 Py_RETURN_NONE;
1828 else
1829 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001830}
1831
Benjamin Peterson16323982010-02-03 01:13:41 +00001832
1833#ifdef WITH_THREAD
1834
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001835/* test_thread_state spawns a thread of its own, and that thread releases
1836 * `thread_done` when it's finished. The driver code has to know when the
1837 * thread finishes, because the thread uses a PyObject (the callable) that
1838 * may go away when the driver finishes. The former lack of this explicit
1839 * synchronization caused rare segfaults, so rare that they were seen only
1840 * on a Mac buildbot (although they were possible on any box).
1841 */
1842static PyThread_type_lock thread_done = NULL;
1843
Benjamin Petersona786b022008-08-25 21:05:21 +00001844static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001845_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001846{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 PyObject *rc;
1848 int success;
1849 PyGILState_STATE s = PyGILState_Ensure();
1850 rc = PyObject_CallFunction((PyObject *)callable, "");
1851 success = (rc != NULL);
1852 Py_XDECREF(rc);
1853 PyGILState_Release(s);
1854 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001855}
1856
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001857/* Same thing, but releases `thread_done` when it returns. This variant
1858 * should be called only from threads spawned by test_thread_state().
1859 */
1860static void
1861_make_call_from_thread(void *callable)
1862{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 _make_call(callable);
1864 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001865}
1866
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001867static PyObject *
1868test_thread_state(PyObject *self, PyObject *args)
1869{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 PyObject *fn;
1871 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1874 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 if (!PyCallable_Check(fn)) {
1877 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1878 fn->ob_type->tp_name);
1879 return NULL;
1880 }
Benjamin Petersona786b022008-08-25 21:05:21 +00001881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 /* Ensure Python is set up for threading */
1883 PyEval_InitThreads();
1884 thread_done = PyThread_allocate_lock();
1885 if (thread_done == NULL)
1886 return PyErr_NoMemory();
1887 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 /* Start a new thread with our callback. */
1890 PyThread_start_new_thread(_make_call_from_thread, fn);
1891 /* Make the callback with the thread lock held by this thread */
1892 success &= _make_call(fn);
1893 /* Do it all again, but this time with the thread-lock released */
1894 Py_BEGIN_ALLOW_THREADS
1895 success &= _make_call(fn);
1896 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1897 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 /* And once more with and without a thread
1900 XXX - should use a lock and work out exactly what we are trying
1901 to test <wink>
1902 */
1903 Py_BEGIN_ALLOW_THREADS
1904 PyThread_start_new_thread(_make_call_from_thread, fn);
1905 success &= _make_call(fn);
1906 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1907 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001909 /* Release lock we acquired above. This is required on HP-UX. */
1910 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 PyThread_free_lock(thread_done);
1913 if (!success)
1914 return NULL;
1915 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001916}
Benjamin Petersona54c9092009-01-13 02:11:23 +00001917
1918/* test Py_AddPendingCalls using threads */
1919static int _pending_callback(void *arg)
1920{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 /* we assume the argument is callable object to which we own a reference */
1922 PyObject *callable = (PyObject *)arg;
1923 PyObject *r = PyObject_CallObject(callable, NULL);
1924 Py_DECREF(callable);
1925 Py_XDECREF(r);
1926 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001927}
1928
1929/* The following requests n callbacks to _pending_callback. It can be
1930 * run from any python thread.
1931 */
1932PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
1933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 PyObject *callable;
1935 int r;
1936 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
1937 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 /* create the reference for the callbackwhile we hold the lock */
1940 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00001941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 Py_BEGIN_ALLOW_THREADS
1943 r = Py_AddPendingCall(&_pending_callback, callable);
1944 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00001945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 if (r<0) {
1947 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
1948 Py_INCREF(Py_False);
1949 return Py_False;
1950 }
1951 Py_INCREF(Py_True);
1952 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001953}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001954#endif
1955
Neal Norwitzb0d26332007-08-25 00:49:05 +00001956/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001957static PyObject *
1958test_string_from_format(PyObject *self, PyObject *args)
1959{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 PyObject *result;
1961 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001962
Alexander Belopolskye239d232010-12-08 23:31:48 +00001963#define CHECK_1_FORMAT(FORMAT, TYPE) \
1964 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
1965 if (result == NULL) \
1966 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01001967 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00001968 msg = FORMAT " failed at 1"; \
1969 goto Fail; \
1970 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 CHECK_1_FORMAT("%d", int);
1974 CHECK_1_FORMAT("%ld", long);
1975 /* The z width modifier was added in Python 2.5. */
1976 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 /* The u type code was added in Python 2.5. */
1979 CHECK_1_FORMAT("%u", unsigned int);
1980 CHECK_1_FORMAT("%lu", unsigned long);
1981 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001984#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
1986 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001987#endif
1988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001990
1991 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 Py_XDECREF(result);
1993 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001994
1995#undef CHECK_1_FORMAT
1996}
1997
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00001998
1999static PyObject *
2000test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2002 int result;
2003 if (py_s == NULL)
2004 return NULL;
2005 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2006 Py_DECREF(py_s);
2007 if (!result) {
2008 PyErr_SetString(TestError, "Python string ending in NULL "
2009 "should not compare equal to c string.");
2010 return NULL;
2011 }
2012 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002013}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002014
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002015/* This is here to provide a docstring for test_descr. */
2016static PyObject *
2017test_with_docstring(PyObject *self)
2018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002020}
2021
Mark Dickinson725bfd82009-05-03 20:33:40 +00002022/* Test PyOS_string_to_double. */
2023static PyObject *
2024test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 double result;
2026 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028#define CHECK_STRING(STR, expected) \
2029 result = PyOS_string_to_double(STR, NULL, NULL); \
2030 if (result == -1.0 && PyErr_Occurred()) \
2031 return NULL; \
2032 if (result != expected) { \
2033 msg = "conversion of " STR " to float failed"; \
2034 goto fail; \
2035 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037#define CHECK_INVALID(STR) \
2038 result = PyOS_string_to_double(STR, NULL, NULL); \
2039 if (result == -1.0 && PyErr_Occurred()) { \
2040 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2041 PyErr_Clear(); \
2042 else \
2043 return NULL; \
2044 } \
2045 else { \
2046 msg = "conversion of " STR " didn't raise ValueError"; \
2047 goto fail; \
2048 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 CHECK_STRING("0.1", 0.1);
2051 CHECK_STRING("1.234", 1.234);
2052 CHECK_STRING("-1.35", -1.35);
2053 CHECK_STRING(".1e01", 1.0);
2054 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 CHECK_INVALID(" 0.1");
2057 CHECK_INVALID("\t\n-3");
2058 CHECK_INVALID(".123 ");
2059 CHECK_INVALID("3\n");
2060 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002063 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002065#undef CHECK_STRING
2066#undef CHECK_INVALID
2067}
2068
2069
Benjamin Petersonb173f782009-05-05 22:31:58 +00002070/* Coverage testing of capsule objects. */
2071
2072static const char *capsule_name = "capsule name";
2073static char *capsule_pointer = "capsule pointer";
2074static char *capsule_context = "capsule context";
2075static const char *capsule_error = NULL;
2076static int
2077capsule_destructor_call_count = 0;
2078
2079static void
2080capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 capsule_destructor_call_count++;
2082 if (PyCapsule_GetContext(o) != capsule_context) {
2083 capsule_error = "context did not match in destructor!";
2084 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2085 capsule_error = "destructor did not match in destructor! (woah!)";
2086 } else if (PyCapsule_GetName(o) != capsule_name) {
2087 capsule_error = "name did not match in destructor!";
2088 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2089 capsule_error = "pointer did not match in destructor!";
2090 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002091}
2092
2093typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 char *name;
2095 char *module;
2096 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002097} known_capsule;
2098
2099static PyObject *
2100test_capsule(PyObject *self, PyObject *args)
2101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 PyObject *object;
2103 const char *error = NULL;
2104 void *pointer;
2105 void *pointer2;
2106 known_capsule known_capsules[] = {
2107 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2108 KNOWN_CAPSULE("_socket", "CAPI"),
2109 KNOWN_CAPSULE("_curses", "_C_API"),
2110 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2111 { NULL, NULL },
2112 };
2113 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002114
2115#define FAIL(x) { error = (x); goto exit; }
2116
2117#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 if (capsule_error) { \
2119 FAIL(capsule_error); \
2120 } \
2121 else if (!capsule_destructor_call_count) { \
2122 FAIL("destructor not called!"); \
2123 } \
2124 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2127 PyCapsule_SetContext(object, capsule_context);
2128 capsule_destructor(object);
2129 CHECK_DESTRUCTOR;
2130 Py_DECREF(object);
2131 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 object = PyCapsule_New(known, "ignored", NULL);
2134 PyCapsule_SetPointer(object, capsule_pointer);
2135 PyCapsule_SetName(object, capsule_name);
2136 PyCapsule_SetDestructor(object, capsule_destructor);
2137 PyCapsule_SetContext(object, capsule_context);
2138 capsule_destructor(object);
2139 CHECK_DESTRUCTOR;
2140 /* intentionally access using the wrong name */
2141 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2142 if (!PyErr_Occurred()) {
2143 FAIL("PyCapsule_GetPointer should have failed but did not!");
2144 }
2145 PyErr_Clear();
2146 if (pointer2) {
2147 if (pointer2 == capsule_pointer) {
2148 FAIL("PyCapsule_GetPointer should not have"
2149 " returned the internal pointer!");
2150 } else {
2151 FAIL("PyCapsule_GetPointer should have "
2152 "returned NULL pointer but did not!");
2153 }
2154 }
2155 PyCapsule_SetDestructor(object, NULL);
2156 Py_DECREF(object);
2157 if (capsule_destructor_call_count) {
2158 FAIL("destructor called when it should not have been!");
2159 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 for (known = &known_capsules[0]; known->module != NULL; known++) {
2162 /* yeah, ordinarily I wouldn't do this either,
2163 but it's fine for this test harness.
2164 */
2165 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002166#undef FAIL
2167#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 { \
2169 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2170 x, known->module, known->attribute); \
2171 error = buffer; \
2172 goto exit; \
2173 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 PyObject *module = PyImport_ImportModule(known->module);
2176 if (module) {
2177 pointer = PyCapsule_Import(known->name, 0);
2178 if (!pointer) {
2179 Py_DECREF(module);
2180 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2181 }
2182 object = PyObject_GetAttrString(module, known->attribute);
2183 if (!object) {
2184 Py_DECREF(module);
2185 return NULL;
2186 }
2187 pointer2 = PyCapsule_GetPointer(object,
2188 "weebles wobble but they don't fall down");
2189 if (!PyErr_Occurred()) {
2190 Py_DECREF(object);
2191 Py_DECREF(module);
2192 FAIL("PyCapsule_GetPointer should have failed but did not!");
2193 }
2194 PyErr_Clear();
2195 if (pointer2) {
2196 Py_DECREF(module);
2197 Py_DECREF(object);
2198 if (pointer2 == pointer) {
2199 FAIL("PyCapsule_GetPointer should not have"
2200 " returned its internal pointer!");
2201 } else {
2202 FAIL("PyCapsule_GetPointer should have"
2203 " returned NULL pointer but did not!");
2204 }
2205 }
2206 Py_DECREF(object);
2207 Py_DECREF(module);
2208 }
2209 else
2210 PyErr_Clear();
2211 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002212
2213 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214 if (error) {
2215 return raiseTestError("test_capsule", error);
2216 }
2217 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002218#undef FAIL
2219}
2220
Guido van Rossumddefaf32007-01-14 03:31:43 +00002221#ifdef HAVE_GETTIMEOFDAY
2222/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002223static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002225 e->tv_sec -= s->tv_sec;
2226 e->tv_usec -= s->tv_usec;
2227 if (e->tv_usec < 0) {
2228 e->tv_sec -=1;
2229 e->tv_usec += 1000000;
2230 }
2231 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002232}
2233
2234static PyObject *
2235profile_int(PyObject *self, PyObject* args)
2236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 int i, k;
2238 struct timeval start, stop;
2239 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 /* Test 1: Allocate and immediately deallocate
2242 many small integers */
2243 gettimeofday(&start, NULL);
2244 for(k=0; k < 20000; k++)
2245 for(i=0; i < 1000; i++) {
2246 single = PyLong_FromLong(i);
2247 Py_DECREF(single);
2248 }
2249 gettimeofday(&stop, NULL);
2250 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 /* Test 2: Allocate and immediately deallocate
2253 many large integers */
2254 gettimeofday(&start, NULL);
2255 for(k=0; k < 20000; k++)
2256 for(i=0; i < 1000; i++) {
2257 single = PyLong_FromLong(i+1000000);
2258 Py_DECREF(single);
2259 }
2260 gettimeofday(&stop, NULL);
2261 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 /* Test 3: Allocate a few integers, then release
2264 them all simultaneously. */
2265 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002266 if (multiple == NULL)
2267 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 gettimeofday(&start, NULL);
2269 for(k=0; k < 20000; k++) {
2270 for(i=0; i < 1000; i++) {
2271 multiple[i] = PyLong_FromLong(i+1000000);
2272 }
2273 for(i=0; i < 1000; i++) {
2274 Py_DECREF(multiple[i]);
2275 }
2276 }
2277 gettimeofday(&stop, NULL);
2278 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002279 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 /* Test 4: Allocate many integers, then release
2282 them all simultaneously. */
2283 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002284 if (multiple == NULL)
2285 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 gettimeofday(&start, NULL);
2287 for(k=0; k < 20; k++) {
2288 for(i=0; i < 1000000; i++) {
2289 multiple[i] = PyLong_FromLong(i+1000000);
2290 }
2291 for(i=0; i < 1000000; i++) {
2292 Py_DECREF(multiple[i]);
2293 }
2294 }
2295 gettimeofday(&stop, NULL);
2296 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002297 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 /* Test 5: Allocate many integers < 32000 */
2300 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002301 if (multiple == NULL)
2302 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 gettimeofday(&start, NULL);
2304 for(k=0; k < 10; k++) {
2305 for(i=0; i < 1000000; i++) {
2306 multiple[i] = PyLong_FromLong(i+1000);
2307 }
2308 for(i=0; i < 1000000; i++) {
2309 Py_DECREF(multiple[i]);
2310 }
2311 }
2312 gettimeofday(&stop, NULL);
2313 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002314 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 /* Test 6: Perform small int addition */
2317 op1 = PyLong_FromLong(1);
2318 gettimeofday(&start, NULL);
2319 for(i=0; i < 10000000; i++) {
2320 result = PyNumber_Add(op1, op1);
2321 Py_DECREF(result);
2322 }
2323 gettimeofday(&stop, NULL);
2324 Py_DECREF(op1);
2325 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 /* Test 7: Perform medium int addition */
2328 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002329 if (op1 == NULL)
2330 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 gettimeofday(&start, NULL);
2332 for(i=0; i < 10000000; i++) {
2333 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002334 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 }
2336 gettimeofday(&stop, NULL);
2337 Py_DECREF(op1);
2338 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 Py_INCREF(Py_None);
2341 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002342}
2343#endif
2344
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002345/* To test the format of tracebacks as printed out. */
2346static PyObject *
2347traceback_print(PyObject *self, PyObject *args)
2348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 PyObject *file;
2350 PyObject *traceback;
2351 int result;
2352
2353 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2354 &traceback, &file))
2355 return NULL;
2356
2357 result = PyTraceBack_Print(traceback, file);
2358 if (result < 0)
2359 return NULL;
2360 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002361}
2362
Benjamin Petersone6528212008-07-15 15:32:09 +00002363/* To test the format of exceptions as printed out. */
2364static PyObject *
2365exception_print(PyObject *self, PyObject *args)
2366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 PyObject *value;
2368 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 if (!PyArg_ParseTuple(args, "O:exception_print",
2371 &value))
2372 return NULL;
2373 if (!PyExceptionInstance_Check(value)) {
2374 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2375 return NULL;
2376 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 tb = PyException_GetTraceback(value);
2379 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2380 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002383}
2384
2385
2386
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002387
2388/* reliably raise a MemoryError */
2389static PyObject *
2390raise_memoryerror(PyObject *self)
2391{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 PyErr_NoMemory();
2393 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002394}
2395
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002396/* Issue 6012 */
2397static PyObject *str1, *str2;
2398static int
2399failing_converter(PyObject *obj, void *arg)
2400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 /* Clone str1, then let the conversion fail. */
2402 assert(str1);
2403 str2 = str1;
2404 Py_INCREF(str2);
2405 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002406}
2407static PyObject*
2408argparsing(PyObject *o, PyObject *args)
2409{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 PyObject *res;
2411 str1 = str2 = NULL;
2412 if (!PyArg_ParseTuple(args, "O&O&",
2413 PyUnicode_FSConverter, &str1,
2414 failing_converter, &str2)) {
2415 if (!str2)
2416 /* argument converter not called? */
2417 return NULL;
2418 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002419 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 Py_DECREF(str2);
2421 PyErr_Clear();
2422 return res;
2423 }
2424 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002425}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002426
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002427/* To test that the result of PyCode_NewEmpty has the right members. */
2428static PyObject *
2429code_newempty(PyObject *self, PyObject *args)
2430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 const char *filename;
2432 const char *funcname;
2433 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2436 &filename, &funcname, &firstlineno))
2437 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002440}
2441
Georg Brandl1e28a272009-12-28 08:41:01 +00002442/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2443 Run via Lib/test/test_exceptions.py */
2444static PyObject *
2445make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2446{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 const char *name;
2448 const char *doc = NULL;
2449 PyObject *base = NULL;
2450 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2455 "s|sOO:make_exception_with_doc", kwlist,
2456 &name, &doc, &base, &dict))
2457 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002460}
2461
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002462static PyObject *
2463make_memoryview_from_NULL_pointer(PyObject *self)
2464{
2465 Py_buffer info;
2466 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2467 return NULL;
2468 return PyMemoryView_FromBuffer(&info);
2469}
2470
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002471/* Test that the fatal error from not having a current thread doesn't
2472 cause an infinite loop. Run via Lib/test/test_capi.py */
2473static PyObject *
2474crash_no_current_thread(PyObject *self)
2475{
2476 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002477 /* Using PyThreadState_Get() directly allows the test to pass in
2478 !pydebug mode. However, the test only actually tests anything
2479 in pydebug mode, since that's where the infinite loop was in
2480 the first place. */
2481 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002482 Py_END_ALLOW_THREADS
2483 return NULL;
2484}
2485
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002486/* To run some code in a sub-interpreter. */
2487static PyObject *
2488run_in_subinterp(PyObject *self, PyObject *args)
2489{
2490 const char *code;
2491 int r;
2492 PyThreadState *substate, *mainstate;
2493
2494 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2495 &code))
2496 return NULL;
2497
2498 mainstate = PyThreadState_Get();
2499
2500 PyThreadState_Swap(NULL);
2501
2502 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002503 if (substate == NULL) {
2504 /* Since no new thread state was created, there is no exception to
2505 propagate; raise a fresh one after swapping in the old thread
2506 state. */
2507 PyThreadState_Swap(mainstate);
2508 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2509 return NULL;
2510 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002511 r = PyRun_SimpleString(code);
2512 Py_EndInterpreter(substate);
2513
2514 PyThreadState_Swap(mainstate);
2515
2516 return PyLong_FromLong(r);
2517}
2518
Victor Stinner3c1b3792014-02-17 00:02:43 +01002519static int
2520check_time_rounding(int round)
2521{
2522 if (round != _PyTime_ROUND_DOWN && round != _PyTime_ROUND_UP) {
2523 PyErr_SetString(PyExc_ValueError, "invalid rounding");
2524 return -1;
2525 }
2526 return 0;
2527}
2528
Victor Stinner5d272cc2012-03-13 13:35:55 +01002529static PyObject *
2530test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2531{
2532 PyObject *obj;
2533 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002534 int round;
2535 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002536 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002537 if (check_time_rounding(round) < 0)
2538 return NULL;
2539 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002540 return NULL;
2541 return _PyLong_FromTime_t(sec);
2542}
2543
2544static PyObject *
2545test_pytime_object_to_timeval(PyObject *self, PyObject *args)
2546{
2547 PyObject *obj;
2548 time_t sec;
2549 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002550 int round;
2551 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002552 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002553 if (check_time_rounding(round) < 0)
2554 return NULL;
2555 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002556 return NULL;
2557 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
2558}
2559
Victor Stinner643cd682012-03-02 22:54:03 +01002560static PyObject *
2561test_pytime_object_to_timespec(PyObject *self, PyObject *args)
2562{
2563 PyObject *obj;
2564 time_t sec;
2565 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002566 int round;
2567 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01002568 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002569 if (check_time_rounding(round) < 0)
2570 return NULL;
2571 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01002572 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01002573 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01002574}
2575
Antoine Pitrou796564c2013-07-30 19:59:21 +02002576static void
2577slot_tp_del(PyObject *self)
2578{
2579 _Py_IDENTIFIER(__tp_del__);
2580 PyObject *del, *res;
2581 PyObject *error_type, *error_value, *error_traceback;
2582
2583 /* Temporarily resurrect the object. */
2584 assert(self->ob_refcnt == 0);
2585 self->ob_refcnt = 1;
2586
2587 /* Save the current exception, if any. */
2588 PyErr_Fetch(&error_type, &error_value, &error_traceback);
2589
2590 /* Execute __del__ method, if any. */
2591 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
2592 if (del != NULL) {
2593 res = PyEval_CallObject(del, NULL);
2594 if (res == NULL)
2595 PyErr_WriteUnraisable(del);
2596 else
2597 Py_DECREF(res);
2598 Py_DECREF(del);
2599 }
2600
2601 /* Restore the saved exception. */
2602 PyErr_Restore(error_type, error_value, error_traceback);
2603
2604 /* Undo the temporary resurrection; can't use DECREF here, it would
2605 * cause a recursive call.
2606 */
2607 assert(self->ob_refcnt > 0);
2608 if (--self->ob_refcnt == 0)
2609 return; /* this is the normal path out */
2610
2611 /* __del__ resurrected it! Make it look like the original Py_DECREF
2612 * never happened.
2613 */
2614 {
2615 Py_ssize_t refcnt = self->ob_refcnt;
2616 _Py_NewReference(self);
2617 self->ob_refcnt = refcnt;
2618 }
2619 assert(!PyType_IS_GC(Py_TYPE(self)) ||
2620 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
2621 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
2622 * we need to undo that. */
2623 _Py_DEC_REFTOTAL;
2624 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
2625 * chain, so no more to do there.
2626 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
2627 * _Py_NewReference bumped tp_allocs: both of those need to be
2628 * undone.
2629 */
2630#ifdef COUNT_ALLOCS
2631 --Py_TYPE(self)->tp_frees;
2632 --Py_TYPE(self)->tp_allocs;
2633#endif
2634}
2635
2636static PyObject *
2637with_tp_del(PyObject *self, PyObject *args)
2638{
2639 PyObject *obj;
2640 PyTypeObject *tp;
2641
2642 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
2643 return NULL;
2644 tp = (PyTypeObject *) obj;
2645 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
2646 PyErr_Format(PyExc_TypeError,
2647 "heap type expected, got %R", obj);
2648 return NULL;
2649 }
2650 tp->tp_del = slot_tp_del;
2651 Py_INCREF(obj);
2652 return obj;
2653}
2654
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07002655static PyObject *
2656_test_incref(PyObject *ob)
2657{
2658 Py_INCREF(ob);
2659 return ob;
2660}
2661
2662static PyObject *
2663test_xincref_doesnt_leak(PyObject *ob)
2664{
2665 PyObject *obj = PyLong_FromLong(0);
2666 Py_XINCREF(_test_incref(obj));
2667 Py_DECREF(obj);
2668 Py_DECREF(obj);
2669 Py_DECREF(obj);
2670 Py_RETURN_NONE;
2671}
2672
2673static PyObject *
2674test_incref_doesnt_leak(PyObject *ob)
2675{
2676 PyObject *obj = PyLong_FromLong(0);
2677 Py_INCREF(_test_incref(obj));
2678 Py_DECREF(obj);
2679 Py_DECREF(obj);
2680 Py_DECREF(obj);
2681 Py_RETURN_NONE;
2682}
2683
2684static PyObject *
2685test_xdecref_doesnt_leak(PyObject *ob)
2686{
2687 Py_XDECREF(PyLong_FromLong(0));
2688 Py_RETURN_NONE;
2689}
2690
2691static PyObject *
2692test_decref_doesnt_leak(PyObject *ob)
2693{
2694 Py_DECREF(PyLong_FromLong(0));
2695 Py_RETURN_NONE;
2696}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002697
Victor Stinner0507bf52013-07-07 02:05:46 +02002698static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02002699test_incref_decref_API(PyObject *ob)
2700{
2701 PyObject *obj = PyLong_FromLong(0);
2702 Py_IncRef(ob);
2703 Py_DecRef(obj);
2704 Py_DecRef(obj);
2705 Py_RETURN_NONE;
2706}
2707
2708static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02002709test_pymem_alloc0(PyObject *self)
2710{
2711 void *ptr;
2712
2713 ptr = PyMem_Malloc(0);
2714 if (ptr == NULL) {
2715 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
2716 return NULL;
2717 }
2718 PyMem_Free(ptr);
2719
2720 ptr = PyObject_Malloc(0);
2721 if (ptr == NULL) {
2722 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
2723 return NULL;
2724 }
2725 PyObject_Free(ptr);
2726
2727 Py_RETURN_NONE;
2728}
2729
2730typedef struct {
2731 PyMemAllocator alloc;
2732
2733 size_t malloc_size;
2734 void *realloc_ptr;
2735 size_t realloc_new_size;
2736 void *free_ptr;
2737} alloc_hook_t;
2738
2739static void* hook_malloc (void* ctx, size_t size)
2740{
2741 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2742 hook->malloc_size = size;
2743 return hook->alloc.malloc(hook->alloc.ctx, size);
2744}
2745
2746static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
2747{
2748 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2749 hook->realloc_ptr = ptr;
2750 hook->realloc_new_size = new_size;
2751 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
2752}
2753
2754static void hook_free (void *ctx, void *ptr)
2755{
2756 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2757 hook->free_ptr = ptr;
2758 hook->alloc.free(hook->alloc.ctx, ptr);
2759}
2760
2761static PyObject *
2762test_setallocators(PyMemAllocatorDomain domain)
2763{
2764 PyObject *res = NULL;
2765 const char *error_msg;
2766 alloc_hook_t hook;
2767 PyMemAllocator alloc;
2768 size_t size, size2;
2769 void *ptr, *ptr2;
2770
2771 hook.malloc_size = 0;
2772 hook.realloc_ptr = NULL;
2773 hook.realloc_new_size = 0;
2774 hook.free_ptr = NULL;
2775
2776 alloc.ctx = &hook;
2777 alloc.malloc = &hook_malloc;
2778 alloc.realloc = &hook_realloc;
2779 alloc.free = &hook_free;
2780 PyMem_GetAllocator(domain, &hook.alloc);
2781 PyMem_SetAllocator(domain, &alloc);
2782
2783 size = 42;
2784 switch(domain)
2785 {
2786 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
2787 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
2788 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
2789 default: ptr = NULL; break;
2790 }
2791
2792 if (ptr == NULL) {
2793 error_msg = "malloc failed";
2794 goto fail;
2795 }
2796
2797 if (hook.malloc_size != size) {
2798 error_msg = "malloc invalid size";
2799 goto fail;
2800 }
2801
2802 size2 = 200;
2803 switch(domain)
2804 {
2805 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
2806 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
2807 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02002808 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02002809 }
2810
2811 if (ptr2 == NULL) {
2812 error_msg = "realloc failed";
2813 goto fail;
2814 }
2815
2816 if (hook.realloc_ptr != ptr
2817 || hook.realloc_new_size != size2) {
2818 error_msg = "realloc invalid parameters";
2819 goto fail;
2820 }
2821
2822 switch(domain)
2823 {
2824 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
2825 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
2826 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
2827 }
2828
2829 if (hook.free_ptr != ptr2) {
2830 error_msg = "free invalid pointer";
2831 goto fail;
2832 }
2833
2834 Py_INCREF(Py_None);
2835 res = Py_None;
2836 goto finally;
2837
2838fail:
2839 PyErr_SetString(PyExc_RuntimeError, error_msg);
2840
2841finally:
2842 PyMem_SetAllocator(domain, &hook.alloc);
2843 return res;
2844}
2845
2846static PyObject *
2847test_pymem_setrawallocators(PyObject *self)
2848{
2849 return test_setallocators(PYMEM_DOMAIN_RAW);
2850}
2851
2852static PyObject *
2853test_pymem_setallocators(PyObject *self)
2854{
2855 return test_setallocators(PYMEM_DOMAIN_MEM);
2856}
2857
2858static PyObject *
2859test_pyobject_setallocators(PyObject *self)
2860{
2861 return test_setallocators(PYMEM_DOMAIN_OBJ);
2862}
2863
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002864PyDoc_STRVAR(docstring_empty,
2865""
2866);
2867
2868PyDoc_STRVAR(docstring_no_signature,
2869"This docstring has no signature."
2870);
2871
2872PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002873"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002874"\n"
2875"This docstring has an invalid signature."
2876);
2877
Larry Hastings2623c8c2014-02-08 22:15:29 -08002878PyDoc_STRVAR(docstring_with_invalid_signature2,
2879"docstring_with_invalid_signature2($module, /, boo)\n"
2880"\n"
2881"--\n"
2882"\n"
2883"This docstring also has an invalid signature."
2884);
2885
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002886PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002887"docstring_with_signature($module, /, sig)\n"
2888"--\n"
2889"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002890"This docstring has a valid signature."
2891);
2892
2893PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002894"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
2895"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08002896"\n"
2897"\n"
2898"This docstring has a valid signature and some extra newlines."
2899);
2900
Larry Hastings16c51912014-01-07 11:53:01 -08002901PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08002902"docstring_with_signature_with_defaults(module, s='avocado',\n"
2903" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
2904" local=the_number_three, sys=sys.maxsize,\n"
2905" exp=sys.maxsize - 1)\n"
2906"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08002907"\n"
2908"\n"
2909"\n"
2910"This docstring has a valid signature with parameters,\n"
2911"and the parameters take defaults of varying types."
2912);
2913
Victor Stinner258e4d32013-12-13 02:30:12 +01002914#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01002915typedef struct {
2916 PyThread_type_lock start_event;
2917 PyThread_type_lock exit_event;
2918 PyObject *callback;
2919} test_c_thread_t;
2920
2921static void
2922temporary_c_thread(void *data)
2923{
2924 test_c_thread_t *test_c_thread = data;
2925 PyGILState_STATE state;
2926 PyObject *res;
2927
2928 PyThread_release_lock(test_c_thread->start_event);
2929
2930 /* Allocate a Python thread state for this thread */
2931 state = PyGILState_Ensure();
2932
2933 res = PyObject_CallFunction(test_c_thread->callback, "", NULL);
2934 Py_CLEAR(test_c_thread->callback);
2935
2936 if (res == NULL) {
2937 PyErr_Print();
2938 }
2939 else {
2940 Py_DECREF(res);
2941 }
2942
2943 /* Destroy the Python thread state for this thread */
2944 PyGILState_Release(state);
2945
2946 PyThread_release_lock(test_c_thread->exit_event);
2947
2948 PyThread_exit_thread();
2949}
2950
2951static PyObject *
2952call_in_temporary_c_thread(PyObject *self, PyObject *callback)
2953{
2954 PyObject *res = NULL;
2955 test_c_thread_t test_c_thread;
2956 long thread;
2957
2958 PyEval_InitThreads();
2959
2960 test_c_thread.start_event = PyThread_allocate_lock();
2961 test_c_thread.exit_event = PyThread_allocate_lock();
2962 test_c_thread.callback = NULL;
2963 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
2964 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
2965 goto exit;
2966 }
2967
2968 Py_INCREF(callback);
2969 test_c_thread.callback = callback;
2970
2971 PyThread_acquire_lock(test_c_thread.start_event, 1);
2972 PyThread_acquire_lock(test_c_thread.exit_event, 1);
2973
2974 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
2975 if (thread == -1) {
2976 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
2977 PyThread_release_lock(test_c_thread.start_event);
2978 PyThread_release_lock(test_c_thread.exit_event);
2979 goto exit;
2980 }
2981
2982 PyThread_acquire_lock(test_c_thread.start_event, 1);
2983 PyThread_release_lock(test_c_thread.start_event);
2984
2985 Py_BEGIN_ALLOW_THREADS
2986 PyThread_acquire_lock(test_c_thread.exit_event, 1);
2987 PyThread_release_lock(test_c_thread.exit_event);
2988 Py_END_ALLOW_THREADS
2989
2990 Py_INCREF(Py_None);
2991 res = Py_None;
2992
2993exit:
2994 Py_CLEAR(test_c_thread.callback);
2995 if (test_c_thread.start_event)
2996 PyThread_free_lock(test_c_thread.start_event);
2997 if (test_c_thread.exit_event)
2998 PyThread_free_lock(test_c_thread.exit_event);
2999 return res;
3000}
Victor Stinner258e4d32013-12-13 02:30:12 +01003001#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003002
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003003
Tim Peters9ea17ac2001-02-02 05:57:15 +00003004static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003005 {"raise_exception", raise_exception, METH_VARARGS},
3006 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
3007 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01003008 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003009 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
3010 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
3011 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
3012 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003013 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003014 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
3015 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
3016 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
3017 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02003018 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
3020 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02003021 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
3022 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003023 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
3024 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
3025 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07003026 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003027 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
3028 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
3029 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
3030 PyDoc_STR("This is a pretty normal docstring.")},
3031 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
3032 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
3033 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
3034 {"getargs_tuple", getargs_tuple, METH_VARARGS},
3035 {"getargs_keywords", (PyCFunction)getargs_keywords,
3036 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00003037 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
3038 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 {"getargs_b", getargs_b, METH_VARARGS},
3040 {"getargs_B", getargs_B, METH_VARARGS},
3041 {"getargs_h", getargs_h, METH_VARARGS},
3042 {"getargs_H", getargs_H, METH_VARARGS},
3043 {"getargs_I", getargs_I, METH_VARARGS},
3044 {"getargs_k", getargs_k, METH_VARARGS},
3045 {"getargs_i", getargs_i, METH_VARARGS},
3046 {"getargs_l", getargs_l, METH_VARARGS},
3047 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07003048 {"getargs_p", getargs_p, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00003049#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003050 {"getargs_L", getargs_L, METH_VARARGS},
3051 {"getargs_K", getargs_K, METH_VARARGS},
3052 {"test_longlong_api", test_longlong_api, METH_NOARGS},
3053 {"test_long_long_and_overflow",
3054 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
3055 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003056#endif
Eli Bendersky906b88f2011-07-29 07:05:08 +03003057 {"getargs_c", getargs_c, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003058 {"getargs_s", getargs_s, METH_VARARGS},
3059 {"getargs_s_star", getargs_s_star, METH_VARARGS},
3060 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
3061 {"getargs_z", getargs_z, METH_VARARGS},
3062 {"getargs_z_star", getargs_z_star, METH_VARARGS},
3063 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
3064 {"getargs_y", getargs_y, METH_VARARGS},
3065 {"getargs_y_star", getargs_y_star, METH_VARARGS},
3066 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
3067 {"getargs_u", getargs_u, METH_VARARGS},
3068 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
3069 {"getargs_Z", getargs_Z, METH_VARARGS},
3070 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00003071 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003073 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003075 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
3077 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
3078 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
3079 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01003080 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
3081 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
3082 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
3083 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01003084 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003085#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00003086 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003088#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00003089#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00003090 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00003091#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00003092 {"traceback_print", traceback_print, METH_VARARGS},
3093 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02003094 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00003095 {"argparsing", argparsing, METH_VARARGS},
3096 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
3098 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003099 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
3100 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003101 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003102 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01003103 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
3104 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01003105 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02003106 {"with_tp_del", with_tp_del, METH_VARARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02003107 {"test_pymem",
3108 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
3109 {"test_pymem_alloc0",
3110 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
3111 {"test_pymem_setallocators",
3112 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
3113 {"test_pyobject_setallocators",
3114 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003115 {"no_docstring",
3116 (PyCFunction)test_with_docstring, METH_NOARGS},
3117 {"docstring_empty",
3118 (PyCFunction)test_with_docstring, METH_NOARGS,
3119 docstring_empty},
3120 {"docstring_no_signature",
3121 (PyCFunction)test_with_docstring, METH_NOARGS,
3122 docstring_no_signature},
3123 {"docstring_with_invalid_signature",
3124 (PyCFunction)test_with_docstring, METH_NOARGS,
3125 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08003126 {"docstring_with_invalid_signature2",
3127 (PyCFunction)test_with_docstring, METH_NOARGS,
3128 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003129 {"docstring_with_signature",
3130 (PyCFunction)test_with_docstring, METH_NOARGS,
3131 docstring_with_signature},
3132 {"docstring_with_signature_and_extra_newlines",
3133 (PyCFunction)test_with_docstring, METH_NOARGS,
3134 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08003135 {"docstring_with_signature_with_defaults",
3136 (PyCFunction)test_with_docstring, METH_NOARGS,
3137 docstring_with_signature_with_defaults},
Victor Stinner258e4d32013-12-13 02:30:12 +01003138#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003139 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
3140 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01003141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003142 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00003143};
3144
Thomas Hellera4ea6032003-04-17 18:55:45 +00003145#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
3146
Thomas Wouters89f507f2006-12-13 04:49:30 +00003147typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 char bool_member;
3149 char byte_member;
3150 unsigned char ubyte_member;
3151 short short_member;
3152 unsigned short ushort_member;
3153 int int_member;
3154 unsigned int uint_member;
3155 long long_member;
3156 unsigned long ulong_member;
3157 Py_ssize_t pyssizet_member;
3158 float float_member;
3159 double double_member;
3160 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003161#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003162 PY_LONG_LONG longlong_member;
3163 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003164#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003165} all_structmembers;
3166
3167typedef struct {
3168 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003170} test_structmembers;
3171
3172static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003173 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
3174 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
3175 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
3176 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
3177 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
3178 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
3179 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
3180 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
3181 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
3182 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
3183 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
3184 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
3185 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003186#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003187 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
3188 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003190 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00003191};
3192
3193
Christian Heimes1af737c2008-01-23 08:24:23 +00003194static PyObject *
3195test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
3196{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003197 static char *keywords[] = {
3198 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
3199 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
3200 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00003201#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003202 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00003203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003204 NULL};
3205 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00003206#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003207 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00003208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 ;
3210 test_structmembers *ob;
3211 const char *s = NULL;
3212 Py_ssize_t string_len = 0;
3213 ob = PyObject_New(test_structmembers, type);
3214 if (ob == NULL)
3215 return NULL;
3216 memset(&ob->structmembers, 0, sizeof(all_structmembers));
3217 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
3218 &ob->structmembers.bool_member,
3219 &ob->structmembers.byte_member,
3220 &ob->structmembers.ubyte_member,
3221 &ob->structmembers.short_member,
3222 &ob->structmembers.ushort_member,
3223 &ob->structmembers.int_member,
3224 &ob->structmembers.uint_member,
3225 &ob->structmembers.long_member,
3226 &ob->structmembers.ulong_member,
3227 &ob->structmembers.pyssizet_member,
3228 &ob->structmembers.float_member,
3229 &ob->structmembers.double_member,
3230 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00003231#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003232 , &ob->structmembers.longlong_member,
3233 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00003234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 )) {
3236 Py_DECREF(ob);
3237 return NULL;
3238 }
3239 if (s != NULL) {
3240 if (string_len > 5) {
3241 Py_DECREF(ob);
3242 PyErr_SetString(PyExc_ValueError, "string too long");
3243 return NULL;
3244 }
3245 strcpy(ob->structmembers.inplace_member, s);
3246 }
3247 else {
3248 strcpy(ob->structmembers.inplace_member, "");
3249 }
3250 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003251}
3252
Christian Heimes1af737c2008-01-23 08:24:23 +00003253static void
3254test_structmembers_free(PyObject *ob)
3255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003256 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003257}
3258
3259static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003260 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003261 "test_structmembersType",
3262 sizeof(test_structmembers), /* tp_basicsize */
3263 0, /* tp_itemsize */
3264 test_structmembers_free, /* destructor tp_dealloc */
3265 0, /* tp_print */
3266 0, /* tp_getattr */
3267 0, /* tp_setattr */
3268 0, /* tp_reserved */
3269 0, /* tp_repr */
3270 0, /* tp_as_number */
3271 0, /* tp_as_sequence */
3272 0, /* tp_as_mapping */
3273 0, /* tp_hash */
3274 0, /* tp_call */
3275 0, /* tp_str */
3276 PyObject_GenericGetAttr, /* tp_getattro */
3277 PyObject_GenericSetAttr, /* tp_setattro */
3278 0, /* tp_as_buffer */
3279 0, /* tp_flags */
3280 "Type containing all structmember types",
3281 0, /* traverseproc tp_traverse */
3282 0, /* tp_clear */
3283 0, /* tp_richcompare */
3284 0, /* tp_weaklistoffset */
3285 0, /* tp_iter */
3286 0, /* tp_iternext */
3287 0, /* tp_methods */
3288 test_members, /* tp_members */
3289 0,
3290 0,
3291 0,
3292 0,
3293 0,
3294 0,
3295 0,
3296 0,
3297 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003298};
3299
3300
Benjamin Petersond51374e2014-04-09 23:55:56 -04003301typedef struct {
3302 PyObject_HEAD
3303} matmulObject;
3304
3305static PyObject *
3306matmulType_matmul(PyObject *self, PyObject *other)
3307{
3308 return Py_BuildValue("(sOO)", "matmul", self, other);
3309}
3310
3311static PyObject *
3312matmulType_imatmul(PyObject *self, PyObject *other)
3313{
3314 return Py_BuildValue("(sOO)", "imatmul", self, other);
3315}
3316
3317static void
3318matmulType_dealloc(PyObject *self)
3319{
Zachary Ware420dc562014-04-23 13:51:27 -05003320 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04003321}
3322
3323static PyNumberMethods matmulType_as_number = {
3324 0, /* nb_add */
3325 0, /* nb_subtract */
3326 0, /* nb_multiply */
3327 0, /* nb_remainde r*/
3328 0, /* nb_divmod */
3329 0, /* nb_power */
3330 0, /* nb_negative */
3331 0, /* tp_positive */
3332 0, /* tp_absolute */
3333 0, /* tp_bool */
3334 0, /* nb_invert */
3335 0, /* nb_lshift */
3336 0, /* nb_rshift */
3337 0, /* nb_and */
3338 0, /* nb_xor */
3339 0, /* nb_or */
3340 0, /* nb_int */
3341 0, /* nb_reserved */
3342 0, /* nb_float */
3343 0, /* nb_inplace_add */
3344 0, /* nb_inplace_subtract */
3345 0, /* nb_inplace_multiply */
3346 0, /* nb_inplace_remainder */
3347 0, /* nb_inplace_power */
3348 0, /* nb_inplace_lshift */
3349 0, /* nb_inplace_rshift */
3350 0, /* nb_inplace_and */
3351 0, /* nb_inplace_xor */
3352 0, /* nb_inplace_or */
3353 0, /* nb_floor_divide */
3354 0, /* nb_true_divide */
3355 0, /* nb_inplace_floor_divide */
3356 0, /* nb_inplace_true_divide */
3357 0, /* nb_index */
3358 matmulType_matmul, /* nb_matrix_multiply */
3359 matmulType_imatmul /* nb_matrix_inplace_multiply */
3360};
3361
3362static PyTypeObject matmulType = {
3363 PyVarObject_HEAD_INIT(NULL, 0)
3364 "matmulType",
3365 sizeof(matmulObject), /* tp_basicsize */
3366 0, /* tp_itemsize */
3367 matmulType_dealloc, /* destructor tp_dealloc */
3368 0, /* tp_print */
3369 0, /* tp_getattr */
3370 0, /* tp_setattr */
3371 0, /* tp_reserved */
3372 0, /* tp_repr */
3373 &matmulType_as_number, /* tp_as_number */
3374 0, /* tp_as_sequence */
3375 0, /* tp_as_mapping */
3376 0, /* tp_hash */
3377 0, /* tp_call */
3378 0, /* tp_str */
3379 PyObject_GenericGetAttr, /* tp_getattro */
3380 PyObject_GenericSetAttr, /* tp_setattro */
3381 0, /* tp_as_buffer */
3382 0, /* tp_flags */
3383 "C level type with matrix operations defined",
3384 0, /* traverseproc tp_traverse */
3385 0, /* tp_clear */
3386 0, /* tp_richcompare */
3387 0, /* tp_weaklistoffset */
3388 0, /* tp_iter */
3389 0, /* tp_iternext */
3390 0, /* tp_methods */
3391 0, /* tp_members */
3392 0,
3393 0,
3394 0,
3395 0,
3396 0,
3397 0,
3398 0,
3399 0,
3400 PyType_GenericNew, /* tp_new */
3401 PyObject_Del, /* tp_free */
3402};
3403
Martin v. Löwis1a214512008-06-11 05:26:20 +00003404
3405static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003406 PyModuleDef_HEAD_INIT,
3407 "_testcapi",
3408 NULL,
3409 -1,
3410 TestMethods,
3411 NULL,
3412 NULL,
3413 NULL,
3414 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003415};
3416
Mark Hammond62b1ab12002-07-23 06:31:15 +00003417PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003418PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00003419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003420 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003422 m = PyModule_Create(&_testcapimodule);
3423 if (m == NULL)
3424 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00003427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003428 Py_TYPE(&test_structmembersType)=&PyType_Type;
3429 Py_INCREF(&test_structmembersType);
3430 /* don't use a name starting with "test", since we don't want
3431 test_capi to automatically call this */
3432 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04003433 if (PyType_Ready(&matmulType) < 0)
3434 return NULL;
3435 Py_INCREF(&matmulType);
3436 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003438 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
3439 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
3440 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
3441 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
3442 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
3443 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
3444 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
3445 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
3446 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
3447 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
3448 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
3449 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
3450 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
3451 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
3452 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
3453 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
3454 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
3455 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
3456 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
3457 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
3458 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
3459 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
3460 Py_INCREF(&PyInstanceMethod_Type);
3461 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00003462
Larry Hastings2a727912014-01-16 11:32:01 -08003463 PyModule_AddIntConstant(m, "the_number_three", 3);
3464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003465 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
3466 Py_INCREF(TestError);
3467 PyModule_AddObject(m, "error", TestError);
3468 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003469}