blob: b8e1dbc4f9d2b72cfb695db96adf860c7e13c588 [file] [log] [blame]
Tim Peters9ea17ac2001-02-02 05:57:15 +00001/*
2 * C Extension module to test Python interpreter C APIs.
3 *
4 * The 'test_*' functions exported by this module are run as part of the
5 * standard Python regression test, via Lib/test/test_capi.py.
6 */
7
Neal Norwitz8866e0a2007-10-27 04:01:17 +00008#define PY_SSIZE_T_CLEAN
9
Tim Peters9ea17ac2001-02-02 05:57:15 +000010#include "Python.h"
Thomas Wouters89f507f2006-12-13 04:49:30 +000011#include <float.h>
12#include "structmember.h"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000013#include "datetime.h"
Serhiy Storchakab5181342015-02-06 08:58:56 +020014#include "marshal.h"
Victor Stinner56e8c292014-07-21 12:30:22 +020015#include <signal.h>
Tim Peters9ea17ac2001-02-02 05:57:15 +000016
Mark Hammond8d98d2c2003-04-19 15:41:53 +000017#ifdef WITH_THREAD
18#include "pythread.h"
19#endif /* WITH_THREAD */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000021
Tim Peters91621db2001-06-12 20:10:01 +000022/* Raise TestError with test_name + ": " + msg, and return NULL. */
23
24static PyObject *
25raiseTestError(const char* test_name, const char* msg)
26{
Victor Stinner6ced7c42011-03-21 18:15:42 +010027 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000028 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000029}
30
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000031/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000032
33 The ones derived from autoconf on the UNIX-like OSes can be relied
34 upon (in the absence of sloppy cross-compiling), but the Windows
35 platforms have these hardcoded. Better safe than sorry.
36*/
37static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000038sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000039 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000040{
Victor Stinner499dfcf2011-03-21 13:26:24 +010041 PyErr_Format(TestError,
42 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000045}
46
47static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000048test_config(PyObject *self)
Tim Peters9ea17ac2001-02-02 05:57:15 +000049{
Tim Peters9ea17ac2001-02-02 05:57:15 +000050#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051 if (FATNAME != sizeof(TYPE)) \
52 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 CHECK_SIZEOF(SIZEOF_SHORT, short);
55 CHECK_SIZEOF(SIZEOF_INT, int);
56 CHECK_SIZEOF(SIZEOF_LONG, long);
57 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
58 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Tim Peters9ea17ac2001-02-02 05:57:15 +000059#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
Tim Peters9ea17ac2001-02-02 05:57:15 +000061#endif
62
63#undef CHECK_SIZEOF
64
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 Py_INCREF(Py_None);
66 return Py_None;
Tim Peters9ea17ac2001-02-02 05:57:15 +000067}
68
Tim Peters5c4d5bf2001-02-12 22:13:26 +000069static PyObject*
Victor Stinner01076552013-10-29 19:39:52 +010070test_sizeof_c_types(PyObject *self)
71{
Ned Deilye37a1942015-03-05 15:47:10 -080072#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020073#pragma GCC diagnostic push
74#pragma GCC diagnostic ignored "-Wtype-limits"
75#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010076#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010077 if (EXPECTED != sizeof(TYPE)) { \
78 PyErr_Format(TestError, \
79 "sizeof(%s) = %u instead of %u", \
80 #TYPE, sizeof(TYPE), EXPECTED); \
81 return (PyObject*)NULL; \
82 }
Victor Stinnerf866f972013-10-29 19:59:31 +010083#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
84#define CHECK_SIGNNESS(TYPE, SIGNED) \
85 if (IS_SIGNED(TYPE) != SIGNED) { \
86 PyErr_Format(TestError, \
87 "%s signness is, instead of %i", \
88 #TYPE, IS_SIGNED(TYPE), SIGNED); \
89 return (PyObject*)NULL; \
90 }
Victor Stinner01076552013-10-29 19:39:52 +010091
92 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +010093 CHECK_SIZEOF(Py_UCS1, 1);
94 CHECK_SIZEOF(Py_UCS2, 2);
95 CHECK_SIZEOF(Py_UCS4, 4);
96 CHECK_SIGNNESS(Py_UCS1, 0);
97 CHECK_SIGNNESS(Py_UCS2, 0);
98 CHECK_SIGNNESS(Py_UCS4, 0);
Victor Stinner01076552013-10-29 19:39:52 +010099#ifdef HAVE_INT32_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100100 CHECK_SIZEOF(PY_INT32_T, 4);
101 CHECK_SIGNNESS(PY_INT32_T, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100102#endif
103#ifdef HAVE_UINT32_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100104 CHECK_SIZEOF(PY_UINT32_T, 4);
105 CHECK_SIGNNESS(PY_UINT32_T, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100106#endif
107#ifdef HAVE_INT64_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100108 CHECK_SIZEOF(PY_INT64_T, 8);
109 CHECK_SIGNNESS(PY_INT64_T, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100110#endif
111#ifdef HAVE_UINT64_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100112 CHECK_SIZEOF(PY_UINT64_T, 8);
113 CHECK_SIGNNESS(PY_UINT64_T, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100114#endif
115
116 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100117 CHECK_SIZEOF(size_t, sizeof(void *));
118 CHECK_SIGNNESS(size_t, 0);
119 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
120 CHECK_SIGNNESS(Py_ssize_t, 1);
121
122 CHECK_SIZEOF(Py_uintptr_t, sizeof(void *));
123 CHECK_SIGNNESS(Py_uintptr_t, 0);
124 CHECK_SIZEOF(Py_intptr_t, sizeof(void *));
125 CHECK_SIGNNESS(Py_intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100126
127 Py_INCREF(Py_None);
128 return Py_None;
129
Victor Stinnerf866f972013-10-29 19:59:31 +0100130#undef IS_SIGNED
131#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100132#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800133#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200134#pragma GCC diagnostic pop
135#endif
Victor Stinner01076552013-10-29 19:39:52 +0100136}
137
138
139static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000140test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000141{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 PyObject* list;
143 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000146#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 list = PyList_New(NLIST);
148 if (list == (PyObject*)NULL)
149 return (PyObject*)NULL;
150 /* list = range(NLIST) */
151 for (i = 0; i < NLIST; ++i) {
152 PyObject* anint = PyLong_FromLong(i);
153 if (anint == (PyObject*)NULL) {
154 Py_DECREF(list);
155 return (PyObject*)NULL;
156 }
157 PyList_SET_ITEM(list, i, anint);
158 }
159 /* list.reverse(), via PyList_Reverse() */
160 i = PyList_Reverse(list); /* should not blow up! */
161 if (i != 0) {
162 Py_DECREF(list);
163 return (PyObject*)NULL;
164 }
165 /* Check that list == range(29, -1, -1) now */
166 for (i = 0; i < NLIST; ++i) {
167 PyObject* anint = PyList_GET_ITEM(list, i);
168 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
169 PyErr_SetString(TestError,
170 "test_list_api: reverse screwed up");
171 Py_DECREF(list);
172 return (PyObject*)NULL;
173 }
174 }
175 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000176#undef NLIST
177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 Py_INCREF(Py_None);
179 return Py_None;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000180}
181
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000182static int
183test_dict_inner(int count)
184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 Py_ssize_t pos = 0, iterations = 0;
186 int i;
187 PyObject *dict = PyDict_New();
188 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 if (dict == NULL)
191 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193 for (i = 0; i < count; i++) {
194 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200195 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200196 return -1;
197 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200198 if (PyDict_SetItem(dict, v, v) < 0) {
199 Py_DECREF(v);
200 return -1;
201 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 Py_DECREF(v);
203 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000205 while (PyDict_Next(dict, &pos, &k, &v)) {
206 PyObject *o;
207 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 i = PyLong_AS_LONG(v) + 1;
210 o = PyLong_FromLong(i);
211 if (o == NULL)
212 return -1;
213 if (PyDict_SetItem(dict, k, o) < 0) {
214 Py_DECREF(o);
215 return -1;
216 }
217 Py_DECREF(o);
218 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 if (iterations != count) {
223 PyErr_SetString(
224 TestError,
225 "test_dict_iteration: dict iteration went wrong ");
226 return -1;
227 } else {
228 return 0;
229 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000230}
231
232static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000233test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 for (i = 0; i < 200; i++) {
238 if (test_dict_inner(i) < 0) {
239 return NULL;
240 }
241 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 Py_INCREF(Py_None);
244 return Py_None;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000245}
246
Tim Peters91621db2001-06-12 20:10:01 +0000247
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000248/* Issue #4701: Check that PyObject_Hash implicitly calls
249 * PyType_Ready if it hasn't already been called
250 */
251static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 PyVarObject_HEAD_INIT(NULL, 0)
253 "hashinheritancetester", /* Name of this type */
254 sizeof(PyObject), /* Basic object size */
255 0, /* Item size for varobject */
256 (destructor)PyObject_Del, /* tp_dealloc */
257 0, /* tp_print */
258 0, /* tp_getattr */
259 0, /* tp_setattr */
260 0, /* tp_reserved */
261 0, /* tp_repr */
262 0, /* tp_as_number */
263 0, /* tp_as_sequence */
264 0, /* tp_as_mapping */
265 0, /* tp_hash */
266 0, /* tp_call */
267 0, /* tp_str */
268 PyObject_GenericGetAttr, /* tp_getattro */
269 0, /* tp_setattro */
270 0, /* tp_as_buffer */
271 Py_TPFLAGS_DEFAULT, /* tp_flags */
272 0, /* tp_doc */
273 0, /* tp_traverse */
274 0, /* tp_clear */
275 0, /* tp_richcompare */
276 0, /* tp_weaklistoffset */
277 0, /* tp_iter */
278 0, /* tp_iternext */
279 0, /* tp_methods */
280 0, /* tp_members */
281 0, /* tp_getset */
282 0, /* tp_base */
283 0, /* tp_dict */
284 0, /* tp_descr_get */
285 0, /* tp_descr_set */
286 0, /* tp_dictoffset */
287 0, /* tp_init */
288 0, /* tp_alloc */
289 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000290};
291
292static PyObject*
293test_lazy_hash_inheritance(PyObject* self)
294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 PyTypeObject *type;
296 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000297 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 if (type->tp_dict != NULL)
302 /* The type has already been initialized. This probably means
303 -R is being used. */
304 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000305
306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 obj = PyObject_New(PyObject, type);
308 if (obj == NULL) {
309 PyErr_Clear();
310 PyErr_SetString(
311 TestError,
312 "test_lazy_hash_inheritance: failed to create object");
313 return NULL;
314 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 if (type->tp_dict != NULL) {
317 PyErr_SetString(
318 TestError,
319 "test_lazy_hash_inheritance: type initialised too soon");
320 Py_DECREF(obj);
321 return NULL;
322 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 hash = PyObject_Hash(obj);
325 if ((hash == -1) && PyErr_Occurred()) {
326 PyErr_Clear();
327 PyErr_SetString(
328 TestError,
329 "test_lazy_hash_inheritance: could not hash object");
330 Py_DECREF(obj);
331 return NULL;
332 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 if (type->tp_dict == NULL) {
335 PyErr_SetString(
336 TestError,
337 "test_lazy_hash_inheritance: type not initialised by hash()");
338 Py_DECREF(obj);
339 return NULL;
340 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 if (type->tp_hash != PyType_Type.tp_hash) {
343 PyErr_SetString(
344 TestError,
345 "test_lazy_hash_inheritance: unexpected hash function");
346 Py_DECREF(obj);
347 return NULL;
348 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000353}
354
355
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000356/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
Tim Petersff70d3c2001-06-14 01:11:03 +0000357 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000358
359 Note that the meat of the test is contained in testcapi_long.h.
360 This is revolting, but delicate code duplication is worse: "almost
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000361 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000362 dependence on type names makes it impossible to use a parameterized
363 function. A giant macro would be even worse than this. A C++ template
364 would be perfect.
365
366 The "report an error" functions are deliberately not part of the #include
367 file: if the test fails, you can set a breakpoint in the appropriate
368 error function directly, and crawl back from there in the debugger.
369*/
370
371#define UNBIND(X) Py_DECREF(X); (X) = NULL
372
373static PyObject *
374raise_test_long_error(const char* msg)
375{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000377}
378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379#define TESTNAME test_long_api_inner
380#define TYPENAME long
381#define F_S_TO_PY PyLong_FromLong
382#define F_PY_TO_S PyLong_AsLong
383#define F_U_TO_PY PyLong_FromUnsignedLong
384#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000385
386#include "testcapi_long.h"
387
388static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000389test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000392}
393
394#undef TESTNAME
395#undef TYPENAME
396#undef F_S_TO_PY
397#undef F_PY_TO_S
398#undef F_U_TO_PY
399#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000400
401#ifdef HAVE_LONG_LONG
Tim Peters91621db2001-06-12 20:10:01 +0000402
403static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000404raise_test_longlong_error(const char* msg)
405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000407}
408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409#define TESTNAME test_longlong_api_inner
410#define TYPENAME PY_LONG_LONG
411#define F_S_TO_PY PyLong_FromLongLong
412#define F_PY_TO_S PyLong_AsLongLong
413#define F_U_TO_PY PyLong_FromUnsignedLongLong
414#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000415
416#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000417
418static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000419test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000420{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000422}
423
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000424#undef TESTNAME
425#undef TYPENAME
426#undef F_S_TO_PY
427#undef F_PY_TO_S
428#undef F_U_TO_PY
429#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000430
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000431/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
432 is tested by test_long_api_inner. This test will concentrate on proper
433 handling of overflow.
434*/
435
436static PyObject *
437test_long_and_overflow(PyObject *self)
438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 PyObject *num, *one, *temp;
440 long value;
441 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 /* Test that overflow is set properly for a large value. */
444 /* num is a number larger than LONG_MAX even on 64-bit platforms */
445 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
446 if (num == NULL)
447 return NULL;
448 overflow = 1234;
449 value = PyLong_AsLongAndOverflow(num, &overflow);
450 Py_DECREF(num);
451 if (value == -1 && PyErr_Occurred())
452 return NULL;
453 if (value != -1)
454 return raiseTestError("test_long_and_overflow",
455 "return value was not set to -1");
456 if (overflow != 1)
457 return raiseTestError("test_long_and_overflow",
458 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 /* Same again, with num = LONG_MAX + 1 */
461 num = PyLong_FromLong(LONG_MAX);
462 if (num == NULL)
463 return NULL;
464 one = PyLong_FromLong(1L);
465 if (one == NULL) {
466 Py_DECREF(num);
467 return NULL;
468 }
469 temp = PyNumber_Add(num, one);
470 Py_DECREF(one);
471 Py_DECREF(num);
472 num = temp;
473 if (num == NULL)
474 return NULL;
475 overflow = 0;
476 value = PyLong_AsLongAndOverflow(num, &overflow);
477 Py_DECREF(num);
478 if (value == -1 && PyErr_Occurred())
479 return NULL;
480 if (value != -1)
481 return raiseTestError("test_long_and_overflow",
482 "return value was not set to -1");
483 if (overflow != 1)
484 return raiseTestError("test_long_and_overflow",
485 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 /* Test that overflow is set properly for a large negative value. */
488 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
489 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
490 if (num == NULL)
491 return NULL;
492 overflow = 1234;
493 value = PyLong_AsLongAndOverflow(num, &overflow);
494 Py_DECREF(num);
495 if (value == -1 && PyErr_Occurred())
496 return NULL;
497 if (value != -1)
498 return raiseTestError("test_long_and_overflow",
499 "return value was not set to -1");
500 if (overflow != -1)
501 return raiseTestError("test_long_and_overflow",
502 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 /* Same again, with num = LONG_MIN - 1 */
505 num = PyLong_FromLong(LONG_MIN);
506 if (num == NULL)
507 return NULL;
508 one = PyLong_FromLong(1L);
509 if (one == NULL) {
510 Py_DECREF(num);
511 return NULL;
512 }
513 temp = PyNumber_Subtract(num, one);
514 Py_DECREF(one);
515 Py_DECREF(num);
516 num = temp;
517 if (num == NULL)
518 return NULL;
519 overflow = 0;
520 value = PyLong_AsLongAndOverflow(num, &overflow);
521 Py_DECREF(num);
522 if (value == -1 && PyErr_Occurred())
523 return NULL;
524 if (value != -1)
525 return raiseTestError("test_long_and_overflow",
526 "return value was not set to -1");
527 if (overflow != -1)
528 return raiseTestError("test_long_and_overflow",
529 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 /* Test that overflow is cleared properly for small values. */
532 num = PyLong_FromString("FF", NULL, 16);
533 if (num == NULL)
534 return NULL;
535 overflow = 1234;
536 value = PyLong_AsLongAndOverflow(num, &overflow);
537 Py_DECREF(num);
538 if (value == -1 && PyErr_Occurred())
539 return NULL;
540 if (value != 0xFF)
541 return raiseTestError("test_long_and_overflow",
542 "expected return value 0xFF");
543 if (overflow != 0)
544 return raiseTestError("test_long_and_overflow",
545 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 num = PyLong_FromString("-FF", NULL, 16);
548 if (num == NULL)
549 return NULL;
550 overflow = 0;
551 value = PyLong_AsLongAndOverflow(num, &overflow);
552 Py_DECREF(num);
553 if (value == -1 && PyErr_Occurred())
554 return NULL;
555 if (value != -0xFF)
556 return raiseTestError("test_long_and_overflow",
557 "expected return value 0xFF");
558 if (overflow != 0)
559 return raiseTestError("test_long_and_overflow",
560 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 num = PyLong_FromLong(LONG_MAX);
563 if (num == NULL)
564 return NULL;
565 overflow = 1234;
566 value = PyLong_AsLongAndOverflow(num, &overflow);
567 Py_DECREF(num);
568 if (value == -1 && PyErr_Occurred())
569 return NULL;
570 if (value != LONG_MAX)
571 return raiseTestError("test_long_and_overflow",
572 "expected return value LONG_MAX");
573 if (overflow != 0)
574 return raiseTestError("test_long_and_overflow",
575 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 num = PyLong_FromLong(LONG_MIN);
578 if (num == NULL)
579 return NULL;
580 overflow = 0;
581 value = PyLong_AsLongAndOverflow(num, &overflow);
582 Py_DECREF(num);
583 if (value == -1 && PyErr_Occurred())
584 return NULL;
585 if (value != LONG_MIN)
586 return raiseTestError("test_long_and_overflow",
587 "expected return value LONG_MIN");
588 if (overflow != 0)
589 return raiseTestError("test_long_and_overflow",
590 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 Py_INCREF(Py_None);
593 return Py_None;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000594}
595
Mark Dickinson93f562c2010-01-30 10:30:15 +0000596/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
597 PY_LONG_LONG is tested by test_long_api_inner. This test will
598 concentrate on proper handling of overflow.
599*/
600
601static PyObject *
602test_long_long_and_overflow(PyObject *self)
603{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 PyObject *num, *one, *temp;
605 PY_LONG_LONG value;
606 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 /* Test that overflow is set properly for a large value. */
609 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
610 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
611 if (num == NULL)
612 return NULL;
613 overflow = 1234;
614 value = PyLong_AsLongLongAndOverflow(num, &overflow);
615 Py_DECREF(num);
616 if (value == -1 && PyErr_Occurred())
617 return NULL;
618 if (value != -1)
619 return raiseTestError("test_long_long_and_overflow",
620 "return value was not set to -1");
621 if (overflow != 1)
622 return raiseTestError("test_long_long_and_overflow",
623 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 /* Same again, with num = PY_LLONG_MAX + 1 */
626 num = PyLong_FromLongLong(PY_LLONG_MAX);
627 if (num == NULL)
628 return NULL;
629 one = PyLong_FromLong(1L);
630 if (one == NULL) {
631 Py_DECREF(num);
632 return NULL;
633 }
634 temp = PyNumber_Add(num, one);
635 Py_DECREF(one);
636 Py_DECREF(num);
637 num = temp;
638 if (num == NULL)
639 return NULL;
640 overflow = 0;
641 value = PyLong_AsLongLongAndOverflow(num, &overflow);
642 Py_DECREF(num);
643 if (value == -1 && PyErr_Occurred())
644 return NULL;
645 if (value != -1)
646 return raiseTestError("test_long_long_and_overflow",
647 "return value was not set to -1");
648 if (overflow != 1)
649 return raiseTestError("test_long_long_and_overflow",
650 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 /* Test that overflow is set properly for a large negative value. */
653 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
654 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
655 if (num == NULL)
656 return NULL;
657 overflow = 1234;
658 value = PyLong_AsLongLongAndOverflow(num, &overflow);
659 Py_DECREF(num);
660 if (value == -1 && PyErr_Occurred())
661 return NULL;
662 if (value != -1)
663 return raiseTestError("test_long_long_and_overflow",
664 "return value was not set to -1");
665 if (overflow != -1)
666 return raiseTestError("test_long_long_and_overflow",
667 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 /* Same again, with num = PY_LLONG_MIN - 1 */
670 num = PyLong_FromLongLong(PY_LLONG_MIN);
671 if (num == NULL)
672 return NULL;
673 one = PyLong_FromLong(1L);
674 if (one == NULL) {
675 Py_DECREF(num);
676 return NULL;
677 }
678 temp = PyNumber_Subtract(num, one);
679 Py_DECREF(one);
680 Py_DECREF(num);
681 num = temp;
682 if (num == NULL)
683 return NULL;
684 overflow = 0;
685 value = PyLong_AsLongLongAndOverflow(num, &overflow);
686 Py_DECREF(num);
687 if (value == -1 && PyErr_Occurred())
688 return NULL;
689 if (value != -1)
690 return raiseTestError("test_long_long_and_overflow",
691 "return value was not set to -1");
692 if (overflow != -1)
693 return raiseTestError("test_long_long_and_overflow",
694 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 /* Test that overflow is cleared properly for small values. */
697 num = PyLong_FromString("FF", NULL, 16);
698 if (num == NULL)
699 return NULL;
700 overflow = 1234;
701 value = PyLong_AsLongLongAndOverflow(num, &overflow);
702 Py_DECREF(num);
703 if (value == -1 && PyErr_Occurred())
704 return NULL;
705 if (value != 0xFF)
706 return raiseTestError("test_long_long_and_overflow",
707 "expected return value 0xFF");
708 if (overflow != 0)
709 return raiseTestError("test_long_long_and_overflow",
710 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 num = PyLong_FromString("-FF", NULL, 16);
713 if (num == NULL)
714 return NULL;
715 overflow = 0;
716 value = PyLong_AsLongLongAndOverflow(num, &overflow);
717 Py_DECREF(num);
718 if (value == -1 && PyErr_Occurred())
719 return NULL;
720 if (value != -0xFF)
721 return raiseTestError("test_long_long_and_overflow",
722 "expected return value 0xFF");
723 if (overflow != 0)
724 return raiseTestError("test_long_long_and_overflow",
725 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 num = PyLong_FromLongLong(PY_LLONG_MAX);
728 if (num == NULL)
729 return NULL;
730 overflow = 1234;
731 value = PyLong_AsLongLongAndOverflow(num, &overflow);
732 Py_DECREF(num);
733 if (value == -1 && PyErr_Occurred())
734 return NULL;
735 if (value != PY_LLONG_MAX)
736 return raiseTestError("test_long_long_and_overflow",
737 "expected return value PY_LLONG_MAX");
738 if (overflow != 0)
739 return raiseTestError("test_long_long_and_overflow",
740 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 num = PyLong_FromLongLong(PY_LLONG_MIN);
743 if (num == NULL)
744 return NULL;
745 overflow = 0;
746 value = PyLong_AsLongLongAndOverflow(num, &overflow);
747 Py_DECREF(num);
748 if (value == -1 && PyErr_Occurred())
749 return NULL;
750 if (value != PY_LLONG_MIN)
751 return raiseTestError("test_long_long_and_overflow",
752 "expected return value PY_LLONG_MIN");
753 if (overflow != 0)
754 return raiseTestError("test_long_long_and_overflow",
755 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 Py_INCREF(Py_None);
758 return Py_None;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000759}
760
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200761/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
762 non-integer arguments are handled correctly. It should be extended to
763 test overflow handling.
764 */
765
766static PyObject *
767test_long_as_size_t(PyObject *self)
768{
769 size_t out_u;
770 Py_ssize_t out_s;
771
772 Py_INCREF(Py_None);
773
774 out_u = PyLong_AsSize_t(Py_None);
775 if (out_u != (size_t)-1 || !PyErr_Occurred())
776 return raiseTestError("test_long_as_size_t",
777 "PyLong_AsSize_t(None) didn't complain");
778 if (!PyErr_ExceptionMatches(PyExc_TypeError))
779 return raiseTestError("test_long_as_size_t",
780 "PyLong_AsSize_t(None) raised "
781 "something other than TypeError");
782 PyErr_Clear();
783
784 out_s = PyLong_AsSsize_t(Py_None);
785 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
786 return raiseTestError("test_long_as_size_t",
787 "PyLong_AsSsize_t(None) didn't complain");
788 if (!PyErr_ExceptionMatches(PyExc_TypeError))
789 return raiseTestError("test_long_as_size_t",
790 "PyLong_AsSsize_t(None) raised "
791 "something other than TypeError");
792 PyErr_Clear();
793
794 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
795 return Py_None;
796}
797
798/* Test the PyLong_AsDouble API. At present this just tests that
799 non-integer arguments are handled correctly.
800 */
801
802static PyObject *
803test_long_as_double(PyObject *self)
804{
805 double out;
806
807 Py_INCREF(Py_None);
808
809 out = PyLong_AsDouble(Py_None);
810 if (out != -1.0 || !PyErr_Occurred())
811 return raiseTestError("test_long_as_double",
812 "PyLong_AsDouble(None) didn't complain");
813 if (!PyErr_ExceptionMatches(PyExc_TypeError))
814 return raiseTestError("test_long_as_double",
815 "PyLong_AsDouble(None) raised "
816 "something other than TypeError");
817 PyErr_Clear();
818
819 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
820 return Py_None;
821}
822
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000823/* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
Tim Petersd38b1c72001-09-30 05:09:37 +0000824 for both long and int arguments. The test may leak a little memory if
825 it fails.
826*/
827static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000828test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000829{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 PyObject *tuple, *num;
831 PY_LONG_LONG value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 tuple = PyTuple_New(1);
834 if (tuple == NULL)
835 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 num = PyLong_FromLong(42);
838 if (num == NULL)
839 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 value = -1;
844 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
845 return NULL;
846 if (value != 42)
847 return raiseTestError("test_L_code",
848 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 Py_DECREF(num);
851 num = PyLong_FromLong(42);
852 if (num == NULL)
853 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 value = -1;
858 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
859 return NULL;
860 if (value != 42)
861 return raiseTestError("test_L_code",
862 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 Py_DECREF(tuple);
865 Py_INCREF(Py_None);
866 return Py_None;
Tim Petersd38b1c72001-09-30 05:09:37 +0000867}
868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869#endif /* ifdef HAVE_LONG_LONG */
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000870
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000871/* Test tuple argument processing */
872static PyObject *
873getargs_tuple(PyObject *self, PyObject *args)
874{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 int a, b, c;
876 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
877 return NULL;
878 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000879}
880
Christian Heimes380f7f22008-02-28 11:19:05 +0000881/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +0000882static PyObject *
883getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +0000884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
886 static char *fmt="(ii)i|(i(ii))(iii)i";
887 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +0000888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
890 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
891 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
892 return NULL;
893 return Py_BuildValue("iiiiiiiiii",
894 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
895 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +0000896}
897
Larry Hastings83a9f482012-03-20 20:06:16 +0000898/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
899static PyObject *
900getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
901{
902 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
903 int required = -1;
904 int optional = -1;
905 int keyword_only = -1;
906
907 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
908 &required, &optional, &keyword_only))
909 return NULL;
910 return Py_BuildValue("iii", required, optional, keyword_only);
911}
912
Thomas Heller3457e4b2003-04-24 16:14:27 +0000913/* Functions to call PyArg_ParseTuple with integer format codes,
914 and return the result.
915*/
Thomas Hellera4ea6032003-04-17 18:55:45 +0000916static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000917getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000918{
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 Hellera4ea6032003-04-17 18:55:45 +0000923}
924
Thomas Heller3457e4b2003-04-24 16:14:27 +0000925static PyObject *
926getargs_B(PyObject *self, PyObject *args)
927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 unsigned char value;
929 if (!PyArg_ParseTuple(args, "B", &value))
930 return NULL;
931 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000932}
933
934static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +0000935getargs_h(PyObject *self, PyObject *args)
936{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 short value;
938 if (!PyArg_ParseTuple(args, "h", &value))
939 return NULL;
940 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +0000941}
942
943static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000944getargs_H(PyObject *self, PyObject *args)
945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 unsigned short value;
947 if (!PyArg_ParseTuple(args, "H", &value))
948 return NULL;
949 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000950}
951
952static PyObject *
953getargs_I(PyObject *self, PyObject *args)
954{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 unsigned int value;
956 if (!PyArg_ParseTuple(args, "I", &value))
957 return NULL;
958 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000959}
960
961static PyObject *
962getargs_k(PyObject *self, PyObject *args)
963{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 unsigned long value;
965 if (!PyArg_ParseTuple(args, "k", &value))
966 return NULL;
967 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000968}
969
970static PyObject *
971getargs_i(PyObject *self, PyObject *args)
972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 int value;
974 if (!PyArg_ParseTuple(args, "i", &value))
975 return NULL;
976 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000977}
978
Thomas Hellera4ea6032003-04-17 18:55:45 +0000979static PyObject *
980getargs_l(PyObject *self, PyObject *args)
981{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 long value;
983 if (!PyArg_ParseTuple(args, "l", &value))
984 return NULL;
985 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000986}
987
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000988static PyObject *
989getargs_n(PyObject *self, PyObject *args)
990{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 Py_ssize_t value;
992 if (!PyArg_ParseTuple(args, "n", &value))
993 return NULL;
994 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000995}
996
Larry Hastingsfaf91e72012-05-05 16:54:29 -0700997static PyObject *
998getargs_p(PyObject *self, PyObject *args)
999{
1000 int value;
1001 if (!PyArg_ParseTuple(args, "p", &value))
1002 return NULL;
1003 return PyLong_FromLong(value);
1004}
1005
Thomas Hellera4ea6032003-04-17 18:55:45 +00001006#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +00001007static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001008getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001009{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 PY_LONG_LONG value;
1011 if (!PyArg_ParseTuple(args, "L", &value))
1012 return NULL;
1013 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001014}
1015
Thomas Hellera4ea6032003-04-17 18:55:45 +00001016static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001017getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 unsigned PY_LONG_LONG value;
1020 if (!PyArg_ParseTuple(args, "K", &value))
1021 return NULL;
1022 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001023}
1024#endif
1025
1026/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +00001027 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001028static PyObject *
1029test_k_code(PyObject *self)
1030{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 PyObject *tuple, *num;
1032 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 tuple = PyTuple_New(1);
1035 if (tuple == NULL)
1036 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 /* a number larger than ULONG_MAX even on 64-bit platforms */
1039 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1040 if (num == NULL)
1041 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 value = PyLong_AsUnsignedLongMask(num);
1044 if (value != ULONG_MAX)
1045 return raiseTestError("test_k_code",
1046 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 value = 0;
1051 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1052 return NULL;
1053 if (value != ULONG_MAX)
1054 return raiseTestError("test_k_code",
1055 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 Py_DECREF(num);
1058 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1059 if (num == NULL)
1060 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 value = PyLong_AsUnsignedLongMask(num);
1063 if (value != (unsigned long)-0x42)
1064 return raiseTestError("test_k_code",
1065 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 value = 0;
1070 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1071 return NULL;
1072 if (value != (unsigned long)-0x42)
1073 return raiseTestError("test_k_code",
1074 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 Py_DECREF(tuple);
1077 Py_INCREF(Py_None);
1078 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001079}
1080
Victor Stinner06e49dd2010-06-13 18:21:50 +00001081static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001082getargs_c(PyObject *self, PyObject *args)
1083{
1084 char c;
1085 if (!PyArg_ParseTuple(args, "c", &c))
1086 return NULL;
1087 return PyBytes_FromStringAndSize(&c, 1);
1088}
1089
1090static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001091getargs_s(PyObject *self, PyObject *args)
1092{
1093 char *str;
1094 if (!PyArg_ParseTuple(args, "s", &str))
1095 return NULL;
1096 return PyBytes_FromString(str);
1097}
1098
1099static PyObject *
1100getargs_s_star(PyObject *self, PyObject *args)
1101{
1102 Py_buffer buffer;
1103 PyObject *bytes;
1104 if (!PyArg_ParseTuple(args, "s*", &buffer))
1105 return NULL;
1106 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1107 PyBuffer_Release(&buffer);
1108 return bytes;
1109}
1110
1111static PyObject *
1112getargs_s_hash(PyObject *self, PyObject *args)
1113{
1114 char *str;
1115 Py_ssize_t size;
1116 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1117 return NULL;
1118 return PyBytes_FromStringAndSize(str, size);
1119}
1120
1121static PyObject *
1122getargs_z(PyObject *self, PyObject *args)
1123{
1124 char *str;
1125 if (!PyArg_ParseTuple(args, "z", &str))
1126 return NULL;
1127 if (str != NULL)
1128 return PyBytes_FromString(str);
1129 else
1130 Py_RETURN_NONE;
1131}
1132
1133static PyObject *
1134getargs_z_star(PyObject *self, PyObject *args)
1135{
1136 Py_buffer buffer;
1137 PyObject *bytes;
1138 if (!PyArg_ParseTuple(args, "z*", &buffer))
1139 return NULL;
1140 if (buffer.buf != NULL)
1141 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1142 else {
1143 Py_INCREF(Py_None);
1144 bytes = Py_None;
1145 }
1146 PyBuffer_Release(&buffer);
1147 return bytes;
1148}
1149
1150static PyObject *
1151getargs_z_hash(PyObject *self, PyObject *args)
1152{
1153 char *str;
1154 Py_ssize_t size;
1155 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1156 return NULL;
1157 if (str != NULL)
1158 return PyBytes_FromStringAndSize(str, size);
1159 else
1160 Py_RETURN_NONE;
1161}
1162
1163static PyObject *
1164getargs_y(PyObject *self, PyObject *args)
1165{
1166 char *str;
1167 if (!PyArg_ParseTuple(args, "y", &str))
1168 return NULL;
1169 return PyBytes_FromString(str);
1170}
1171
1172static PyObject *
1173getargs_y_star(PyObject *self, PyObject *args)
1174{
1175 Py_buffer buffer;
1176 PyObject *bytes;
1177 if (!PyArg_ParseTuple(args, "y*", &buffer))
1178 return NULL;
1179 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1180 PyBuffer_Release(&buffer);
1181 return bytes;
1182}
1183
1184static PyObject *
1185getargs_y_hash(PyObject *self, PyObject *args)
1186{
1187 char *str;
1188 Py_ssize_t size;
1189 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1190 return NULL;
1191 return PyBytes_FromStringAndSize(str, size);
1192}
1193
1194static PyObject *
1195getargs_u(PyObject *self, PyObject *args)
1196{
1197 Py_UNICODE *str;
1198 Py_ssize_t size;
1199 if (!PyArg_ParseTuple(args, "u", &str))
1200 return NULL;
1201 size = Py_UNICODE_strlen(str);
1202 return PyUnicode_FromUnicode(str, size);
1203}
1204
1205static PyObject *
1206getargs_u_hash(PyObject *self, PyObject *args)
1207{
1208 Py_UNICODE *str;
1209 Py_ssize_t size;
1210 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1211 return NULL;
1212 return PyUnicode_FromUnicode(str, size);
1213}
1214
1215static PyObject *
1216getargs_Z(PyObject *self, PyObject *args)
1217{
1218 Py_UNICODE *str;
1219 Py_ssize_t size;
1220 if (!PyArg_ParseTuple(args, "Z", &str))
1221 return NULL;
1222 if (str != NULL) {
1223 size = Py_UNICODE_strlen(str);
1224 return PyUnicode_FromUnicode(str, size);
1225 } else
1226 Py_RETURN_NONE;
1227}
1228
1229static PyObject *
1230getargs_Z_hash(PyObject *self, PyObject *args)
1231{
1232 Py_UNICODE *str;
1233 Py_ssize_t size;
1234 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1235 return NULL;
1236 if (str != NULL)
1237 return PyUnicode_FromUnicode(str, size);
1238 else
1239 Py_RETURN_NONE;
1240}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001241
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001242/* Test the s and z codes for PyArg_ParseTuple.
1243*/
1244static PyObject *
1245test_s_code(PyObject *self)
1246{
1247 /* Unicode strings should be accepted */
1248 PyObject *tuple, *obj;
1249 char *value;
1250
1251 tuple = PyTuple_New(1);
1252 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001254
1255 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001257 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001259
1260 PyTuple_SET_ITEM(tuple, 0, obj);
1261
1262 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001264 */
1265 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001267
1268 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001270
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001271 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001272 Py_RETURN_NONE;
1273}
1274
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001275static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001276parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001277{
Larry Hastings8f904da2012-06-22 03:56:29 -07001278 PyObject *sub_args;
1279 PyObject *sub_kwargs;
1280 char *sub_format;
1281 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001282
Larry Hastings8f904da2012-06-22 03:56:29 -07001283 Py_ssize_t i, size;
1284 char *keywords[8 + 1]; /* space for NULL at end */
1285 PyObject *o;
1286 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001287
Larry Hastings8f904da2012-06-22 03:56:29 -07001288 int result;
1289 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001290
Larry Hastings22701e82012-08-08 14:52:22 -07001291 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001292
Larry Hastings8f904da2012-06-22 03:56:29 -07001293 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1294 &sub_args, &sub_kwargs,
1295 &sub_format, &sub_keywords))
1296 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001297
Larry Hastings8f904da2012-06-22 03:56:29 -07001298 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1299 PyErr_SetString(PyExc_ValueError,
1300 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1301 return NULL;
1302 }
1303
1304 memset(buffers, 0, sizeof(buffers));
1305 memset(converted, 0, sizeof(converted));
1306 memset(keywords, 0, sizeof(keywords));
1307
1308 size = PySequence_Fast_GET_SIZE(sub_keywords);
1309 if (size > 8) {
1310 PyErr_SetString(PyExc_ValueError,
1311 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1312 goto exit;
1313 }
1314
1315 for (i = 0; i < size; i++) {
1316 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1317 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1318 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001319 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001320 goto exit;
1321 }
1322 keywords[i] = PyBytes_AS_STRING(converted[i]);
1323 }
1324
1325 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1326 sub_format, keywords,
1327 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1328 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1329
1330 if (result) {
1331 return_value = Py_None;
1332 Py_INCREF(Py_None);
1333 }
1334
1335exit:
1336 size = sizeof(converted) / sizeof(converted[0]);
1337 for (i = 0; i < size; i++) {
1338 Py_XDECREF(converted[i]);
1339 }
1340 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001341}
1342
Benjamin Peterson92035012008-12-27 16:00:54 +00001343static volatile int x;
1344
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001345/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1346 of an error.
1347*/
1348static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001349test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 PyObject *tuple, *obj;
1352 Py_UNICODE *value;
1353 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1356 /* Just use the macro and check that it compiles */
1357 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 tuple = PyTuple_New(1);
1360 if (tuple == NULL)
1361 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 obj = PyUnicode_Decode("test", strlen("test"),
1364 "ascii", NULL);
1365 if (obj == NULL)
1366 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 value = 0;
1371 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1372 return NULL;
1373 if (value != PyUnicode_AS_UNICODE(obj))
1374 return raiseTestError("test_u_code",
1375 "u code returned wrong value for u'test'");
1376 value = 0;
1377 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1378 return NULL;
1379 if (value != PyUnicode_AS_UNICODE(obj) ||
1380 len != PyUnicode_GET_SIZE(obj))
1381 return raiseTestError("test_u_code",
1382 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 Py_DECREF(tuple);
1385 Py_INCREF(Py_None);
1386 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001387}
1388
Guido van Rossumfb67be22007-08-29 18:38:11 +00001389/* Test Z and Z# codes for PyArg_ParseTuple */
1390static PyObject *
1391test_Z_code(PyObject *self)
1392{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001394 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 tuple = PyTuple_New(2);
1398 if (tuple == NULL)
1399 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 obj = PyUnicode_FromString("test");
1402 PyTuple_SET_ITEM(tuple, 0, obj);
1403 Py_INCREF(Py_None);
1404 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 /* swap values on purpose */
1407 value1 = NULL;
1408 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 /* Test Z for both values */
1411 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1412 return NULL;
1413 if (value1 != PyUnicode_AS_UNICODE(obj))
1414 return raiseTestError("test_Z_code",
1415 "Z code returned wrong value for 'test'");
1416 if (value2 != NULL)
1417 return raiseTestError("test_Z_code",
1418 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 value1 = NULL;
1421 value2 = PyUnicode_AS_UNICODE(obj);
1422 len1 = -1;
1423 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 /* Test Z# for both values */
1426 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1427 &value2, &len2) < 0)
1428 return NULL;
1429 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1430 len1 != PyUnicode_GET_SIZE(obj))
1431 return raiseTestError("test_Z_code",
1432 "Z# code returned wrong values for 'test'");
1433 if (value2 != NULL ||
1434 len2 != 0)
1435 return raiseTestError("test_Z_code",
1436 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 Py_DECREF(tuple);
1439 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001440}
1441
Thomas Wouters477c8d52006-05-27 19:21:47 +00001442static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001443test_widechar(PyObject *self)
1444{
1445#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1447 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001448 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001449#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1451 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1456 if (wide == NULL)
1457 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1460 if (utf8 == NULL) {
1461 Py_DECREF(wide);
1462 return NULL;
1463 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001464
Victor Stinner8ef18872011-11-21 02:06:57 +01001465 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 Py_DECREF(wide);
1467 Py_DECREF(utf8);
1468 return raiseTestError("test_widechar",
1469 "wide string and utf8 string "
1470 "have different length");
1471 }
1472 if (PyUnicode_Compare(wide, utf8)) {
1473 Py_DECREF(wide);
1474 Py_DECREF(utf8);
1475 if (PyErr_Occurred())
1476 return NULL;
1477 return raiseTestError("test_widechar",
1478 "wide string and utf8 string "
1479 "are different");
1480 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 Py_DECREF(wide);
1483 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001484
1485#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1486 wide = PyUnicode_FromWideChar(invalid, 1);
1487 if (wide == NULL)
1488 PyErr_Clear();
1489 else
1490 return raiseTestError("test_widechar",
1491 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1492
1493 wide = PyUnicode_FromUnicode(invalid, 1);
1494 if (wide == NULL)
1495 PyErr_Clear();
1496 else
1497 return raiseTestError("test_widechar",
1498 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001499
1500 wide = PyUnicode_FromUnicode(NULL, 1);
1501 if (wide == NULL)
1502 return NULL;
1503 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001504 if (_PyUnicode_Ready(wide) < 0) {
1505 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001506 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001507 }
1508 else {
1509 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001510 return raiseTestError("test_widechar",
1511 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001512 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001513#endif
1514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001516}
1517
1518static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001519unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001520{
1521 PyObject *unicode, *result;
1522 Py_ssize_t buflen, size;
1523 wchar_t *buffer;
1524
1525 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1526 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001527 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001528 if (buffer == NULL)
1529 return PyErr_NoMemory();
1530
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001531 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001532 if (size == -1) {
1533 PyMem_Free(buffer);
1534 return NULL;
1535 }
1536
1537 if (size < buflen)
1538 buflen = size + 1;
1539 else
1540 buflen = size;
1541 result = PyUnicode_FromWideChar(buffer, buflen);
1542 PyMem_Free(buffer);
1543 if (result == NULL)
1544 return NULL;
1545
1546 return Py_BuildValue("(Nn)", result, size);
1547}
1548
1549static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001550unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001551{
1552 PyObject *unicode, *result;
1553 Py_ssize_t size;
1554 wchar_t *buffer;
1555
1556 if (!PyArg_ParseTuple(args, "U", &unicode))
1557 return NULL;
1558
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001559 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001560 if (buffer == NULL)
1561 return NULL;
1562
1563 result = PyUnicode_FromWideChar(buffer, size + 1);
1564 PyMem_Free(buffer);
1565 if (result == NULL)
1566 return NULL;
1567 return Py_BuildValue("(Nn)", result, size);
1568}
1569
1570static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001571unicode_encodedecimal(PyObject *self, PyObject *args)
1572{
1573 Py_UNICODE *unicode;
1574 Py_ssize_t length;
1575 char *errors = NULL;
1576 PyObject *decimal;
1577 Py_ssize_t decimal_length, new_length;
1578 int res;
1579
1580 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1581 return NULL;
1582
1583 decimal_length = length * 7; /* len('&#8364;') */
1584 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1585 if (decimal == NULL)
1586 return NULL;
1587
1588 res = PyUnicode_EncodeDecimal(unicode, length,
1589 PyBytes_AS_STRING(decimal),
1590 errors);
1591 if (res < 0) {
1592 Py_DECREF(decimal);
1593 return NULL;
1594 }
1595
1596 new_length = strlen(PyBytes_AS_STRING(decimal));
1597 assert(new_length <= decimal_length);
1598 res = _PyBytes_Resize(&decimal, new_length);
1599 if (res < 0)
1600 return NULL;
1601
1602 return decimal;
1603}
1604
1605static PyObject *
1606unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1607{
1608 Py_UNICODE *unicode;
1609 Py_ssize_t length;
1610 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1611 return NULL;
1612 return PyUnicode_TransformDecimalToASCII(unicode, length);
1613}
1614
1615static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001616unicode_legacy_string(PyObject *self, PyObject *args)
1617{
1618 Py_UNICODE *data;
1619 Py_ssize_t len;
1620 PyObject *u;
1621
1622 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1623 return NULL;
1624
1625 u = PyUnicode_FromUnicode(NULL, len);
1626 if (u == NULL)
1627 return NULL;
1628
1629 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1630
1631 if (len > 0) { /* The empty string is always ready. */
1632 assert(!PyUnicode_IS_READY(u));
1633 }
1634
1635 return u;
1636}
1637
1638static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001639getargs_w_star(PyObject *self, PyObject *args)
1640{
1641 Py_buffer buffer;
1642 PyObject *result;
1643 char *str;
1644
1645 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1646 return NULL;
1647
1648 if (2 <= buffer.len) {
1649 str = buffer.buf;
1650 str[0] = '[';
1651 str[buffer.len-1] = ']';
1652 }
1653
1654 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1655 PyBuffer_Release(&buffer);
1656 return result;
1657}
1658
1659
1660static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001661test_empty_argparse(PyObject *self)
1662{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 /* Test that formats can begin with '|'. See issue #4720. */
1664 PyObject *tuple, *dict = NULL;
1665 static char *kwlist[] = {NULL};
1666 int result;
1667 tuple = PyTuple_New(0);
1668 if (!tuple)
1669 return NULL;
1670 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1671 goto done;
1672 dict = PyDict_New();
1673 if (!dict)
1674 goto done;
1675 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00001676 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 Py_DECREF(tuple);
1678 Py_XDECREF(dict);
1679 if (result < 0)
1680 return NULL;
1681 else {
1682 Py_RETURN_NONE;
1683 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001684}
1685
1686static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001687codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001688{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 const char *encoding, *errors = NULL;
1690 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1691 &encoding, &errors))
1692 return NULL;
1693 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001694}
1695
Thomas Wouters477c8d52006-05-27 19:21:47 +00001696static PyObject *
1697codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001698{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 const char *encoding, *errors = NULL;
1700 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1701 &encoding, &errors))
1702 return NULL;
1703 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001704}
1705
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001706
Tim Peters5b8132f2003-01-31 15:52:05 +00001707/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001708static PyObject *
1709test_long_numbits(PyObject *self)
1710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 struct triple {
1712 long input;
1713 size_t nbits;
1714 int sign;
1715 } testcases[] = {{0, 0, 0},
1716 {1L, 1, 1},
1717 {-1L, 1, -1},
1718 {2L, 2, 1},
1719 {-2L, 2, -1},
1720 {3L, 2, 1},
1721 {-3L, 2, -1},
1722 {4L, 3, 1},
1723 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03001724 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 {-0x7fffL, 15, -1},
1726 {0xffffL, 16, 1},
1727 {-0xffffL, 16, -1},
1728 {0xfffffffL, 28, 1},
1729 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02001730 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001731
Victor Stinner63941882011-09-29 00:42:28 +02001732 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02001733 size_t nbits;
1734 int sign;
1735 PyObject *plong;
1736
1737 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02001738 if (plong == NULL)
1739 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02001740 nbits = _PyLong_NumBits(plong);
1741 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 Py_DECREF(plong);
1744 if (nbits != testcases[i].nbits)
1745 return raiseTestError("test_long_numbits",
1746 "wrong result for _PyLong_NumBits");
1747 if (sign != testcases[i].sign)
1748 return raiseTestError("test_long_numbits",
1749 "wrong result for _PyLong_Sign");
1750 }
1751 Py_INCREF(Py_None);
1752 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001753}
1754
Thomas Heller519a0422007-11-15 20:48:54 +00001755/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00001756
1757static PyObject *
1758test_null_strings(PyObject *self)
1759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
1761 PyObject *tuple = PyTuple_Pack(2, o1, o2);
1762 Py_XDECREF(o1);
1763 Py_XDECREF(o2);
1764 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00001765}
1766
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001767static PyObject *
1768raise_exception(PyObject *self, PyObject *args)
1769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 PyObject *exc;
1771 PyObject *exc_args, *v;
1772 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
1775 &exc, &num_args))
1776 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 exc_args = PyTuple_New(num_args);
1779 if (exc_args == NULL)
1780 return NULL;
1781 for (i = 0; i < num_args; ++i) {
1782 v = PyLong_FromLong(i);
1783 if (v == NULL) {
1784 Py_DECREF(exc_args);
1785 return NULL;
1786 }
1787 PyTuple_SET_ITEM(exc_args, i, v);
1788 }
1789 PyErr_SetObject(exc, exc_args);
1790 Py_DECREF(exc_args);
1791 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001792}
Tim Peters91621db2001-06-12 20:10:01 +00001793
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02001794static PyObject *
1795test_set_exc_info(PyObject *self, PyObject *args)
1796{
1797 PyObject *orig_exc;
1798 PyObject *new_type, *new_value, *new_tb;
1799 PyObject *type, *value, *tb;
1800 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
1801 &new_type, &new_value, &new_tb))
1802 return NULL;
1803
1804 PyErr_GetExcInfo(&type, &value, &tb);
1805
1806 Py_INCREF(new_type);
1807 Py_INCREF(new_value);
1808 Py_INCREF(new_tb);
1809 PyErr_SetExcInfo(new_type, new_value, new_tb);
1810
1811 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
1812 Py_XDECREF(type);
1813 Py_XDECREF(value);
1814 Py_XDECREF(tb);
1815 return orig_exc;
1816}
Benjamin Peterson16323982010-02-03 01:13:41 +00001817
1818static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001819
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001820static PyObject *
1821test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 if (PyDateTimeAPI) {
1823 if (test_run_counter) {
1824 /* Probably regrtest.py -R */
1825 Py_RETURN_NONE;
1826 }
1827 else {
1828 PyErr_SetString(PyExc_AssertionError,
1829 "PyDateTime_CAPI somehow initialized");
1830 return NULL;
1831 }
1832 }
1833 test_run_counter++;
1834 PyDateTime_IMPORT;
1835 if (PyDateTimeAPI)
1836 Py_RETURN_NONE;
1837 else
1838 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001839}
1840
Benjamin Peterson16323982010-02-03 01:13:41 +00001841
1842#ifdef WITH_THREAD
1843
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001844/* test_thread_state spawns a thread of its own, and that thread releases
1845 * `thread_done` when it's finished. The driver code has to know when the
1846 * thread finishes, because the thread uses a PyObject (the callable) that
1847 * may go away when the driver finishes. The former lack of this explicit
1848 * synchronization caused rare segfaults, so rare that they were seen only
1849 * on a Mac buildbot (although they were possible on any box).
1850 */
1851static PyThread_type_lock thread_done = NULL;
1852
Benjamin Petersona786b022008-08-25 21:05:21 +00001853static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001854_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 PyObject *rc;
1857 int success;
1858 PyGILState_STATE s = PyGILState_Ensure();
1859 rc = PyObject_CallFunction((PyObject *)callable, "");
1860 success = (rc != NULL);
1861 Py_XDECREF(rc);
1862 PyGILState_Release(s);
1863 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001864}
1865
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001866/* Same thing, but releases `thread_done` when it returns. This variant
1867 * should be called only from threads spawned by test_thread_state().
1868 */
1869static void
1870_make_call_from_thread(void *callable)
1871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 _make_call(callable);
1873 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001874}
1875
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001876static PyObject *
1877test_thread_state(PyObject *self, PyObject *args)
1878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 PyObject *fn;
1880 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1883 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 if (!PyCallable_Check(fn)) {
1886 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1887 fn->ob_type->tp_name);
1888 return NULL;
1889 }
Benjamin Petersona786b022008-08-25 21:05:21 +00001890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 /* Ensure Python is set up for threading */
1892 PyEval_InitThreads();
1893 thread_done = PyThread_allocate_lock();
1894 if (thread_done == NULL)
1895 return PyErr_NoMemory();
1896 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 /* Start a new thread with our callback. */
1899 PyThread_start_new_thread(_make_call_from_thread, fn);
1900 /* Make the callback with the thread lock held by this thread */
1901 success &= _make_call(fn);
1902 /* Do it all again, but this time with the thread-lock released */
1903 Py_BEGIN_ALLOW_THREADS
1904 success &= _make_call(fn);
1905 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1906 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 /* And once more with and without a thread
1909 XXX - should use a lock and work out exactly what we are trying
1910 to test <wink>
1911 */
1912 Py_BEGIN_ALLOW_THREADS
1913 PyThread_start_new_thread(_make_call_from_thread, fn);
1914 success &= _make_call(fn);
1915 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1916 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 /* Release lock we acquired above. This is required on HP-UX. */
1919 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 PyThread_free_lock(thread_done);
1922 if (!success)
1923 return NULL;
1924 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001925}
Benjamin Petersona54c9092009-01-13 02:11:23 +00001926
1927/* test Py_AddPendingCalls using threads */
1928static int _pending_callback(void *arg)
1929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001930 /* we assume the argument is callable object to which we own a reference */
1931 PyObject *callable = (PyObject *)arg;
1932 PyObject *r = PyObject_CallObject(callable, NULL);
1933 Py_DECREF(callable);
1934 Py_XDECREF(r);
1935 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001936}
1937
1938/* The following requests n callbacks to _pending_callback. It can be
1939 * run from any python thread.
1940 */
1941PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
1942{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 PyObject *callable;
1944 int r;
1945 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
1946 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 /* create the reference for the callbackwhile we hold the lock */
1949 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00001950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 Py_BEGIN_ALLOW_THREADS
1952 r = Py_AddPendingCall(&_pending_callback, callable);
1953 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00001954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 if (r<0) {
1956 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
1957 Py_INCREF(Py_False);
1958 return Py_False;
1959 }
1960 Py_INCREF(Py_True);
1961 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001962}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001963#endif
1964
Neal Norwitzb0d26332007-08-25 00:49:05 +00001965/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001966static PyObject *
1967test_string_from_format(PyObject *self, PyObject *args)
1968{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 PyObject *result;
1970 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001971
Alexander Belopolskye239d232010-12-08 23:31:48 +00001972#define CHECK_1_FORMAT(FORMAT, TYPE) \
1973 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
1974 if (result == NULL) \
1975 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01001976 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00001977 msg = FORMAT " failed at 1"; \
1978 goto Fail; \
1979 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 CHECK_1_FORMAT("%d", int);
1983 CHECK_1_FORMAT("%ld", long);
1984 /* The z width modifier was added in Python 2.5. */
1985 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 /* The u type code was added in Python 2.5. */
1988 CHECK_1_FORMAT("%u", unsigned int);
1989 CHECK_1_FORMAT("%lu", unsigned long);
1990 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001993#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
1995 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00001996#endif
1997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001999
2000 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 Py_XDECREF(result);
2002 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002003
2004#undef CHECK_1_FORMAT
2005}
2006
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002007
2008static PyObject *
2009test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2011 int result;
2012 if (py_s == NULL)
2013 return NULL;
2014 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2015 Py_DECREF(py_s);
2016 if (!result) {
2017 PyErr_SetString(TestError, "Python string ending in NULL "
2018 "should not compare equal to c string.");
2019 return NULL;
2020 }
2021 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002022}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002023
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002024/* This is here to provide a docstring for test_descr. */
2025static PyObject *
2026test_with_docstring(PyObject *self)
2027{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002029}
2030
Mark Dickinson725bfd82009-05-03 20:33:40 +00002031/* Test PyOS_string_to_double. */
2032static PyObject *
2033test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 double result;
2035 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037#define CHECK_STRING(STR, expected) \
2038 result = PyOS_string_to_double(STR, NULL, NULL); \
2039 if (result == -1.0 && PyErr_Occurred()) \
2040 return NULL; \
2041 if (result != expected) { \
2042 msg = "conversion of " STR " to float failed"; \
2043 goto fail; \
2044 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046#define CHECK_INVALID(STR) \
2047 result = PyOS_string_to_double(STR, NULL, NULL); \
2048 if (result == -1.0 && PyErr_Occurred()) { \
2049 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2050 PyErr_Clear(); \
2051 else \
2052 return NULL; \
2053 } \
2054 else { \
2055 msg = "conversion of " STR " didn't raise ValueError"; \
2056 goto fail; \
2057 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 CHECK_STRING("0.1", 0.1);
2060 CHECK_STRING("1.234", 1.234);
2061 CHECK_STRING("-1.35", -1.35);
2062 CHECK_STRING(".1e01", 1.0);
2063 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 CHECK_INVALID(" 0.1");
2066 CHECK_INVALID("\t\n-3");
2067 CHECK_INVALID(".123 ");
2068 CHECK_INVALID("3\n");
2069 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002072 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002074#undef CHECK_STRING
2075#undef CHECK_INVALID
2076}
2077
2078
Benjamin Petersonb173f782009-05-05 22:31:58 +00002079/* Coverage testing of capsule objects. */
2080
2081static const char *capsule_name = "capsule name";
2082static char *capsule_pointer = "capsule pointer";
2083static char *capsule_context = "capsule context";
2084static const char *capsule_error = NULL;
2085static int
2086capsule_destructor_call_count = 0;
2087
2088static void
2089capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 capsule_destructor_call_count++;
2091 if (PyCapsule_GetContext(o) != capsule_context) {
2092 capsule_error = "context did not match in destructor!";
2093 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2094 capsule_error = "destructor did not match in destructor! (woah!)";
2095 } else if (PyCapsule_GetName(o) != capsule_name) {
2096 capsule_error = "name did not match in destructor!";
2097 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2098 capsule_error = "pointer did not match in destructor!";
2099 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002100}
2101
2102typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 char *name;
2104 char *module;
2105 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002106} known_capsule;
2107
2108static PyObject *
2109test_capsule(PyObject *self, PyObject *args)
2110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 PyObject *object;
2112 const char *error = NULL;
2113 void *pointer;
2114 void *pointer2;
2115 known_capsule known_capsules[] = {
2116 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2117 KNOWN_CAPSULE("_socket", "CAPI"),
2118 KNOWN_CAPSULE("_curses", "_C_API"),
2119 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2120 { NULL, NULL },
2121 };
2122 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002123
2124#define FAIL(x) { error = (x); goto exit; }
2125
2126#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002127 if (capsule_error) { \
2128 FAIL(capsule_error); \
2129 } \
2130 else if (!capsule_destructor_call_count) { \
2131 FAIL("destructor not called!"); \
2132 } \
2133 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2136 PyCapsule_SetContext(object, capsule_context);
2137 capsule_destructor(object);
2138 CHECK_DESTRUCTOR;
2139 Py_DECREF(object);
2140 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 object = PyCapsule_New(known, "ignored", NULL);
2143 PyCapsule_SetPointer(object, capsule_pointer);
2144 PyCapsule_SetName(object, capsule_name);
2145 PyCapsule_SetDestructor(object, capsule_destructor);
2146 PyCapsule_SetContext(object, capsule_context);
2147 capsule_destructor(object);
2148 CHECK_DESTRUCTOR;
2149 /* intentionally access using the wrong name */
2150 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2151 if (!PyErr_Occurred()) {
2152 FAIL("PyCapsule_GetPointer should have failed but did not!");
2153 }
2154 PyErr_Clear();
2155 if (pointer2) {
2156 if (pointer2 == capsule_pointer) {
2157 FAIL("PyCapsule_GetPointer should not have"
2158 " returned the internal pointer!");
2159 } else {
2160 FAIL("PyCapsule_GetPointer should have "
2161 "returned NULL pointer but did not!");
2162 }
2163 }
2164 PyCapsule_SetDestructor(object, NULL);
2165 Py_DECREF(object);
2166 if (capsule_destructor_call_count) {
2167 FAIL("destructor called when it should not have been!");
2168 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 for (known = &known_capsules[0]; known->module != NULL; known++) {
2171 /* yeah, ordinarily I wouldn't do this either,
2172 but it's fine for this test harness.
2173 */
2174 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002175#undef FAIL
2176#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 { \
2178 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2179 x, known->module, known->attribute); \
2180 error = buffer; \
2181 goto exit; \
2182 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 PyObject *module = PyImport_ImportModule(known->module);
2185 if (module) {
2186 pointer = PyCapsule_Import(known->name, 0);
2187 if (!pointer) {
2188 Py_DECREF(module);
2189 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2190 }
2191 object = PyObject_GetAttrString(module, known->attribute);
2192 if (!object) {
2193 Py_DECREF(module);
2194 return NULL;
2195 }
2196 pointer2 = PyCapsule_GetPointer(object,
2197 "weebles wobble but they don't fall down");
2198 if (!PyErr_Occurred()) {
2199 Py_DECREF(object);
2200 Py_DECREF(module);
2201 FAIL("PyCapsule_GetPointer should have failed but did not!");
2202 }
2203 PyErr_Clear();
2204 if (pointer2) {
2205 Py_DECREF(module);
2206 Py_DECREF(object);
2207 if (pointer2 == pointer) {
2208 FAIL("PyCapsule_GetPointer should not have"
2209 " returned its internal pointer!");
2210 } else {
2211 FAIL("PyCapsule_GetPointer should have"
2212 " returned NULL pointer but did not!");
2213 }
2214 }
2215 Py_DECREF(object);
2216 Py_DECREF(module);
2217 }
2218 else
2219 PyErr_Clear();
2220 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002221
2222 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 if (error) {
2224 return raiseTestError("test_capsule", error);
2225 }
2226 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002227#undef FAIL
2228}
2229
Guido van Rossumddefaf32007-01-14 03:31:43 +00002230#ifdef HAVE_GETTIMEOFDAY
2231/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002232static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 e->tv_sec -= s->tv_sec;
2235 e->tv_usec -= s->tv_usec;
2236 if (e->tv_usec < 0) {
2237 e->tv_sec -=1;
2238 e->tv_usec += 1000000;
2239 }
2240 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002241}
2242
2243static PyObject *
2244profile_int(PyObject *self, PyObject* args)
2245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 int i, k;
2247 struct timeval start, stop;
2248 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 /* Test 1: Allocate and immediately deallocate
2251 many small integers */
2252 gettimeofday(&start, NULL);
2253 for(k=0; k < 20000; k++)
2254 for(i=0; i < 1000; i++) {
2255 single = PyLong_FromLong(i);
2256 Py_DECREF(single);
2257 }
2258 gettimeofday(&stop, NULL);
2259 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 /* Test 2: Allocate and immediately deallocate
2262 many large integers */
2263 gettimeofday(&start, NULL);
2264 for(k=0; k < 20000; k++)
2265 for(i=0; i < 1000; i++) {
2266 single = PyLong_FromLong(i+1000000);
2267 Py_DECREF(single);
2268 }
2269 gettimeofday(&stop, NULL);
2270 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 /* Test 3: Allocate a few integers, then release
2273 them all simultaneously. */
2274 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002275 if (multiple == NULL)
2276 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 gettimeofday(&start, NULL);
2278 for(k=0; k < 20000; k++) {
2279 for(i=0; i < 1000; i++) {
2280 multiple[i] = PyLong_FromLong(i+1000000);
2281 }
2282 for(i=0; i < 1000; i++) {
2283 Py_DECREF(multiple[i]);
2284 }
2285 }
2286 gettimeofday(&stop, NULL);
2287 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002288 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 /* Test 4: Allocate many integers, then release
2291 them all simultaneously. */
2292 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002293 if (multiple == NULL)
2294 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 gettimeofday(&start, NULL);
2296 for(k=0; k < 20; k++) {
2297 for(i=0; i < 1000000; i++) {
2298 multiple[i] = PyLong_FromLong(i+1000000);
2299 }
2300 for(i=0; i < 1000000; i++) {
2301 Py_DECREF(multiple[i]);
2302 }
2303 }
2304 gettimeofday(&stop, NULL);
2305 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002306 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 /* Test 5: Allocate many integers < 32000 */
2309 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002310 if (multiple == NULL)
2311 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 gettimeofday(&start, NULL);
2313 for(k=0; k < 10; k++) {
2314 for(i=0; i < 1000000; i++) {
2315 multiple[i] = PyLong_FromLong(i+1000);
2316 }
2317 for(i=0; i < 1000000; i++) {
2318 Py_DECREF(multiple[i]);
2319 }
2320 }
2321 gettimeofday(&stop, NULL);
2322 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002323 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 /* Test 6: Perform small int addition */
2326 op1 = PyLong_FromLong(1);
2327 gettimeofday(&start, NULL);
2328 for(i=0; i < 10000000; i++) {
2329 result = PyNumber_Add(op1, op1);
2330 Py_DECREF(result);
2331 }
2332 gettimeofday(&stop, NULL);
2333 Py_DECREF(op1);
2334 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 /* Test 7: Perform medium int addition */
2337 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002338 if (op1 == NULL)
2339 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 gettimeofday(&start, NULL);
2341 for(i=0; i < 10000000; i++) {
2342 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002343 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 }
2345 gettimeofday(&stop, NULL);
2346 Py_DECREF(op1);
2347 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 Py_INCREF(Py_None);
2350 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002351}
2352#endif
2353
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002354/* To test the format of tracebacks as printed out. */
2355static PyObject *
2356traceback_print(PyObject *self, PyObject *args)
2357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 PyObject *file;
2359 PyObject *traceback;
2360 int result;
2361
2362 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2363 &traceback, &file))
2364 return NULL;
2365
2366 result = PyTraceBack_Print(traceback, file);
2367 if (result < 0)
2368 return NULL;
2369 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002370}
2371
Benjamin Petersone6528212008-07-15 15:32:09 +00002372/* To test the format of exceptions as printed out. */
2373static PyObject *
2374exception_print(PyObject *self, PyObject *args)
2375{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376 PyObject *value;
2377 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 if (!PyArg_ParseTuple(args, "O:exception_print",
2380 &value))
2381 return NULL;
2382 if (!PyExceptionInstance_Check(value)) {
2383 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2384 return NULL;
2385 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 tb = PyException_GetTraceback(value);
2388 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2389 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002392}
2393
2394
2395
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002396
2397/* reliably raise a MemoryError */
2398static PyObject *
2399raise_memoryerror(PyObject *self)
2400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 PyErr_NoMemory();
2402 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002403}
2404
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002405/* Issue 6012 */
2406static PyObject *str1, *str2;
2407static int
2408failing_converter(PyObject *obj, void *arg)
2409{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 /* Clone str1, then let the conversion fail. */
2411 assert(str1);
2412 str2 = str1;
2413 Py_INCREF(str2);
2414 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002415}
2416static PyObject*
2417argparsing(PyObject *o, PyObject *args)
2418{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 PyObject *res;
2420 str1 = str2 = NULL;
2421 if (!PyArg_ParseTuple(args, "O&O&",
2422 PyUnicode_FSConverter, &str1,
2423 failing_converter, &str2)) {
2424 if (!str2)
2425 /* argument converter not called? */
2426 return NULL;
2427 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002428 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 Py_DECREF(str2);
2430 PyErr_Clear();
2431 return res;
2432 }
2433 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002434}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002435
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002436/* To test that the result of PyCode_NewEmpty has the right members. */
2437static PyObject *
2438code_newempty(PyObject *self, PyObject *args)
2439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 const char *filename;
2441 const char *funcname;
2442 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2445 &filename, &funcname, &firstlineno))
2446 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002449}
2450
Georg Brandl1e28a272009-12-28 08:41:01 +00002451/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2452 Run via Lib/test/test_exceptions.py */
2453static PyObject *
2454make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 const char *name;
2457 const char *doc = NULL;
2458 PyObject *base = NULL;
2459 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2464 "s|sOO:make_exception_with_doc", kwlist,
2465 &name, &doc, &base, &dict))
2466 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002469}
2470
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002471static PyObject *
2472make_memoryview_from_NULL_pointer(PyObject *self)
2473{
2474 Py_buffer info;
2475 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2476 return NULL;
2477 return PyMemoryView_FromBuffer(&info);
2478}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002479
Stefan Krah7213fcc2015-02-01 16:19:23 +01002480static PyObject *
2481test_from_contiguous(PyObject* self, PyObject *noargs)
2482{
2483 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2484 int init[5] = {0, 1, 2, 3, 4};
2485 Py_ssize_t itemsize = sizeof(int);
2486 Py_ssize_t shape = 5;
2487 Py_ssize_t strides = 2 * itemsize;
2488 Py_buffer view = {
2489 data,
2490 NULL,
2491 5 * itemsize,
2492 itemsize,
2493 1,
2494 1,
2495 NULL,
2496 &shape,
2497 &strides,
2498 NULL,
2499 NULL
2500 };
2501 int *ptr;
2502 int i;
2503
2504 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2505 ptr = view.buf;
2506 for (i = 0; i < 5; i++) {
2507 if (ptr[2*i] != i) {
2508 PyErr_SetString(TestError,
2509 "test_from_contiguous: incorrect result");
2510 return NULL;
2511 }
2512 }
2513
2514 view.buf = &data[8];
2515 view.strides[0] = -2 * itemsize;
2516
2517 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2518 ptr = view.buf;
2519 for (i = 0; i < 5; i++) {
2520 if (*(ptr-2*i) != i) {
2521 PyErr_SetString(TestError,
2522 "test_from_contiguous: incorrect result");
2523 return NULL;
2524 }
2525 }
2526
2527 Py_RETURN_NONE;
2528}
Stefan Krah650c1e82015-02-03 21:43:23 +01002529
Stefan Kraha7559c02015-02-03 22:27:21 +01002530#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01002531extern PyTypeObject _PyBytesIOBuffer_Type;
2532
Stefan Krah5178d912015-02-03 16:57:21 +01002533static PyObject *
2534test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
2535{
Stefan Krah650c1e82015-02-03 21:43:23 +01002536 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01002537 PyObject *b;
2538 char *dummy[1];
2539 int ret, match;
2540
Stefan Krah650c1e82015-02-03 21:43:23 +01002541 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01002542 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
2543 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2544 PyErr_Clear();
2545 if (ret != -1 || match == 0)
2546 goto error;
2547
Stefan Krah650c1e82015-02-03 21:43:23 +01002548 /* bytesiobuf_getbuffer() */
2549 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01002550 if (b == NULL) {
2551 return NULL;
2552 }
2553
2554 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
2555 Py_DECREF(b);
2556 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2557 PyErr_Clear();
2558 if (ret != -1 || match == 0)
2559 goto error;
2560
2561 Py_RETURN_NONE;
2562
2563error:
2564 PyErr_SetString(TestError,
2565 "test_pep3118_obsolete_write_locks: failure");
2566 return NULL;
2567}
Stefan Kraha7559c02015-02-03 22:27:21 +01002568#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002569
Stefan Krah650c1e82015-02-03 21:43:23 +01002570/* This tests functions that historically supported write locks. It is
2571 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
2572 is entitled to segfault in that case. */
2573static PyObject *
2574getbuffer_with_null_view(PyObject* self, PyObject *obj)
2575{
2576 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
2577 return NULL;
2578
2579 Py_RETURN_NONE;
2580}
2581
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002582/* Test that the fatal error from not having a current thread doesn't
2583 cause an infinite loop. Run via Lib/test/test_capi.py */
2584static PyObject *
2585crash_no_current_thread(PyObject *self)
2586{
2587 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002588 /* Using PyThreadState_Get() directly allows the test to pass in
2589 !pydebug mode. However, the test only actually tests anything
2590 in pydebug mode, since that's where the infinite loop was in
2591 the first place. */
2592 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002593 Py_END_ALLOW_THREADS
2594 return NULL;
2595}
2596
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002597/* To run some code in a sub-interpreter. */
2598static PyObject *
2599run_in_subinterp(PyObject *self, PyObject *args)
2600{
2601 const char *code;
2602 int r;
2603 PyThreadState *substate, *mainstate;
2604
2605 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2606 &code))
2607 return NULL;
2608
2609 mainstate = PyThreadState_Get();
2610
2611 PyThreadState_Swap(NULL);
2612
2613 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002614 if (substate == NULL) {
2615 /* Since no new thread state was created, there is no exception to
2616 propagate; raise a fresh one after swapping in the old thread
2617 state. */
2618 PyThreadState_Swap(mainstate);
2619 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2620 return NULL;
2621 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002622 r = PyRun_SimpleString(code);
2623 Py_EndInterpreter(substate);
2624
2625 PyThreadState_Swap(mainstate);
2626
2627 return PyLong_FromLong(r);
2628}
2629
Victor Stinner3c1b3792014-02-17 00:02:43 +01002630static int
2631check_time_rounding(int round)
2632{
2633 if (round != _PyTime_ROUND_DOWN && round != _PyTime_ROUND_UP) {
2634 PyErr_SetString(PyExc_ValueError, "invalid rounding");
2635 return -1;
2636 }
2637 return 0;
2638}
2639
Victor Stinner5d272cc2012-03-13 13:35:55 +01002640static PyObject *
2641test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2642{
2643 PyObject *obj;
2644 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002645 int round;
2646 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002647 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002648 if (check_time_rounding(round) < 0)
2649 return NULL;
2650 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002651 return NULL;
2652 return _PyLong_FromTime_t(sec);
2653}
2654
2655static PyObject *
2656test_pytime_object_to_timeval(PyObject *self, PyObject *args)
2657{
2658 PyObject *obj;
2659 time_t sec;
2660 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002661 int round;
2662 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002663 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002664 if (check_time_rounding(round) < 0)
2665 return NULL;
2666 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002667 return NULL;
2668 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
2669}
2670
Victor Stinner643cd682012-03-02 22:54:03 +01002671static PyObject *
2672test_pytime_object_to_timespec(PyObject *self, PyObject *args)
2673{
2674 PyObject *obj;
2675 time_t sec;
2676 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002677 int round;
2678 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01002679 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002680 if (check_time_rounding(round) < 0)
2681 return NULL;
2682 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01002683 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01002684 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01002685}
2686
Antoine Pitrou796564c2013-07-30 19:59:21 +02002687static void
2688slot_tp_del(PyObject *self)
2689{
2690 _Py_IDENTIFIER(__tp_del__);
2691 PyObject *del, *res;
2692 PyObject *error_type, *error_value, *error_traceback;
2693
2694 /* Temporarily resurrect the object. */
2695 assert(self->ob_refcnt == 0);
2696 self->ob_refcnt = 1;
2697
2698 /* Save the current exception, if any. */
2699 PyErr_Fetch(&error_type, &error_value, &error_traceback);
2700
2701 /* Execute __del__ method, if any. */
2702 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
2703 if (del != NULL) {
2704 res = PyEval_CallObject(del, NULL);
2705 if (res == NULL)
2706 PyErr_WriteUnraisable(del);
2707 else
2708 Py_DECREF(res);
2709 Py_DECREF(del);
2710 }
2711
2712 /* Restore the saved exception. */
2713 PyErr_Restore(error_type, error_value, error_traceback);
2714
2715 /* Undo the temporary resurrection; can't use DECREF here, it would
2716 * cause a recursive call.
2717 */
2718 assert(self->ob_refcnt > 0);
2719 if (--self->ob_refcnt == 0)
2720 return; /* this is the normal path out */
2721
2722 /* __del__ resurrected it! Make it look like the original Py_DECREF
2723 * never happened.
2724 */
2725 {
2726 Py_ssize_t refcnt = self->ob_refcnt;
2727 _Py_NewReference(self);
2728 self->ob_refcnt = refcnt;
2729 }
2730 assert(!PyType_IS_GC(Py_TYPE(self)) ||
2731 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
2732 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
2733 * we need to undo that. */
2734 _Py_DEC_REFTOTAL;
2735 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
2736 * chain, so no more to do there.
2737 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
2738 * _Py_NewReference bumped tp_allocs: both of those need to be
2739 * undone.
2740 */
2741#ifdef COUNT_ALLOCS
2742 --Py_TYPE(self)->tp_frees;
2743 --Py_TYPE(self)->tp_allocs;
2744#endif
2745}
2746
2747static PyObject *
2748with_tp_del(PyObject *self, PyObject *args)
2749{
2750 PyObject *obj;
2751 PyTypeObject *tp;
2752
2753 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
2754 return NULL;
2755 tp = (PyTypeObject *) obj;
2756 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
2757 PyErr_Format(PyExc_TypeError,
2758 "heap type expected, got %R", obj);
2759 return NULL;
2760 }
2761 tp->tp_del = slot_tp_del;
2762 Py_INCREF(obj);
2763 return obj;
2764}
2765
Antoine Pitroub349e4c2014-08-06 19:31:40 -04002766static PyMethodDef ml;
2767
2768static PyObject *
2769create_cfunction(PyObject *self, PyObject *args)
2770{
2771 return PyCFunction_NewEx(&ml, self, NULL);
2772}
2773
2774static PyMethodDef ml = {
2775 "create_cfunction",
2776 create_cfunction,
2777 METH_NOARGS,
2778 NULL
2779};
2780
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07002781static PyObject *
2782_test_incref(PyObject *ob)
2783{
2784 Py_INCREF(ob);
2785 return ob;
2786}
2787
2788static PyObject *
2789test_xincref_doesnt_leak(PyObject *ob)
2790{
2791 PyObject *obj = PyLong_FromLong(0);
2792 Py_XINCREF(_test_incref(obj));
2793 Py_DECREF(obj);
2794 Py_DECREF(obj);
2795 Py_DECREF(obj);
2796 Py_RETURN_NONE;
2797}
2798
2799static PyObject *
2800test_incref_doesnt_leak(PyObject *ob)
2801{
2802 PyObject *obj = PyLong_FromLong(0);
2803 Py_INCREF(_test_incref(obj));
2804 Py_DECREF(obj);
2805 Py_DECREF(obj);
2806 Py_DECREF(obj);
2807 Py_RETURN_NONE;
2808}
2809
2810static PyObject *
2811test_xdecref_doesnt_leak(PyObject *ob)
2812{
2813 Py_XDECREF(PyLong_FromLong(0));
2814 Py_RETURN_NONE;
2815}
2816
2817static PyObject *
2818test_decref_doesnt_leak(PyObject *ob)
2819{
2820 Py_DECREF(PyLong_FromLong(0));
2821 Py_RETURN_NONE;
2822}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002823
Victor Stinner0507bf52013-07-07 02:05:46 +02002824static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02002825test_incref_decref_API(PyObject *ob)
2826{
2827 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02002828 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02002829 Py_DecRef(obj);
2830 Py_DecRef(obj);
2831 Py_RETURN_NONE;
2832}
2833
2834static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02002835test_pymem_alloc0(PyObject *self)
2836{
2837 void *ptr;
2838
Victor Stinnerdb067af2014-05-02 22:31:14 +02002839 ptr = PyMem_RawMalloc(0);
2840 if (ptr == NULL) {
2841 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
2842 return NULL;
2843 }
2844 PyMem_RawFree(ptr);
2845
2846 ptr = PyMem_RawCalloc(0, 0);
2847 if (ptr == NULL) {
2848 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
2849 return NULL;
2850 }
2851 PyMem_RawFree(ptr);
2852
Victor Stinner0507bf52013-07-07 02:05:46 +02002853 ptr = PyMem_Malloc(0);
2854 if (ptr == NULL) {
2855 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
2856 return NULL;
2857 }
2858 PyMem_Free(ptr);
2859
Victor Stinnerdb067af2014-05-02 22:31:14 +02002860 ptr = PyMem_Calloc(0, 0);
2861 if (ptr == NULL) {
2862 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
2863 return NULL;
2864 }
2865 PyMem_Free(ptr);
2866
Victor Stinner0507bf52013-07-07 02:05:46 +02002867 ptr = PyObject_Malloc(0);
2868 if (ptr == NULL) {
2869 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
2870 return NULL;
2871 }
2872 PyObject_Free(ptr);
2873
Victor Stinnerdb067af2014-05-02 22:31:14 +02002874 ptr = PyObject_Calloc(0, 0);
2875 if (ptr == NULL) {
2876 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
2877 return NULL;
2878 }
2879 PyObject_Free(ptr);
2880
Victor Stinner0507bf52013-07-07 02:05:46 +02002881 Py_RETURN_NONE;
2882}
2883
2884typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02002885 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02002886
2887 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02002888 size_t calloc_nelem;
2889 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02002890 void *realloc_ptr;
2891 size_t realloc_new_size;
2892 void *free_ptr;
2893} alloc_hook_t;
2894
2895static void* hook_malloc (void* ctx, size_t size)
2896{
2897 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2898 hook->malloc_size = size;
2899 return hook->alloc.malloc(hook->alloc.ctx, size);
2900}
2901
Victor Stinnerdb067af2014-05-02 22:31:14 +02002902static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
2903{
2904 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2905 hook->calloc_nelem = nelem;
2906 hook->calloc_elsize = elsize;
2907 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
2908}
2909
Victor Stinner0507bf52013-07-07 02:05:46 +02002910static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
2911{
2912 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2913 hook->realloc_ptr = ptr;
2914 hook->realloc_new_size = new_size;
2915 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
2916}
2917
2918static void hook_free (void *ctx, void *ptr)
2919{
2920 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2921 hook->free_ptr = ptr;
2922 hook->alloc.free(hook->alloc.ctx, ptr);
2923}
2924
2925static PyObject *
2926test_setallocators(PyMemAllocatorDomain domain)
2927{
2928 PyObject *res = NULL;
2929 const char *error_msg;
2930 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02002931 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02002932 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02002933 void *ptr, *ptr2;
2934
Victor Stinnerdb067af2014-05-02 22:31:14 +02002935 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02002936
2937 alloc.ctx = &hook;
2938 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02002939 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02002940 alloc.realloc = &hook_realloc;
2941 alloc.free = &hook_free;
2942 PyMem_GetAllocator(domain, &hook.alloc);
2943 PyMem_SetAllocator(domain, &alloc);
2944
2945 size = 42;
2946 switch(domain)
2947 {
2948 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
2949 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
2950 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
2951 default: ptr = NULL; break;
2952 }
2953
2954 if (ptr == NULL) {
2955 error_msg = "malloc failed";
2956 goto fail;
2957 }
2958
2959 if (hook.malloc_size != size) {
2960 error_msg = "malloc invalid size";
2961 goto fail;
2962 }
2963
2964 size2 = 200;
2965 switch(domain)
2966 {
2967 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
2968 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
2969 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02002970 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02002971 }
2972
2973 if (ptr2 == NULL) {
2974 error_msg = "realloc failed";
2975 goto fail;
2976 }
2977
2978 if (hook.realloc_ptr != ptr
2979 || hook.realloc_new_size != size2) {
2980 error_msg = "realloc invalid parameters";
2981 goto fail;
2982 }
2983
2984 switch(domain)
2985 {
2986 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
2987 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
2988 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
2989 }
2990
2991 if (hook.free_ptr != ptr2) {
2992 error_msg = "free invalid pointer";
2993 goto fail;
2994 }
2995
Victor Stinnerdb067af2014-05-02 22:31:14 +02002996 nelem = 2;
2997 elsize = 5;
2998 switch(domain)
2999 {
3000 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3001 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3002 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3003 default: ptr = NULL; break;
3004 }
3005
3006 if (ptr == NULL) {
3007 error_msg = "calloc failed";
3008 goto fail;
3009 }
3010
3011 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3012 error_msg = "calloc invalid nelem or elsize";
3013 goto fail;
3014 }
3015
3016 switch(domain)
3017 {
3018 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3019 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3020 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3021 }
3022
Victor Stinner0507bf52013-07-07 02:05:46 +02003023 Py_INCREF(Py_None);
3024 res = Py_None;
3025 goto finally;
3026
3027fail:
3028 PyErr_SetString(PyExc_RuntimeError, error_msg);
3029
3030finally:
3031 PyMem_SetAllocator(domain, &hook.alloc);
3032 return res;
3033}
3034
3035static PyObject *
3036test_pymem_setrawallocators(PyObject *self)
3037{
3038 return test_setallocators(PYMEM_DOMAIN_RAW);
3039}
3040
3041static PyObject *
3042test_pymem_setallocators(PyObject *self)
3043{
3044 return test_setallocators(PYMEM_DOMAIN_MEM);
3045}
3046
3047static PyObject *
3048test_pyobject_setallocators(PyObject *self)
3049{
3050 return test_setallocators(PYMEM_DOMAIN_OBJ);
3051}
3052
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003053PyDoc_STRVAR(docstring_empty,
3054""
3055);
3056
3057PyDoc_STRVAR(docstring_no_signature,
3058"This docstring has no signature."
3059);
3060
3061PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003062"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003063"\n"
3064"This docstring has an invalid signature."
3065);
3066
Larry Hastings2623c8c2014-02-08 22:15:29 -08003067PyDoc_STRVAR(docstring_with_invalid_signature2,
3068"docstring_with_invalid_signature2($module, /, boo)\n"
3069"\n"
3070"--\n"
3071"\n"
3072"This docstring also has an invalid signature."
3073);
3074
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003075PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003076"docstring_with_signature($module, /, sig)\n"
3077"--\n"
3078"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003079"This docstring has a valid signature."
3080);
3081
3082PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003083"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3084"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003085"\n"
3086"\n"
3087"This docstring has a valid signature and some extra newlines."
3088);
3089
Larry Hastings16c51912014-01-07 11:53:01 -08003090PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003091"docstring_with_signature_with_defaults(module, s='avocado',\n"
3092" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3093" local=the_number_three, sys=sys.maxsize,\n"
3094" exp=sys.maxsize - 1)\n"
3095"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003096"\n"
3097"\n"
3098"\n"
3099"This docstring has a valid signature with parameters,\n"
3100"and the parameters take defaults of varying types."
3101);
3102
Victor Stinner258e4d32013-12-13 02:30:12 +01003103#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003104typedef struct {
3105 PyThread_type_lock start_event;
3106 PyThread_type_lock exit_event;
3107 PyObject *callback;
3108} test_c_thread_t;
3109
3110static void
3111temporary_c_thread(void *data)
3112{
3113 test_c_thread_t *test_c_thread = data;
3114 PyGILState_STATE state;
3115 PyObject *res;
3116
3117 PyThread_release_lock(test_c_thread->start_event);
3118
3119 /* Allocate a Python thread state for this thread */
3120 state = PyGILState_Ensure();
3121
3122 res = PyObject_CallFunction(test_c_thread->callback, "", NULL);
3123 Py_CLEAR(test_c_thread->callback);
3124
3125 if (res == NULL) {
3126 PyErr_Print();
3127 }
3128 else {
3129 Py_DECREF(res);
3130 }
3131
3132 /* Destroy the Python thread state for this thread */
3133 PyGILState_Release(state);
3134
3135 PyThread_release_lock(test_c_thread->exit_event);
3136
3137 PyThread_exit_thread();
3138}
3139
3140static PyObject *
3141call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3142{
3143 PyObject *res = NULL;
3144 test_c_thread_t test_c_thread;
3145 long thread;
3146
3147 PyEval_InitThreads();
3148
3149 test_c_thread.start_event = PyThread_allocate_lock();
3150 test_c_thread.exit_event = PyThread_allocate_lock();
3151 test_c_thread.callback = NULL;
3152 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3153 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3154 goto exit;
3155 }
3156
3157 Py_INCREF(callback);
3158 test_c_thread.callback = callback;
3159
3160 PyThread_acquire_lock(test_c_thread.start_event, 1);
3161 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3162
3163 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3164 if (thread == -1) {
3165 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3166 PyThread_release_lock(test_c_thread.start_event);
3167 PyThread_release_lock(test_c_thread.exit_event);
3168 goto exit;
3169 }
3170
3171 PyThread_acquire_lock(test_c_thread.start_event, 1);
3172 PyThread_release_lock(test_c_thread.start_event);
3173
3174 Py_BEGIN_ALLOW_THREADS
3175 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3176 PyThread_release_lock(test_c_thread.exit_event);
3177 Py_END_ALLOW_THREADS
3178
3179 Py_INCREF(Py_None);
3180 res = Py_None;
3181
3182exit:
3183 Py_CLEAR(test_c_thread.callback);
3184 if (test_c_thread.start_event)
3185 PyThread_free_lock(test_c_thread.start_event);
3186 if (test_c_thread.exit_event)
3187 PyThread_free_lock(test_c_thread.exit_event);
3188 return res;
3189}
Victor Stinner258e4d32013-12-13 02:30:12 +01003190#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003191
Victor Stinner56e8c292014-07-21 12:30:22 +02003192static PyObject*
3193test_raise_signal(PyObject* self, PyObject *args)
3194{
3195 int signum, err;
3196
3197 if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0)
3198 return NULL;
3199
3200 err = raise(signum);
3201 if (err)
3202 return PyErr_SetFromErrno(PyExc_OSError);
3203
3204 if (PyErr_CheckSignals() < 0)
3205 return NULL;
3206
3207 Py_RETURN_NONE;
3208}
3209
Serhiy Storchakab5181342015-02-06 08:58:56 +02003210/* marshal */
3211
3212static PyObject*
3213pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3214{
3215 long value;
3216 char *filename;
3217 int version;
3218 FILE *fp;
3219
3220 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3221 &value, &filename, &version))
3222 return NULL;
3223
3224 fp = fopen(filename, "wb");
3225 if (fp == NULL) {
3226 PyErr_SetFromErrno(PyExc_OSError);
3227 return NULL;
3228 }
3229
3230 PyMarshal_WriteLongToFile(value, fp, version);
3231
3232 fclose(fp);
3233 if (PyErr_Occurred())
3234 return NULL;
3235 Py_RETURN_NONE;
3236}
3237
3238static PyObject*
3239pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3240{
3241 PyObject *obj;
3242 char *filename;
3243 int version;
3244 FILE *fp;
3245
3246 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3247 &obj, &filename, &version))
3248 return NULL;
3249
3250 fp = fopen(filename, "wb");
3251 if (fp == NULL) {
3252 PyErr_SetFromErrno(PyExc_OSError);
3253 return NULL;
3254 }
3255
3256 PyMarshal_WriteObjectToFile(obj, fp, version);
3257
3258 fclose(fp);
3259 if (PyErr_Occurred())
3260 return NULL;
3261 Py_RETURN_NONE;
3262}
3263
3264static PyObject*
3265pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3266{
3267 int value;
3268 long pos;
3269 char *filename;
3270 FILE *fp;
3271
3272 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3273 return NULL;
3274
3275 fp = fopen(filename, "rb");
3276 if (fp == NULL) {
3277 PyErr_SetFromErrno(PyExc_OSError);
3278 return NULL;
3279 }
3280
3281 value = PyMarshal_ReadShortFromFile(fp);
3282 pos = ftell(fp);
3283
3284 fclose(fp);
3285 if (PyErr_Occurred())
3286 return NULL;
3287 return Py_BuildValue("il", value, pos);
3288}
3289
3290static PyObject*
3291pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3292{
3293 long value, pos;
3294 char *filename;
3295 FILE *fp;
3296
3297 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3298 return NULL;
3299
3300 fp = fopen(filename, "rb");
3301 if (fp == NULL) {
3302 PyErr_SetFromErrno(PyExc_OSError);
3303 return NULL;
3304 }
3305
3306 value = PyMarshal_ReadLongFromFile(fp);
3307 pos = ftell(fp);
3308
3309 fclose(fp);
3310 if (PyErr_Occurred())
3311 return NULL;
3312 return Py_BuildValue("ll", value, pos);
3313}
3314
3315static PyObject*
3316pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3317{
3318 PyObject *obj;
3319 long pos;
3320 char *filename;
3321 FILE *fp;
3322
3323 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3324 return NULL;
3325
3326 fp = fopen(filename, "rb");
3327 if (fp == NULL) {
3328 PyErr_SetFromErrno(PyExc_OSError);
3329 return NULL;
3330 }
3331
3332 obj = PyMarshal_ReadLastObjectFromFile(fp);
3333 pos = ftell(fp);
3334
3335 fclose(fp);
3336 return Py_BuildValue("Nl", obj, pos);
3337}
3338
3339static PyObject*
3340pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3341{
3342 PyObject *obj;
3343 long pos;
3344 char *filename;
3345 FILE *fp;
3346
3347 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3348 return NULL;
3349
3350 fp = fopen(filename, "rb");
3351 if (fp == NULL) {
3352 PyErr_SetFromErrno(PyExc_OSError);
3353 return NULL;
3354 }
3355
3356 obj = PyMarshal_ReadObjectFromFile(fp);
3357 pos = ftell(fp);
3358
3359 fclose(fp);
3360 return Py_BuildValue("Nl", obj, pos);
3361}
3362
Victor Stinnerefde1462015-03-21 15:04:43 +01003363static PyObject*
3364return_null_without_error(PyObject *self, PyObject *args)
3365{
3366 /* invalid call: return NULL without setting an error,
3367 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3368 PyErr_Clear();
3369 return NULL;
3370}
3371
3372static PyObject*
3373return_result_with_error(PyObject *self, PyObject *args)
3374{
3375 /* invalid call: return a result with an error set,
3376 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3377 PyErr_SetNone(PyExc_ValueError);
3378 Py_RETURN_NONE;
3379}
3380
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003381
Tim Peters9ea17ac2001-02-02 05:57:15 +00003382static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003383 {"raise_exception", raise_exception, METH_VARARGS},
3384 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
3385 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01003386 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
3388 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
3389 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
3390 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003392 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
3393 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
3394 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
3395 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02003396 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003397 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
3398 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02003399 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
3400 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
3402 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
3403 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07003404 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
3406 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
3407 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
3408 PyDoc_STR("This is a pretty normal docstring.")},
3409 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
3410 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
3411 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01003412 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01003413#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01003414 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01003415#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01003416 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 {"getargs_tuple", getargs_tuple, METH_VARARGS},
3418 {"getargs_keywords", (PyCFunction)getargs_keywords,
3419 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00003420 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
3421 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003422 {"getargs_b", getargs_b, METH_VARARGS},
3423 {"getargs_B", getargs_B, METH_VARARGS},
3424 {"getargs_h", getargs_h, METH_VARARGS},
3425 {"getargs_H", getargs_H, METH_VARARGS},
3426 {"getargs_I", getargs_I, METH_VARARGS},
3427 {"getargs_k", getargs_k, METH_VARARGS},
3428 {"getargs_i", getargs_i, METH_VARARGS},
3429 {"getargs_l", getargs_l, METH_VARARGS},
3430 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07003431 {"getargs_p", getargs_p, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00003432#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003433 {"getargs_L", getargs_L, METH_VARARGS},
3434 {"getargs_K", getargs_K, METH_VARARGS},
3435 {"test_longlong_api", test_longlong_api, METH_NOARGS},
3436 {"test_long_long_and_overflow",
3437 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
3438 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003439#endif
Eli Bendersky906b88f2011-07-29 07:05:08 +03003440 {"getargs_c", getargs_c, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003441 {"getargs_s", getargs_s, METH_VARARGS},
3442 {"getargs_s_star", getargs_s_star, METH_VARARGS},
3443 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
3444 {"getargs_z", getargs_z, METH_VARARGS},
3445 {"getargs_z_star", getargs_z_star, METH_VARARGS},
3446 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
3447 {"getargs_y", getargs_y, METH_VARARGS},
3448 {"getargs_y_star", getargs_y_star, METH_VARARGS},
3449 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
3450 {"getargs_u", getargs_u, METH_VARARGS},
3451 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
3452 {"getargs_Z", getargs_Z, METH_VARARGS},
3453 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00003454 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003455 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003456 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003457 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003458 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003459 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
3460 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
3461 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
3462 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01003463 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
3464 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
3465 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
3466 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01003467 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003468#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00003469 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003470 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003471#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00003472#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00003473 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00003474#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00003475 {"traceback_print", traceback_print, METH_VARARGS},
3476 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02003477 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00003478 {"argparsing", argparsing, METH_VARARGS},
3479 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003480 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
3481 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003482 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
3483 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003484 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003485 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01003486 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
3487 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01003488 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02003489 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003490 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02003491 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02003492 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
3493 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02003494 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
3495 {"test_pymem_setallocators",
3496 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
3497 {"test_pyobject_setallocators",
3498 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003499 {"no_docstring",
3500 (PyCFunction)test_with_docstring, METH_NOARGS},
3501 {"docstring_empty",
3502 (PyCFunction)test_with_docstring, METH_NOARGS,
3503 docstring_empty},
3504 {"docstring_no_signature",
3505 (PyCFunction)test_with_docstring, METH_NOARGS,
3506 docstring_no_signature},
3507 {"docstring_with_invalid_signature",
3508 (PyCFunction)test_with_docstring, METH_NOARGS,
3509 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08003510 {"docstring_with_invalid_signature2",
3511 (PyCFunction)test_with_docstring, METH_NOARGS,
3512 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003513 {"docstring_with_signature",
3514 (PyCFunction)test_with_docstring, METH_NOARGS,
3515 docstring_with_signature},
3516 {"docstring_with_signature_and_extra_newlines",
3517 (PyCFunction)test_with_docstring, METH_NOARGS,
3518 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08003519 {"docstring_with_signature_with_defaults",
3520 (PyCFunction)test_with_docstring, METH_NOARGS,
3521 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02003522 {"raise_signal",
3523 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01003524#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003525 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
3526 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01003527#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02003528 {"pymarshal_write_long_to_file",
3529 pymarshal_write_long_to_file, METH_VARARGS},
3530 {"pymarshal_write_object_to_file",
3531 pymarshal_write_object_to_file, METH_VARARGS},
3532 {"pymarshal_read_short_from_file",
3533 pymarshal_read_short_from_file, METH_VARARGS},
3534 {"pymarshal_read_long_from_file",
3535 pymarshal_read_long_from_file, METH_VARARGS},
3536 {"pymarshal_read_last_object_from_file",
3537 pymarshal_read_last_object_from_file, METH_VARARGS},
3538 {"pymarshal_read_object_from_file",
3539 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01003540 {"return_null_without_error",
3541 return_null_without_error, METH_NOARGS},
3542 {"return_result_with_error",
3543 return_result_with_error, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003544 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00003545};
3546
Thomas Hellera4ea6032003-04-17 18:55:45 +00003547#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
3548
Thomas Wouters89f507f2006-12-13 04:49:30 +00003549typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003550 char bool_member;
3551 char byte_member;
3552 unsigned char ubyte_member;
3553 short short_member;
3554 unsigned short ushort_member;
3555 int int_member;
3556 unsigned int uint_member;
3557 long long_member;
3558 unsigned long ulong_member;
3559 Py_ssize_t pyssizet_member;
3560 float float_member;
3561 double double_member;
3562 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003563#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003564 PY_LONG_LONG longlong_member;
3565 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003566#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003567} all_structmembers;
3568
3569typedef struct {
3570 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003571 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003572} test_structmembers;
3573
3574static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003575 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
3576 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
3577 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
3578 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
3579 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
3580 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
3581 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
3582 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
3583 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
3584 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
3585 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
3586 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
3587 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003588#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003589 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
3590 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003591#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003592 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00003593};
3594
3595
Christian Heimes1af737c2008-01-23 08:24:23 +00003596static PyObject *
3597test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
3598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003599 static char *keywords[] = {
3600 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
3601 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
3602 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00003603#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003604 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00003605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 NULL};
3607 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00003608#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003609 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00003610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003611 ;
3612 test_structmembers *ob;
3613 const char *s = NULL;
3614 Py_ssize_t string_len = 0;
3615 ob = PyObject_New(test_structmembers, type);
3616 if (ob == NULL)
3617 return NULL;
3618 memset(&ob->structmembers, 0, sizeof(all_structmembers));
3619 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
3620 &ob->structmembers.bool_member,
3621 &ob->structmembers.byte_member,
3622 &ob->structmembers.ubyte_member,
3623 &ob->structmembers.short_member,
3624 &ob->structmembers.ushort_member,
3625 &ob->structmembers.int_member,
3626 &ob->structmembers.uint_member,
3627 &ob->structmembers.long_member,
3628 &ob->structmembers.ulong_member,
3629 &ob->structmembers.pyssizet_member,
3630 &ob->structmembers.float_member,
3631 &ob->structmembers.double_member,
3632 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00003633#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003634 , &ob->structmembers.longlong_member,
3635 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00003636#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003637 )) {
3638 Py_DECREF(ob);
3639 return NULL;
3640 }
3641 if (s != NULL) {
3642 if (string_len > 5) {
3643 Py_DECREF(ob);
3644 PyErr_SetString(PyExc_ValueError, "string too long");
3645 return NULL;
3646 }
3647 strcpy(ob->structmembers.inplace_member, s);
3648 }
3649 else {
3650 strcpy(ob->structmembers.inplace_member, "");
3651 }
3652 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003653}
3654
Christian Heimes1af737c2008-01-23 08:24:23 +00003655static void
3656test_structmembers_free(PyObject *ob)
3657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003658 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003659}
3660
3661static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003662 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003663 "test_structmembersType",
3664 sizeof(test_structmembers), /* tp_basicsize */
3665 0, /* tp_itemsize */
3666 test_structmembers_free, /* destructor tp_dealloc */
3667 0, /* tp_print */
3668 0, /* tp_getattr */
3669 0, /* tp_setattr */
3670 0, /* tp_reserved */
3671 0, /* tp_repr */
3672 0, /* tp_as_number */
3673 0, /* tp_as_sequence */
3674 0, /* tp_as_mapping */
3675 0, /* tp_hash */
3676 0, /* tp_call */
3677 0, /* tp_str */
3678 PyObject_GenericGetAttr, /* tp_getattro */
3679 PyObject_GenericSetAttr, /* tp_setattro */
3680 0, /* tp_as_buffer */
3681 0, /* tp_flags */
3682 "Type containing all structmember types",
3683 0, /* traverseproc tp_traverse */
3684 0, /* tp_clear */
3685 0, /* tp_richcompare */
3686 0, /* tp_weaklistoffset */
3687 0, /* tp_iter */
3688 0, /* tp_iternext */
3689 0, /* tp_methods */
3690 test_members, /* tp_members */
3691 0,
3692 0,
3693 0,
3694 0,
3695 0,
3696 0,
3697 0,
3698 0,
3699 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003700};
3701
3702
Benjamin Petersond51374e2014-04-09 23:55:56 -04003703typedef struct {
3704 PyObject_HEAD
3705} matmulObject;
3706
3707static PyObject *
3708matmulType_matmul(PyObject *self, PyObject *other)
3709{
3710 return Py_BuildValue("(sOO)", "matmul", self, other);
3711}
3712
3713static PyObject *
3714matmulType_imatmul(PyObject *self, PyObject *other)
3715{
3716 return Py_BuildValue("(sOO)", "imatmul", self, other);
3717}
3718
3719static void
3720matmulType_dealloc(PyObject *self)
3721{
Zachary Ware420dc562014-04-23 13:51:27 -05003722 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04003723}
3724
3725static PyNumberMethods matmulType_as_number = {
3726 0, /* nb_add */
3727 0, /* nb_subtract */
3728 0, /* nb_multiply */
3729 0, /* nb_remainde r*/
3730 0, /* nb_divmod */
3731 0, /* nb_power */
3732 0, /* nb_negative */
3733 0, /* tp_positive */
3734 0, /* tp_absolute */
3735 0, /* tp_bool */
3736 0, /* nb_invert */
3737 0, /* nb_lshift */
3738 0, /* nb_rshift */
3739 0, /* nb_and */
3740 0, /* nb_xor */
3741 0, /* nb_or */
3742 0, /* nb_int */
3743 0, /* nb_reserved */
3744 0, /* nb_float */
3745 0, /* nb_inplace_add */
3746 0, /* nb_inplace_subtract */
3747 0, /* nb_inplace_multiply */
3748 0, /* nb_inplace_remainder */
3749 0, /* nb_inplace_power */
3750 0, /* nb_inplace_lshift */
3751 0, /* nb_inplace_rshift */
3752 0, /* nb_inplace_and */
3753 0, /* nb_inplace_xor */
3754 0, /* nb_inplace_or */
3755 0, /* nb_floor_divide */
3756 0, /* nb_true_divide */
3757 0, /* nb_inplace_floor_divide */
3758 0, /* nb_inplace_true_divide */
3759 0, /* nb_index */
3760 matmulType_matmul, /* nb_matrix_multiply */
3761 matmulType_imatmul /* nb_matrix_inplace_multiply */
3762};
3763
3764static PyTypeObject matmulType = {
3765 PyVarObject_HEAD_INIT(NULL, 0)
3766 "matmulType",
3767 sizeof(matmulObject), /* tp_basicsize */
3768 0, /* tp_itemsize */
3769 matmulType_dealloc, /* destructor tp_dealloc */
3770 0, /* tp_print */
3771 0, /* tp_getattr */
3772 0, /* tp_setattr */
3773 0, /* tp_reserved */
3774 0, /* tp_repr */
3775 &matmulType_as_number, /* tp_as_number */
3776 0, /* tp_as_sequence */
3777 0, /* tp_as_mapping */
3778 0, /* tp_hash */
3779 0, /* tp_call */
3780 0, /* tp_str */
3781 PyObject_GenericGetAttr, /* tp_getattro */
3782 PyObject_GenericSetAttr, /* tp_setattro */
3783 0, /* tp_as_buffer */
3784 0, /* tp_flags */
3785 "C level type with matrix operations defined",
3786 0, /* traverseproc tp_traverse */
3787 0, /* tp_clear */
3788 0, /* tp_richcompare */
3789 0, /* tp_weaklistoffset */
3790 0, /* tp_iter */
3791 0, /* tp_iternext */
3792 0, /* tp_methods */
3793 0, /* tp_members */
3794 0,
3795 0,
3796 0,
3797 0,
3798 0,
3799 0,
3800 0,
3801 0,
3802 PyType_GenericNew, /* tp_new */
3803 PyObject_Del, /* tp_free */
3804};
3805
Martin v. Löwis1a214512008-06-11 05:26:20 +00003806
3807static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003808 PyModuleDef_HEAD_INIT,
3809 "_testcapi",
3810 NULL,
3811 -1,
3812 TestMethods,
3813 NULL,
3814 NULL,
3815 NULL,
3816 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003817};
3818
Mark Hammond62b1ab12002-07-23 06:31:15 +00003819PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003820PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00003821{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003822 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003824 m = PyModule_Create(&_testcapimodule);
3825 if (m == NULL)
3826 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003828 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00003829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003830 Py_TYPE(&test_structmembersType)=&PyType_Type;
3831 Py_INCREF(&test_structmembersType);
3832 /* don't use a name starting with "test", since we don't want
3833 test_capi to automatically call this */
3834 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04003835 if (PyType_Ready(&matmulType) < 0)
3836 return NULL;
3837 Py_INCREF(&matmulType);
3838 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003840 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
3841 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
3842 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
3843 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
3844 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
3845 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
3846 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
3847 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
3848 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
3849 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
3850 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
3851 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
3852 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
3853 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
3854 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
3855 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
3856 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
3857 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
3858 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
3859 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
3860 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
3861 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
3862 Py_INCREF(&PyInstanceMethod_Type);
3863 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00003864
Larry Hastings2a727912014-01-16 11:32:01 -08003865 PyModule_AddIntConstant(m, "the_number_three", 3);
3866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003867 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
3868 Py_INCREF(TestError);
3869 PyModule_AddObject(m, "error", TestError);
3870 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00003871}