blob: 19fea201ce0947a467e219893b1bc24fdb8ada02 [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
Serhiy Storchakaacef5de2016-05-16 09:55:32 +0300875static PyObject *
876get_args(PyObject *self, PyObject *args)
877{
878 if (args == NULL) {
879 args = Py_None;
880 }
881 Py_INCREF(args);
882 return args;
883}
884
885static PyObject *
886get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
887{
888 if (kwargs == NULL) {
889 kwargs = Py_None;
890 }
891 Py_INCREF(kwargs);
892 return kwargs;
893}
894
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000895/* Test tuple argument processing */
896static PyObject *
897getargs_tuple(PyObject *self, PyObject *args)
898{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 int a, b, c;
900 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
901 return NULL;
902 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000903}
904
Christian Heimes380f7f22008-02-28 11:19:05 +0000905/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +0000906static PyObject *
907getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +0000908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
910 static char *fmt="(ii)i|(i(ii))(iii)i";
911 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +0000912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
914 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
915 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
916 return NULL;
917 return Py_BuildValue("iiiiiiiiii",
918 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
919 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +0000920}
921
Larry Hastings83a9f482012-03-20 20:06:16 +0000922/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
923static PyObject *
924getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
925{
926 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
927 int required = -1;
928 int optional = -1;
929 int keyword_only = -1;
930
931 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
932 &required, &optional, &keyword_only))
933 return NULL;
934 return Py_BuildValue("iii", required, optional, keyword_only);
935}
936
Thomas Heller3457e4b2003-04-24 16:14:27 +0000937/* Functions to call PyArg_ParseTuple with integer format codes,
938 and return the result.
939*/
Thomas Hellera4ea6032003-04-17 18:55:45 +0000940static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000941getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000942{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 unsigned char value;
944 if (!PyArg_ParseTuple(args, "b", &value))
945 return NULL;
946 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000947}
948
Thomas Heller3457e4b2003-04-24 16:14:27 +0000949static PyObject *
950getargs_B(PyObject *self, PyObject *args)
951{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 unsigned char value;
953 if (!PyArg_ParseTuple(args, "B", &value))
954 return NULL;
955 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000956}
957
958static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +0000959getargs_h(PyObject *self, PyObject *args)
960{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 short value;
962 if (!PyArg_ParseTuple(args, "h", &value))
963 return NULL;
964 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +0000965}
966
967static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +0000968getargs_H(PyObject *self, PyObject *args)
969{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 unsigned short value;
971 if (!PyArg_ParseTuple(args, "H", &value))
972 return NULL;
973 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000974}
975
976static PyObject *
977getargs_I(PyObject *self, PyObject *args)
978{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 unsigned int value;
980 if (!PyArg_ParseTuple(args, "I", &value))
981 return NULL;
982 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000983}
984
985static PyObject *
986getargs_k(PyObject *self, PyObject *args)
987{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 unsigned long value;
989 if (!PyArg_ParseTuple(args, "k", &value))
990 return NULL;
991 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +0000992}
993
994static PyObject *
995getargs_i(PyObject *self, PyObject *args)
996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 int value;
998 if (!PyArg_ParseTuple(args, "i", &value))
999 return NULL;
1000 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001001}
1002
Thomas Hellera4ea6032003-04-17 18:55:45 +00001003static PyObject *
1004getargs_l(PyObject *self, PyObject *args)
1005{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 long value;
1007 if (!PyArg_ParseTuple(args, "l", &value))
1008 return NULL;
1009 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001010}
1011
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001012static PyObject *
1013getargs_n(PyObject *self, PyObject *args)
1014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 Py_ssize_t value;
1016 if (!PyArg_ParseTuple(args, "n", &value))
1017 return NULL;
1018 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001019}
1020
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001021static PyObject *
1022getargs_p(PyObject *self, PyObject *args)
1023{
1024 int value;
1025 if (!PyArg_ParseTuple(args, "p", &value))
1026 return NULL;
1027 return PyLong_FromLong(value);
1028}
1029
Thomas Hellera4ea6032003-04-17 18:55:45 +00001030#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +00001031static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001032getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 PY_LONG_LONG value;
1035 if (!PyArg_ParseTuple(args, "L", &value))
1036 return NULL;
1037 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001038}
1039
Thomas Hellera4ea6032003-04-17 18:55:45 +00001040static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001041getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 unsigned PY_LONG_LONG value;
1044 if (!PyArg_ParseTuple(args, "K", &value))
1045 return NULL;
1046 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001047}
1048#endif
1049
1050/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +00001051 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001052static PyObject *
1053test_k_code(PyObject *self)
1054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 PyObject *tuple, *num;
1056 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 tuple = PyTuple_New(1);
1059 if (tuple == NULL)
1060 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 /* a number larger than ULONG_MAX even on 64-bit platforms */
1063 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1064 if (num == NULL)
1065 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 value = PyLong_AsUnsignedLongMask(num);
1068 if (value != ULONG_MAX)
1069 return raiseTestError("test_k_code",
1070 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 value = 0;
1075 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1076 return NULL;
1077 if (value != ULONG_MAX)
1078 return raiseTestError("test_k_code",
1079 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 Py_DECREF(num);
1082 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1083 if (num == NULL)
1084 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 value = PyLong_AsUnsignedLongMask(num);
1087 if (value != (unsigned long)-0x42)
1088 return raiseTestError("test_k_code",
1089 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 value = 0;
1094 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1095 return NULL;
1096 if (value != (unsigned long)-0x42)
1097 return raiseTestError("test_k_code",
1098 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 Py_DECREF(tuple);
1101 Py_INCREF(Py_None);
1102 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001103}
1104
Victor Stinner06e49dd2010-06-13 18:21:50 +00001105static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001106getargs_c(PyObject *self, PyObject *args)
1107{
1108 char c;
1109 if (!PyArg_ParseTuple(args, "c", &c))
1110 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001111 return PyLong_FromLong((unsigned char)c);
1112}
1113
1114static PyObject *
1115getargs_C(PyObject *self, PyObject *args)
1116{
1117 int c;
1118 if (!PyArg_ParseTuple(args, "C", &c))
1119 return NULL;
1120 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001121}
1122
1123static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001124getargs_s(PyObject *self, PyObject *args)
1125{
1126 char *str;
1127 if (!PyArg_ParseTuple(args, "s", &str))
1128 return NULL;
1129 return PyBytes_FromString(str);
1130}
1131
1132static PyObject *
1133getargs_s_star(PyObject *self, PyObject *args)
1134{
1135 Py_buffer buffer;
1136 PyObject *bytes;
1137 if (!PyArg_ParseTuple(args, "s*", &buffer))
1138 return NULL;
1139 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1140 PyBuffer_Release(&buffer);
1141 return bytes;
1142}
1143
1144static PyObject *
1145getargs_s_hash(PyObject *self, PyObject *args)
1146{
1147 char *str;
1148 Py_ssize_t size;
1149 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1150 return NULL;
1151 return PyBytes_FromStringAndSize(str, size);
1152}
1153
1154static PyObject *
1155getargs_z(PyObject *self, PyObject *args)
1156{
1157 char *str;
1158 if (!PyArg_ParseTuple(args, "z", &str))
1159 return NULL;
1160 if (str != NULL)
1161 return PyBytes_FromString(str);
1162 else
1163 Py_RETURN_NONE;
1164}
1165
1166static PyObject *
1167getargs_z_star(PyObject *self, PyObject *args)
1168{
1169 Py_buffer buffer;
1170 PyObject *bytes;
1171 if (!PyArg_ParseTuple(args, "z*", &buffer))
1172 return NULL;
1173 if (buffer.buf != NULL)
1174 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1175 else {
1176 Py_INCREF(Py_None);
1177 bytes = Py_None;
1178 }
1179 PyBuffer_Release(&buffer);
1180 return bytes;
1181}
1182
1183static PyObject *
1184getargs_z_hash(PyObject *self, PyObject *args)
1185{
1186 char *str;
1187 Py_ssize_t size;
1188 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1189 return NULL;
1190 if (str != NULL)
1191 return PyBytes_FromStringAndSize(str, size);
1192 else
1193 Py_RETURN_NONE;
1194}
1195
1196static PyObject *
1197getargs_y(PyObject *self, PyObject *args)
1198{
1199 char *str;
1200 if (!PyArg_ParseTuple(args, "y", &str))
1201 return NULL;
1202 return PyBytes_FromString(str);
1203}
1204
1205static PyObject *
1206getargs_y_star(PyObject *self, PyObject *args)
1207{
1208 Py_buffer buffer;
1209 PyObject *bytes;
1210 if (!PyArg_ParseTuple(args, "y*", &buffer))
1211 return NULL;
1212 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1213 PyBuffer_Release(&buffer);
1214 return bytes;
1215}
1216
1217static PyObject *
1218getargs_y_hash(PyObject *self, PyObject *args)
1219{
1220 char *str;
1221 Py_ssize_t size;
1222 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1223 return NULL;
1224 return PyBytes_FromStringAndSize(str, size);
1225}
1226
1227static PyObject *
1228getargs_u(PyObject *self, PyObject *args)
1229{
1230 Py_UNICODE *str;
1231 Py_ssize_t size;
1232 if (!PyArg_ParseTuple(args, "u", &str))
1233 return NULL;
1234 size = Py_UNICODE_strlen(str);
1235 return PyUnicode_FromUnicode(str, size);
1236}
1237
1238static PyObject *
1239getargs_u_hash(PyObject *self, PyObject *args)
1240{
1241 Py_UNICODE *str;
1242 Py_ssize_t size;
1243 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1244 return NULL;
1245 return PyUnicode_FromUnicode(str, size);
1246}
1247
1248static PyObject *
1249getargs_Z(PyObject *self, PyObject *args)
1250{
1251 Py_UNICODE *str;
1252 Py_ssize_t size;
1253 if (!PyArg_ParseTuple(args, "Z", &str))
1254 return NULL;
1255 if (str != NULL) {
1256 size = Py_UNICODE_strlen(str);
1257 return PyUnicode_FromUnicode(str, size);
1258 } else
1259 Py_RETURN_NONE;
1260}
1261
1262static PyObject *
1263getargs_Z_hash(PyObject *self, PyObject *args)
1264{
1265 Py_UNICODE *str;
1266 Py_ssize_t size;
1267 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1268 return NULL;
1269 if (str != NULL)
1270 return PyUnicode_FromUnicode(str, size);
1271 else
1272 Py_RETURN_NONE;
1273}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001274
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001275static PyObject *
1276getargs_es(PyObject *self, PyObject *args)
1277{
1278 PyObject *arg, *result;
1279 const char *encoding = NULL;
1280 char *str;
1281
1282 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1283 return NULL;
1284 if (!PyArg_Parse(arg, "es", encoding, &str))
1285 return NULL;
1286 result = PyBytes_FromString(str);
1287 PyMem_Free(str);
1288 return result;
1289}
1290
1291static PyObject *
1292getargs_et(PyObject *self, PyObject *args)
1293{
1294 PyObject *arg, *result;
1295 const char *encoding = NULL;
1296 char *str;
1297
1298 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1299 return NULL;
1300 if (!PyArg_Parse(arg, "et", encoding, &str))
1301 return NULL;
1302 result = PyBytes_FromString(str);
1303 PyMem_Free(str);
1304 return result;
1305}
1306
1307static PyObject *
1308getargs_es_hash(PyObject *self, PyObject *args)
1309{
1310 PyObject *arg, *result;
1311 const char *encoding = NULL;
1312 PyByteArrayObject *buffer = NULL;
1313 char *str = NULL;
1314 Py_ssize_t size;
1315
1316 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1317 return NULL;
1318 if (buffer != NULL) {
1319 str = PyByteArray_AS_STRING(buffer);
1320 size = PyByteArray_GET_SIZE(buffer);
1321 }
1322 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1323 return NULL;
1324 result = PyBytes_FromStringAndSize(str, size);
1325 if (buffer == NULL)
1326 PyMem_Free(str);
1327 return result;
1328}
1329
1330static PyObject *
1331getargs_et_hash(PyObject *self, PyObject *args)
1332{
1333 PyObject *arg, *result;
1334 const char *encoding = NULL;
1335 PyByteArrayObject *buffer = NULL;
1336 char *str = NULL;
1337 Py_ssize_t size;
1338
1339 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1340 return NULL;
1341 if (buffer != NULL) {
1342 str = PyByteArray_AS_STRING(buffer);
1343 size = PyByteArray_GET_SIZE(buffer);
1344 }
1345 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1346 return NULL;
1347 result = PyBytes_FromStringAndSize(str, size);
1348 if (buffer == NULL)
1349 PyMem_Free(str);
1350 return result;
1351}
1352
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001353/* Test the s and z codes for PyArg_ParseTuple.
1354*/
1355static PyObject *
1356test_s_code(PyObject *self)
1357{
1358 /* Unicode strings should be accepted */
1359 PyObject *tuple, *obj;
1360 char *value;
1361
1362 tuple = PyTuple_New(1);
1363 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001365
1366 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001368 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001370
1371 PyTuple_SET_ITEM(tuple, 0, obj);
1372
1373 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001375 */
1376 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001378
1379 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001381
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001382 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001383 Py_RETURN_NONE;
1384}
1385
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001386static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001387parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001388{
Larry Hastings8f904da2012-06-22 03:56:29 -07001389 PyObject *sub_args;
1390 PyObject *sub_kwargs;
1391 char *sub_format;
1392 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001393
Larry Hastings8f904da2012-06-22 03:56:29 -07001394 Py_ssize_t i, size;
1395 char *keywords[8 + 1]; /* space for NULL at end */
1396 PyObject *o;
1397 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001398
Larry Hastings8f904da2012-06-22 03:56:29 -07001399 int result;
1400 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001401
Larry Hastings22701e82012-08-08 14:52:22 -07001402 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001403
Larry Hastings8f904da2012-06-22 03:56:29 -07001404 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1405 &sub_args, &sub_kwargs,
1406 &sub_format, &sub_keywords))
1407 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001408
Larry Hastings8f904da2012-06-22 03:56:29 -07001409 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1410 PyErr_SetString(PyExc_ValueError,
1411 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1412 return NULL;
1413 }
1414
1415 memset(buffers, 0, sizeof(buffers));
1416 memset(converted, 0, sizeof(converted));
1417 memset(keywords, 0, sizeof(keywords));
1418
1419 size = PySequence_Fast_GET_SIZE(sub_keywords);
1420 if (size > 8) {
1421 PyErr_SetString(PyExc_ValueError,
1422 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1423 goto exit;
1424 }
1425
1426 for (i = 0; i < size; i++) {
1427 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1428 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1429 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001430 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001431 goto exit;
1432 }
1433 keywords[i] = PyBytes_AS_STRING(converted[i]);
1434 }
1435
1436 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1437 sub_format, keywords,
1438 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1439 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1440
1441 if (result) {
1442 return_value = Py_None;
1443 Py_INCREF(Py_None);
1444 }
1445
1446exit:
1447 size = sizeof(converted) / sizeof(converted[0]);
1448 for (i = 0; i < size; i++) {
1449 Py_XDECREF(converted[i]);
1450 }
1451 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001452}
1453
Benjamin Peterson92035012008-12-27 16:00:54 +00001454static volatile int x;
1455
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001456/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1457 of an error.
1458*/
1459static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001460test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 PyObject *tuple, *obj;
1463 Py_UNICODE *value;
1464 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1467 /* Just use the macro and check that it compiles */
1468 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 tuple = PyTuple_New(1);
1471 if (tuple == NULL)
1472 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 obj = PyUnicode_Decode("test", strlen("test"),
1475 "ascii", NULL);
1476 if (obj == NULL)
1477 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 value = 0;
1482 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1483 return NULL;
1484 if (value != PyUnicode_AS_UNICODE(obj))
1485 return raiseTestError("test_u_code",
1486 "u code returned wrong value for u'test'");
1487 value = 0;
1488 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1489 return NULL;
1490 if (value != PyUnicode_AS_UNICODE(obj) ||
1491 len != PyUnicode_GET_SIZE(obj))
1492 return raiseTestError("test_u_code",
1493 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 Py_DECREF(tuple);
1496 Py_INCREF(Py_None);
1497 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001498}
1499
Guido van Rossumfb67be22007-08-29 18:38:11 +00001500/* Test Z and Z# codes for PyArg_ParseTuple */
1501static PyObject *
1502test_Z_code(PyObject *self)
1503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001505 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 tuple = PyTuple_New(2);
1509 if (tuple == NULL)
1510 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 obj = PyUnicode_FromString("test");
1513 PyTuple_SET_ITEM(tuple, 0, obj);
1514 Py_INCREF(Py_None);
1515 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 /* swap values on purpose */
1518 value1 = NULL;
1519 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 /* Test Z for both values */
1522 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1523 return NULL;
1524 if (value1 != PyUnicode_AS_UNICODE(obj))
1525 return raiseTestError("test_Z_code",
1526 "Z code returned wrong value for 'test'");
1527 if (value2 != NULL)
1528 return raiseTestError("test_Z_code",
1529 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 value1 = NULL;
1532 value2 = PyUnicode_AS_UNICODE(obj);
1533 len1 = -1;
1534 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 /* Test Z# for both values */
1537 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1538 &value2, &len2) < 0)
1539 return NULL;
1540 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1541 len1 != PyUnicode_GET_SIZE(obj))
1542 return raiseTestError("test_Z_code",
1543 "Z# code returned wrong values for 'test'");
1544 if (value2 != NULL ||
1545 len2 != 0)
1546 return raiseTestError("test_Z_code",
1547 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 Py_DECREF(tuple);
1550 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001551}
1552
Thomas Wouters477c8d52006-05-27 19:21:47 +00001553static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001554test_widechar(PyObject *self)
1555{
1556#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1558 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001559 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001560#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1562 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1567 if (wide == NULL)
1568 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1571 if (utf8 == NULL) {
1572 Py_DECREF(wide);
1573 return NULL;
1574 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001575
Victor Stinner8ef18872011-11-21 02:06:57 +01001576 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 Py_DECREF(wide);
1578 Py_DECREF(utf8);
1579 return raiseTestError("test_widechar",
1580 "wide string and utf8 string "
1581 "have different length");
1582 }
1583 if (PyUnicode_Compare(wide, utf8)) {
1584 Py_DECREF(wide);
1585 Py_DECREF(utf8);
1586 if (PyErr_Occurred())
1587 return NULL;
1588 return raiseTestError("test_widechar",
1589 "wide string and utf8 string "
1590 "are different");
1591 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 Py_DECREF(wide);
1594 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001595
1596#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1597 wide = PyUnicode_FromWideChar(invalid, 1);
1598 if (wide == NULL)
1599 PyErr_Clear();
1600 else
1601 return raiseTestError("test_widechar",
1602 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1603
1604 wide = PyUnicode_FromUnicode(invalid, 1);
1605 if (wide == NULL)
1606 PyErr_Clear();
1607 else
1608 return raiseTestError("test_widechar",
1609 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001610
1611 wide = PyUnicode_FromUnicode(NULL, 1);
1612 if (wide == NULL)
1613 return NULL;
1614 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001615 if (_PyUnicode_Ready(wide) < 0) {
1616 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001617 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001618 }
1619 else {
1620 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001621 return raiseTestError("test_widechar",
1622 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001623 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001624#endif
1625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001627}
1628
1629static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001630unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001631{
1632 PyObject *unicode, *result;
1633 Py_ssize_t buflen, size;
1634 wchar_t *buffer;
1635
1636 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1637 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001638 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001639 if (buffer == NULL)
1640 return PyErr_NoMemory();
1641
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001642 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001643 if (size == -1) {
1644 PyMem_Free(buffer);
1645 return NULL;
1646 }
1647
1648 if (size < buflen)
1649 buflen = size + 1;
1650 else
1651 buflen = size;
1652 result = PyUnicode_FromWideChar(buffer, buflen);
1653 PyMem_Free(buffer);
1654 if (result == NULL)
1655 return NULL;
1656
1657 return Py_BuildValue("(Nn)", result, size);
1658}
1659
1660static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001661unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001662{
1663 PyObject *unicode, *result;
1664 Py_ssize_t size;
1665 wchar_t *buffer;
1666
1667 if (!PyArg_ParseTuple(args, "U", &unicode))
1668 return NULL;
1669
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001670 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001671 if (buffer == NULL)
1672 return NULL;
1673
1674 result = PyUnicode_FromWideChar(buffer, size + 1);
1675 PyMem_Free(buffer);
1676 if (result == NULL)
1677 return NULL;
1678 return Py_BuildValue("(Nn)", result, size);
1679}
1680
1681static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001682unicode_encodedecimal(PyObject *self, PyObject *args)
1683{
1684 Py_UNICODE *unicode;
1685 Py_ssize_t length;
1686 char *errors = NULL;
1687 PyObject *decimal;
1688 Py_ssize_t decimal_length, new_length;
1689 int res;
1690
1691 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1692 return NULL;
1693
1694 decimal_length = length * 7; /* len('&#8364;') */
1695 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1696 if (decimal == NULL)
1697 return NULL;
1698
1699 res = PyUnicode_EncodeDecimal(unicode, length,
1700 PyBytes_AS_STRING(decimal),
1701 errors);
1702 if (res < 0) {
1703 Py_DECREF(decimal);
1704 return NULL;
1705 }
1706
1707 new_length = strlen(PyBytes_AS_STRING(decimal));
1708 assert(new_length <= decimal_length);
1709 res = _PyBytes_Resize(&decimal, new_length);
1710 if (res < 0)
1711 return NULL;
1712
1713 return decimal;
1714}
1715
1716static PyObject *
1717unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1718{
1719 Py_UNICODE *unicode;
1720 Py_ssize_t length;
1721 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1722 return NULL;
1723 return PyUnicode_TransformDecimalToASCII(unicode, length);
1724}
1725
1726static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001727unicode_legacy_string(PyObject *self, PyObject *args)
1728{
1729 Py_UNICODE *data;
1730 Py_ssize_t len;
1731 PyObject *u;
1732
1733 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1734 return NULL;
1735
1736 u = PyUnicode_FromUnicode(NULL, len);
1737 if (u == NULL)
1738 return NULL;
1739
1740 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1741
1742 if (len > 0) { /* The empty string is always ready. */
1743 assert(!PyUnicode_IS_READY(u));
1744 }
1745
1746 return u;
1747}
1748
1749static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001750getargs_w_star(PyObject *self, PyObject *args)
1751{
1752 Py_buffer buffer;
1753 PyObject *result;
1754 char *str;
1755
1756 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1757 return NULL;
1758
1759 if (2 <= buffer.len) {
1760 str = buffer.buf;
1761 str[0] = '[';
1762 str[buffer.len-1] = ']';
1763 }
1764
1765 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1766 PyBuffer_Release(&buffer);
1767 return result;
1768}
1769
1770
1771static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001772test_empty_argparse(PyObject *self)
1773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 /* Test that formats can begin with '|'. See issue #4720. */
1775 PyObject *tuple, *dict = NULL;
1776 static char *kwlist[] = {NULL};
1777 int result;
1778 tuple = PyTuple_New(0);
1779 if (!tuple)
1780 return NULL;
1781 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1782 goto done;
1783 dict = PyDict_New();
1784 if (!dict)
1785 goto done;
1786 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00001787 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 Py_DECREF(tuple);
1789 Py_XDECREF(dict);
1790 if (result < 0)
1791 return NULL;
1792 else {
1793 Py_RETURN_NONE;
1794 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001795}
1796
1797static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001798codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 const char *encoding, *errors = NULL;
1801 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1802 &encoding, &errors))
1803 return NULL;
1804 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001805}
1806
Thomas Wouters477c8d52006-05-27 19:21:47 +00001807static PyObject *
1808codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001809{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 const char *encoding, *errors = NULL;
1811 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1812 &encoding, &errors))
1813 return NULL;
1814 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001815}
1816
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001817
Tim Peters5b8132f2003-01-31 15:52:05 +00001818/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001819static PyObject *
1820test_long_numbits(PyObject *self)
1821{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 struct triple {
1823 long input;
1824 size_t nbits;
1825 int sign;
1826 } testcases[] = {{0, 0, 0},
1827 {1L, 1, 1},
1828 {-1L, 1, -1},
1829 {2L, 2, 1},
1830 {-2L, 2, -1},
1831 {3L, 2, 1},
1832 {-3L, 2, -1},
1833 {4L, 3, 1},
1834 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03001835 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 {-0x7fffL, 15, -1},
1837 {0xffffL, 16, 1},
1838 {-0xffffL, 16, -1},
1839 {0xfffffffL, 28, 1},
1840 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02001841 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001842
Victor Stinner63941882011-09-29 00:42:28 +02001843 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02001844 size_t nbits;
1845 int sign;
1846 PyObject *plong;
1847
1848 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02001849 if (plong == NULL)
1850 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02001851 nbits = _PyLong_NumBits(plong);
1852 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00001853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 Py_DECREF(plong);
1855 if (nbits != testcases[i].nbits)
1856 return raiseTestError("test_long_numbits",
1857 "wrong result for _PyLong_NumBits");
1858 if (sign != testcases[i].sign)
1859 return raiseTestError("test_long_numbits",
1860 "wrong result for _PyLong_Sign");
1861 }
1862 Py_INCREF(Py_None);
1863 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001864}
1865
Thomas Heller519a0422007-11-15 20:48:54 +00001866/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00001867
1868static PyObject *
1869test_null_strings(PyObject *self)
1870{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
1872 PyObject *tuple = PyTuple_Pack(2, o1, o2);
1873 Py_XDECREF(o1);
1874 Py_XDECREF(o2);
1875 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00001876}
1877
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001878static PyObject *
1879raise_exception(PyObject *self, PyObject *args)
1880{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 PyObject *exc;
1882 PyObject *exc_args, *v;
1883 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
1886 &exc, &num_args))
1887 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 exc_args = PyTuple_New(num_args);
1890 if (exc_args == NULL)
1891 return NULL;
1892 for (i = 0; i < num_args; ++i) {
1893 v = PyLong_FromLong(i);
1894 if (v == NULL) {
1895 Py_DECREF(exc_args);
1896 return NULL;
1897 }
1898 PyTuple_SET_ITEM(exc_args, i, v);
1899 }
1900 PyErr_SetObject(exc, exc_args);
1901 Py_DECREF(exc_args);
1902 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00001903}
Tim Peters91621db2001-06-12 20:10:01 +00001904
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02001905static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02001906set_errno(PyObject *self, PyObject *args)
1907{
1908 int new_errno;
1909
1910 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
1911 return NULL;
1912
1913 errno = new_errno;
1914 Py_RETURN_NONE;
1915}
1916
1917static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02001918test_set_exc_info(PyObject *self, PyObject *args)
1919{
1920 PyObject *orig_exc;
1921 PyObject *new_type, *new_value, *new_tb;
1922 PyObject *type, *value, *tb;
1923 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
1924 &new_type, &new_value, &new_tb))
1925 return NULL;
1926
1927 PyErr_GetExcInfo(&type, &value, &tb);
1928
1929 Py_INCREF(new_type);
1930 Py_INCREF(new_value);
1931 Py_INCREF(new_tb);
1932 PyErr_SetExcInfo(new_type, new_value, new_tb);
1933
1934 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
1935 Py_XDECREF(type);
1936 Py_XDECREF(value);
1937 Py_XDECREF(tb);
1938 return orig_exc;
1939}
Benjamin Peterson16323982010-02-03 01:13:41 +00001940
1941static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001942
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001943static PyObject *
1944test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945 if (PyDateTimeAPI) {
1946 if (test_run_counter) {
1947 /* Probably regrtest.py -R */
1948 Py_RETURN_NONE;
1949 }
1950 else {
1951 PyErr_SetString(PyExc_AssertionError,
1952 "PyDateTime_CAPI somehow initialized");
1953 return NULL;
1954 }
1955 }
1956 test_run_counter++;
1957 PyDateTime_IMPORT;
1958 if (PyDateTimeAPI)
1959 Py_RETURN_NONE;
1960 else
1961 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00001962}
1963
Benjamin Peterson16323982010-02-03 01:13:41 +00001964
1965#ifdef WITH_THREAD
1966
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001967/* test_thread_state spawns a thread of its own, and that thread releases
1968 * `thread_done` when it's finished. The driver code has to know when the
1969 * thread finishes, because the thread uses a PyObject (the callable) that
1970 * may go away when the driver finishes. The former lack of this explicit
1971 * synchronization caused rare segfaults, so rare that they were seen only
1972 * on a Mac buildbot (although they were possible on any box).
1973 */
1974static PyThread_type_lock thread_done = NULL;
1975
Benjamin Petersona786b022008-08-25 21:05:21 +00001976static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001977_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001978{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 PyObject *rc;
1980 int success;
1981 PyGILState_STATE s = PyGILState_Ensure();
1982 rc = PyObject_CallFunction((PyObject *)callable, "");
1983 success = (rc != NULL);
1984 Py_XDECREF(rc);
1985 PyGILState_Release(s);
1986 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001987}
1988
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001989/* Same thing, but releases `thread_done` when it returns. This variant
1990 * should be called only from threads spawned by test_thread_state().
1991 */
1992static void
1993_make_call_from_thread(void *callable)
1994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 _make_call(callable);
1996 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001997}
1998
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001999static PyObject *
2000test_thread_state(PyObject *self, PyObject *args)
2001{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 PyObject *fn;
2003 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2006 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 if (!PyCallable_Check(fn)) {
2009 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2010 fn->ob_type->tp_name);
2011 return NULL;
2012 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 /* Ensure Python is set up for threading */
2015 PyEval_InitThreads();
2016 thread_done = PyThread_allocate_lock();
2017 if (thread_done == NULL)
2018 return PyErr_NoMemory();
2019 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 /* Start a new thread with our callback. */
2022 PyThread_start_new_thread(_make_call_from_thread, fn);
2023 /* Make the callback with the thread lock held by this thread */
2024 success &= _make_call(fn);
2025 /* Do it all again, but this time with the thread-lock released */
2026 Py_BEGIN_ALLOW_THREADS
2027 success &= _make_call(fn);
2028 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2029 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 /* And once more with and without a thread
2032 XXX - should use a lock and work out exactly what we are trying
2033 to test <wink>
2034 */
2035 Py_BEGIN_ALLOW_THREADS
2036 PyThread_start_new_thread(_make_call_from_thread, fn);
2037 success &= _make_call(fn);
2038 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2039 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 /* Release lock we acquired above. This is required on HP-UX. */
2042 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 PyThread_free_lock(thread_done);
2045 if (!success)
2046 return NULL;
2047 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002048}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002049
2050/* test Py_AddPendingCalls using threads */
2051static int _pending_callback(void *arg)
2052{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 /* we assume the argument is callable object to which we own a reference */
2054 PyObject *callable = (PyObject *)arg;
2055 PyObject *r = PyObject_CallObject(callable, NULL);
2056 Py_DECREF(callable);
2057 Py_XDECREF(r);
2058 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002059}
2060
2061/* The following requests n callbacks to _pending_callback. It can be
2062 * run from any python thread.
2063 */
2064PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
2065{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 PyObject *callable;
2067 int r;
2068 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2069 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 /* create the reference for the callbackwhile we hold the lock */
2072 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 Py_BEGIN_ALLOW_THREADS
2075 r = Py_AddPendingCall(&_pending_callback, callable);
2076 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 if (r<0) {
2079 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
2080 Py_INCREF(Py_False);
2081 return Py_False;
2082 }
2083 Py_INCREF(Py_True);
2084 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002085}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002086#endif
2087
Neal Norwitzb0d26332007-08-25 00:49:05 +00002088/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002089static PyObject *
2090test_string_from_format(PyObject *self, PyObject *args)
2091{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 PyObject *result;
2093 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002094
Alexander Belopolskye239d232010-12-08 23:31:48 +00002095#define CHECK_1_FORMAT(FORMAT, TYPE) \
2096 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2097 if (result == NULL) \
2098 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01002099 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002100 msg = FORMAT " failed at 1"; \
2101 goto Fail; \
2102 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 CHECK_1_FORMAT("%d", int);
2106 CHECK_1_FORMAT("%ld", long);
2107 /* The z width modifier was added in Python 2.5. */
2108 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 /* The u type code was added in Python 2.5. */
2111 CHECK_1_FORMAT("%u", unsigned int);
2112 CHECK_1_FORMAT("%lu", unsigned long);
2113 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002116#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
2118 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002119#endif
2120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002122
2123 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 Py_XDECREF(result);
2125 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002126
2127#undef CHECK_1_FORMAT
2128}
2129
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002130
2131static PyObject *
2132test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2134 int result;
2135 if (py_s == NULL)
2136 return NULL;
2137 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2138 Py_DECREF(py_s);
2139 if (!result) {
2140 PyErr_SetString(TestError, "Python string ending in NULL "
2141 "should not compare equal to c string.");
2142 return NULL;
2143 }
2144 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002145}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002146
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002147/* This is here to provide a docstring for test_descr. */
2148static PyObject *
2149test_with_docstring(PyObject *self)
2150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002152}
2153
Mark Dickinson725bfd82009-05-03 20:33:40 +00002154/* Test PyOS_string_to_double. */
2155static PyObject *
2156test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002157 double result;
2158 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160#define CHECK_STRING(STR, expected) \
2161 result = PyOS_string_to_double(STR, NULL, NULL); \
2162 if (result == -1.0 && PyErr_Occurred()) \
2163 return NULL; \
2164 if (result != expected) { \
2165 msg = "conversion of " STR " to float failed"; \
2166 goto fail; \
2167 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169#define CHECK_INVALID(STR) \
2170 result = PyOS_string_to_double(STR, NULL, NULL); \
2171 if (result == -1.0 && PyErr_Occurred()) { \
2172 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2173 PyErr_Clear(); \
2174 else \
2175 return NULL; \
2176 } \
2177 else { \
2178 msg = "conversion of " STR " didn't raise ValueError"; \
2179 goto fail; \
2180 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 CHECK_STRING("0.1", 0.1);
2183 CHECK_STRING("1.234", 1.234);
2184 CHECK_STRING("-1.35", -1.35);
2185 CHECK_STRING(".1e01", 1.0);
2186 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002188 CHECK_INVALID(" 0.1");
2189 CHECK_INVALID("\t\n-3");
2190 CHECK_INVALID(".123 ");
2191 CHECK_INVALID("3\n");
2192 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002195 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002197#undef CHECK_STRING
2198#undef CHECK_INVALID
2199}
2200
2201
Benjamin Petersonb173f782009-05-05 22:31:58 +00002202/* Coverage testing of capsule objects. */
2203
2204static const char *capsule_name = "capsule name";
2205static char *capsule_pointer = "capsule pointer";
2206static char *capsule_context = "capsule context";
2207static const char *capsule_error = NULL;
2208static int
2209capsule_destructor_call_count = 0;
2210
2211static void
2212capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 capsule_destructor_call_count++;
2214 if (PyCapsule_GetContext(o) != capsule_context) {
2215 capsule_error = "context did not match in destructor!";
2216 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2217 capsule_error = "destructor did not match in destructor! (woah!)";
2218 } else if (PyCapsule_GetName(o) != capsule_name) {
2219 capsule_error = "name did not match in destructor!";
2220 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2221 capsule_error = "pointer did not match in destructor!";
2222 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002223}
2224
2225typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002226 char *name;
2227 char *module;
2228 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002229} known_capsule;
2230
2231static PyObject *
2232test_capsule(PyObject *self, PyObject *args)
2233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 PyObject *object;
2235 const char *error = NULL;
2236 void *pointer;
2237 void *pointer2;
2238 known_capsule known_capsules[] = {
2239 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2240 KNOWN_CAPSULE("_socket", "CAPI"),
2241 KNOWN_CAPSULE("_curses", "_C_API"),
2242 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2243 { NULL, NULL },
2244 };
2245 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002246
2247#define FAIL(x) { error = (x); goto exit; }
2248
2249#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 if (capsule_error) { \
2251 FAIL(capsule_error); \
2252 } \
2253 else if (!capsule_destructor_call_count) { \
2254 FAIL("destructor not called!"); \
2255 } \
2256 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2259 PyCapsule_SetContext(object, capsule_context);
2260 capsule_destructor(object);
2261 CHECK_DESTRUCTOR;
2262 Py_DECREF(object);
2263 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 object = PyCapsule_New(known, "ignored", NULL);
2266 PyCapsule_SetPointer(object, capsule_pointer);
2267 PyCapsule_SetName(object, capsule_name);
2268 PyCapsule_SetDestructor(object, capsule_destructor);
2269 PyCapsule_SetContext(object, capsule_context);
2270 capsule_destructor(object);
2271 CHECK_DESTRUCTOR;
2272 /* intentionally access using the wrong name */
2273 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2274 if (!PyErr_Occurred()) {
2275 FAIL("PyCapsule_GetPointer should have failed but did not!");
2276 }
2277 PyErr_Clear();
2278 if (pointer2) {
2279 if (pointer2 == capsule_pointer) {
2280 FAIL("PyCapsule_GetPointer should not have"
2281 " returned the internal pointer!");
2282 } else {
2283 FAIL("PyCapsule_GetPointer should have "
2284 "returned NULL pointer but did not!");
2285 }
2286 }
2287 PyCapsule_SetDestructor(object, NULL);
2288 Py_DECREF(object);
2289 if (capsule_destructor_call_count) {
2290 FAIL("destructor called when it should not have been!");
2291 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002293 for (known = &known_capsules[0]; known->module != NULL; known++) {
2294 /* yeah, ordinarily I wouldn't do this either,
2295 but it's fine for this test harness.
2296 */
2297 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002298#undef FAIL
2299#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 { \
2301 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2302 x, known->module, known->attribute); \
2303 error = buffer; \
2304 goto exit; \
2305 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 PyObject *module = PyImport_ImportModule(known->module);
2308 if (module) {
2309 pointer = PyCapsule_Import(known->name, 0);
2310 if (!pointer) {
2311 Py_DECREF(module);
2312 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2313 }
2314 object = PyObject_GetAttrString(module, known->attribute);
2315 if (!object) {
2316 Py_DECREF(module);
2317 return NULL;
2318 }
2319 pointer2 = PyCapsule_GetPointer(object,
2320 "weebles wobble but they don't fall down");
2321 if (!PyErr_Occurred()) {
2322 Py_DECREF(object);
2323 Py_DECREF(module);
2324 FAIL("PyCapsule_GetPointer should have failed but did not!");
2325 }
2326 PyErr_Clear();
2327 if (pointer2) {
2328 Py_DECREF(module);
2329 Py_DECREF(object);
2330 if (pointer2 == pointer) {
2331 FAIL("PyCapsule_GetPointer should not have"
2332 " returned its internal pointer!");
2333 } else {
2334 FAIL("PyCapsule_GetPointer should have"
2335 " returned NULL pointer but did not!");
2336 }
2337 }
2338 Py_DECREF(object);
2339 Py_DECREF(module);
2340 }
2341 else
2342 PyErr_Clear();
2343 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002344
2345 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 if (error) {
2347 return raiseTestError("test_capsule", error);
2348 }
2349 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002350#undef FAIL
2351}
2352
Guido van Rossumddefaf32007-01-14 03:31:43 +00002353#ifdef HAVE_GETTIMEOFDAY
2354/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002355static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002356{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 e->tv_sec -= s->tv_sec;
2358 e->tv_usec -= s->tv_usec;
2359 if (e->tv_usec < 0) {
2360 e->tv_sec -=1;
2361 e->tv_usec += 1000000;
2362 }
2363 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002364}
2365
2366static PyObject *
2367profile_int(PyObject *self, PyObject* args)
2368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 int i, k;
2370 struct timeval start, stop;
2371 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 /* Test 1: Allocate and immediately deallocate
2374 many small integers */
2375 gettimeofday(&start, NULL);
2376 for(k=0; k < 20000; k++)
2377 for(i=0; i < 1000; i++) {
2378 single = PyLong_FromLong(i);
2379 Py_DECREF(single);
2380 }
2381 gettimeofday(&stop, NULL);
2382 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 /* Test 2: Allocate and immediately deallocate
2385 many large integers */
2386 gettimeofday(&start, NULL);
2387 for(k=0; k < 20000; k++)
2388 for(i=0; i < 1000; i++) {
2389 single = PyLong_FromLong(i+1000000);
2390 Py_DECREF(single);
2391 }
2392 gettimeofday(&stop, NULL);
2393 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 /* Test 3: Allocate a few integers, then release
2396 them all simultaneously. */
2397 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002398 if (multiple == NULL)
2399 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 gettimeofday(&start, NULL);
2401 for(k=0; k < 20000; k++) {
2402 for(i=0; i < 1000; i++) {
2403 multiple[i] = PyLong_FromLong(i+1000000);
2404 }
2405 for(i=0; i < 1000; i++) {
2406 Py_DECREF(multiple[i]);
2407 }
2408 }
2409 gettimeofday(&stop, NULL);
2410 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002411 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 /* Test 4: Allocate many integers, then release
2414 them all simultaneously. */
2415 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002416 if (multiple == NULL)
2417 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 gettimeofday(&start, NULL);
2419 for(k=0; k < 20; k++) {
2420 for(i=0; i < 1000000; i++) {
2421 multiple[i] = PyLong_FromLong(i+1000000);
2422 }
2423 for(i=0; i < 1000000; i++) {
2424 Py_DECREF(multiple[i]);
2425 }
2426 }
2427 gettimeofday(&stop, NULL);
2428 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002429 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 /* Test 5: Allocate many integers < 32000 */
2432 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002433 if (multiple == NULL)
2434 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 gettimeofday(&start, NULL);
2436 for(k=0; k < 10; k++) {
2437 for(i=0; i < 1000000; i++) {
2438 multiple[i] = PyLong_FromLong(i+1000);
2439 }
2440 for(i=0; i < 1000000; i++) {
2441 Py_DECREF(multiple[i]);
2442 }
2443 }
2444 gettimeofday(&stop, NULL);
2445 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002446 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 /* Test 6: Perform small int addition */
2449 op1 = PyLong_FromLong(1);
2450 gettimeofday(&start, NULL);
2451 for(i=0; i < 10000000; i++) {
2452 result = PyNumber_Add(op1, op1);
2453 Py_DECREF(result);
2454 }
2455 gettimeofday(&stop, NULL);
2456 Py_DECREF(op1);
2457 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 /* Test 7: Perform medium int addition */
2460 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002461 if (op1 == NULL)
2462 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 gettimeofday(&start, NULL);
2464 for(i=0; i < 10000000; i++) {
2465 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002466 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 }
2468 gettimeofday(&stop, NULL);
2469 Py_DECREF(op1);
2470 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002472 Py_INCREF(Py_None);
2473 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002474}
2475#endif
2476
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002477/* To test the format of tracebacks as printed out. */
2478static PyObject *
2479traceback_print(PyObject *self, PyObject *args)
2480{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 PyObject *file;
2482 PyObject *traceback;
2483 int result;
2484
2485 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2486 &traceback, &file))
2487 return NULL;
2488
2489 result = PyTraceBack_Print(traceback, file);
2490 if (result < 0)
2491 return NULL;
2492 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002493}
2494
Benjamin Petersone6528212008-07-15 15:32:09 +00002495/* To test the format of exceptions as printed out. */
2496static PyObject *
2497exception_print(PyObject *self, PyObject *args)
2498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 PyObject *value;
2500 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 if (!PyArg_ParseTuple(args, "O:exception_print",
2503 &value))
2504 return NULL;
2505 if (!PyExceptionInstance_Check(value)) {
2506 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2507 return NULL;
2508 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 tb = PyException_GetTraceback(value);
2511 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2512 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002515}
2516
2517
2518
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002519
2520/* reliably raise a MemoryError */
2521static PyObject *
2522raise_memoryerror(PyObject *self)
2523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 PyErr_NoMemory();
2525 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002526}
2527
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002528/* Issue 6012 */
2529static PyObject *str1, *str2;
2530static int
2531failing_converter(PyObject *obj, void *arg)
2532{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 /* Clone str1, then let the conversion fail. */
2534 assert(str1);
2535 str2 = str1;
2536 Py_INCREF(str2);
2537 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002538}
2539static PyObject*
2540argparsing(PyObject *o, PyObject *args)
2541{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 PyObject *res;
2543 str1 = str2 = NULL;
2544 if (!PyArg_ParseTuple(args, "O&O&",
2545 PyUnicode_FSConverter, &str1,
2546 failing_converter, &str2)) {
2547 if (!str2)
2548 /* argument converter not called? */
2549 return NULL;
2550 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002551 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 Py_DECREF(str2);
2553 PyErr_Clear();
2554 return res;
2555 }
2556 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002557}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002558
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002559/* To test that the result of PyCode_NewEmpty has the right members. */
2560static PyObject *
2561code_newempty(PyObject *self, PyObject *args)
2562{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002563 const char *filename;
2564 const char *funcname;
2565 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2568 &filename, &funcname, &firstlineno))
2569 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002572}
2573
Georg Brandl1e28a272009-12-28 08:41:01 +00002574/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2575 Run via Lib/test/test_exceptions.py */
2576static PyObject *
2577make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 const char *name;
2580 const char *doc = NULL;
2581 PyObject *base = NULL;
2582 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002584 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002586 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2587 "s|sOO:make_exception_with_doc", kwlist,
2588 &name, &doc, &base, &dict))
2589 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002592}
2593
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002594static PyObject *
2595make_memoryview_from_NULL_pointer(PyObject *self)
2596{
2597 Py_buffer info;
2598 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2599 return NULL;
2600 return PyMemoryView_FromBuffer(&info);
2601}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002602
Stefan Krah7213fcc2015-02-01 16:19:23 +01002603static PyObject *
2604test_from_contiguous(PyObject* self, PyObject *noargs)
2605{
2606 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2607 int init[5] = {0, 1, 2, 3, 4};
2608 Py_ssize_t itemsize = sizeof(int);
2609 Py_ssize_t shape = 5;
2610 Py_ssize_t strides = 2 * itemsize;
2611 Py_buffer view = {
2612 data,
2613 NULL,
2614 5 * itemsize,
2615 itemsize,
2616 1,
2617 1,
2618 NULL,
2619 &shape,
2620 &strides,
2621 NULL,
2622 NULL
2623 };
2624 int *ptr;
2625 int i;
2626
2627 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2628 ptr = view.buf;
2629 for (i = 0; i < 5; i++) {
2630 if (ptr[2*i] != i) {
2631 PyErr_SetString(TestError,
2632 "test_from_contiguous: incorrect result");
2633 return NULL;
2634 }
2635 }
2636
2637 view.buf = &data[8];
2638 view.strides[0] = -2 * itemsize;
2639
2640 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2641 ptr = view.buf;
2642 for (i = 0; i < 5; i++) {
2643 if (*(ptr-2*i) != i) {
2644 PyErr_SetString(TestError,
2645 "test_from_contiguous: incorrect result");
2646 return NULL;
2647 }
2648 }
2649
2650 Py_RETURN_NONE;
2651}
Stefan Krah650c1e82015-02-03 21:43:23 +01002652
Stefan Kraha7559c02015-02-03 22:27:21 +01002653#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01002654extern PyTypeObject _PyBytesIOBuffer_Type;
2655
Stefan Krah5178d912015-02-03 16:57:21 +01002656static PyObject *
2657test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
2658{
Stefan Krah650c1e82015-02-03 21:43:23 +01002659 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01002660 PyObject *b;
2661 char *dummy[1];
2662 int ret, match;
2663
Stefan Krah650c1e82015-02-03 21:43:23 +01002664 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01002665 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
2666 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2667 PyErr_Clear();
2668 if (ret != -1 || match == 0)
2669 goto error;
2670
Stefan Krah650c1e82015-02-03 21:43:23 +01002671 /* bytesiobuf_getbuffer() */
2672 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01002673 if (b == NULL) {
2674 return NULL;
2675 }
2676
2677 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
2678 Py_DECREF(b);
2679 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2680 PyErr_Clear();
2681 if (ret != -1 || match == 0)
2682 goto error;
2683
2684 Py_RETURN_NONE;
2685
2686error:
2687 PyErr_SetString(TestError,
2688 "test_pep3118_obsolete_write_locks: failure");
2689 return NULL;
2690}
Stefan Kraha7559c02015-02-03 22:27:21 +01002691#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002692
Stefan Krah650c1e82015-02-03 21:43:23 +01002693/* This tests functions that historically supported write locks. It is
2694 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
2695 is entitled to segfault in that case. */
2696static PyObject *
2697getbuffer_with_null_view(PyObject* self, PyObject *obj)
2698{
2699 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
2700 return NULL;
2701
2702 Py_RETURN_NONE;
2703}
2704
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002705/* Test that the fatal error from not having a current thread doesn't
2706 cause an infinite loop. Run via Lib/test/test_capi.py */
2707static PyObject *
2708crash_no_current_thread(PyObject *self)
2709{
2710 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002711 /* Using PyThreadState_Get() directly allows the test to pass in
2712 !pydebug mode. However, the test only actually tests anything
2713 in pydebug mode, since that's where the infinite loop was in
2714 the first place. */
2715 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002716 Py_END_ALLOW_THREADS
2717 return NULL;
2718}
2719
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002720/* To run some code in a sub-interpreter. */
2721static PyObject *
2722run_in_subinterp(PyObject *self, PyObject *args)
2723{
2724 const char *code;
2725 int r;
2726 PyThreadState *substate, *mainstate;
2727
2728 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2729 &code))
2730 return NULL;
2731
2732 mainstate = PyThreadState_Get();
2733
2734 PyThreadState_Swap(NULL);
2735
2736 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002737 if (substate == NULL) {
2738 /* Since no new thread state was created, there is no exception to
2739 propagate; raise a fresh one after swapping in the old thread
2740 state. */
2741 PyThreadState_Swap(mainstate);
2742 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2743 return NULL;
2744 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002745 r = PyRun_SimpleString(code);
2746 Py_EndInterpreter(substate);
2747
2748 PyThreadState_Swap(mainstate);
2749
2750 return PyLong_FromLong(r);
2751}
2752
Victor Stinner3c1b3792014-02-17 00:02:43 +01002753static int
2754check_time_rounding(int round)
2755{
Victor Stinnera695f832015-03-30 03:57:14 +02002756 if (round != _PyTime_ROUND_FLOOR && round != _PyTime_ROUND_CEILING) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01002757 PyErr_SetString(PyExc_ValueError, "invalid rounding");
2758 return -1;
2759 }
2760 return 0;
2761}
2762
Victor Stinner5d272cc2012-03-13 13:35:55 +01002763static PyObject *
2764test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2765{
2766 PyObject *obj;
2767 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002768 int round;
2769 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002770 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002771 if (check_time_rounding(round) < 0)
2772 return NULL;
2773 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002774 return NULL;
2775 return _PyLong_FromTime_t(sec);
2776}
2777
2778static PyObject *
2779test_pytime_object_to_timeval(PyObject *self, PyObject *args)
2780{
2781 PyObject *obj;
2782 time_t sec;
2783 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002784 int round;
2785 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002786 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002787 if (check_time_rounding(round) < 0)
2788 return NULL;
2789 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002790 return NULL;
2791 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
2792}
2793
Victor Stinner643cd682012-03-02 22:54:03 +01002794static PyObject *
2795test_pytime_object_to_timespec(PyObject *self, PyObject *args)
2796{
2797 PyObject *obj;
2798 time_t sec;
2799 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002800 int round;
2801 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01002802 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002803 if (check_time_rounding(round) < 0)
2804 return NULL;
2805 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01002806 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01002807 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01002808}
2809
Antoine Pitrou796564c2013-07-30 19:59:21 +02002810static void
2811slot_tp_del(PyObject *self)
2812{
2813 _Py_IDENTIFIER(__tp_del__);
2814 PyObject *del, *res;
2815 PyObject *error_type, *error_value, *error_traceback;
2816
2817 /* Temporarily resurrect the object. */
2818 assert(self->ob_refcnt == 0);
2819 self->ob_refcnt = 1;
2820
2821 /* Save the current exception, if any. */
2822 PyErr_Fetch(&error_type, &error_value, &error_traceback);
2823
2824 /* Execute __del__ method, if any. */
2825 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
2826 if (del != NULL) {
2827 res = PyEval_CallObject(del, NULL);
2828 if (res == NULL)
2829 PyErr_WriteUnraisable(del);
2830 else
2831 Py_DECREF(res);
2832 Py_DECREF(del);
2833 }
2834
2835 /* Restore the saved exception. */
2836 PyErr_Restore(error_type, error_value, error_traceback);
2837
2838 /* Undo the temporary resurrection; can't use DECREF here, it would
2839 * cause a recursive call.
2840 */
2841 assert(self->ob_refcnt > 0);
2842 if (--self->ob_refcnt == 0)
2843 return; /* this is the normal path out */
2844
2845 /* __del__ resurrected it! Make it look like the original Py_DECREF
2846 * never happened.
2847 */
2848 {
2849 Py_ssize_t refcnt = self->ob_refcnt;
2850 _Py_NewReference(self);
2851 self->ob_refcnt = refcnt;
2852 }
2853 assert(!PyType_IS_GC(Py_TYPE(self)) ||
2854 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
2855 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
2856 * we need to undo that. */
2857 _Py_DEC_REFTOTAL;
2858 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
2859 * chain, so no more to do there.
2860 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
2861 * _Py_NewReference bumped tp_allocs: both of those need to be
2862 * undone.
2863 */
2864#ifdef COUNT_ALLOCS
2865 --Py_TYPE(self)->tp_frees;
2866 --Py_TYPE(self)->tp_allocs;
2867#endif
2868}
2869
2870static PyObject *
2871with_tp_del(PyObject *self, PyObject *args)
2872{
2873 PyObject *obj;
2874 PyTypeObject *tp;
2875
2876 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
2877 return NULL;
2878 tp = (PyTypeObject *) obj;
2879 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
2880 PyErr_Format(PyExc_TypeError,
2881 "heap type expected, got %R", obj);
2882 return NULL;
2883 }
2884 tp->tp_del = slot_tp_del;
2885 Py_INCREF(obj);
2886 return obj;
2887}
2888
Antoine Pitroub349e4c2014-08-06 19:31:40 -04002889static PyMethodDef ml;
2890
2891static PyObject *
2892create_cfunction(PyObject *self, PyObject *args)
2893{
2894 return PyCFunction_NewEx(&ml, self, NULL);
2895}
2896
2897static PyMethodDef ml = {
2898 "create_cfunction",
2899 create_cfunction,
2900 METH_NOARGS,
2901 NULL
2902};
2903
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07002904static PyObject *
2905_test_incref(PyObject *ob)
2906{
2907 Py_INCREF(ob);
2908 return ob;
2909}
2910
2911static PyObject *
2912test_xincref_doesnt_leak(PyObject *ob)
2913{
2914 PyObject *obj = PyLong_FromLong(0);
2915 Py_XINCREF(_test_incref(obj));
2916 Py_DECREF(obj);
2917 Py_DECREF(obj);
2918 Py_DECREF(obj);
2919 Py_RETURN_NONE;
2920}
2921
2922static PyObject *
2923test_incref_doesnt_leak(PyObject *ob)
2924{
2925 PyObject *obj = PyLong_FromLong(0);
2926 Py_INCREF(_test_incref(obj));
2927 Py_DECREF(obj);
2928 Py_DECREF(obj);
2929 Py_DECREF(obj);
2930 Py_RETURN_NONE;
2931}
2932
2933static PyObject *
2934test_xdecref_doesnt_leak(PyObject *ob)
2935{
2936 Py_XDECREF(PyLong_FromLong(0));
2937 Py_RETURN_NONE;
2938}
2939
2940static PyObject *
2941test_decref_doesnt_leak(PyObject *ob)
2942{
2943 Py_DECREF(PyLong_FromLong(0));
2944 Py_RETURN_NONE;
2945}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002946
Victor Stinner0507bf52013-07-07 02:05:46 +02002947static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02002948test_incref_decref_API(PyObject *ob)
2949{
2950 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02002951 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02002952 Py_DecRef(obj);
2953 Py_DecRef(obj);
2954 Py_RETURN_NONE;
2955}
2956
2957static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02002958test_pymem_alloc0(PyObject *self)
2959{
2960 void *ptr;
2961
Victor Stinnerdb067af2014-05-02 22:31:14 +02002962 ptr = PyMem_RawMalloc(0);
2963 if (ptr == NULL) {
2964 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
2965 return NULL;
2966 }
2967 PyMem_RawFree(ptr);
2968
2969 ptr = PyMem_RawCalloc(0, 0);
2970 if (ptr == NULL) {
2971 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
2972 return NULL;
2973 }
2974 PyMem_RawFree(ptr);
2975
Victor Stinner0507bf52013-07-07 02:05:46 +02002976 ptr = PyMem_Malloc(0);
2977 if (ptr == NULL) {
2978 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
2979 return NULL;
2980 }
2981 PyMem_Free(ptr);
2982
Victor Stinnerdb067af2014-05-02 22:31:14 +02002983 ptr = PyMem_Calloc(0, 0);
2984 if (ptr == NULL) {
2985 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
2986 return NULL;
2987 }
2988 PyMem_Free(ptr);
2989
Victor Stinner0507bf52013-07-07 02:05:46 +02002990 ptr = PyObject_Malloc(0);
2991 if (ptr == NULL) {
2992 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
2993 return NULL;
2994 }
2995 PyObject_Free(ptr);
2996
Victor Stinnerdb067af2014-05-02 22:31:14 +02002997 ptr = PyObject_Calloc(0, 0);
2998 if (ptr == NULL) {
2999 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3000 return NULL;
3001 }
3002 PyObject_Free(ptr);
3003
Victor Stinner0507bf52013-07-07 02:05:46 +02003004 Py_RETURN_NONE;
3005}
3006
3007typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003008 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003009
3010 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003011 size_t calloc_nelem;
3012 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003013 void *realloc_ptr;
3014 size_t realloc_new_size;
3015 void *free_ptr;
3016} alloc_hook_t;
3017
3018static void* hook_malloc (void* ctx, size_t size)
3019{
3020 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3021 hook->malloc_size = size;
3022 return hook->alloc.malloc(hook->alloc.ctx, size);
3023}
3024
Victor Stinnerdb067af2014-05-02 22:31:14 +02003025static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
3026{
3027 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3028 hook->calloc_nelem = nelem;
3029 hook->calloc_elsize = elsize;
3030 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3031}
3032
Victor Stinner0507bf52013-07-07 02:05:46 +02003033static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
3034{
3035 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3036 hook->realloc_ptr = ptr;
3037 hook->realloc_new_size = new_size;
3038 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3039}
3040
3041static void hook_free (void *ctx, void *ptr)
3042{
3043 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3044 hook->free_ptr = ptr;
3045 hook->alloc.free(hook->alloc.ctx, ptr);
3046}
3047
3048static PyObject *
3049test_setallocators(PyMemAllocatorDomain domain)
3050{
3051 PyObject *res = NULL;
3052 const char *error_msg;
3053 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003054 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003055 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003056 void *ptr, *ptr2;
3057
Victor Stinnerdb067af2014-05-02 22:31:14 +02003058 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003059
3060 alloc.ctx = &hook;
3061 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003062 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003063 alloc.realloc = &hook_realloc;
3064 alloc.free = &hook_free;
3065 PyMem_GetAllocator(domain, &hook.alloc);
3066 PyMem_SetAllocator(domain, &alloc);
3067
3068 size = 42;
3069 switch(domain)
3070 {
3071 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3072 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3073 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3074 default: ptr = NULL; break;
3075 }
3076
3077 if (ptr == NULL) {
3078 error_msg = "malloc failed";
3079 goto fail;
3080 }
3081
3082 if (hook.malloc_size != size) {
3083 error_msg = "malloc invalid size";
3084 goto fail;
3085 }
3086
3087 size2 = 200;
3088 switch(domain)
3089 {
3090 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3091 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3092 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003093 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003094 }
3095
3096 if (ptr2 == NULL) {
3097 error_msg = "realloc failed";
3098 goto fail;
3099 }
3100
3101 if (hook.realloc_ptr != ptr
3102 || hook.realloc_new_size != size2) {
3103 error_msg = "realloc invalid parameters";
3104 goto fail;
3105 }
3106
3107 switch(domain)
3108 {
3109 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3110 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3111 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3112 }
3113
3114 if (hook.free_ptr != ptr2) {
3115 error_msg = "free invalid pointer";
3116 goto fail;
3117 }
3118
Victor Stinnerdb067af2014-05-02 22:31:14 +02003119 nelem = 2;
3120 elsize = 5;
3121 switch(domain)
3122 {
3123 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3124 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3125 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3126 default: ptr = NULL; break;
3127 }
3128
3129 if (ptr == NULL) {
3130 error_msg = "calloc failed";
3131 goto fail;
3132 }
3133
3134 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3135 error_msg = "calloc invalid nelem or elsize";
3136 goto fail;
3137 }
3138
3139 switch(domain)
3140 {
3141 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3142 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3143 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3144 }
3145
Victor Stinner0507bf52013-07-07 02:05:46 +02003146 Py_INCREF(Py_None);
3147 res = Py_None;
3148 goto finally;
3149
3150fail:
3151 PyErr_SetString(PyExc_RuntimeError, error_msg);
3152
3153finally:
3154 PyMem_SetAllocator(domain, &hook.alloc);
3155 return res;
3156}
3157
3158static PyObject *
3159test_pymem_setrawallocators(PyObject *self)
3160{
3161 return test_setallocators(PYMEM_DOMAIN_RAW);
3162}
3163
3164static PyObject *
3165test_pymem_setallocators(PyObject *self)
3166{
3167 return test_setallocators(PYMEM_DOMAIN_MEM);
3168}
3169
3170static PyObject *
3171test_pyobject_setallocators(PyObject *self)
3172{
3173 return test_setallocators(PYMEM_DOMAIN_OBJ);
3174}
3175
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003176PyDoc_STRVAR(docstring_empty,
3177""
3178);
3179
3180PyDoc_STRVAR(docstring_no_signature,
3181"This docstring has no signature."
3182);
3183
3184PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003185"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003186"\n"
3187"This docstring has an invalid signature."
3188);
3189
Larry Hastings2623c8c2014-02-08 22:15:29 -08003190PyDoc_STRVAR(docstring_with_invalid_signature2,
3191"docstring_with_invalid_signature2($module, /, boo)\n"
3192"\n"
3193"--\n"
3194"\n"
3195"This docstring also has an invalid signature."
3196);
3197
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003198PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003199"docstring_with_signature($module, /, sig)\n"
3200"--\n"
3201"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003202"This docstring has a valid signature."
3203);
3204
Zachary Ware8ef887c2015-04-13 18:22:35 -05003205PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3206"docstring_with_signature_but_no_doc($module, /, sig)\n"
3207"--\n"
3208"\n"
3209);
3210
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003211PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003212"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3213"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003214"\n"
3215"\n"
3216"This docstring has a valid signature and some extra newlines."
3217);
3218
Larry Hastings16c51912014-01-07 11:53:01 -08003219PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003220"docstring_with_signature_with_defaults(module, s='avocado',\n"
3221" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3222" local=the_number_three, sys=sys.maxsize,\n"
3223" exp=sys.maxsize - 1)\n"
3224"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003225"\n"
3226"\n"
3227"\n"
3228"This docstring has a valid signature with parameters,\n"
3229"and the parameters take defaults of varying types."
3230);
3231
Victor Stinner258e4d32013-12-13 02:30:12 +01003232#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003233typedef struct {
3234 PyThread_type_lock start_event;
3235 PyThread_type_lock exit_event;
3236 PyObject *callback;
3237} test_c_thread_t;
3238
3239static void
3240temporary_c_thread(void *data)
3241{
3242 test_c_thread_t *test_c_thread = data;
3243 PyGILState_STATE state;
3244 PyObject *res;
3245
3246 PyThread_release_lock(test_c_thread->start_event);
3247
3248 /* Allocate a Python thread state for this thread */
3249 state = PyGILState_Ensure();
3250
3251 res = PyObject_CallFunction(test_c_thread->callback, "", NULL);
3252 Py_CLEAR(test_c_thread->callback);
3253
3254 if (res == NULL) {
3255 PyErr_Print();
3256 }
3257 else {
3258 Py_DECREF(res);
3259 }
3260
3261 /* Destroy the Python thread state for this thread */
3262 PyGILState_Release(state);
3263
3264 PyThread_release_lock(test_c_thread->exit_event);
3265
3266 PyThread_exit_thread();
3267}
3268
3269static PyObject *
3270call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3271{
3272 PyObject *res = NULL;
3273 test_c_thread_t test_c_thread;
3274 long thread;
3275
3276 PyEval_InitThreads();
3277
3278 test_c_thread.start_event = PyThread_allocate_lock();
3279 test_c_thread.exit_event = PyThread_allocate_lock();
3280 test_c_thread.callback = NULL;
3281 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3282 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3283 goto exit;
3284 }
3285
3286 Py_INCREF(callback);
3287 test_c_thread.callback = callback;
3288
3289 PyThread_acquire_lock(test_c_thread.start_event, 1);
3290 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3291
3292 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3293 if (thread == -1) {
3294 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3295 PyThread_release_lock(test_c_thread.start_event);
3296 PyThread_release_lock(test_c_thread.exit_event);
3297 goto exit;
3298 }
3299
3300 PyThread_acquire_lock(test_c_thread.start_event, 1);
3301 PyThread_release_lock(test_c_thread.start_event);
3302
3303 Py_BEGIN_ALLOW_THREADS
3304 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3305 PyThread_release_lock(test_c_thread.exit_event);
3306 Py_END_ALLOW_THREADS
3307
3308 Py_INCREF(Py_None);
3309 res = Py_None;
3310
3311exit:
3312 Py_CLEAR(test_c_thread.callback);
3313 if (test_c_thread.start_event)
3314 PyThread_free_lock(test_c_thread.start_event);
3315 if (test_c_thread.exit_event)
3316 PyThread_free_lock(test_c_thread.exit_event);
3317 return res;
3318}
Victor Stinner258e4d32013-12-13 02:30:12 +01003319#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003320
Victor Stinner56e8c292014-07-21 12:30:22 +02003321static PyObject*
3322test_raise_signal(PyObject* self, PyObject *args)
3323{
3324 int signum, err;
3325
3326 if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0)
3327 return NULL;
3328
3329 err = raise(signum);
3330 if (err)
3331 return PyErr_SetFromErrno(PyExc_OSError);
3332
3333 if (PyErr_CheckSignals() < 0)
3334 return NULL;
3335
3336 Py_RETURN_NONE;
3337}
3338
Serhiy Storchakab5181342015-02-06 08:58:56 +02003339/* marshal */
3340
3341static PyObject*
3342pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3343{
3344 long value;
3345 char *filename;
3346 int version;
3347 FILE *fp;
3348
3349 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3350 &value, &filename, &version))
3351 return NULL;
3352
3353 fp = fopen(filename, "wb");
3354 if (fp == NULL) {
3355 PyErr_SetFromErrno(PyExc_OSError);
3356 return NULL;
3357 }
3358
3359 PyMarshal_WriteLongToFile(value, fp, version);
3360
3361 fclose(fp);
3362 if (PyErr_Occurred())
3363 return NULL;
3364 Py_RETURN_NONE;
3365}
3366
3367static PyObject*
3368pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3369{
3370 PyObject *obj;
3371 char *filename;
3372 int version;
3373 FILE *fp;
3374
3375 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3376 &obj, &filename, &version))
3377 return NULL;
3378
3379 fp = fopen(filename, "wb");
3380 if (fp == NULL) {
3381 PyErr_SetFromErrno(PyExc_OSError);
3382 return NULL;
3383 }
3384
3385 PyMarshal_WriteObjectToFile(obj, fp, version);
3386
3387 fclose(fp);
3388 if (PyErr_Occurred())
3389 return NULL;
3390 Py_RETURN_NONE;
3391}
3392
3393static PyObject*
3394pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3395{
3396 int value;
3397 long pos;
3398 char *filename;
3399 FILE *fp;
3400
3401 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3402 return NULL;
3403
3404 fp = fopen(filename, "rb");
3405 if (fp == NULL) {
3406 PyErr_SetFromErrno(PyExc_OSError);
3407 return NULL;
3408 }
3409
3410 value = PyMarshal_ReadShortFromFile(fp);
3411 pos = ftell(fp);
3412
3413 fclose(fp);
3414 if (PyErr_Occurred())
3415 return NULL;
3416 return Py_BuildValue("il", value, pos);
3417}
3418
3419static PyObject*
3420pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3421{
3422 long value, pos;
3423 char *filename;
3424 FILE *fp;
3425
3426 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3427 return NULL;
3428
3429 fp = fopen(filename, "rb");
3430 if (fp == NULL) {
3431 PyErr_SetFromErrno(PyExc_OSError);
3432 return NULL;
3433 }
3434
3435 value = PyMarshal_ReadLongFromFile(fp);
3436 pos = ftell(fp);
3437
3438 fclose(fp);
3439 if (PyErr_Occurred())
3440 return NULL;
3441 return Py_BuildValue("ll", value, pos);
3442}
3443
3444static PyObject*
3445pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3446{
3447 PyObject *obj;
3448 long pos;
3449 char *filename;
3450 FILE *fp;
3451
3452 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3453 return NULL;
3454
3455 fp = fopen(filename, "rb");
3456 if (fp == NULL) {
3457 PyErr_SetFromErrno(PyExc_OSError);
3458 return NULL;
3459 }
3460
3461 obj = PyMarshal_ReadLastObjectFromFile(fp);
3462 pos = ftell(fp);
3463
3464 fclose(fp);
3465 return Py_BuildValue("Nl", obj, pos);
3466}
3467
3468static PyObject*
3469pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3470{
3471 PyObject *obj;
3472 long pos;
3473 char *filename;
3474 FILE *fp;
3475
3476 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3477 return NULL;
3478
3479 fp = fopen(filename, "rb");
3480 if (fp == NULL) {
3481 PyErr_SetFromErrno(PyExc_OSError);
3482 return NULL;
3483 }
3484
3485 obj = PyMarshal_ReadObjectFromFile(fp);
3486 pos = ftell(fp);
3487
3488 fclose(fp);
3489 return Py_BuildValue("Nl", obj, pos);
3490}
3491
Victor Stinnerefde1462015-03-21 15:04:43 +01003492static PyObject*
3493return_null_without_error(PyObject *self, PyObject *args)
3494{
3495 /* invalid call: return NULL without setting an error,
3496 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3497 PyErr_Clear();
3498 return NULL;
3499}
3500
3501static PyObject*
3502return_result_with_error(PyObject *self, PyObject *args)
3503{
3504 /* invalid call: return a result with an error set,
3505 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3506 PyErr_SetNone(PyExc_ValueError);
3507 Py_RETURN_NONE;
3508}
3509
Victor Stinner992c43f2015-03-27 17:12:45 +01003510static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02003511test_pytime_fromseconds(PyObject *self, PyObject *args)
3512{
3513 int seconds;
3514 _PyTime_t ts;
3515
3516 if (!PyArg_ParseTuple(args, "i", &seconds))
3517 return NULL;
3518 ts = _PyTime_FromSeconds(seconds);
3519 return _PyTime_AsNanosecondsObject(ts);
3520}
3521
3522static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01003523test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
3524{
3525 PyObject *obj;
3526 int round;
3527 _PyTime_t ts;
3528
3529 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
3530 return NULL;
3531 if (check_time_rounding(round) < 0)
3532 return NULL;
3533 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
3534 return NULL;
3535 return _PyTime_AsNanosecondsObject(ts);
3536}
3537
Victor Stinner4bfb4602015-03-27 22:27:24 +01003538static PyObject *
3539test_pytime_assecondsdouble(PyObject *self, PyObject *args)
3540{
3541 PY_LONG_LONG ns;
3542 _PyTime_t ts;
3543 double d;
3544
3545 if (!PyArg_ParseTuple(args, "L", &ns))
3546 return NULL;
3547 ts = _PyTime_FromNanoseconds(ns);
3548 d = _PyTime_AsSecondsDouble(ts);
3549 return PyFloat_FromDouble(d);
3550}
3551
Victor Stinner95e9cef2015-03-28 01:26:47 +01003552static PyObject *
3553test_PyTime_AsTimeval(PyObject *self, PyObject *args)
3554{
3555 PY_LONG_LONG ns;
3556 int round;
3557 _PyTime_t t;
3558 struct timeval tv;
3559 PyObject *seconds;
3560
3561 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3562 return NULL;
3563 if (check_time_rounding(round) < 0)
3564 return NULL;
3565 t = _PyTime_FromNanoseconds(ns);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +02003566 if (_PyTime_AsTimeval(t, &tv, round) < 0)
Victor Stinner95e9cef2015-03-28 01:26:47 +01003567 return NULL;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003568
3569 seconds = PyLong_FromLong((PY_LONG_LONG)tv.tv_sec);
3570 if (seconds == NULL)
3571 return NULL;
3572 return Py_BuildValue("Nl", seconds, tv.tv_usec);
3573}
3574
Victor Stinner34dc0f42015-03-27 18:19:03 +01003575#ifdef HAVE_CLOCK_GETTIME
3576static PyObject *
3577test_PyTime_AsTimespec(PyObject *self, PyObject *args)
3578{
3579 PY_LONG_LONG ns;
3580 _PyTime_t t;
3581 struct timespec ts;
3582
3583 if (!PyArg_ParseTuple(args, "L", &ns))
3584 return NULL;
3585 t = _PyTime_FromNanoseconds(ns);
3586 if (_PyTime_AsTimespec(t, &ts) == -1)
3587 return NULL;
3588 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
3589}
3590#endif
3591
Victor Stinner62d1c702015-04-01 17:47:07 +02003592static PyObject *
3593test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
3594{
3595 PY_LONG_LONG ns;
3596 int round;
3597 _PyTime_t t, ms;
3598
3599 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3600 return NULL;
3601 if (check_time_rounding(round) < 0)
3602 return NULL;
3603 t = _PyTime_FromNanoseconds(ns);
3604 ms = _PyTime_AsMilliseconds(t, round);
3605 /* This conversion rely on the fact that _PyTime_t is a number of
3606 nanoseconds */
3607 return _PyTime_AsNanosecondsObject(ms);
3608}
3609
3610static PyObject *
3611test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
3612{
3613 PY_LONG_LONG ns;
3614 int round;
3615 _PyTime_t t, ms;
3616
3617 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3618 return NULL;
3619 if (check_time_rounding(round) < 0)
3620 return NULL;
3621 t = _PyTime_FromNanoseconds(ns);
3622 ms = _PyTime_AsMicroseconds(t, round);
3623 /* This conversion rely on the fact that _PyTime_t is a number of
3624 nanoseconds */
3625 return _PyTime_AsNanosecondsObject(ms);
3626}
3627
Victor Stinner50856d52015-10-13 00:11:21 +02003628static PyObject*
3629get_recursion_depth(PyObject *self, PyObject *args)
3630{
3631 PyThreadState *tstate = PyThreadState_GET();
3632
3633 /* substract one to ignore the frame of the get_recursion_depth() call */
3634 return PyLong_FromLong(tstate->recursion_depth - 1);
3635}
3636
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003637
Tim Peters9ea17ac2001-02-02 05:57:15 +00003638static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003639 {"raise_exception", raise_exception, METH_VARARGS},
3640 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02003641 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003642 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01003643 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003644 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
3645 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
3646 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
3647 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003648 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003649 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
3650 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
3651 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
3652 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02003653 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003654 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
3655 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02003656 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
3657 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003658 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
3659 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
3660 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07003661 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003662 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
3663 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
3664 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
3665 PyDoc_STR("This is a pretty normal docstring.")},
3666 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
3667 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
3668 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01003669 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01003670#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01003671 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01003672#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01003673 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchakaacef5de2016-05-16 09:55:32 +03003674 {"get_args", get_args, METH_VARARGS},
3675 {"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003676 {"getargs_tuple", getargs_tuple, METH_VARARGS},
3677 {"getargs_keywords", (PyCFunction)getargs_keywords,
3678 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00003679 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
3680 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003681 {"getargs_b", getargs_b, METH_VARARGS},
3682 {"getargs_B", getargs_B, METH_VARARGS},
3683 {"getargs_h", getargs_h, METH_VARARGS},
3684 {"getargs_H", getargs_H, METH_VARARGS},
3685 {"getargs_I", getargs_I, METH_VARARGS},
3686 {"getargs_k", getargs_k, METH_VARARGS},
3687 {"getargs_i", getargs_i, METH_VARARGS},
3688 {"getargs_l", getargs_l, METH_VARARGS},
3689 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07003690 {"getargs_p", getargs_p, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00003691#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003692 {"getargs_L", getargs_L, METH_VARARGS},
3693 {"getargs_K", getargs_K, METH_VARARGS},
3694 {"test_longlong_api", test_longlong_api, METH_NOARGS},
3695 {"test_long_long_and_overflow",
3696 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
3697 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003698#endif
Eli Bendersky906b88f2011-07-29 07:05:08 +03003699 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02003700 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003701 {"getargs_s", getargs_s, METH_VARARGS},
3702 {"getargs_s_star", getargs_s_star, METH_VARARGS},
3703 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
3704 {"getargs_z", getargs_z, METH_VARARGS},
3705 {"getargs_z_star", getargs_z_star, METH_VARARGS},
3706 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
3707 {"getargs_y", getargs_y, METH_VARARGS},
3708 {"getargs_y_star", getargs_y_star, METH_VARARGS},
3709 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
3710 {"getargs_u", getargs_u, METH_VARARGS},
3711 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
3712 {"getargs_Z", getargs_Z, METH_VARARGS},
3713 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00003714 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02003715 {"getargs_es", getargs_es, METH_VARARGS},
3716 {"getargs_et", getargs_et, METH_VARARGS},
3717 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
3718 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003719 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003720 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003721 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00003722 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003723 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
3724 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
3725 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
3726 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01003727 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
3728 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
3729 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
3730 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01003731 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003732#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00003733 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003734 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00003735#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00003736#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00003737 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00003738#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00003739 {"traceback_print", traceback_print, METH_VARARGS},
3740 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02003741 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00003742 {"argparsing", argparsing, METH_VARARGS},
3743 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003744 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
3745 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003746 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
3747 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003748 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003749 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01003750 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
3751 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01003752 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02003753 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003754 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02003755 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02003756 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
3757 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02003758 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
3759 {"test_pymem_setallocators",
3760 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
3761 {"test_pyobject_setallocators",
3762 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003763 {"no_docstring",
3764 (PyCFunction)test_with_docstring, METH_NOARGS},
3765 {"docstring_empty",
3766 (PyCFunction)test_with_docstring, METH_NOARGS,
3767 docstring_empty},
3768 {"docstring_no_signature",
3769 (PyCFunction)test_with_docstring, METH_NOARGS,
3770 docstring_no_signature},
3771 {"docstring_with_invalid_signature",
3772 (PyCFunction)test_with_docstring, METH_NOARGS,
3773 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08003774 {"docstring_with_invalid_signature2",
3775 (PyCFunction)test_with_docstring, METH_NOARGS,
3776 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003777 {"docstring_with_signature",
3778 (PyCFunction)test_with_docstring, METH_NOARGS,
3779 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05003780 {"docstring_with_signature_but_no_doc",
3781 (PyCFunction)test_with_docstring, METH_NOARGS,
3782 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003783 {"docstring_with_signature_and_extra_newlines",
3784 (PyCFunction)test_with_docstring, METH_NOARGS,
3785 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08003786 {"docstring_with_signature_with_defaults",
3787 (PyCFunction)test_with_docstring, METH_NOARGS,
3788 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02003789 {"raise_signal",
3790 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01003791#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003792 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
3793 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01003794#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02003795 {"pymarshal_write_long_to_file",
3796 pymarshal_write_long_to_file, METH_VARARGS},
3797 {"pymarshal_write_object_to_file",
3798 pymarshal_write_object_to_file, METH_VARARGS},
3799 {"pymarshal_read_short_from_file",
3800 pymarshal_read_short_from_file, METH_VARARGS},
3801 {"pymarshal_read_long_from_file",
3802 pymarshal_read_long_from_file, METH_VARARGS},
3803 {"pymarshal_read_last_object_from_file",
3804 pymarshal_read_last_object_from_file, METH_VARARGS},
3805 {"pymarshal_read_object_from_file",
3806 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01003807 {"return_null_without_error",
3808 return_null_without_error, METH_NOARGS},
3809 {"return_result_with_error",
3810 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02003811 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01003812 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
3813 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01003814 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01003815#ifdef HAVE_CLOCK_GETTIME
3816 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
3817#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02003818 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
3819 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02003820 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003821 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00003822};
3823
Thomas Hellera4ea6032003-04-17 18:55:45 +00003824#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
3825
Thomas Wouters89f507f2006-12-13 04:49:30 +00003826typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003827 char bool_member;
3828 char byte_member;
3829 unsigned char ubyte_member;
3830 short short_member;
3831 unsigned short ushort_member;
3832 int int_member;
3833 unsigned int uint_member;
3834 long long_member;
3835 unsigned long ulong_member;
3836 Py_ssize_t pyssizet_member;
3837 float float_member;
3838 double double_member;
3839 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003840#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003841 PY_LONG_LONG longlong_member;
3842 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003843#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00003844} all_structmembers;
3845
3846typedef struct {
3847 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003848 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003849} test_structmembers;
3850
3851static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003852 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
3853 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
3854 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
3855 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
3856 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
3857 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
3858 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
3859 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
3860 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
3861 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
3862 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
3863 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
3864 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003865#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003866 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
3867 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003868#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003869 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00003870};
3871
3872
Christian Heimes1af737c2008-01-23 08:24:23 +00003873static PyObject *
3874test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
3875{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003876 static char *keywords[] = {
3877 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
3878 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
3879 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00003880#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003881 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00003882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003883 NULL};
3884 static char *fmt = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00003885#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003886 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00003887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003888 ;
3889 test_structmembers *ob;
3890 const char *s = NULL;
3891 Py_ssize_t string_len = 0;
3892 ob = PyObject_New(test_structmembers, type);
3893 if (ob == NULL)
3894 return NULL;
3895 memset(&ob->structmembers, 0, sizeof(all_structmembers));
3896 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
3897 &ob->structmembers.bool_member,
3898 &ob->structmembers.byte_member,
3899 &ob->structmembers.ubyte_member,
3900 &ob->structmembers.short_member,
3901 &ob->structmembers.ushort_member,
3902 &ob->structmembers.int_member,
3903 &ob->structmembers.uint_member,
3904 &ob->structmembers.long_member,
3905 &ob->structmembers.ulong_member,
3906 &ob->structmembers.pyssizet_member,
3907 &ob->structmembers.float_member,
3908 &ob->structmembers.double_member,
3909 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00003910#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003911 , &ob->structmembers.longlong_member,
3912 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00003913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003914 )) {
3915 Py_DECREF(ob);
3916 return NULL;
3917 }
3918 if (s != NULL) {
3919 if (string_len > 5) {
3920 Py_DECREF(ob);
3921 PyErr_SetString(PyExc_ValueError, "string too long");
3922 return NULL;
3923 }
3924 strcpy(ob->structmembers.inplace_member, s);
3925 }
3926 else {
3927 strcpy(ob->structmembers.inplace_member, "");
3928 }
3929 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003930}
3931
Christian Heimes1af737c2008-01-23 08:24:23 +00003932static void
3933test_structmembers_free(PyObject *ob)
3934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003935 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003936}
3937
3938static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003939 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003940 "test_structmembersType",
3941 sizeof(test_structmembers), /* tp_basicsize */
3942 0, /* tp_itemsize */
3943 test_structmembers_free, /* destructor tp_dealloc */
3944 0, /* tp_print */
3945 0, /* tp_getattr */
3946 0, /* tp_setattr */
3947 0, /* tp_reserved */
3948 0, /* tp_repr */
3949 0, /* tp_as_number */
3950 0, /* tp_as_sequence */
3951 0, /* tp_as_mapping */
3952 0, /* tp_hash */
3953 0, /* tp_call */
3954 0, /* tp_str */
3955 PyObject_GenericGetAttr, /* tp_getattro */
3956 PyObject_GenericSetAttr, /* tp_setattro */
3957 0, /* tp_as_buffer */
3958 0, /* tp_flags */
3959 "Type containing all structmember types",
3960 0, /* traverseproc tp_traverse */
3961 0, /* tp_clear */
3962 0, /* tp_richcompare */
3963 0, /* tp_weaklistoffset */
3964 0, /* tp_iter */
3965 0, /* tp_iternext */
3966 0, /* tp_methods */
3967 test_members, /* tp_members */
3968 0,
3969 0,
3970 0,
3971 0,
3972 0,
3973 0,
3974 0,
3975 0,
3976 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003977};
3978
3979
Benjamin Petersond51374e2014-04-09 23:55:56 -04003980typedef struct {
3981 PyObject_HEAD
3982} matmulObject;
3983
3984static PyObject *
3985matmulType_matmul(PyObject *self, PyObject *other)
3986{
3987 return Py_BuildValue("(sOO)", "matmul", self, other);
3988}
3989
3990static PyObject *
3991matmulType_imatmul(PyObject *self, PyObject *other)
3992{
3993 return Py_BuildValue("(sOO)", "imatmul", self, other);
3994}
3995
3996static void
3997matmulType_dealloc(PyObject *self)
3998{
Zachary Ware420dc562014-04-23 13:51:27 -05003999 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004000}
4001
4002static PyNumberMethods matmulType_as_number = {
4003 0, /* nb_add */
4004 0, /* nb_subtract */
4005 0, /* nb_multiply */
4006 0, /* nb_remainde r*/
4007 0, /* nb_divmod */
4008 0, /* nb_power */
4009 0, /* nb_negative */
4010 0, /* tp_positive */
4011 0, /* tp_absolute */
4012 0, /* tp_bool */
4013 0, /* nb_invert */
4014 0, /* nb_lshift */
4015 0, /* nb_rshift */
4016 0, /* nb_and */
4017 0, /* nb_xor */
4018 0, /* nb_or */
4019 0, /* nb_int */
4020 0, /* nb_reserved */
4021 0, /* nb_float */
4022 0, /* nb_inplace_add */
4023 0, /* nb_inplace_subtract */
4024 0, /* nb_inplace_multiply */
4025 0, /* nb_inplace_remainder */
4026 0, /* nb_inplace_power */
4027 0, /* nb_inplace_lshift */
4028 0, /* nb_inplace_rshift */
4029 0, /* nb_inplace_and */
4030 0, /* nb_inplace_xor */
4031 0, /* nb_inplace_or */
4032 0, /* nb_floor_divide */
4033 0, /* nb_true_divide */
4034 0, /* nb_inplace_floor_divide */
4035 0, /* nb_inplace_true_divide */
4036 0, /* nb_index */
4037 matmulType_matmul, /* nb_matrix_multiply */
4038 matmulType_imatmul /* nb_matrix_inplace_multiply */
4039};
4040
4041static PyTypeObject matmulType = {
4042 PyVarObject_HEAD_INIT(NULL, 0)
4043 "matmulType",
4044 sizeof(matmulObject), /* tp_basicsize */
4045 0, /* tp_itemsize */
4046 matmulType_dealloc, /* destructor tp_dealloc */
4047 0, /* tp_print */
4048 0, /* tp_getattr */
4049 0, /* tp_setattr */
4050 0, /* tp_reserved */
4051 0, /* tp_repr */
4052 &matmulType_as_number, /* tp_as_number */
4053 0, /* tp_as_sequence */
4054 0, /* tp_as_mapping */
4055 0, /* tp_hash */
4056 0, /* tp_call */
4057 0, /* tp_str */
4058 PyObject_GenericGetAttr, /* tp_getattro */
4059 PyObject_GenericSetAttr, /* tp_setattro */
4060 0, /* tp_as_buffer */
4061 0, /* tp_flags */
4062 "C level type with matrix operations defined",
4063 0, /* traverseproc tp_traverse */
4064 0, /* tp_clear */
4065 0, /* tp_richcompare */
4066 0, /* tp_weaklistoffset */
4067 0, /* tp_iter */
4068 0, /* tp_iternext */
4069 0, /* tp_methods */
4070 0, /* tp_members */
4071 0,
4072 0,
4073 0,
4074 0,
4075 0,
4076 0,
4077 0,
4078 0,
4079 PyType_GenericNew, /* tp_new */
4080 PyObject_Del, /* tp_free */
4081};
4082
Martin v. Löwis1a214512008-06-11 05:26:20 +00004083
Yury Selivanov75445082015-05-11 22:57:16 -04004084typedef struct {
4085 PyObject_HEAD
4086 PyObject *ao_iterator;
4087} awaitObject;
4088
4089
4090static PyObject *
4091awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4092{
4093 PyObject *v;
4094 awaitObject *ao;
4095
4096 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
4097 return NULL;
4098
4099 ao = (awaitObject *)type->tp_alloc(type, 0);
4100 if (ao == NULL) {
4101 return NULL;
4102 }
4103
4104 Py_INCREF(v);
4105 ao->ao_iterator = v;
4106
4107 return (PyObject *)ao;
4108}
4109
4110
4111static void
4112awaitObject_dealloc(awaitObject *ao)
4113{
4114 Py_CLEAR(ao->ao_iterator);
4115 Py_TYPE(ao)->tp_free(ao);
4116}
4117
4118
4119static PyObject *
4120awaitObject_await(awaitObject *ao)
4121{
4122 Py_INCREF(ao->ao_iterator);
4123 return ao->ao_iterator;
4124}
4125
4126static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04004127 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04004128 0, /* am_aiter */
4129 0 /* am_anext */
4130};
4131
4132
4133static PyTypeObject awaitType = {
4134 PyVarObject_HEAD_INIT(NULL, 0)
4135 "awaitType",
4136 sizeof(awaitObject), /* tp_basicsize */
4137 0, /* tp_itemsize */
4138 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
4139 0, /* tp_print */
4140 0, /* tp_getattr */
4141 0, /* tp_setattr */
4142 &awaitType_as_async, /* tp_as_async */
4143 0, /* tp_repr */
4144 0, /* tp_as_number */
4145 0, /* tp_as_sequence */
4146 0, /* tp_as_mapping */
4147 0, /* tp_hash */
4148 0, /* tp_call */
4149 0, /* tp_str */
4150 PyObject_GenericGetAttr, /* tp_getattro */
4151 PyObject_GenericSetAttr, /* tp_setattro */
4152 0, /* tp_as_buffer */
4153 0, /* tp_flags */
4154 "C level type with tp_as_async",
4155 0, /* traverseproc tp_traverse */
4156 0, /* tp_clear */
4157 0, /* tp_richcompare */
4158 0, /* tp_weaklistoffset */
4159 0, /* tp_iter */
4160 0, /* tp_iternext */
4161 0, /* tp_methods */
4162 0, /* tp_members */
4163 0,
4164 0,
4165 0,
4166 0,
4167 0,
4168 0,
4169 0,
4170 0,
4171 awaitObject_new, /* tp_new */
4172 PyObject_Del, /* tp_free */
4173};
4174
4175
Martin v. Löwis1a214512008-06-11 05:26:20 +00004176static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004177 PyModuleDef_HEAD_INIT,
4178 "_testcapi",
4179 NULL,
4180 -1,
4181 TestMethods,
4182 NULL,
4183 NULL,
4184 NULL,
4185 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004186};
4187
Nick Coghland5cacbb2015-05-23 22:24:10 +10004188/* Per PEP 489, this module will not be converted to multi-phase initialization
4189 */
4190
Mark Hammond62b1ab12002-07-23 06:31:15 +00004191PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004192PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00004193{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004194 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004196 m = PyModule_Create(&_testcapimodule);
4197 if (m == NULL)
4198 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004200 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00004201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004202 Py_TYPE(&test_structmembersType)=&PyType_Type;
4203 Py_INCREF(&test_structmembersType);
4204 /* don't use a name starting with "test", since we don't want
4205 test_capi to automatically call this */
4206 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004207 if (PyType_Ready(&matmulType) < 0)
4208 return NULL;
4209 Py_INCREF(&matmulType);
4210 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004211
Yury Selivanov75445082015-05-11 22:57:16 -04004212 if (PyType_Ready(&awaitType) < 0)
4213 return NULL;
4214 Py_INCREF(&awaitType);
4215 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
4216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004217 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
4218 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
4219 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
4220 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
4221 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
4222 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
4223 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
4224 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
4225 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
4226 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
4227 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
4228 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
4229 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
4230 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
4231 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
4232 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
4233 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
4234 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
4235 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
4236 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
4237 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
4238 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
4239 Py_INCREF(&PyInstanceMethod_Type);
4240 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00004241
Larry Hastings2a727912014-01-16 11:32:01 -08004242 PyModule_AddIntConstant(m, "the_number_three", 3);
4243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004244 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
4245 Py_INCREF(TestError);
4246 PyModule_AddObject(m, "error", TestError);
4247 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004248}