blob: 060a92da4b0397d2e203cb5c5eab9ae4871cd81a [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);
Tim Peters9ea17ac2001-02-02 05:57:15 +000063#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 CHECK_SIZEOF(SIZEOF_LONG_LONG, PY_LONG_LONG);
Tim Peters9ea17ac2001-02-02 05:57:15 +000065#endif
66
67#undef CHECK_SIZEOF
68
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000069 Py_INCREF(Py_None);
70 return Py_None;
Tim Peters9ea17ac2001-02-02 05:57:15 +000071}
72
Tim Peters5c4d5bf2001-02-12 22:13:26 +000073static PyObject*
Victor Stinner01076552013-10-29 19:39:52 +010074test_sizeof_c_types(PyObject *self)
75{
Ned Deilye37a1942015-03-05 15:47:10 -080076#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020077#pragma GCC diagnostic push
78#pragma GCC diagnostic ignored "-Wtype-limits"
79#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010080#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010081 if (EXPECTED != sizeof(TYPE)) { \
82 PyErr_Format(TestError, \
83 "sizeof(%s) = %u instead of %u", \
84 #TYPE, sizeof(TYPE), EXPECTED); \
85 return (PyObject*)NULL; \
86 }
Victor Stinnerf866f972013-10-29 19:59:31 +010087#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
88#define CHECK_SIGNNESS(TYPE, SIGNED) \
89 if (IS_SIGNED(TYPE) != SIGNED) { \
90 PyErr_Format(TestError, \
91 "%s signness is, instead of %i", \
92 #TYPE, IS_SIGNED(TYPE), SIGNED); \
93 return (PyObject*)NULL; \
94 }
Victor Stinner01076552013-10-29 19:39:52 +010095
96 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +010097 CHECK_SIZEOF(Py_UCS1, 1);
98 CHECK_SIZEOF(Py_UCS2, 2);
99 CHECK_SIZEOF(Py_UCS4, 4);
100 CHECK_SIGNNESS(Py_UCS1, 0);
101 CHECK_SIGNNESS(Py_UCS2, 0);
102 CHECK_SIGNNESS(Py_UCS4, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100103#ifdef HAVE_INT32_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100104 CHECK_SIZEOF(PY_INT32_T, 4);
105 CHECK_SIGNNESS(PY_INT32_T, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100106#endif
107#ifdef HAVE_UINT32_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100108 CHECK_SIZEOF(PY_UINT32_T, 4);
109 CHECK_SIGNNESS(PY_UINT32_T, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100110#endif
111#ifdef HAVE_INT64_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100112 CHECK_SIZEOF(PY_INT64_T, 8);
113 CHECK_SIGNNESS(PY_INT64_T, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100114#endif
115#ifdef HAVE_UINT64_T
Victor Stinnerf866f972013-10-29 19:59:31 +0100116 CHECK_SIZEOF(PY_UINT64_T, 8);
117 CHECK_SIGNNESS(PY_UINT64_T, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100118#endif
119
120 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100121 CHECK_SIZEOF(size_t, sizeof(void *));
122 CHECK_SIGNNESS(size_t, 0);
123 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
124 CHECK_SIGNNESS(Py_ssize_t, 1);
125
126 CHECK_SIZEOF(Py_uintptr_t, sizeof(void *));
127 CHECK_SIGNNESS(Py_uintptr_t, 0);
128 CHECK_SIZEOF(Py_intptr_t, sizeof(void *));
129 CHECK_SIGNNESS(Py_intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100130
131 Py_INCREF(Py_None);
132 return Py_None;
133
Victor Stinnerf866f972013-10-29 19:59:31 +0100134#undef IS_SIGNED
135#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100136#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800137#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200138#pragma GCC diagnostic pop
139#endif
Victor Stinner01076552013-10-29 19:39:52 +0100140}
141
142
143static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000144test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 PyObject* list;
147 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000150#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 list = PyList_New(NLIST);
152 if (list == (PyObject*)NULL)
153 return (PyObject*)NULL;
154 /* list = range(NLIST) */
155 for (i = 0; i < NLIST; ++i) {
156 PyObject* anint = PyLong_FromLong(i);
157 if (anint == (PyObject*)NULL) {
158 Py_DECREF(list);
159 return (PyObject*)NULL;
160 }
161 PyList_SET_ITEM(list, i, anint);
162 }
163 /* list.reverse(), via PyList_Reverse() */
164 i = PyList_Reverse(list); /* should not blow up! */
165 if (i != 0) {
166 Py_DECREF(list);
167 return (PyObject*)NULL;
168 }
169 /* Check that list == range(29, -1, -1) now */
170 for (i = 0; i < NLIST; ++i) {
171 PyObject* anint = PyList_GET_ITEM(list, i);
172 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
173 PyErr_SetString(TestError,
174 "test_list_api: reverse screwed up");
175 Py_DECREF(list);
176 return (PyObject*)NULL;
177 }
178 }
179 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000180#undef NLIST
181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 Py_INCREF(Py_None);
183 return Py_None;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000184}
185
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000186static int
187test_dict_inner(int count)
188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 Py_ssize_t pos = 0, iterations = 0;
190 int i;
191 PyObject *dict = PyDict_New();
192 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 if (dict == NULL)
195 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 for (i = 0; i < count; i++) {
198 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200199 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200200 return -1;
201 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200202 if (PyDict_SetItem(dict, v, v) < 0) {
203 Py_DECREF(v);
204 return -1;
205 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 Py_DECREF(v);
207 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 while (PyDict_Next(dict, &pos, &k, &v)) {
210 PyObject *o;
211 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 i = PyLong_AS_LONG(v) + 1;
214 o = PyLong_FromLong(i);
215 if (o == NULL)
216 return -1;
217 if (PyDict_SetItem(dict, k, o) < 0) {
218 Py_DECREF(o);
219 return -1;
220 }
221 Py_DECREF(o);
222 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 if (iterations != count) {
227 PyErr_SetString(
228 TestError,
229 "test_dict_iteration: dict iteration went wrong ");
230 return -1;
231 } else {
232 return 0;
233 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000234}
235
236static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000237test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 for (i = 0; i < 200; i++) {
242 if (test_dict_inner(i) < 0) {
243 return NULL;
244 }
245 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 Py_INCREF(Py_None);
248 return Py_None;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000249}
250
Tim Peters91621db2001-06-12 20:10:01 +0000251
INADA Naoki6165d552016-12-20 09:54:24 +0900252static PyObject*
253dict_hassplittable(PyObject *self, PyObject *arg)
254{
255 if (!PyArg_Parse(arg, "O!:dict_hassplittable", &PyDict_Type, &arg)) {
256 return NULL;
257 }
258 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
259}
260
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000261/* Issue #4701: Check that PyObject_Hash implicitly calls
262 * PyType_Ready if it hasn't already been called
263 */
264static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 PyVarObject_HEAD_INIT(NULL, 0)
266 "hashinheritancetester", /* Name of this type */
267 sizeof(PyObject), /* Basic object size */
268 0, /* Item size for varobject */
269 (destructor)PyObject_Del, /* tp_dealloc */
270 0, /* tp_print */
271 0, /* tp_getattr */
272 0, /* tp_setattr */
273 0, /* tp_reserved */
274 0, /* tp_repr */
275 0, /* tp_as_number */
276 0, /* tp_as_sequence */
277 0, /* tp_as_mapping */
278 0, /* tp_hash */
279 0, /* tp_call */
280 0, /* tp_str */
281 PyObject_GenericGetAttr, /* tp_getattro */
282 0, /* tp_setattro */
283 0, /* tp_as_buffer */
284 Py_TPFLAGS_DEFAULT, /* tp_flags */
285 0, /* tp_doc */
286 0, /* tp_traverse */
287 0, /* tp_clear */
288 0, /* tp_richcompare */
289 0, /* tp_weaklistoffset */
290 0, /* tp_iter */
291 0, /* tp_iternext */
292 0, /* tp_methods */
293 0, /* tp_members */
294 0, /* tp_getset */
295 0, /* tp_base */
296 0, /* tp_dict */
297 0, /* tp_descr_get */
298 0, /* tp_descr_set */
299 0, /* tp_dictoffset */
300 0, /* tp_init */
301 0, /* tp_alloc */
302 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000303};
304
305static PyObject*
306test_lazy_hash_inheritance(PyObject* self)
307{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 PyTypeObject *type;
309 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000310 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 if (type->tp_dict != NULL)
315 /* The type has already been initialized. This probably means
316 -R is being used. */
317 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000318
319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 obj = PyObject_New(PyObject, type);
321 if (obj == NULL) {
322 PyErr_Clear();
323 PyErr_SetString(
324 TestError,
325 "test_lazy_hash_inheritance: failed to create object");
326 return NULL;
327 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 if (type->tp_dict != NULL) {
330 PyErr_SetString(
331 TestError,
332 "test_lazy_hash_inheritance: type initialised too soon");
333 Py_DECREF(obj);
334 return NULL;
335 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 hash = PyObject_Hash(obj);
338 if ((hash == -1) && PyErr_Occurred()) {
339 PyErr_Clear();
340 PyErr_SetString(
341 TestError,
342 "test_lazy_hash_inheritance: could not hash object");
343 Py_DECREF(obj);
344 return NULL;
345 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 if (type->tp_dict == NULL) {
348 PyErr_SetString(
349 TestError,
350 "test_lazy_hash_inheritance: type not initialised by hash()");
351 Py_DECREF(obj);
352 return NULL;
353 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 if (type->tp_hash != PyType_Type.tp_hash) {
356 PyErr_SetString(
357 TestError,
358 "test_lazy_hash_inheritance: unexpected hash function");
359 Py_DECREF(obj);
360 return NULL;
361 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000366}
367
368
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000369/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
Tim Petersff70d3c2001-06-14 01:11:03 +0000370 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000371
372 Note that the meat of the test is contained in testcapi_long.h.
373 This is revolting, but delicate code duplication is worse: "almost
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000374 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000375 dependence on type names makes it impossible to use a parameterized
376 function. A giant macro would be even worse than this. A C++ template
377 would be perfect.
378
379 The "report an error" functions are deliberately not part of the #include
380 file: if the test fails, you can set a breakpoint in the appropriate
381 error function directly, and crawl back from there in the debugger.
382*/
383
384#define UNBIND(X) Py_DECREF(X); (X) = NULL
385
386static PyObject *
387raise_test_long_error(const char* msg)
388{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000390}
391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392#define TESTNAME test_long_api_inner
393#define TYPENAME long
394#define F_S_TO_PY PyLong_FromLong
395#define F_PY_TO_S PyLong_AsLong
396#define F_U_TO_PY PyLong_FromUnsignedLong
397#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000398
399#include "testcapi_long.h"
400
401static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000402test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000405}
406
407#undef TESTNAME
408#undef TYPENAME
409#undef F_S_TO_PY
410#undef F_PY_TO_S
411#undef F_U_TO_PY
412#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000413
414#ifdef HAVE_LONG_LONG
Tim Peters91621db2001-06-12 20:10:01 +0000415
416static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000417raise_test_longlong_error(const char* msg)
418{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000420}
421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422#define TESTNAME test_longlong_api_inner
423#define TYPENAME PY_LONG_LONG
424#define F_S_TO_PY PyLong_FromLongLong
425#define F_PY_TO_S PyLong_AsLongLong
426#define F_U_TO_PY PyLong_FromUnsignedLongLong
427#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000428
429#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000430
431static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000432test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000433{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000435}
436
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000437#undef TESTNAME
438#undef TYPENAME
439#undef F_S_TO_PY
440#undef F_PY_TO_S
441#undef F_U_TO_PY
442#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000443
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000444/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
445 is tested by test_long_api_inner. This test will concentrate on proper
446 handling of overflow.
447*/
448
449static PyObject *
450test_long_and_overflow(PyObject *self)
451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 PyObject *num, *one, *temp;
453 long value;
454 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 /* Test that overflow is set properly for a large value. */
457 /* num is a number larger than LONG_MAX even on 64-bit platforms */
458 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
459 if (num == NULL)
460 return NULL;
461 overflow = 1234;
462 value = PyLong_AsLongAndOverflow(num, &overflow);
463 Py_DECREF(num);
464 if (value == -1 && PyErr_Occurred())
465 return NULL;
466 if (value != -1)
467 return raiseTestError("test_long_and_overflow",
468 "return value was not set to -1");
469 if (overflow != 1)
470 return raiseTestError("test_long_and_overflow",
471 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 /* Same again, with num = LONG_MAX + 1 */
474 num = PyLong_FromLong(LONG_MAX);
475 if (num == NULL)
476 return NULL;
477 one = PyLong_FromLong(1L);
478 if (one == NULL) {
479 Py_DECREF(num);
480 return NULL;
481 }
482 temp = PyNumber_Add(num, one);
483 Py_DECREF(one);
484 Py_DECREF(num);
485 num = temp;
486 if (num == NULL)
487 return NULL;
488 overflow = 0;
489 value = PyLong_AsLongAndOverflow(num, &overflow);
490 Py_DECREF(num);
491 if (value == -1 && PyErr_Occurred())
492 return NULL;
493 if (value != -1)
494 return raiseTestError("test_long_and_overflow",
495 "return value was not set to -1");
496 if (overflow != 1)
497 return raiseTestError("test_long_and_overflow",
498 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 /* Test that overflow is set properly for a large negative value. */
501 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
502 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
503 if (num == NULL)
504 return NULL;
505 overflow = 1234;
506 value = PyLong_AsLongAndOverflow(num, &overflow);
507 Py_DECREF(num);
508 if (value == -1 && PyErr_Occurred())
509 return NULL;
510 if (value != -1)
511 return raiseTestError("test_long_and_overflow",
512 "return value was not set to -1");
513 if (overflow != -1)
514 return raiseTestError("test_long_and_overflow",
515 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 /* Same again, with num = LONG_MIN - 1 */
518 num = PyLong_FromLong(LONG_MIN);
519 if (num == NULL)
520 return NULL;
521 one = PyLong_FromLong(1L);
522 if (one == NULL) {
523 Py_DECREF(num);
524 return NULL;
525 }
526 temp = PyNumber_Subtract(num, one);
527 Py_DECREF(one);
528 Py_DECREF(num);
529 num = temp;
530 if (num == NULL)
531 return NULL;
532 overflow = 0;
533 value = PyLong_AsLongAndOverflow(num, &overflow);
534 Py_DECREF(num);
535 if (value == -1 && PyErr_Occurred())
536 return NULL;
537 if (value != -1)
538 return raiseTestError("test_long_and_overflow",
539 "return value was not set to -1");
540 if (overflow != -1)
541 return raiseTestError("test_long_and_overflow",
542 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 /* Test that overflow is cleared properly for small values. */
545 num = PyLong_FromString("FF", NULL, 16);
546 if (num == NULL)
547 return NULL;
548 overflow = 1234;
549 value = PyLong_AsLongAndOverflow(num, &overflow);
550 Py_DECREF(num);
551 if (value == -1 && PyErr_Occurred())
552 return NULL;
553 if (value != 0xFF)
554 return raiseTestError("test_long_and_overflow",
555 "expected return value 0xFF");
556 if (overflow != 0)
557 return raiseTestError("test_long_and_overflow",
558 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 num = PyLong_FromString("-FF", NULL, 16);
561 if (num == NULL)
562 return NULL;
563 overflow = 0;
564 value = PyLong_AsLongAndOverflow(num, &overflow);
565 Py_DECREF(num);
566 if (value == -1 && PyErr_Occurred())
567 return NULL;
568 if (value != -0xFF)
569 return raiseTestError("test_long_and_overflow",
570 "expected return value 0xFF");
571 if (overflow != 0)
572 return raiseTestError("test_long_and_overflow",
573 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 num = PyLong_FromLong(LONG_MAX);
576 if (num == NULL)
577 return NULL;
578 overflow = 1234;
579 value = PyLong_AsLongAndOverflow(num, &overflow);
580 Py_DECREF(num);
581 if (value == -1 && PyErr_Occurred())
582 return NULL;
583 if (value != LONG_MAX)
584 return raiseTestError("test_long_and_overflow",
585 "expected return value LONG_MAX");
586 if (overflow != 0)
587 return raiseTestError("test_long_and_overflow",
588 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 num = PyLong_FromLong(LONG_MIN);
591 if (num == NULL)
592 return NULL;
593 overflow = 0;
594 value = PyLong_AsLongAndOverflow(num, &overflow);
595 Py_DECREF(num);
596 if (value == -1 && PyErr_Occurred())
597 return NULL;
598 if (value != LONG_MIN)
599 return raiseTestError("test_long_and_overflow",
600 "expected return value LONG_MIN");
601 if (overflow != 0)
602 return raiseTestError("test_long_and_overflow",
603 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 Py_INCREF(Py_None);
606 return Py_None;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000607}
608
Mark Dickinson93f562c2010-01-30 10:30:15 +0000609/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
610 PY_LONG_LONG is tested by test_long_api_inner. This test will
611 concentrate on proper handling of overflow.
612*/
613
614static PyObject *
615test_long_long_and_overflow(PyObject *self)
616{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 PyObject *num, *one, *temp;
618 PY_LONG_LONG value;
619 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 /* Test that overflow is set properly for a large value. */
622 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
623 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
624 if (num == NULL)
625 return NULL;
626 overflow = 1234;
627 value = PyLong_AsLongLongAndOverflow(num, &overflow);
628 Py_DECREF(num);
629 if (value == -1 && PyErr_Occurred())
630 return NULL;
631 if (value != -1)
632 return raiseTestError("test_long_long_and_overflow",
633 "return value was not set to -1");
634 if (overflow != 1)
635 return raiseTestError("test_long_long_and_overflow",
636 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 /* Same again, with num = PY_LLONG_MAX + 1 */
639 num = PyLong_FromLongLong(PY_LLONG_MAX);
640 if (num == NULL)
641 return NULL;
642 one = PyLong_FromLong(1L);
643 if (one == NULL) {
644 Py_DECREF(num);
645 return NULL;
646 }
647 temp = PyNumber_Add(num, one);
648 Py_DECREF(one);
649 Py_DECREF(num);
650 num = temp;
651 if (num == NULL)
652 return NULL;
653 overflow = 0;
654 value = PyLong_AsLongLongAndOverflow(num, &overflow);
655 Py_DECREF(num);
656 if (value == -1 && PyErr_Occurred())
657 return NULL;
658 if (value != -1)
659 return raiseTestError("test_long_long_and_overflow",
660 "return value was not set to -1");
661 if (overflow != 1)
662 return raiseTestError("test_long_long_and_overflow",
663 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 /* Test that overflow is set properly for a large negative value. */
666 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
667 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
668 if (num == NULL)
669 return NULL;
670 overflow = 1234;
671 value = PyLong_AsLongLongAndOverflow(num, &overflow);
672 Py_DECREF(num);
673 if (value == -1 && PyErr_Occurred())
674 return NULL;
675 if (value != -1)
676 return raiseTestError("test_long_long_and_overflow",
677 "return value was not set to -1");
678 if (overflow != -1)
679 return raiseTestError("test_long_long_and_overflow",
680 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 /* Same again, with num = PY_LLONG_MIN - 1 */
683 num = PyLong_FromLongLong(PY_LLONG_MIN);
684 if (num == NULL)
685 return NULL;
686 one = PyLong_FromLong(1L);
687 if (one == NULL) {
688 Py_DECREF(num);
689 return NULL;
690 }
691 temp = PyNumber_Subtract(num, one);
692 Py_DECREF(one);
693 Py_DECREF(num);
694 num = temp;
695 if (num == NULL)
696 return NULL;
697 overflow = 0;
698 value = PyLong_AsLongLongAndOverflow(num, &overflow);
699 Py_DECREF(num);
700 if (value == -1 && PyErr_Occurred())
701 return NULL;
702 if (value != -1)
703 return raiseTestError("test_long_long_and_overflow",
704 "return value was not set to -1");
705 if (overflow != -1)
706 return raiseTestError("test_long_long_and_overflow",
707 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 /* Test that overflow is cleared properly for small values. */
710 num = PyLong_FromString("FF", NULL, 16);
711 if (num == NULL)
712 return NULL;
713 overflow = 1234;
714 value = PyLong_AsLongLongAndOverflow(num, &overflow);
715 Py_DECREF(num);
716 if (value == -1 && PyErr_Occurred())
717 return NULL;
718 if (value != 0xFF)
719 return raiseTestError("test_long_long_and_overflow",
720 "expected return value 0xFF");
721 if (overflow != 0)
722 return raiseTestError("test_long_long_and_overflow",
723 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 num = PyLong_FromString("-FF", NULL, 16);
726 if (num == NULL)
727 return NULL;
728 overflow = 0;
729 value = PyLong_AsLongLongAndOverflow(num, &overflow);
730 Py_DECREF(num);
731 if (value == -1 && PyErr_Occurred())
732 return NULL;
733 if (value != -0xFF)
734 return raiseTestError("test_long_long_and_overflow",
735 "expected return value 0xFF");
736 if (overflow != 0)
737 return raiseTestError("test_long_long_and_overflow",
738 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 num = PyLong_FromLongLong(PY_LLONG_MAX);
741 if (num == NULL)
742 return NULL;
743 overflow = 1234;
744 value = PyLong_AsLongLongAndOverflow(num, &overflow);
745 Py_DECREF(num);
746 if (value == -1 && PyErr_Occurred())
747 return NULL;
748 if (value != PY_LLONG_MAX)
749 return raiseTestError("test_long_long_and_overflow",
750 "expected return value PY_LLONG_MAX");
751 if (overflow != 0)
752 return raiseTestError("test_long_long_and_overflow",
753 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 num = PyLong_FromLongLong(PY_LLONG_MIN);
756 if (num == NULL)
757 return NULL;
758 overflow = 0;
759 value = PyLong_AsLongLongAndOverflow(num, &overflow);
760 Py_DECREF(num);
761 if (value == -1 && PyErr_Occurred())
762 return NULL;
763 if (value != PY_LLONG_MIN)
764 return raiseTestError("test_long_long_and_overflow",
765 "expected return value PY_LLONG_MIN");
766 if (overflow != 0)
767 return raiseTestError("test_long_long_and_overflow",
768 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 Py_INCREF(Py_None);
771 return Py_None;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000772}
773
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200774/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
775 non-integer arguments are handled correctly. It should be extended to
776 test overflow handling.
777 */
778
779static PyObject *
780test_long_as_size_t(PyObject *self)
781{
782 size_t out_u;
783 Py_ssize_t out_s;
784
785 Py_INCREF(Py_None);
786
787 out_u = PyLong_AsSize_t(Py_None);
788 if (out_u != (size_t)-1 || !PyErr_Occurred())
789 return raiseTestError("test_long_as_size_t",
790 "PyLong_AsSize_t(None) didn't complain");
791 if (!PyErr_ExceptionMatches(PyExc_TypeError))
792 return raiseTestError("test_long_as_size_t",
793 "PyLong_AsSize_t(None) raised "
794 "something other than TypeError");
795 PyErr_Clear();
796
797 out_s = PyLong_AsSsize_t(Py_None);
798 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
799 return raiseTestError("test_long_as_size_t",
800 "PyLong_AsSsize_t(None) didn't complain");
801 if (!PyErr_ExceptionMatches(PyExc_TypeError))
802 return raiseTestError("test_long_as_size_t",
803 "PyLong_AsSsize_t(None) raised "
804 "something other than TypeError");
805 PyErr_Clear();
806
807 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
808 return Py_None;
809}
810
811/* Test the PyLong_AsDouble API. At present this just tests that
812 non-integer arguments are handled correctly.
813 */
814
815static PyObject *
816test_long_as_double(PyObject *self)
817{
818 double out;
819
820 Py_INCREF(Py_None);
821
822 out = PyLong_AsDouble(Py_None);
823 if (out != -1.0 || !PyErr_Occurred())
824 return raiseTestError("test_long_as_double",
825 "PyLong_AsDouble(None) didn't complain");
826 if (!PyErr_ExceptionMatches(PyExc_TypeError))
827 return raiseTestError("test_long_as_double",
828 "PyLong_AsDouble(None) raised "
829 "something other than TypeError");
830 PyErr_Clear();
831
832 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
833 return Py_None;
834}
835
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000836/* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
Tim Petersd38b1c72001-09-30 05:09:37 +0000837 for both long and int arguments. The test may leak a little memory if
838 it fails.
839*/
840static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000841test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000842{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 PyObject *tuple, *num;
844 PY_LONG_LONG value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 tuple = PyTuple_New(1);
847 if (tuple == NULL)
848 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 num = PyLong_FromLong(42);
851 if (num == NULL)
852 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 value = -1;
857 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
858 return NULL;
859 if (value != 42)
860 return raiseTestError("test_L_code",
861 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 Py_DECREF(num);
864 num = PyLong_FromLong(42);
865 if (num == NULL)
866 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 value = -1;
871 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
872 return NULL;
873 if (value != 42)
874 return raiseTestError("test_L_code",
875 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 Py_DECREF(tuple);
878 Py_INCREF(Py_None);
879 return Py_None;
Tim Petersd38b1c72001-09-30 05:09:37 +0000880}
881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882#endif /* ifdef HAVE_LONG_LONG */
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000883
Serhiy Storchakaacef5de2016-05-16 09:55:32 +0300884static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300885return_none(void *unused)
886{
887 Py_RETURN_NONE;
888}
889
890static PyObject *
891raise_error(void *unused)
892{
893 PyErr_SetNone(PyExc_ValueError);
894 return NULL;
895}
896
897static int
898test_buildvalue_N_error(const char *fmt)
899{
900 PyObject *arg, *res;
901
902 arg = PyList_New(0);
903 if (arg == NULL) {
904 return -1;
905 }
906
907 Py_INCREF(arg);
908 res = Py_BuildValue(fmt, return_none, NULL, arg);
909 if (res == NULL) {
910 return -1;
911 }
912 Py_DECREF(res);
913 if (Py_REFCNT(arg) != 1) {
914 PyErr_Format(TestError, "test_buildvalue_N: "
915 "arg was not decrefed in successful "
916 "Py_BuildValue(\"%s\")", fmt);
917 return -1;
918 }
919
920 Py_INCREF(arg);
921 res = Py_BuildValue(fmt, raise_error, NULL, arg);
922 if (res != NULL || !PyErr_Occurred()) {
923 PyErr_Format(TestError, "test_buildvalue_N: "
924 "Py_BuildValue(\"%s\") didn't complain", fmt);
925 return -1;
926 }
927 PyErr_Clear();
928 if (Py_REFCNT(arg) != 1) {
929 PyErr_Format(TestError, "test_buildvalue_N: "
930 "arg was not decrefed in failed "
931 "Py_BuildValue(\"%s\")", fmt);
932 return -1;
933 }
934 Py_DECREF(arg);
935 return 0;
936}
937
938static PyObject *
939test_buildvalue_N(PyObject *self, PyObject *noargs)
940{
941 PyObject *arg, *res;
942
943 arg = PyList_New(0);
944 if (arg == NULL) {
945 return NULL;
946 }
947 Py_INCREF(arg);
948 res = Py_BuildValue("N", arg);
949 if (res == NULL) {
950 return NULL;
951 }
952 if (res != arg) {
953 return raiseTestError("test_buildvalue_N",
954 "Py_BuildValue(\"N\") returned wrong result");
955 }
956 if (Py_REFCNT(arg) != 2) {
957 return raiseTestError("test_buildvalue_N",
958 "arg was not decrefed in Py_BuildValue(\"N\")");
959 }
960 Py_DECREF(res);
961 Py_DECREF(arg);
962
963 if (test_buildvalue_N_error("O&N") < 0)
964 return NULL;
965 if (test_buildvalue_N_error("(O&N)") < 0)
966 return NULL;
967 if (test_buildvalue_N_error("[O&N]") < 0)
968 return NULL;
969 if (test_buildvalue_N_error("{O&N}") < 0)
970 return NULL;
971 if (test_buildvalue_N_error("{()O&(())N}") < 0)
972 return NULL;
973
974 Py_RETURN_NONE;
975}
976
977
978static PyObject *
Serhiy Storchakaacef5de2016-05-16 09:55:32 +0300979get_args(PyObject *self, PyObject *args)
980{
981 if (args == NULL) {
982 args = Py_None;
983 }
984 Py_INCREF(args);
985 return args;
986}
987
988static PyObject *
989get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
990{
991 if (kwargs == NULL) {
992 kwargs = Py_None;
993 }
994 Py_INCREF(kwargs);
995 return kwargs;
996}
997
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000998/* Test tuple argument processing */
999static PyObject *
1000getargs_tuple(PyObject *self, PyObject *args)
1001{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 int a, b, c;
1003 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1004 return NULL;
1005 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001006}
1007
Christian Heimes380f7f22008-02-28 11:19:05 +00001008/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001009static PyObject *
1010getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
1013 static char *fmt="(ii)i|(i(ii))(iii)i";
1014 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1017 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1018 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1019 return NULL;
1020 return Py_BuildValue("iiiiiiiiii",
1021 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1022 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001023}
1024
Larry Hastings83a9f482012-03-20 20:06:16 +00001025/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1026static PyObject *
1027getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1028{
1029 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1030 int required = -1;
1031 int optional = -1;
1032 int keyword_only = -1;
1033
1034 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1035 &required, &optional, &keyword_only))
1036 return NULL;
1037 return Py_BuildValue("iii", required, optional, keyword_only);
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 +00001133#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +00001134static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001135getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 PY_LONG_LONG value;
1138 if (!PyArg_ParseTuple(args, "L", &value))
1139 return NULL;
1140 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001141}
1142
Thomas Hellera4ea6032003-04-17 18:55:45 +00001143static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001144getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 unsigned PY_LONG_LONG value;
1147 if (!PyArg_ParseTuple(args, "K", &value))
1148 return NULL;
1149 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001150}
1151#endif
1152
1153/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +00001154 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001155static PyObject *
1156test_k_code(PyObject *self)
1157{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 PyObject *tuple, *num;
1159 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 tuple = PyTuple_New(1);
1162 if (tuple == NULL)
1163 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 /* a number larger than ULONG_MAX even on 64-bit platforms */
1166 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1167 if (num == NULL)
1168 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 value = PyLong_AsUnsignedLongMask(num);
1171 if (value != ULONG_MAX)
1172 return raiseTestError("test_k_code",
1173 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 value = 0;
1178 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1179 return NULL;
1180 if (value != ULONG_MAX)
1181 return raiseTestError("test_k_code",
1182 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 Py_DECREF(num);
1185 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1186 if (num == NULL)
1187 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 value = PyLong_AsUnsignedLongMask(num);
1190 if (value != (unsigned long)-0x42)
1191 return raiseTestError("test_k_code",
1192 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 value = 0;
1197 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1198 return NULL;
1199 if (value != (unsigned long)-0x42)
1200 return raiseTestError("test_k_code",
1201 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 Py_DECREF(tuple);
1204 Py_INCREF(Py_None);
1205 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001206}
1207
Victor Stinner06e49dd2010-06-13 18:21:50 +00001208static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001209getargs_f(PyObject *self, PyObject *args)
1210{
1211 float f;
1212 if (!PyArg_ParseTuple(args, "f", &f))
1213 return NULL;
1214 return PyFloat_FromDouble(f);
1215}
1216
1217static PyObject *
1218getargs_d(PyObject *self, PyObject *args)
1219{
1220 double d;
1221 if (!PyArg_ParseTuple(args, "d", &d))
1222 return NULL;
1223 return PyFloat_FromDouble(d);
1224}
1225
1226static PyObject *
1227getargs_D(PyObject *self, PyObject *args)
1228{
1229 Py_complex cval;
1230 if (!PyArg_ParseTuple(args, "D", &cval))
1231 return NULL;
1232 return PyComplex_FromCComplex(cval);
1233}
1234
1235static PyObject *
1236getargs_S(PyObject *self, PyObject *args)
1237{
1238 PyObject *obj;
1239 if (!PyArg_ParseTuple(args, "S", &obj))
1240 return NULL;
1241 Py_INCREF(obj);
1242 return obj;
1243}
1244
1245static PyObject *
1246getargs_Y(PyObject *self, PyObject *args)
1247{
1248 PyObject *obj;
1249 if (!PyArg_ParseTuple(args, "Y", &obj))
1250 return NULL;
1251 Py_INCREF(obj);
1252 return obj;
1253}
1254
1255static PyObject *
1256getargs_U(PyObject *self, PyObject *args)
1257{
1258 PyObject *obj;
1259 if (!PyArg_ParseTuple(args, "U", &obj))
1260 return NULL;
1261 Py_INCREF(obj);
1262 return obj;
1263}
1264
1265static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001266getargs_c(PyObject *self, PyObject *args)
1267{
1268 char c;
1269 if (!PyArg_ParseTuple(args, "c", &c))
1270 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001271 return PyLong_FromLong((unsigned char)c);
1272}
1273
1274static PyObject *
1275getargs_C(PyObject *self, PyObject *args)
1276{
1277 int c;
1278 if (!PyArg_ParseTuple(args, "C", &c))
1279 return NULL;
1280 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001281}
1282
1283static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001284getargs_s(PyObject *self, PyObject *args)
1285{
1286 char *str;
1287 if (!PyArg_ParseTuple(args, "s", &str))
1288 return NULL;
1289 return PyBytes_FromString(str);
1290}
1291
1292static PyObject *
1293getargs_s_star(PyObject *self, PyObject *args)
1294{
1295 Py_buffer buffer;
1296 PyObject *bytes;
1297 if (!PyArg_ParseTuple(args, "s*", &buffer))
1298 return NULL;
1299 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1300 PyBuffer_Release(&buffer);
1301 return bytes;
1302}
1303
1304static PyObject *
1305getargs_s_hash(PyObject *self, PyObject *args)
1306{
1307 char *str;
1308 Py_ssize_t size;
1309 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1310 return NULL;
1311 return PyBytes_FromStringAndSize(str, size);
1312}
1313
1314static PyObject *
1315getargs_z(PyObject *self, PyObject *args)
1316{
1317 char *str;
1318 if (!PyArg_ParseTuple(args, "z", &str))
1319 return NULL;
1320 if (str != NULL)
1321 return PyBytes_FromString(str);
1322 else
1323 Py_RETURN_NONE;
1324}
1325
1326static PyObject *
1327getargs_z_star(PyObject *self, PyObject *args)
1328{
1329 Py_buffer buffer;
1330 PyObject *bytes;
1331 if (!PyArg_ParseTuple(args, "z*", &buffer))
1332 return NULL;
1333 if (buffer.buf != NULL)
1334 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1335 else {
1336 Py_INCREF(Py_None);
1337 bytes = Py_None;
1338 }
1339 PyBuffer_Release(&buffer);
1340 return bytes;
1341}
1342
1343static PyObject *
1344getargs_z_hash(PyObject *self, PyObject *args)
1345{
1346 char *str;
1347 Py_ssize_t size;
1348 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1349 return NULL;
1350 if (str != NULL)
1351 return PyBytes_FromStringAndSize(str, size);
1352 else
1353 Py_RETURN_NONE;
1354}
1355
1356static PyObject *
1357getargs_y(PyObject *self, PyObject *args)
1358{
1359 char *str;
1360 if (!PyArg_ParseTuple(args, "y", &str))
1361 return NULL;
1362 return PyBytes_FromString(str);
1363}
1364
1365static PyObject *
1366getargs_y_star(PyObject *self, PyObject *args)
1367{
1368 Py_buffer buffer;
1369 PyObject *bytes;
1370 if (!PyArg_ParseTuple(args, "y*", &buffer))
1371 return NULL;
1372 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1373 PyBuffer_Release(&buffer);
1374 return bytes;
1375}
1376
1377static PyObject *
1378getargs_y_hash(PyObject *self, PyObject *args)
1379{
1380 char *str;
1381 Py_ssize_t size;
1382 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1383 return NULL;
1384 return PyBytes_FromStringAndSize(str, size);
1385}
1386
1387static PyObject *
1388getargs_u(PyObject *self, PyObject *args)
1389{
1390 Py_UNICODE *str;
1391 Py_ssize_t size;
1392 if (!PyArg_ParseTuple(args, "u", &str))
1393 return NULL;
1394 size = Py_UNICODE_strlen(str);
1395 return PyUnicode_FromUnicode(str, size);
1396}
1397
1398static PyObject *
1399getargs_u_hash(PyObject *self, PyObject *args)
1400{
1401 Py_UNICODE *str;
1402 Py_ssize_t size;
1403 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1404 return NULL;
1405 return PyUnicode_FromUnicode(str, size);
1406}
1407
1408static PyObject *
1409getargs_Z(PyObject *self, PyObject *args)
1410{
1411 Py_UNICODE *str;
1412 Py_ssize_t size;
1413 if (!PyArg_ParseTuple(args, "Z", &str))
1414 return NULL;
1415 if (str != NULL) {
1416 size = Py_UNICODE_strlen(str);
1417 return PyUnicode_FromUnicode(str, size);
1418 } else
1419 Py_RETURN_NONE;
1420}
1421
1422static PyObject *
1423getargs_Z_hash(PyObject *self, PyObject *args)
1424{
1425 Py_UNICODE *str;
1426 Py_ssize_t size;
1427 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1428 return NULL;
1429 if (str != NULL)
1430 return PyUnicode_FromUnicode(str, size);
1431 else
1432 Py_RETURN_NONE;
1433}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001434
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001435static PyObject *
1436getargs_es(PyObject *self, PyObject *args)
1437{
1438 PyObject *arg, *result;
1439 const char *encoding = NULL;
1440 char *str;
1441
1442 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1443 return NULL;
1444 if (!PyArg_Parse(arg, "es", encoding, &str))
1445 return NULL;
1446 result = PyBytes_FromString(str);
1447 PyMem_Free(str);
1448 return result;
1449}
1450
1451static PyObject *
1452getargs_et(PyObject *self, PyObject *args)
1453{
1454 PyObject *arg, *result;
1455 const char *encoding = NULL;
1456 char *str;
1457
1458 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1459 return NULL;
1460 if (!PyArg_Parse(arg, "et", encoding, &str))
1461 return NULL;
1462 result = PyBytes_FromString(str);
1463 PyMem_Free(str);
1464 return result;
1465}
1466
1467static PyObject *
1468getargs_es_hash(PyObject *self, PyObject *args)
1469{
1470 PyObject *arg, *result;
1471 const char *encoding = NULL;
1472 PyByteArrayObject *buffer = NULL;
1473 char *str = NULL;
1474 Py_ssize_t size;
1475
1476 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1477 return NULL;
1478 if (buffer != NULL) {
1479 str = PyByteArray_AS_STRING(buffer);
1480 size = PyByteArray_GET_SIZE(buffer);
1481 }
1482 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1483 return NULL;
1484 result = PyBytes_FromStringAndSize(str, size);
1485 if (buffer == NULL)
1486 PyMem_Free(str);
1487 return result;
1488}
1489
1490static PyObject *
1491getargs_et_hash(PyObject *self, PyObject *args)
1492{
1493 PyObject *arg, *result;
1494 const char *encoding = NULL;
1495 PyByteArrayObject *buffer = NULL;
1496 char *str = NULL;
1497 Py_ssize_t size;
1498
1499 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1500 return NULL;
1501 if (buffer != NULL) {
1502 str = PyByteArray_AS_STRING(buffer);
1503 size = PyByteArray_GET_SIZE(buffer);
1504 }
1505 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1506 return NULL;
1507 result = PyBytes_FromStringAndSize(str, size);
1508 if (buffer == NULL)
1509 PyMem_Free(str);
1510 return result;
1511}
1512
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001513/* Test the s and z codes for PyArg_ParseTuple.
1514*/
1515static PyObject *
1516test_s_code(PyObject *self)
1517{
1518 /* Unicode strings should be accepted */
1519 PyObject *tuple, *obj;
1520 char *value;
1521
1522 tuple = PyTuple_New(1);
1523 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001525
1526 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001528 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001530
1531 PyTuple_SET_ITEM(tuple, 0, obj);
1532
1533 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001535 */
1536 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001538
1539 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001541
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001542 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001543 Py_RETURN_NONE;
1544}
1545
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001546static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001547parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001548{
Larry Hastings8f904da2012-06-22 03:56:29 -07001549 PyObject *sub_args;
1550 PyObject *sub_kwargs;
1551 char *sub_format;
1552 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001553
Larry Hastings8f904da2012-06-22 03:56:29 -07001554 Py_ssize_t i, size;
1555 char *keywords[8 + 1]; /* space for NULL at end */
1556 PyObject *o;
1557 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001558
Larry Hastings8f904da2012-06-22 03:56:29 -07001559 int result;
1560 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001561
Larry Hastings22701e82012-08-08 14:52:22 -07001562 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001563
Larry Hastings8f904da2012-06-22 03:56:29 -07001564 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1565 &sub_args, &sub_kwargs,
1566 &sub_format, &sub_keywords))
1567 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001568
Larry Hastings8f904da2012-06-22 03:56:29 -07001569 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1570 PyErr_SetString(PyExc_ValueError,
1571 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1572 return NULL;
1573 }
1574
1575 memset(buffers, 0, sizeof(buffers));
1576 memset(converted, 0, sizeof(converted));
1577 memset(keywords, 0, sizeof(keywords));
1578
1579 size = PySequence_Fast_GET_SIZE(sub_keywords);
1580 if (size > 8) {
1581 PyErr_SetString(PyExc_ValueError,
1582 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1583 goto exit;
1584 }
1585
1586 for (i = 0; i < size; i++) {
1587 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1588 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1589 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001590 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001591 goto exit;
1592 }
1593 keywords[i] = PyBytes_AS_STRING(converted[i]);
1594 }
1595
1596 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1597 sub_format, keywords,
1598 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1599 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1600
1601 if (result) {
1602 return_value = Py_None;
1603 Py_INCREF(Py_None);
1604 }
1605
1606exit:
1607 size = sizeof(converted) / sizeof(converted[0]);
1608 for (i = 0; i < size; i++) {
1609 Py_XDECREF(converted[i]);
1610 }
1611 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001612}
1613
Benjamin Peterson92035012008-12-27 16:00:54 +00001614static volatile int x;
1615
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001616/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1617 of an error.
1618*/
1619static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001620test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001621{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 PyObject *tuple, *obj;
1623 Py_UNICODE *value;
1624 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1627 /* Just use the macro and check that it compiles */
1628 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 tuple = PyTuple_New(1);
1631 if (tuple == NULL)
1632 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 obj = PyUnicode_Decode("test", strlen("test"),
1635 "ascii", NULL);
1636 if (obj == NULL)
1637 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 value = 0;
1642 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1643 return NULL;
1644 if (value != PyUnicode_AS_UNICODE(obj))
1645 return raiseTestError("test_u_code",
1646 "u code returned wrong value for u'test'");
1647 value = 0;
1648 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1649 return NULL;
1650 if (value != PyUnicode_AS_UNICODE(obj) ||
1651 len != PyUnicode_GET_SIZE(obj))
1652 return raiseTestError("test_u_code",
1653 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 Py_DECREF(tuple);
1656 Py_INCREF(Py_None);
1657 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001658}
1659
Guido van Rossumfb67be22007-08-29 18:38:11 +00001660/* Test Z and Z# codes for PyArg_ParseTuple */
1661static PyObject *
1662test_Z_code(PyObject *self)
1663{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001665 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 tuple = PyTuple_New(2);
1669 if (tuple == NULL)
1670 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 obj = PyUnicode_FromString("test");
1673 PyTuple_SET_ITEM(tuple, 0, obj);
1674 Py_INCREF(Py_None);
1675 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 /* swap values on purpose */
1678 value1 = NULL;
1679 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 /* Test Z for both values */
1682 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1683 return NULL;
1684 if (value1 != PyUnicode_AS_UNICODE(obj))
1685 return raiseTestError("test_Z_code",
1686 "Z code returned wrong value for 'test'");
1687 if (value2 != NULL)
1688 return raiseTestError("test_Z_code",
1689 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 value1 = NULL;
1692 value2 = PyUnicode_AS_UNICODE(obj);
1693 len1 = -1;
1694 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 /* Test Z# for both values */
1697 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1698 &value2, &len2) < 0)
1699 return NULL;
1700 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1701 len1 != PyUnicode_GET_SIZE(obj))
1702 return raiseTestError("test_Z_code",
1703 "Z# code returned wrong values for 'test'");
1704 if (value2 != NULL ||
1705 len2 != 0)
1706 return raiseTestError("test_Z_code",
1707 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 Py_DECREF(tuple);
1710 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001711}
1712
Thomas Wouters477c8d52006-05-27 19:21:47 +00001713static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001714test_widechar(PyObject *self)
1715{
1716#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1718 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001719 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001720#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1722 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001723#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1727 if (wide == NULL)
1728 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1731 if (utf8 == NULL) {
1732 Py_DECREF(wide);
1733 return NULL;
1734 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001735
Victor Stinner8ef18872011-11-21 02:06:57 +01001736 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 Py_DECREF(wide);
1738 Py_DECREF(utf8);
1739 return raiseTestError("test_widechar",
1740 "wide string and utf8 string "
1741 "have different length");
1742 }
1743 if (PyUnicode_Compare(wide, utf8)) {
1744 Py_DECREF(wide);
1745 Py_DECREF(utf8);
1746 if (PyErr_Occurred())
1747 return NULL;
1748 return raiseTestError("test_widechar",
1749 "wide string and utf8 string "
1750 "are different");
1751 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 Py_DECREF(wide);
1754 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001755
1756#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1757 wide = PyUnicode_FromWideChar(invalid, 1);
1758 if (wide == NULL)
1759 PyErr_Clear();
1760 else
1761 return raiseTestError("test_widechar",
1762 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1763
1764 wide = PyUnicode_FromUnicode(invalid, 1);
1765 if (wide == NULL)
1766 PyErr_Clear();
1767 else
1768 return raiseTestError("test_widechar",
1769 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001770
1771 wide = PyUnicode_FromUnicode(NULL, 1);
1772 if (wide == NULL)
1773 return NULL;
1774 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001775 if (_PyUnicode_Ready(wide) < 0) {
1776 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001777 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001778 }
1779 else {
1780 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001781 return raiseTestError("test_widechar",
1782 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001783 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001784#endif
1785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001787}
1788
1789static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001790unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001791{
1792 PyObject *unicode, *result;
1793 Py_ssize_t buflen, size;
1794 wchar_t *buffer;
1795
1796 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1797 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001798 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001799 if (buffer == NULL)
1800 return PyErr_NoMemory();
1801
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001802 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001803 if (size == -1) {
1804 PyMem_Free(buffer);
1805 return NULL;
1806 }
1807
1808 if (size < buflen)
1809 buflen = size + 1;
1810 else
1811 buflen = size;
1812 result = PyUnicode_FromWideChar(buffer, buflen);
1813 PyMem_Free(buffer);
1814 if (result == NULL)
1815 return NULL;
1816
1817 return Py_BuildValue("(Nn)", result, size);
1818}
1819
1820static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001821unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001822{
1823 PyObject *unicode, *result;
1824 Py_ssize_t size;
1825 wchar_t *buffer;
1826
1827 if (!PyArg_ParseTuple(args, "U", &unicode))
1828 return NULL;
1829
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001830 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001831 if (buffer == NULL)
1832 return NULL;
1833
1834 result = PyUnicode_FromWideChar(buffer, size + 1);
1835 PyMem_Free(buffer);
1836 if (result == NULL)
1837 return NULL;
1838 return Py_BuildValue("(Nn)", result, size);
1839}
1840
1841static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001842unicode_asucs4(PyObject *self, PyObject *args)
1843{
1844 PyObject *unicode, *result;
1845 Py_UCS4 *buffer;
1846 int copy_null;
1847 Py_ssize_t str_len, buf_len;
1848
1849 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1850 return NULL;
1851 }
1852
1853 buf_len = str_len + 1;
1854 buffer = PyMem_NEW(Py_UCS4, buf_len);
1855 if (buffer == NULL) {
1856 return PyErr_NoMemory();
1857 }
1858 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1859 buffer[str_len] = 0xffffU;
1860
1861 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1862 PyMem_FREE(buffer);
1863 return NULL;
1864 }
1865
1866 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1867 PyMem_FREE(buffer);
1868 return result;
1869}
1870
1871static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001872unicode_copycharacters(PyObject *self, PyObject *args)
1873{
1874 PyObject *from, *to, *to_copy;
1875 Py_ssize_t from_start, to_start, how_many, copied;
1876
1877 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1878 &from, &from_start, &how_many)) {
1879 return NULL;
1880 }
1881
1882 if (PyUnicode_READY(to) < 0) {
1883 return NULL;
1884 }
1885
1886 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1887 PyUnicode_MAX_CHAR_VALUE(to)))) {
1888 return NULL;
1889 }
1890 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
1891 Py_DECREF(to_copy);
1892 return NULL;
1893 }
1894
1895 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
1896 from_start, how_many)) < 0) {
1897 Py_DECREF(to_copy);
1898 return NULL;
1899 }
1900
1901 return Py_BuildValue("(Nn)", to_copy, copied);
1902}
1903
1904static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001905unicode_encodedecimal(PyObject *self, PyObject *args)
1906{
1907 Py_UNICODE *unicode;
1908 Py_ssize_t length;
1909 char *errors = NULL;
1910 PyObject *decimal;
1911 Py_ssize_t decimal_length, new_length;
1912 int res;
1913
1914 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1915 return NULL;
1916
1917 decimal_length = length * 7; /* len('&#8364;') */
1918 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1919 if (decimal == NULL)
1920 return NULL;
1921
1922 res = PyUnicode_EncodeDecimal(unicode, length,
1923 PyBytes_AS_STRING(decimal),
1924 errors);
1925 if (res < 0) {
1926 Py_DECREF(decimal);
1927 return NULL;
1928 }
1929
1930 new_length = strlen(PyBytes_AS_STRING(decimal));
1931 assert(new_length <= decimal_length);
1932 res = _PyBytes_Resize(&decimal, new_length);
1933 if (res < 0)
1934 return NULL;
1935
1936 return decimal;
1937}
1938
1939static PyObject *
1940unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1941{
1942 Py_UNICODE *unicode;
1943 Py_ssize_t length;
1944 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1945 return NULL;
1946 return PyUnicode_TransformDecimalToASCII(unicode, length);
1947}
1948
1949static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001950unicode_legacy_string(PyObject *self, PyObject *args)
1951{
1952 Py_UNICODE *data;
1953 Py_ssize_t len;
1954 PyObject *u;
1955
1956 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1957 return NULL;
1958
1959 u = PyUnicode_FromUnicode(NULL, len);
1960 if (u == NULL)
1961 return NULL;
1962
1963 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1964
1965 if (len > 0) { /* The empty string is always ready. */
1966 assert(!PyUnicode_IS_READY(u));
1967 }
1968
1969 return u;
1970}
1971
1972static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001973getargs_w_star(PyObject *self, PyObject *args)
1974{
1975 Py_buffer buffer;
1976 PyObject *result;
1977 char *str;
1978
1979 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1980 return NULL;
1981
1982 if (2 <= buffer.len) {
1983 str = buffer.buf;
1984 str[0] = '[';
1985 str[buffer.len-1] = ']';
1986 }
1987
1988 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1989 PyBuffer_Release(&buffer);
1990 return result;
1991}
1992
1993
1994static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001995test_empty_argparse(PyObject *self)
1996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 /* Test that formats can begin with '|'. See issue #4720. */
1998 PyObject *tuple, *dict = NULL;
1999 static char *kwlist[] = {NULL};
2000 int result;
2001 tuple = PyTuple_New(0);
2002 if (!tuple)
2003 return NULL;
2004 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
2005 goto done;
2006 dict = PyDict_New();
2007 if (!dict)
2008 goto done;
2009 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002010 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 Py_DECREF(tuple);
2012 Py_XDECREF(dict);
2013 if (result < 0)
2014 return NULL;
2015 else {
2016 Py_RETURN_NONE;
2017 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002018}
2019
2020static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002021codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 const char *encoding, *errors = NULL;
2024 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2025 &encoding, &errors))
2026 return NULL;
2027 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002028}
2029
Thomas Wouters477c8d52006-05-27 19:21:47 +00002030static PyObject *
2031codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 const char *encoding, *errors = NULL;
2034 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2035 &encoding, &errors))
2036 return NULL;
2037 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002038}
2039
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002040
Tim Peters5b8132f2003-01-31 15:52:05 +00002041/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002042static PyObject *
2043test_long_numbits(PyObject *self)
2044{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 struct triple {
2046 long input;
2047 size_t nbits;
2048 int sign;
2049 } testcases[] = {{0, 0, 0},
2050 {1L, 1, 1},
2051 {-1L, 1, -1},
2052 {2L, 2, 1},
2053 {-2L, 2, -1},
2054 {3L, 2, 1},
2055 {-3L, 2, -1},
2056 {4L, 3, 1},
2057 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002058 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 {-0x7fffL, 15, -1},
2060 {0xffffL, 16, 1},
2061 {-0xffffL, 16, -1},
2062 {0xfffffffL, 28, 1},
2063 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002064 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002065
Victor Stinner63941882011-09-29 00:42:28 +02002066 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002067 size_t nbits;
2068 int sign;
2069 PyObject *plong;
2070
2071 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002072 if (plong == NULL)
2073 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002074 nbits = _PyLong_NumBits(plong);
2075 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 Py_DECREF(plong);
2078 if (nbits != testcases[i].nbits)
2079 return raiseTestError("test_long_numbits",
2080 "wrong result for _PyLong_NumBits");
2081 if (sign != testcases[i].sign)
2082 return raiseTestError("test_long_numbits",
2083 "wrong result for _PyLong_Sign");
2084 }
2085 Py_INCREF(Py_None);
2086 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002087}
2088
Thomas Heller519a0422007-11-15 20:48:54 +00002089/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002090
2091static PyObject *
2092test_null_strings(PyObject *self)
2093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2095 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2096 Py_XDECREF(o1);
2097 Py_XDECREF(o2);
2098 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002099}
2100
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002101static PyObject *
2102raise_exception(PyObject *self, PyObject *args)
2103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 PyObject *exc;
2105 PyObject *exc_args, *v;
2106 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2109 &exc, &num_args))
2110 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 exc_args = PyTuple_New(num_args);
2113 if (exc_args == NULL)
2114 return NULL;
2115 for (i = 0; i < num_args; ++i) {
2116 v = PyLong_FromLong(i);
2117 if (v == NULL) {
2118 Py_DECREF(exc_args);
2119 return NULL;
2120 }
2121 PyTuple_SET_ITEM(exc_args, i, v);
2122 }
2123 PyErr_SetObject(exc, exc_args);
2124 Py_DECREF(exc_args);
2125 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002126}
Tim Peters91621db2001-06-12 20:10:01 +00002127
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002128static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002129set_errno(PyObject *self, PyObject *args)
2130{
2131 int new_errno;
2132
2133 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2134 return NULL;
2135
2136 errno = new_errno;
2137 Py_RETURN_NONE;
2138}
2139
2140static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002141test_set_exc_info(PyObject *self, PyObject *args)
2142{
2143 PyObject *orig_exc;
2144 PyObject *new_type, *new_value, *new_tb;
2145 PyObject *type, *value, *tb;
2146 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2147 &new_type, &new_value, &new_tb))
2148 return NULL;
2149
2150 PyErr_GetExcInfo(&type, &value, &tb);
2151
2152 Py_INCREF(new_type);
2153 Py_INCREF(new_value);
2154 Py_INCREF(new_tb);
2155 PyErr_SetExcInfo(new_type, new_value, new_tb);
2156
2157 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2158 Py_XDECREF(type);
2159 Py_XDECREF(value);
2160 Py_XDECREF(tb);
2161 return orig_exc;
2162}
Benjamin Peterson16323982010-02-03 01:13:41 +00002163
2164static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002165
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002166static PyObject *
2167test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 if (PyDateTimeAPI) {
2169 if (test_run_counter) {
2170 /* Probably regrtest.py -R */
2171 Py_RETURN_NONE;
2172 }
2173 else {
2174 PyErr_SetString(PyExc_AssertionError,
2175 "PyDateTime_CAPI somehow initialized");
2176 return NULL;
2177 }
2178 }
2179 test_run_counter++;
2180 PyDateTime_IMPORT;
2181 if (PyDateTimeAPI)
2182 Py_RETURN_NONE;
2183 else
2184 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002185}
2186
Benjamin Peterson16323982010-02-03 01:13:41 +00002187
2188#ifdef WITH_THREAD
2189
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002190/* test_thread_state spawns a thread of its own, and that thread releases
2191 * `thread_done` when it's finished. The driver code has to know when the
2192 * thread finishes, because the thread uses a PyObject (the callable) that
2193 * may go away when the driver finishes. The former lack of this explicit
2194 * synchronization caused rare segfaults, so rare that they were seen only
2195 * on a Mac buildbot (although they were possible on any box).
2196 */
2197static PyThread_type_lock thread_done = NULL;
2198
Benjamin Petersona786b022008-08-25 21:05:21 +00002199static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002200_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 PyObject *rc;
2203 int success;
2204 PyGILState_STATE s = PyGILState_Ensure();
2205 rc = PyObject_CallFunction((PyObject *)callable, "");
2206 success = (rc != NULL);
2207 Py_XDECREF(rc);
2208 PyGILState_Release(s);
2209 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002210}
2211
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002212/* Same thing, but releases `thread_done` when it returns. This variant
2213 * should be called only from threads spawned by test_thread_state().
2214 */
2215static void
2216_make_call_from_thread(void *callable)
2217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 _make_call(callable);
2219 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002220}
2221
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002222static PyObject *
2223test_thread_state(PyObject *self, PyObject *args)
2224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002225 PyObject *fn;
2226 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2229 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 if (!PyCallable_Check(fn)) {
2232 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2233 fn->ob_type->tp_name);
2234 return NULL;
2235 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 /* Ensure Python is set up for threading */
2238 PyEval_InitThreads();
2239 thread_done = PyThread_allocate_lock();
2240 if (thread_done == NULL)
2241 return PyErr_NoMemory();
2242 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 /* Start a new thread with our callback. */
2245 PyThread_start_new_thread(_make_call_from_thread, fn);
2246 /* Make the callback with the thread lock held by this thread */
2247 success &= _make_call(fn);
2248 /* Do it all again, but this time with the thread-lock released */
2249 Py_BEGIN_ALLOW_THREADS
2250 success &= _make_call(fn);
2251 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2252 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 /* And once more with and without a thread
2255 XXX - should use a lock and work out exactly what we are trying
2256 to test <wink>
2257 */
2258 Py_BEGIN_ALLOW_THREADS
2259 PyThread_start_new_thread(_make_call_from_thread, fn);
2260 success &= _make_call(fn);
2261 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2262 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 /* Release lock we acquired above. This is required on HP-UX. */
2265 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 PyThread_free_lock(thread_done);
2268 if (!success)
2269 return NULL;
2270 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002271}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002272
2273/* test Py_AddPendingCalls using threads */
2274static int _pending_callback(void *arg)
2275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 /* we assume the argument is callable object to which we own a reference */
2277 PyObject *callable = (PyObject *)arg;
2278 PyObject *r = PyObject_CallObject(callable, NULL);
2279 Py_DECREF(callable);
2280 Py_XDECREF(r);
2281 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002282}
2283
2284/* The following requests n callbacks to _pending_callback. It can be
2285 * run from any python thread.
2286 */
2287PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
2288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 PyObject *callable;
2290 int r;
2291 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2292 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 /* create the reference for the callbackwhile we hold the lock */
2295 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 Py_BEGIN_ALLOW_THREADS
2298 r = Py_AddPendingCall(&_pending_callback, callable);
2299 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 if (r<0) {
2302 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
2303 Py_INCREF(Py_False);
2304 return Py_False;
2305 }
2306 Py_INCREF(Py_True);
2307 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002308}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002309#endif
2310
Neal Norwitzb0d26332007-08-25 00:49:05 +00002311/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002312static PyObject *
2313test_string_from_format(PyObject *self, PyObject *args)
2314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 PyObject *result;
2316 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002317
Alexander Belopolskye239d232010-12-08 23:31:48 +00002318#define CHECK_1_FORMAT(FORMAT, TYPE) \
2319 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2320 if (result == NULL) \
2321 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002322 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002323 msg = FORMAT " failed at 1"; \
2324 goto Fail; \
2325 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 CHECK_1_FORMAT("%d", int);
2329 CHECK_1_FORMAT("%ld", long);
2330 /* The z width modifier was added in Python 2.5. */
2331 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002333 /* The u type code was added in Python 2.5. */
2334 CHECK_1_FORMAT("%u", unsigned int);
2335 CHECK_1_FORMAT("%lu", unsigned long);
2336 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002339#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
2341 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002342#endif
2343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002345
2346 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 Py_XDECREF(result);
2348 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002349
2350#undef CHECK_1_FORMAT
2351}
2352
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002353
2354static PyObject *
2355test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2357 int result;
2358 if (py_s == NULL)
2359 return NULL;
2360 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2361 Py_DECREF(py_s);
2362 if (!result) {
2363 PyErr_SetString(TestError, "Python string ending in NULL "
2364 "should not compare equal to c string.");
2365 return NULL;
2366 }
2367 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002368}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002369
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002370/* This is here to provide a docstring for test_descr. */
2371static PyObject *
2372test_with_docstring(PyObject *self)
2373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002375}
2376
Mark Dickinson725bfd82009-05-03 20:33:40 +00002377/* Test PyOS_string_to_double. */
2378static PyObject *
2379test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 double result;
2381 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383#define CHECK_STRING(STR, expected) \
2384 result = PyOS_string_to_double(STR, NULL, NULL); \
2385 if (result == -1.0 && PyErr_Occurred()) \
2386 return NULL; \
2387 if (result != expected) { \
2388 msg = "conversion of " STR " to float failed"; \
2389 goto fail; \
2390 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392#define CHECK_INVALID(STR) \
2393 result = PyOS_string_to_double(STR, NULL, NULL); \
2394 if (result == -1.0 && PyErr_Occurred()) { \
2395 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2396 PyErr_Clear(); \
2397 else \
2398 return NULL; \
2399 } \
2400 else { \
2401 msg = "conversion of " STR " didn't raise ValueError"; \
2402 goto fail; \
2403 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 CHECK_STRING("0.1", 0.1);
2406 CHECK_STRING("1.234", 1.234);
2407 CHECK_STRING("-1.35", -1.35);
2408 CHECK_STRING(".1e01", 1.0);
2409 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 CHECK_INVALID(" 0.1");
2412 CHECK_INVALID("\t\n-3");
2413 CHECK_INVALID(".123 ");
2414 CHECK_INVALID("3\n");
2415 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002418 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002420#undef CHECK_STRING
2421#undef CHECK_INVALID
2422}
2423
2424
Benjamin Petersonb173f782009-05-05 22:31:58 +00002425/* Coverage testing of capsule objects. */
2426
2427static const char *capsule_name = "capsule name";
2428static char *capsule_pointer = "capsule pointer";
2429static char *capsule_context = "capsule context";
2430static const char *capsule_error = NULL;
2431static int
2432capsule_destructor_call_count = 0;
2433
2434static void
2435capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 capsule_destructor_call_count++;
2437 if (PyCapsule_GetContext(o) != capsule_context) {
2438 capsule_error = "context did not match in destructor!";
2439 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2440 capsule_error = "destructor did not match in destructor! (woah!)";
2441 } else if (PyCapsule_GetName(o) != capsule_name) {
2442 capsule_error = "name did not match in destructor!";
2443 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2444 capsule_error = "pointer did not match in destructor!";
2445 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002446}
2447
2448typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 char *name;
2450 char *module;
2451 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002452} known_capsule;
2453
2454static PyObject *
2455test_capsule(PyObject *self, PyObject *args)
2456{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 PyObject *object;
2458 const char *error = NULL;
2459 void *pointer;
2460 void *pointer2;
2461 known_capsule known_capsules[] = {
2462 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2463 KNOWN_CAPSULE("_socket", "CAPI"),
2464 KNOWN_CAPSULE("_curses", "_C_API"),
2465 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2466 { NULL, NULL },
2467 };
2468 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002469
2470#define FAIL(x) { error = (x); goto exit; }
2471
2472#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 if (capsule_error) { \
2474 FAIL(capsule_error); \
2475 } \
2476 else if (!capsule_destructor_call_count) { \
2477 FAIL("destructor not called!"); \
2478 } \
2479 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2482 PyCapsule_SetContext(object, capsule_context);
2483 capsule_destructor(object);
2484 CHECK_DESTRUCTOR;
2485 Py_DECREF(object);
2486 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002488 object = PyCapsule_New(known, "ignored", NULL);
2489 PyCapsule_SetPointer(object, capsule_pointer);
2490 PyCapsule_SetName(object, capsule_name);
2491 PyCapsule_SetDestructor(object, capsule_destructor);
2492 PyCapsule_SetContext(object, capsule_context);
2493 capsule_destructor(object);
2494 CHECK_DESTRUCTOR;
2495 /* intentionally access using the wrong name */
2496 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2497 if (!PyErr_Occurred()) {
2498 FAIL("PyCapsule_GetPointer should have failed but did not!");
2499 }
2500 PyErr_Clear();
2501 if (pointer2) {
2502 if (pointer2 == capsule_pointer) {
2503 FAIL("PyCapsule_GetPointer should not have"
2504 " returned the internal pointer!");
2505 } else {
2506 FAIL("PyCapsule_GetPointer should have "
2507 "returned NULL pointer but did not!");
2508 }
2509 }
2510 PyCapsule_SetDestructor(object, NULL);
2511 Py_DECREF(object);
2512 if (capsule_destructor_call_count) {
2513 FAIL("destructor called when it should not have been!");
2514 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 for (known = &known_capsules[0]; known->module != NULL; known++) {
2517 /* yeah, ordinarily I wouldn't do this either,
2518 but it's fine for this test harness.
2519 */
2520 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002521#undef FAIL
2522#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 { \
2524 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2525 x, known->module, known->attribute); \
2526 error = buffer; \
2527 goto exit; \
2528 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 PyObject *module = PyImport_ImportModule(known->module);
2531 if (module) {
2532 pointer = PyCapsule_Import(known->name, 0);
2533 if (!pointer) {
2534 Py_DECREF(module);
2535 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2536 }
2537 object = PyObject_GetAttrString(module, known->attribute);
2538 if (!object) {
2539 Py_DECREF(module);
2540 return NULL;
2541 }
2542 pointer2 = PyCapsule_GetPointer(object,
2543 "weebles wobble but they don't fall down");
2544 if (!PyErr_Occurred()) {
2545 Py_DECREF(object);
2546 Py_DECREF(module);
2547 FAIL("PyCapsule_GetPointer should have failed but did not!");
2548 }
2549 PyErr_Clear();
2550 if (pointer2) {
2551 Py_DECREF(module);
2552 Py_DECREF(object);
2553 if (pointer2 == pointer) {
2554 FAIL("PyCapsule_GetPointer should not have"
2555 " returned its internal pointer!");
2556 } else {
2557 FAIL("PyCapsule_GetPointer should have"
2558 " returned NULL pointer but did not!");
2559 }
2560 }
2561 Py_DECREF(object);
2562 Py_DECREF(module);
2563 }
2564 else
2565 PyErr_Clear();
2566 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002567
2568 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002569 if (error) {
2570 return raiseTestError("test_capsule", error);
2571 }
2572 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002573#undef FAIL
2574}
2575
Guido van Rossumddefaf32007-01-14 03:31:43 +00002576#ifdef HAVE_GETTIMEOFDAY
2577/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002578static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002580 e->tv_sec -= s->tv_sec;
2581 e->tv_usec -= s->tv_usec;
2582 if (e->tv_usec < 0) {
2583 e->tv_sec -=1;
2584 e->tv_usec += 1000000;
2585 }
2586 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002587}
2588
2589static PyObject *
2590profile_int(PyObject *self, PyObject* args)
2591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 int i, k;
2593 struct timeval start, stop;
2594 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 /* Test 1: Allocate and immediately deallocate
2597 many small integers */
2598 gettimeofday(&start, NULL);
2599 for(k=0; k < 20000; k++)
2600 for(i=0; i < 1000; i++) {
2601 single = PyLong_FromLong(i);
2602 Py_DECREF(single);
2603 }
2604 gettimeofday(&stop, NULL);
2605 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002607 /* Test 2: Allocate and immediately deallocate
2608 many large integers */
2609 gettimeofday(&start, NULL);
2610 for(k=0; k < 20000; k++)
2611 for(i=0; i < 1000; i++) {
2612 single = PyLong_FromLong(i+1000000);
2613 Py_DECREF(single);
2614 }
2615 gettimeofday(&stop, NULL);
2616 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 /* Test 3: Allocate a few integers, then release
2619 them all simultaneously. */
2620 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002621 if (multiple == NULL)
2622 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 gettimeofday(&start, NULL);
2624 for(k=0; k < 20000; k++) {
2625 for(i=0; i < 1000; i++) {
2626 multiple[i] = PyLong_FromLong(i+1000000);
2627 }
2628 for(i=0; i < 1000; i++) {
2629 Py_DECREF(multiple[i]);
2630 }
2631 }
2632 gettimeofday(&stop, NULL);
2633 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002634 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002636 /* Test 4: Allocate many integers, then release
2637 them all simultaneously. */
2638 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002639 if (multiple == NULL)
2640 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002641 gettimeofday(&start, NULL);
2642 for(k=0; k < 20; k++) {
2643 for(i=0; i < 1000000; i++) {
2644 multiple[i] = PyLong_FromLong(i+1000000);
2645 }
2646 for(i=0; i < 1000000; i++) {
2647 Py_DECREF(multiple[i]);
2648 }
2649 }
2650 gettimeofday(&stop, NULL);
2651 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002652 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 /* Test 5: Allocate many integers < 32000 */
2655 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002656 if (multiple == NULL)
2657 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 gettimeofday(&start, NULL);
2659 for(k=0; k < 10; k++) {
2660 for(i=0; i < 1000000; i++) {
2661 multiple[i] = PyLong_FromLong(i+1000);
2662 }
2663 for(i=0; i < 1000000; i++) {
2664 Py_DECREF(multiple[i]);
2665 }
2666 }
2667 gettimeofday(&stop, NULL);
2668 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002669 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 /* Test 6: Perform small int addition */
2672 op1 = PyLong_FromLong(1);
2673 gettimeofday(&start, NULL);
2674 for(i=0; i < 10000000; i++) {
2675 result = PyNumber_Add(op1, op1);
2676 Py_DECREF(result);
2677 }
2678 gettimeofday(&stop, NULL);
2679 Py_DECREF(op1);
2680 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 /* Test 7: Perform medium int addition */
2683 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002684 if (op1 == NULL)
2685 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 gettimeofday(&start, NULL);
2687 for(i=0; i < 10000000; i++) {
2688 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002689 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 }
2691 gettimeofday(&stop, NULL);
2692 Py_DECREF(op1);
2693 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 Py_INCREF(Py_None);
2696 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002697}
2698#endif
2699
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002700/* To test the format of tracebacks as printed out. */
2701static PyObject *
2702traceback_print(PyObject *self, PyObject *args)
2703{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 PyObject *file;
2705 PyObject *traceback;
2706 int result;
2707
2708 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2709 &traceback, &file))
2710 return NULL;
2711
2712 result = PyTraceBack_Print(traceback, file);
2713 if (result < 0)
2714 return NULL;
2715 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002716}
2717
Benjamin Petersone6528212008-07-15 15:32:09 +00002718/* To test the format of exceptions as printed out. */
2719static PyObject *
2720exception_print(PyObject *self, PyObject *args)
2721{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 PyObject *value;
2723 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 if (!PyArg_ParseTuple(args, "O:exception_print",
2726 &value))
2727 return NULL;
2728 if (!PyExceptionInstance_Check(value)) {
2729 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2730 return NULL;
2731 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 tb = PyException_GetTraceback(value);
2734 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2735 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002738}
2739
2740
2741
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002742
2743/* reliably raise a MemoryError */
2744static PyObject *
2745raise_memoryerror(PyObject *self)
2746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 PyErr_NoMemory();
2748 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002749}
2750
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002751/* Issue 6012 */
2752static PyObject *str1, *str2;
2753static int
2754failing_converter(PyObject *obj, void *arg)
2755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 /* Clone str1, then let the conversion fail. */
2757 assert(str1);
2758 str2 = str1;
2759 Py_INCREF(str2);
2760 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002761}
2762static PyObject*
2763argparsing(PyObject *o, PyObject *args)
2764{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 PyObject *res;
2766 str1 = str2 = NULL;
2767 if (!PyArg_ParseTuple(args, "O&O&",
2768 PyUnicode_FSConverter, &str1,
2769 failing_converter, &str2)) {
2770 if (!str2)
2771 /* argument converter not called? */
2772 return NULL;
2773 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002774 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 Py_DECREF(str2);
2776 PyErr_Clear();
2777 return res;
2778 }
2779 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002780}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002781
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002782/* To test that the result of PyCode_NewEmpty has the right members. */
2783static PyObject *
2784code_newempty(PyObject *self, PyObject *args)
2785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 const char *filename;
2787 const char *funcname;
2788 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2791 &filename, &funcname, &firstlineno))
2792 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002795}
2796
Georg Brandl1e28a272009-12-28 08:41:01 +00002797/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2798 Run via Lib/test/test_exceptions.py */
2799static PyObject *
2800make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2801{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002802 const char *name;
2803 const char *doc = NULL;
2804 PyObject *base = NULL;
2805 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002809 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2810 "s|sOO:make_exception_with_doc", kwlist,
2811 &name, &doc, &base, &dict))
2812 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002815}
2816
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002817static PyObject *
2818make_memoryview_from_NULL_pointer(PyObject *self)
2819{
2820 Py_buffer info;
2821 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2822 return NULL;
2823 return PyMemoryView_FromBuffer(&info);
2824}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002825
Stefan Krah7213fcc2015-02-01 16:19:23 +01002826static PyObject *
2827test_from_contiguous(PyObject* self, PyObject *noargs)
2828{
2829 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2830 int init[5] = {0, 1, 2, 3, 4};
2831 Py_ssize_t itemsize = sizeof(int);
2832 Py_ssize_t shape = 5;
2833 Py_ssize_t strides = 2 * itemsize;
2834 Py_buffer view = {
2835 data,
2836 NULL,
2837 5 * itemsize,
2838 itemsize,
2839 1,
2840 1,
2841 NULL,
2842 &shape,
2843 &strides,
2844 NULL,
2845 NULL
2846 };
2847 int *ptr;
2848 int i;
2849
2850 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2851 ptr = view.buf;
2852 for (i = 0; i < 5; i++) {
2853 if (ptr[2*i] != i) {
2854 PyErr_SetString(TestError,
2855 "test_from_contiguous: incorrect result");
2856 return NULL;
2857 }
2858 }
2859
2860 view.buf = &data[8];
2861 view.strides[0] = -2 * itemsize;
2862
2863 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2864 ptr = view.buf;
2865 for (i = 0; i < 5; i++) {
2866 if (*(ptr-2*i) != i) {
2867 PyErr_SetString(TestError,
2868 "test_from_contiguous: incorrect result");
2869 return NULL;
2870 }
2871 }
2872
2873 Py_RETURN_NONE;
2874}
Stefan Krah650c1e82015-02-03 21:43:23 +01002875
Stefan Kraha7559c02015-02-03 22:27:21 +01002876#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01002877extern PyTypeObject _PyBytesIOBuffer_Type;
2878
Stefan Krah5178d912015-02-03 16:57:21 +01002879static PyObject *
2880test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
2881{
Stefan Krah650c1e82015-02-03 21:43:23 +01002882 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01002883 PyObject *b;
2884 char *dummy[1];
2885 int ret, match;
2886
Stefan Krah650c1e82015-02-03 21:43:23 +01002887 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01002888 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
2889 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2890 PyErr_Clear();
2891 if (ret != -1 || match == 0)
2892 goto error;
2893
Stefan Krah650c1e82015-02-03 21:43:23 +01002894 /* bytesiobuf_getbuffer() */
2895 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01002896 if (b == NULL) {
2897 return NULL;
2898 }
2899
2900 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
2901 Py_DECREF(b);
2902 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2903 PyErr_Clear();
2904 if (ret != -1 || match == 0)
2905 goto error;
2906
2907 Py_RETURN_NONE;
2908
2909error:
2910 PyErr_SetString(TestError,
2911 "test_pep3118_obsolete_write_locks: failure");
2912 return NULL;
2913}
Stefan Kraha7559c02015-02-03 22:27:21 +01002914#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002915
Stefan Krah650c1e82015-02-03 21:43:23 +01002916/* This tests functions that historically supported write locks. It is
2917 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
2918 is entitled to segfault in that case. */
2919static PyObject *
2920getbuffer_with_null_view(PyObject* self, PyObject *obj)
2921{
2922 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
2923 return NULL;
2924
2925 Py_RETURN_NONE;
2926}
2927
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002928/* Test that the fatal error from not having a current thread doesn't
2929 cause an infinite loop. Run via Lib/test/test_capi.py */
2930static PyObject *
2931crash_no_current_thread(PyObject *self)
2932{
2933 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002934 /* Using PyThreadState_Get() directly allows the test to pass in
2935 !pydebug mode. However, the test only actually tests anything
2936 in pydebug mode, since that's where the infinite loop was in
2937 the first place. */
2938 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002939 Py_END_ALLOW_THREADS
2940 return NULL;
2941}
2942
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002943/* To run some code in a sub-interpreter. */
2944static PyObject *
2945run_in_subinterp(PyObject *self, PyObject *args)
2946{
2947 const char *code;
2948 int r;
2949 PyThreadState *substate, *mainstate;
2950
2951 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2952 &code))
2953 return NULL;
2954
2955 mainstate = PyThreadState_Get();
2956
2957 PyThreadState_Swap(NULL);
2958
2959 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002960 if (substate == NULL) {
2961 /* Since no new thread state was created, there is no exception to
2962 propagate; raise a fresh one after swapping in the old thread
2963 state. */
2964 PyThreadState_Swap(mainstate);
2965 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2966 return NULL;
2967 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002968 r = PyRun_SimpleString(code);
2969 Py_EndInterpreter(substate);
2970
2971 PyThreadState_Swap(mainstate);
2972
2973 return PyLong_FromLong(r);
2974}
2975
Victor Stinner3c1b3792014-02-17 00:02:43 +01002976static int
2977check_time_rounding(int round)
2978{
Victor Stinnera695f832015-03-30 03:57:14 +02002979 if (round != _PyTime_ROUND_FLOOR && round != _PyTime_ROUND_CEILING) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01002980 PyErr_SetString(PyExc_ValueError, "invalid rounding");
2981 return -1;
2982 }
2983 return 0;
2984}
2985
Victor Stinner5d272cc2012-03-13 13:35:55 +01002986static PyObject *
2987test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2988{
2989 PyObject *obj;
2990 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002991 int round;
2992 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002993 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002994 if (check_time_rounding(round) < 0)
2995 return NULL;
2996 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002997 return NULL;
2998 return _PyLong_FromTime_t(sec);
2999}
3000
3001static PyObject *
3002test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3003{
3004 PyObject *obj;
3005 time_t sec;
3006 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003007 int round;
3008 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003009 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003010 if (check_time_rounding(round) < 0)
3011 return NULL;
3012 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003013 return NULL;
3014 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3015}
3016
Victor Stinner643cd682012-03-02 22:54:03 +01003017static PyObject *
3018test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3019{
3020 PyObject *obj;
3021 time_t sec;
3022 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003023 int round;
3024 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003025 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003026 if (check_time_rounding(round) < 0)
3027 return NULL;
3028 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003029 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003030 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003031}
3032
Antoine Pitrou796564c2013-07-30 19:59:21 +02003033static void
3034slot_tp_del(PyObject *self)
3035{
3036 _Py_IDENTIFIER(__tp_del__);
3037 PyObject *del, *res;
3038 PyObject *error_type, *error_value, *error_traceback;
3039
3040 /* Temporarily resurrect the object. */
3041 assert(self->ob_refcnt == 0);
3042 self->ob_refcnt = 1;
3043
3044 /* Save the current exception, if any. */
3045 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3046
3047 /* Execute __del__ method, if any. */
3048 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3049 if (del != NULL) {
3050 res = PyEval_CallObject(del, NULL);
3051 if (res == NULL)
3052 PyErr_WriteUnraisable(del);
3053 else
3054 Py_DECREF(res);
3055 Py_DECREF(del);
3056 }
3057
3058 /* Restore the saved exception. */
3059 PyErr_Restore(error_type, error_value, error_traceback);
3060
3061 /* Undo the temporary resurrection; can't use DECREF here, it would
3062 * cause a recursive call.
3063 */
3064 assert(self->ob_refcnt > 0);
3065 if (--self->ob_refcnt == 0)
3066 return; /* this is the normal path out */
3067
3068 /* __del__ resurrected it! Make it look like the original Py_DECREF
3069 * never happened.
3070 */
3071 {
3072 Py_ssize_t refcnt = self->ob_refcnt;
3073 _Py_NewReference(self);
3074 self->ob_refcnt = refcnt;
3075 }
3076 assert(!PyType_IS_GC(Py_TYPE(self)) ||
3077 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
3078 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3079 * we need to undo that. */
3080 _Py_DEC_REFTOTAL;
3081 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3082 * chain, so no more to do there.
3083 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3084 * _Py_NewReference bumped tp_allocs: both of those need to be
3085 * undone.
3086 */
3087#ifdef COUNT_ALLOCS
3088 --Py_TYPE(self)->tp_frees;
3089 --Py_TYPE(self)->tp_allocs;
3090#endif
3091}
3092
3093static PyObject *
3094with_tp_del(PyObject *self, PyObject *args)
3095{
3096 PyObject *obj;
3097 PyTypeObject *tp;
3098
3099 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3100 return NULL;
3101 tp = (PyTypeObject *) obj;
3102 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3103 PyErr_Format(PyExc_TypeError,
3104 "heap type expected, got %R", obj);
3105 return NULL;
3106 }
3107 tp->tp_del = slot_tp_del;
3108 Py_INCREF(obj);
3109 return obj;
3110}
3111
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003112static PyMethodDef ml;
3113
3114static PyObject *
3115create_cfunction(PyObject *self, PyObject *args)
3116{
3117 return PyCFunction_NewEx(&ml, self, NULL);
3118}
3119
3120static PyMethodDef ml = {
3121 "create_cfunction",
3122 create_cfunction,
3123 METH_NOARGS,
3124 NULL
3125};
3126
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003127static PyObject *
3128_test_incref(PyObject *ob)
3129{
3130 Py_INCREF(ob);
3131 return ob;
3132}
3133
3134static PyObject *
3135test_xincref_doesnt_leak(PyObject *ob)
3136{
3137 PyObject *obj = PyLong_FromLong(0);
3138 Py_XINCREF(_test_incref(obj));
3139 Py_DECREF(obj);
3140 Py_DECREF(obj);
3141 Py_DECREF(obj);
3142 Py_RETURN_NONE;
3143}
3144
3145static PyObject *
3146test_incref_doesnt_leak(PyObject *ob)
3147{
3148 PyObject *obj = PyLong_FromLong(0);
3149 Py_INCREF(_test_incref(obj));
3150 Py_DECREF(obj);
3151 Py_DECREF(obj);
3152 Py_DECREF(obj);
3153 Py_RETURN_NONE;
3154}
3155
3156static PyObject *
3157test_xdecref_doesnt_leak(PyObject *ob)
3158{
3159 Py_XDECREF(PyLong_FromLong(0));
3160 Py_RETURN_NONE;
3161}
3162
3163static PyObject *
3164test_decref_doesnt_leak(PyObject *ob)
3165{
3166 Py_DECREF(PyLong_FromLong(0));
3167 Py_RETURN_NONE;
3168}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003169
Victor Stinner0507bf52013-07-07 02:05:46 +02003170static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02003171test_incref_decref_API(PyObject *ob)
3172{
3173 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003174 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003175 Py_DecRef(obj);
3176 Py_DecRef(obj);
3177 Py_RETURN_NONE;
3178}
3179
3180static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02003181test_pymem_alloc0(PyObject *self)
3182{
3183 void *ptr;
3184
Victor Stinnerdb067af2014-05-02 22:31:14 +02003185 ptr = PyMem_RawMalloc(0);
3186 if (ptr == NULL) {
3187 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3188 return NULL;
3189 }
3190 PyMem_RawFree(ptr);
3191
3192 ptr = PyMem_RawCalloc(0, 0);
3193 if (ptr == NULL) {
3194 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3195 return NULL;
3196 }
3197 PyMem_RawFree(ptr);
3198
Victor Stinner0507bf52013-07-07 02:05:46 +02003199 ptr = PyMem_Malloc(0);
3200 if (ptr == NULL) {
3201 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3202 return NULL;
3203 }
3204 PyMem_Free(ptr);
3205
Victor Stinnerdb067af2014-05-02 22:31:14 +02003206 ptr = PyMem_Calloc(0, 0);
3207 if (ptr == NULL) {
3208 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3209 return NULL;
3210 }
3211 PyMem_Free(ptr);
3212
Victor Stinner0507bf52013-07-07 02:05:46 +02003213 ptr = PyObject_Malloc(0);
3214 if (ptr == NULL) {
3215 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3216 return NULL;
3217 }
3218 PyObject_Free(ptr);
3219
Victor Stinnerdb067af2014-05-02 22:31:14 +02003220 ptr = PyObject_Calloc(0, 0);
3221 if (ptr == NULL) {
3222 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3223 return NULL;
3224 }
3225 PyObject_Free(ptr);
3226
Victor Stinner0507bf52013-07-07 02:05:46 +02003227 Py_RETURN_NONE;
3228}
3229
3230typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003231 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003232
3233 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003234 size_t calloc_nelem;
3235 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003236 void *realloc_ptr;
3237 size_t realloc_new_size;
3238 void *free_ptr;
3239} alloc_hook_t;
3240
3241static void* hook_malloc (void* ctx, size_t size)
3242{
3243 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3244 hook->malloc_size = size;
3245 return hook->alloc.malloc(hook->alloc.ctx, size);
3246}
3247
Victor Stinnerdb067af2014-05-02 22:31:14 +02003248static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
3249{
3250 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3251 hook->calloc_nelem = nelem;
3252 hook->calloc_elsize = elsize;
3253 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3254}
3255
Victor Stinner0507bf52013-07-07 02:05:46 +02003256static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
3257{
3258 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3259 hook->realloc_ptr = ptr;
3260 hook->realloc_new_size = new_size;
3261 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3262}
3263
3264static void hook_free (void *ctx, void *ptr)
3265{
3266 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3267 hook->free_ptr = ptr;
3268 hook->alloc.free(hook->alloc.ctx, ptr);
3269}
3270
3271static PyObject *
3272test_setallocators(PyMemAllocatorDomain domain)
3273{
3274 PyObject *res = NULL;
3275 const char *error_msg;
3276 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003277 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003278 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003279 void *ptr, *ptr2;
3280
Victor Stinnerdb067af2014-05-02 22:31:14 +02003281 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003282
3283 alloc.ctx = &hook;
3284 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003285 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003286 alloc.realloc = &hook_realloc;
3287 alloc.free = &hook_free;
3288 PyMem_GetAllocator(domain, &hook.alloc);
3289 PyMem_SetAllocator(domain, &alloc);
3290
3291 size = 42;
3292 switch(domain)
3293 {
3294 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3295 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3296 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3297 default: ptr = NULL; break;
3298 }
3299
3300 if (ptr == NULL) {
3301 error_msg = "malloc failed";
3302 goto fail;
3303 }
3304
3305 if (hook.malloc_size != size) {
3306 error_msg = "malloc invalid size";
3307 goto fail;
3308 }
3309
3310 size2 = 200;
3311 switch(domain)
3312 {
3313 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3314 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3315 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003316 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003317 }
3318
3319 if (ptr2 == NULL) {
3320 error_msg = "realloc failed";
3321 goto fail;
3322 }
3323
3324 if (hook.realloc_ptr != ptr
3325 || hook.realloc_new_size != size2) {
3326 error_msg = "realloc invalid parameters";
3327 goto fail;
3328 }
3329
3330 switch(domain)
3331 {
3332 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3333 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3334 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3335 }
3336
3337 if (hook.free_ptr != ptr2) {
3338 error_msg = "free invalid pointer";
3339 goto fail;
3340 }
3341
Victor Stinnerdb067af2014-05-02 22:31:14 +02003342 nelem = 2;
3343 elsize = 5;
3344 switch(domain)
3345 {
3346 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3347 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3348 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3349 default: ptr = NULL; break;
3350 }
3351
3352 if (ptr == NULL) {
3353 error_msg = "calloc failed";
3354 goto fail;
3355 }
3356
3357 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3358 error_msg = "calloc invalid nelem or elsize";
3359 goto fail;
3360 }
3361
3362 switch(domain)
3363 {
3364 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3365 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3366 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3367 }
3368
Victor Stinner0507bf52013-07-07 02:05:46 +02003369 Py_INCREF(Py_None);
3370 res = Py_None;
3371 goto finally;
3372
3373fail:
3374 PyErr_SetString(PyExc_RuntimeError, error_msg);
3375
3376finally:
3377 PyMem_SetAllocator(domain, &hook.alloc);
3378 return res;
3379}
3380
3381static PyObject *
3382test_pymem_setrawallocators(PyObject *self)
3383{
3384 return test_setallocators(PYMEM_DOMAIN_RAW);
3385}
3386
3387static PyObject *
3388test_pymem_setallocators(PyObject *self)
3389{
3390 return test_setallocators(PYMEM_DOMAIN_MEM);
3391}
3392
3393static PyObject *
3394test_pyobject_setallocators(PyObject *self)
3395{
3396 return test_setallocators(PYMEM_DOMAIN_OBJ);
3397}
3398
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003399PyDoc_STRVAR(docstring_empty,
3400""
3401);
3402
3403PyDoc_STRVAR(docstring_no_signature,
3404"This docstring has no signature."
3405);
3406
3407PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003408"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003409"\n"
3410"This docstring has an invalid signature."
3411);
3412
Larry Hastings2623c8c2014-02-08 22:15:29 -08003413PyDoc_STRVAR(docstring_with_invalid_signature2,
3414"docstring_with_invalid_signature2($module, /, boo)\n"
3415"\n"
3416"--\n"
3417"\n"
3418"This docstring also has an invalid signature."
3419);
3420
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003421PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003422"docstring_with_signature($module, /, sig)\n"
3423"--\n"
3424"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003425"This docstring has a valid signature."
3426);
3427
Zachary Ware8ef887c2015-04-13 18:22:35 -05003428PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3429"docstring_with_signature_but_no_doc($module, /, sig)\n"
3430"--\n"
3431"\n"
3432);
3433
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003434PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003435"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3436"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003437"\n"
3438"\n"
3439"This docstring has a valid signature and some extra newlines."
3440);
3441
Larry Hastings16c51912014-01-07 11:53:01 -08003442PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003443"docstring_with_signature_with_defaults(module, s='avocado',\n"
3444" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3445" local=the_number_three, sys=sys.maxsize,\n"
3446" exp=sys.maxsize - 1)\n"
3447"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003448"\n"
3449"\n"
3450"\n"
3451"This docstring has a valid signature with parameters,\n"
3452"and the parameters take defaults of varying types."
3453);
3454
Victor Stinner258e4d32013-12-13 02:30:12 +01003455#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003456typedef struct {
3457 PyThread_type_lock start_event;
3458 PyThread_type_lock exit_event;
3459 PyObject *callback;
3460} test_c_thread_t;
3461
3462static void
3463temporary_c_thread(void *data)
3464{
3465 test_c_thread_t *test_c_thread = data;
3466 PyGILState_STATE state;
3467 PyObject *res;
3468
3469 PyThread_release_lock(test_c_thread->start_event);
3470
3471 /* Allocate a Python thread state for this thread */
3472 state = PyGILState_Ensure();
3473
3474 res = PyObject_CallFunction(test_c_thread->callback, "", NULL);
3475 Py_CLEAR(test_c_thread->callback);
3476
3477 if (res == NULL) {
3478 PyErr_Print();
3479 }
3480 else {
3481 Py_DECREF(res);
3482 }
3483
3484 /* Destroy the Python thread state for this thread */
3485 PyGILState_Release(state);
3486
3487 PyThread_release_lock(test_c_thread->exit_event);
3488
3489 PyThread_exit_thread();
3490}
3491
3492static PyObject *
3493call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3494{
3495 PyObject *res = NULL;
3496 test_c_thread_t test_c_thread;
3497 long thread;
3498
3499 PyEval_InitThreads();
3500
3501 test_c_thread.start_event = PyThread_allocate_lock();
3502 test_c_thread.exit_event = PyThread_allocate_lock();
3503 test_c_thread.callback = NULL;
3504 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3505 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3506 goto exit;
3507 }
3508
3509 Py_INCREF(callback);
3510 test_c_thread.callback = callback;
3511
3512 PyThread_acquire_lock(test_c_thread.start_event, 1);
3513 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3514
3515 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3516 if (thread == -1) {
3517 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3518 PyThread_release_lock(test_c_thread.start_event);
3519 PyThread_release_lock(test_c_thread.exit_event);
3520 goto exit;
3521 }
3522
3523 PyThread_acquire_lock(test_c_thread.start_event, 1);
3524 PyThread_release_lock(test_c_thread.start_event);
3525
3526 Py_BEGIN_ALLOW_THREADS
3527 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3528 PyThread_release_lock(test_c_thread.exit_event);
3529 Py_END_ALLOW_THREADS
3530
3531 Py_INCREF(Py_None);
3532 res = Py_None;
3533
3534exit:
3535 Py_CLEAR(test_c_thread.callback);
3536 if (test_c_thread.start_event)
3537 PyThread_free_lock(test_c_thread.start_event);
3538 if (test_c_thread.exit_event)
3539 PyThread_free_lock(test_c_thread.exit_event);
3540 return res;
3541}
Victor Stinner258e4d32013-12-13 02:30:12 +01003542#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003543
Victor Stinner56e8c292014-07-21 12:30:22 +02003544static PyObject*
3545test_raise_signal(PyObject* self, PyObject *args)
3546{
3547 int signum, err;
3548
3549 if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0)
3550 return NULL;
3551
3552 err = raise(signum);
3553 if (err)
3554 return PyErr_SetFromErrno(PyExc_OSError);
3555
3556 if (PyErr_CheckSignals() < 0)
3557 return NULL;
3558
3559 Py_RETURN_NONE;
3560}
3561
Serhiy Storchakab5181342015-02-06 08:58:56 +02003562/* marshal */
3563
3564static PyObject*
3565pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3566{
3567 long value;
3568 char *filename;
3569 int version;
3570 FILE *fp;
3571
3572 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3573 &value, &filename, &version))
3574 return NULL;
3575
3576 fp = fopen(filename, "wb");
3577 if (fp == NULL) {
3578 PyErr_SetFromErrno(PyExc_OSError);
3579 return NULL;
3580 }
3581
3582 PyMarshal_WriteLongToFile(value, fp, version);
3583
3584 fclose(fp);
3585 if (PyErr_Occurred())
3586 return NULL;
3587 Py_RETURN_NONE;
3588}
3589
3590static PyObject*
3591pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3592{
3593 PyObject *obj;
3594 char *filename;
3595 int version;
3596 FILE *fp;
3597
3598 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3599 &obj, &filename, &version))
3600 return NULL;
3601
3602 fp = fopen(filename, "wb");
3603 if (fp == NULL) {
3604 PyErr_SetFromErrno(PyExc_OSError);
3605 return NULL;
3606 }
3607
3608 PyMarshal_WriteObjectToFile(obj, fp, version);
3609
3610 fclose(fp);
3611 if (PyErr_Occurred())
3612 return NULL;
3613 Py_RETURN_NONE;
3614}
3615
3616static PyObject*
3617pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3618{
3619 int value;
3620 long pos;
3621 char *filename;
3622 FILE *fp;
3623
3624 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3625 return NULL;
3626
3627 fp = fopen(filename, "rb");
3628 if (fp == NULL) {
3629 PyErr_SetFromErrno(PyExc_OSError);
3630 return NULL;
3631 }
3632
3633 value = PyMarshal_ReadShortFromFile(fp);
3634 pos = ftell(fp);
3635
3636 fclose(fp);
3637 if (PyErr_Occurred())
3638 return NULL;
3639 return Py_BuildValue("il", value, pos);
3640}
3641
3642static PyObject*
3643pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3644{
3645 long value, pos;
3646 char *filename;
3647 FILE *fp;
3648
3649 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3650 return NULL;
3651
3652 fp = fopen(filename, "rb");
3653 if (fp == NULL) {
3654 PyErr_SetFromErrno(PyExc_OSError);
3655 return NULL;
3656 }
3657
3658 value = PyMarshal_ReadLongFromFile(fp);
3659 pos = ftell(fp);
3660
3661 fclose(fp);
3662 if (PyErr_Occurred())
3663 return NULL;
3664 return Py_BuildValue("ll", value, pos);
3665}
3666
3667static PyObject*
3668pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3669{
3670 PyObject *obj;
3671 long pos;
3672 char *filename;
3673 FILE *fp;
3674
3675 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3676 return NULL;
3677
3678 fp = fopen(filename, "rb");
3679 if (fp == NULL) {
3680 PyErr_SetFromErrno(PyExc_OSError);
3681 return NULL;
3682 }
3683
3684 obj = PyMarshal_ReadLastObjectFromFile(fp);
3685 pos = ftell(fp);
3686
3687 fclose(fp);
3688 return Py_BuildValue("Nl", obj, pos);
3689}
3690
3691static PyObject*
3692pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3693{
3694 PyObject *obj;
3695 long pos;
3696 char *filename;
3697 FILE *fp;
3698
3699 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3700 return NULL;
3701
3702 fp = fopen(filename, "rb");
3703 if (fp == NULL) {
3704 PyErr_SetFromErrno(PyExc_OSError);
3705 return NULL;
3706 }
3707
3708 obj = PyMarshal_ReadObjectFromFile(fp);
3709 pos = ftell(fp);
3710
3711 fclose(fp);
3712 return Py_BuildValue("Nl", obj, pos);
3713}
3714
Victor Stinnerefde1462015-03-21 15:04:43 +01003715static PyObject*
3716return_null_without_error(PyObject *self, PyObject *args)
3717{
3718 /* invalid call: return NULL without setting an error,
3719 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3720 PyErr_Clear();
3721 return NULL;
3722}
3723
3724static PyObject*
3725return_result_with_error(PyObject *self, PyObject *args)
3726{
3727 /* invalid call: return a result with an error set,
3728 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3729 PyErr_SetNone(PyExc_ValueError);
3730 Py_RETURN_NONE;
3731}
3732
Victor Stinner992c43f2015-03-27 17:12:45 +01003733static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02003734test_pytime_fromseconds(PyObject *self, PyObject *args)
3735{
3736 int seconds;
3737 _PyTime_t ts;
3738
3739 if (!PyArg_ParseTuple(args, "i", &seconds))
3740 return NULL;
3741 ts = _PyTime_FromSeconds(seconds);
3742 return _PyTime_AsNanosecondsObject(ts);
3743}
3744
3745static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01003746test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
3747{
3748 PyObject *obj;
3749 int round;
3750 _PyTime_t ts;
3751
3752 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
3753 return NULL;
3754 if (check_time_rounding(round) < 0)
3755 return NULL;
3756 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
3757 return NULL;
3758 return _PyTime_AsNanosecondsObject(ts);
3759}
3760
Victor Stinner4bfb4602015-03-27 22:27:24 +01003761static PyObject *
3762test_pytime_assecondsdouble(PyObject *self, PyObject *args)
3763{
3764 PY_LONG_LONG ns;
3765 _PyTime_t ts;
3766 double d;
3767
3768 if (!PyArg_ParseTuple(args, "L", &ns))
3769 return NULL;
3770 ts = _PyTime_FromNanoseconds(ns);
3771 d = _PyTime_AsSecondsDouble(ts);
3772 return PyFloat_FromDouble(d);
3773}
3774
Victor Stinner95e9cef2015-03-28 01:26:47 +01003775static PyObject *
3776test_PyTime_AsTimeval(PyObject *self, PyObject *args)
3777{
3778 PY_LONG_LONG ns;
3779 int round;
3780 _PyTime_t t;
3781 struct timeval tv;
3782 PyObject *seconds;
3783
3784 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3785 return NULL;
3786 if (check_time_rounding(round) < 0)
3787 return NULL;
3788 t = _PyTime_FromNanoseconds(ns);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +02003789 if (_PyTime_AsTimeval(t, &tv, round) < 0)
Victor Stinner95e9cef2015-03-28 01:26:47 +01003790 return NULL;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003791
3792 seconds = PyLong_FromLong((PY_LONG_LONG)tv.tv_sec);
3793 if (seconds == NULL)
3794 return NULL;
3795 return Py_BuildValue("Nl", seconds, tv.tv_usec);
3796}
3797
Victor Stinner34dc0f42015-03-27 18:19:03 +01003798#ifdef HAVE_CLOCK_GETTIME
3799static PyObject *
3800test_PyTime_AsTimespec(PyObject *self, PyObject *args)
3801{
3802 PY_LONG_LONG ns;
3803 _PyTime_t t;
3804 struct timespec ts;
3805
3806 if (!PyArg_ParseTuple(args, "L", &ns))
3807 return NULL;
3808 t = _PyTime_FromNanoseconds(ns);
3809 if (_PyTime_AsTimespec(t, &ts) == -1)
3810 return NULL;
3811 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
3812}
3813#endif
3814
Victor Stinner62d1c702015-04-01 17:47:07 +02003815static PyObject *
3816test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
3817{
3818 PY_LONG_LONG ns;
3819 int round;
3820 _PyTime_t t, ms;
3821
3822 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3823 return NULL;
3824 if (check_time_rounding(round) < 0)
3825 return NULL;
3826 t = _PyTime_FromNanoseconds(ns);
3827 ms = _PyTime_AsMilliseconds(t, round);
3828 /* This conversion rely on the fact that _PyTime_t is a number of
3829 nanoseconds */
3830 return _PyTime_AsNanosecondsObject(ms);
3831}
3832
3833static PyObject *
3834test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
3835{
3836 PY_LONG_LONG ns;
3837 int round;
3838 _PyTime_t t, ms;
3839
3840 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3841 return NULL;
3842 if (check_time_rounding(round) < 0)
3843 return NULL;
3844 t = _PyTime_FromNanoseconds(ns);
3845 ms = _PyTime_AsMicroseconds(t, round);
3846 /* This conversion rely on the fact that _PyTime_t is a number of
3847 nanoseconds */
3848 return _PyTime_AsNanosecondsObject(ms);
3849}
3850
Victor Stinner50856d52015-10-13 00:11:21 +02003851static PyObject*
3852get_recursion_depth(PyObject *self, PyObject *args)
3853{
3854 PyThreadState *tstate = PyThreadState_GET();
3855
Martin Panter0be894b2016-09-07 12:03:06 +00003856 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02003857 return PyLong_FromLong(tstate->recursion_depth - 1);
3858}
3859
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003860
Tim Peters9ea17ac2001-02-02 05:57:15 +00003861static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003862 {"raise_exception", raise_exception, METH_VARARGS},
3863 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02003864 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003865 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01003866 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003867 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
3868 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
3869 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
INADA Naoki6165d552016-12-20 09:54:24 +09003870 {"dict_hassplittable", dict_hassplittable, METH_O},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003871 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003872 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003873 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
3874 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
3875 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
3876 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02003877 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003878 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
3879 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02003880 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
3881 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003882 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
3883 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
3884 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07003885 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003886 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
3887 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
3888 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
3889 PyDoc_STR("This is a pretty normal docstring.")},
3890 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
3891 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
3892 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01003893 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01003894#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01003895 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01003896#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01003897 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03003898 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakaacef5de2016-05-16 09:55:32 +03003899 {"get_args", get_args, METH_VARARGS},
3900 {"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003901 {"getargs_tuple", getargs_tuple, METH_VARARGS},
3902 {"getargs_keywords", (PyCFunction)getargs_keywords,
3903 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00003904 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
3905 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003906 {"getargs_b", getargs_b, METH_VARARGS},
3907 {"getargs_B", getargs_B, METH_VARARGS},
3908 {"getargs_h", getargs_h, METH_VARARGS},
3909 {"getargs_H", getargs_H, METH_VARARGS},
3910 {"getargs_I", getargs_I, METH_VARARGS},
3911 {"getargs_k", getargs_k, METH_VARARGS},
3912 {"getargs_i", getargs_i, METH_VARARGS},
3913 {"getargs_l", getargs_l, METH_VARARGS},
3914 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07003915 {"getargs_p", getargs_p, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00003916#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003917 {"getargs_L", getargs_L, METH_VARARGS},
3918 {"getargs_K", getargs_K, METH_VARARGS},
3919 {"test_longlong_api", test_longlong_api, METH_NOARGS},
3920 {"test_long_long_and_overflow",
3921 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
3922 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003923#endif
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03003924 {"getargs_f", getargs_f, METH_VARARGS},
3925 {"getargs_d", getargs_d, METH_VARARGS},
3926 {"getargs_D", getargs_D, METH_VARARGS},
3927 {"getargs_S", getargs_S, METH_VARARGS},
3928 {"getargs_Y", getargs_Y, METH_VARARGS},
3929 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03003930 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02003931 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003932 {"getargs_s", getargs_s, METH_VARARGS},
3933 {"getargs_s_star", getargs_s_star, METH_VARARGS},
3934 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
3935 {"getargs_z", getargs_z, METH_VARARGS},
3936 {"getargs_z_star", getargs_z_star, METH_VARARGS},
3937 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
3938 {"getargs_y", getargs_y, METH_VARARGS},
3939 {"getargs_y_star", getargs_y_star, METH_VARARGS},
3940 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
3941 {"getargs_u", getargs_u, METH_VARARGS},
3942 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
3943 {"getargs_Z", getargs_Z, METH_VARARGS},
3944 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00003945 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02003946 {"getargs_es", getargs_es, METH_VARARGS},
3947 {"getargs_et", getargs_et, METH_VARARGS},
3948 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
3949 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003950 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003951 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003952 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003953 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003954 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
3955 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
3956 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
3957 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01003958 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
3959 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03003960 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03003961 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01003962 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
3963 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01003964 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003965#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00003966 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003967 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003968#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00003969#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00003970 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00003971#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00003972 {"traceback_print", traceback_print, METH_VARARGS},
3973 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02003974 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00003975 {"argparsing", argparsing, METH_VARARGS},
3976 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003977 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
3978 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003979 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
3980 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003981 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003982 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01003983 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
3984 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01003985 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02003986 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003987 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02003988 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02003989 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
3990 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02003991 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
3992 {"test_pymem_setallocators",
3993 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
3994 {"test_pyobject_setallocators",
3995 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003996 {"no_docstring",
3997 (PyCFunction)test_with_docstring, METH_NOARGS},
3998 {"docstring_empty",
3999 (PyCFunction)test_with_docstring, METH_NOARGS,
4000 docstring_empty},
4001 {"docstring_no_signature",
4002 (PyCFunction)test_with_docstring, METH_NOARGS,
4003 docstring_no_signature},
4004 {"docstring_with_invalid_signature",
4005 (PyCFunction)test_with_docstring, METH_NOARGS,
4006 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004007 {"docstring_with_invalid_signature2",
4008 (PyCFunction)test_with_docstring, METH_NOARGS,
4009 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004010 {"docstring_with_signature",
4011 (PyCFunction)test_with_docstring, METH_NOARGS,
4012 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004013 {"docstring_with_signature_but_no_doc",
4014 (PyCFunction)test_with_docstring, METH_NOARGS,
4015 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004016 {"docstring_with_signature_and_extra_newlines",
4017 (PyCFunction)test_with_docstring, METH_NOARGS,
4018 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004019 {"docstring_with_signature_with_defaults",
4020 (PyCFunction)test_with_docstring, METH_NOARGS,
4021 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02004022 {"raise_signal",
4023 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01004024#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004025 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4026 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01004027#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02004028 {"pymarshal_write_long_to_file",
4029 pymarshal_write_long_to_file, METH_VARARGS},
4030 {"pymarshal_write_object_to_file",
4031 pymarshal_write_object_to_file, METH_VARARGS},
4032 {"pymarshal_read_short_from_file",
4033 pymarshal_read_short_from_file, METH_VARARGS},
4034 {"pymarshal_read_long_from_file",
4035 pymarshal_read_long_from_file, METH_VARARGS},
4036 {"pymarshal_read_last_object_from_file",
4037 pymarshal_read_last_object_from_file, METH_VARARGS},
4038 {"pymarshal_read_object_from_file",
4039 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004040 {"return_null_without_error",
4041 return_null_without_error, METH_NOARGS},
4042 {"return_result_with_error",
4043 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004044 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004045 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4046 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004047 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004048#ifdef HAVE_CLOCK_GETTIME
4049 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4050#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004051 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4052 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004053 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004054 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00004055};
4056
Thomas Hellera4ea6032003-04-17 18:55:45 +00004057#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
4058
Thomas Wouters89f507f2006-12-13 04:49:30 +00004059typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004060 char bool_member;
4061 char byte_member;
4062 unsigned char ubyte_member;
4063 short short_member;
4064 unsigned short ushort_member;
4065 int int_member;
4066 unsigned int uint_member;
4067 long long_member;
4068 unsigned long ulong_member;
4069 Py_ssize_t pyssizet_member;
4070 float float_member;
4071 double double_member;
4072 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00004073#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004074 PY_LONG_LONG longlong_member;
4075 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00004076#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00004077} all_structmembers;
4078
4079typedef struct {
4080 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004081 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004082} test_structmembers;
4083
4084static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004085 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
4086 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
4087 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
4088 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
4089 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
4090 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
4091 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
4092 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
4093 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
4094 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
4095 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
4096 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
4097 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00004098#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004099 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
4100 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00004101#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004102 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00004103};
4104
4105
Christian Heimes1af737c2008-01-23 08:24:23 +00004106static PyObject *
4107test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
4108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004109 static char *keywords[] = {
4110 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
4111 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
4112 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00004113#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004114 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00004115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004116 NULL};
4117 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00004118#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004119 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00004120#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004121 ;
4122 test_structmembers *ob;
4123 const char *s = NULL;
4124 Py_ssize_t string_len = 0;
4125 ob = PyObject_New(test_structmembers, type);
4126 if (ob == NULL)
4127 return NULL;
4128 memset(&ob->structmembers, 0, sizeof(all_structmembers));
4129 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
4130 &ob->structmembers.bool_member,
4131 &ob->structmembers.byte_member,
4132 &ob->structmembers.ubyte_member,
4133 &ob->structmembers.short_member,
4134 &ob->structmembers.ushort_member,
4135 &ob->structmembers.int_member,
4136 &ob->structmembers.uint_member,
4137 &ob->structmembers.long_member,
4138 &ob->structmembers.ulong_member,
4139 &ob->structmembers.pyssizet_member,
4140 &ob->structmembers.float_member,
4141 &ob->structmembers.double_member,
4142 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00004143#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004144 , &ob->structmembers.longlong_member,
4145 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00004146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004147 )) {
4148 Py_DECREF(ob);
4149 return NULL;
4150 }
4151 if (s != NULL) {
4152 if (string_len > 5) {
4153 Py_DECREF(ob);
4154 PyErr_SetString(PyExc_ValueError, "string too long");
4155 return NULL;
4156 }
4157 strcpy(ob->structmembers.inplace_member, s);
4158 }
4159 else {
4160 strcpy(ob->structmembers.inplace_member, "");
4161 }
4162 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004163}
4164
Christian Heimes1af737c2008-01-23 08:24:23 +00004165static void
4166test_structmembers_free(PyObject *ob)
4167{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004168 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004169}
4170
4171static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004172 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004173 "test_structmembersType",
4174 sizeof(test_structmembers), /* tp_basicsize */
4175 0, /* tp_itemsize */
4176 test_structmembers_free, /* destructor tp_dealloc */
4177 0, /* tp_print */
4178 0, /* tp_getattr */
4179 0, /* tp_setattr */
4180 0, /* tp_reserved */
4181 0, /* tp_repr */
4182 0, /* tp_as_number */
4183 0, /* tp_as_sequence */
4184 0, /* tp_as_mapping */
4185 0, /* tp_hash */
4186 0, /* tp_call */
4187 0, /* tp_str */
4188 PyObject_GenericGetAttr, /* tp_getattro */
4189 PyObject_GenericSetAttr, /* tp_setattro */
4190 0, /* tp_as_buffer */
4191 0, /* tp_flags */
4192 "Type containing all structmember types",
4193 0, /* traverseproc tp_traverse */
4194 0, /* tp_clear */
4195 0, /* tp_richcompare */
4196 0, /* tp_weaklistoffset */
4197 0, /* tp_iter */
4198 0, /* tp_iternext */
4199 0, /* tp_methods */
4200 test_members, /* tp_members */
4201 0,
4202 0,
4203 0,
4204 0,
4205 0,
4206 0,
4207 0,
4208 0,
4209 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004210};
4211
4212
Benjamin Petersond51374e2014-04-09 23:55:56 -04004213typedef struct {
4214 PyObject_HEAD
4215} matmulObject;
4216
4217static PyObject *
4218matmulType_matmul(PyObject *self, PyObject *other)
4219{
4220 return Py_BuildValue("(sOO)", "matmul", self, other);
4221}
4222
4223static PyObject *
4224matmulType_imatmul(PyObject *self, PyObject *other)
4225{
4226 return Py_BuildValue("(sOO)", "imatmul", self, other);
4227}
4228
4229static void
4230matmulType_dealloc(PyObject *self)
4231{
Zachary Ware420dc562014-04-23 13:51:27 -05004232 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004233}
4234
4235static PyNumberMethods matmulType_as_number = {
4236 0, /* nb_add */
4237 0, /* nb_subtract */
4238 0, /* nb_multiply */
4239 0, /* nb_remainde r*/
4240 0, /* nb_divmod */
4241 0, /* nb_power */
4242 0, /* nb_negative */
4243 0, /* tp_positive */
4244 0, /* tp_absolute */
4245 0, /* tp_bool */
4246 0, /* nb_invert */
4247 0, /* nb_lshift */
4248 0, /* nb_rshift */
4249 0, /* nb_and */
4250 0, /* nb_xor */
4251 0, /* nb_or */
4252 0, /* nb_int */
4253 0, /* nb_reserved */
4254 0, /* nb_float */
4255 0, /* nb_inplace_add */
4256 0, /* nb_inplace_subtract */
4257 0, /* nb_inplace_multiply */
4258 0, /* nb_inplace_remainder */
4259 0, /* nb_inplace_power */
4260 0, /* nb_inplace_lshift */
4261 0, /* nb_inplace_rshift */
4262 0, /* nb_inplace_and */
4263 0, /* nb_inplace_xor */
4264 0, /* nb_inplace_or */
4265 0, /* nb_floor_divide */
4266 0, /* nb_true_divide */
4267 0, /* nb_inplace_floor_divide */
4268 0, /* nb_inplace_true_divide */
4269 0, /* nb_index */
4270 matmulType_matmul, /* nb_matrix_multiply */
4271 matmulType_imatmul /* nb_matrix_inplace_multiply */
4272};
4273
4274static PyTypeObject matmulType = {
4275 PyVarObject_HEAD_INIT(NULL, 0)
4276 "matmulType",
4277 sizeof(matmulObject), /* tp_basicsize */
4278 0, /* tp_itemsize */
4279 matmulType_dealloc, /* destructor tp_dealloc */
4280 0, /* tp_print */
4281 0, /* tp_getattr */
4282 0, /* tp_setattr */
4283 0, /* tp_reserved */
4284 0, /* tp_repr */
4285 &matmulType_as_number, /* tp_as_number */
4286 0, /* tp_as_sequence */
4287 0, /* tp_as_mapping */
4288 0, /* tp_hash */
4289 0, /* tp_call */
4290 0, /* tp_str */
4291 PyObject_GenericGetAttr, /* tp_getattro */
4292 PyObject_GenericSetAttr, /* tp_setattro */
4293 0, /* tp_as_buffer */
4294 0, /* tp_flags */
4295 "C level type with matrix operations defined",
4296 0, /* traverseproc tp_traverse */
4297 0, /* tp_clear */
4298 0, /* tp_richcompare */
4299 0, /* tp_weaklistoffset */
4300 0, /* tp_iter */
4301 0, /* tp_iternext */
4302 0, /* tp_methods */
4303 0, /* tp_members */
4304 0,
4305 0,
4306 0,
4307 0,
4308 0,
4309 0,
4310 0,
4311 0,
4312 PyType_GenericNew, /* tp_new */
4313 PyObject_Del, /* tp_free */
4314};
4315
Martin v. Löwis1a214512008-06-11 05:26:20 +00004316
Yury Selivanov75445082015-05-11 22:57:16 -04004317typedef struct {
4318 PyObject_HEAD
4319 PyObject *ao_iterator;
4320} awaitObject;
4321
4322
4323static PyObject *
4324awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4325{
4326 PyObject *v;
4327 awaitObject *ao;
4328
4329 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
4330 return NULL;
4331
4332 ao = (awaitObject *)type->tp_alloc(type, 0);
4333 if (ao == NULL) {
4334 return NULL;
4335 }
4336
4337 Py_INCREF(v);
4338 ao->ao_iterator = v;
4339
4340 return (PyObject *)ao;
4341}
4342
4343
4344static void
4345awaitObject_dealloc(awaitObject *ao)
4346{
4347 Py_CLEAR(ao->ao_iterator);
4348 Py_TYPE(ao)->tp_free(ao);
4349}
4350
4351
4352static PyObject *
4353awaitObject_await(awaitObject *ao)
4354{
4355 Py_INCREF(ao->ao_iterator);
4356 return ao->ao_iterator;
4357}
4358
4359static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04004360 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04004361 0, /* am_aiter */
4362 0 /* am_anext */
4363};
4364
4365
4366static PyTypeObject awaitType = {
4367 PyVarObject_HEAD_INIT(NULL, 0)
4368 "awaitType",
4369 sizeof(awaitObject), /* tp_basicsize */
4370 0, /* tp_itemsize */
4371 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
4372 0, /* tp_print */
4373 0, /* tp_getattr */
4374 0, /* tp_setattr */
4375 &awaitType_as_async, /* tp_as_async */
4376 0, /* tp_repr */
4377 0, /* tp_as_number */
4378 0, /* tp_as_sequence */
4379 0, /* tp_as_mapping */
4380 0, /* tp_hash */
4381 0, /* tp_call */
4382 0, /* tp_str */
4383 PyObject_GenericGetAttr, /* tp_getattro */
4384 PyObject_GenericSetAttr, /* tp_setattro */
4385 0, /* tp_as_buffer */
4386 0, /* tp_flags */
4387 "C level type with tp_as_async",
4388 0, /* traverseproc tp_traverse */
4389 0, /* tp_clear */
4390 0, /* tp_richcompare */
4391 0, /* tp_weaklistoffset */
4392 0, /* tp_iter */
4393 0, /* tp_iternext */
4394 0, /* tp_methods */
4395 0, /* tp_members */
4396 0,
4397 0,
4398 0,
4399 0,
4400 0,
4401 0,
4402 0,
4403 0,
4404 awaitObject_new, /* tp_new */
4405 PyObject_Del, /* tp_free */
4406};
4407
4408
Martin v. Löwis1a214512008-06-11 05:26:20 +00004409static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004410 PyModuleDef_HEAD_INIT,
4411 "_testcapi",
4412 NULL,
4413 -1,
4414 TestMethods,
4415 NULL,
4416 NULL,
4417 NULL,
4418 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004419};
4420
Nick Coghland5cacbb2015-05-23 22:24:10 +10004421/* Per PEP 489, this module will not be converted to multi-phase initialization
4422 */
4423
Mark Hammond62b1ab12002-07-23 06:31:15 +00004424PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004425PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00004426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004427 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004429 m = PyModule_Create(&_testcapimodule);
4430 if (m == NULL)
4431 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004433 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00004434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 Py_TYPE(&test_structmembersType)=&PyType_Type;
4436 Py_INCREF(&test_structmembersType);
4437 /* don't use a name starting with "test", since we don't want
4438 test_capi to automatically call this */
4439 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004440 if (PyType_Ready(&matmulType) < 0)
4441 return NULL;
4442 Py_INCREF(&matmulType);
4443 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004444
Yury Selivanov75445082015-05-11 22:57:16 -04004445 if (PyType_Ready(&awaitType) < 0)
4446 return NULL;
4447 Py_INCREF(&awaitType);
4448 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
4449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004450 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
4451 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
4452 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
4453 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
4454 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
4455 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
4456 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
4457 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
4458 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
4459 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
4460 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
4461 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
4462 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
4463 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
4464 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
4465 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
4466 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
4467 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
4468 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
4469 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
4470 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
4471 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
4472 Py_INCREF(&PyInstanceMethod_Type);
4473 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00004474
Larry Hastings2a727912014-01-16 11:32:01 -08004475 PyModule_AddIntConstant(m, "the_number_three", 3);
4476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004477 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
4478 Py_INCREF(TestError);
4479 PyModule_AddObject(m, "error", TestError);
4480 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004481}