blob: ba0a24bd1d2cbe68a11905d56e7fe15666ba6604 [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
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000252/* Issue #4701: Check that PyObject_Hash implicitly calls
253 * PyType_Ready if it hasn't already been called
254 */
255static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 PyVarObject_HEAD_INIT(NULL, 0)
257 "hashinheritancetester", /* Name of this type */
258 sizeof(PyObject), /* Basic object size */
259 0, /* Item size for varobject */
260 (destructor)PyObject_Del, /* tp_dealloc */
261 0, /* tp_print */
262 0, /* tp_getattr */
263 0, /* tp_setattr */
264 0, /* tp_reserved */
265 0, /* tp_repr */
266 0, /* tp_as_number */
267 0, /* tp_as_sequence */
268 0, /* tp_as_mapping */
269 0, /* tp_hash */
270 0, /* tp_call */
271 0, /* tp_str */
272 PyObject_GenericGetAttr, /* tp_getattro */
273 0, /* tp_setattro */
274 0, /* tp_as_buffer */
275 Py_TPFLAGS_DEFAULT, /* tp_flags */
276 0, /* tp_doc */
277 0, /* tp_traverse */
278 0, /* tp_clear */
279 0, /* tp_richcompare */
280 0, /* tp_weaklistoffset */
281 0, /* tp_iter */
282 0, /* tp_iternext */
283 0, /* tp_methods */
284 0, /* tp_members */
285 0, /* tp_getset */
286 0, /* tp_base */
287 0, /* tp_dict */
288 0, /* tp_descr_get */
289 0, /* tp_descr_set */
290 0, /* tp_dictoffset */
291 0, /* tp_init */
292 0, /* tp_alloc */
293 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000294};
295
296static PyObject*
297test_lazy_hash_inheritance(PyObject* self)
298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 PyTypeObject *type;
300 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000301 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 if (type->tp_dict != NULL)
306 /* The type has already been initialized. This probably means
307 -R is being used. */
308 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000309
310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 obj = PyObject_New(PyObject, type);
312 if (obj == NULL) {
313 PyErr_Clear();
314 PyErr_SetString(
315 TestError,
316 "test_lazy_hash_inheritance: failed to create object");
317 return NULL;
318 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 if (type->tp_dict != NULL) {
321 PyErr_SetString(
322 TestError,
323 "test_lazy_hash_inheritance: type initialised too soon");
324 Py_DECREF(obj);
325 return NULL;
326 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 hash = PyObject_Hash(obj);
329 if ((hash == -1) && PyErr_Occurred()) {
330 PyErr_Clear();
331 PyErr_SetString(
332 TestError,
333 "test_lazy_hash_inheritance: could not hash object");
334 Py_DECREF(obj);
335 return NULL;
336 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 if (type->tp_dict == NULL) {
339 PyErr_SetString(
340 TestError,
341 "test_lazy_hash_inheritance: type not initialised by hash()");
342 Py_DECREF(obj);
343 return NULL;
344 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 if (type->tp_hash != PyType_Type.tp_hash) {
347 PyErr_SetString(
348 TestError,
349 "test_lazy_hash_inheritance: unexpected hash function");
350 Py_DECREF(obj);
351 return NULL;
352 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000357}
358
359
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000360/* Tests of PyLong_{As, From}{Unsigned,}Long(), and (#ifdef HAVE_LONG_LONG)
Tim Petersff70d3c2001-06-14 01:11:03 +0000361 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000362
363 Note that the meat of the test is contained in testcapi_long.h.
364 This is revolting, but delicate code duplication is worse: "almost
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000365 exactly the same" code is needed to test PY_LONG_LONG, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000366 dependence on type names makes it impossible to use a parameterized
367 function. A giant macro would be even worse than this. A C++ template
368 would be perfect.
369
370 The "report an error" functions are deliberately not part of the #include
371 file: if the test fails, you can set a breakpoint in the appropriate
372 error function directly, and crawl back from there in the debugger.
373*/
374
375#define UNBIND(X) Py_DECREF(X); (X) = NULL
376
377static PyObject *
378raise_test_long_error(const char* msg)
379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000381}
382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383#define TESTNAME test_long_api_inner
384#define TYPENAME long
385#define F_S_TO_PY PyLong_FromLong
386#define F_PY_TO_S PyLong_AsLong
387#define F_U_TO_PY PyLong_FromUnsignedLong
388#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000389
390#include "testcapi_long.h"
391
392static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000393test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000396}
397
398#undef TESTNAME
399#undef TYPENAME
400#undef F_S_TO_PY
401#undef F_PY_TO_S
402#undef F_U_TO_PY
403#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000404
405#ifdef HAVE_LONG_LONG
Tim Peters91621db2001-06-12 20:10:01 +0000406
407static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000408raise_test_longlong_error(const char* msg)
409{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000411}
412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413#define TESTNAME test_longlong_api_inner
414#define TYPENAME PY_LONG_LONG
415#define F_S_TO_PY PyLong_FromLongLong
416#define F_PY_TO_S PyLong_AsLongLong
417#define F_U_TO_PY PyLong_FromUnsignedLongLong
418#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000419
420#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000421
422static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000423test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000426}
427
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000428#undef TESTNAME
429#undef TYPENAME
430#undef F_S_TO_PY
431#undef F_PY_TO_S
432#undef F_U_TO_PY
433#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000434
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000435/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
436 is tested by test_long_api_inner. This test will concentrate on proper
437 handling of overflow.
438*/
439
440static PyObject *
441test_long_and_overflow(PyObject *self)
442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 PyObject *num, *one, *temp;
444 long value;
445 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 /* Test that overflow is set properly for a large value. */
448 /* num is a number larger than LONG_MAX even on 64-bit platforms */
449 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
450 if (num == NULL)
451 return NULL;
452 overflow = 1234;
453 value = PyLong_AsLongAndOverflow(num, &overflow);
454 Py_DECREF(num);
455 if (value == -1 && PyErr_Occurred())
456 return NULL;
457 if (value != -1)
458 return raiseTestError("test_long_and_overflow",
459 "return value was not set to -1");
460 if (overflow != 1)
461 return raiseTestError("test_long_and_overflow",
462 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 /* Same again, with num = LONG_MAX + 1 */
465 num = PyLong_FromLong(LONG_MAX);
466 if (num == NULL)
467 return NULL;
468 one = PyLong_FromLong(1L);
469 if (one == NULL) {
470 Py_DECREF(num);
471 return NULL;
472 }
473 temp = PyNumber_Add(num, one);
474 Py_DECREF(one);
475 Py_DECREF(num);
476 num = temp;
477 if (num == NULL)
478 return NULL;
479 overflow = 0;
480 value = PyLong_AsLongAndOverflow(num, &overflow);
481 Py_DECREF(num);
482 if (value == -1 && PyErr_Occurred())
483 return NULL;
484 if (value != -1)
485 return raiseTestError("test_long_and_overflow",
486 "return value was not set to -1");
487 if (overflow != 1)
488 return raiseTestError("test_long_and_overflow",
489 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 /* Test that overflow is set properly for a large negative value. */
492 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
493 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
494 if (num == NULL)
495 return NULL;
496 overflow = 1234;
497 value = PyLong_AsLongAndOverflow(num, &overflow);
498 Py_DECREF(num);
499 if (value == -1 && PyErr_Occurred())
500 return NULL;
501 if (value != -1)
502 return raiseTestError("test_long_and_overflow",
503 "return value was not set to -1");
504 if (overflow != -1)
505 return raiseTestError("test_long_and_overflow",
506 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 /* Same again, with num = LONG_MIN - 1 */
509 num = PyLong_FromLong(LONG_MIN);
510 if (num == NULL)
511 return NULL;
512 one = PyLong_FromLong(1L);
513 if (one == NULL) {
514 Py_DECREF(num);
515 return NULL;
516 }
517 temp = PyNumber_Subtract(num, one);
518 Py_DECREF(one);
519 Py_DECREF(num);
520 num = temp;
521 if (num == NULL)
522 return NULL;
523 overflow = 0;
524 value = PyLong_AsLongAndOverflow(num, &overflow);
525 Py_DECREF(num);
526 if (value == -1 && PyErr_Occurred())
527 return NULL;
528 if (value != -1)
529 return raiseTestError("test_long_and_overflow",
530 "return value was not set to -1");
531 if (overflow != -1)
532 return raiseTestError("test_long_and_overflow",
533 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 /* Test that overflow is cleared properly for small values. */
536 num = PyLong_FromString("FF", NULL, 16);
537 if (num == NULL)
538 return NULL;
539 overflow = 1234;
540 value = PyLong_AsLongAndOverflow(num, &overflow);
541 Py_DECREF(num);
542 if (value == -1 && PyErr_Occurred())
543 return NULL;
544 if (value != 0xFF)
545 return raiseTestError("test_long_and_overflow",
546 "expected return value 0xFF");
547 if (overflow != 0)
548 return raiseTestError("test_long_and_overflow",
549 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 num = PyLong_FromString("-FF", NULL, 16);
552 if (num == NULL)
553 return NULL;
554 overflow = 0;
555 value = PyLong_AsLongAndOverflow(num, &overflow);
556 Py_DECREF(num);
557 if (value == -1 && PyErr_Occurred())
558 return NULL;
559 if (value != -0xFF)
560 return raiseTestError("test_long_and_overflow",
561 "expected return value 0xFF");
562 if (overflow != 0)
563 return raiseTestError("test_long_and_overflow",
564 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 num = PyLong_FromLong(LONG_MAX);
567 if (num == NULL)
568 return NULL;
569 overflow = 1234;
570 value = PyLong_AsLongAndOverflow(num, &overflow);
571 Py_DECREF(num);
572 if (value == -1 && PyErr_Occurred())
573 return NULL;
574 if (value != LONG_MAX)
575 return raiseTestError("test_long_and_overflow",
576 "expected return value LONG_MAX");
577 if (overflow != 0)
578 return raiseTestError("test_long_and_overflow",
579 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 num = PyLong_FromLong(LONG_MIN);
582 if (num == NULL)
583 return NULL;
584 overflow = 0;
585 value = PyLong_AsLongAndOverflow(num, &overflow);
586 Py_DECREF(num);
587 if (value == -1 && PyErr_Occurred())
588 return NULL;
589 if (value != LONG_MIN)
590 return raiseTestError("test_long_and_overflow",
591 "expected return value LONG_MIN");
592 if (overflow != 0)
593 return raiseTestError("test_long_and_overflow",
594 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 Py_INCREF(Py_None);
597 return Py_None;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000598}
599
Mark Dickinson93f562c2010-01-30 10:30:15 +0000600/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
601 PY_LONG_LONG is tested by test_long_api_inner. This test will
602 concentrate on proper handling of overflow.
603*/
604
605static PyObject *
606test_long_long_and_overflow(PyObject *self)
607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 PyObject *num, *one, *temp;
609 PY_LONG_LONG value;
610 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 /* Test that overflow is set properly for a large value. */
613 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
614 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
615 if (num == NULL)
616 return NULL;
617 overflow = 1234;
618 value = PyLong_AsLongLongAndOverflow(num, &overflow);
619 Py_DECREF(num);
620 if (value == -1 && PyErr_Occurred())
621 return NULL;
622 if (value != -1)
623 return raiseTestError("test_long_long_and_overflow",
624 "return value was not set to -1");
625 if (overflow != 1)
626 return raiseTestError("test_long_long_and_overflow",
627 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 /* Same again, with num = PY_LLONG_MAX + 1 */
630 num = PyLong_FromLongLong(PY_LLONG_MAX);
631 if (num == NULL)
632 return NULL;
633 one = PyLong_FromLong(1L);
634 if (one == NULL) {
635 Py_DECREF(num);
636 return NULL;
637 }
638 temp = PyNumber_Add(num, one);
639 Py_DECREF(one);
640 Py_DECREF(num);
641 num = temp;
642 if (num == NULL)
643 return NULL;
644 overflow = 0;
645 value = PyLong_AsLongLongAndOverflow(num, &overflow);
646 Py_DECREF(num);
647 if (value == -1 && PyErr_Occurred())
648 return NULL;
649 if (value != -1)
650 return raiseTestError("test_long_long_and_overflow",
651 "return value was not set to -1");
652 if (overflow != 1)
653 return raiseTestError("test_long_long_and_overflow",
654 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 /* Test that overflow is set properly for a large negative value. */
657 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
658 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
659 if (num == NULL)
660 return NULL;
661 overflow = 1234;
662 value = PyLong_AsLongLongAndOverflow(num, &overflow);
663 Py_DECREF(num);
664 if (value == -1 && PyErr_Occurred())
665 return NULL;
666 if (value != -1)
667 return raiseTestError("test_long_long_and_overflow",
668 "return value was not set to -1");
669 if (overflow != -1)
670 return raiseTestError("test_long_long_and_overflow",
671 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 /* Same again, with num = PY_LLONG_MIN - 1 */
674 num = PyLong_FromLongLong(PY_LLONG_MIN);
675 if (num == NULL)
676 return NULL;
677 one = PyLong_FromLong(1L);
678 if (one == NULL) {
679 Py_DECREF(num);
680 return NULL;
681 }
682 temp = PyNumber_Subtract(num, one);
683 Py_DECREF(one);
684 Py_DECREF(num);
685 num = temp;
686 if (num == NULL)
687 return NULL;
688 overflow = 0;
689 value = PyLong_AsLongLongAndOverflow(num, &overflow);
690 Py_DECREF(num);
691 if (value == -1 && PyErr_Occurred())
692 return NULL;
693 if (value != -1)
694 return raiseTestError("test_long_long_and_overflow",
695 "return value was not set to -1");
696 if (overflow != -1)
697 return raiseTestError("test_long_long_and_overflow",
698 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 /* Test that overflow is cleared properly for small values. */
701 num = PyLong_FromString("FF", NULL, 16);
702 if (num == NULL)
703 return NULL;
704 overflow = 1234;
705 value = PyLong_AsLongLongAndOverflow(num, &overflow);
706 Py_DECREF(num);
707 if (value == -1 && PyErr_Occurred())
708 return NULL;
709 if (value != 0xFF)
710 return raiseTestError("test_long_long_and_overflow",
711 "expected return value 0xFF");
712 if (overflow != 0)
713 return raiseTestError("test_long_long_and_overflow",
714 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 num = PyLong_FromString("-FF", NULL, 16);
717 if (num == NULL)
718 return NULL;
719 overflow = 0;
720 value = PyLong_AsLongLongAndOverflow(num, &overflow);
721 Py_DECREF(num);
722 if (value == -1 && PyErr_Occurred())
723 return NULL;
724 if (value != -0xFF)
725 return raiseTestError("test_long_long_and_overflow",
726 "expected return value 0xFF");
727 if (overflow != 0)
728 return raiseTestError("test_long_long_and_overflow",
729 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 num = PyLong_FromLongLong(PY_LLONG_MAX);
732 if (num == NULL)
733 return NULL;
734 overflow = 1234;
735 value = PyLong_AsLongLongAndOverflow(num, &overflow);
736 Py_DECREF(num);
737 if (value == -1 && PyErr_Occurred())
738 return NULL;
739 if (value != PY_LLONG_MAX)
740 return raiseTestError("test_long_long_and_overflow",
741 "expected return value PY_LLONG_MAX");
742 if (overflow != 0)
743 return raiseTestError("test_long_long_and_overflow",
744 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 num = PyLong_FromLongLong(PY_LLONG_MIN);
747 if (num == NULL)
748 return NULL;
749 overflow = 0;
750 value = PyLong_AsLongLongAndOverflow(num, &overflow);
751 Py_DECREF(num);
752 if (value == -1 && PyErr_Occurred())
753 return NULL;
754 if (value != PY_LLONG_MIN)
755 return raiseTestError("test_long_long_and_overflow",
756 "expected return value PY_LLONG_MIN");
757 if (overflow != 0)
758 return raiseTestError("test_long_long_and_overflow",
759 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 Py_INCREF(Py_None);
762 return Py_None;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000763}
764
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200765/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
766 non-integer arguments are handled correctly. It should be extended to
767 test overflow handling.
768 */
769
770static PyObject *
771test_long_as_size_t(PyObject *self)
772{
773 size_t out_u;
774 Py_ssize_t out_s;
775
776 Py_INCREF(Py_None);
777
778 out_u = PyLong_AsSize_t(Py_None);
779 if (out_u != (size_t)-1 || !PyErr_Occurred())
780 return raiseTestError("test_long_as_size_t",
781 "PyLong_AsSize_t(None) didn't complain");
782 if (!PyErr_ExceptionMatches(PyExc_TypeError))
783 return raiseTestError("test_long_as_size_t",
784 "PyLong_AsSize_t(None) raised "
785 "something other than TypeError");
786 PyErr_Clear();
787
788 out_s = PyLong_AsSsize_t(Py_None);
789 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
790 return raiseTestError("test_long_as_size_t",
791 "PyLong_AsSsize_t(None) didn't complain");
792 if (!PyErr_ExceptionMatches(PyExc_TypeError))
793 return raiseTestError("test_long_as_size_t",
794 "PyLong_AsSsize_t(None) raised "
795 "something other than TypeError");
796 PyErr_Clear();
797
798 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
799 return Py_None;
800}
801
802/* Test the PyLong_AsDouble API. At present this just tests that
803 non-integer arguments are handled correctly.
804 */
805
806static PyObject *
807test_long_as_double(PyObject *self)
808{
809 double out;
810
811 Py_INCREF(Py_None);
812
813 out = PyLong_AsDouble(Py_None);
814 if (out != -1.0 || !PyErr_Occurred())
815 return raiseTestError("test_long_as_double",
816 "PyLong_AsDouble(None) didn't complain");
817 if (!PyErr_ExceptionMatches(PyExc_TypeError))
818 return raiseTestError("test_long_as_double",
819 "PyLong_AsDouble(None) raised "
820 "something other than TypeError");
821 PyErr_Clear();
822
823 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
824 return Py_None;
825}
826
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000827/* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG
Tim Petersd38b1c72001-09-30 05:09:37 +0000828 for both long and int arguments. The test may leak a little memory if
829 it fails.
830*/
831static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000832test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000833{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 PyObject *tuple, *num;
835 PY_LONG_LONG value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 tuple = PyTuple_New(1);
838 if (tuple == NULL)
839 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 num = PyLong_FromLong(42);
842 if (num == NULL)
843 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 value = -1;
848 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
849 return NULL;
850 if (value != 42)
851 return raiseTestError("test_L_code",
852 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 Py_DECREF(num);
855 num = PyLong_FromLong(42);
856 if (num == NULL)
857 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 value = -1;
862 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
863 return NULL;
864 if (value != 42)
865 return raiseTestError("test_L_code",
866 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 Py_DECREF(tuple);
869 Py_INCREF(Py_None);
870 return Py_None;
Tim Petersd38b1c72001-09-30 05:09:37 +0000871}
872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873#endif /* ifdef HAVE_LONG_LONG */
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000874
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000875/* Test tuple argument processing */
876static PyObject *
877getargs_tuple(PyObject *self, PyObject *args)
878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 int a, b, c;
880 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
881 return NULL;
882 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000883}
884
Christian Heimes380f7f22008-02-28 11:19:05 +0000885/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +0000886static PyObject *
887getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +0000888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
890 static char *fmt="(ii)i|(i(ii))(iii)i";
891 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +0000892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
894 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
895 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
896 return NULL;
897 return Py_BuildValue("iiiiiiiiii",
898 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
899 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +0000900}
901
Larry Hastings83a9f482012-03-20 20:06:16 +0000902/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
903static PyObject *
904getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
905{
906 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
907 int required = -1;
908 int optional = -1;
909 int keyword_only = -1;
910
911 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
912 &required, &optional, &keyword_only))
913 return NULL;
914 return Py_BuildValue("iii", required, optional, keyword_only);
915}
916
Thomas Heller3457e4b2003-04-24 16:14:27 +0000917/* Functions to call PyArg_ParseTuple with integer format codes,
918 and return the result.
919*/
Thomas Hellera4ea6032003-04-17 18:55:45 +0000920static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000921getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000922{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 unsigned char value;
924 if (!PyArg_ParseTuple(args, "b", &value))
925 return NULL;
926 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000927}
928
Thomas Heller3457e4b2003-04-24 16:14:27 +0000929static PyObject *
930getargs_B(PyObject *self, PyObject *args)
931{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 unsigned char value;
933 if (!PyArg_ParseTuple(args, "B", &value))
934 return NULL;
935 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000936}
937
938static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +0000939getargs_h(PyObject *self, PyObject *args)
940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 short value;
942 if (!PyArg_ParseTuple(args, "h", &value))
943 return NULL;
944 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +0000945}
946
947static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000948getargs_H(PyObject *self, PyObject *args)
949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 unsigned short value;
951 if (!PyArg_ParseTuple(args, "H", &value))
952 return NULL;
953 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000954}
955
956static PyObject *
957getargs_I(PyObject *self, PyObject *args)
958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 unsigned int value;
960 if (!PyArg_ParseTuple(args, "I", &value))
961 return NULL;
962 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000963}
964
965static PyObject *
966getargs_k(PyObject *self, PyObject *args)
967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 unsigned long value;
969 if (!PyArg_ParseTuple(args, "k", &value))
970 return NULL;
971 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000972}
973
974static PyObject *
975getargs_i(PyObject *self, PyObject *args)
976{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 int value;
978 if (!PyArg_ParseTuple(args, "i", &value))
979 return NULL;
980 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000981}
982
Thomas Hellera4ea6032003-04-17 18:55:45 +0000983static PyObject *
984getargs_l(PyObject *self, PyObject *args)
985{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 long value;
987 if (!PyArg_ParseTuple(args, "l", &value))
988 return NULL;
989 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000990}
991
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000992static PyObject *
993getargs_n(PyObject *self, PyObject *args)
994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 Py_ssize_t value;
996 if (!PyArg_ParseTuple(args, "n", &value))
997 return NULL;
998 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000999}
1000
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001001static PyObject *
1002getargs_p(PyObject *self, PyObject *args)
1003{
1004 int value;
1005 if (!PyArg_ParseTuple(args, "p", &value))
1006 return NULL;
1007 return PyLong_FromLong(value);
1008}
1009
Thomas Hellera4ea6032003-04-17 18:55:45 +00001010#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +00001011static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001012getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 PY_LONG_LONG value;
1015 if (!PyArg_ParseTuple(args, "L", &value))
1016 return NULL;
1017 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001018}
1019
Thomas Hellera4ea6032003-04-17 18:55:45 +00001020static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001021getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 unsigned PY_LONG_LONG value;
1024 if (!PyArg_ParseTuple(args, "K", &value))
1025 return NULL;
1026 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001027}
1028#endif
1029
1030/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +00001031 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001032static PyObject *
1033test_k_code(PyObject *self)
1034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 PyObject *tuple, *num;
1036 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 tuple = PyTuple_New(1);
1039 if (tuple == NULL)
1040 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 /* a number larger than ULONG_MAX even on 64-bit platforms */
1043 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1044 if (num == NULL)
1045 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 value = PyLong_AsUnsignedLongMask(num);
1048 if (value != ULONG_MAX)
1049 return raiseTestError("test_k_code",
1050 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 value = 0;
1055 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1056 return NULL;
1057 if (value != ULONG_MAX)
1058 return raiseTestError("test_k_code",
1059 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 Py_DECREF(num);
1062 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1063 if (num == NULL)
1064 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 value = PyLong_AsUnsignedLongMask(num);
1067 if (value != (unsigned long)-0x42)
1068 return raiseTestError("test_k_code",
1069 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 value = 0;
1074 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1075 return NULL;
1076 if (value != (unsigned long)-0x42)
1077 return raiseTestError("test_k_code",
1078 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 Py_DECREF(tuple);
1081 Py_INCREF(Py_None);
1082 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001083}
1084
Victor Stinner06e49dd2010-06-13 18:21:50 +00001085static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001086getargs_c(PyObject *self, PyObject *args)
1087{
1088 char c;
1089 if (!PyArg_ParseTuple(args, "c", &c))
1090 return NULL;
1091 return PyBytes_FromStringAndSize(&c, 1);
1092}
1093
1094static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001095getargs_s(PyObject *self, PyObject *args)
1096{
1097 char *str;
1098 if (!PyArg_ParseTuple(args, "s", &str))
1099 return NULL;
1100 return PyBytes_FromString(str);
1101}
1102
1103static PyObject *
1104getargs_s_star(PyObject *self, PyObject *args)
1105{
1106 Py_buffer buffer;
1107 PyObject *bytes;
1108 if (!PyArg_ParseTuple(args, "s*", &buffer))
1109 return NULL;
1110 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1111 PyBuffer_Release(&buffer);
1112 return bytes;
1113}
1114
1115static PyObject *
1116getargs_s_hash(PyObject *self, PyObject *args)
1117{
1118 char *str;
1119 Py_ssize_t size;
1120 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1121 return NULL;
1122 return PyBytes_FromStringAndSize(str, size);
1123}
1124
1125static PyObject *
1126getargs_z(PyObject *self, PyObject *args)
1127{
1128 char *str;
1129 if (!PyArg_ParseTuple(args, "z", &str))
1130 return NULL;
1131 if (str != NULL)
1132 return PyBytes_FromString(str);
1133 else
1134 Py_RETURN_NONE;
1135}
1136
1137static PyObject *
1138getargs_z_star(PyObject *self, PyObject *args)
1139{
1140 Py_buffer buffer;
1141 PyObject *bytes;
1142 if (!PyArg_ParseTuple(args, "z*", &buffer))
1143 return NULL;
1144 if (buffer.buf != NULL)
1145 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1146 else {
1147 Py_INCREF(Py_None);
1148 bytes = Py_None;
1149 }
1150 PyBuffer_Release(&buffer);
1151 return bytes;
1152}
1153
1154static PyObject *
1155getargs_z_hash(PyObject *self, PyObject *args)
1156{
1157 char *str;
1158 Py_ssize_t size;
1159 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1160 return NULL;
1161 if (str != NULL)
1162 return PyBytes_FromStringAndSize(str, size);
1163 else
1164 Py_RETURN_NONE;
1165}
1166
1167static PyObject *
1168getargs_y(PyObject *self, PyObject *args)
1169{
1170 char *str;
1171 if (!PyArg_ParseTuple(args, "y", &str))
1172 return NULL;
1173 return PyBytes_FromString(str);
1174}
1175
1176static PyObject *
1177getargs_y_star(PyObject *self, PyObject *args)
1178{
1179 Py_buffer buffer;
1180 PyObject *bytes;
1181 if (!PyArg_ParseTuple(args, "y*", &buffer))
1182 return NULL;
1183 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1184 PyBuffer_Release(&buffer);
1185 return bytes;
1186}
1187
1188static PyObject *
1189getargs_y_hash(PyObject *self, PyObject *args)
1190{
1191 char *str;
1192 Py_ssize_t size;
1193 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1194 return NULL;
1195 return PyBytes_FromStringAndSize(str, size);
1196}
1197
1198static PyObject *
1199getargs_u(PyObject *self, PyObject *args)
1200{
1201 Py_UNICODE *str;
1202 Py_ssize_t size;
1203 if (!PyArg_ParseTuple(args, "u", &str))
1204 return NULL;
1205 size = Py_UNICODE_strlen(str);
1206 return PyUnicode_FromUnicode(str, size);
1207}
1208
1209static PyObject *
1210getargs_u_hash(PyObject *self, PyObject *args)
1211{
1212 Py_UNICODE *str;
1213 Py_ssize_t size;
1214 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1215 return NULL;
1216 return PyUnicode_FromUnicode(str, size);
1217}
1218
1219static PyObject *
1220getargs_Z(PyObject *self, PyObject *args)
1221{
1222 Py_UNICODE *str;
1223 Py_ssize_t size;
1224 if (!PyArg_ParseTuple(args, "Z", &str))
1225 return NULL;
1226 if (str != NULL) {
1227 size = Py_UNICODE_strlen(str);
1228 return PyUnicode_FromUnicode(str, size);
1229 } else
1230 Py_RETURN_NONE;
1231}
1232
1233static PyObject *
1234getargs_Z_hash(PyObject *self, PyObject *args)
1235{
1236 Py_UNICODE *str;
1237 Py_ssize_t size;
1238 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1239 return NULL;
1240 if (str != NULL)
1241 return PyUnicode_FromUnicode(str, size);
1242 else
1243 Py_RETURN_NONE;
1244}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001245
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001246/* Test the s and z codes for PyArg_ParseTuple.
1247*/
1248static PyObject *
1249test_s_code(PyObject *self)
1250{
1251 /* Unicode strings should be accepted */
1252 PyObject *tuple, *obj;
1253 char *value;
1254
1255 tuple = PyTuple_New(1);
1256 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001258
1259 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001261 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001263
1264 PyTuple_SET_ITEM(tuple, 0, obj);
1265
1266 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001268 */
1269 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001271
1272 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001274
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001275 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001276 Py_RETURN_NONE;
1277}
1278
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001279static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001280parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001281{
Larry Hastings8f904da2012-06-22 03:56:29 -07001282 PyObject *sub_args;
1283 PyObject *sub_kwargs;
1284 char *sub_format;
1285 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001286
Larry Hastings8f904da2012-06-22 03:56:29 -07001287 Py_ssize_t i, size;
1288 char *keywords[8 + 1]; /* space for NULL at end */
1289 PyObject *o;
1290 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001291
Larry Hastings8f904da2012-06-22 03:56:29 -07001292 int result;
1293 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001294
Larry Hastings22701e82012-08-08 14:52:22 -07001295 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001296
Larry Hastings8f904da2012-06-22 03:56:29 -07001297 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1298 &sub_args, &sub_kwargs,
1299 &sub_format, &sub_keywords))
1300 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001301
Larry Hastings8f904da2012-06-22 03:56:29 -07001302 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1303 PyErr_SetString(PyExc_ValueError,
1304 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1305 return NULL;
1306 }
1307
1308 memset(buffers, 0, sizeof(buffers));
1309 memset(converted, 0, sizeof(converted));
1310 memset(keywords, 0, sizeof(keywords));
1311
1312 size = PySequence_Fast_GET_SIZE(sub_keywords);
1313 if (size > 8) {
1314 PyErr_SetString(PyExc_ValueError,
1315 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1316 goto exit;
1317 }
1318
1319 for (i = 0; i < size; i++) {
1320 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1321 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1322 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001323 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001324 goto exit;
1325 }
1326 keywords[i] = PyBytes_AS_STRING(converted[i]);
1327 }
1328
1329 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1330 sub_format, keywords,
1331 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1332 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1333
1334 if (result) {
1335 return_value = Py_None;
1336 Py_INCREF(Py_None);
1337 }
1338
1339exit:
1340 size = sizeof(converted) / sizeof(converted[0]);
1341 for (i = 0; i < size; i++) {
1342 Py_XDECREF(converted[i]);
1343 }
1344 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001345}
1346
Benjamin Peterson92035012008-12-27 16:00:54 +00001347static volatile int x;
1348
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001349/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1350 of an error.
1351*/
1352static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001353test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001354{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 PyObject *tuple, *obj;
1356 Py_UNICODE *value;
1357 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1360 /* Just use the macro and check that it compiles */
1361 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 tuple = PyTuple_New(1);
1364 if (tuple == NULL)
1365 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 obj = PyUnicode_Decode("test", strlen("test"),
1368 "ascii", NULL);
1369 if (obj == NULL)
1370 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 value = 0;
1375 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1376 return NULL;
1377 if (value != PyUnicode_AS_UNICODE(obj))
1378 return raiseTestError("test_u_code",
1379 "u code returned wrong value for u'test'");
1380 value = 0;
1381 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1382 return NULL;
1383 if (value != PyUnicode_AS_UNICODE(obj) ||
1384 len != PyUnicode_GET_SIZE(obj))
1385 return raiseTestError("test_u_code",
1386 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 Py_DECREF(tuple);
1389 Py_INCREF(Py_None);
1390 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001391}
1392
Guido van Rossumfb67be22007-08-29 18:38:11 +00001393/* Test Z and Z# codes for PyArg_ParseTuple */
1394static PyObject *
1395test_Z_code(PyObject *self)
1396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001398 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 tuple = PyTuple_New(2);
1402 if (tuple == NULL)
1403 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 obj = PyUnicode_FromString("test");
1406 PyTuple_SET_ITEM(tuple, 0, obj);
1407 Py_INCREF(Py_None);
1408 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 /* swap values on purpose */
1411 value1 = NULL;
1412 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 /* Test Z for both values */
1415 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1416 return NULL;
1417 if (value1 != PyUnicode_AS_UNICODE(obj))
1418 return raiseTestError("test_Z_code",
1419 "Z code returned wrong value for 'test'");
1420 if (value2 != NULL)
1421 return raiseTestError("test_Z_code",
1422 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 value1 = NULL;
1425 value2 = PyUnicode_AS_UNICODE(obj);
1426 len1 = -1;
1427 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 /* Test Z# for both values */
1430 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1431 &value2, &len2) < 0)
1432 return NULL;
1433 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1434 len1 != PyUnicode_GET_SIZE(obj))
1435 return raiseTestError("test_Z_code",
1436 "Z# code returned wrong values for 'test'");
1437 if (value2 != NULL ||
1438 len2 != 0)
1439 return raiseTestError("test_Z_code",
1440 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 Py_DECREF(tuple);
1443 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001444}
1445
Thomas Wouters477c8d52006-05-27 19:21:47 +00001446static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001447test_widechar(PyObject *self)
1448{
1449#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1451 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001452 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001453#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1455 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001456#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1460 if (wide == NULL)
1461 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1464 if (utf8 == NULL) {
1465 Py_DECREF(wide);
1466 return NULL;
1467 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001468
Victor Stinner8ef18872011-11-21 02:06:57 +01001469 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 Py_DECREF(wide);
1471 Py_DECREF(utf8);
1472 return raiseTestError("test_widechar",
1473 "wide string and utf8 string "
1474 "have different length");
1475 }
1476 if (PyUnicode_Compare(wide, utf8)) {
1477 Py_DECREF(wide);
1478 Py_DECREF(utf8);
1479 if (PyErr_Occurred())
1480 return NULL;
1481 return raiseTestError("test_widechar",
1482 "wide string and utf8 string "
1483 "are different");
1484 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 Py_DECREF(wide);
1487 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001488
1489#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1490 wide = PyUnicode_FromWideChar(invalid, 1);
1491 if (wide == NULL)
1492 PyErr_Clear();
1493 else
1494 return raiseTestError("test_widechar",
1495 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1496
1497 wide = PyUnicode_FromUnicode(invalid, 1);
1498 if (wide == NULL)
1499 PyErr_Clear();
1500 else
1501 return raiseTestError("test_widechar",
1502 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001503
1504 wide = PyUnicode_FromUnicode(NULL, 1);
1505 if (wide == NULL)
1506 return NULL;
1507 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001508 if (_PyUnicode_Ready(wide) < 0) {
1509 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001510 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001511 }
1512 else {
1513 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001514 return raiseTestError("test_widechar",
1515 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001516 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001517#endif
1518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001520}
1521
1522static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001523unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001524{
1525 PyObject *unicode, *result;
1526 Py_ssize_t buflen, size;
1527 wchar_t *buffer;
1528
1529 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1530 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001531 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001532 if (buffer == NULL)
1533 return PyErr_NoMemory();
1534
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001535 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001536 if (size == -1) {
1537 PyMem_Free(buffer);
1538 return NULL;
1539 }
1540
1541 if (size < buflen)
1542 buflen = size + 1;
1543 else
1544 buflen = size;
1545 result = PyUnicode_FromWideChar(buffer, buflen);
1546 PyMem_Free(buffer);
1547 if (result == NULL)
1548 return NULL;
1549
1550 return Py_BuildValue("(Nn)", result, size);
1551}
1552
1553static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001554unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001555{
1556 PyObject *unicode, *result;
1557 Py_ssize_t size;
1558 wchar_t *buffer;
1559
1560 if (!PyArg_ParseTuple(args, "U", &unicode))
1561 return NULL;
1562
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001563 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001564 if (buffer == NULL)
1565 return NULL;
1566
1567 result = PyUnicode_FromWideChar(buffer, size + 1);
1568 PyMem_Free(buffer);
1569 if (result == NULL)
1570 return NULL;
1571 return Py_BuildValue("(Nn)", result, size);
1572}
1573
1574static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001575unicode_encodedecimal(PyObject *self, PyObject *args)
1576{
1577 Py_UNICODE *unicode;
1578 Py_ssize_t length;
1579 char *errors = NULL;
1580 PyObject *decimal;
1581 Py_ssize_t decimal_length, new_length;
1582 int res;
1583
1584 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1585 return NULL;
1586
1587 decimal_length = length * 7; /* len('&#8364;') */
1588 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1589 if (decimal == NULL)
1590 return NULL;
1591
1592 res = PyUnicode_EncodeDecimal(unicode, length,
1593 PyBytes_AS_STRING(decimal),
1594 errors);
1595 if (res < 0) {
1596 Py_DECREF(decimal);
1597 return NULL;
1598 }
1599
1600 new_length = strlen(PyBytes_AS_STRING(decimal));
1601 assert(new_length <= decimal_length);
1602 res = _PyBytes_Resize(&decimal, new_length);
1603 if (res < 0)
1604 return NULL;
1605
1606 return decimal;
1607}
1608
1609static PyObject *
1610unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1611{
1612 Py_UNICODE *unicode;
1613 Py_ssize_t length;
1614 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1615 return NULL;
1616 return PyUnicode_TransformDecimalToASCII(unicode, length);
1617}
1618
1619static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001620unicode_legacy_string(PyObject *self, PyObject *args)
1621{
1622 Py_UNICODE *data;
1623 Py_ssize_t len;
1624 PyObject *u;
1625
1626 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1627 return NULL;
1628
1629 u = PyUnicode_FromUnicode(NULL, len);
1630 if (u == NULL)
1631 return NULL;
1632
1633 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1634
1635 if (len > 0) { /* The empty string is always ready. */
1636 assert(!PyUnicode_IS_READY(u));
1637 }
1638
1639 return u;
1640}
1641
1642static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001643getargs_w_star(PyObject *self, PyObject *args)
1644{
1645 Py_buffer buffer;
1646 PyObject *result;
1647 char *str;
1648
1649 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1650 return NULL;
1651
1652 if (2 <= buffer.len) {
1653 str = buffer.buf;
1654 str[0] = '[';
1655 str[buffer.len-1] = ']';
1656 }
1657
1658 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1659 PyBuffer_Release(&buffer);
1660 return result;
1661}
1662
1663
1664static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001665test_empty_argparse(PyObject *self)
1666{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 /* Test that formats can begin with '|'. See issue #4720. */
1668 PyObject *tuple, *dict = NULL;
1669 static char *kwlist[] = {NULL};
1670 int result;
1671 tuple = PyTuple_New(0);
1672 if (!tuple)
1673 return NULL;
1674 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1675 goto done;
1676 dict = PyDict_New();
1677 if (!dict)
1678 goto done;
1679 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00001680 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 Py_DECREF(tuple);
1682 Py_XDECREF(dict);
1683 if (result < 0)
1684 return NULL;
1685 else {
1686 Py_RETURN_NONE;
1687 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001688}
1689
1690static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001691codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 const char *encoding, *errors = NULL;
1694 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1695 &encoding, &errors))
1696 return NULL;
1697 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001698}
1699
Thomas Wouters477c8d52006-05-27 19:21:47 +00001700static PyObject *
1701codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 const char *encoding, *errors = NULL;
1704 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1705 &encoding, &errors))
1706 return NULL;
1707 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001708}
1709
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001710
Tim Peters5b8132f2003-01-31 15:52:05 +00001711/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001712static PyObject *
1713test_long_numbits(PyObject *self)
1714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 struct triple {
1716 long input;
1717 size_t nbits;
1718 int sign;
1719 } testcases[] = {{0, 0, 0},
1720 {1L, 1, 1},
1721 {-1L, 1, -1},
1722 {2L, 2, 1},
1723 {-2L, 2, -1},
1724 {3L, 2, 1},
1725 {-3L, 2, -1},
1726 {4L, 3, 1},
1727 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03001728 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 {-0x7fffL, 15, -1},
1730 {0xffffL, 16, 1},
1731 {-0xffffL, 16, -1},
1732 {0xfffffffL, 28, 1},
1733 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02001734 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001735
Victor Stinner63941882011-09-29 00:42:28 +02001736 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02001737 size_t nbits;
1738 int sign;
1739 PyObject *plong;
1740
1741 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02001742 if (plong == NULL)
1743 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02001744 nbits = _PyLong_NumBits(plong);
1745 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 Py_DECREF(plong);
1748 if (nbits != testcases[i].nbits)
1749 return raiseTestError("test_long_numbits",
1750 "wrong result for _PyLong_NumBits");
1751 if (sign != testcases[i].sign)
1752 return raiseTestError("test_long_numbits",
1753 "wrong result for _PyLong_Sign");
1754 }
1755 Py_INCREF(Py_None);
1756 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001757}
1758
Thomas Heller519a0422007-11-15 20:48:54 +00001759/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00001760
1761static PyObject *
1762test_null_strings(PyObject *self)
1763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
1765 PyObject *tuple = PyTuple_Pack(2, o1, o2);
1766 Py_XDECREF(o1);
1767 Py_XDECREF(o2);
1768 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00001769}
1770
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001771static PyObject *
1772raise_exception(PyObject *self, PyObject *args)
1773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 PyObject *exc;
1775 PyObject *exc_args, *v;
1776 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
1779 &exc, &num_args))
1780 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 exc_args = PyTuple_New(num_args);
1783 if (exc_args == NULL)
1784 return NULL;
1785 for (i = 0; i < num_args; ++i) {
1786 v = PyLong_FromLong(i);
1787 if (v == NULL) {
1788 Py_DECREF(exc_args);
1789 return NULL;
1790 }
1791 PyTuple_SET_ITEM(exc_args, i, v);
1792 }
1793 PyErr_SetObject(exc, exc_args);
1794 Py_DECREF(exc_args);
1795 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001796}
Tim Peters91621db2001-06-12 20:10:01 +00001797
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02001798static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02001799set_errno(PyObject *self, PyObject *args)
1800{
1801 int new_errno;
1802
1803 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
1804 return NULL;
1805
1806 errno = new_errno;
1807 Py_RETURN_NONE;
1808}
1809
1810static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02001811test_set_exc_info(PyObject *self, PyObject *args)
1812{
1813 PyObject *orig_exc;
1814 PyObject *new_type, *new_value, *new_tb;
1815 PyObject *type, *value, *tb;
1816 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
1817 &new_type, &new_value, &new_tb))
1818 return NULL;
1819
1820 PyErr_GetExcInfo(&type, &value, &tb);
1821
1822 Py_INCREF(new_type);
1823 Py_INCREF(new_value);
1824 Py_INCREF(new_tb);
1825 PyErr_SetExcInfo(new_type, new_value, new_tb);
1826
1827 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
1828 Py_XDECREF(type);
1829 Py_XDECREF(value);
1830 Py_XDECREF(tb);
1831 return orig_exc;
1832}
Benjamin Peterson16323982010-02-03 01:13:41 +00001833
1834static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001835
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001836static PyObject *
1837test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 if (PyDateTimeAPI) {
1839 if (test_run_counter) {
1840 /* Probably regrtest.py -R */
1841 Py_RETURN_NONE;
1842 }
1843 else {
1844 PyErr_SetString(PyExc_AssertionError,
1845 "PyDateTime_CAPI somehow initialized");
1846 return NULL;
1847 }
1848 }
1849 test_run_counter++;
1850 PyDateTime_IMPORT;
1851 if (PyDateTimeAPI)
1852 Py_RETURN_NONE;
1853 else
1854 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001855}
1856
Benjamin Peterson16323982010-02-03 01:13:41 +00001857
1858#ifdef WITH_THREAD
1859
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001860/* test_thread_state spawns a thread of its own, and that thread releases
1861 * `thread_done` when it's finished. The driver code has to know when the
1862 * thread finishes, because the thread uses a PyObject (the callable) that
1863 * may go away when the driver finishes. The former lack of this explicit
1864 * synchronization caused rare segfaults, so rare that they were seen only
1865 * on a Mac buildbot (although they were possible on any box).
1866 */
1867static PyThread_type_lock thread_done = NULL;
1868
Benjamin Petersona786b022008-08-25 21:05:21 +00001869static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001870_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 PyObject *rc;
1873 int success;
1874 PyGILState_STATE s = PyGILState_Ensure();
1875 rc = PyObject_CallFunction((PyObject *)callable, "");
1876 success = (rc != NULL);
1877 Py_XDECREF(rc);
1878 PyGILState_Release(s);
1879 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001880}
1881
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001882/* Same thing, but releases `thread_done` when it returns. This variant
1883 * should be called only from threads spawned by test_thread_state().
1884 */
1885static void
1886_make_call_from_thread(void *callable)
1887{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 _make_call(callable);
1889 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001890}
1891
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001892static PyObject *
1893test_thread_state(PyObject *self, PyObject *args)
1894{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 PyObject *fn;
1896 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
1899 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 if (!PyCallable_Check(fn)) {
1902 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1903 fn->ob_type->tp_name);
1904 return NULL;
1905 }
Benjamin Petersona786b022008-08-25 21:05:21 +00001906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 /* Ensure Python is set up for threading */
1908 PyEval_InitThreads();
1909 thread_done = PyThread_allocate_lock();
1910 if (thread_done == NULL)
1911 return PyErr_NoMemory();
1912 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 /* Start a new thread with our callback. */
1915 PyThread_start_new_thread(_make_call_from_thread, fn);
1916 /* Make the callback with the thread lock held by this thread */
1917 success &= _make_call(fn);
1918 /* Do it all again, but this time with the thread-lock released */
1919 Py_BEGIN_ALLOW_THREADS
1920 success &= _make_call(fn);
1921 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1922 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 /* And once more with and without a thread
1925 XXX - should use a lock and work out exactly what we are trying
1926 to test <wink>
1927 */
1928 Py_BEGIN_ALLOW_THREADS
1929 PyThread_start_new_thread(_make_call_from_thread, fn);
1930 success &= _make_call(fn);
1931 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
1932 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 /* Release lock we acquired above. This is required on HP-UX. */
1935 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 PyThread_free_lock(thread_done);
1938 if (!success)
1939 return NULL;
1940 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001941}
Benjamin Petersona54c9092009-01-13 02:11:23 +00001942
1943/* test Py_AddPendingCalls using threads */
1944static int _pending_callback(void *arg)
1945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 /* we assume the argument is callable object to which we own a reference */
1947 PyObject *callable = (PyObject *)arg;
1948 PyObject *r = PyObject_CallObject(callable, NULL);
1949 Py_DECREF(callable);
1950 Py_XDECREF(r);
1951 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001952}
1953
1954/* The following requests n callbacks to _pending_callback. It can be
1955 * run from any python thread.
1956 */
1957PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
1958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 PyObject *callable;
1960 int r;
1961 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
1962 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 /* create the reference for the callbackwhile we hold the lock */
1965 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00001966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001967 Py_BEGIN_ALLOW_THREADS
1968 r = Py_AddPendingCall(&_pending_callback, callable);
1969 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00001970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 if (r<0) {
1972 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
1973 Py_INCREF(Py_False);
1974 return Py_False;
1975 }
1976 Py_INCREF(Py_True);
1977 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00001978}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001979#endif
1980
Neal Norwitzb0d26332007-08-25 00:49:05 +00001981/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001982static PyObject *
1983test_string_from_format(PyObject *self, PyObject *args)
1984{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 PyObject *result;
1986 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001987
Alexander Belopolskye239d232010-12-08 23:31:48 +00001988#define CHECK_1_FORMAT(FORMAT, TYPE) \
1989 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
1990 if (result == NULL) \
1991 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01001992 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00001993 msg = FORMAT " failed at 1"; \
1994 goto Fail; \
1995 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 CHECK_1_FORMAT("%d", int);
1999 CHECK_1_FORMAT("%ld", long);
2000 /* The z width modifier was added in Python 2.5. */
2001 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 /* The u type code was added in Python 2.5. */
2004 CHECK_1_FORMAT("%u", unsigned int);
2005 CHECK_1_FORMAT("%lu", unsigned long);
2006 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002009#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
2011 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002012#endif
2013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002015
2016 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 Py_XDECREF(result);
2018 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002019
2020#undef CHECK_1_FORMAT
2021}
2022
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002023
2024static PyObject *
2025test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2027 int result;
2028 if (py_s == NULL)
2029 return NULL;
2030 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2031 Py_DECREF(py_s);
2032 if (!result) {
2033 PyErr_SetString(TestError, "Python string ending in NULL "
2034 "should not compare equal to c string.");
2035 return NULL;
2036 }
2037 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002038}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002039
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002040/* This is here to provide a docstring for test_descr. */
2041static PyObject *
2042test_with_docstring(PyObject *self)
2043{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002045}
2046
Mark Dickinson725bfd82009-05-03 20:33:40 +00002047/* Test PyOS_string_to_double. */
2048static PyObject *
2049test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 double result;
2051 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053#define CHECK_STRING(STR, expected) \
2054 result = PyOS_string_to_double(STR, NULL, NULL); \
2055 if (result == -1.0 && PyErr_Occurred()) \
2056 return NULL; \
2057 if (result != expected) { \
2058 msg = "conversion of " STR " to float failed"; \
2059 goto fail; \
2060 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062#define CHECK_INVALID(STR) \
2063 result = PyOS_string_to_double(STR, NULL, NULL); \
2064 if (result == -1.0 && PyErr_Occurred()) { \
2065 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2066 PyErr_Clear(); \
2067 else \
2068 return NULL; \
2069 } \
2070 else { \
2071 msg = "conversion of " STR " didn't raise ValueError"; \
2072 goto fail; \
2073 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 CHECK_STRING("0.1", 0.1);
2076 CHECK_STRING("1.234", 1.234);
2077 CHECK_STRING("-1.35", -1.35);
2078 CHECK_STRING(".1e01", 1.0);
2079 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 CHECK_INVALID(" 0.1");
2082 CHECK_INVALID("\t\n-3");
2083 CHECK_INVALID(".123 ");
2084 CHECK_INVALID("3\n");
2085 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002088 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002090#undef CHECK_STRING
2091#undef CHECK_INVALID
2092}
2093
2094
Benjamin Petersonb173f782009-05-05 22:31:58 +00002095/* Coverage testing of capsule objects. */
2096
2097static const char *capsule_name = "capsule name";
2098static char *capsule_pointer = "capsule pointer";
2099static char *capsule_context = "capsule context";
2100static const char *capsule_error = NULL;
2101static int
2102capsule_destructor_call_count = 0;
2103
2104static void
2105capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 capsule_destructor_call_count++;
2107 if (PyCapsule_GetContext(o) != capsule_context) {
2108 capsule_error = "context did not match in destructor!";
2109 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2110 capsule_error = "destructor did not match in destructor! (woah!)";
2111 } else if (PyCapsule_GetName(o) != capsule_name) {
2112 capsule_error = "name did not match in destructor!";
2113 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2114 capsule_error = "pointer did not match in destructor!";
2115 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002116}
2117
2118typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 char *name;
2120 char *module;
2121 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002122} known_capsule;
2123
2124static PyObject *
2125test_capsule(PyObject *self, PyObject *args)
2126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002127 PyObject *object;
2128 const char *error = NULL;
2129 void *pointer;
2130 void *pointer2;
2131 known_capsule known_capsules[] = {
2132 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2133 KNOWN_CAPSULE("_socket", "CAPI"),
2134 KNOWN_CAPSULE("_curses", "_C_API"),
2135 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2136 { NULL, NULL },
2137 };
2138 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002139
2140#define FAIL(x) { error = (x); goto exit; }
2141
2142#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143 if (capsule_error) { \
2144 FAIL(capsule_error); \
2145 } \
2146 else if (!capsule_destructor_call_count) { \
2147 FAIL("destructor not called!"); \
2148 } \
2149 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2152 PyCapsule_SetContext(object, capsule_context);
2153 capsule_destructor(object);
2154 CHECK_DESTRUCTOR;
2155 Py_DECREF(object);
2156 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 object = PyCapsule_New(known, "ignored", NULL);
2159 PyCapsule_SetPointer(object, capsule_pointer);
2160 PyCapsule_SetName(object, capsule_name);
2161 PyCapsule_SetDestructor(object, capsule_destructor);
2162 PyCapsule_SetContext(object, capsule_context);
2163 capsule_destructor(object);
2164 CHECK_DESTRUCTOR;
2165 /* intentionally access using the wrong name */
2166 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2167 if (!PyErr_Occurred()) {
2168 FAIL("PyCapsule_GetPointer should have failed but did not!");
2169 }
2170 PyErr_Clear();
2171 if (pointer2) {
2172 if (pointer2 == capsule_pointer) {
2173 FAIL("PyCapsule_GetPointer should not have"
2174 " returned the internal pointer!");
2175 } else {
2176 FAIL("PyCapsule_GetPointer should have "
2177 "returned NULL pointer but did not!");
2178 }
2179 }
2180 PyCapsule_SetDestructor(object, NULL);
2181 Py_DECREF(object);
2182 if (capsule_destructor_call_count) {
2183 FAIL("destructor called when it should not have been!");
2184 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 for (known = &known_capsules[0]; known->module != NULL; known++) {
2187 /* yeah, ordinarily I wouldn't do this either,
2188 but it's fine for this test harness.
2189 */
2190 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002191#undef FAIL
2192#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002193 { \
2194 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2195 x, known->module, known->attribute); \
2196 error = buffer; \
2197 goto exit; \
2198 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200 PyObject *module = PyImport_ImportModule(known->module);
2201 if (module) {
2202 pointer = PyCapsule_Import(known->name, 0);
2203 if (!pointer) {
2204 Py_DECREF(module);
2205 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2206 }
2207 object = PyObject_GetAttrString(module, known->attribute);
2208 if (!object) {
2209 Py_DECREF(module);
2210 return NULL;
2211 }
2212 pointer2 = PyCapsule_GetPointer(object,
2213 "weebles wobble but they don't fall down");
2214 if (!PyErr_Occurred()) {
2215 Py_DECREF(object);
2216 Py_DECREF(module);
2217 FAIL("PyCapsule_GetPointer should have failed but did not!");
2218 }
2219 PyErr_Clear();
2220 if (pointer2) {
2221 Py_DECREF(module);
2222 Py_DECREF(object);
2223 if (pointer2 == pointer) {
2224 FAIL("PyCapsule_GetPointer should not have"
2225 " returned its internal pointer!");
2226 } else {
2227 FAIL("PyCapsule_GetPointer should have"
2228 " returned NULL pointer but did not!");
2229 }
2230 }
2231 Py_DECREF(object);
2232 Py_DECREF(module);
2233 }
2234 else
2235 PyErr_Clear();
2236 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002237
2238 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002239 if (error) {
2240 return raiseTestError("test_capsule", error);
2241 }
2242 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002243#undef FAIL
2244}
2245
Guido van Rossumddefaf32007-01-14 03:31:43 +00002246#ifdef HAVE_GETTIMEOFDAY
2247/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002248static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 e->tv_sec -= s->tv_sec;
2251 e->tv_usec -= s->tv_usec;
2252 if (e->tv_usec < 0) {
2253 e->tv_sec -=1;
2254 e->tv_usec += 1000000;
2255 }
2256 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002257}
2258
2259static PyObject *
2260profile_int(PyObject *self, PyObject* args)
2261{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 int i, k;
2263 struct timeval start, stop;
2264 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 /* Test 1: Allocate and immediately deallocate
2267 many small integers */
2268 gettimeofday(&start, NULL);
2269 for(k=0; k < 20000; k++)
2270 for(i=0; i < 1000; i++) {
2271 single = PyLong_FromLong(i);
2272 Py_DECREF(single);
2273 }
2274 gettimeofday(&stop, NULL);
2275 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 /* Test 2: Allocate and immediately deallocate
2278 many large integers */
2279 gettimeofday(&start, NULL);
2280 for(k=0; k < 20000; k++)
2281 for(i=0; i < 1000; i++) {
2282 single = PyLong_FromLong(i+1000000);
2283 Py_DECREF(single);
2284 }
2285 gettimeofday(&stop, NULL);
2286 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 /* Test 3: Allocate a few integers, then release
2289 them all simultaneously. */
2290 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002291 if (multiple == NULL)
2292 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002293 gettimeofday(&start, NULL);
2294 for(k=0; k < 20000; k++) {
2295 for(i=0; i < 1000; i++) {
2296 multiple[i] = PyLong_FromLong(i+1000000);
2297 }
2298 for(i=0; i < 1000; i++) {
2299 Py_DECREF(multiple[i]);
2300 }
2301 }
2302 gettimeofday(&stop, NULL);
2303 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002304 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 /* Test 4: Allocate many integers, then release
2307 them all simultaneously. */
2308 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002309 if (multiple == NULL)
2310 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002311 gettimeofday(&start, NULL);
2312 for(k=0; k < 20; k++) {
2313 for(i=0; i < 1000000; i++) {
2314 multiple[i] = PyLong_FromLong(i+1000000);
2315 }
2316 for(i=0; i < 1000000; i++) {
2317 Py_DECREF(multiple[i]);
2318 }
2319 }
2320 gettimeofday(&stop, NULL);
2321 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002322 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 /* Test 5: Allocate many integers < 32000 */
2325 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002326 if (multiple == NULL)
2327 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 gettimeofday(&start, NULL);
2329 for(k=0; k < 10; k++) {
2330 for(i=0; i < 1000000; i++) {
2331 multiple[i] = PyLong_FromLong(i+1000);
2332 }
2333 for(i=0; i < 1000000; i++) {
2334 Py_DECREF(multiple[i]);
2335 }
2336 }
2337 gettimeofday(&stop, NULL);
2338 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002339 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 /* Test 6: Perform small int addition */
2342 op1 = PyLong_FromLong(1);
2343 gettimeofday(&start, NULL);
2344 for(i=0; i < 10000000; i++) {
2345 result = PyNumber_Add(op1, op1);
2346 Py_DECREF(result);
2347 }
2348 gettimeofday(&stop, NULL);
2349 Py_DECREF(op1);
2350 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 /* Test 7: Perform medium int addition */
2353 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002354 if (op1 == NULL)
2355 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 gettimeofday(&start, NULL);
2357 for(i=0; i < 10000000; i++) {
2358 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002359 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 }
2361 gettimeofday(&stop, NULL);
2362 Py_DECREF(op1);
2363 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 Py_INCREF(Py_None);
2366 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002367}
2368#endif
2369
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002370/* To test the format of tracebacks as printed out. */
2371static PyObject *
2372traceback_print(PyObject *self, PyObject *args)
2373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 PyObject *file;
2375 PyObject *traceback;
2376 int result;
2377
2378 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2379 &traceback, &file))
2380 return NULL;
2381
2382 result = PyTraceBack_Print(traceback, file);
2383 if (result < 0)
2384 return NULL;
2385 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002386}
2387
Benjamin Petersone6528212008-07-15 15:32:09 +00002388/* To test the format of exceptions as printed out. */
2389static PyObject *
2390exception_print(PyObject *self, PyObject *args)
2391{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 PyObject *value;
2393 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 if (!PyArg_ParseTuple(args, "O:exception_print",
2396 &value))
2397 return NULL;
2398 if (!PyExceptionInstance_Check(value)) {
2399 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2400 return NULL;
2401 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 tb = PyException_GetTraceback(value);
2404 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2405 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002407 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002408}
2409
2410
2411
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002412
2413/* reliably raise a MemoryError */
2414static PyObject *
2415raise_memoryerror(PyObject *self)
2416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 PyErr_NoMemory();
2418 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002419}
2420
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002421/* Issue 6012 */
2422static PyObject *str1, *str2;
2423static int
2424failing_converter(PyObject *obj, void *arg)
2425{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 /* Clone str1, then let the conversion fail. */
2427 assert(str1);
2428 str2 = str1;
2429 Py_INCREF(str2);
2430 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002431}
2432static PyObject*
2433argparsing(PyObject *o, PyObject *args)
2434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 PyObject *res;
2436 str1 = str2 = NULL;
2437 if (!PyArg_ParseTuple(args, "O&O&",
2438 PyUnicode_FSConverter, &str1,
2439 failing_converter, &str2)) {
2440 if (!str2)
2441 /* argument converter not called? */
2442 return NULL;
2443 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002444 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 Py_DECREF(str2);
2446 PyErr_Clear();
2447 return res;
2448 }
2449 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002450}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002451
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002452/* To test that the result of PyCode_NewEmpty has the right members. */
2453static PyObject *
2454code_newempty(PyObject *self, PyObject *args)
2455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 const char *filename;
2457 const char *funcname;
2458 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2461 &filename, &funcname, &firstlineno))
2462 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002465}
2466
Georg Brandl1e28a272009-12-28 08:41:01 +00002467/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2468 Run via Lib/test/test_exceptions.py */
2469static PyObject *
2470make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2471{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002472 const char *name;
2473 const char *doc = NULL;
2474 PyObject *base = NULL;
2475 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002477 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2480 "s|sOO:make_exception_with_doc", kwlist,
2481 &name, &doc, &base, &dict))
2482 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002485}
2486
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002487static PyObject *
2488make_memoryview_from_NULL_pointer(PyObject *self)
2489{
2490 Py_buffer info;
2491 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2492 return NULL;
2493 return PyMemoryView_FromBuffer(&info);
2494}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002495
Stefan Krah7213fcc2015-02-01 16:19:23 +01002496static PyObject *
2497test_from_contiguous(PyObject* self, PyObject *noargs)
2498{
2499 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2500 int init[5] = {0, 1, 2, 3, 4};
2501 Py_ssize_t itemsize = sizeof(int);
2502 Py_ssize_t shape = 5;
2503 Py_ssize_t strides = 2 * itemsize;
2504 Py_buffer view = {
2505 data,
2506 NULL,
2507 5 * itemsize,
2508 itemsize,
2509 1,
2510 1,
2511 NULL,
2512 &shape,
2513 &strides,
2514 NULL,
2515 NULL
2516 };
2517 int *ptr;
2518 int i;
2519
2520 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2521 ptr = view.buf;
2522 for (i = 0; i < 5; i++) {
2523 if (ptr[2*i] != i) {
2524 PyErr_SetString(TestError,
2525 "test_from_contiguous: incorrect result");
2526 return NULL;
2527 }
2528 }
2529
2530 view.buf = &data[8];
2531 view.strides[0] = -2 * itemsize;
2532
2533 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2534 ptr = view.buf;
2535 for (i = 0; i < 5; i++) {
2536 if (*(ptr-2*i) != i) {
2537 PyErr_SetString(TestError,
2538 "test_from_contiguous: incorrect result");
2539 return NULL;
2540 }
2541 }
2542
2543 Py_RETURN_NONE;
2544}
Stefan Krah650c1e82015-02-03 21:43:23 +01002545
Stefan Kraha7559c02015-02-03 22:27:21 +01002546#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01002547extern PyTypeObject _PyBytesIOBuffer_Type;
2548
Stefan Krah5178d912015-02-03 16:57:21 +01002549static PyObject *
2550test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
2551{
Stefan Krah650c1e82015-02-03 21:43:23 +01002552 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01002553 PyObject *b;
2554 char *dummy[1];
2555 int ret, match;
2556
Stefan Krah650c1e82015-02-03 21:43:23 +01002557 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01002558 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
2559 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2560 PyErr_Clear();
2561 if (ret != -1 || match == 0)
2562 goto error;
2563
Stefan Krah650c1e82015-02-03 21:43:23 +01002564 /* bytesiobuf_getbuffer() */
2565 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01002566 if (b == NULL) {
2567 return NULL;
2568 }
2569
2570 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
2571 Py_DECREF(b);
2572 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2573 PyErr_Clear();
2574 if (ret != -1 || match == 0)
2575 goto error;
2576
2577 Py_RETURN_NONE;
2578
2579error:
2580 PyErr_SetString(TestError,
2581 "test_pep3118_obsolete_write_locks: failure");
2582 return NULL;
2583}
Stefan Kraha7559c02015-02-03 22:27:21 +01002584#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002585
Stefan Krah650c1e82015-02-03 21:43:23 +01002586/* This tests functions that historically supported write locks. It is
2587 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
2588 is entitled to segfault in that case. */
2589static PyObject *
2590getbuffer_with_null_view(PyObject* self, PyObject *obj)
2591{
2592 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
2593 return NULL;
2594
2595 Py_RETURN_NONE;
2596}
2597
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002598/* Test that the fatal error from not having a current thread doesn't
2599 cause an infinite loop. Run via Lib/test/test_capi.py */
2600static PyObject *
2601crash_no_current_thread(PyObject *self)
2602{
2603 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002604 /* Using PyThreadState_Get() directly allows the test to pass in
2605 !pydebug mode. However, the test only actually tests anything
2606 in pydebug mode, since that's where the infinite loop was in
2607 the first place. */
2608 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002609 Py_END_ALLOW_THREADS
2610 return NULL;
2611}
2612
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002613/* To run some code in a sub-interpreter. */
2614static PyObject *
2615run_in_subinterp(PyObject *self, PyObject *args)
2616{
2617 const char *code;
2618 int r;
2619 PyThreadState *substate, *mainstate;
2620
2621 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2622 &code))
2623 return NULL;
2624
2625 mainstate = PyThreadState_Get();
2626
2627 PyThreadState_Swap(NULL);
2628
2629 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002630 if (substate == NULL) {
2631 /* Since no new thread state was created, there is no exception to
2632 propagate; raise a fresh one after swapping in the old thread
2633 state. */
2634 PyThreadState_Swap(mainstate);
2635 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2636 return NULL;
2637 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002638 r = PyRun_SimpleString(code);
2639 Py_EndInterpreter(substate);
2640
2641 PyThreadState_Swap(mainstate);
2642
2643 return PyLong_FromLong(r);
2644}
2645
Victor Stinner3c1b3792014-02-17 00:02:43 +01002646static int
2647check_time_rounding(int round)
2648{
Victor Stinnera695f832015-03-30 03:57:14 +02002649 if (round != _PyTime_ROUND_FLOOR && round != _PyTime_ROUND_CEILING) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01002650 PyErr_SetString(PyExc_ValueError, "invalid rounding");
2651 return -1;
2652 }
2653 return 0;
2654}
2655
Victor Stinner5d272cc2012-03-13 13:35:55 +01002656static PyObject *
2657test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2658{
2659 PyObject *obj;
2660 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002661 int round;
2662 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002663 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002664 if (check_time_rounding(round) < 0)
2665 return NULL;
2666 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002667 return NULL;
2668 return _PyLong_FromTime_t(sec);
2669}
2670
2671static PyObject *
2672test_pytime_object_to_timeval(PyObject *self, PyObject *args)
2673{
2674 PyObject *obj;
2675 time_t sec;
2676 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002677 int round;
2678 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002679 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002680 if (check_time_rounding(round) < 0)
2681 return NULL;
2682 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002683 return NULL;
2684 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
2685}
2686
Victor Stinner643cd682012-03-02 22:54:03 +01002687static PyObject *
2688test_pytime_object_to_timespec(PyObject *self, PyObject *args)
2689{
2690 PyObject *obj;
2691 time_t sec;
2692 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002693 int round;
2694 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01002695 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002696 if (check_time_rounding(round) < 0)
2697 return NULL;
2698 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01002699 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01002700 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01002701}
2702
Antoine Pitrou796564c2013-07-30 19:59:21 +02002703static void
2704slot_tp_del(PyObject *self)
2705{
2706 _Py_IDENTIFIER(__tp_del__);
2707 PyObject *del, *res;
2708 PyObject *error_type, *error_value, *error_traceback;
2709
2710 /* Temporarily resurrect the object. */
2711 assert(self->ob_refcnt == 0);
2712 self->ob_refcnt = 1;
2713
2714 /* Save the current exception, if any. */
2715 PyErr_Fetch(&error_type, &error_value, &error_traceback);
2716
2717 /* Execute __del__ method, if any. */
2718 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
2719 if (del != NULL) {
2720 res = PyEval_CallObject(del, NULL);
2721 if (res == NULL)
2722 PyErr_WriteUnraisable(del);
2723 else
2724 Py_DECREF(res);
2725 Py_DECREF(del);
2726 }
2727
2728 /* Restore the saved exception. */
2729 PyErr_Restore(error_type, error_value, error_traceback);
2730
2731 /* Undo the temporary resurrection; can't use DECREF here, it would
2732 * cause a recursive call.
2733 */
2734 assert(self->ob_refcnt > 0);
2735 if (--self->ob_refcnt == 0)
2736 return; /* this is the normal path out */
2737
2738 /* __del__ resurrected it! Make it look like the original Py_DECREF
2739 * never happened.
2740 */
2741 {
2742 Py_ssize_t refcnt = self->ob_refcnt;
2743 _Py_NewReference(self);
2744 self->ob_refcnt = refcnt;
2745 }
2746 assert(!PyType_IS_GC(Py_TYPE(self)) ||
2747 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
2748 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
2749 * we need to undo that. */
2750 _Py_DEC_REFTOTAL;
2751 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
2752 * chain, so no more to do there.
2753 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
2754 * _Py_NewReference bumped tp_allocs: both of those need to be
2755 * undone.
2756 */
2757#ifdef COUNT_ALLOCS
2758 --Py_TYPE(self)->tp_frees;
2759 --Py_TYPE(self)->tp_allocs;
2760#endif
2761}
2762
2763static PyObject *
2764with_tp_del(PyObject *self, PyObject *args)
2765{
2766 PyObject *obj;
2767 PyTypeObject *tp;
2768
2769 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
2770 return NULL;
2771 tp = (PyTypeObject *) obj;
2772 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
2773 PyErr_Format(PyExc_TypeError,
2774 "heap type expected, got %R", obj);
2775 return NULL;
2776 }
2777 tp->tp_del = slot_tp_del;
2778 Py_INCREF(obj);
2779 return obj;
2780}
2781
Antoine Pitroub349e4c2014-08-06 19:31:40 -04002782static PyMethodDef ml;
2783
2784static PyObject *
2785create_cfunction(PyObject *self, PyObject *args)
2786{
2787 return PyCFunction_NewEx(&ml, self, NULL);
2788}
2789
2790static PyMethodDef ml = {
2791 "create_cfunction",
2792 create_cfunction,
2793 METH_NOARGS,
2794 NULL
2795};
2796
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07002797static PyObject *
2798_test_incref(PyObject *ob)
2799{
2800 Py_INCREF(ob);
2801 return ob;
2802}
2803
2804static PyObject *
2805test_xincref_doesnt_leak(PyObject *ob)
2806{
2807 PyObject *obj = PyLong_FromLong(0);
2808 Py_XINCREF(_test_incref(obj));
2809 Py_DECREF(obj);
2810 Py_DECREF(obj);
2811 Py_DECREF(obj);
2812 Py_RETURN_NONE;
2813}
2814
2815static PyObject *
2816test_incref_doesnt_leak(PyObject *ob)
2817{
2818 PyObject *obj = PyLong_FromLong(0);
2819 Py_INCREF(_test_incref(obj));
2820 Py_DECREF(obj);
2821 Py_DECREF(obj);
2822 Py_DECREF(obj);
2823 Py_RETURN_NONE;
2824}
2825
2826static PyObject *
2827test_xdecref_doesnt_leak(PyObject *ob)
2828{
2829 Py_XDECREF(PyLong_FromLong(0));
2830 Py_RETURN_NONE;
2831}
2832
2833static PyObject *
2834test_decref_doesnt_leak(PyObject *ob)
2835{
2836 Py_DECREF(PyLong_FromLong(0));
2837 Py_RETURN_NONE;
2838}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002839
Victor Stinner0507bf52013-07-07 02:05:46 +02002840static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02002841test_incref_decref_API(PyObject *ob)
2842{
2843 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02002844 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02002845 Py_DecRef(obj);
2846 Py_DecRef(obj);
2847 Py_RETURN_NONE;
2848}
2849
2850static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02002851test_pymem_alloc0(PyObject *self)
2852{
2853 void *ptr;
2854
Victor Stinnerdb067af2014-05-02 22:31:14 +02002855 ptr = PyMem_RawMalloc(0);
2856 if (ptr == NULL) {
2857 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
2858 return NULL;
2859 }
2860 PyMem_RawFree(ptr);
2861
2862 ptr = PyMem_RawCalloc(0, 0);
2863 if (ptr == NULL) {
2864 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
2865 return NULL;
2866 }
2867 PyMem_RawFree(ptr);
2868
Victor Stinner0507bf52013-07-07 02:05:46 +02002869 ptr = PyMem_Malloc(0);
2870 if (ptr == NULL) {
2871 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
2872 return NULL;
2873 }
2874 PyMem_Free(ptr);
2875
Victor Stinnerdb067af2014-05-02 22:31:14 +02002876 ptr = PyMem_Calloc(0, 0);
2877 if (ptr == NULL) {
2878 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
2879 return NULL;
2880 }
2881 PyMem_Free(ptr);
2882
Victor Stinner0507bf52013-07-07 02:05:46 +02002883 ptr = PyObject_Malloc(0);
2884 if (ptr == NULL) {
2885 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
2886 return NULL;
2887 }
2888 PyObject_Free(ptr);
2889
Victor Stinnerdb067af2014-05-02 22:31:14 +02002890 ptr = PyObject_Calloc(0, 0);
2891 if (ptr == NULL) {
2892 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
2893 return NULL;
2894 }
2895 PyObject_Free(ptr);
2896
Victor Stinner0507bf52013-07-07 02:05:46 +02002897 Py_RETURN_NONE;
2898}
2899
2900typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02002901 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02002902
2903 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02002904 size_t calloc_nelem;
2905 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02002906 void *realloc_ptr;
2907 size_t realloc_new_size;
2908 void *free_ptr;
2909} alloc_hook_t;
2910
2911static void* hook_malloc (void* ctx, size_t size)
2912{
2913 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2914 hook->malloc_size = size;
2915 return hook->alloc.malloc(hook->alloc.ctx, size);
2916}
2917
Victor Stinnerdb067af2014-05-02 22:31:14 +02002918static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
2919{
2920 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2921 hook->calloc_nelem = nelem;
2922 hook->calloc_elsize = elsize;
2923 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
2924}
2925
Victor Stinner0507bf52013-07-07 02:05:46 +02002926static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
2927{
2928 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2929 hook->realloc_ptr = ptr;
2930 hook->realloc_new_size = new_size;
2931 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
2932}
2933
2934static void hook_free (void *ctx, void *ptr)
2935{
2936 alloc_hook_t *hook = (alloc_hook_t *)ctx;
2937 hook->free_ptr = ptr;
2938 hook->alloc.free(hook->alloc.ctx, ptr);
2939}
2940
2941static PyObject *
2942test_setallocators(PyMemAllocatorDomain domain)
2943{
2944 PyObject *res = NULL;
2945 const char *error_msg;
2946 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02002947 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02002948 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02002949 void *ptr, *ptr2;
2950
Victor Stinnerdb067af2014-05-02 22:31:14 +02002951 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02002952
2953 alloc.ctx = &hook;
2954 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02002955 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02002956 alloc.realloc = &hook_realloc;
2957 alloc.free = &hook_free;
2958 PyMem_GetAllocator(domain, &hook.alloc);
2959 PyMem_SetAllocator(domain, &alloc);
2960
2961 size = 42;
2962 switch(domain)
2963 {
2964 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
2965 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
2966 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
2967 default: ptr = NULL; break;
2968 }
2969
2970 if (ptr == NULL) {
2971 error_msg = "malloc failed";
2972 goto fail;
2973 }
2974
2975 if (hook.malloc_size != size) {
2976 error_msg = "malloc invalid size";
2977 goto fail;
2978 }
2979
2980 size2 = 200;
2981 switch(domain)
2982 {
2983 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
2984 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
2985 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02002986 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02002987 }
2988
2989 if (ptr2 == NULL) {
2990 error_msg = "realloc failed";
2991 goto fail;
2992 }
2993
2994 if (hook.realloc_ptr != ptr
2995 || hook.realloc_new_size != size2) {
2996 error_msg = "realloc invalid parameters";
2997 goto fail;
2998 }
2999
3000 switch(domain)
3001 {
3002 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3003 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3004 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3005 }
3006
3007 if (hook.free_ptr != ptr2) {
3008 error_msg = "free invalid pointer";
3009 goto fail;
3010 }
3011
Victor Stinnerdb067af2014-05-02 22:31:14 +02003012 nelem = 2;
3013 elsize = 5;
3014 switch(domain)
3015 {
3016 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3017 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3018 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3019 default: ptr = NULL; break;
3020 }
3021
3022 if (ptr == NULL) {
3023 error_msg = "calloc failed";
3024 goto fail;
3025 }
3026
3027 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3028 error_msg = "calloc invalid nelem or elsize";
3029 goto fail;
3030 }
3031
3032 switch(domain)
3033 {
3034 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3035 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3036 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3037 }
3038
Victor Stinner0507bf52013-07-07 02:05:46 +02003039 Py_INCREF(Py_None);
3040 res = Py_None;
3041 goto finally;
3042
3043fail:
3044 PyErr_SetString(PyExc_RuntimeError, error_msg);
3045
3046finally:
3047 PyMem_SetAllocator(domain, &hook.alloc);
3048 return res;
3049}
3050
3051static PyObject *
3052test_pymem_setrawallocators(PyObject *self)
3053{
3054 return test_setallocators(PYMEM_DOMAIN_RAW);
3055}
3056
3057static PyObject *
3058test_pymem_setallocators(PyObject *self)
3059{
3060 return test_setallocators(PYMEM_DOMAIN_MEM);
3061}
3062
3063static PyObject *
3064test_pyobject_setallocators(PyObject *self)
3065{
3066 return test_setallocators(PYMEM_DOMAIN_OBJ);
3067}
3068
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003069PyDoc_STRVAR(docstring_empty,
3070""
3071);
3072
3073PyDoc_STRVAR(docstring_no_signature,
3074"This docstring has no signature."
3075);
3076
3077PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003078"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003079"\n"
3080"This docstring has an invalid signature."
3081);
3082
Larry Hastings2623c8c2014-02-08 22:15:29 -08003083PyDoc_STRVAR(docstring_with_invalid_signature2,
3084"docstring_with_invalid_signature2($module, /, boo)\n"
3085"\n"
3086"--\n"
3087"\n"
3088"This docstring also has an invalid signature."
3089);
3090
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003091PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003092"docstring_with_signature($module, /, sig)\n"
3093"--\n"
3094"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003095"This docstring has a valid signature."
3096);
3097
Zachary Ware8ef887c2015-04-13 18:22:35 -05003098PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3099"docstring_with_signature_but_no_doc($module, /, sig)\n"
3100"--\n"
3101"\n"
3102);
3103
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003104PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003105"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3106"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003107"\n"
3108"\n"
3109"This docstring has a valid signature and some extra newlines."
3110);
3111
Larry Hastings16c51912014-01-07 11:53:01 -08003112PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003113"docstring_with_signature_with_defaults(module, s='avocado',\n"
3114" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3115" local=the_number_three, sys=sys.maxsize,\n"
3116" exp=sys.maxsize - 1)\n"
3117"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003118"\n"
3119"\n"
3120"\n"
3121"This docstring has a valid signature with parameters,\n"
3122"and the parameters take defaults of varying types."
3123);
3124
Victor Stinner258e4d32013-12-13 02:30:12 +01003125#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003126typedef struct {
3127 PyThread_type_lock start_event;
3128 PyThread_type_lock exit_event;
3129 PyObject *callback;
3130} test_c_thread_t;
3131
3132static void
3133temporary_c_thread(void *data)
3134{
3135 test_c_thread_t *test_c_thread = data;
3136 PyGILState_STATE state;
3137 PyObject *res;
3138
3139 PyThread_release_lock(test_c_thread->start_event);
3140
3141 /* Allocate a Python thread state for this thread */
3142 state = PyGILState_Ensure();
3143
3144 res = PyObject_CallFunction(test_c_thread->callback, "", NULL);
3145 Py_CLEAR(test_c_thread->callback);
3146
3147 if (res == NULL) {
3148 PyErr_Print();
3149 }
3150 else {
3151 Py_DECREF(res);
3152 }
3153
3154 /* Destroy the Python thread state for this thread */
3155 PyGILState_Release(state);
3156
3157 PyThread_release_lock(test_c_thread->exit_event);
3158
3159 PyThread_exit_thread();
3160}
3161
3162static PyObject *
3163call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3164{
3165 PyObject *res = NULL;
3166 test_c_thread_t test_c_thread;
3167 long thread;
3168
3169 PyEval_InitThreads();
3170
3171 test_c_thread.start_event = PyThread_allocate_lock();
3172 test_c_thread.exit_event = PyThread_allocate_lock();
3173 test_c_thread.callback = NULL;
3174 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3175 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3176 goto exit;
3177 }
3178
3179 Py_INCREF(callback);
3180 test_c_thread.callback = callback;
3181
3182 PyThread_acquire_lock(test_c_thread.start_event, 1);
3183 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3184
3185 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3186 if (thread == -1) {
3187 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3188 PyThread_release_lock(test_c_thread.start_event);
3189 PyThread_release_lock(test_c_thread.exit_event);
3190 goto exit;
3191 }
3192
3193 PyThread_acquire_lock(test_c_thread.start_event, 1);
3194 PyThread_release_lock(test_c_thread.start_event);
3195
3196 Py_BEGIN_ALLOW_THREADS
3197 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3198 PyThread_release_lock(test_c_thread.exit_event);
3199 Py_END_ALLOW_THREADS
3200
3201 Py_INCREF(Py_None);
3202 res = Py_None;
3203
3204exit:
3205 Py_CLEAR(test_c_thread.callback);
3206 if (test_c_thread.start_event)
3207 PyThread_free_lock(test_c_thread.start_event);
3208 if (test_c_thread.exit_event)
3209 PyThread_free_lock(test_c_thread.exit_event);
3210 return res;
3211}
Victor Stinner258e4d32013-12-13 02:30:12 +01003212#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003213
Victor Stinner56e8c292014-07-21 12:30:22 +02003214static PyObject*
3215test_raise_signal(PyObject* self, PyObject *args)
3216{
3217 int signum, err;
3218
3219 if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0)
3220 return NULL;
3221
3222 err = raise(signum);
3223 if (err)
3224 return PyErr_SetFromErrno(PyExc_OSError);
3225
3226 if (PyErr_CheckSignals() < 0)
3227 return NULL;
3228
3229 Py_RETURN_NONE;
3230}
3231
Serhiy Storchakab5181342015-02-06 08:58:56 +02003232/* marshal */
3233
3234static PyObject*
3235pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3236{
3237 long value;
3238 char *filename;
3239 int version;
3240 FILE *fp;
3241
3242 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3243 &value, &filename, &version))
3244 return NULL;
3245
3246 fp = fopen(filename, "wb");
3247 if (fp == NULL) {
3248 PyErr_SetFromErrno(PyExc_OSError);
3249 return NULL;
3250 }
3251
3252 PyMarshal_WriteLongToFile(value, fp, version);
3253
3254 fclose(fp);
3255 if (PyErr_Occurred())
3256 return NULL;
3257 Py_RETURN_NONE;
3258}
3259
3260static PyObject*
3261pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3262{
3263 PyObject *obj;
3264 char *filename;
3265 int version;
3266 FILE *fp;
3267
3268 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3269 &obj, &filename, &version))
3270 return NULL;
3271
3272 fp = fopen(filename, "wb");
3273 if (fp == NULL) {
3274 PyErr_SetFromErrno(PyExc_OSError);
3275 return NULL;
3276 }
3277
3278 PyMarshal_WriteObjectToFile(obj, fp, version);
3279
3280 fclose(fp);
3281 if (PyErr_Occurred())
3282 return NULL;
3283 Py_RETURN_NONE;
3284}
3285
3286static PyObject*
3287pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3288{
3289 int value;
3290 long pos;
3291 char *filename;
3292 FILE *fp;
3293
3294 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3295 return NULL;
3296
3297 fp = fopen(filename, "rb");
3298 if (fp == NULL) {
3299 PyErr_SetFromErrno(PyExc_OSError);
3300 return NULL;
3301 }
3302
3303 value = PyMarshal_ReadShortFromFile(fp);
3304 pos = ftell(fp);
3305
3306 fclose(fp);
3307 if (PyErr_Occurred())
3308 return NULL;
3309 return Py_BuildValue("il", value, pos);
3310}
3311
3312static PyObject*
3313pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3314{
3315 long value, pos;
3316 char *filename;
3317 FILE *fp;
3318
3319 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3320 return NULL;
3321
3322 fp = fopen(filename, "rb");
3323 if (fp == NULL) {
3324 PyErr_SetFromErrno(PyExc_OSError);
3325 return NULL;
3326 }
3327
3328 value = PyMarshal_ReadLongFromFile(fp);
3329 pos = ftell(fp);
3330
3331 fclose(fp);
3332 if (PyErr_Occurred())
3333 return NULL;
3334 return Py_BuildValue("ll", value, pos);
3335}
3336
3337static PyObject*
3338pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3339{
3340 PyObject *obj;
3341 long pos;
3342 char *filename;
3343 FILE *fp;
3344
3345 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3346 return NULL;
3347
3348 fp = fopen(filename, "rb");
3349 if (fp == NULL) {
3350 PyErr_SetFromErrno(PyExc_OSError);
3351 return NULL;
3352 }
3353
3354 obj = PyMarshal_ReadLastObjectFromFile(fp);
3355 pos = ftell(fp);
3356
3357 fclose(fp);
3358 return Py_BuildValue("Nl", obj, pos);
3359}
3360
3361static PyObject*
3362pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3363{
3364 PyObject *obj;
3365 long pos;
3366 char *filename;
3367 FILE *fp;
3368
3369 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3370 return NULL;
3371
3372 fp = fopen(filename, "rb");
3373 if (fp == NULL) {
3374 PyErr_SetFromErrno(PyExc_OSError);
3375 return NULL;
3376 }
3377
3378 obj = PyMarshal_ReadObjectFromFile(fp);
3379 pos = ftell(fp);
3380
3381 fclose(fp);
3382 return Py_BuildValue("Nl", obj, pos);
3383}
3384
Victor Stinnerefde1462015-03-21 15:04:43 +01003385static PyObject*
3386return_null_without_error(PyObject *self, PyObject *args)
3387{
3388 /* invalid call: return NULL without setting an error,
3389 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3390 PyErr_Clear();
3391 return NULL;
3392}
3393
3394static PyObject*
3395return_result_with_error(PyObject *self, PyObject *args)
3396{
3397 /* invalid call: return a result with an error set,
3398 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3399 PyErr_SetNone(PyExc_ValueError);
3400 Py_RETURN_NONE;
3401}
3402
Victor Stinner992c43f2015-03-27 17:12:45 +01003403static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02003404test_pytime_fromseconds(PyObject *self, PyObject *args)
3405{
3406 int seconds;
3407 _PyTime_t ts;
3408
3409 if (!PyArg_ParseTuple(args, "i", &seconds))
3410 return NULL;
3411 ts = _PyTime_FromSeconds(seconds);
3412 return _PyTime_AsNanosecondsObject(ts);
3413}
3414
3415static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01003416test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
3417{
3418 PyObject *obj;
3419 int round;
3420 _PyTime_t ts;
3421
3422 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
3423 return NULL;
3424 if (check_time_rounding(round) < 0)
3425 return NULL;
3426 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
3427 return NULL;
3428 return _PyTime_AsNanosecondsObject(ts);
3429}
3430
Victor Stinner4bfb4602015-03-27 22:27:24 +01003431static PyObject *
3432test_pytime_assecondsdouble(PyObject *self, PyObject *args)
3433{
3434 PY_LONG_LONG ns;
3435 _PyTime_t ts;
3436 double d;
3437
3438 if (!PyArg_ParseTuple(args, "L", &ns))
3439 return NULL;
3440 ts = _PyTime_FromNanoseconds(ns);
3441 d = _PyTime_AsSecondsDouble(ts);
3442 return PyFloat_FromDouble(d);
3443}
3444
Victor Stinner95e9cef2015-03-28 01:26:47 +01003445static PyObject *
3446test_PyTime_AsTimeval(PyObject *self, PyObject *args)
3447{
3448 PY_LONG_LONG ns;
3449 int round;
3450 _PyTime_t t;
3451 struct timeval tv;
3452 PyObject *seconds;
3453
3454 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3455 return NULL;
3456 if (check_time_rounding(round) < 0)
3457 return NULL;
3458 t = _PyTime_FromNanoseconds(ns);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +02003459 if (_PyTime_AsTimeval(t, &tv, round) < 0)
Victor Stinner95e9cef2015-03-28 01:26:47 +01003460 return NULL;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003461
3462 seconds = PyLong_FromLong((PY_LONG_LONG)tv.tv_sec);
3463 if (seconds == NULL)
3464 return NULL;
3465 return Py_BuildValue("Nl", seconds, tv.tv_usec);
3466}
3467
Victor Stinner34dc0f42015-03-27 18:19:03 +01003468#ifdef HAVE_CLOCK_GETTIME
3469static PyObject *
3470test_PyTime_AsTimespec(PyObject *self, PyObject *args)
3471{
3472 PY_LONG_LONG ns;
3473 _PyTime_t t;
3474 struct timespec ts;
3475
3476 if (!PyArg_ParseTuple(args, "L", &ns))
3477 return NULL;
3478 t = _PyTime_FromNanoseconds(ns);
3479 if (_PyTime_AsTimespec(t, &ts) == -1)
3480 return NULL;
3481 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
3482}
3483#endif
3484
Victor Stinner62d1c702015-04-01 17:47:07 +02003485static PyObject *
3486test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
3487{
3488 PY_LONG_LONG ns;
3489 int round;
3490 _PyTime_t t, ms;
3491
3492 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3493 return NULL;
3494 if (check_time_rounding(round) < 0)
3495 return NULL;
3496 t = _PyTime_FromNanoseconds(ns);
3497 ms = _PyTime_AsMilliseconds(t, round);
3498 /* This conversion rely on the fact that _PyTime_t is a number of
3499 nanoseconds */
3500 return _PyTime_AsNanosecondsObject(ms);
3501}
3502
3503static PyObject *
3504test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
3505{
3506 PY_LONG_LONG ns;
3507 int round;
3508 _PyTime_t t, ms;
3509
3510 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3511 return NULL;
3512 if (check_time_rounding(round) < 0)
3513 return NULL;
3514 t = _PyTime_FromNanoseconds(ns);
3515 ms = _PyTime_AsMicroseconds(t, round);
3516 /* This conversion rely on the fact that _PyTime_t is a number of
3517 nanoseconds */
3518 return _PyTime_AsNanosecondsObject(ms);
3519}
3520
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003521
Tim Peters9ea17ac2001-02-02 05:57:15 +00003522static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003523 {"raise_exception", raise_exception, METH_VARARGS},
3524 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02003525 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003526 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01003527 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003528 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
3529 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
3530 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
3531 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003532 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003533 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
3534 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
3535 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
3536 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02003537 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003538 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
3539 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02003540 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
3541 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003542 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
3543 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
3544 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07003545 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003546 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
3547 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
3548 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
3549 PyDoc_STR("This is a pretty normal docstring.")},
3550 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
3551 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
3552 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01003553 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01003554#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01003555 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01003556#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01003557 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003558 {"getargs_tuple", getargs_tuple, METH_VARARGS},
3559 {"getargs_keywords", (PyCFunction)getargs_keywords,
3560 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00003561 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
3562 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003563 {"getargs_b", getargs_b, METH_VARARGS},
3564 {"getargs_B", getargs_B, METH_VARARGS},
3565 {"getargs_h", getargs_h, METH_VARARGS},
3566 {"getargs_H", getargs_H, METH_VARARGS},
3567 {"getargs_I", getargs_I, METH_VARARGS},
3568 {"getargs_k", getargs_k, METH_VARARGS},
3569 {"getargs_i", getargs_i, METH_VARARGS},
3570 {"getargs_l", getargs_l, METH_VARARGS},
3571 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07003572 {"getargs_p", getargs_p, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00003573#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003574 {"getargs_L", getargs_L, METH_VARARGS},
3575 {"getargs_K", getargs_K, METH_VARARGS},
3576 {"test_longlong_api", test_longlong_api, METH_NOARGS},
3577 {"test_long_long_and_overflow",
3578 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
3579 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003580#endif
Eli Bendersky906b88f2011-07-29 07:05:08 +03003581 {"getargs_c", getargs_c, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003582 {"getargs_s", getargs_s, METH_VARARGS},
3583 {"getargs_s_star", getargs_s_star, METH_VARARGS},
3584 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
3585 {"getargs_z", getargs_z, METH_VARARGS},
3586 {"getargs_z_star", getargs_z_star, METH_VARARGS},
3587 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
3588 {"getargs_y", getargs_y, METH_VARARGS},
3589 {"getargs_y_star", getargs_y_star, METH_VARARGS},
3590 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
3591 {"getargs_u", getargs_u, METH_VARARGS},
3592 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
3593 {"getargs_Z", getargs_Z, METH_VARARGS},
3594 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00003595 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003596 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003597 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003598 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003599 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003600 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
3601 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
3602 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
3603 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01003604 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
3605 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
3606 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
3607 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01003608 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003609#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00003610 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003611 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003612#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00003613#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00003614 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00003615#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00003616 {"traceback_print", traceback_print, METH_VARARGS},
3617 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02003618 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00003619 {"argparsing", argparsing, METH_VARARGS},
3620 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003621 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
3622 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003623 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
3624 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003625 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003626 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01003627 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
3628 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01003629 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02003630 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003631 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02003632 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02003633 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
3634 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02003635 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
3636 {"test_pymem_setallocators",
3637 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
3638 {"test_pyobject_setallocators",
3639 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003640 {"no_docstring",
3641 (PyCFunction)test_with_docstring, METH_NOARGS},
3642 {"docstring_empty",
3643 (PyCFunction)test_with_docstring, METH_NOARGS,
3644 docstring_empty},
3645 {"docstring_no_signature",
3646 (PyCFunction)test_with_docstring, METH_NOARGS,
3647 docstring_no_signature},
3648 {"docstring_with_invalid_signature",
3649 (PyCFunction)test_with_docstring, METH_NOARGS,
3650 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08003651 {"docstring_with_invalid_signature2",
3652 (PyCFunction)test_with_docstring, METH_NOARGS,
3653 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003654 {"docstring_with_signature",
3655 (PyCFunction)test_with_docstring, METH_NOARGS,
3656 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05003657 {"docstring_with_signature_but_no_doc",
3658 (PyCFunction)test_with_docstring, METH_NOARGS,
3659 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003660 {"docstring_with_signature_and_extra_newlines",
3661 (PyCFunction)test_with_docstring, METH_NOARGS,
3662 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08003663 {"docstring_with_signature_with_defaults",
3664 (PyCFunction)test_with_docstring, METH_NOARGS,
3665 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02003666 {"raise_signal",
3667 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01003668#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003669 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
3670 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01003671#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02003672 {"pymarshal_write_long_to_file",
3673 pymarshal_write_long_to_file, METH_VARARGS},
3674 {"pymarshal_write_object_to_file",
3675 pymarshal_write_object_to_file, METH_VARARGS},
3676 {"pymarshal_read_short_from_file",
3677 pymarshal_read_short_from_file, METH_VARARGS},
3678 {"pymarshal_read_long_from_file",
3679 pymarshal_read_long_from_file, METH_VARARGS},
3680 {"pymarshal_read_last_object_from_file",
3681 pymarshal_read_last_object_from_file, METH_VARARGS},
3682 {"pymarshal_read_object_from_file",
3683 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01003684 {"return_null_without_error",
3685 return_null_without_error, METH_NOARGS},
3686 {"return_result_with_error",
3687 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02003688 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01003689 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
3690 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01003691 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01003692#ifdef HAVE_CLOCK_GETTIME
3693 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
3694#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02003695 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
3696 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003697 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00003698};
3699
Thomas Hellera4ea6032003-04-17 18:55:45 +00003700#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
3701
Thomas Wouters89f507f2006-12-13 04:49:30 +00003702typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003703 char bool_member;
3704 char byte_member;
3705 unsigned char ubyte_member;
3706 short short_member;
3707 unsigned short ushort_member;
3708 int int_member;
3709 unsigned int uint_member;
3710 long long_member;
3711 unsigned long ulong_member;
3712 Py_ssize_t pyssizet_member;
3713 float float_member;
3714 double double_member;
3715 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003716#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003717 PY_LONG_LONG longlong_member;
3718 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003719#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003720} all_structmembers;
3721
3722typedef struct {
3723 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003724 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003725} test_structmembers;
3726
3727static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003728 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
3729 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
3730 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
3731 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
3732 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
3733 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
3734 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
3735 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
3736 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
3737 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
3738 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
3739 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
3740 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003741#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003742 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
3743 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003745 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00003746};
3747
3748
Christian Heimes1af737c2008-01-23 08:24:23 +00003749static PyObject *
3750test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
3751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003752 static char *keywords[] = {
3753 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
3754 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
3755 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00003756#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003757 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00003758#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003759 NULL};
3760 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00003761#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00003763#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003764 ;
3765 test_structmembers *ob;
3766 const char *s = NULL;
3767 Py_ssize_t string_len = 0;
3768 ob = PyObject_New(test_structmembers, type);
3769 if (ob == NULL)
3770 return NULL;
3771 memset(&ob->structmembers, 0, sizeof(all_structmembers));
3772 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
3773 &ob->structmembers.bool_member,
3774 &ob->structmembers.byte_member,
3775 &ob->structmembers.ubyte_member,
3776 &ob->structmembers.short_member,
3777 &ob->structmembers.ushort_member,
3778 &ob->structmembers.int_member,
3779 &ob->structmembers.uint_member,
3780 &ob->structmembers.long_member,
3781 &ob->structmembers.ulong_member,
3782 &ob->structmembers.pyssizet_member,
3783 &ob->structmembers.float_member,
3784 &ob->structmembers.double_member,
3785 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00003786#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003787 , &ob->structmembers.longlong_member,
3788 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00003789#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003790 )) {
3791 Py_DECREF(ob);
3792 return NULL;
3793 }
3794 if (s != NULL) {
3795 if (string_len > 5) {
3796 Py_DECREF(ob);
3797 PyErr_SetString(PyExc_ValueError, "string too long");
3798 return NULL;
3799 }
3800 strcpy(ob->structmembers.inplace_member, s);
3801 }
3802 else {
3803 strcpy(ob->structmembers.inplace_member, "");
3804 }
3805 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003806}
3807
Christian Heimes1af737c2008-01-23 08:24:23 +00003808static void
3809test_structmembers_free(PyObject *ob)
3810{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003811 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003812}
3813
3814static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003815 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003816 "test_structmembersType",
3817 sizeof(test_structmembers), /* tp_basicsize */
3818 0, /* tp_itemsize */
3819 test_structmembers_free, /* destructor tp_dealloc */
3820 0, /* tp_print */
3821 0, /* tp_getattr */
3822 0, /* tp_setattr */
3823 0, /* tp_reserved */
3824 0, /* tp_repr */
3825 0, /* tp_as_number */
3826 0, /* tp_as_sequence */
3827 0, /* tp_as_mapping */
3828 0, /* tp_hash */
3829 0, /* tp_call */
3830 0, /* tp_str */
3831 PyObject_GenericGetAttr, /* tp_getattro */
3832 PyObject_GenericSetAttr, /* tp_setattro */
3833 0, /* tp_as_buffer */
3834 0, /* tp_flags */
3835 "Type containing all structmember types",
3836 0, /* traverseproc tp_traverse */
3837 0, /* tp_clear */
3838 0, /* tp_richcompare */
3839 0, /* tp_weaklistoffset */
3840 0, /* tp_iter */
3841 0, /* tp_iternext */
3842 0, /* tp_methods */
3843 test_members, /* tp_members */
3844 0,
3845 0,
3846 0,
3847 0,
3848 0,
3849 0,
3850 0,
3851 0,
3852 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003853};
3854
3855
Benjamin Petersond51374e2014-04-09 23:55:56 -04003856typedef struct {
3857 PyObject_HEAD
3858} matmulObject;
3859
3860static PyObject *
3861matmulType_matmul(PyObject *self, PyObject *other)
3862{
3863 return Py_BuildValue("(sOO)", "matmul", self, other);
3864}
3865
3866static PyObject *
3867matmulType_imatmul(PyObject *self, PyObject *other)
3868{
3869 return Py_BuildValue("(sOO)", "imatmul", self, other);
3870}
3871
3872static void
3873matmulType_dealloc(PyObject *self)
3874{
Zachary Ware420dc562014-04-23 13:51:27 -05003875 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04003876}
3877
3878static PyNumberMethods matmulType_as_number = {
3879 0, /* nb_add */
3880 0, /* nb_subtract */
3881 0, /* nb_multiply */
3882 0, /* nb_remainde r*/
3883 0, /* nb_divmod */
3884 0, /* nb_power */
3885 0, /* nb_negative */
3886 0, /* tp_positive */
3887 0, /* tp_absolute */
3888 0, /* tp_bool */
3889 0, /* nb_invert */
3890 0, /* nb_lshift */
3891 0, /* nb_rshift */
3892 0, /* nb_and */
3893 0, /* nb_xor */
3894 0, /* nb_or */
3895 0, /* nb_int */
3896 0, /* nb_reserved */
3897 0, /* nb_float */
3898 0, /* nb_inplace_add */
3899 0, /* nb_inplace_subtract */
3900 0, /* nb_inplace_multiply */
3901 0, /* nb_inplace_remainder */
3902 0, /* nb_inplace_power */
3903 0, /* nb_inplace_lshift */
3904 0, /* nb_inplace_rshift */
3905 0, /* nb_inplace_and */
3906 0, /* nb_inplace_xor */
3907 0, /* nb_inplace_or */
3908 0, /* nb_floor_divide */
3909 0, /* nb_true_divide */
3910 0, /* nb_inplace_floor_divide */
3911 0, /* nb_inplace_true_divide */
3912 0, /* nb_index */
3913 matmulType_matmul, /* nb_matrix_multiply */
3914 matmulType_imatmul /* nb_matrix_inplace_multiply */
3915};
3916
3917static PyTypeObject matmulType = {
3918 PyVarObject_HEAD_INIT(NULL, 0)
3919 "matmulType",
3920 sizeof(matmulObject), /* tp_basicsize */
3921 0, /* tp_itemsize */
3922 matmulType_dealloc, /* destructor tp_dealloc */
3923 0, /* tp_print */
3924 0, /* tp_getattr */
3925 0, /* tp_setattr */
3926 0, /* tp_reserved */
3927 0, /* tp_repr */
3928 &matmulType_as_number, /* tp_as_number */
3929 0, /* tp_as_sequence */
3930 0, /* tp_as_mapping */
3931 0, /* tp_hash */
3932 0, /* tp_call */
3933 0, /* tp_str */
3934 PyObject_GenericGetAttr, /* tp_getattro */
3935 PyObject_GenericSetAttr, /* tp_setattro */
3936 0, /* tp_as_buffer */
3937 0, /* tp_flags */
3938 "C level type with matrix operations defined",
3939 0, /* traverseproc tp_traverse */
3940 0, /* tp_clear */
3941 0, /* tp_richcompare */
3942 0, /* tp_weaklistoffset */
3943 0, /* tp_iter */
3944 0, /* tp_iternext */
3945 0, /* tp_methods */
3946 0, /* tp_members */
3947 0,
3948 0,
3949 0,
3950 0,
3951 0,
3952 0,
3953 0,
3954 0,
3955 PyType_GenericNew, /* tp_new */
3956 PyObject_Del, /* tp_free */
3957};
3958
Martin v. Löwis1a214512008-06-11 05:26:20 +00003959
Yury Selivanov75445082015-05-11 22:57:16 -04003960typedef struct {
3961 PyObject_HEAD
3962 PyObject *ao_iterator;
3963} awaitObject;
3964
3965
3966static PyObject *
3967awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3968{
3969 PyObject *v;
3970 awaitObject *ao;
3971
3972 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
3973 return NULL;
3974
3975 ao = (awaitObject *)type->tp_alloc(type, 0);
3976 if (ao == NULL) {
3977 return NULL;
3978 }
3979
3980 Py_INCREF(v);
3981 ao->ao_iterator = v;
3982
3983 return (PyObject *)ao;
3984}
3985
3986
3987static void
3988awaitObject_dealloc(awaitObject *ao)
3989{
3990 Py_CLEAR(ao->ao_iterator);
3991 Py_TYPE(ao)->tp_free(ao);
3992}
3993
3994
3995static PyObject *
3996awaitObject_await(awaitObject *ao)
3997{
3998 Py_INCREF(ao->ao_iterator);
3999 return ao->ao_iterator;
4000}
4001
4002static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04004003 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04004004 0, /* am_aiter */
4005 0 /* am_anext */
4006};
4007
4008
4009static PyTypeObject awaitType = {
4010 PyVarObject_HEAD_INIT(NULL, 0)
4011 "awaitType",
4012 sizeof(awaitObject), /* tp_basicsize */
4013 0, /* tp_itemsize */
4014 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
4015 0, /* tp_print */
4016 0, /* tp_getattr */
4017 0, /* tp_setattr */
4018 &awaitType_as_async, /* tp_as_async */
4019 0, /* tp_repr */
4020 0, /* tp_as_number */
4021 0, /* tp_as_sequence */
4022 0, /* tp_as_mapping */
4023 0, /* tp_hash */
4024 0, /* tp_call */
4025 0, /* tp_str */
4026 PyObject_GenericGetAttr, /* tp_getattro */
4027 PyObject_GenericSetAttr, /* tp_setattro */
4028 0, /* tp_as_buffer */
4029 0, /* tp_flags */
4030 "C level type with tp_as_async",
4031 0, /* traverseproc tp_traverse */
4032 0, /* tp_clear */
4033 0, /* tp_richcompare */
4034 0, /* tp_weaklistoffset */
4035 0, /* tp_iter */
4036 0, /* tp_iternext */
4037 0, /* tp_methods */
4038 0, /* tp_members */
4039 0,
4040 0,
4041 0,
4042 0,
4043 0,
4044 0,
4045 0,
4046 0,
4047 awaitObject_new, /* tp_new */
4048 PyObject_Del, /* tp_free */
4049};
4050
4051
Martin v. Löwis1a214512008-06-11 05:26:20 +00004052static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004053 PyModuleDef_HEAD_INIT,
4054 "_testcapi",
4055 NULL,
4056 -1,
4057 TestMethods,
4058 NULL,
4059 NULL,
4060 NULL,
4061 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004062};
4063
Nick Coghland5cacbb2015-05-23 22:24:10 +10004064/* Per PEP 489, this module will not be converted to multi-phase initialization
4065 */
4066
Mark Hammond62b1ab12002-07-23 06:31:15 +00004067PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004068PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00004069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004070 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004072 m = PyModule_Create(&_testcapimodule);
4073 if (m == NULL)
4074 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004076 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00004077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004078 Py_TYPE(&test_structmembersType)=&PyType_Type;
4079 Py_INCREF(&test_structmembersType);
4080 /* don't use a name starting with "test", since we don't want
4081 test_capi to automatically call this */
4082 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004083 if (PyType_Ready(&matmulType) < 0)
4084 return NULL;
4085 Py_INCREF(&matmulType);
4086 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004087
Yury Selivanov75445082015-05-11 22:57:16 -04004088 if (PyType_Ready(&awaitType) < 0)
4089 return NULL;
4090 Py_INCREF(&awaitType);
4091 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
4092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004093 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
4094 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
4095 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
4096 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
4097 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
4098 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
4099 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
4100 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
4101 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
4102 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
4103 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
4104 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
4105 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
4106 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
4107 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
4108 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
4109 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
4110 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
4111 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
4112 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
4113 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
4114 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
4115 Py_INCREF(&PyInstanceMethod_Type);
4116 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00004117
Larry Hastings2a727912014-01-16 11:32:01 -08004118 PyModule_AddIntConstant(m, "the_number_three", 3);
4119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004120 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
4121 Py_INCREF(TestError);
4122 PyModule_AddObject(m, "error", TestError);
4123 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004124}