blob: 7b6c2c157990f708755b24b709f3c4dda6fa3b01 [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
Victor Stinner95e9cef2015-03-28 01:26:47 +010017#ifdef MS_WINDOWS
Victor Stinner09e5cf22015-03-30 00:09:18 +020018# include <winsock2.h> /* struct timeval */
Victor Stinner95e9cef2015-03-28 01:26:47 +010019#endif
20
Mark Hammond8d98d2c2003-04-19 15:41:53 +000021#ifdef WITH_THREAD
22#include "pythread.h"
23#endif /* WITH_THREAD */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000024static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000025
Tim Peters91621db2001-06-12 20:10:01 +000026/* Raise TestError with test_name + ": " + msg, and return NULL. */
27
28static PyObject *
29raiseTestError(const char* test_name, const char* msg)
30{
Victor Stinner6ced7c42011-03-21 18:15:42 +010031 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000032 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000033}
34
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000035/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000036
37 The ones derived from autoconf on the UNIX-like OSes can be relied
38 upon (in the absence of sloppy cross-compiling), but the Windows
39 platforms have these hardcoded. Better safe than sorry.
40*/
41static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000042sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000044{
Victor Stinner499dfcf2011-03-21 13:26:24 +010045 PyErr_Format(TestError,
46 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000049}
50
51static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000052test_config(PyObject *self)
Tim Peters9ea17ac2001-02-02 05:57:15 +000053{
Tim Peters9ea17ac2001-02-02 05:57:15 +000054#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000055 if (FATNAME != sizeof(TYPE)) \
56 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 CHECK_SIZEOF(SIZEOF_SHORT, short);
59 CHECK_SIZEOF(SIZEOF_INT, int);
60 CHECK_SIZEOF(SIZEOF_LONG, long);
61 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
62 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
Tim Peters9ea17ac2001-02-02 05:57:15 +000064
65#undef CHECK_SIZEOF
66
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 Py_INCREF(Py_None);
68 return Py_None;
Tim Peters9ea17ac2001-02-02 05:57:15 +000069}
70
Tim Peters5c4d5bf2001-02-12 22:13:26 +000071static PyObject*
Victor Stinner01076552013-10-29 19:39:52 +010072test_sizeof_c_types(PyObject *self)
73{
Ned Deilye37a1942015-03-05 15:47:10 -080074#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020075#pragma GCC diagnostic push
76#pragma GCC diagnostic ignored "-Wtype-limits"
77#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010078#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010079 if (EXPECTED != sizeof(TYPE)) { \
80 PyErr_Format(TestError, \
81 "sizeof(%s) = %u instead of %u", \
82 #TYPE, sizeof(TYPE), EXPECTED); \
83 return (PyObject*)NULL; \
84 }
Victor Stinnerf866f972013-10-29 19:59:31 +010085#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
86#define CHECK_SIGNNESS(TYPE, SIGNED) \
87 if (IS_SIGNED(TYPE) != SIGNED) { \
88 PyErr_Format(TestError, \
89 "%s signness is, instead of %i", \
90 #TYPE, IS_SIGNED(TYPE), SIGNED); \
91 return (PyObject*)NULL; \
92 }
Victor Stinner01076552013-10-29 19:39:52 +010093
94 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +010095 CHECK_SIZEOF(Py_UCS1, 1);
96 CHECK_SIZEOF(Py_UCS2, 2);
97 CHECK_SIZEOF(Py_UCS4, 4);
98 CHECK_SIGNNESS(Py_UCS1, 0);
99 CHECK_SIGNNESS(Py_UCS2, 0);
100 CHECK_SIGNNESS(Py_UCS4, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100101#ifdef HAVE_INT32_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100102 CHECK_SIZEOF(PY_INT32_T, 4);
103 CHECK_SIGNNESS(PY_INT32_T, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100104#endif
105#ifdef HAVE_UINT32_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100106 CHECK_SIZEOF(PY_UINT32_T, 4);
107 CHECK_SIGNNESS(PY_UINT32_T, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100108#endif
109#ifdef HAVE_INT64_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100110 CHECK_SIZEOF(PY_INT64_T, 8);
111 CHECK_SIGNNESS(PY_INT64_T, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100112#endif
113#ifdef HAVE_UINT64_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100114 CHECK_SIZEOF(PY_UINT64_T, 8);
115 CHECK_SIGNNESS(PY_UINT64_T, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100116#endif
117
118 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100119 CHECK_SIZEOF(size_t, sizeof(void *));
120 CHECK_SIGNNESS(size_t, 0);
121 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
122 CHECK_SIGNNESS(Py_ssize_t, 1);
123
124 CHECK_SIZEOF(Py_uintptr_t, sizeof(void *));
125 CHECK_SIGNNESS(Py_uintptr_t, 0);
126 CHECK_SIZEOF(Py_intptr_t, sizeof(void *));
127 CHECK_SIGNNESS(Py_intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100128
129 Py_INCREF(Py_None);
130 return Py_None;
131
Victor Stinnerf866f972013-10-29 19:59:31 +0100132#undef IS_SIGNED
133#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100134#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800135#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200136#pragma GCC diagnostic pop
137#endif
Victor Stinner01076552013-10-29 19:39:52 +0100138}
139
140
141static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000142test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 PyObject* list;
145 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000148#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 list = PyList_New(NLIST);
150 if (list == (PyObject*)NULL)
151 return (PyObject*)NULL;
152 /* list = range(NLIST) */
153 for (i = 0; i < NLIST; ++i) {
154 PyObject* anint = PyLong_FromLong(i);
155 if (anint == (PyObject*)NULL) {
156 Py_DECREF(list);
157 return (PyObject*)NULL;
158 }
159 PyList_SET_ITEM(list, i, anint);
160 }
161 /* list.reverse(), via PyList_Reverse() */
162 i = PyList_Reverse(list); /* should not blow up! */
163 if (i != 0) {
164 Py_DECREF(list);
165 return (PyObject*)NULL;
166 }
167 /* Check that list == range(29, -1, -1) now */
168 for (i = 0; i < NLIST; ++i) {
169 PyObject* anint = PyList_GET_ITEM(list, i);
170 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
171 PyErr_SetString(TestError,
172 "test_list_api: reverse screwed up");
173 Py_DECREF(list);
174 return (PyObject*)NULL;
175 }
176 }
177 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000178#undef NLIST
179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 Py_INCREF(Py_None);
181 return Py_None;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000182}
183
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000184static int
185test_dict_inner(int count)
186{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 Py_ssize_t pos = 0, iterations = 0;
188 int i;
189 PyObject *dict = PyDict_New();
190 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 if (dict == NULL)
193 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 for (i = 0; i < count; i++) {
196 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200197 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200198 return -1;
199 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200200 if (PyDict_SetItem(dict, v, v) < 0) {
201 Py_DECREF(v);
202 return -1;
203 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 Py_DECREF(v);
205 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 while (PyDict_Next(dict, &pos, &k, &v)) {
208 PyObject *o;
209 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 i = PyLong_AS_LONG(v) + 1;
212 o = PyLong_FromLong(i);
213 if (o == NULL)
214 return -1;
215 if (PyDict_SetItem(dict, k, o) < 0) {
216 Py_DECREF(o);
217 return -1;
218 }
219 Py_DECREF(o);
220 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 if (iterations != count) {
225 PyErr_SetString(
226 TestError,
227 "test_dict_iteration: dict iteration went wrong ");
228 return -1;
229 } else {
230 return 0;
231 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000232}
233
234static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000235test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 for (i = 0; i < 200; i++) {
240 if (test_dict_inner(i) < 0) {
241 return NULL;
242 }
243 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 Py_INCREF(Py_None);
246 return Py_None;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000247}
248
Tim Peters91621db2001-06-12 20:10:01 +0000249
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000250/* Issue #4701: Check that PyObject_Hash implicitly calls
251 * PyType_Ready if it hasn't already been called
252 */
253static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 PyVarObject_HEAD_INIT(NULL, 0)
255 "hashinheritancetester", /* Name of this type */
256 sizeof(PyObject), /* Basic object size */
257 0, /* Item size for varobject */
258 (destructor)PyObject_Del, /* tp_dealloc */
259 0, /* tp_print */
260 0, /* tp_getattr */
261 0, /* tp_setattr */
262 0, /* tp_reserved */
263 0, /* tp_repr */
264 0, /* tp_as_number */
265 0, /* tp_as_sequence */
266 0, /* tp_as_mapping */
267 0, /* tp_hash */
268 0, /* tp_call */
269 0, /* tp_str */
270 PyObject_GenericGetAttr, /* tp_getattro */
271 0, /* tp_setattro */
272 0, /* tp_as_buffer */
273 Py_TPFLAGS_DEFAULT, /* tp_flags */
274 0, /* tp_doc */
275 0, /* tp_traverse */
276 0, /* tp_clear */
277 0, /* tp_richcompare */
278 0, /* tp_weaklistoffset */
279 0, /* tp_iter */
280 0, /* tp_iternext */
281 0, /* tp_methods */
282 0, /* tp_members */
283 0, /* tp_getset */
284 0, /* tp_base */
285 0, /* tp_dict */
286 0, /* tp_descr_get */
287 0, /* tp_descr_set */
288 0, /* tp_dictoffset */
289 0, /* tp_init */
290 0, /* tp_alloc */
291 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000292};
293
294static PyObject*
295test_lazy_hash_inheritance(PyObject* self)
296{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 PyTypeObject *type;
298 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000299 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 if (type->tp_dict != NULL)
304 /* The type has already been initialized. This probably means
305 -R is being used. */
306 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000307
308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 obj = PyObject_New(PyObject, type);
310 if (obj == NULL) {
311 PyErr_Clear();
312 PyErr_SetString(
313 TestError,
314 "test_lazy_hash_inheritance: failed to create object");
315 return NULL;
316 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 if (type->tp_dict != NULL) {
319 PyErr_SetString(
320 TestError,
321 "test_lazy_hash_inheritance: type initialised too soon");
322 Py_DECREF(obj);
323 return NULL;
324 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 hash = PyObject_Hash(obj);
327 if ((hash == -1) && PyErr_Occurred()) {
328 PyErr_Clear();
329 PyErr_SetString(
330 TestError,
331 "test_lazy_hash_inheritance: could not hash object");
332 Py_DECREF(obj);
333 return NULL;
334 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 if (type->tp_dict == NULL) {
337 PyErr_SetString(
338 TestError,
339 "test_lazy_hash_inheritance: type not initialised by hash()");
340 Py_DECREF(obj);
341 return NULL;
342 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 if (type->tp_hash != PyType_Type.tp_hash) {
345 PyErr_SetString(
346 TestError,
347 "test_lazy_hash_inheritance: unexpected hash function");
348 Py_DECREF(obj);
349 return NULL;
350 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000355}
356
357
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700358/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000359 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000360
361 Note that the meat of the test is contained in testcapi_long.h.
362 This is revolting, but delicate code duplication is worse: "almost
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000363 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000364 dependence on type names makes it impossible to use a parameterized
365 function. A giant macro would be even worse than this. A C++ template
366 would be perfect.
367
368 The "report an error" functions are deliberately not part of the #include
369 file: if the test fails, you can set a breakpoint in the appropriate
370 error function directly, and crawl back from there in the debugger.
371*/
372
373#define UNBIND(X) Py_DECREF(X); (X) = NULL
374
375static PyObject *
376raise_test_long_error(const char* msg)
377{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000379}
380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381#define TESTNAME test_long_api_inner
382#define TYPENAME long
383#define F_S_TO_PY PyLong_FromLong
384#define F_PY_TO_S PyLong_AsLong
385#define F_U_TO_PY PyLong_FromUnsignedLong
386#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000387
388#include "testcapi_long.h"
389
390static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000391test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000392{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000394}
395
396#undef TESTNAME
397#undef TYPENAME
398#undef F_S_TO_PY
399#undef F_PY_TO_S
400#undef F_U_TO_PY
401#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000402
Tim Peters91621db2001-06-12 20:10:01 +0000403static 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
Serhiy Storchakace412872016-05-08 23:36:44 +0300869static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300870return_none(void *unused)
871{
872 Py_RETURN_NONE;
873}
874
875static PyObject *
876raise_error(void *unused)
877{
878 PyErr_SetNone(PyExc_ValueError);
879 return NULL;
880}
881
882static int
883test_buildvalue_N_error(const char *fmt)
884{
885 PyObject *arg, *res;
886
887 arg = PyList_New(0);
888 if (arg == NULL) {
889 return -1;
890 }
891
892 Py_INCREF(arg);
893 res = Py_BuildValue(fmt, return_none, NULL, arg);
894 if (res == NULL) {
895 return -1;
896 }
897 Py_DECREF(res);
898 if (Py_REFCNT(arg) != 1) {
899 PyErr_Format(TestError, "test_buildvalue_N: "
900 "arg was not decrefed in successful "
901 "Py_BuildValue(\"%s\")", fmt);
902 return -1;
903 }
904
905 Py_INCREF(arg);
906 res = Py_BuildValue(fmt, raise_error, NULL, arg);
907 if (res != NULL || !PyErr_Occurred()) {
908 PyErr_Format(TestError, "test_buildvalue_N: "
909 "Py_BuildValue(\"%s\") didn't complain", fmt);
910 return -1;
911 }
912 PyErr_Clear();
913 if (Py_REFCNT(arg) != 1) {
914 PyErr_Format(TestError, "test_buildvalue_N: "
915 "arg was not decrefed in failed "
916 "Py_BuildValue(\"%s\")", fmt);
917 return -1;
918 }
919 Py_DECREF(arg);
920 return 0;
921}
922
923static PyObject *
924test_buildvalue_N(PyObject *self, PyObject *noargs)
925{
926 PyObject *arg, *res;
927
928 arg = PyList_New(0);
929 if (arg == NULL) {
930 return NULL;
931 }
932 Py_INCREF(arg);
933 res = Py_BuildValue("N", arg);
934 if (res == NULL) {
935 return NULL;
936 }
937 if (res != arg) {
938 return raiseTestError("test_buildvalue_N",
939 "Py_BuildValue(\"N\") returned wrong result");
940 }
941 if (Py_REFCNT(arg) != 2) {
942 return raiseTestError("test_buildvalue_N",
943 "arg was not decrefed in Py_BuildValue(\"N\")");
944 }
945 Py_DECREF(res);
946 Py_DECREF(arg);
947
948 if (test_buildvalue_N_error("O&N") < 0)
949 return NULL;
950 if (test_buildvalue_N_error("(O&N)") < 0)
951 return NULL;
952 if (test_buildvalue_N_error("[O&N]") < 0)
953 return NULL;
954 if (test_buildvalue_N_error("{O&N}") < 0)
955 return NULL;
956 if (test_buildvalue_N_error("{()O&(())N}") < 0)
957 return NULL;
958
959 Py_RETURN_NONE;
960}
961
962
963static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +0300964get_args(PyObject *self, PyObject *args)
965{
966 if (args == NULL) {
967 args = Py_None;
968 }
969 Py_INCREF(args);
970 return args;
971}
972
973static PyObject *
974get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
975{
976 if (kwargs == NULL) {
977 kwargs = Py_None;
978 }
979 Py_INCREF(kwargs);
980 return kwargs;
981}
982
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000983/* Test tuple argument processing */
984static PyObject *
985getargs_tuple(PyObject *self, PyObject *args)
986{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 int a, b, c;
988 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
989 return NULL;
990 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000991}
992
Christian Heimes380f7f22008-02-28 11:19:05 +0000993/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +0000994static PyObject *
995getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +0000996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200998 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1002 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1003 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1004 return NULL;
1005 return Py_BuildValue("iiiiiiiiii",
1006 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1007 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001008}
1009
Larry Hastings83a9f482012-03-20 20:06:16 +00001010/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1011static PyObject *
1012getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1013{
1014 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1015 int required = -1;
1016 int optional = -1;
1017 int keyword_only = -1;
1018
1019 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1020 &required, &optional, &keyword_only))
1021 return NULL;
1022 return Py_BuildValue("iii", required, optional, keyword_only);
1023}
1024
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001025/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1026static PyObject *
1027getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1028{
1029 static char *keywords[] = {"", "", "keyword", NULL};
1030 int required = -1;
1031 int optional = -1;
1032 int keyword = -1;
1033
1034 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1035 &required, &optional, &keyword))
1036 return NULL;
1037 return Py_BuildValue("iii", required, optional, keyword);
1038}
1039
Thomas Heller3457e4b2003-04-24 16:14:27 +00001040/* Functions to call PyArg_ParseTuple with integer format codes,
1041 and return the result.
1042*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001043static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001044getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 unsigned char value;
1047 if (!PyArg_ParseTuple(args, "b", &value))
1048 return NULL;
1049 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001050}
1051
Thomas Heller3457e4b2003-04-24 16:14:27 +00001052static PyObject *
1053getargs_B(PyObject *self, PyObject *args)
1054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 unsigned char value;
1056 if (!PyArg_ParseTuple(args, "B", &value))
1057 return NULL;
1058 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001059}
1060
1061static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001062getargs_h(PyObject *self, PyObject *args)
1063{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 short value;
1065 if (!PyArg_ParseTuple(args, "h", &value))
1066 return NULL;
1067 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001068}
1069
1070static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001071getargs_H(PyObject *self, PyObject *args)
1072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 unsigned short value;
1074 if (!PyArg_ParseTuple(args, "H", &value))
1075 return NULL;
1076 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001077}
1078
1079static PyObject *
1080getargs_I(PyObject *self, PyObject *args)
1081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 unsigned int value;
1083 if (!PyArg_ParseTuple(args, "I", &value))
1084 return NULL;
1085 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001086}
1087
1088static PyObject *
1089getargs_k(PyObject *self, PyObject *args)
1090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 unsigned long value;
1092 if (!PyArg_ParseTuple(args, "k", &value))
1093 return NULL;
1094 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001095}
1096
1097static PyObject *
1098getargs_i(PyObject *self, PyObject *args)
1099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 int value;
1101 if (!PyArg_ParseTuple(args, "i", &value))
1102 return NULL;
1103 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001104}
1105
Thomas Hellera4ea6032003-04-17 18:55:45 +00001106static PyObject *
1107getargs_l(PyObject *self, PyObject *args)
1108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 long value;
1110 if (!PyArg_ParseTuple(args, "l", &value))
1111 return NULL;
1112 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001113}
1114
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001115static PyObject *
1116getargs_n(PyObject *self, PyObject *args)
1117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 Py_ssize_t value;
1119 if (!PyArg_ParseTuple(args, "n", &value))
1120 return NULL;
1121 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001122}
1123
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001124static PyObject *
1125getargs_p(PyObject *self, PyObject *args)
1126{
1127 int value;
1128 if (!PyArg_ParseTuple(args, "p", &value))
1129 return NULL;
1130 return PyLong_FromLong(value);
1131}
1132
Thomas Hellera4ea6032003-04-17 18:55:45 +00001133static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001134getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 PY_LONG_LONG value;
1137 if (!PyArg_ParseTuple(args, "L", &value))
1138 return NULL;
1139 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001140}
1141
Thomas Hellera4ea6032003-04-17 18:55:45 +00001142static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001143getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 unsigned PY_LONG_LONG value;
1146 if (!PyArg_ParseTuple(args, "K", &value))
1147 return NULL;
1148 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001149}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001150
1151/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +00001152 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001153static PyObject *
1154test_k_code(PyObject *self)
1155{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 PyObject *tuple, *num;
1157 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 tuple = PyTuple_New(1);
1160 if (tuple == NULL)
1161 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 /* a number larger than ULONG_MAX even on 64-bit platforms */
1164 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1165 if (num == NULL)
1166 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 value = PyLong_AsUnsignedLongMask(num);
1169 if (value != ULONG_MAX)
1170 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001171 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 value = 0;
1176 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1177 return NULL;
1178 if (value != ULONG_MAX)
1179 return raiseTestError("test_k_code",
1180 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 Py_DECREF(num);
1183 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1184 if (num == NULL)
1185 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 value = PyLong_AsUnsignedLongMask(num);
1188 if (value != (unsigned long)-0x42)
1189 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001190 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 value = 0;
1195 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1196 return NULL;
1197 if (value != (unsigned long)-0x42)
1198 return raiseTestError("test_k_code",
1199 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 Py_DECREF(tuple);
1202 Py_INCREF(Py_None);
1203 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001204}
1205
Victor Stinner06e49dd2010-06-13 18:21:50 +00001206static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001207getargs_f(PyObject *self, PyObject *args)
1208{
1209 float f;
1210 if (!PyArg_ParseTuple(args, "f", &f))
1211 return NULL;
1212 return PyFloat_FromDouble(f);
1213}
1214
1215static PyObject *
1216getargs_d(PyObject *self, PyObject *args)
1217{
1218 double d;
1219 if (!PyArg_ParseTuple(args, "d", &d))
1220 return NULL;
1221 return PyFloat_FromDouble(d);
1222}
1223
1224static PyObject *
1225getargs_D(PyObject *self, PyObject *args)
1226{
1227 Py_complex cval;
1228 if (!PyArg_ParseTuple(args, "D", &cval))
1229 return NULL;
1230 return PyComplex_FromCComplex(cval);
1231}
1232
1233static PyObject *
1234getargs_S(PyObject *self, PyObject *args)
1235{
1236 PyObject *obj;
1237 if (!PyArg_ParseTuple(args, "S", &obj))
1238 return NULL;
1239 Py_INCREF(obj);
1240 return obj;
1241}
1242
1243static PyObject *
1244getargs_Y(PyObject *self, PyObject *args)
1245{
1246 PyObject *obj;
1247 if (!PyArg_ParseTuple(args, "Y", &obj))
1248 return NULL;
1249 Py_INCREF(obj);
1250 return obj;
1251}
1252
1253static PyObject *
1254getargs_U(PyObject *self, PyObject *args)
1255{
1256 PyObject *obj;
1257 if (!PyArg_ParseTuple(args, "U", &obj))
1258 return NULL;
1259 Py_INCREF(obj);
1260 return obj;
1261}
1262
1263static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001264getargs_c(PyObject *self, PyObject *args)
1265{
1266 char c;
1267 if (!PyArg_ParseTuple(args, "c", &c))
1268 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001269 return PyLong_FromLong((unsigned char)c);
1270}
1271
1272static PyObject *
1273getargs_C(PyObject *self, PyObject *args)
1274{
1275 int c;
1276 if (!PyArg_ParseTuple(args, "C", &c))
1277 return NULL;
1278 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001279}
1280
1281static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001282getargs_s(PyObject *self, PyObject *args)
1283{
1284 char *str;
1285 if (!PyArg_ParseTuple(args, "s", &str))
1286 return NULL;
1287 return PyBytes_FromString(str);
1288}
1289
1290static PyObject *
1291getargs_s_star(PyObject *self, PyObject *args)
1292{
1293 Py_buffer buffer;
1294 PyObject *bytes;
1295 if (!PyArg_ParseTuple(args, "s*", &buffer))
1296 return NULL;
1297 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1298 PyBuffer_Release(&buffer);
1299 return bytes;
1300}
1301
1302static PyObject *
1303getargs_s_hash(PyObject *self, PyObject *args)
1304{
1305 char *str;
1306 Py_ssize_t size;
1307 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1308 return NULL;
1309 return PyBytes_FromStringAndSize(str, size);
1310}
1311
1312static PyObject *
1313getargs_z(PyObject *self, PyObject *args)
1314{
1315 char *str;
1316 if (!PyArg_ParseTuple(args, "z", &str))
1317 return NULL;
1318 if (str != NULL)
1319 return PyBytes_FromString(str);
1320 else
1321 Py_RETURN_NONE;
1322}
1323
1324static PyObject *
1325getargs_z_star(PyObject *self, PyObject *args)
1326{
1327 Py_buffer buffer;
1328 PyObject *bytes;
1329 if (!PyArg_ParseTuple(args, "z*", &buffer))
1330 return NULL;
1331 if (buffer.buf != NULL)
1332 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1333 else {
1334 Py_INCREF(Py_None);
1335 bytes = Py_None;
1336 }
1337 PyBuffer_Release(&buffer);
1338 return bytes;
1339}
1340
1341static PyObject *
1342getargs_z_hash(PyObject *self, PyObject *args)
1343{
1344 char *str;
1345 Py_ssize_t size;
1346 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1347 return NULL;
1348 if (str != NULL)
1349 return PyBytes_FromStringAndSize(str, size);
1350 else
1351 Py_RETURN_NONE;
1352}
1353
1354static PyObject *
1355getargs_y(PyObject *self, PyObject *args)
1356{
1357 char *str;
1358 if (!PyArg_ParseTuple(args, "y", &str))
1359 return NULL;
1360 return PyBytes_FromString(str);
1361}
1362
1363static PyObject *
1364getargs_y_star(PyObject *self, PyObject *args)
1365{
1366 Py_buffer buffer;
1367 PyObject *bytes;
1368 if (!PyArg_ParseTuple(args, "y*", &buffer))
1369 return NULL;
1370 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1371 PyBuffer_Release(&buffer);
1372 return bytes;
1373}
1374
1375static PyObject *
1376getargs_y_hash(PyObject *self, PyObject *args)
1377{
1378 char *str;
1379 Py_ssize_t size;
1380 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1381 return NULL;
1382 return PyBytes_FromStringAndSize(str, size);
1383}
1384
1385static PyObject *
1386getargs_u(PyObject *self, PyObject *args)
1387{
1388 Py_UNICODE *str;
1389 Py_ssize_t size;
1390 if (!PyArg_ParseTuple(args, "u", &str))
1391 return NULL;
1392 size = Py_UNICODE_strlen(str);
1393 return PyUnicode_FromUnicode(str, size);
1394}
1395
1396static PyObject *
1397getargs_u_hash(PyObject *self, PyObject *args)
1398{
1399 Py_UNICODE *str;
1400 Py_ssize_t size;
1401 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1402 return NULL;
1403 return PyUnicode_FromUnicode(str, size);
1404}
1405
1406static PyObject *
1407getargs_Z(PyObject *self, PyObject *args)
1408{
1409 Py_UNICODE *str;
1410 Py_ssize_t size;
1411 if (!PyArg_ParseTuple(args, "Z", &str))
1412 return NULL;
1413 if (str != NULL) {
1414 size = Py_UNICODE_strlen(str);
1415 return PyUnicode_FromUnicode(str, size);
1416 } else
1417 Py_RETURN_NONE;
1418}
1419
1420static PyObject *
1421getargs_Z_hash(PyObject *self, PyObject *args)
1422{
1423 Py_UNICODE *str;
1424 Py_ssize_t size;
1425 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1426 return NULL;
1427 if (str != NULL)
1428 return PyUnicode_FromUnicode(str, size);
1429 else
1430 Py_RETURN_NONE;
1431}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001432
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001433static PyObject *
1434getargs_es(PyObject *self, PyObject *args)
1435{
1436 PyObject *arg, *result;
1437 const char *encoding = NULL;
1438 char *str;
1439
1440 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1441 return NULL;
1442 if (!PyArg_Parse(arg, "es", encoding, &str))
1443 return NULL;
1444 result = PyBytes_FromString(str);
1445 PyMem_Free(str);
1446 return result;
1447}
1448
1449static PyObject *
1450getargs_et(PyObject *self, PyObject *args)
1451{
1452 PyObject *arg, *result;
1453 const char *encoding = NULL;
1454 char *str;
1455
1456 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1457 return NULL;
1458 if (!PyArg_Parse(arg, "et", encoding, &str))
1459 return NULL;
1460 result = PyBytes_FromString(str);
1461 PyMem_Free(str);
1462 return result;
1463}
1464
1465static PyObject *
1466getargs_es_hash(PyObject *self, PyObject *args)
1467{
1468 PyObject *arg, *result;
1469 const char *encoding = NULL;
1470 PyByteArrayObject *buffer = NULL;
1471 char *str = NULL;
1472 Py_ssize_t size;
1473
1474 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1475 return NULL;
1476 if (buffer != NULL) {
1477 str = PyByteArray_AS_STRING(buffer);
1478 size = PyByteArray_GET_SIZE(buffer);
1479 }
1480 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1481 return NULL;
1482 result = PyBytes_FromStringAndSize(str, size);
1483 if (buffer == NULL)
1484 PyMem_Free(str);
1485 return result;
1486}
1487
1488static PyObject *
1489getargs_et_hash(PyObject *self, PyObject *args)
1490{
1491 PyObject *arg, *result;
1492 const char *encoding = NULL;
1493 PyByteArrayObject *buffer = NULL;
1494 char *str = NULL;
1495 Py_ssize_t size;
1496
1497 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1498 return NULL;
1499 if (buffer != NULL) {
1500 str = PyByteArray_AS_STRING(buffer);
1501 size = PyByteArray_GET_SIZE(buffer);
1502 }
1503 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1504 return NULL;
1505 result = PyBytes_FromStringAndSize(str, size);
1506 if (buffer == NULL)
1507 PyMem_Free(str);
1508 return result;
1509}
1510
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001511/* Test the s and z codes for PyArg_ParseTuple.
1512*/
1513static PyObject *
1514test_s_code(PyObject *self)
1515{
1516 /* Unicode strings should be accepted */
1517 PyObject *tuple, *obj;
1518 char *value;
1519
1520 tuple = PyTuple_New(1);
1521 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001522 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001523
1524 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001526 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001528
1529 PyTuple_SET_ITEM(tuple, 0, obj);
1530
1531 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001533 */
1534 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001536
1537 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001539
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001540 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001541 Py_RETURN_NONE;
1542}
1543
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001544static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001545parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001546{
Larry Hastings8f904da2012-06-22 03:56:29 -07001547 PyObject *sub_args;
1548 PyObject *sub_kwargs;
1549 char *sub_format;
1550 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001551
Larry Hastings8f904da2012-06-22 03:56:29 -07001552 Py_ssize_t i, size;
1553 char *keywords[8 + 1]; /* space for NULL at end */
1554 PyObject *o;
1555 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001556
Larry Hastings8f904da2012-06-22 03:56:29 -07001557 int result;
1558 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001559
Larry Hastings22701e82012-08-08 14:52:22 -07001560 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001561
Larry Hastings8f904da2012-06-22 03:56:29 -07001562 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1563 &sub_args, &sub_kwargs,
1564 &sub_format, &sub_keywords))
1565 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001566
Larry Hastings8f904da2012-06-22 03:56:29 -07001567 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1568 PyErr_SetString(PyExc_ValueError,
1569 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1570 return NULL;
1571 }
1572
1573 memset(buffers, 0, sizeof(buffers));
1574 memset(converted, 0, sizeof(converted));
1575 memset(keywords, 0, sizeof(keywords));
1576
1577 size = PySequence_Fast_GET_SIZE(sub_keywords);
1578 if (size > 8) {
1579 PyErr_SetString(PyExc_ValueError,
1580 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1581 goto exit;
1582 }
1583
1584 for (i = 0; i < size; i++) {
1585 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1586 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1587 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001588 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001589 goto exit;
1590 }
1591 keywords[i] = PyBytes_AS_STRING(converted[i]);
1592 }
1593
1594 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1595 sub_format, keywords,
1596 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1597 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1598
1599 if (result) {
1600 return_value = Py_None;
1601 Py_INCREF(Py_None);
1602 }
1603
1604exit:
1605 size = sizeof(converted) / sizeof(converted[0]);
1606 for (i = 0; i < size; i++) {
1607 Py_XDECREF(converted[i]);
1608 }
1609 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001610}
1611
Benjamin Peterson92035012008-12-27 16:00:54 +00001612static volatile int x;
1613
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001614/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1615 of an error.
1616*/
1617static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001618test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 PyObject *tuple, *obj;
1621 Py_UNICODE *value;
1622 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1625 /* Just use the macro and check that it compiles */
1626 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 tuple = PyTuple_New(1);
1629 if (tuple == NULL)
1630 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 obj = PyUnicode_Decode("test", strlen("test"),
1633 "ascii", NULL);
1634 if (obj == NULL)
1635 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 value = 0;
1640 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1641 return NULL;
1642 if (value != PyUnicode_AS_UNICODE(obj))
1643 return raiseTestError("test_u_code",
1644 "u code returned wrong value for u'test'");
1645 value = 0;
1646 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1647 return NULL;
1648 if (value != PyUnicode_AS_UNICODE(obj) ||
1649 len != PyUnicode_GET_SIZE(obj))
1650 return raiseTestError("test_u_code",
1651 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 Py_DECREF(tuple);
1654 Py_INCREF(Py_None);
1655 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001656}
1657
Guido van Rossumfb67be22007-08-29 18:38:11 +00001658/* Test Z and Z# codes for PyArg_ParseTuple */
1659static PyObject *
1660test_Z_code(PyObject *self)
1661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001663 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 tuple = PyTuple_New(2);
1667 if (tuple == NULL)
1668 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 obj = PyUnicode_FromString("test");
1671 PyTuple_SET_ITEM(tuple, 0, obj);
1672 Py_INCREF(Py_None);
1673 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 /* swap values on purpose */
1676 value1 = NULL;
1677 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 /* Test Z for both values */
1680 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1681 return NULL;
1682 if (value1 != PyUnicode_AS_UNICODE(obj))
1683 return raiseTestError("test_Z_code",
1684 "Z code returned wrong value for 'test'");
1685 if (value2 != NULL)
1686 return raiseTestError("test_Z_code",
1687 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 value1 = NULL;
1690 value2 = PyUnicode_AS_UNICODE(obj);
1691 len1 = -1;
1692 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 /* Test Z# for both values */
1695 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1696 &value2, &len2) < 0)
1697 return NULL;
1698 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1699 len1 != PyUnicode_GET_SIZE(obj))
1700 return raiseTestError("test_Z_code",
1701 "Z# code returned wrong values for 'test'");
1702 if (value2 != NULL ||
1703 len2 != 0)
1704 return raiseTestError("test_Z_code",
1705 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 Py_DECREF(tuple);
1708 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001709}
1710
Thomas Wouters477c8d52006-05-27 19:21:47 +00001711static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001712test_widechar(PyObject *self)
1713{
1714#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1716 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001717 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001718#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1720 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001721#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1725 if (wide == NULL)
1726 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1729 if (utf8 == NULL) {
1730 Py_DECREF(wide);
1731 return NULL;
1732 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001733
Victor Stinner8ef18872011-11-21 02:06:57 +01001734 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 Py_DECREF(wide);
1736 Py_DECREF(utf8);
1737 return raiseTestError("test_widechar",
1738 "wide string and utf8 string "
1739 "have different length");
1740 }
1741 if (PyUnicode_Compare(wide, utf8)) {
1742 Py_DECREF(wide);
1743 Py_DECREF(utf8);
1744 if (PyErr_Occurred())
1745 return NULL;
1746 return raiseTestError("test_widechar",
1747 "wide string and utf8 string "
1748 "are different");
1749 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 Py_DECREF(wide);
1752 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001753
1754#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1755 wide = PyUnicode_FromWideChar(invalid, 1);
1756 if (wide == NULL)
1757 PyErr_Clear();
1758 else
1759 return raiseTestError("test_widechar",
1760 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1761
1762 wide = PyUnicode_FromUnicode(invalid, 1);
1763 if (wide == NULL)
1764 PyErr_Clear();
1765 else
1766 return raiseTestError("test_widechar",
1767 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001768
1769 wide = PyUnicode_FromUnicode(NULL, 1);
1770 if (wide == NULL)
1771 return NULL;
1772 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001773 if (_PyUnicode_Ready(wide) < 0) {
1774 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001775 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001776 }
1777 else {
1778 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001779 return raiseTestError("test_widechar",
1780 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001781 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001782#endif
1783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001785}
1786
1787static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001788unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001789{
1790 PyObject *unicode, *result;
1791 Py_ssize_t buflen, size;
1792 wchar_t *buffer;
1793
1794 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1795 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001796 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001797 if (buffer == NULL)
1798 return PyErr_NoMemory();
1799
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001800 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001801 if (size == -1) {
1802 PyMem_Free(buffer);
1803 return NULL;
1804 }
1805
1806 if (size < buflen)
1807 buflen = size + 1;
1808 else
1809 buflen = size;
1810 result = PyUnicode_FromWideChar(buffer, buflen);
1811 PyMem_Free(buffer);
1812 if (result == NULL)
1813 return NULL;
1814
1815 return Py_BuildValue("(Nn)", result, size);
1816}
1817
1818static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001819unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001820{
1821 PyObject *unicode, *result;
1822 Py_ssize_t size;
1823 wchar_t *buffer;
1824
1825 if (!PyArg_ParseTuple(args, "U", &unicode))
1826 return NULL;
1827
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001828 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001829 if (buffer == NULL)
1830 return NULL;
1831
1832 result = PyUnicode_FromWideChar(buffer, size + 1);
1833 PyMem_Free(buffer);
1834 if (result == NULL)
1835 return NULL;
1836 return Py_BuildValue("(Nn)", result, size);
1837}
1838
1839static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001840unicode_encodedecimal(PyObject *self, PyObject *args)
1841{
1842 Py_UNICODE *unicode;
1843 Py_ssize_t length;
1844 char *errors = NULL;
1845 PyObject *decimal;
1846 Py_ssize_t decimal_length, new_length;
1847 int res;
1848
1849 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1850 return NULL;
1851
1852 decimal_length = length * 7; /* len('&#8364;') */
1853 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1854 if (decimal == NULL)
1855 return NULL;
1856
1857 res = PyUnicode_EncodeDecimal(unicode, length,
1858 PyBytes_AS_STRING(decimal),
1859 errors);
1860 if (res < 0) {
1861 Py_DECREF(decimal);
1862 return NULL;
1863 }
1864
1865 new_length = strlen(PyBytes_AS_STRING(decimal));
1866 assert(new_length <= decimal_length);
1867 res = _PyBytes_Resize(&decimal, new_length);
1868 if (res < 0)
1869 return NULL;
1870
1871 return decimal;
1872}
1873
1874static PyObject *
1875unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1876{
1877 Py_UNICODE *unicode;
1878 Py_ssize_t length;
1879 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1880 return NULL;
1881 return PyUnicode_TransformDecimalToASCII(unicode, length);
1882}
1883
1884static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001885unicode_legacy_string(PyObject *self, PyObject *args)
1886{
1887 Py_UNICODE *data;
1888 Py_ssize_t len;
1889 PyObject *u;
1890
1891 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1892 return NULL;
1893
1894 u = PyUnicode_FromUnicode(NULL, len);
1895 if (u == NULL)
1896 return NULL;
1897
1898 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1899
1900 if (len > 0) { /* The empty string is always ready. */
1901 assert(!PyUnicode_IS_READY(u));
1902 }
1903
1904 return u;
1905}
1906
1907static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001908getargs_w_star(PyObject *self, PyObject *args)
1909{
1910 Py_buffer buffer;
1911 PyObject *result;
1912 char *str;
1913
1914 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1915 return NULL;
1916
1917 if (2 <= buffer.len) {
1918 str = buffer.buf;
1919 str[0] = '[';
1920 str[buffer.len-1] = ']';
1921 }
1922
1923 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1924 PyBuffer_Release(&buffer);
1925 return result;
1926}
1927
1928
1929static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001930test_empty_argparse(PyObject *self)
1931{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932 /* Test that formats can begin with '|'. See issue #4720. */
1933 PyObject *tuple, *dict = NULL;
1934 static char *kwlist[] = {NULL};
1935 int result;
1936 tuple = PyTuple_New(0);
1937 if (!tuple)
1938 return NULL;
1939 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1940 goto done;
1941 dict = PyDict_New();
1942 if (!dict)
1943 goto done;
1944 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00001945 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 Py_DECREF(tuple);
1947 Py_XDECREF(dict);
1948 if (result < 0)
1949 return NULL;
1950 else {
1951 Py_RETURN_NONE;
1952 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001953}
1954
1955static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001956codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001957{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 const char *encoding, *errors = NULL;
1959 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1960 &encoding, &errors))
1961 return NULL;
1962 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001963}
1964
Thomas Wouters477c8d52006-05-27 19:21:47 +00001965static PyObject *
1966codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 const char *encoding, *errors = NULL;
1969 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1970 &encoding, &errors))
1971 return NULL;
1972 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001973}
1974
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001975
Tim Peters5b8132f2003-01-31 15:52:05 +00001976/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001977static PyObject *
1978test_long_numbits(PyObject *self)
1979{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 struct triple {
1981 long input;
1982 size_t nbits;
1983 int sign;
1984 } testcases[] = {{0, 0, 0},
1985 {1L, 1, 1},
1986 {-1L, 1, -1},
1987 {2L, 2, 1},
1988 {-2L, 2, -1},
1989 {3L, 2, 1},
1990 {-3L, 2, -1},
1991 {4L, 3, 1},
1992 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03001993 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 {-0x7fffL, 15, -1},
1995 {0xffffL, 16, 1},
1996 {-0xffffL, 16, -1},
1997 {0xfffffffL, 28, 1},
1998 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02001999 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002000
Victor Stinner63941882011-09-29 00:42:28 +02002001 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002002 size_t nbits;
2003 int sign;
2004 PyObject *plong;
2005
2006 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002007 if (plong == NULL)
2008 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002009 nbits = _PyLong_NumBits(plong);
2010 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002012 Py_DECREF(plong);
2013 if (nbits != testcases[i].nbits)
2014 return raiseTestError("test_long_numbits",
2015 "wrong result for _PyLong_NumBits");
2016 if (sign != testcases[i].sign)
2017 return raiseTestError("test_long_numbits",
2018 "wrong result for _PyLong_Sign");
2019 }
2020 Py_INCREF(Py_None);
2021 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002022}
2023
Thomas Heller519a0422007-11-15 20:48:54 +00002024/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002025
2026static PyObject *
2027test_null_strings(PyObject *self)
2028{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2030 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2031 Py_XDECREF(o1);
2032 Py_XDECREF(o2);
2033 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002034}
2035
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002036static PyObject *
2037raise_exception(PyObject *self, PyObject *args)
2038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 PyObject *exc;
2040 PyObject *exc_args, *v;
2041 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2044 &exc, &num_args))
2045 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 exc_args = PyTuple_New(num_args);
2048 if (exc_args == NULL)
2049 return NULL;
2050 for (i = 0; i < num_args; ++i) {
2051 v = PyLong_FromLong(i);
2052 if (v == NULL) {
2053 Py_DECREF(exc_args);
2054 return NULL;
2055 }
2056 PyTuple_SET_ITEM(exc_args, i, v);
2057 }
2058 PyErr_SetObject(exc, exc_args);
2059 Py_DECREF(exc_args);
2060 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002061}
Tim Peters91621db2001-06-12 20:10:01 +00002062
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002063static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002064set_errno(PyObject *self, PyObject *args)
2065{
2066 int new_errno;
2067
2068 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2069 return NULL;
2070
2071 errno = new_errno;
2072 Py_RETURN_NONE;
2073}
2074
2075static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002076test_set_exc_info(PyObject *self, PyObject *args)
2077{
2078 PyObject *orig_exc;
2079 PyObject *new_type, *new_value, *new_tb;
2080 PyObject *type, *value, *tb;
2081 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2082 &new_type, &new_value, &new_tb))
2083 return NULL;
2084
2085 PyErr_GetExcInfo(&type, &value, &tb);
2086
2087 Py_INCREF(new_type);
2088 Py_INCREF(new_value);
2089 Py_INCREF(new_tb);
2090 PyErr_SetExcInfo(new_type, new_value, new_tb);
2091
2092 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2093 Py_XDECREF(type);
2094 Py_XDECREF(value);
2095 Py_XDECREF(tb);
2096 return orig_exc;
2097}
Benjamin Peterson16323982010-02-03 01:13:41 +00002098
2099static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002100
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002101static PyObject *
2102test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 if (PyDateTimeAPI) {
2104 if (test_run_counter) {
2105 /* Probably regrtest.py -R */
2106 Py_RETURN_NONE;
2107 }
2108 else {
2109 PyErr_SetString(PyExc_AssertionError,
2110 "PyDateTime_CAPI somehow initialized");
2111 return NULL;
2112 }
2113 }
2114 test_run_counter++;
2115 PyDateTime_IMPORT;
2116 if (PyDateTimeAPI)
2117 Py_RETURN_NONE;
2118 else
2119 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002120}
2121
Benjamin Peterson16323982010-02-03 01:13:41 +00002122
2123#ifdef WITH_THREAD
2124
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002125/* test_thread_state spawns a thread of its own, and that thread releases
2126 * `thread_done` when it's finished. The driver code has to know when the
2127 * thread finishes, because the thread uses a PyObject (the callable) that
2128 * may go away when the driver finishes. The former lack of this explicit
2129 * synchronization caused rare segfaults, so rare that they were seen only
2130 * on a Mac buildbot (although they were possible on any box).
2131 */
2132static PyThread_type_lock thread_done = NULL;
2133
Benjamin Petersona786b022008-08-25 21:05:21 +00002134static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002135_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 PyObject *rc;
2138 int success;
2139 PyGILState_STATE s = PyGILState_Ensure();
2140 rc = PyObject_CallFunction((PyObject *)callable, "");
2141 success = (rc != NULL);
2142 Py_XDECREF(rc);
2143 PyGILState_Release(s);
2144 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002145}
2146
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002147/* Same thing, but releases `thread_done` when it returns. This variant
2148 * should be called only from threads spawned by test_thread_state().
2149 */
2150static void
2151_make_call_from_thread(void *callable)
2152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 _make_call(callable);
2154 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002155}
2156
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002157static PyObject *
2158test_thread_state(PyObject *self, PyObject *args)
2159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 PyObject *fn;
2161 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2164 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 if (!PyCallable_Check(fn)) {
2167 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2168 fn->ob_type->tp_name);
2169 return NULL;
2170 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 /* Ensure Python is set up for threading */
2173 PyEval_InitThreads();
2174 thread_done = PyThread_allocate_lock();
2175 if (thread_done == NULL)
2176 return PyErr_NoMemory();
2177 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 /* Start a new thread with our callback. */
2180 PyThread_start_new_thread(_make_call_from_thread, fn);
2181 /* Make the callback with the thread lock held by this thread */
2182 success &= _make_call(fn);
2183 /* Do it all again, but this time with the thread-lock released */
2184 Py_BEGIN_ALLOW_THREADS
2185 success &= _make_call(fn);
2186 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2187 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 /* And once more with and without a thread
2190 XXX - should use a lock and work out exactly what we are trying
2191 to test <wink>
2192 */
2193 Py_BEGIN_ALLOW_THREADS
2194 PyThread_start_new_thread(_make_call_from_thread, fn);
2195 success &= _make_call(fn);
2196 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2197 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 /* Release lock we acquired above. This is required on HP-UX. */
2200 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 PyThread_free_lock(thread_done);
2203 if (!success)
2204 return NULL;
2205 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002206}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002207
2208/* test Py_AddPendingCalls using threads */
2209static int _pending_callback(void *arg)
2210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002211 /* we assume the argument is callable object to which we own a reference */
2212 PyObject *callable = (PyObject *)arg;
2213 PyObject *r = PyObject_CallObject(callable, NULL);
2214 Py_DECREF(callable);
2215 Py_XDECREF(r);
2216 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002217}
2218
2219/* The following requests n callbacks to _pending_callback. It can be
2220 * run from any python thread.
2221 */
2222PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
2223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 PyObject *callable;
2225 int r;
2226 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2227 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 /* create the reference for the callbackwhile we hold the lock */
2230 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232 Py_BEGIN_ALLOW_THREADS
2233 r = Py_AddPendingCall(&_pending_callback, callable);
2234 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 if (r<0) {
2237 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
2238 Py_INCREF(Py_False);
2239 return Py_False;
2240 }
2241 Py_INCREF(Py_True);
2242 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002243}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002244#endif
2245
Neal Norwitzb0d26332007-08-25 00:49:05 +00002246/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002247static PyObject *
2248test_string_from_format(PyObject *self, PyObject *args)
2249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 PyObject *result;
2251 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002252
Alexander Belopolskye239d232010-12-08 23:31:48 +00002253#define CHECK_1_FORMAT(FORMAT, TYPE) \
2254 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2255 if (result == NULL) \
2256 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01002257 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002258 msg = FORMAT " failed at 1"; \
2259 goto Fail; \
2260 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 CHECK_1_FORMAT("%d", int);
2264 CHECK_1_FORMAT("%ld", long);
2265 /* The z width modifier was added in Python 2.5. */
2266 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 /* The u type code was added in Python 2.5. */
2269 CHECK_1_FORMAT("%u", unsigned int);
2270 CHECK_1_FORMAT("%lu", unsigned long);
2271 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 /* "%lld" and "%llu" support added in Python 2.7. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
2275 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002278
2279 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 Py_XDECREF(result);
2281 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002282
2283#undef CHECK_1_FORMAT
2284}
2285
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002286
2287static PyObject *
2288test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2290 int result;
2291 if (py_s == NULL)
2292 return NULL;
2293 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2294 Py_DECREF(py_s);
2295 if (!result) {
2296 PyErr_SetString(TestError, "Python string ending in NULL "
2297 "should not compare equal to c string.");
2298 return NULL;
2299 }
2300 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002301}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002302
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002303/* This is here to provide a docstring for test_descr. */
2304static PyObject *
2305test_with_docstring(PyObject *self)
2306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002308}
2309
Mark Dickinson725bfd82009-05-03 20:33:40 +00002310/* Test PyOS_string_to_double. */
2311static PyObject *
2312test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002313 double result;
2314 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316#define CHECK_STRING(STR, expected) \
2317 result = PyOS_string_to_double(STR, NULL, NULL); \
2318 if (result == -1.0 && PyErr_Occurred()) \
2319 return NULL; \
2320 if (result != expected) { \
2321 msg = "conversion of " STR " to float failed"; \
2322 goto fail; \
2323 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325#define CHECK_INVALID(STR) \
2326 result = PyOS_string_to_double(STR, NULL, NULL); \
2327 if (result == -1.0 && PyErr_Occurred()) { \
2328 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2329 PyErr_Clear(); \
2330 else \
2331 return NULL; \
2332 } \
2333 else { \
2334 msg = "conversion of " STR " didn't raise ValueError"; \
2335 goto fail; \
2336 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 CHECK_STRING("0.1", 0.1);
2339 CHECK_STRING("1.234", 1.234);
2340 CHECK_STRING("-1.35", -1.35);
2341 CHECK_STRING(".1e01", 1.0);
2342 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 CHECK_INVALID(" 0.1");
2345 CHECK_INVALID("\t\n-3");
2346 CHECK_INVALID(".123 ");
2347 CHECK_INVALID("3\n");
2348 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002351 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002353#undef CHECK_STRING
2354#undef CHECK_INVALID
2355}
2356
2357
Benjamin Petersonb173f782009-05-05 22:31:58 +00002358/* Coverage testing of capsule objects. */
2359
2360static const char *capsule_name = "capsule name";
2361static char *capsule_pointer = "capsule pointer";
2362static char *capsule_context = "capsule context";
2363static const char *capsule_error = NULL;
2364static int
2365capsule_destructor_call_count = 0;
2366
2367static void
2368capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 capsule_destructor_call_count++;
2370 if (PyCapsule_GetContext(o) != capsule_context) {
2371 capsule_error = "context did not match in destructor!";
2372 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2373 capsule_error = "destructor did not match in destructor! (woah!)";
2374 } else if (PyCapsule_GetName(o) != capsule_name) {
2375 capsule_error = "name did not match in destructor!";
2376 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2377 capsule_error = "pointer did not match in destructor!";
2378 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002379}
2380
2381typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 char *name;
2383 char *module;
2384 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002385} known_capsule;
2386
2387static PyObject *
2388test_capsule(PyObject *self, PyObject *args)
2389{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 PyObject *object;
2391 const char *error = NULL;
2392 void *pointer;
2393 void *pointer2;
2394 known_capsule known_capsules[] = {
2395 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2396 KNOWN_CAPSULE("_socket", "CAPI"),
2397 KNOWN_CAPSULE("_curses", "_C_API"),
2398 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2399 { NULL, NULL },
2400 };
2401 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002402
2403#define FAIL(x) { error = (x); goto exit; }
2404
2405#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 if (capsule_error) { \
2407 FAIL(capsule_error); \
2408 } \
2409 else if (!capsule_destructor_call_count) { \
2410 FAIL("destructor not called!"); \
2411 } \
2412 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2415 PyCapsule_SetContext(object, capsule_context);
2416 capsule_destructor(object);
2417 CHECK_DESTRUCTOR;
2418 Py_DECREF(object);
2419 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 object = PyCapsule_New(known, "ignored", NULL);
2422 PyCapsule_SetPointer(object, capsule_pointer);
2423 PyCapsule_SetName(object, capsule_name);
2424 PyCapsule_SetDestructor(object, capsule_destructor);
2425 PyCapsule_SetContext(object, capsule_context);
2426 capsule_destructor(object);
2427 CHECK_DESTRUCTOR;
2428 /* intentionally access using the wrong name */
2429 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2430 if (!PyErr_Occurred()) {
2431 FAIL("PyCapsule_GetPointer should have failed but did not!");
2432 }
2433 PyErr_Clear();
2434 if (pointer2) {
2435 if (pointer2 == capsule_pointer) {
2436 FAIL("PyCapsule_GetPointer should not have"
2437 " returned the internal pointer!");
2438 } else {
2439 FAIL("PyCapsule_GetPointer should have "
2440 "returned NULL pointer but did not!");
2441 }
2442 }
2443 PyCapsule_SetDestructor(object, NULL);
2444 Py_DECREF(object);
2445 if (capsule_destructor_call_count) {
2446 FAIL("destructor called when it should not have been!");
2447 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 for (known = &known_capsules[0]; known->module != NULL; known++) {
2450 /* yeah, ordinarily I wouldn't do this either,
2451 but it's fine for this test harness.
2452 */
2453 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002454#undef FAIL
2455#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 { \
2457 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2458 x, known->module, known->attribute); \
2459 error = buffer; \
2460 goto exit; \
2461 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 PyObject *module = PyImport_ImportModule(known->module);
2464 if (module) {
2465 pointer = PyCapsule_Import(known->name, 0);
2466 if (!pointer) {
2467 Py_DECREF(module);
2468 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2469 }
2470 object = PyObject_GetAttrString(module, known->attribute);
2471 if (!object) {
2472 Py_DECREF(module);
2473 return NULL;
2474 }
2475 pointer2 = PyCapsule_GetPointer(object,
2476 "weebles wobble but they don't fall down");
2477 if (!PyErr_Occurred()) {
2478 Py_DECREF(object);
2479 Py_DECREF(module);
2480 FAIL("PyCapsule_GetPointer should have failed but did not!");
2481 }
2482 PyErr_Clear();
2483 if (pointer2) {
2484 Py_DECREF(module);
2485 Py_DECREF(object);
2486 if (pointer2 == pointer) {
2487 FAIL("PyCapsule_GetPointer should not have"
2488 " returned its internal pointer!");
2489 } else {
2490 FAIL("PyCapsule_GetPointer should have"
2491 " returned NULL pointer but did not!");
2492 }
2493 }
2494 Py_DECREF(object);
2495 Py_DECREF(module);
2496 }
2497 else
2498 PyErr_Clear();
2499 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002500
2501 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 if (error) {
2503 return raiseTestError("test_capsule", error);
2504 }
2505 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002506#undef FAIL
2507}
2508
Guido van Rossumddefaf32007-01-14 03:31:43 +00002509#ifdef HAVE_GETTIMEOFDAY
2510/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002511static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002512{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 e->tv_sec -= s->tv_sec;
2514 e->tv_usec -= s->tv_usec;
2515 if (e->tv_usec < 0) {
2516 e->tv_sec -=1;
2517 e->tv_usec += 1000000;
2518 }
2519 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002520}
2521
2522static PyObject *
2523profile_int(PyObject *self, PyObject* args)
2524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 int i, k;
2526 struct timeval start, stop;
2527 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 /* Test 1: Allocate and immediately deallocate
2530 many small integers */
2531 gettimeofday(&start, NULL);
2532 for(k=0; k < 20000; k++)
2533 for(i=0; i < 1000; i++) {
2534 single = PyLong_FromLong(i);
2535 Py_DECREF(single);
2536 }
2537 gettimeofday(&stop, NULL);
2538 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002540 /* Test 2: Allocate and immediately deallocate
2541 many large integers */
2542 gettimeofday(&start, NULL);
2543 for(k=0; k < 20000; k++)
2544 for(i=0; i < 1000; i++) {
2545 single = PyLong_FromLong(i+1000000);
2546 Py_DECREF(single);
2547 }
2548 gettimeofday(&stop, NULL);
2549 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 /* Test 3: Allocate a few integers, then release
2552 them all simultaneously. */
2553 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002554 if (multiple == NULL)
2555 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 gettimeofday(&start, NULL);
2557 for(k=0; k < 20000; k++) {
2558 for(i=0; i < 1000; i++) {
2559 multiple[i] = PyLong_FromLong(i+1000000);
2560 }
2561 for(i=0; i < 1000; i++) {
2562 Py_DECREF(multiple[i]);
2563 }
2564 }
2565 gettimeofday(&stop, NULL);
2566 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002567 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002569 /* Test 4: Allocate many integers, then release
2570 them all simultaneously. */
2571 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002572 if (multiple == NULL)
2573 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 gettimeofday(&start, NULL);
2575 for(k=0; k < 20; k++) {
2576 for(i=0; i < 1000000; i++) {
2577 multiple[i] = PyLong_FromLong(i+1000000);
2578 }
2579 for(i=0; i < 1000000; i++) {
2580 Py_DECREF(multiple[i]);
2581 }
2582 }
2583 gettimeofday(&stop, NULL);
2584 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002585 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 /* Test 5: Allocate many integers < 32000 */
2588 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002589 if (multiple == NULL)
2590 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 gettimeofday(&start, NULL);
2592 for(k=0; k < 10; k++) {
2593 for(i=0; i < 1000000; i++) {
2594 multiple[i] = PyLong_FromLong(i+1000);
2595 }
2596 for(i=0; i < 1000000; i++) {
2597 Py_DECREF(multiple[i]);
2598 }
2599 }
2600 gettimeofday(&stop, NULL);
2601 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002602 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002604 /* Test 6: Perform small int addition */
2605 op1 = PyLong_FromLong(1);
2606 gettimeofday(&start, NULL);
2607 for(i=0; i < 10000000; i++) {
2608 result = PyNumber_Add(op1, op1);
2609 Py_DECREF(result);
2610 }
2611 gettimeofday(&stop, NULL);
2612 Py_DECREF(op1);
2613 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 /* Test 7: Perform medium int addition */
2616 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002617 if (op1 == NULL)
2618 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 gettimeofday(&start, NULL);
2620 for(i=0; i < 10000000; i++) {
2621 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002622 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 }
2624 gettimeofday(&stop, NULL);
2625 Py_DECREF(op1);
2626 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 Py_INCREF(Py_None);
2629 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002630}
2631#endif
2632
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002633/* To test the format of tracebacks as printed out. */
2634static PyObject *
2635traceback_print(PyObject *self, PyObject *args)
2636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002637 PyObject *file;
2638 PyObject *traceback;
2639 int result;
2640
2641 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2642 &traceback, &file))
2643 return NULL;
2644
2645 result = PyTraceBack_Print(traceback, file);
2646 if (result < 0)
2647 return NULL;
2648 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002649}
2650
Benjamin Petersone6528212008-07-15 15:32:09 +00002651/* To test the format of exceptions as printed out. */
2652static PyObject *
2653exception_print(PyObject *self, PyObject *args)
2654{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002655 PyObject *value;
2656 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 if (!PyArg_ParseTuple(args, "O:exception_print",
2659 &value))
2660 return NULL;
2661 if (!PyExceptionInstance_Check(value)) {
2662 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2663 return NULL;
2664 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 tb = PyException_GetTraceback(value);
2667 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2668 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002671}
2672
2673
2674
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002675
2676/* reliably raise a MemoryError */
2677static PyObject *
2678raise_memoryerror(PyObject *self)
2679{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 PyErr_NoMemory();
2681 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002682}
2683
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002684/* Issue 6012 */
2685static PyObject *str1, *str2;
2686static int
2687failing_converter(PyObject *obj, void *arg)
2688{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 /* Clone str1, then let the conversion fail. */
2690 assert(str1);
2691 str2 = str1;
2692 Py_INCREF(str2);
2693 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002694}
2695static PyObject*
2696argparsing(PyObject *o, PyObject *args)
2697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 PyObject *res;
2699 str1 = str2 = NULL;
2700 if (!PyArg_ParseTuple(args, "O&O&",
2701 PyUnicode_FSConverter, &str1,
2702 failing_converter, &str2)) {
2703 if (!str2)
2704 /* argument converter not called? */
2705 return NULL;
2706 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002707 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 Py_DECREF(str2);
2709 PyErr_Clear();
2710 return res;
2711 }
2712 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002713}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002714
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002715/* To test that the result of PyCode_NewEmpty has the right members. */
2716static PyObject *
2717code_newempty(PyObject *self, PyObject *args)
2718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 const char *filename;
2720 const char *funcname;
2721 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2724 &filename, &funcname, &firstlineno))
2725 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002728}
2729
Georg Brandl1e28a272009-12-28 08:41:01 +00002730/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2731 Run via Lib/test/test_exceptions.py */
2732static PyObject *
2733make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 const char *name;
2736 const char *doc = NULL;
2737 PyObject *base = NULL;
2738 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2743 "s|sOO:make_exception_with_doc", kwlist,
2744 &name, &doc, &base, &dict))
2745 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002748}
2749
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002750static PyObject *
2751make_memoryview_from_NULL_pointer(PyObject *self)
2752{
2753 Py_buffer info;
2754 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2755 return NULL;
2756 return PyMemoryView_FromBuffer(&info);
2757}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002758
Stefan Krah7213fcc2015-02-01 16:19:23 +01002759static PyObject *
2760test_from_contiguous(PyObject* self, PyObject *noargs)
2761{
2762 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2763 int init[5] = {0, 1, 2, 3, 4};
2764 Py_ssize_t itemsize = sizeof(int);
2765 Py_ssize_t shape = 5;
2766 Py_ssize_t strides = 2 * itemsize;
2767 Py_buffer view = {
2768 data,
2769 NULL,
2770 5 * itemsize,
2771 itemsize,
2772 1,
2773 1,
2774 NULL,
2775 &shape,
2776 &strides,
2777 NULL,
2778 NULL
2779 };
2780 int *ptr;
2781 int i;
2782
2783 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2784 ptr = view.buf;
2785 for (i = 0; i < 5; i++) {
2786 if (ptr[2*i] != i) {
2787 PyErr_SetString(TestError,
2788 "test_from_contiguous: incorrect result");
2789 return NULL;
2790 }
2791 }
2792
2793 view.buf = &data[8];
2794 view.strides[0] = -2 * itemsize;
2795
2796 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2797 ptr = view.buf;
2798 for (i = 0; i < 5; i++) {
2799 if (*(ptr-2*i) != i) {
2800 PyErr_SetString(TestError,
2801 "test_from_contiguous: incorrect result");
2802 return NULL;
2803 }
2804 }
2805
2806 Py_RETURN_NONE;
2807}
Stefan Krah650c1e82015-02-03 21:43:23 +01002808
Stefan Kraha7559c02015-02-03 22:27:21 +01002809#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01002810extern PyTypeObject _PyBytesIOBuffer_Type;
2811
Stefan Krah5178d912015-02-03 16:57:21 +01002812static PyObject *
2813test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
2814{
Stefan Krah650c1e82015-02-03 21:43:23 +01002815 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01002816 PyObject *b;
2817 char *dummy[1];
2818 int ret, match;
2819
Stefan Krah650c1e82015-02-03 21:43:23 +01002820 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01002821 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
2822 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2823 PyErr_Clear();
2824 if (ret != -1 || match == 0)
2825 goto error;
2826
Stefan Krah650c1e82015-02-03 21:43:23 +01002827 /* bytesiobuf_getbuffer() */
2828 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01002829 if (b == NULL) {
2830 return NULL;
2831 }
2832
2833 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
2834 Py_DECREF(b);
2835 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2836 PyErr_Clear();
2837 if (ret != -1 || match == 0)
2838 goto error;
2839
2840 Py_RETURN_NONE;
2841
2842error:
2843 PyErr_SetString(TestError,
2844 "test_pep3118_obsolete_write_locks: failure");
2845 return NULL;
2846}
Stefan Kraha7559c02015-02-03 22:27:21 +01002847#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002848
Stefan Krah650c1e82015-02-03 21:43:23 +01002849/* This tests functions that historically supported write locks. It is
2850 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
2851 is entitled to segfault in that case. */
2852static PyObject *
2853getbuffer_with_null_view(PyObject* self, PyObject *obj)
2854{
2855 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
2856 return NULL;
2857
2858 Py_RETURN_NONE;
2859}
2860
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002861/* Test that the fatal error from not having a current thread doesn't
2862 cause an infinite loop. Run via Lib/test/test_capi.py */
2863static PyObject *
2864crash_no_current_thread(PyObject *self)
2865{
2866 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002867 /* Using PyThreadState_Get() directly allows the test to pass in
2868 !pydebug mode. However, the test only actually tests anything
2869 in pydebug mode, since that's where the infinite loop was in
2870 the first place. */
2871 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002872 Py_END_ALLOW_THREADS
2873 return NULL;
2874}
2875
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002876/* To run some code in a sub-interpreter. */
2877static PyObject *
2878run_in_subinterp(PyObject *self, PyObject *args)
2879{
2880 const char *code;
2881 int r;
2882 PyThreadState *substate, *mainstate;
2883
2884 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2885 &code))
2886 return NULL;
2887
2888 mainstate = PyThreadState_Get();
2889
2890 PyThreadState_Swap(NULL);
2891
2892 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002893 if (substate == NULL) {
2894 /* Since no new thread state was created, there is no exception to
2895 propagate; raise a fresh one after swapping in the old thread
2896 state. */
2897 PyThreadState_Swap(mainstate);
2898 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2899 return NULL;
2900 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002901 r = PyRun_SimpleString(code);
2902 Py_EndInterpreter(substate);
2903
2904 PyThreadState_Swap(mainstate);
2905
2906 return PyLong_FromLong(r);
2907}
2908
Victor Stinner3c1b3792014-02-17 00:02:43 +01002909static int
2910check_time_rounding(int round)
2911{
Victor Stinner74474232015-09-02 01:43:56 +02002912 if (round != _PyTime_ROUND_FLOOR
2913 && round != _PyTime_ROUND_CEILING
Victor Stinner7667f582015-09-09 01:02:23 +02002914 && round != _PyTime_ROUND_HALF_EVEN) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01002915 PyErr_SetString(PyExc_ValueError, "invalid rounding");
2916 return -1;
2917 }
2918 return 0;
2919}
2920
Victor Stinner5d272cc2012-03-13 13:35:55 +01002921static PyObject *
2922test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2923{
2924 PyObject *obj;
2925 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002926 int round;
2927 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002928 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002929 if (check_time_rounding(round) < 0)
2930 return NULL;
2931 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002932 return NULL;
2933 return _PyLong_FromTime_t(sec);
2934}
2935
2936static PyObject *
2937test_pytime_object_to_timeval(PyObject *self, PyObject *args)
2938{
2939 PyObject *obj;
2940 time_t sec;
2941 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002942 int round;
2943 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002944 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002945 if (check_time_rounding(round) < 0)
2946 return NULL;
2947 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002948 return NULL;
2949 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
2950}
2951
Victor Stinner643cd682012-03-02 22:54:03 +01002952static PyObject *
2953test_pytime_object_to_timespec(PyObject *self, PyObject *args)
2954{
2955 PyObject *obj;
2956 time_t sec;
2957 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002958 int round;
2959 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01002960 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002961 if (check_time_rounding(round) < 0)
2962 return NULL;
2963 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01002964 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01002965 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01002966}
2967
Antoine Pitrou796564c2013-07-30 19:59:21 +02002968static void
2969slot_tp_del(PyObject *self)
2970{
2971 _Py_IDENTIFIER(__tp_del__);
2972 PyObject *del, *res;
2973 PyObject *error_type, *error_value, *error_traceback;
2974
2975 /* Temporarily resurrect the object. */
2976 assert(self->ob_refcnt == 0);
2977 self->ob_refcnt = 1;
2978
2979 /* Save the current exception, if any. */
2980 PyErr_Fetch(&error_type, &error_value, &error_traceback);
2981
2982 /* Execute __del__ method, if any. */
2983 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
2984 if (del != NULL) {
2985 res = PyEval_CallObject(del, NULL);
2986 if (res == NULL)
2987 PyErr_WriteUnraisable(del);
2988 else
2989 Py_DECREF(res);
2990 Py_DECREF(del);
2991 }
2992
2993 /* Restore the saved exception. */
2994 PyErr_Restore(error_type, error_value, error_traceback);
2995
2996 /* Undo the temporary resurrection; can't use DECREF here, it would
2997 * cause a recursive call.
2998 */
2999 assert(self->ob_refcnt > 0);
3000 if (--self->ob_refcnt == 0)
3001 return; /* this is the normal path out */
3002
3003 /* __del__ resurrected it! Make it look like the original Py_DECREF
3004 * never happened.
3005 */
3006 {
3007 Py_ssize_t refcnt = self->ob_refcnt;
3008 _Py_NewReference(self);
3009 self->ob_refcnt = refcnt;
3010 }
3011 assert(!PyType_IS_GC(Py_TYPE(self)) ||
3012 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
3013 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3014 * we need to undo that. */
3015 _Py_DEC_REFTOTAL;
3016 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3017 * chain, so no more to do there.
3018 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3019 * _Py_NewReference bumped tp_allocs: both of those need to be
3020 * undone.
3021 */
3022#ifdef COUNT_ALLOCS
3023 --Py_TYPE(self)->tp_frees;
3024 --Py_TYPE(self)->tp_allocs;
3025#endif
3026}
3027
3028static PyObject *
3029with_tp_del(PyObject *self, PyObject *args)
3030{
3031 PyObject *obj;
3032 PyTypeObject *tp;
3033
3034 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3035 return NULL;
3036 tp = (PyTypeObject *) obj;
3037 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3038 PyErr_Format(PyExc_TypeError,
3039 "heap type expected, got %R", obj);
3040 return NULL;
3041 }
3042 tp->tp_del = slot_tp_del;
3043 Py_INCREF(obj);
3044 return obj;
3045}
3046
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003047static PyMethodDef ml;
3048
3049static PyObject *
3050create_cfunction(PyObject *self, PyObject *args)
3051{
3052 return PyCFunction_NewEx(&ml, self, NULL);
3053}
3054
3055static PyMethodDef ml = {
3056 "create_cfunction",
3057 create_cfunction,
3058 METH_NOARGS,
3059 NULL
3060};
3061
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003062static PyObject *
3063_test_incref(PyObject *ob)
3064{
3065 Py_INCREF(ob);
3066 return ob;
3067}
3068
3069static PyObject *
3070test_xincref_doesnt_leak(PyObject *ob)
3071{
3072 PyObject *obj = PyLong_FromLong(0);
3073 Py_XINCREF(_test_incref(obj));
3074 Py_DECREF(obj);
3075 Py_DECREF(obj);
3076 Py_DECREF(obj);
3077 Py_RETURN_NONE;
3078}
3079
3080static PyObject *
3081test_incref_doesnt_leak(PyObject *ob)
3082{
3083 PyObject *obj = PyLong_FromLong(0);
3084 Py_INCREF(_test_incref(obj));
3085 Py_DECREF(obj);
3086 Py_DECREF(obj);
3087 Py_DECREF(obj);
3088 Py_RETURN_NONE;
3089}
3090
3091static PyObject *
3092test_xdecref_doesnt_leak(PyObject *ob)
3093{
3094 Py_XDECREF(PyLong_FromLong(0));
3095 Py_RETURN_NONE;
3096}
3097
3098static PyObject *
3099test_decref_doesnt_leak(PyObject *ob)
3100{
3101 Py_DECREF(PyLong_FromLong(0));
3102 Py_RETURN_NONE;
3103}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003104
Victor Stinner0507bf52013-07-07 02:05:46 +02003105static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02003106test_incref_decref_API(PyObject *ob)
3107{
3108 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003109 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003110 Py_DecRef(obj);
3111 Py_DecRef(obj);
3112 Py_RETURN_NONE;
3113}
3114
3115static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02003116test_pymem_alloc0(PyObject *self)
3117{
3118 void *ptr;
3119
Victor Stinnerdb067af2014-05-02 22:31:14 +02003120 ptr = PyMem_RawMalloc(0);
3121 if (ptr == NULL) {
3122 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3123 return NULL;
3124 }
3125 PyMem_RawFree(ptr);
3126
3127 ptr = PyMem_RawCalloc(0, 0);
3128 if (ptr == NULL) {
3129 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3130 return NULL;
3131 }
3132 PyMem_RawFree(ptr);
3133
Victor Stinner0507bf52013-07-07 02:05:46 +02003134 ptr = PyMem_Malloc(0);
3135 if (ptr == NULL) {
3136 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3137 return NULL;
3138 }
3139 PyMem_Free(ptr);
3140
Victor Stinnerdb067af2014-05-02 22:31:14 +02003141 ptr = PyMem_Calloc(0, 0);
3142 if (ptr == NULL) {
3143 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3144 return NULL;
3145 }
3146 PyMem_Free(ptr);
3147
Victor Stinner0507bf52013-07-07 02:05:46 +02003148 ptr = PyObject_Malloc(0);
3149 if (ptr == NULL) {
3150 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3151 return NULL;
3152 }
3153 PyObject_Free(ptr);
3154
Victor Stinnerdb067af2014-05-02 22:31:14 +02003155 ptr = PyObject_Calloc(0, 0);
3156 if (ptr == NULL) {
3157 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3158 return NULL;
3159 }
3160 PyObject_Free(ptr);
3161
Victor Stinner0507bf52013-07-07 02:05:46 +02003162 Py_RETURN_NONE;
3163}
3164
3165typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003166 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003167
3168 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003169 size_t calloc_nelem;
3170 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003171 void *realloc_ptr;
3172 size_t realloc_new_size;
3173 void *free_ptr;
3174} alloc_hook_t;
3175
3176static void* hook_malloc (void* ctx, size_t size)
3177{
3178 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3179 hook->malloc_size = size;
3180 return hook->alloc.malloc(hook->alloc.ctx, size);
3181}
3182
Victor Stinnerdb067af2014-05-02 22:31:14 +02003183static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
3184{
3185 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3186 hook->calloc_nelem = nelem;
3187 hook->calloc_elsize = elsize;
3188 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3189}
3190
Victor Stinner0507bf52013-07-07 02:05:46 +02003191static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
3192{
3193 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3194 hook->realloc_ptr = ptr;
3195 hook->realloc_new_size = new_size;
3196 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3197}
3198
3199static void hook_free (void *ctx, void *ptr)
3200{
3201 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3202 hook->free_ptr = ptr;
3203 hook->alloc.free(hook->alloc.ctx, ptr);
3204}
3205
3206static PyObject *
3207test_setallocators(PyMemAllocatorDomain domain)
3208{
3209 PyObject *res = NULL;
3210 const char *error_msg;
3211 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003212 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003213 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003214 void *ptr, *ptr2;
3215
Victor Stinnerdb067af2014-05-02 22:31:14 +02003216 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003217
3218 alloc.ctx = &hook;
3219 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003220 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003221 alloc.realloc = &hook_realloc;
3222 alloc.free = &hook_free;
3223 PyMem_GetAllocator(domain, &hook.alloc);
3224 PyMem_SetAllocator(domain, &alloc);
3225
3226 size = 42;
3227 switch(domain)
3228 {
3229 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3230 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3231 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3232 default: ptr = NULL; break;
3233 }
3234
3235 if (ptr == NULL) {
3236 error_msg = "malloc failed";
3237 goto fail;
3238 }
3239
3240 if (hook.malloc_size != size) {
3241 error_msg = "malloc invalid size";
3242 goto fail;
3243 }
3244
3245 size2 = 200;
3246 switch(domain)
3247 {
3248 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3249 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3250 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003251 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003252 }
3253
3254 if (ptr2 == NULL) {
3255 error_msg = "realloc failed";
3256 goto fail;
3257 }
3258
3259 if (hook.realloc_ptr != ptr
3260 || hook.realloc_new_size != size2) {
3261 error_msg = "realloc invalid parameters";
3262 goto fail;
3263 }
3264
3265 switch(domain)
3266 {
3267 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3268 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3269 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3270 }
3271
3272 if (hook.free_ptr != ptr2) {
3273 error_msg = "free invalid pointer";
3274 goto fail;
3275 }
3276
Victor Stinnerdb067af2014-05-02 22:31:14 +02003277 nelem = 2;
3278 elsize = 5;
3279 switch(domain)
3280 {
3281 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3282 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3283 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3284 default: ptr = NULL; break;
3285 }
3286
3287 if (ptr == NULL) {
3288 error_msg = "calloc failed";
3289 goto fail;
3290 }
3291
3292 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3293 error_msg = "calloc invalid nelem or elsize";
3294 goto fail;
3295 }
3296
3297 switch(domain)
3298 {
3299 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3300 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3301 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3302 }
3303
Victor Stinner0507bf52013-07-07 02:05:46 +02003304 Py_INCREF(Py_None);
3305 res = Py_None;
3306 goto finally;
3307
3308fail:
3309 PyErr_SetString(PyExc_RuntimeError, error_msg);
3310
3311finally:
3312 PyMem_SetAllocator(domain, &hook.alloc);
3313 return res;
3314}
3315
3316static PyObject *
3317test_pymem_setrawallocators(PyObject *self)
3318{
3319 return test_setallocators(PYMEM_DOMAIN_RAW);
3320}
3321
3322static PyObject *
3323test_pymem_setallocators(PyObject *self)
3324{
3325 return test_setallocators(PYMEM_DOMAIN_MEM);
3326}
3327
3328static PyObject *
3329test_pyobject_setallocators(PyObject *self)
3330{
3331 return test_setallocators(PYMEM_DOMAIN_OBJ);
3332}
3333
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003334PyDoc_STRVAR(docstring_empty,
3335""
3336);
3337
3338PyDoc_STRVAR(docstring_no_signature,
3339"This docstring has no signature."
3340);
3341
3342PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003343"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003344"\n"
3345"This docstring has an invalid signature."
3346);
3347
Larry Hastings2623c8c2014-02-08 22:15:29 -08003348PyDoc_STRVAR(docstring_with_invalid_signature2,
3349"docstring_with_invalid_signature2($module, /, boo)\n"
3350"\n"
3351"--\n"
3352"\n"
3353"This docstring also has an invalid signature."
3354);
3355
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003356PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003357"docstring_with_signature($module, /, sig)\n"
3358"--\n"
3359"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003360"This docstring has a valid signature."
3361);
3362
Zachary Ware8ef887c2015-04-13 18:22:35 -05003363PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3364"docstring_with_signature_but_no_doc($module, /, sig)\n"
3365"--\n"
3366"\n"
3367);
3368
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003369PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003370"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3371"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003372"\n"
3373"\n"
3374"This docstring has a valid signature and some extra newlines."
3375);
3376
Larry Hastings16c51912014-01-07 11:53:01 -08003377PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003378"docstring_with_signature_with_defaults(module, s='avocado',\n"
3379" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3380" local=the_number_three, sys=sys.maxsize,\n"
3381" exp=sys.maxsize - 1)\n"
3382"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003383"\n"
3384"\n"
3385"\n"
3386"This docstring has a valid signature with parameters,\n"
3387"and the parameters take defaults of varying types."
3388);
3389
Victor Stinner258e4d32013-12-13 02:30:12 +01003390#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003391typedef struct {
3392 PyThread_type_lock start_event;
3393 PyThread_type_lock exit_event;
3394 PyObject *callback;
3395} test_c_thread_t;
3396
3397static void
3398temporary_c_thread(void *data)
3399{
3400 test_c_thread_t *test_c_thread = data;
3401 PyGILState_STATE state;
3402 PyObject *res;
3403
3404 PyThread_release_lock(test_c_thread->start_event);
3405
3406 /* Allocate a Python thread state for this thread */
3407 state = PyGILState_Ensure();
3408
3409 res = PyObject_CallFunction(test_c_thread->callback, "", NULL);
3410 Py_CLEAR(test_c_thread->callback);
3411
3412 if (res == NULL) {
3413 PyErr_Print();
3414 }
3415 else {
3416 Py_DECREF(res);
3417 }
3418
3419 /* Destroy the Python thread state for this thread */
3420 PyGILState_Release(state);
3421
3422 PyThread_release_lock(test_c_thread->exit_event);
3423
3424 PyThread_exit_thread();
3425}
3426
3427static PyObject *
3428call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3429{
3430 PyObject *res = NULL;
3431 test_c_thread_t test_c_thread;
3432 long thread;
3433
3434 PyEval_InitThreads();
3435
3436 test_c_thread.start_event = PyThread_allocate_lock();
3437 test_c_thread.exit_event = PyThread_allocate_lock();
3438 test_c_thread.callback = NULL;
3439 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3440 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3441 goto exit;
3442 }
3443
3444 Py_INCREF(callback);
3445 test_c_thread.callback = callback;
3446
3447 PyThread_acquire_lock(test_c_thread.start_event, 1);
3448 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3449
3450 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3451 if (thread == -1) {
3452 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3453 PyThread_release_lock(test_c_thread.start_event);
3454 PyThread_release_lock(test_c_thread.exit_event);
3455 goto exit;
3456 }
3457
3458 PyThread_acquire_lock(test_c_thread.start_event, 1);
3459 PyThread_release_lock(test_c_thread.start_event);
3460
3461 Py_BEGIN_ALLOW_THREADS
3462 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3463 PyThread_release_lock(test_c_thread.exit_event);
3464 Py_END_ALLOW_THREADS
3465
3466 Py_INCREF(Py_None);
3467 res = Py_None;
3468
3469exit:
3470 Py_CLEAR(test_c_thread.callback);
3471 if (test_c_thread.start_event)
3472 PyThread_free_lock(test_c_thread.start_event);
3473 if (test_c_thread.exit_event)
3474 PyThread_free_lock(test_c_thread.exit_event);
3475 return res;
3476}
Victor Stinner258e4d32013-12-13 02:30:12 +01003477#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003478
Victor Stinner56e8c292014-07-21 12:30:22 +02003479static PyObject*
3480test_raise_signal(PyObject* self, PyObject *args)
3481{
3482 int signum, err;
3483
3484 if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0)
3485 return NULL;
3486
3487 err = raise(signum);
3488 if (err)
3489 return PyErr_SetFromErrno(PyExc_OSError);
3490
3491 if (PyErr_CheckSignals() < 0)
3492 return NULL;
3493
3494 Py_RETURN_NONE;
3495}
3496
Serhiy Storchakab5181342015-02-06 08:58:56 +02003497/* marshal */
3498
3499static PyObject*
3500pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3501{
3502 long value;
3503 char *filename;
3504 int version;
3505 FILE *fp;
3506
3507 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3508 &value, &filename, &version))
3509 return NULL;
3510
3511 fp = fopen(filename, "wb");
3512 if (fp == NULL) {
3513 PyErr_SetFromErrno(PyExc_OSError);
3514 return NULL;
3515 }
3516
3517 PyMarshal_WriteLongToFile(value, fp, version);
3518
3519 fclose(fp);
3520 if (PyErr_Occurred())
3521 return NULL;
3522 Py_RETURN_NONE;
3523}
3524
3525static PyObject*
3526pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3527{
3528 PyObject *obj;
3529 char *filename;
3530 int version;
3531 FILE *fp;
3532
3533 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3534 &obj, &filename, &version))
3535 return NULL;
3536
3537 fp = fopen(filename, "wb");
3538 if (fp == NULL) {
3539 PyErr_SetFromErrno(PyExc_OSError);
3540 return NULL;
3541 }
3542
3543 PyMarshal_WriteObjectToFile(obj, fp, version);
3544
3545 fclose(fp);
3546 if (PyErr_Occurred())
3547 return NULL;
3548 Py_RETURN_NONE;
3549}
3550
3551static PyObject*
3552pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3553{
3554 int value;
3555 long pos;
3556 char *filename;
3557 FILE *fp;
3558
3559 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3560 return NULL;
3561
3562 fp = fopen(filename, "rb");
3563 if (fp == NULL) {
3564 PyErr_SetFromErrno(PyExc_OSError);
3565 return NULL;
3566 }
3567
3568 value = PyMarshal_ReadShortFromFile(fp);
3569 pos = ftell(fp);
3570
3571 fclose(fp);
3572 if (PyErr_Occurred())
3573 return NULL;
3574 return Py_BuildValue("il", value, pos);
3575}
3576
3577static PyObject*
3578pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3579{
3580 long value, pos;
3581 char *filename;
3582 FILE *fp;
3583
3584 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3585 return NULL;
3586
3587 fp = fopen(filename, "rb");
3588 if (fp == NULL) {
3589 PyErr_SetFromErrno(PyExc_OSError);
3590 return NULL;
3591 }
3592
3593 value = PyMarshal_ReadLongFromFile(fp);
3594 pos = ftell(fp);
3595
3596 fclose(fp);
3597 if (PyErr_Occurred())
3598 return NULL;
3599 return Py_BuildValue("ll", value, pos);
3600}
3601
3602static PyObject*
3603pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3604{
3605 PyObject *obj;
3606 long pos;
3607 char *filename;
3608 FILE *fp;
3609
3610 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3611 return NULL;
3612
3613 fp = fopen(filename, "rb");
3614 if (fp == NULL) {
3615 PyErr_SetFromErrno(PyExc_OSError);
3616 return NULL;
3617 }
3618
3619 obj = PyMarshal_ReadLastObjectFromFile(fp);
3620 pos = ftell(fp);
3621
3622 fclose(fp);
3623 return Py_BuildValue("Nl", obj, pos);
3624}
3625
3626static PyObject*
3627pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3628{
3629 PyObject *obj;
3630 long pos;
3631 char *filename;
3632 FILE *fp;
3633
3634 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3635 return NULL;
3636
3637 fp = fopen(filename, "rb");
3638 if (fp == NULL) {
3639 PyErr_SetFromErrno(PyExc_OSError);
3640 return NULL;
3641 }
3642
3643 obj = PyMarshal_ReadObjectFromFile(fp);
3644 pos = ftell(fp);
3645
3646 fclose(fp);
3647 return Py_BuildValue("Nl", obj, pos);
3648}
3649
Victor Stinnerefde1462015-03-21 15:04:43 +01003650static PyObject*
3651return_null_without_error(PyObject *self, PyObject *args)
3652{
3653 /* invalid call: return NULL without setting an error,
3654 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3655 PyErr_Clear();
3656 return NULL;
3657}
3658
3659static PyObject*
3660return_result_with_error(PyObject *self, PyObject *args)
3661{
3662 /* invalid call: return a result with an error set,
3663 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3664 PyErr_SetNone(PyExc_ValueError);
3665 Py_RETURN_NONE;
3666}
3667
Victor Stinner992c43f2015-03-27 17:12:45 +01003668static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02003669test_pytime_fromseconds(PyObject *self, PyObject *args)
3670{
3671 int seconds;
3672 _PyTime_t ts;
3673
3674 if (!PyArg_ParseTuple(args, "i", &seconds))
3675 return NULL;
3676 ts = _PyTime_FromSeconds(seconds);
3677 return _PyTime_AsNanosecondsObject(ts);
3678}
3679
3680static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01003681test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
3682{
3683 PyObject *obj;
3684 int round;
3685 _PyTime_t ts;
3686
3687 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
3688 return NULL;
3689 if (check_time_rounding(round) < 0)
3690 return NULL;
3691 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
3692 return NULL;
3693 return _PyTime_AsNanosecondsObject(ts);
3694}
3695
Victor Stinner4bfb4602015-03-27 22:27:24 +01003696static PyObject *
3697test_pytime_assecondsdouble(PyObject *self, PyObject *args)
3698{
3699 PY_LONG_LONG ns;
3700 _PyTime_t ts;
3701 double d;
3702
3703 if (!PyArg_ParseTuple(args, "L", &ns))
3704 return NULL;
3705 ts = _PyTime_FromNanoseconds(ns);
3706 d = _PyTime_AsSecondsDouble(ts);
3707 return PyFloat_FromDouble(d);
3708}
3709
Victor Stinner95e9cef2015-03-28 01:26:47 +01003710static PyObject *
3711test_PyTime_AsTimeval(PyObject *self, PyObject *args)
3712{
3713 PY_LONG_LONG ns;
3714 int round;
3715 _PyTime_t t;
3716 struct timeval tv;
3717 PyObject *seconds;
3718
3719 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3720 return NULL;
3721 if (check_time_rounding(round) < 0)
3722 return NULL;
3723 t = _PyTime_FromNanoseconds(ns);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +02003724 if (_PyTime_AsTimeval(t, &tv, round) < 0)
Victor Stinner95e9cef2015-03-28 01:26:47 +01003725 return NULL;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003726
3727 seconds = PyLong_FromLong((PY_LONG_LONG)tv.tv_sec);
3728 if (seconds == NULL)
3729 return NULL;
3730 return Py_BuildValue("Nl", seconds, tv.tv_usec);
3731}
3732
Victor Stinner34dc0f42015-03-27 18:19:03 +01003733#ifdef HAVE_CLOCK_GETTIME
3734static PyObject *
3735test_PyTime_AsTimespec(PyObject *self, PyObject *args)
3736{
3737 PY_LONG_LONG ns;
3738 _PyTime_t t;
3739 struct timespec ts;
3740
3741 if (!PyArg_ParseTuple(args, "L", &ns))
3742 return NULL;
3743 t = _PyTime_FromNanoseconds(ns);
3744 if (_PyTime_AsTimespec(t, &ts) == -1)
3745 return NULL;
3746 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
3747}
3748#endif
3749
Victor Stinner62d1c702015-04-01 17:47:07 +02003750static PyObject *
3751test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
3752{
3753 PY_LONG_LONG ns;
3754 int round;
3755 _PyTime_t t, ms;
3756
3757 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3758 return NULL;
3759 if (check_time_rounding(round) < 0)
3760 return NULL;
3761 t = _PyTime_FromNanoseconds(ns);
3762 ms = _PyTime_AsMilliseconds(t, round);
3763 /* This conversion rely on the fact that _PyTime_t is a number of
3764 nanoseconds */
3765 return _PyTime_AsNanosecondsObject(ms);
3766}
3767
3768static PyObject *
3769test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
3770{
3771 PY_LONG_LONG ns;
3772 int round;
3773 _PyTime_t t, ms;
3774
3775 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3776 return NULL;
3777 if (check_time_rounding(round) < 0)
3778 return NULL;
3779 t = _PyTime_FromNanoseconds(ns);
3780 ms = _PyTime_AsMicroseconds(t, round);
3781 /* This conversion rely on the fact that _PyTime_t is a number of
3782 nanoseconds */
3783 return _PyTime_AsNanosecondsObject(ms);
3784}
3785
Victor Stinner50856d52015-10-13 00:11:21 +02003786static PyObject*
3787get_recursion_depth(PyObject *self, PyObject *args)
3788{
3789 PyThreadState *tstate = PyThreadState_GET();
3790
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07003791 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02003792 return PyLong_FromLong(tstate->recursion_depth - 1);
3793}
3794
Victor Stinner34be807c2016-03-14 12:04:26 +01003795static PyObject*
3796pymem_buffer_overflow(PyObject *self, PyObject *args)
3797{
3798 char *buffer;
3799
3800 /* Deliberate buffer overflow to check that PyMem_Free() detects
3801 the overflow when debug hooks are installed. */
3802 buffer = PyMem_Malloc(16);
3803 buffer[16] = 'x';
3804 PyMem_Free(buffer);
3805
3806 Py_RETURN_NONE;
3807}
3808
3809static PyObject*
3810pymem_api_misuse(PyObject *self, PyObject *args)
3811{
3812 char *buffer;
3813
3814 /* Deliberate misusage of Python allocators:
3815 allococate with PyMem but release with PyMem_Raw. */
3816 buffer = PyMem_Malloc(16);
3817 PyMem_RawFree(buffer);
3818
3819 Py_RETURN_NONE;
3820}
3821
Victor Stinnerc4aec362016-03-14 22:26:53 +01003822static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01003823pymem_malloc_without_gil(PyObject *self, PyObject *args)
3824{
3825 char *buffer;
3826
3827 /* Deliberate bug to test debug hooks on Python memory allocators:
3828 call PyMem_Malloc() without holding the GIL */
3829 Py_BEGIN_ALLOW_THREADS
3830 buffer = PyMem_Malloc(10);
3831 Py_END_ALLOW_THREADS
3832
3833 PyMem_Free(buffer);
3834
3835 Py_RETURN_NONE;
3836}
3837
3838static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01003839pyobject_malloc_without_gil(PyObject *self, PyObject *args)
3840{
3841 char *buffer;
3842
Victor Stinnerad524372016-03-16 12:12:53 +01003843 /* Deliberate bug to test debug hooks on Python memory allocators:
3844 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01003845 Py_BEGIN_ALLOW_THREADS
3846 buffer = PyObject_Malloc(10);
3847 Py_END_ALLOW_THREADS
3848
3849 PyObject_Free(buffer);
3850
3851 Py_RETURN_NONE;
3852}
3853
Victor Stinner10b73e12016-03-22 13:39:05 +01003854static PyObject *
3855tracemalloc_track(PyObject *self, PyObject *args)
3856{
3857 unsigned int domain;
3858 PyObject *ptr_obj;
3859 void *ptr;
3860 Py_ssize_t size;
3861 int release_gil = 0;
3862 int res;
3863
3864 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
3865 return NULL;
3866 ptr = PyLong_AsVoidPtr(ptr_obj);
3867 if (PyErr_Occurred())
3868 return NULL;
3869
3870 if (release_gil) {
3871 Py_BEGIN_ALLOW_THREADS
3872 res = _PyTraceMalloc_Track(domain, (Py_uintptr_t)ptr, size);
3873 Py_END_ALLOW_THREADS
3874 }
3875 else {
3876 res = _PyTraceMalloc_Track(domain, (Py_uintptr_t)ptr, size);
3877 }
3878
3879 if (res < 0) {
3880 PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
3881 return NULL;
3882 }
3883
3884 Py_RETURN_NONE;
3885}
3886
3887static PyObject *
3888tracemalloc_untrack(PyObject *self, PyObject *args)
3889{
3890 unsigned int domain;
3891 PyObject *ptr_obj;
3892 void *ptr;
3893 int res;
3894
3895 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
3896 return NULL;
3897 ptr = PyLong_AsVoidPtr(ptr_obj);
3898 if (PyErr_Occurred())
3899 return NULL;
3900
3901 res = _PyTraceMalloc_Untrack(domain, (Py_uintptr_t)ptr);
3902 if (res < 0) {
3903 PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
3904 return NULL;
3905 }
3906
3907 Py_RETURN_NONE;
3908}
3909
3910static PyObject *
3911tracemalloc_get_traceback(PyObject *self, PyObject *args)
3912{
3913 unsigned int domain;
3914 PyObject *ptr_obj;
3915 void *ptr;
3916
3917 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
3918 return NULL;
3919 ptr = PyLong_AsVoidPtr(ptr_obj);
3920 if (PyErr_Occurred())
3921 return NULL;
3922
3923 return _PyTraceMalloc_GetTraceback(domain, (Py_uintptr_t)ptr);
3924}
3925
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003926
Tim Peters9ea17ac2001-02-02 05:57:15 +00003927static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003928 {"raise_exception", raise_exception, METH_VARARGS},
3929 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02003930 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003931 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01003932 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003933 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
3934 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
3935 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
3936 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003937 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003938 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
3939 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
3940 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
3941 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02003942 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003943 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
3944 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02003945 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
3946 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003947 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
3948 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
3949 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07003950 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003951 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
3952 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
3953 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
3954 PyDoc_STR("This is a pretty normal docstring.")},
3955 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
3956 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
3957 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01003958 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01003959#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01003960 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01003961#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01003962 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03003963 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03003964 {"get_args", get_args, METH_VARARGS},
3965 {"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003966 {"getargs_tuple", getargs_tuple, METH_VARARGS},
3967 {"getargs_keywords", (PyCFunction)getargs_keywords,
3968 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00003969 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
3970 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03003971 {"getargs_positional_only_and_keywords",
3972 (PyCFunction)getargs_positional_only_and_keywords,
3973 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003974 {"getargs_b", getargs_b, METH_VARARGS},
3975 {"getargs_B", getargs_B, METH_VARARGS},
3976 {"getargs_h", getargs_h, METH_VARARGS},
3977 {"getargs_H", getargs_H, METH_VARARGS},
3978 {"getargs_I", getargs_I, METH_VARARGS},
3979 {"getargs_k", getargs_k, METH_VARARGS},
3980 {"getargs_i", getargs_i, METH_VARARGS},
3981 {"getargs_l", getargs_l, METH_VARARGS},
3982 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07003983 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003984 {"getargs_L", getargs_L, METH_VARARGS},
3985 {"getargs_K", getargs_K, METH_VARARGS},
3986 {"test_longlong_api", test_longlong_api, METH_NOARGS},
3987 {"test_long_long_and_overflow",
3988 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
3989 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03003990 {"getargs_f", getargs_f, METH_VARARGS},
3991 {"getargs_d", getargs_d, METH_VARARGS},
3992 {"getargs_D", getargs_D, METH_VARARGS},
3993 {"getargs_S", getargs_S, METH_VARARGS},
3994 {"getargs_Y", getargs_Y, METH_VARARGS},
3995 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03003996 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02003997 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003998 {"getargs_s", getargs_s, METH_VARARGS},
3999 {"getargs_s_star", getargs_s_star, METH_VARARGS},
4000 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
4001 {"getargs_z", getargs_z, METH_VARARGS},
4002 {"getargs_z_star", getargs_z_star, METH_VARARGS},
4003 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
4004 {"getargs_y", getargs_y, METH_VARARGS},
4005 {"getargs_y_star", getargs_y_star, METH_VARARGS},
4006 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
4007 {"getargs_u", getargs_u, METH_VARARGS},
4008 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
4009 {"getargs_Z", getargs_Z, METH_VARARGS},
4010 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00004011 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004012 {"getargs_es", getargs_es, METH_VARARGS},
4013 {"getargs_et", getargs_et, METH_VARARGS},
4014 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
4015 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004016 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004017 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004018 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004019 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004020 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
4021 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
4022 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
4023 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004024 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
4025 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
4026 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
4027 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01004028 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004029#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00004030 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004031 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004032#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00004033#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00004034 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004035#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00004036 {"traceback_print", traceback_print, METH_VARARGS},
4037 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02004038 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004039 {"argparsing", argparsing, METH_VARARGS},
4040 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004041 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
4042 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00004043 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
4044 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00004045 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004046 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01004047 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
4048 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01004049 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02004050 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04004051 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02004052 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02004053 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
4054 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02004055 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
4056 {"test_pymem_setallocators",
4057 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
4058 {"test_pyobject_setallocators",
4059 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004060 {"no_docstring",
4061 (PyCFunction)test_with_docstring, METH_NOARGS},
4062 {"docstring_empty",
4063 (PyCFunction)test_with_docstring, METH_NOARGS,
4064 docstring_empty},
4065 {"docstring_no_signature",
4066 (PyCFunction)test_with_docstring, METH_NOARGS,
4067 docstring_no_signature},
4068 {"docstring_with_invalid_signature",
4069 (PyCFunction)test_with_docstring, METH_NOARGS,
4070 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004071 {"docstring_with_invalid_signature2",
4072 (PyCFunction)test_with_docstring, METH_NOARGS,
4073 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004074 {"docstring_with_signature",
4075 (PyCFunction)test_with_docstring, METH_NOARGS,
4076 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004077 {"docstring_with_signature_but_no_doc",
4078 (PyCFunction)test_with_docstring, METH_NOARGS,
4079 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004080 {"docstring_with_signature_and_extra_newlines",
4081 (PyCFunction)test_with_docstring, METH_NOARGS,
4082 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004083 {"docstring_with_signature_with_defaults",
4084 (PyCFunction)test_with_docstring, METH_NOARGS,
4085 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02004086 {"raise_signal",
4087 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01004088#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004089 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4090 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01004091#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02004092 {"pymarshal_write_long_to_file",
4093 pymarshal_write_long_to_file, METH_VARARGS},
4094 {"pymarshal_write_object_to_file",
4095 pymarshal_write_object_to_file, METH_VARARGS},
4096 {"pymarshal_read_short_from_file",
4097 pymarshal_read_short_from_file, METH_VARARGS},
4098 {"pymarshal_read_long_from_file",
4099 pymarshal_read_long_from_file, METH_VARARGS},
4100 {"pymarshal_read_last_object_from_file",
4101 pymarshal_read_last_object_from_file, METH_VARARGS},
4102 {"pymarshal_read_object_from_file",
4103 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004104 {"return_null_without_error",
4105 return_null_without_error, METH_NOARGS},
4106 {"return_result_with_error",
4107 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004108 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004109 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4110 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004111 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004112#ifdef HAVE_CLOCK_GETTIME
4113 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4114#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004115 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4116 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004117 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01004118 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
4119 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01004120 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01004121 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01004122 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
4123 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
4124 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00004126};
4127
Thomas Hellera4ea6032003-04-17 18:55:45 +00004128#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
4129
Thomas Wouters89f507f2006-12-13 04:49:30 +00004130typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004131 char bool_member;
4132 char byte_member;
4133 unsigned char ubyte_member;
4134 short short_member;
4135 unsigned short ushort_member;
4136 int int_member;
4137 unsigned int uint_member;
4138 long long_member;
4139 unsigned long ulong_member;
4140 Py_ssize_t pyssizet_member;
4141 float float_member;
4142 double double_member;
4143 char inplace_member[6];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004144 PY_LONG_LONG longlong_member;
4145 unsigned PY_LONG_LONG ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004146} all_structmembers;
4147
4148typedef struct {
4149 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004151} test_structmembers;
4152
4153static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004154 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
4155 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
4156 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
4157 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
4158 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
4159 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
4160 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
4161 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
4162 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
4163 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
4164 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
4165 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
4166 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004167 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
4168 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004169 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00004170};
4171
4172
Christian Heimes1af737c2008-01-23 08:24:23 +00004173static PyObject *
4174test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
4175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004176 static char *keywords[] = {
4177 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
4178 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
4179 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004180 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004181 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07004182 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004183 test_structmembers *ob;
4184 const char *s = NULL;
4185 Py_ssize_t string_len = 0;
4186 ob = PyObject_New(test_structmembers, type);
4187 if (ob == NULL)
4188 return NULL;
4189 memset(&ob->structmembers, 0, sizeof(all_structmembers));
4190 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
4191 &ob->structmembers.bool_member,
4192 &ob->structmembers.byte_member,
4193 &ob->structmembers.ubyte_member,
4194 &ob->structmembers.short_member,
4195 &ob->structmembers.ushort_member,
4196 &ob->structmembers.int_member,
4197 &ob->structmembers.uint_member,
4198 &ob->structmembers.long_member,
4199 &ob->structmembers.ulong_member,
4200 &ob->structmembers.pyssizet_member,
4201 &ob->structmembers.float_member,
4202 &ob->structmembers.double_member,
4203 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 , &ob->structmembers.longlong_member,
4205 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004206 )) {
4207 Py_DECREF(ob);
4208 return NULL;
4209 }
4210 if (s != NULL) {
4211 if (string_len > 5) {
4212 Py_DECREF(ob);
4213 PyErr_SetString(PyExc_ValueError, "string too long");
4214 return NULL;
4215 }
4216 strcpy(ob->structmembers.inplace_member, s);
4217 }
4218 else {
4219 strcpy(ob->structmembers.inplace_member, "");
4220 }
4221 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004222}
4223
Christian Heimes1af737c2008-01-23 08:24:23 +00004224static void
4225test_structmembers_free(PyObject *ob)
4226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004227 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004228}
4229
4230static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004231 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004232 "test_structmembersType",
4233 sizeof(test_structmembers), /* tp_basicsize */
4234 0, /* tp_itemsize */
4235 test_structmembers_free, /* destructor tp_dealloc */
4236 0, /* tp_print */
4237 0, /* tp_getattr */
4238 0, /* tp_setattr */
4239 0, /* tp_reserved */
4240 0, /* tp_repr */
4241 0, /* tp_as_number */
4242 0, /* tp_as_sequence */
4243 0, /* tp_as_mapping */
4244 0, /* tp_hash */
4245 0, /* tp_call */
4246 0, /* tp_str */
4247 PyObject_GenericGetAttr, /* tp_getattro */
4248 PyObject_GenericSetAttr, /* tp_setattro */
4249 0, /* tp_as_buffer */
4250 0, /* tp_flags */
4251 "Type containing all structmember types",
4252 0, /* traverseproc tp_traverse */
4253 0, /* tp_clear */
4254 0, /* tp_richcompare */
4255 0, /* tp_weaklistoffset */
4256 0, /* tp_iter */
4257 0, /* tp_iternext */
4258 0, /* tp_methods */
4259 test_members, /* tp_members */
4260 0,
4261 0,
4262 0,
4263 0,
4264 0,
4265 0,
4266 0,
4267 0,
4268 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004269};
4270
4271
Benjamin Petersond51374e2014-04-09 23:55:56 -04004272typedef struct {
4273 PyObject_HEAD
4274} matmulObject;
4275
4276static PyObject *
4277matmulType_matmul(PyObject *self, PyObject *other)
4278{
4279 return Py_BuildValue("(sOO)", "matmul", self, other);
4280}
4281
4282static PyObject *
4283matmulType_imatmul(PyObject *self, PyObject *other)
4284{
4285 return Py_BuildValue("(sOO)", "imatmul", self, other);
4286}
4287
4288static void
4289matmulType_dealloc(PyObject *self)
4290{
Zachary Ware420dc562014-04-23 13:51:27 -05004291 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004292}
4293
4294static PyNumberMethods matmulType_as_number = {
4295 0, /* nb_add */
4296 0, /* nb_subtract */
4297 0, /* nb_multiply */
4298 0, /* nb_remainde r*/
4299 0, /* nb_divmod */
4300 0, /* nb_power */
4301 0, /* nb_negative */
4302 0, /* tp_positive */
4303 0, /* tp_absolute */
4304 0, /* tp_bool */
4305 0, /* nb_invert */
4306 0, /* nb_lshift */
4307 0, /* nb_rshift */
4308 0, /* nb_and */
4309 0, /* nb_xor */
4310 0, /* nb_or */
4311 0, /* nb_int */
4312 0, /* nb_reserved */
4313 0, /* nb_float */
4314 0, /* nb_inplace_add */
4315 0, /* nb_inplace_subtract */
4316 0, /* nb_inplace_multiply */
4317 0, /* nb_inplace_remainder */
4318 0, /* nb_inplace_power */
4319 0, /* nb_inplace_lshift */
4320 0, /* nb_inplace_rshift */
4321 0, /* nb_inplace_and */
4322 0, /* nb_inplace_xor */
4323 0, /* nb_inplace_or */
4324 0, /* nb_floor_divide */
4325 0, /* nb_true_divide */
4326 0, /* nb_inplace_floor_divide */
4327 0, /* nb_inplace_true_divide */
4328 0, /* nb_index */
4329 matmulType_matmul, /* nb_matrix_multiply */
4330 matmulType_imatmul /* nb_matrix_inplace_multiply */
4331};
4332
4333static PyTypeObject matmulType = {
4334 PyVarObject_HEAD_INIT(NULL, 0)
4335 "matmulType",
4336 sizeof(matmulObject), /* tp_basicsize */
4337 0, /* tp_itemsize */
4338 matmulType_dealloc, /* destructor tp_dealloc */
4339 0, /* tp_print */
4340 0, /* tp_getattr */
4341 0, /* tp_setattr */
4342 0, /* tp_reserved */
4343 0, /* tp_repr */
4344 &matmulType_as_number, /* tp_as_number */
4345 0, /* tp_as_sequence */
4346 0, /* tp_as_mapping */
4347 0, /* tp_hash */
4348 0, /* tp_call */
4349 0, /* tp_str */
4350 PyObject_GenericGetAttr, /* tp_getattro */
4351 PyObject_GenericSetAttr, /* tp_setattro */
4352 0, /* tp_as_buffer */
4353 0, /* tp_flags */
4354 "C level type with matrix operations defined",
4355 0, /* traverseproc tp_traverse */
4356 0, /* tp_clear */
4357 0, /* tp_richcompare */
4358 0, /* tp_weaklistoffset */
4359 0, /* tp_iter */
4360 0, /* tp_iternext */
4361 0, /* tp_methods */
4362 0, /* tp_members */
4363 0,
4364 0,
4365 0,
4366 0,
4367 0,
4368 0,
4369 0,
4370 0,
4371 PyType_GenericNew, /* tp_new */
4372 PyObject_Del, /* tp_free */
4373};
4374
Martin v. Löwis1a214512008-06-11 05:26:20 +00004375
Yury Selivanov75445082015-05-11 22:57:16 -04004376typedef struct {
4377 PyObject_HEAD
4378 PyObject *ao_iterator;
4379} awaitObject;
4380
4381
4382static PyObject *
4383awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4384{
4385 PyObject *v;
4386 awaitObject *ao;
4387
4388 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
4389 return NULL;
4390
4391 ao = (awaitObject *)type->tp_alloc(type, 0);
4392 if (ao == NULL) {
4393 return NULL;
4394 }
4395
4396 Py_INCREF(v);
4397 ao->ao_iterator = v;
4398
4399 return (PyObject *)ao;
4400}
4401
4402
4403static void
4404awaitObject_dealloc(awaitObject *ao)
4405{
4406 Py_CLEAR(ao->ao_iterator);
4407 Py_TYPE(ao)->tp_free(ao);
4408}
4409
4410
4411static PyObject *
4412awaitObject_await(awaitObject *ao)
4413{
4414 Py_INCREF(ao->ao_iterator);
4415 return ao->ao_iterator;
4416}
4417
4418static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04004419 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04004420 0, /* am_aiter */
4421 0 /* am_anext */
4422};
4423
4424
4425static PyTypeObject awaitType = {
4426 PyVarObject_HEAD_INIT(NULL, 0)
4427 "awaitType",
4428 sizeof(awaitObject), /* tp_basicsize */
4429 0, /* tp_itemsize */
4430 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
4431 0, /* tp_print */
4432 0, /* tp_getattr */
4433 0, /* tp_setattr */
4434 &awaitType_as_async, /* tp_as_async */
4435 0, /* tp_repr */
4436 0, /* tp_as_number */
4437 0, /* tp_as_sequence */
4438 0, /* tp_as_mapping */
4439 0, /* tp_hash */
4440 0, /* tp_call */
4441 0, /* tp_str */
4442 PyObject_GenericGetAttr, /* tp_getattro */
4443 PyObject_GenericSetAttr, /* tp_setattro */
4444 0, /* tp_as_buffer */
4445 0, /* tp_flags */
4446 "C level type with tp_as_async",
4447 0, /* traverseproc tp_traverse */
4448 0, /* tp_clear */
4449 0, /* tp_richcompare */
4450 0, /* tp_weaklistoffset */
4451 0, /* tp_iter */
4452 0, /* tp_iternext */
4453 0, /* tp_methods */
4454 0, /* tp_members */
4455 0,
4456 0,
4457 0,
4458 0,
4459 0,
4460 0,
4461 0,
4462 0,
4463 awaitObject_new, /* tp_new */
4464 PyObject_Del, /* tp_free */
4465};
4466
4467
Martin v. Löwis1a214512008-06-11 05:26:20 +00004468static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004469 PyModuleDef_HEAD_INIT,
4470 "_testcapi",
4471 NULL,
4472 -1,
4473 TestMethods,
4474 NULL,
4475 NULL,
4476 NULL,
4477 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004478};
4479
Nick Coghland5cacbb2015-05-23 22:24:10 +10004480/* Per PEP 489, this module will not be converted to multi-phase initialization
4481 */
4482
Mark Hammond62b1ab12002-07-23 06:31:15 +00004483PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004484PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00004485{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004486 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004488 m = PyModule_Create(&_testcapimodule);
4489 if (m == NULL)
4490 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004492 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00004493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004494 Py_TYPE(&test_structmembersType)=&PyType_Type;
4495 Py_INCREF(&test_structmembersType);
4496 /* don't use a name starting with "test", since we don't want
4497 test_capi to automatically call this */
4498 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004499 if (PyType_Ready(&matmulType) < 0)
4500 return NULL;
4501 Py_INCREF(&matmulType);
4502 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004503
Yury Selivanov75445082015-05-11 22:57:16 -04004504 if (PyType_Ready(&awaitType) < 0)
4505 return NULL;
4506 Py_INCREF(&awaitType);
4507 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
4508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004509 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
4510 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
4511 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
4512 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
4513 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
4514 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
4515 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
4516 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
4517 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
4518 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
4519 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
4520 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
4521 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
4522 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
4523 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
4524 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
4525 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
4526 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
4527 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
4528 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
4529 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
4530 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02004531 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004532 Py_INCREF(&PyInstanceMethod_Type);
4533 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00004534
Larry Hastings2a727912014-01-16 11:32:01 -08004535 PyModule_AddIntConstant(m, "the_number_three", 3);
4536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004537 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
4538 Py_INCREF(TestError);
4539 PyModule_AddObject(m, "error", TestError);
4540 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004541}