blob: 38935237512fcde3a28ee7008f9608494937f810 [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 Storchakace412872016-05-08 23:36:44 +0300875static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300876return_none(void *unused)
877{
878 Py_RETURN_NONE;
879}
880
881static PyObject *
882raise_error(void *unused)
883{
884 PyErr_SetNone(PyExc_ValueError);
885 return NULL;
886}
887
888static int
889test_buildvalue_N_error(const char *fmt)
890{
891 PyObject *arg, *res;
892
893 arg = PyList_New(0);
894 if (arg == NULL) {
895 return -1;
896 }
897
898 Py_INCREF(arg);
899 res = Py_BuildValue(fmt, return_none, NULL, arg);
900 if (res == NULL) {
901 return -1;
902 }
903 Py_DECREF(res);
904 if (Py_REFCNT(arg) != 1) {
905 PyErr_Format(TestError, "test_buildvalue_N: "
906 "arg was not decrefed in successful "
907 "Py_BuildValue(\"%s\")", fmt);
908 return -1;
909 }
910
911 Py_INCREF(arg);
912 res = Py_BuildValue(fmt, raise_error, NULL, arg);
913 if (res != NULL || !PyErr_Occurred()) {
914 PyErr_Format(TestError, "test_buildvalue_N: "
915 "Py_BuildValue(\"%s\") didn't complain", fmt);
916 return -1;
917 }
918 PyErr_Clear();
919 if (Py_REFCNT(arg) != 1) {
920 PyErr_Format(TestError, "test_buildvalue_N: "
921 "arg was not decrefed in failed "
922 "Py_BuildValue(\"%s\")", fmt);
923 return -1;
924 }
925 Py_DECREF(arg);
926 return 0;
927}
928
929static PyObject *
930test_buildvalue_N(PyObject *self, PyObject *noargs)
931{
932 PyObject *arg, *res;
933
934 arg = PyList_New(0);
935 if (arg == NULL) {
936 return NULL;
937 }
938 Py_INCREF(arg);
939 res = Py_BuildValue("N", arg);
940 if (res == NULL) {
941 return NULL;
942 }
943 if (res != arg) {
944 return raiseTestError("test_buildvalue_N",
945 "Py_BuildValue(\"N\") returned wrong result");
946 }
947 if (Py_REFCNT(arg) != 2) {
948 return raiseTestError("test_buildvalue_N",
949 "arg was not decrefed in Py_BuildValue(\"N\")");
950 }
951 Py_DECREF(res);
952 Py_DECREF(arg);
953
954 if (test_buildvalue_N_error("O&N") < 0)
955 return NULL;
956 if (test_buildvalue_N_error("(O&N)") < 0)
957 return NULL;
958 if (test_buildvalue_N_error("[O&N]") < 0)
959 return NULL;
960 if (test_buildvalue_N_error("{O&N}") < 0)
961 return NULL;
962 if (test_buildvalue_N_error("{()O&(())N}") < 0)
963 return NULL;
964
965 Py_RETURN_NONE;
966}
967
968
969static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +0300970get_args(PyObject *self, PyObject *args)
971{
972 if (args == NULL) {
973 args = Py_None;
974 }
975 Py_INCREF(args);
976 return args;
977}
978
979static PyObject *
980get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
981{
982 if (kwargs == NULL) {
983 kwargs = Py_None;
984 }
985 Py_INCREF(kwargs);
986 return kwargs;
987}
988
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000989/* Test tuple argument processing */
990static PyObject *
991getargs_tuple(PyObject *self, PyObject *args)
992{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 int a, b, c;
994 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
995 return NULL;
996 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000997}
998
Christian Heimes380f7f22008-02-28 11:19:05 +0000999/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001000static PyObject *
1001getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001004 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1008 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1009 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1010 return NULL;
1011 return Py_BuildValue("iiiiiiiiii",
1012 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1013 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001014}
1015
Larry Hastings83a9f482012-03-20 20:06:16 +00001016/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1017static PyObject *
1018getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1019{
1020 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1021 int required = -1;
1022 int optional = -1;
1023 int keyword_only = -1;
1024
1025 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1026 &required, &optional, &keyword_only))
1027 return NULL;
1028 return Py_BuildValue("iii", required, optional, keyword_only);
1029}
1030
Thomas Heller3457e4b2003-04-24 16:14:27 +00001031/* Functions to call PyArg_ParseTuple with integer format codes,
1032 and return the result.
1033*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001034static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001035getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001036{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 unsigned char value;
1038 if (!PyArg_ParseTuple(args, "b", &value))
1039 return NULL;
1040 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001041}
1042
Thomas Heller3457e4b2003-04-24 16:14:27 +00001043static PyObject *
1044getargs_B(PyObject *self, PyObject *args)
1045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 unsigned char value;
1047 if (!PyArg_ParseTuple(args, "B", &value))
1048 return NULL;
1049 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001050}
1051
1052static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001053getargs_h(PyObject *self, PyObject *args)
1054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 short value;
1056 if (!PyArg_ParseTuple(args, "h", &value))
1057 return NULL;
1058 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001059}
1060
1061static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001062getargs_H(PyObject *self, PyObject *args)
1063{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 unsigned short value;
1065 if (!PyArg_ParseTuple(args, "H", &value))
1066 return NULL;
1067 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001068}
1069
1070static PyObject *
1071getargs_I(PyObject *self, PyObject *args)
1072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 unsigned int value;
1074 if (!PyArg_ParseTuple(args, "I", &value))
1075 return NULL;
1076 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001077}
1078
1079static PyObject *
1080getargs_k(PyObject *self, PyObject *args)
1081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 unsigned long value;
1083 if (!PyArg_ParseTuple(args, "k", &value))
1084 return NULL;
1085 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001086}
1087
1088static PyObject *
1089getargs_i(PyObject *self, PyObject *args)
1090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 int value;
1092 if (!PyArg_ParseTuple(args, "i", &value))
1093 return NULL;
1094 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001095}
1096
Thomas Hellera4ea6032003-04-17 18:55:45 +00001097static PyObject *
1098getargs_l(PyObject *self, PyObject *args)
1099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 long value;
1101 if (!PyArg_ParseTuple(args, "l", &value))
1102 return NULL;
1103 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001104}
1105
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001106static PyObject *
1107getargs_n(PyObject *self, PyObject *args)
1108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 Py_ssize_t value;
1110 if (!PyArg_ParseTuple(args, "n", &value))
1111 return NULL;
1112 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001113}
1114
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001115static PyObject *
1116getargs_p(PyObject *self, PyObject *args)
1117{
1118 int value;
1119 if (!PyArg_ParseTuple(args, "p", &value))
1120 return NULL;
1121 return PyLong_FromLong(value);
1122}
1123
Thomas Hellera4ea6032003-04-17 18:55:45 +00001124#ifdef HAVE_LONG_LONG
Thomas Hellera4ea6032003-04-17 18:55:45 +00001125static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001126getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001127{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 PY_LONG_LONG value;
1129 if (!PyArg_ParseTuple(args, "L", &value))
1130 return NULL;
1131 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001132}
1133
Thomas Hellera4ea6032003-04-17 18:55:45 +00001134static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001135getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 unsigned PY_LONG_LONG value;
1138 if (!PyArg_ParseTuple(args, "K", &value))
1139 return NULL;
1140 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001141}
1142#endif
1143
1144/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +00001145 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001146static PyObject *
1147test_k_code(PyObject *self)
1148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 PyObject *tuple, *num;
1150 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 tuple = PyTuple_New(1);
1153 if (tuple == NULL)
1154 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 /* a number larger than ULONG_MAX even on 64-bit platforms */
1157 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1158 if (num == NULL)
1159 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 value = PyLong_AsUnsignedLongMask(num);
1162 if (value != ULONG_MAX)
1163 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001164 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 value = 0;
1169 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1170 return NULL;
1171 if (value != ULONG_MAX)
1172 return raiseTestError("test_k_code",
1173 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 Py_DECREF(num);
1176 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1177 if (num == NULL)
1178 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 value = PyLong_AsUnsignedLongMask(num);
1181 if (value != (unsigned long)-0x42)
1182 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001183 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 value = 0;
1188 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1189 return NULL;
1190 if (value != (unsigned long)-0x42)
1191 return raiseTestError("test_k_code",
1192 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 Py_DECREF(tuple);
1195 Py_INCREF(Py_None);
1196 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001197}
1198
Victor Stinner06e49dd2010-06-13 18:21:50 +00001199static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001200getargs_f(PyObject *self, PyObject *args)
1201{
1202 float f;
1203 if (!PyArg_ParseTuple(args, "f", &f))
1204 return NULL;
1205 return PyFloat_FromDouble(f);
1206}
1207
1208static PyObject *
1209getargs_d(PyObject *self, PyObject *args)
1210{
1211 double d;
1212 if (!PyArg_ParseTuple(args, "d", &d))
1213 return NULL;
1214 return PyFloat_FromDouble(d);
1215}
1216
1217static PyObject *
1218getargs_D(PyObject *self, PyObject *args)
1219{
1220 Py_complex cval;
1221 if (!PyArg_ParseTuple(args, "D", &cval))
1222 return NULL;
1223 return PyComplex_FromCComplex(cval);
1224}
1225
1226static PyObject *
1227getargs_S(PyObject *self, PyObject *args)
1228{
1229 PyObject *obj;
1230 if (!PyArg_ParseTuple(args, "S", &obj))
1231 return NULL;
1232 Py_INCREF(obj);
1233 return obj;
1234}
1235
1236static PyObject *
1237getargs_Y(PyObject *self, PyObject *args)
1238{
1239 PyObject *obj;
1240 if (!PyArg_ParseTuple(args, "Y", &obj))
1241 return NULL;
1242 Py_INCREF(obj);
1243 return obj;
1244}
1245
1246static PyObject *
1247getargs_U(PyObject *self, PyObject *args)
1248{
1249 PyObject *obj;
1250 if (!PyArg_ParseTuple(args, "U", &obj))
1251 return NULL;
1252 Py_INCREF(obj);
1253 return obj;
1254}
1255
1256static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001257getargs_c(PyObject *self, PyObject *args)
1258{
1259 char c;
1260 if (!PyArg_ParseTuple(args, "c", &c))
1261 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001262 return PyLong_FromLong((unsigned char)c);
1263}
1264
1265static PyObject *
1266getargs_C(PyObject *self, PyObject *args)
1267{
1268 int c;
1269 if (!PyArg_ParseTuple(args, "C", &c))
1270 return NULL;
1271 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001272}
1273
1274static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001275getargs_s(PyObject *self, PyObject *args)
1276{
1277 char *str;
1278 if (!PyArg_ParseTuple(args, "s", &str))
1279 return NULL;
1280 return PyBytes_FromString(str);
1281}
1282
1283static PyObject *
1284getargs_s_star(PyObject *self, PyObject *args)
1285{
1286 Py_buffer buffer;
1287 PyObject *bytes;
1288 if (!PyArg_ParseTuple(args, "s*", &buffer))
1289 return NULL;
1290 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1291 PyBuffer_Release(&buffer);
1292 return bytes;
1293}
1294
1295static PyObject *
1296getargs_s_hash(PyObject *self, PyObject *args)
1297{
1298 char *str;
1299 Py_ssize_t size;
1300 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1301 return NULL;
1302 return PyBytes_FromStringAndSize(str, size);
1303}
1304
1305static PyObject *
1306getargs_z(PyObject *self, PyObject *args)
1307{
1308 char *str;
1309 if (!PyArg_ParseTuple(args, "z", &str))
1310 return NULL;
1311 if (str != NULL)
1312 return PyBytes_FromString(str);
1313 else
1314 Py_RETURN_NONE;
1315}
1316
1317static PyObject *
1318getargs_z_star(PyObject *self, PyObject *args)
1319{
1320 Py_buffer buffer;
1321 PyObject *bytes;
1322 if (!PyArg_ParseTuple(args, "z*", &buffer))
1323 return NULL;
1324 if (buffer.buf != NULL)
1325 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1326 else {
1327 Py_INCREF(Py_None);
1328 bytes = Py_None;
1329 }
1330 PyBuffer_Release(&buffer);
1331 return bytes;
1332}
1333
1334static PyObject *
1335getargs_z_hash(PyObject *self, PyObject *args)
1336{
1337 char *str;
1338 Py_ssize_t size;
1339 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1340 return NULL;
1341 if (str != NULL)
1342 return PyBytes_FromStringAndSize(str, size);
1343 else
1344 Py_RETURN_NONE;
1345}
1346
1347static PyObject *
1348getargs_y(PyObject *self, PyObject *args)
1349{
1350 char *str;
1351 if (!PyArg_ParseTuple(args, "y", &str))
1352 return NULL;
1353 return PyBytes_FromString(str);
1354}
1355
1356static PyObject *
1357getargs_y_star(PyObject *self, PyObject *args)
1358{
1359 Py_buffer buffer;
1360 PyObject *bytes;
1361 if (!PyArg_ParseTuple(args, "y*", &buffer))
1362 return NULL;
1363 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1364 PyBuffer_Release(&buffer);
1365 return bytes;
1366}
1367
1368static PyObject *
1369getargs_y_hash(PyObject *self, PyObject *args)
1370{
1371 char *str;
1372 Py_ssize_t size;
1373 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1374 return NULL;
1375 return PyBytes_FromStringAndSize(str, size);
1376}
1377
1378static PyObject *
1379getargs_u(PyObject *self, PyObject *args)
1380{
1381 Py_UNICODE *str;
1382 Py_ssize_t size;
1383 if (!PyArg_ParseTuple(args, "u", &str))
1384 return NULL;
1385 size = Py_UNICODE_strlen(str);
1386 return PyUnicode_FromUnicode(str, size);
1387}
1388
1389static PyObject *
1390getargs_u_hash(PyObject *self, PyObject *args)
1391{
1392 Py_UNICODE *str;
1393 Py_ssize_t size;
1394 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1395 return NULL;
1396 return PyUnicode_FromUnicode(str, size);
1397}
1398
1399static PyObject *
1400getargs_Z(PyObject *self, PyObject *args)
1401{
1402 Py_UNICODE *str;
1403 Py_ssize_t size;
1404 if (!PyArg_ParseTuple(args, "Z", &str))
1405 return NULL;
1406 if (str != NULL) {
1407 size = Py_UNICODE_strlen(str);
1408 return PyUnicode_FromUnicode(str, size);
1409 } else
1410 Py_RETURN_NONE;
1411}
1412
1413static PyObject *
1414getargs_Z_hash(PyObject *self, PyObject *args)
1415{
1416 Py_UNICODE *str;
1417 Py_ssize_t size;
1418 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1419 return NULL;
1420 if (str != NULL)
1421 return PyUnicode_FromUnicode(str, size);
1422 else
1423 Py_RETURN_NONE;
1424}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001425
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001426static PyObject *
1427getargs_es(PyObject *self, PyObject *args)
1428{
1429 PyObject *arg, *result;
1430 const char *encoding = NULL;
1431 char *str;
1432
1433 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1434 return NULL;
1435 if (!PyArg_Parse(arg, "es", encoding, &str))
1436 return NULL;
1437 result = PyBytes_FromString(str);
1438 PyMem_Free(str);
1439 return result;
1440}
1441
1442static PyObject *
1443getargs_et(PyObject *self, PyObject *args)
1444{
1445 PyObject *arg, *result;
1446 const char *encoding = NULL;
1447 char *str;
1448
1449 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1450 return NULL;
1451 if (!PyArg_Parse(arg, "et", encoding, &str))
1452 return NULL;
1453 result = PyBytes_FromString(str);
1454 PyMem_Free(str);
1455 return result;
1456}
1457
1458static PyObject *
1459getargs_es_hash(PyObject *self, PyObject *args)
1460{
1461 PyObject *arg, *result;
1462 const char *encoding = NULL;
1463 PyByteArrayObject *buffer = NULL;
1464 char *str = NULL;
1465 Py_ssize_t size;
1466
1467 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1468 return NULL;
1469 if (buffer != NULL) {
1470 str = PyByteArray_AS_STRING(buffer);
1471 size = PyByteArray_GET_SIZE(buffer);
1472 }
1473 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1474 return NULL;
1475 result = PyBytes_FromStringAndSize(str, size);
1476 if (buffer == NULL)
1477 PyMem_Free(str);
1478 return result;
1479}
1480
1481static PyObject *
1482getargs_et_hash(PyObject *self, PyObject *args)
1483{
1484 PyObject *arg, *result;
1485 const char *encoding = NULL;
1486 PyByteArrayObject *buffer = NULL;
1487 char *str = NULL;
1488 Py_ssize_t size;
1489
1490 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1491 return NULL;
1492 if (buffer != NULL) {
1493 str = PyByteArray_AS_STRING(buffer);
1494 size = PyByteArray_GET_SIZE(buffer);
1495 }
1496 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1497 return NULL;
1498 result = PyBytes_FromStringAndSize(str, size);
1499 if (buffer == NULL)
1500 PyMem_Free(str);
1501 return result;
1502}
1503
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001504/* Test the s and z codes for PyArg_ParseTuple.
1505*/
1506static PyObject *
1507test_s_code(PyObject *self)
1508{
1509 /* Unicode strings should be accepted */
1510 PyObject *tuple, *obj;
1511 char *value;
1512
1513 tuple = PyTuple_New(1);
1514 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001516
1517 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001519 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001521
1522 PyTuple_SET_ITEM(tuple, 0, obj);
1523
1524 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001526 */
1527 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001529
1530 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001532
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001533 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001534 Py_RETURN_NONE;
1535}
1536
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001537static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001538parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001539{
Larry Hastings8f904da2012-06-22 03:56:29 -07001540 PyObject *sub_args;
1541 PyObject *sub_kwargs;
1542 char *sub_format;
1543 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001544
Larry Hastings8f904da2012-06-22 03:56:29 -07001545 Py_ssize_t i, size;
1546 char *keywords[8 + 1]; /* space for NULL at end */
1547 PyObject *o;
1548 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001549
Larry Hastings8f904da2012-06-22 03:56:29 -07001550 int result;
1551 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001552
Larry Hastings22701e82012-08-08 14:52:22 -07001553 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001554
Larry Hastings8f904da2012-06-22 03:56:29 -07001555 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1556 &sub_args, &sub_kwargs,
1557 &sub_format, &sub_keywords))
1558 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001559
Larry Hastings8f904da2012-06-22 03:56:29 -07001560 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1561 PyErr_SetString(PyExc_ValueError,
1562 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1563 return NULL;
1564 }
1565
1566 memset(buffers, 0, sizeof(buffers));
1567 memset(converted, 0, sizeof(converted));
1568 memset(keywords, 0, sizeof(keywords));
1569
1570 size = PySequence_Fast_GET_SIZE(sub_keywords);
1571 if (size > 8) {
1572 PyErr_SetString(PyExc_ValueError,
1573 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1574 goto exit;
1575 }
1576
1577 for (i = 0; i < size; i++) {
1578 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1579 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1580 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001581 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001582 goto exit;
1583 }
1584 keywords[i] = PyBytes_AS_STRING(converted[i]);
1585 }
1586
1587 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1588 sub_format, keywords,
1589 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1590 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1591
1592 if (result) {
1593 return_value = Py_None;
1594 Py_INCREF(Py_None);
1595 }
1596
1597exit:
1598 size = sizeof(converted) / sizeof(converted[0]);
1599 for (i = 0; i < size; i++) {
1600 Py_XDECREF(converted[i]);
1601 }
1602 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001603}
1604
Benjamin Peterson92035012008-12-27 16:00:54 +00001605static volatile int x;
1606
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001607/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1608 of an error.
1609*/
1610static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001611test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001612{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 PyObject *tuple, *obj;
1614 Py_UNICODE *value;
1615 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1618 /* Just use the macro and check that it compiles */
1619 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 tuple = PyTuple_New(1);
1622 if (tuple == NULL)
1623 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 obj = PyUnicode_Decode("test", strlen("test"),
1626 "ascii", NULL);
1627 if (obj == NULL)
1628 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 value = 0;
1633 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1634 return NULL;
1635 if (value != PyUnicode_AS_UNICODE(obj))
1636 return raiseTestError("test_u_code",
1637 "u code returned wrong value for u'test'");
1638 value = 0;
1639 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1640 return NULL;
1641 if (value != PyUnicode_AS_UNICODE(obj) ||
1642 len != PyUnicode_GET_SIZE(obj))
1643 return raiseTestError("test_u_code",
1644 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 Py_DECREF(tuple);
1647 Py_INCREF(Py_None);
1648 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001649}
1650
Guido van Rossumfb67be22007-08-29 18:38:11 +00001651/* Test Z and Z# codes for PyArg_ParseTuple */
1652static PyObject *
1653test_Z_code(PyObject *self)
1654{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001656 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 tuple = PyTuple_New(2);
1660 if (tuple == NULL)
1661 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 obj = PyUnicode_FromString("test");
1664 PyTuple_SET_ITEM(tuple, 0, obj);
1665 Py_INCREF(Py_None);
1666 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 /* swap values on purpose */
1669 value1 = NULL;
1670 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 /* Test Z for both values */
1673 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1674 return NULL;
1675 if (value1 != PyUnicode_AS_UNICODE(obj))
1676 return raiseTestError("test_Z_code",
1677 "Z code returned wrong value for 'test'");
1678 if (value2 != NULL)
1679 return raiseTestError("test_Z_code",
1680 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 value1 = NULL;
1683 value2 = PyUnicode_AS_UNICODE(obj);
1684 len1 = -1;
1685 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 /* Test Z# for both values */
1688 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1689 &value2, &len2) < 0)
1690 return NULL;
1691 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1692 len1 != PyUnicode_GET_SIZE(obj))
1693 return raiseTestError("test_Z_code",
1694 "Z# code returned wrong values for 'test'");
1695 if (value2 != NULL ||
1696 len2 != 0)
1697 return raiseTestError("test_Z_code",
1698 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 Py_DECREF(tuple);
1701 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001702}
1703
Thomas Wouters477c8d52006-05-27 19:21:47 +00001704static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001705test_widechar(PyObject *self)
1706{
1707#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1709 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001710 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001711#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1713 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001714#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1718 if (wide == NULL)
1719 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1722 if (utf8 == NULL) {
1723 Py_DECREF(wide);
1724 return NULL;
1725 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001726
Victor Stinner8ef18872011-11-21 02:06:57 +01001727 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 Py_DECREF(wide);
1729 Py_DECREF(utf8);
1730 return raiseTestError("test_widechar",
1731 "wide string and utf8 string "
1732 "have different length");
1733 }
1734 if (PyUnicode_Compare(wide, utf8)) {
1735 Py_DECREF(wide);
1736 Py_DECREF(utf8);
1737 if (PyErr_Occurred())
1738 return NULL;
1739 return raiseTestError("test_widechar",
1740 "wide string and utf8 string "
1741 "are different");
1742 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 Py_DECREF(wide);
1745 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001746
1747#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1748 wide = PyUnicode_FromWideChar(invalid, 1);
1749 if (wide == NULL)
1750 PyErr_Clear();
1751 else
1752 return raiseTestError("test_widechar",
1753 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1754
1755 wide = PyUnicode_FromUnicode(invalid, 1);
1756 if (wide == NULL)
1757 PyErr_Clear();
1758 else
1759 return raiseTestError("test_widechar",
1760 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001761
1762 wide = PyUnicode_FromUnicode(NULL, 1);
1763 if (wide == NULL)
1764 return NULL;
1765 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001766 if (_PyUnicode_Ready(wide) < 0) {
1767 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001768 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001769 }
1770 else {
1771 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001772 return raiseTestError("test_widechar",
1773 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001774 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001775#endif
1776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001778}
1779
1780static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001781unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001782{
1783 PyObject *unicode, *result;
1784 Py_ssize_t buflen, size;
1785 wchar_t *buffer;
1786
1787 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1788 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001789 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001790 if (buffer == NULL)
1791 return PyErr_NoMemory();
1792
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001793 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001794 if (size == -1) {
1795 PyMem_Free(buffer);
1796 return NULL;
1797 }
1798
1799 if (size < buflen)
1800 buflen = size + 1;
1801 else
1802 buflen = size;
1803 result = PyUnicode_FromWideChar(buffer, buflen);
1804 PyMem_Free(buffer);
1805 if (result == NULL)
1806 return NULL;
1807
1808 return Py_BuildValue("(Nn)", result, size);
1809}
1810
1811static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001812unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001813{
1814 PyObject *unicode, *result;
1815 Py_ssize_t size;
1816 wchar_t *buffer;
1817
1818 if (!PyArg_ParseTuple(args, "U", &unicode))
1819 return NULL;
1820
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001821 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001822 if (buffer == NULL)
1823 return NULL;
1824
1825 result = PyUnicode_FromWideChar(buffer, size + 1);
1826 PyMem_Free(buffer);
1827 if (result == NULL)
1828 return NULL;
1829 return Py_BuildValue("(Nn)", result, size);
1830}
1831
1832static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001833unicode_encodedecimal(PyObject *self, PyObject *args)
1834{
1835 Py_UNICODE *unicode;
1836 Py_ssize_t length;
1837 char *errors = NULL;
1838 PyObject *decimal;
1839 Py_ssize_t decimal_length, new_length;
1840 int res;
1841
1842 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1843 return NULL;
1844
1845 decimal_length = length * 7; /* len('&#8364;') */
1846 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1847 if (decimal == NULL)
1848 return NULL;
1849
1850 res = PyUnicode_EncodeDecimal(unicode, length,
1851 PyBytes_AS_STRING(decimal),
1852 errors);
1853 if (res < 0) {
1854 Py_DECREF(decimal);
1855 return NULL;
1856 }
1857
1858 new_length = strlen(PyBytes_AS_STRING(decimal));
1859 assert(new_length <= decimal_length);
1860 res = _PyBytes_Resize(&decimal, new_length);
1861 if (res < 0)
1862 return NULL;
1863
1864 return decimal;
1865}
1866
1867static PyObject *
1868unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1869{
1870 Py_UNICODE *unicode;
1871 Py_ssize_t length;
1872 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1873 return NULL;
1874 return PyUnicode_TransformDecimalToASCII(unicode, length);
1875}
1876
1877static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001878unicode_legacy_string(PyObject *self, PyObject *args)
1879{
1880 Py_UNICODE *data;
1881 Py_ssize_t len;
1882 PyObject *u;
1883
1884 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1885 return NULL;
1886
1887 u = PyUnicode_FromUnicode(NULL, len);
1888 if (u == NULL)
1889 return NULL;
1890
1891 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1892
1893 if (len > 0) { /* The empty string is always ready. */
1894 assert(!PyUnicode_IS_READY(u));
1895 }
1896
1897 return u;
1898}
1899
1900static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001901getargs_w_star(PyObject *self, PyObject *args)
1902{
1903 Py_buffer buffer;
1904 PyObject *result;
1905 char *str;
1906
1907 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1908 return NULL;
1909
1910 if (2 <= buffer.len) {
1911 str = buffer.buf;
1912 str[0] = '[';
1913 str[buffer.len-1] = ']';
1914 }
1915
1916 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1917 PyBuffer_Release(&buffer);
1918 return result;
1919}
1920
1921
1922static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00001923test_empty_argparse(PyObject *self)
1924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 /* Test that formats can begin with '|'. See issue #4720. */
1926 PyObject *tuple, *dict = NULL;
1927 static char *kwlist[] = {NULL};
1928 int result;
1929 tuple = PyTuple_New(0);
1930 if (!tuple)
1931 return NULL;
1932 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
1933 goto done;
1934 dict = PyDict_New();
1935 if (!dict)
1936 goto done;
1937 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00001938 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 Py_DECREF(tuple);
1940 Py_XDECREF(dict);
1941 if (result < 0)
1942 return NULL;
1943 else {
1944 Py_RETURN_NONE;
1945 }
Benjamin Peterson92035012008-12-27 16:00:54 +00001946}
1947
1948static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001949codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001950{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 const char *encoding, *errors = NULL;
1952 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
1953 &encoding, &errors))
1954 return NULL;
1955 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001956}
1957
Thomas Wouters477c8d52006-05-27 19:21:47 +00001958static PyObject *
1959codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001960{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 const char *encoding, *errors = NULL;
1962 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
1963 &encoding, &errors))
1964 return NULL;
1965 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001966}
1967
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001968
Tim Peters5b8132f2003-01-31 15:52:05 +00001969/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00001970static PyObject *
1971test_long_numbits(PyObject *self)
1972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 struct triple {
1974 long input;
1975 size_t nbits;
1976 int sign;
1977 } testcases[] = {{0, 0, 0},
1978 {1L, 1, 1},
1979 {-1L, 1, -1},
1980 {2L, 2, 1},
1981 {-2L, 2, -1},
1982 {3L, 2, 1},
1983 {-3L, 2, -1},
1984 {4L, 3, 1},
1985 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03001986 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 {-0x7fffL, 15, -1},
1988 {0xffffL, 16, 1},
1989 {-0xffffL, 16, -1},
1990 {0xfffffffL, 28, 1},
1991 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02001992 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00001993
Victor Stinner63941882011-09-29 00:42:28 +02001994 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02001995 size_t nbits;
1996 int sign;
1997 PyObject *plong;
1998
1999 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002000 if (plong == NULL)
2001 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002002 nbits = _PyLong_NumBits(plong);
2003 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 Py_DECREF(plong);
2006 if (nbits != testcases[i].nbits)
2007 return raiseTestError("test_long_numbits",
2008 "wrong result for _PyLong_NumBits");
2009 if (sign != testcases[i].sign)
2010 return raiseTestError("test_long_numbits",
2011 "wrong result for _PyLong_Sign");
2012 }
2013 Py_INCREF(Py_None);
2014 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002015}
2016
Thomas Heller519a0422007-11-15 20:48:54 +00002017/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002018
2019static PyObject *
2020test_null_strings(PyObject *self)
2021{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2023 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2024 Py_XDECREF(o1);
2025 Py_XDECREF(o2);
2026 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002027}
2028
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002029static PyObject *
2030raise_exception(PyObject *self, PyObject *args)
2031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 PyObject *exc;
2033 PyObject *exc_args, *v;
2034 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2037 &exc, &num_args))
2038 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 exc_args = PyTuple_New(num_args);
2041 if (exc_args == NULL)
2042 return NULL;
2043 for (i = 0; i < num_args; ++i) {
2044 v = PyLong_FromLong(i);
2045 if (v == NULL) {
2046 Py_DECREF(exc_args);
2047 return NULL;
2048 }
2049 PyTuple_SET_ITEM(exc_args, i, v);
2050 }
2051 PyErr_SetObject(exc, exc_args);
2052 Py_DECREF(exc_args);
2053 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002054}
Tim Peters91621db2001-06-12 20:10:01 +00002055
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002056static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002057set_errno(PyObject *self, PyObject *args)
2058{
2059 int new_errno;
2060
2061 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2062 return NULL;
2063
2064 errno = new_errno;
2065 Py_RETURN_NONE;
2066}
2067
2068static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002069test_set_exc_info(PyObject *self, PyObject *args)
2070{
2071 PyObject *orig_exc;
2072 PyObject *new_type, *new_value, *new_tb;
2073 PyObject *type, *value, *tb;
2074 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2075 &new_type, &new_value, &new_tb))
2076 return NULL;
2077
2078 PyErr_GetExcInfo(&type, &value, &tb);
2079
2080 Py_INCREF(new_type);
2081 Py_INCREF(new_value);
2082 Py_INCREF(new_tb);
2083 PyErr_SetExcInfo(new_type, new_value, new_tb);
2084
2085 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2086 Py_XDECREF(type);
2087 Py_XDECREF(value);
2088 Py_XDECREF(tb);
2089 return orig_exc;
2090}
Benjamin Peterson16323982010-02-03 01:13:41 +00002091
2092static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002093
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002094static PyObject *
2095test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 if (PyDateTimeAPI) {
2097 if (test_run_counter) {
2098 /* Probably regrtest.py -R */
2099 Py_RETURN_NONE;
2100 }
2101 else {
2102 PyErr_SetString(PyExc_AssertionError,
2103 "PyDateTime_CAPI somehow initialized");
2104 return NULL;
2105 }
2106 }
2107 test_run_counter++;
2108 PyDateTime_IMPORT;
2109 if (PyDateTimeAPI)
2110 Py_RETURN_NONE;
2111 else
2112 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002113}
2114
Benjamin Peterson16323982010-02-03 01:13:41 +00002115
2116#ifdef WITH_THREAD
2117
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002118/* test_thread_state spawns a thread of its own, and that thread releases
2119 * `thread_done` when it's finished. The driver code has to know when the
2120 * thread finishes, because the thread uses a PyObject (the callable) that
2121 * may go away when the driver finishes. The former lack of this explicit
2122 * synchronization caused rare segfaults, so rare that they were seen only
2123 * on a Mac buildbot (although they were possible on any box).
2124 */
2125static PyThread_type_lock thread_done = NULL;
2126
Benjamin Petersona786b022008-08-25 21:05:21 +00002127static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002128_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 PyObject *rc;
2131 int success;
2132 PyGILState_STATE s = PyGILState_Ensure();
2133 rc = PyObject_CallFunction((PyObject *)callable, "");
2134 success = (rc != NULL);
2135 Py_XDECREF(rc);
2136 PyGILState_Release(s);
2137 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002138}
2139
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002140/* Same thing, but releases `thread_done` when it returns. This variant
2141 * should be called only from threads spawned by test_thread_state().
2142 */
2143static void
2144_make_call_from_thread(void *callable)
2145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 _make_call(callable);
2147 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002148}
2149
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002150static PyObject *
2151test_thread_state(PyObject *self, PyObject *args)
2152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 PyObject *fn;
2154 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2157 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 if (!PyCallable_Check(fn)) {
2160 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2161 fn->ob_type->tp_name);
2162 return NULL;
2163 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 /* Ensure Python is set up for threading */
2166 PyEval_InitThreads();
2167 thread_done = PyThread_allocate_lock();
2168 if (thread_done == NULL)
2169 return PyErr_NoMemory();
2170 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 /* Start a new thread with our callback. */
2173 PyThread_start_new_thread(_make_call_from_thread, fn);
2174 /* Make the callback with the thread lock held by this thread */
2175 success &= _make_call(fn);
2176 /* Do it all again, but this time with the thread-lock released */
2177 Py_BEGIN_ALLOW_THREADS
2178 success &= _make_call(fn);
2179 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2180 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 /* And once more with and without a thread
2183 XXX - should use a lock and work out exactly what we are trying
2184 to test <wink>
2185 */
2186 Py_BEGIN_ALLOW_THREADS
2187 PyThread_start_new_thread(_make_call_from_thread, fn);
2188 success &= _make_call(fn);
2189 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2190 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 /* Release lock we acquired above. This is required on HP-UX. */
2193 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 PyThread_free_lock(thread_done);
2196 if (!success)
2197 return NULL;
2198 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002199}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002200
2201/* test Py_AddPendingCalls using threads */
2202static int _pending_callback(void *arg)
2203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 /* we assume the argument is callable object to which we own a reference */
2205 PyObject *callable = (PyObject *)arg;
2206 PyObject *r = PyObject_CallObject(callable, NULL);
2207 Py_DECREF(callable);
2208 Py_XDECREF(r);
2209 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002210}
2211
2212/* The following requests n callbacks to _pending_callback. It can be
2213 * run from any python thread.
2214 */
2215PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
2216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 PyObject *callable;
2218 int r;
2219 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2220 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002222 /* create the reference for the callbackwhile we hold the lock */
2223 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002225 Py_BEGIN_ALLOW_THREADS
2226 r = Py_AddPendingCall(&_pending_callback, callable);
2227 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 if (r<0) {
2230 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
2231 Py_INCREF(Py_False);
2232 return Py_False;
2233 }
2234 Py_INCREF(Py_True);
2235 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002236}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002237#endif
2238
Neal Norwitzb0d26332007-08-25 00:49:05 +00002239/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002240static PyObject *
2241test_string_from_format(PyObject *self, PyObject *args)
2242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 PyObject *result;
2244 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002245
Alexander Belopolskye239d232010-12-08 23:31:48 +00002246#define CHECK_1_FORMAT(FORMAT, TYPE) \
2247 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2248 if (result == NULL) \
2249 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01002250 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002251 msg = FORMAT " failed at 1"; \
2252 goto Fail; \
2253 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 CHECK_1_FORMAT("%d", int);
2257 CHECK_1_FORMAT("%ld", long);
2258 /* The z width modifier was added in Python 2.5. */
2259 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 /* The u type code was added in Python 2.5. */
2262 CHECK_1_FORMAT("%u", unsigned int);
2263 CHECK_1_FORMAT("%lu", unsigned long);
2264 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 /* "%lld" and "%llu" support added in Python 2.7. */
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002267#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 CHECK_1_FORMAT("%llu", unsigned PY_LONG_LONG);
2269 CHECK_1_FORMAT("%lld", PY_LONG_LONG);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002270#endif
2271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002273
2274 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 Py_XDECREF(result);
2276 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002277
2278#undef CHECK_1_FORMAT
2279}
2280
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002281
2282static PyObject *
2283test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002284 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2285 int result;
2286 if (py_s == NULL)
2287 return NULL;
2288 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2289 Py_DECREF(py_s);
2290 if (!result) {
2291 PyErr_SetString(TestError, "Python string ending in NULL "
2292 "should not compare equal to c string.");
2293 return NULL;
2294 }
2295 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002296}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002297
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002298/* This is here to provide a docstring for test_descr. */
2299static PyObject *
2300test_with_docstring(PyObject *self)
2301{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002303}
2304
Mark Dickinson725bfd82009-05-03 20:33:40 +00002305/* Test PyOS_string_to_double. */
2306static PyObject *
2307test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 double result;
2309 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002311#define CHECK_STRING(STR, expected) \
2312 result = PyOS_string_to_double(STR, NULL, NULL); \
2313 if (result == -1.0 && PyErr_Occurred()) \
2314 return NULL; \
2315 if (result != expected) { \
2316 msg = "conversion of " STR " to float failed"; \
2317 goto fail; \
2318 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320#define CHECK_INVALID(STR) \
2321 result = PyOS_string_to_double(STR, NULL, NULL); \
2322 if (result == -1.0 && PyErr_Occurred()) { \
2323 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2324 PyErr_Clear(); \
2325 else \
2326 return NULL; \
2327 } \
2328 else { \
2329 msg = "conversion of " STR " didn't raise ValueError"; \
2330 goto fail; \
2331 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002333 CHECK_STRING("0.1", 0.1);
2334 CHECK_STRING("1.234", 1.234);
2335 CHECK_STRING("-1.35", -1.35);
2336 CHECK_STRING(".1e01", 1.0);
2337 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 CHECK_INVALID(" 0.1");
2340 CHECK_INVALID("\t\n-3");
2341 CHECK_INVALID(".123 ");
2342 CHECK_INVALID("3\n");
2343 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002346 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002348#undef CHECK_STRING
2349#undef CHECK_INVALID
2350}
2351
2352
Benjamin Petersonb173f782009-05-05 22:31:58 +00002353/* Coverage testing of capsule objects. */
2354
2355static const char *capsule_name = "capsule name";
2356static char *capsule_pointer = "capsule pointer";
2357static char *capsule_context = "capsule context";
2358static const char *capsule_error = NULL;
2359static int
2360capsule_destructor_call_count = 0;
2361
2362static void
2363capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 capsule_destructor_call_count++;
2365 if (PyCapsule_GetContext(o) != capsule_context) {
2366 capsule_error = "context did not match in destructor!";
2367 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2368 capsule_error = "destructor did not match in destructor! (woah!)";
2369 } else if (PyCapsule_GetName(o) != capsule_name) {
2370 capsule_error = "name did not match in destructor!";
2371 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2372 capsule_error = "pointer did not match in destructor!";
2373 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002374}
2375
2376typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 char *name;
2378 char *module;
2379 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002380} known_capsule;
2381
2382static PyObject *
2383test_capsule(PyObject *self, PyObject *args)
2384{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 PyObject *object;
2386 const char *error = NULL;
2387 void *pointer;
2388 void *pointer2;
2389 known_capsule known_capsules[] = {
2390 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2391 KNOWN_CAPSULE("_socket", "CAPI"),
2392 KNOWN_CAPSULE("_curses", "_C_API"),
2393 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2394 { NULL, NULL },
2395 };
2396 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002397
2398#define FAIL(x) { error = (x); goto exit; }
2399
2400#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 if (capsule_error) { \
2402 FAIL(capsule_error); \
2403 } \
2404 else if (!capsule_destructor_call_count) { \
2405 FAIL("destructor not called!"); \
2406 } \
2407 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2410 PyCapsule_SetContext(object, capsule_context);
2411 capsule_destructor(object);
2412 CHECK_DESTRUCTOR;
2413 Py_DECREF(object);
2414 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 object = PyCapsule_New(known, "ignored", NULL);
2417 PyCapsule_SetPointer(object, capsule_pointer);
2418 PyCapsule_SetName(object, capsule_name);
2419 PyCapsule_SetDestructor(object, capsule_destructor);
2420 PyCapsule_SetContext(object, capsule_context);
2421 capsule_destructor(object);
2422 CHECK_DESTRUCTOR;
2423 /* intentionally access using the wrong name */
2424 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2425 if (!PyErr_Occurred()) {
2426 FAIL("PyCapsule_GetPointer should have failed but did not!");
2427 }
2428 PyErr_Clear();
2429 if (pointer2) {
2430 if (pointer2 == capsule_pointer) {
2431 FAIL("PyCapsule_GetPointer should not have"
2432 " returned the internal pointer!");
2433 } else {
2434 FAIL("PyCapsule_GetPointer should have "
2435 "returned NULL pointer but did not!");
2436 }
2437 }
2438 PyCapsule_SetDestructor(object, NULL);
2439 Py_DECREF(object);
2440 if (capsule_destructor_call_count) {
2441 FAIL("destructor called when it should not have been!");
2442 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 for (known = &known_capsules[0]; known->module != NULL; known++) {
2445 /* yeah, ordinarily I wouldn't do this either,
2446 but it's fine for this test harness.
2447 */
2448 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002449#undef FAIL
2450#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 { \
2452 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2453 x, known->module, known->attribute); \
2454 error = buffer; \
2455 goto exit; \
2456 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 PyObject *module = PyImport_ImportModule(known->module);
2459 if (module) {
2460 pointer = PyCapsule_Import(known->name, 0);
2461 if (!pointer) {
2462 Py_DECREF(module);
2463 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2464 }
2465 object = PyObject_GetAttrString(module, known->attribute);
2466 if (!object) {
2467 Py_DECREF(module);
2468 return NULL;
2469 }
2470 pointer2 = PyCapsule_GetPointer(object,
2471 "weebles wobble but they don't fall down");
2472 if (!PyErr_Occurred()) {
2473 Py_DECREF(object);
2474 Py_DECREF(module);
2475 FAIL("PyCapsule_GetPointer should have failed but did not!");
2476 }
2477 PyErr_Clear();
2478 if (pointer2) {
2479 Py_DECREF(module);
2480 Py_DECREF(object);
2481 if (pointer2 == pointer) {
2482 FAIL("PyCapsule_GetPointer should not have"
2483 " returned its internal pointer!");
2484 } else {
2485 FAIL("PyCapsule_GetPointer should have"
2486 " returned NULL pointer but did not!");
2487 }
2488 }
2489 Py_DECREF(object);
2490 Py_DECREF(module);
2491 }
2492 else
2493 PyErr_Clear();
2494 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002495
2496 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 if (error) {
2498 return raiseTestError("test_capsule", error);
2499 }
2500 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002501#undef FAIL
2502}
2503
Guido van Rossumddefaf32007-01-14 03:31:43 +00002504#ifdef HAVE_GETTIMEOFDAY
2505/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002506static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002507{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 e->tv_sec -= s->tv_sec;
2509 e->tv_usec -= s->tv_usec;
2510 if (e->tv_usec < 0) {
2511 e->tv_sec -=1;
2512 e->tv_usec += 1000000;
2513 }
2514 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002515}
2516
2517static PyObject *
2518profile_int(PyObject *self, PyObject* args)
2519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 int i, k;
2521 struct timeval start, stop;
2522 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 /* Test 1: Allocate and immediately deallocate
2525 many small integers */
2526 gettimeofday(&start, NULL);
2527 for(k=0; k < 20000; k++)
2528 for(i=0; i < 1000; i++) {
2529 single = PyLong_FromLong(i);
2530 Py_DECREF(single);
2531 }
2532 gettimeofday(&stop, NULL);
2533 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535 /* Test 2: Allocate and immediately deallocate
2536 many large integers */
2537 gettimeofday(&start, NULL);
2538 for(k=0; k < 20000; k++)
2539 for(i=0; i < 1000; i++) {
2540 single = PyLong_FromLong(i+1000000);
2541 Py_DECREF(single);
2542 }
2543 gettimeofday(&stop, NULL);
2544 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 /* Test 3: Allocate a few integers, then release
2547 them all simultaneously. */
2548 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002549 if (multiple == NULL)
2550 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 gettimeofday(&start, NULL);
2552 for(k=0; k < 20000; k++) {
2553 for(i=0; i < 1000; i++) {
2554 multiple[i] = PyLong_FromLong(i+1000000);
2555 }
2556 for(i=0; i < 1000; i++) {
2557 Py_DECREF(multiple[i]);
2558 }
2559 }
2560 gettimeofday(&stop, NULL);
2561 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002562 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 /* Test 4: Allocate many integers, then release
2565 them all simultaneously. */
2566 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002567 if (multiple == NULL)
2568 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002569 gettimeofday(&start, NULL);
2570 for(k=0; k < 20; k++) {
2571 for(i=0; i < 1000000; i++) {
2572 multiple[i] = PyLong_FromLong(i+1000000);
2573 }
2574 for(i=0; i < 1000000; i++) {
2575 Py_DECREF(multiple[i]);
2576 }
2577 }
2578 gettimeofday(&stop, NULL);
2579 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002580 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 /* Test 5: Allocate many integers < 32000 */
2583 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002584 if (multiple == NULL)
2585 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002586 gettimeofday(&start, NULL);
2587 for(k=0; k < 10; k++) {
2588 for(i=0; i < 1000000; i++) {
2589 multiple[i] = PyLong_FromLong(i+1000);
2590 }
2591 for(i=0; i < 1000000; i++) {
2592 Py_DECREF(multiple[i]);
2593 }
2594 }
2595 gettimeofday(&stop, NULL);
2596 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002597 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 /* Test 6: Perform small int addition */
2600 op1 = PyLong_FromLong(1);
2601 gettimeofday(&start, NULL);
2602 for(i=0; i < 10000000; i++) {
2603 result = PyNumber_Add(op1, op1);
2604 Py_DECREF(result);
2605 }
2606 gettimeofday(&stop, NULL);
2607 Py_DECREF(op1);
2608 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 /* Test 7: Perform medium int addition */
2611 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002612 if (op1 == NULL)
2613 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 gettimeofday(&start, NULL);
2615 for(i=0; i < 10000000; i++) {
2616 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002617 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 }
2619 gettimeofday(&stop, NULL);
2620 Py_DECREF(op1);
2621 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 Py_INCREF(Py_None);
2624 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002625}
2626#endif
2627
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002628/* To test the format of tracebacks as printed out. */
2629static PyObject *
2630traceback_print(PyObject *self, PyObject *args)
2631{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 PyObject *file;
2633 PyObject *traceback;
2634 int result;
2635
2636 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2637 &traceback, &file))
2638 return NULL;
2639
2640 result = PyTraceBack_Print(traceback, file);
2641 if (result < 0)
2642 return NULL;
2643 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002644}
2645
Benjamin Petersone6528212008-07-15 15:32:09 +00002646/* To test the format of exceptions as printed out. */
2647static PyObject *
2648exception_print(PyObject *self, PyObject *args)
2649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002650 PyObject *value;
2651 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 if (!PyArg_ParseTuple(args, "O:exception_print",
2654 &value))
2655 return NULL;
2656 if (!PyExceptionInstance_Check(value)) {
2657 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2658 return NULL;
2659 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 tb = PyException_GetTraceback(value);
2662 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2663 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002665 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002666}
2667
2668
2669
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002670
2671/* reliably raise a MemoryError */
2672static PyObject *
2673raise_memoryerror(PyObject *self)
2674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 PyErr_NoMemory();
2676 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002677}
2678
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002679/* Issue 6012 */
2680static PyObject *str1, *str2;
2681static int
2682failing_converter(PyObject *obj, void *arg)
2683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 /* Clone str1, then let the conversion fail. */
2685 assert(str1);
2686 str2 = str1;
2687 Py_INCREF(str2);
2688 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002689}
2690static PyObject*
2691argparsing(PyObject *o, PyObject *args)
2692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 PyObject *res;
2694 str1 = str2 = NULL;
2695 if (!PyArg_ParseTuple(args, "O&O&",
2696 PyUnicode_FSConverter, &str1,
2697 failing_converter, &str2)) {
2698 if (!str2)
2699 /* argument converter not called? */
2700 return NULL;
2701 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002702 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 Py_DECREF(str2);
2704 PyErr_Clear();
2705 return res;
2706 }
2707 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002708}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002709
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002710/* To test that the result of PyCode_NewEmpty has the right members. */
2711static PyObject *
2712code_newempty(PyObject *self, PyObject *args)
2713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 const char *filename;
2715 const char *funcname;
2716 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2719 &filename, &funcname, &firstlineno))
2720 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002723}
2724
Georg Brandl1e28a272009-12-28 08:41:01 +00002725/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2726 Run via Lib/test/test_exceptions.py */
2727static PyObject *
2728make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 const char *name;
2731 const char *doc = NULL;
2732 PyObject *base = NULL;
2733 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2738 "s|sOO:make_exception_with_doc", kwlist,
2739 &name, &doc, &base, &dict))
2740 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002743}
2744
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002745static PyObject *
2746make_memoryview_from_NULL_pointer(PyObject *self)
2747{
2748 Py_buffer info;
2749 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2750 return NULL;
2751 return PyMemoryView_FromBuffer(&info);
2752}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002753
Stefan Krah7213fcc2015-02-01 16:19:23 +01002754static PyObject *
2755test_from_contiguous(PyObject* self, PyObject *noargs)
2756{
2757 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2758 int init[5] = {0, 1, 2, 3, 4};
2759 Py_ssize_t itemsize = sizeof(int);
2760 Py_ssize_t shape = 5;
2761 Py_ssize_t strides = 2 * itemsize;
2762 Py_buffer view = {
2763 data,
2764 NULL,
2765 5 * itemsize,
2766 itemsize,
2767 1,
2768 1,
2769 NULL,
2770 &shape,
2771 &strides,
2772 NULL,
2773 NULL
2774 };
2775 int *ptr;
2776 int i;
2777
2778 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2779 ptr = view.buf;
2780 for (i = 0; i < 5; i++) {
2781 if (ptr[2*i] != i) {
2782 PyErr_SetString(TestError,
2783 "test_from_contiguous: incorrect result");
2784 return NULL;
2785 }
2786 }
2787
2788 view.buf = &data[8];
2789 view.strides[0] = -2 * itemsize;
2790
2791 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2792 ptr = view.buf;
2793 for (i = 0; i < 5; i++) {
2794 if (*(ptr-2*i) != i) {
2795 PyErr_SetString(TestError,
2796 "test_from_contiguous: incorrect result");
2797 return NULL;
2798 }
2799 }
2800
2801 Py_RETURN_NONE;
2802}
Stefan Krah650c1e82015-02-03 21:43:23 +01002803
Stefan Kraha7559c02015-02-03 22:27:21 +01002804#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01002805extern PyTypeObject _PyBytesIOBuffer_Type;
2806
Stefan Krah5178d912015-02-03 16:57:21 +01002807static PyObject *
2808test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
2809{
Stefan Krah650c1e82015-02-03 21:43:23 +01002810 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01002811 PyObject *b;
2812 char *dummy[1];
2813 int ret, match;
2814
Stefan Krah650c1e82015-02-03 21:43:23 +01002815 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01002816 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
2817 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2818 PyErr_Clear();
2819 if (ret != -1 || match == 0)
2820 goto error;
2821
Stefan Krah650c1e82015-02-03 21:43:23 +01002822 /* bytesiobuf_getbuffer() */
2823 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01002824 if (b == NULL) {
2825 return NULL;
2826 }
2827
2828 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
2829 Py_DECREF(b);
2830 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2831 PyErr_Clear();
2832 if (ret != -1 || match == 0)
2833 goto error;
2834
2835 Py_RETURN_NONE;
2836
2837error:
2838 PyErr_SetString(TestError,
2839 "test_pep3118_obsolete_write_locks: failure");
2840 return NULL;
2841}
Stefan Kraha7559c02015-02-03 22:27:21 +01002842#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002843
Stefan Krah650c1e82015-02-03 21:43:23 +01002844/* This tests functions that historically supported write locks. It is
2845 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
2846 is entitled to segfault in that case. */
2847static PyObject *
2848getbuffer_with_null_view(PyObject* self, PyObject *obj)
2849{
2850 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
2851 return NULL;
2852
2853 Py_RETURN_NONE;
2854}
2855
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002856/* Test that the fatal error from not having a current thread doesn't
2857 cause an infinite loop. Run via Lib/test/test_capi.py */
2858static PyObject *
2859crash_no_current_thread(PyObject *self)
2860{
2861 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002862 /* Using PyThreadState_Get() directly allows the test to pass in
2863 !pydebug mode. However, the test only actually tests anything
2864 in pydebug mode, since that's where the infinite loop was in
2865 the first place. */
2866 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002867 Py_END_ALLOW_THREADS
2868 return NULL;
2869}
2870
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002871/* To run some code in a sub-interpreter. */
2872static PyObject *
2873run_in_subinterp(PyObject *self, PyObject *args)
2874{
2875 const char *code;
2876 int r;
2877 PyThreadState *substate, *mainstate;
2878
2879 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2880 &code))
2881 return NULL;
2882
2883 mainstate = PyThreadState_Get();
2884
2885 PyThreadState_Swap(NULL);
2886
2887 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002888 if (substate == NULL) {
2889 /* Since no new thread state was created, there is no exception to
2890 propagate; raise a fresh one after swapping in the old thread
2891 state. */
2892 PyThreadState_Swap(mainstate);
2893 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2894 return NULL;
2895 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002896 r = PyRun_SimpleString(code);
2897 Py_EndInterpreter(substate);
2898
2899 PyThreadState_Swap(mainstate);
2900
2901 return PyLong_FromLong(r);
2902}
2903
Victor Stinner3c1b3792014-02-17 00:02:43 +01002904static int
2905check_time_rounding(int round)
2906{
Victor Stinner74474232015-09-02 01:43:56 +02002907 if (round != _PyTime_ROUND_FLOOR
2908 && round != _PyTime_ROUND_CEILING
Victor Stinner7667f582015-09-09 01:02:23 +02002909 && round != _PyTime_ROUND_HALF_EVEN) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01002910 PyErr_SetString(PyExc_ValueError, "invalid rounding");
2911 return -1;
2912 }
2913 return 0;
2914}
2915
Victor Stinner5d272cc2012-03-13 13:35:55 +01002916static PyObject *
2917test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2918{
2919 PyObject *obj;
2920 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002921 int round;
2922 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002923 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002924 if (check_time_rounding(round) < 0)
2925 return NULL;
2926 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002927 return NULL;
2928 return _PyLong_FromTime_t(sec);
2929}
2930
2931static PyObject *
2932test_pytime_object_to_timeval(PyObject *self, PyObject *args)
2933{
2934 PyObject *obj;
2935 time_t sec;
2936 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002937 int round;
2938 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002939 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002940 if (check_time_rounding(round) < 0)
2941 return NULL;
2942 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01002943 return NULL;
2944 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
2945}
2946
Victor Stinner643cd682012-03-02 22:54:03 +01002947static PyObject *
2948test_pytime_object_to_timespec(PyObject *self, PyObject *args)
2949{
2950 PyObject *obj;
2951 time_t sec;
2952 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002953 int round;
2954 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01002955 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002956 if (check_time_rounding(round) < 0)
2957 return NULL;
2958 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01002959 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01002960 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01002961}
2962
Antoine Pitrou796564c2013-07-30 19:59:21 +02002963static void
2964slot_tp_del(PyObject *self)
2965{
2966 _Py_IDENTIFIER(__tp_del__);
2967 PyObject *del, *res;
2968 PyObject *error_type, *error_value, *error_traceback;
2969
2970 /* Temporarily resurrect the object. */
2971 assert(self->ob_refcnt == 0);
2972 self->ob_refcnt = 1;
2973
2974 /* Save the current exception, if any. */
2975 PyErr_Fetch(&error_type, &error_value, &error_traceback);
2976
2977 /* Execute __del__ method, if any. */
2978 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
2979 if (del != NULL) {
2980 res = PyEval_CallObject(del, NULL);
2981 if (res == NULL)
2982 PyErr_WriteUnraisable(del);
2983 else
2984 Py_DECREF(res);
2985 Py_DECREF(del);
2986 }
2987
2988 /* Restore the saved exception. */
2989 PyErr_Restore(error_type, error_value, error_traceback);
2990
2991 /* Undo the temporary resurrection; can't use DECREF here, it would
2992 * cause a recursive call.
2993 */
2994 assert(self->ob_refcnt > 0);
2995 if (--self->ob_refcnt == 0)
2996 return; /* this is the normal path out */
2997
2998 /* __del__ resurrected it! Make it look like the original Py_DECREF
2999 * never happened.
3000 */
3001 {
3002 Py_ssize_t refcnt = self->ob_refcnt;
3003 _Py_NewReference(self);
3004 self->ob_refcnt = refcnt;
3005 }
3006 assert(!PyType_IS_GC(Py_TYPE(self)) ||
3007 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
3008 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3009 * we need to undo that. */
3010 _Py_DEC_REFTOTAL;
3011 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3012 * chain, so no more to do there.
3013 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3014 * _Py_NewReference bumped tp_allocs: both of those need to be
3015 * undone.
3016 */
3017#ifdef COUNT_ALLOCS
3018 --Py_TYPE(self)->tp_frees;
3019 --Py_TYPE(self)->tp_allocs;
3020#endif
3021}
3022
3023static PyObject *
3024with_tp_del(PyObject *self, PyObject *args)
3025{
3026 PyObject *obj;
3027 PyTypeObject *tp;
3028
3029 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3030 return NULL;
3031 tp = (PyTypeObject *) obj;
3032 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3033 PyErr_Format(PyExc_TypeError,
3034 "heap type expected, got %R", obj);
3035 return NULL;
3036 }
3037 tp->tp_del = slot_tp_del;
3038 Py_INCREF(obj);
3039 return obj;
3040}
3041
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003042static PyMethodDef ml;
3043
3044static PyObject *
3045create_cfunction(PyObject *self, PyObject *args)
3046{
3047 return PyCFunction_NewEx(&ml, self, NULL);
3048}
3049
3050static PyMethodDef ml = {
3051 "create_cfunction",
3052 create_cfunction,
3053 METH_NOARGS,
3054 NULL
3055};
3056
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003057static PyObject *
3058_test_incref(PyObject *ob)
3059{
3060 Py_INCREF(ob);
3061 return ob;
3062}
3063
3064static PyObject *
3065test_xincref_doesnt_leak(PyObject *ob)
3066{
3067 PyObject *obj = PyLong_FromLong(0);
3068 Py_XINCREF(_test_incref(obj));
3069 Py_DECREF(obj);
3070 Py_DECREF(obj);
3071 Py_DECREF(obj);
3072 Py_RETURN_NONE;
3073}
3074
3075static PyObject *
3076test_incref_doesnt_leak(PyObject *ob)
3077{
3078 PyObject *obj = PyLong_FromLong(0);
3079 Py_INCREF(_test_incref(obj));
3080 Py_DECREF(obj);
3081 Py_DECREF(obj);
3082 Py_DECREF(obj);
3083 Py_RETURN_NONE;
3084}
3085
3086static PyObject *
3087test_xdecref_doesnt_leak(PyObject *ob)
3088{
3089 Py_XDECREF(PyLong_FromLong(0));
3090 Py_RETURN_NONE;
3091}
3092
3093static PyObject *
3094test_decref_doesnt_leak(PyObject *ob)
3095{
3096 Py_DECREF(PyLong_FromLong(0));
3097 Py_RETURN_NONE;
3098}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003099
Victor Stinner0507bf52013-07-07 02:05:46 +02003100static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02003101test_incref_decref_API(PyObject *ob)
3102{
3103 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003104 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003105 Py_DecRef(obj);
3106 Py_DecRef(obj);
3107 Py_RETURN_NONE;
3108}
3109
3110static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02003111test_pymem_alloc0(PyObject *self)
3112{
3113 void *ptr;
3114
Victor Stinnerdb067af2014-05-02 22:31:14 +02003115 ptr = PyMem_RawMalloc(0);
3116 if (ptr == NULL) {
3117 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3118 return NULL;
3119 }
3120 PyMem_RawFree(ptr);
3121
3122 ptr = PyMem_RawCalloc(0, 0);
3123 if (ptr == NULL) {
3124 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3125 return NULL;
3126 }
3127 PyMem_RawFree(ptr);
3128
Victor Stinner0507bf52013-07-07 02:05:46 +02003129 ptr = PyMem_Malloc(0);
3130 if (ptr == NULL) {
3131 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3132 return NULL;
3133 }
3134 PyMem_Free(ptr);
3135
Victor Stinnerdb067af2014-05-02 22:31:14 +02003136 ptr = PyMem_Calloc(0, 0);
3137 if (ptr == NULL) {
3138 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3139 return NULL;
3140 }
3141 PyMem_Free(ptr);
3142
Victor Stinner0507bf52013-07-07 02:05:46 +02003143 ptr = PyObject_Malloc(0);
3144 if (ptr == NULL) {
3145 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3146 return NULL;
3147 }
3148 PyObject_Free(ptr);
3149
Victor Stinnerdb067af2014-05-02 22:31:14 +02003150 ptr = PyObject_Calloc(0, 0);
3151 if (ptr == NULL) {
3152 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3153 return NULL;
3154 }
3155 PyObject_Free(ptr);
3156
Victor Stinner0507bf52013-07-07 02:05:46 +02003157 Py_RETURN_NONE;
3158}
3159
3160typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003161 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003162
3163 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003164 size_t calloc_nelem;
3165 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003166 void *realloc_ptr;
3167 size_t realloc_new_size;
3168 void *free_ptr;
3169} alloc_hook_t;
3170
3171static void* hook_malloc (void* ctx, size_t size)
3172{
3173 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3174 hook->malloc_size = size;
3175 return hook->alloc.malloc(hook->alloc.ctx, size);
3176}
3177
Victor Stinnerdb067af2014-05-02 22:31:14 +02003178static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
3179{
3180 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3181 hook->calloc_nelem = nelem;
3182 hook->calloc_elsize = elsize;
3183 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3184}
3185
Victor Stinner0507bf52013-07-07 02:05:46 +02003186static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
3187{
3188 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3189 hook->realloc_ptr = ptr;
3190 hook->realloc_new_size = new_size;
3191 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3192}
3193
3194static void hook_free (void *ctx, void *ptr)
3195{
3196 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3197 hook->free_ptr = ptr;
3198 hook->alloc.free(hook->alloc.ctx, ptr);
3199}
3200
3201static PyObject *
3202test_setallocators(PyMemAllocatorDomain domain)
3203{
3204 PyObject *res = NULL;
3205 const char *error_msg;
3206 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003207 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003208 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003209 void *ptr, *ptr2;
3210
Victor Stinnerdb067af2014-05-02 22:31:14 +02003211 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003212
3213 alloc.ctx = &hook;
3214 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003215 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003216 alloc.realloc = &hook_realloc;
3217 alloc.free = &hook_free;
3218 PyMem_GetAllocator(domain, &hook.alloc);
3219 PyMem_SetAllocator(domain, &alloc);
3220
3221 size = 42;
3222 switch(domain)
3223 {
3224 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3225 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3226 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3227 default: ptr = NULL; break;
3228 }
3229
3230 if (ptr == NULL) {
3231 error_msg = "malloc failed";
3232 goto fail;
3233 }
3234
3235 if (hook.malloc_size != size) {
3236 error_msg = "malloc invalid size";
3237 goto fail;
3238 }
3239
3240 size2 = 200;
3241 switch(domain)
3242 {
3243 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3244 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3245 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003246 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003247 }
3248
3249 if (ptr2 == NULL) {
3250 error_msg = "realloc failed";
3251 goto fail;
3252 }
3253
3254 if (hook.realloc_ptr != ptr
3255 || hook.realloc_new_size != size2) {
3256 error_msg = "realloc invalid parameters";
3257 goto fail;
3258 }
3259
3260 switch(domain)
3261 {
3262 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3263 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3264 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3265 }
3266
3267 if (hook.free_ptr != ptr2) {
3268 error_msg = "free invalid pointer";
3269 goto fail;
3270 }
3271
Victor Stinnerdb067af2014-05-02 22:31:14 +02003272 nelem = 2;
3273 elsize = 5;
3274 switch(domain)
3275 {
3276 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3277 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3278 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3279 default: ptr = NULL; break;
3280 }
3281
3282 if (ptr == NULL) {
3283 error_msg = "calloc failed";
3284 goto fail;
3285 }
3286
3287 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3288 error_msg = "calloc invalid nelem or elsize";
3289 goto fail;
3290 }
3291
3292 switch(domain)
3293 {
3294 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3295 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3296 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3297 }
3298
Victor Stinner0507bf52013-07-07 02:05:46 +02003299 Py_INCREF(Py_None);
3300 res = Py_None;
3301 goto finally;
3302
3303fail:
3304 PyErr_SetString(PyExc_RuntimeError, error_msg);
3305
3306finally:
3307 PyMem_SetAllocator(domain, &hook.alloc);
3308 return res;
3309}
3310
3311static PyObject *
3312test_pymem_setrawallocators(PyObject *self)
3313{
3314 return test_setallocators(PYMEM_DOMAIN_RAW);
3315}
3316
3317static PyObject *
3318test_pymem_setallocators(PyObject *self)
3319{
3320 return test_setallocators(PYMEM_DOMAIN_MEM);
3321}
3322
3323static PyObject *
3324test_pyobject_setallocators(PyObject *self)
3325{
3326 return test_setallocators(PYMEM_DOMAIN_OBJ);
3327}
3328
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003329PyDoc_STRVAR(docstring_empty,
3330""
3331);
3332
3333PyDoc_STRVAR(docstring_no_signature,
3334"This docstring has no signature."
3335);
3336
3337PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003338"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003339"\n"
3340"This docstring has an invalid signature."
3341);
3342
Larry Hastings2623c8c2014-02-08 22:15:29 -08003343PyDoc_STRVAR(docstring_with_invalid_signature2,
3344"docstring_with_invalid_signature2($module, /, boo)\n"
3345"\n"
3346"--\n"
3347"\n"
3348"This docstring also has an invalid signature."
3349);
3350
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003351PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003352"docstring_with_signature($module, /, sig)\n"
3353"--\n"
3354"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003355"This docstring has a valid signature."
3356);
3357
Zachary Ware8ef887c2015-04-13 18:22:35 -05003358PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3359"docstring_with_signature_but_no_doc($module, /, sig)\n"
3360"--\n"
3361"\n"
3362);
3363
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003364PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003365"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3366"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003367"\n"
3368"\n"
3369"This docstring has a valid signature and some extra newlines."
3370);
3371
Larry Hastings16c51912014-01-07 11:53:01 -08003372PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003373"docstring_with_signature_with_defaults(module, s='avocado',\n"
3374" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3375" local=the_number_three, sys=sys.maxsize,\n"
3376" exp=sys.maxsize - 1)\n"
3377"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003378"\n"
3379"\n"
3380"\n"
3381"This docstring has a valid signature with parameters,\n"
3382"and the parameters take defaults of varying types."
3383);
3384
Victor Stinner258e4d32013-12-13 02:30:12 +01003385#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003386typedef struct {
3387 PyThread_type_lock start_event;
3388 PyThread_type_lock exit_event;
3389 PyObject *callback;
3390} test_c_thread_t;
3391
3392static void
3393temporary_c_thread(void *data)
3394{
3395 test_c_thread_t *test_c_thread = data;
3396 PyGILState_STATE state;
3397 PyObject *res;
3398
3399 PyThread_release_lock(test_c_thread->start_event);
3400
3401 /* Allocate a Python thread state for this thread */
3402 state = PyGILState_Ensure();
3403
3404 res = PyObject_CallFunction(test_c_thread->callback, "", NULL);
3405 Py_CLEAR(test_c_thread->callback);
3406
3407 if (res == NULL) {
3408 PyErr_Print();
3409 }
3410 else {
3411 Py_DECREF(res);
3412 }
3413
3414 /* Destroy the Python thread state for this thread */
3415 PyGILState_Release(state);
3416
3417 PyThread_release_lock(test_c_thread->exit_event);
3418
3419 PyThread_exit_thread();
3420}
3421
3422static PyObject *
3423call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3424{
3425 PyObject *res = NULL;
3426 test_c_thread_t test_c_thread;
3427 long thread;
3428
3429 PyEval_InitThreads();
3430
3431 test_c_thread.start_event = PyThread_allocate_lock();
3432 test_c_thread.exit_event = PyThread_allocate_lock();
3433 test_c_thread.callback = NULL;
3434 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3435 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3436 goto exit;
3437 }
3438
3439 Py_INCREF(callback);
3440 test_c_thread.callback = callback;
3441
3442 PyThread_acquire_lock(test_c_thread.start_event, 1);
3443 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3444
3445 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3446 if (thread == -1) {
3447 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3448 PyThread_release_lock(test_c_thread.start_event);
3449 PyThread_release_lock(test_c_thread.exit_event);
3450 goto exit;
3451 }
3452
3453 PyThread_acquire_lock(test_c_thread.start_event, 1);
3454 PyThread_release_lock(test_c_thread.start_event);
3455
3456 Py_BEGIN_ALLOW_THREADS
3457 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3458 PyThread_release_lock(test_c_thread.exit_event);
3459 Py_END_ALLOW_THREADS
3460
3461 Py_INCREF(Py_None);
3462 res = Py_None;
3463
3464exit:
3465 Py_CLEAR(test_c_thread.callback);
3466 if (test_c_thread.start_event)
3467 PyThread_free_lock(test_c_thread.start_event);
3468 if (test_c_thread.exit_event)
3469 PyThread_free_lock(test_c_thread.exit_event);
3470 return res;
3471}
Victor Stinner258e4d32013-12-13 02:30:12 +01003472#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003473
Victor Stinner56e8c292014-07-21 12:30:22 +02003474static PyObject*
3475test_raise_signal(PyObject* self, PyObject *args)
3476{
3477 int signum, err;
3478
3479 if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0)
3480 return NULL;
3481
3482 err = raise(signum);
3483 if (err)
3484 return PyErr_SetFromErrno(PyExc_OSError);
3485
3486 if (PyErr_CheckSignals() < 0)
3487 return NULL;
3488
3489 Py_RETURN_NONE;
3490}
3491
Serhiy Storchakab5181342015-02-06 08:58:56 +02003492/* marshal */
3493
3494static PyObject*
3495pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3496{
3497 long value;
3498 char *filename;
3499 int version;
3500 FILE *fp;
3501
3502 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3503 &value, &filename, &version))
3504 return NULL;
3505
3506 fp = fopen(filename, "wb");
3507 if (fp == NULL) {
3508 PyErr_SetFromErrno(PyExc_OSError);
3509 return NULL;
3510 }
3511
3512 PyMarshal_WriteLongToFile(value, fp, version);
3513
3514 fclose(fp);
3515 if (PyErr_Occurred())
3516 return NULL;
3517 Py_RETURN_NONE;
3518}
3519
3520static PyObject*
3521pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3522{
3523 PyObject *obj;
3524 char *filename;
3525 int version;
3526 FILE *fp;
3527
3528 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3529 &obj, &filename, &version))
3530 return NULL;
3531
3532 fp = fopen(filename, "wb");
3533 if (fp == NULL) {
3534 PyErr_SetFromErrno(PyExc_OSError);
3535 return NULL;
3536 }
3537
3538 PyMarshal_WriteObjectToFile(obj, fp, version);
3539
3540 fclose(fp);
3541 if (PyErr_Occurred())
3542 return NULL;
3543 Py_RETURN_NONE;
3544}
3545
3546static PyObject*
3547pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3548{
3549 int value;
3550 long pos;
3551 char *filename;
3552 FILE *fp;
3553
3554 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3555 return NULL;
3556
3557 fp = fopen(filename, "rb");
3558 if (fp == NULL) {
3559 PyErr_SetFromErrno(PyExc_OSError);
3560 return NULL;
3561 }
3562
3563 value = PyMarshal_ReadShortFromFile(fp);
3564 pos = ftell(fp);
3565
3566 fclose(fp);
3567 if (PyErr_Occurred())
3568 return NULL;
3569 return Py_BuildValue("il", value, pos);
3570}
3571
3572static PyObject*
3573pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3574{
3575 long value, pos;
3576 char *filename;
3577 FILE *fp;
3578
3579 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3580 return NULL;
3581
3582 fp = fopen(filename, "rb");
3583 if (fp == NULL) {
3584 PyErr_SetFromErrno(PyExc_OSError);
3585 return NULL;
3586 }
3587
3588 value = PyMarshal_ReadLongFromFile(fp);
3589 pos = ftell(fp);
3590
3591 fclose(fp);
3592 if (PyErr_Occurred())
3593 return NULL;
3594 return Py_BuildValue("ll", value, pos);
3595}
3596
3597static PyObject*
3598pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3599{
3600 PyObject *obj;
3601 long pos;
3602 char *filename;
3603 FILE *fp;
3604
3605 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3606 return NULL;
3607
3608 fp = fopen(filename, "rb");
3609 if (fp == NULL) {
3610 PyErr_SetFromErrno(PyExc_OSError);
3611 return NULL;
3612 }
3613
3614 obj = PyMarshal_ReadLastObjectFromFile(fp);
3615 pos = ftell(fp);
3616
3617 fclose(fp);
3618 return Py_BuildValue("Nl", obj, pos);
3619}
3620
3621static PyObject*
3622pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3623{
3624 PyObject *obj;
3625 long pos;
3626 char *filename;
3627 FILE *fp;
3628
3629 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3630 return NULL;
3631
3632 fp = fopen(filename, "rb");
3633 if (fp == NULL) {
3634 PyErr_SetFromErrno(PyExc_OSError);
3635 return NULL;
3636 }
3637
3638 obj = PyMarshal_ReadObjectFromFile(fp);
3639 pos = ftell(fp);
3640
3641 fclose(fp);
3642 return Py_BuildValue("Nl", obj, pos);
3643}
3644
Victor Stinnerefde1462015-03-21 15:04:43 +01003645static PyObject*
3646return_null_without_error(PyObject *self, PyObject *args)
3647{
3648 /* invalid call: return NULL without setting an error,
3649 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3650 PyErr_Clear();
3651 return NULL;
3652}
3653
3654static PyObject*
3655return_result_with_error(PyObject *self, PyObject *args)
3656{
3657 /* invalid call: return a result with an error set,
3658 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3659 PyErr_SetNone(PyExc_ValueError);
3660 Py_RETURN_NONE;
3661}
3662
Victor Stinner992c43f2015-03-27 17:12:45 +01003663static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02003664test_pytime_fromseconds(PyObject *self, PyObject *args)
3665{
3666 int seconds;
3667 _PyTime_t ts;
3668
3669 if (!PyArg_ParseTuple(args, "i", &seconds))
3670 return NULL;
3671 ts = _PyTime_FromSeconds(seconds);
3672 return _PyTime_AsNanosecondsObject(ts);
3673}
3674
3675static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01003676test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
3677{
3678 PyObject *obj;
3679 int round;
3680 _PyTime_t ts;
3681
3682 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
3683 return NULL;
3684 if (check_time_rounding(round) < 0)
3685 return NULL;
3686 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
3687 return NULL;
3688 return _PyTime_AsNanosecondsObject(ts);
3689}
3690
Victor Stinner4bfb4602015-03-27 22:27:24 +01003691static PyObject *
3692test_pytime_assecondsdouble(PyObject *self, PyObject *args)
3693{
3694 PY_LONG_LONG ns;
3695 _PyTime_t ts;
3696 double d;
3697
3698 if (!PyArg_ParseTuple(args, "L", &ns))
3699 return NULL;
3700 ts = _PyTime_FromNanoseconds(ns);
3701 d = _PyTime_AsSecondsDouble(ts);
3702 return PyFloat_FromDouble(d);
3703}
3704
Victor Stinner95e9cef2015-03-28 01:26:47 +01003705static PyObject *
3706test_PyTime_AsTimeval(PyObject *self, PyObject *args)
3707{
3708 PY_LONG_LONG ns;
3709 int round;
3710 _PyTime_t t;
3711 struct timeval tv;
3712 PyObject *seconds;
3713
3714 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3715 return NULL;
3716 if (check_time_rounding(round) < 0)
3717 return NULL;
3718 t = _PyTime_FromNanoseconds(ns);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +02003719 if (_PyTime_AsTimeval(t, &tv, round) < 0)
Victor Stinner95e9cef2015-03-28 01:26:47 +01003720 return NULL;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003721
3722 seconds = PyLong_FromLong((PY_LONG_LONG)tv.tv_sec);
3723 if (seconds == NULL)
3724 return NULL;
3725 return Py_BuildValue("Nl", seconds, tv.tv_usec);
3726}
3727
Victor Stinner34dc0f42015-03-27 18:19:03 +01003728#ifdef HAVE_CLOCK_GETTIME
3729static PyObject *
3730test_PyTime_AsTimespec(PyObject *self, PyObject *args)
3731{
3732 PY_LONG_LONG ns;
3733 _PyTime_t t;
3734 struct timespec ts;
3735
3736 if (!PyArg_ParseTuple(args, "L", &ns))
3737 return NULL;
3738 t = _PyTime_FromNanoseconds(ns);
3739 if (_PyTime_AsTimespec(t, &ts) == -1)
3740 return NULL;
3741 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
3742}
3743#endif
3744
Victor Stinner62d1c702015-04-01 17:47:07 +02003745static PyObject *
3746test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
3747{
3748 PY_LONG_LONG ns;
3749 int round;
3750 _PyTime_t t, ms;
3751
3752 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3753 return NULL;
3754 if (check_time_rounding(round) < 0)
3755 return NULL;
3756 t = _PyTime_FromNanoseconds(ns);
3757 ms = _PyTime_AsMilliseconds(t, round);
3758 /* This conversion rely on the fact that _PyTime_t is a number of
3759 nanoseconds */
3760 return _PyTime_AsNanosecondsObject(ms);
3761}
3762
3763static PyObject *
3764test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
3765{
3766 PY_LONG_LONG ns;
3767 int round;
3768 _PyTime_t t, ms;
3769
3770 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3771 return NULL;
3772 if (check_time_rounding(round) < 0)
3773 return NULL;
3774 t = _PyTime_FromNanoseconds(ns);
3775 ms = _PyTime_AsMicroseconds(t, round);
3776 /* This conversion rely on the fact that _PyTime_t is a number of
3777 nanoseconds */
3778 return _PyTime_AsNanosecondsObject(ms);
3779}
3780
Victor Stinner50856d52015-10-13 00:11:21 +02003781static PyObject*
3782get_recursion_depth(PyObject *self, PyObject *args)
3783{
3784 PyThreadState *tstate = PyThreadState_GET();
3785
3786 /* substract one to ignore the frame of the get_recursion_depth() call */
3787 return PyLong_FromLong(tstate->recursion_depth - 1);
3788}
3789
Victor Stinner34be8072016-03-14 12:04:26 +01003790static PyObject*
3791pymem_buffer_overflow(PyObject *self, PyObject *args)
3792{
3793 char *buffer;
3794
3795 /* Deliberate buffer overflow to check that PyMem_Free() detects
3796 the overflow when debug hooks are installed. */
3797 buffer = PyMem_Malloc(16);
3798 buffer[16] = 'x';
3799 PyMem_Free(buffer);
3800
3801 Py_RETURN_NONE;
3802}
3803
3804static PyObject*
3805pymem_api_misuse(PyObject *self, PyObject *args)
3806{
3807 char *buffer;
3808
3809 /* Deliberate misusage of Python allocators:
3810 allococate with PyMem but release with PyMem_Raw. */
3811 buffer = PyMem_Malloc(16);
3812 PyMem_RawFree(buffer);
3813
3814 Py_RETURN_NONE;
3815}
3816
Victor Stinnerc4aec362016-03-14 22:26:53 +01003817static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01003818pymem_malloc_without_gil(PyObject *self, PyObject *args)
3819{
3820 char *buffer;
3821
3822 /* Deliberate bug to test debug hooks on Python memory allocators:
3823 call PyMem_Malloc() without holding the GIL */
3824 Py_BEGIN_ALLOW_THREADS
3825 buffer = PyMem_Malloc(10);
3826 Py_END_ALLOW_THREADS
3827
3828 PyMem_Free(buffer);
3829
3830 Py_RETURN_NONE;
3831}
3832
3833static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01003834pyobject_malloc_without_gil(PyObject *self, PyObject *args)
3835{
3836 char *buffer;
3837
Victor Stinnerad524372016-03-16 12:12:53 +01003838 /* Deliberate bug to test debug hooks on Python memory allocators:
3839 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01003840 Py_BEGIN_ALLOW_THREADS
3841 buffer = PyObject_Malloc(10);
3842 Py_END_ALLOW_THREADS
3843
3844 PyObject_Free(buffer);
3845
3846 Py_RETURN_NONE;
3847}
3848
Victor Stinner10b73e12016-03-22 13:39:05 +01003849static PyObject *
3850tracemalloc_track(PyObject *self, PyObject *args)
3851{
3852 unsigned int domain;
3853 PyObject *ptr_obj;
3854 void *ptr;
3855 Py_ssize_t size;
3856 int release_gil = 0;
3857 int res;
3858
3859 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
3860 return NULL;
3861 ptr = PyLong_AsVoidPtr(ptr_obj);
3862 if (PyErr_Occurred())
3863 return NULL;
3864
3865 if (release_gil) {
3866 Py_BEGIN_ALLOW_THREADS
3867 res = _PyTraceMalloc_Track(domain, (Py_uintptr_t)ptr, size);
3868 Py_END_ALLOW_THREADS
3869 }
3870 else {
3871 res = _PyTraceMalloc_Track(domain, (Py_uintptr_t)ptr, size);
3872 }
3873
3874 if (res < 0) {
3875 PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
3876 return NULL;
3877 }
3878
3879 Py_RETURN_NONE;
3880}
3881
3882static PyObject *
3883tracemalloc_untrack(PyObject *self, PyObject *args)
3884{
3885 unsigned int domain;
3886 PyObject *ptr_obj;
3887 void *ptr;
3888 int res;
3889
3890 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
3891 return NULL;
3892 ptr = PyLong_AsVoidPtr(ptr_obj);
3893 if (PyErr_Occurred())
3894 return NULL;
3895
3896 res = _PyTraceMalloc_Untrack(domain, (Py_uintptr_t)ptr);
3897 if (res < 0) {
3898 PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
3899 return NULL;
3900 }
3901
3902 Py_RETURN_NONE;
3903}
3904
3905static PyObject *
3906tracemalloc_get_traceback(PyObject *self, PyObject *args)
3907{
3908 unsigned int domain;
3909 PyObject *ptr_obj;
3910 void *ptr;
3911
3912 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
3913 return NULL;
3914 ptr = PyLong_AsVoidPtr(ptr_obj);
3915 if (PyErr_Occurred())
3916 return NULL;
3917
3918 return _PyTraceMalloc_GetTraceback(domain, (Py_uintptr_t)ptr);
3919}
3920
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003921
Tim Peters9ea17ac2001-02-02 05:57:15 +00003922static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003923 {"raise_exception", raise_exception, METH_VARARGS},
3924 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02003925 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003926 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01003927 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003928 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
3929 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
3930 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
3931 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003932 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003933 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
3934 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
3935 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
3936 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02003937 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003938 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
3939 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02003940 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
3941 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003942 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
3943 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
3944 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07003945 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003946 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
3947 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
3948 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
3949 PyDoc_STR("This is a pretty normal docstring.")},
3950 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
3951 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
3952 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01003953 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01003954#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01003955 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01003956#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01003957 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03003958 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03003959 {"get_args", get_args, METH_VARARGS},
3960 {"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003961 {"getargs_tuple", getargs_tuple, METH_VARARGS},
3962 {"getargs_keywords", (PyCFunction)getargs_keywords,
3963 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00003964 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
3965 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003966 {"getargs_b", getargs_b, METH_VARARGS},
3967 {"getargs_B", getargs_B, METH_VARARGS},
3968 {"getargs_h", getargs_h, METH_VARARGS},
3969 {"getargs_H", getargs_H, METH_VARARGS},
3970 {"getargs_I", getargs_I, METH_VARARGS},
3971 {"getargs_k", getargs_k, METH_VARARGS},
3972 {"getargs_i", getargs_i, METH_VARARGS},
3973 {"getargs_l", getargs_l, METH_VARARGS},
3974 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07003975 {"getargs_p", getargs_p, METH_VARARGS},
Tim Peters91621db2001-06-12 20:10:01 +00003976#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003977 {"getargs_L", getargs_L, METH_VARARGS},
3978 {"getargs_K", getargs_K, METH_VARARGS},
3979 {"test_longlong_api", test_longlong_api, METH_NOARGS},
3980 {"test_long_long_and_overflow",
3981 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
3982 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003983#endif
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03003984 {"getargs_f", getargs_f, METH_VARARGS},
3985 {"getargs_d", getargs_d, METH_VARARGS},
3986 {"getargs_D", getargs_D, METH_VARARGS},
3987 {"getargs_S", getargs_S, METH_VARARGS},
3988 {"getargs_Y", getargs_Y, METH_VARARGS},
3989 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03003990 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02003991 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00003992 {"getargs_s", getargs_s, METH_VARARGS},
3993 {"getargs_s_star", getargs_s_star, METH_VARARGS},
3994 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
3995 {"getargs_z", getargs_z, METH_VARARGS},
3996 {"getargs_z_star", getargs_z_star, METH_VARARGS},
3997 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
3998 {"getargs_y", getargs_y, METH_VARARGS},
3999 {"getargs_y_star", getargs_y_star, METH_VARARGS},
4000 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
4001 {"getargs_u", getargs_u, METH_VARARGS},
4002 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
4003 {"getargs_Z", getargs_Z, METH_VARARGS},
4004 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00004005 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004006 {"getargs_es", getargs_es, METH_VARARGS},
4007 {"getargs_et", getargs_et, METH_VARARGS},
4008 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
4009 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004010 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004011 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004012 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004013 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004014 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
4015 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
4016 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
4017 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004018 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
4019 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
4020 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
4021 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01004022 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004023#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00004024 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004025 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004026#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00004027#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00004028 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004029#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00004030 {"traceback_print", traceback_print, METH_VARARGS},
4031 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02004032 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004033 {"argparsing", argparsing, METH_VARARGS},
4034 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004035 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
4036 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00004037 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
4038 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00004039 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004040 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01004041 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
4042 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01004043 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02004044 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04004045 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02004046 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02004047 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
4048 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02004049 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
4050 {"test_pymem_setallocators",
4051 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
4052 {"test_pyobject_setallocators",
4053 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004054 {"no_docstring",
4055 (PyCFunction)test_with_docstring, METH_NOARGS},
4056 {"docstring_empty",
4057 (PyCFunction)test_with_docstring, METH_NOARGS,
4058 docstring_empty},
4059 {"docstring_no_signature",
4060 (PyCFunction)test_with_docstring, METH_NOARGS,
4061 docstring_no_signature},
4062 {"docstring_with_invalid_signature",
4063 (PyCFunction)test_with_docstring, METH_NOARGS,
4064 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004065 {"docstring_with_invalid_signature2",
4066 (PyCFunction)test_with_docstring, METH_NOARGS,
4067 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004068 {"docstring_with_signature",
4069 (PyCFunction)test_with_docstring, METH_NOARGS,
4070 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004071 {"docstring_with_signature_but_no_doc",
4072 (PyCFunction)test_with_docstring, METH_NOARGS,
4073 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004074 {"docstring_with_signature_and_extra_newlines",
4075 (PyCFunction)test_with_docstring, METH_NOARGS,
4076 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004077 {"docstring_with_signature_with_defaults",
4078 (PyCFunction)test_with_docstring, METH_NOARGS,
4079 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02004080 {"raise_signal",
4081 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01004082#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004083 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4084 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01004085#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02004086 {"pymarshal_write_long_to_file",
4087 pymarshal_write_long_to_file, METH_VARARGS},
4088 {"pymarshal_write_object_to_file",
4089 pymarshal_write_object_to_file, METH_VARARGS},
4090 {"pymarshal_read_short_from_file",
4091 pymarshal_read_short_from_file, METH_VARARGS},
4092 {"pymarshal_read_long_from_file",
4093 pymarshal_read_long_from_file, METH_VARARGS},
4094 {"pymarshal_read_last_object_from_file",
4095 pymarshal_read_last_object_from_file, METH_VARARGS},
4096 {"pymarshal_read_object_from_file",
4097 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004098 {"return_null_without_error",
4099 return_null_without_error, METH_NOARGS},
4100 {"return_result_with_error",
4101 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004102 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004103 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4104 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004105 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004106#ifdef HAVE_CLOCK_GETTIME
4107 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4108#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004109 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4110 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004111 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be8072016-03-14 12:04:26 +01004112 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
4113 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01004114 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01004115 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01004116 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
4117 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
4118 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004119 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00004120};
4121
Thomas Hellera4ea6032003-04-17 18:55:45 +00004122#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
4123
Thomas Wouters89f507f2006-12-13 04:49:30 +00004124typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 char bool_member;
4126 char byte_member;
4127 unsigned char ubyte_member;
4128 short short_member;
4129 unsigned short ushort_member;
4130 int int_member;
4131 unsigned int uint_member;
4132 long long_member;
4133 unsigned long ulong_member;
4134 Py_ssize_t pyssizet_member;
4135 float float_member;
4136 double double_member;
4137 char inplace_member[6];
Guido van Rossumcd16bf62007-06-13 18:07:49 +00004138#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004139 PY_LONG_LONG longlong_member;
4140 unsigned PY_LONG_LONG ulonglong_member;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00004141#endif
Thomas Wouters89f507f2006-12-13 04:49:30 +00004142} all_structmembers;
4143
4144typedef struct {
4145 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004146 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004147} test_structmembers;
4148
4149static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
4151 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
4152 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
4153 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
4154 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
4155 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
4156 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
4157 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
4158 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
4159 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
4160 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
4161 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
4162 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00004163#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004164 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
4165 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Guido van Rossumcd16bf62007-06-13 18:07:49 +00004166#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004167 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00004168};
4169
4170
Christian Heimes1af737c2008-01-23 08:24:23 +00004171static PyObject *
4172test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
4173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004174 static char *keywords[] = {
4175 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
4176 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
4177 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Mark Dickinsond59b4162010-03-13 11:34:40 +00004178#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004179 "T_LONGLONG", "T_ULONGLONG",
Christian Heimes1af737c2008-01-23 08:24:23 +00004180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004181 NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02004182 static const char fmt[] = "|bbBhHiIlknfds#"
Christian Heimes1af737c2008-01-23 08:24:23 +00004183#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004184 "LK"
Christian Heimes1af737c2008-01-23 08:24:23 +00004185#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004186 ;
4187 test_structmembers *ob;
4188 const char *s = NULL;
4189 Py_ssize_t string_len = 0;
4190 ob = PyObject_New(test_structmembers, type);
4191 if (ob == NULL)
4192 return NULL;
4193 memset(&ob->structmembers, 0, sizeof(all_structmembers));
4194 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
4195 &ob->structmembers.bool_member,
4196 &ob->structmembers.byte_member,
4197 &ob->structmembers.ubyte_member,
4198 &ob->structmembers.short_member,
4199 &ob->structmembers.ushort_member,
4200 &ob->structmembers.int_member,
4201 &ob->structmembers.uint_member,
4202 &ob->structmembers.long_member,
4203 &ob->structmembers.ulong_member,
4204 &ob->structmembers.pyssizet_member,
4205 &ob->structmembers.float_member,
4206 &ob->structmembers.double_member,
4207 &s, &string_len
Christian Heimes1af737c2008-01-23 08:24:23 +00004208#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004209 , &ob->structmembers.longlong_member,
4210 &ob->structmembers.ulonglong_member
Christian Heimes1af737c2008-01-23 08:24:23 +00004211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004212 )) {
4213 Py_DECREF(ob);
4214 return NULL;
4215 }
4216 if (s != NULL) {
4217 if (string_len > 5) {
4218 Py_DECREF(ob);
4219 PyErr_SetString(PyExc_ValueError, "string too long");
4220 return NULL;
4221 }
4222 strcpy(ob->structmembers.inplace_member, s);
4223 }
4224 else {
4225 strcpy(ob->structmembers.inplace_member, "");
4226 }
4227 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004228}
4229
Christian Heimes1af737c2008-01-23 08:24:23 +00004230static void
4231test_structmembers_free(PyObject *ob)
4232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004234}
4235
4236static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004237 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004238 "test_structmembersType",
4239 sizeof(test_structmembers), /* tp_basicsize */
4240 0, /* tp_itemsize */
4241 test_structmembers_free, /* destructor tp_dealloc */
4242 0, /* tp_print */
4243 0, /* tp_getattr */
4244 0, /* tp_setattr */
4245 0, /* tp_reserved */
4246 0, /* tp_repr */
4247 0, /* tp_as_number */
4248 0, /* tp_as_sequence */
4249 0, /* tp_as_mapping */
4250 0, /* tp_hash */
4251 0, /* tp_call */
4252 0, /* tp_str */
4253 PyObject_GenericGetAttr, /* tp_getattro */
4254 PyObject_GenericSetAttr, /* tp_setattro */
4255 0, /* tp_as_buffer */
4256 0, /* tp_flags */
4257 "Type containing all structmember types",
4258 0, /* traverseproc tp_traverse */
4259 0, /* tp_clear */
4260 0, /* tp_richcompare */
4261 0, /* tp_weaklistoffset */
4262 0, /* tp_iter */
4263 0, /* tp_iternext */
4264 0, /* tp_methods */
4265 test_members, /* tp_members */
4266 0,
4267 0,
4268 0,
4269 0,
4270 0,
4271 0,
4272 0,
4273 0,
4274 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004275};
4276
4277
Benjamin Petersond51374e2014-04-09 23:55:56 -04004278typedef struct {
4279 PyObject_HEAD
4280} matmulObject;
4281
4282static PyObject *
4283matmulType_matmul(PyObject *self, PyObject *other)
4284{
4285 return Py_BuildValue("(sOO)", "matmul", self, other);
4286}
4287
4288static PyObject *
4289matmulType_imatmul(PyObject *self, PyObject *other)
4290{
4291 return Py_BuildValue("(sOO)", "imatmul", self, other);
4292}
4293
4294static void
4295matmulType_dealloc(PyObject *self)
4296{
Zachary Ware420dc562014-04-23 13:51:27 -05004297 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004298}
4299
4300static PyNumberMethods matmulType_as_number = {
4301 0, /* nb_add */
4302 0, /* nb_subtract */
4303 0, /* nb_multiply */
4304 0, /* nb_remainde r*/
4305 0, /* nb_divmod */
4306 0, /* nb_power */
4307 0, /* nb_negative */
4308 0, /* tp_positive */
4309 0, /* tp_absolute */
4310 0, /* tp_bool */
4311 0, /* nb_invert */
4312 0, /* nb_lshift */
4313 0, /* nb_rshift */
4314 0, /* nb_and */
4315 0, /* nb_xor */
4316 0, /* nb_or */
4317 0, /* nb_int */
4318 0, /* nb_reserved */
4319 0, /* nb_float */
4320 0, /* nb_inplace_add */
4321 0, /* nb_inplace_subtract */
4322 0, /* nb_inplace_multiply */
4323 0, /* nb_inplace_remainder */
4324 0, /* nb_inplace_power */
4325 0, /* nb_inplace_lshift */
4326 0, /* nb_inplace_rshift */
4327 0, /* nb_inplace_and */
4328 0, /* nb_inplace_xor */
4329 0, /* nb_inplace_or */
4330 0, /* nb_floor_divide */
4331 0, /* nb_true_divide */
4332 0, /* nb_inplace_floor_divide */
4333 0, /* nb_inplace_true_divide */
4334 0, /* nb_index */
4335 matmulType_matmul, /* nb_matrix_multiply */
4336 matmulType_imatmul /* nb_matrix_inplace_multiply */
4337};
4338
4339static PyTypeObject matmulType = {
4340 PyVarObject_HEAD_INIT(NULL, 0)
4341 "matmulType",
4342 sizeof(matmulObject), /* tp_basicsize */
4343 0, /* tp_itemsize */
4344 matmulType_dealloc, /* destructor tp_dealloc */
4345 0, /* tp_print */
4346 0, /* tp_getattr */
4347 0, /* tp_setattr */
4348 0, /* tp_reserved */
4349 0, /* tp_repr */
4350 &matmulType_as_number, /* tp_as_number */
4351 0, /* tp_as_sequence */
4352 0, /* tp_as_mapping */
4353 0, /* tp_hash */
4354 0, /* tp_call */
4355 0, /* tp_str */
4356 PyObject_GenericGetAttr, /* tp_getattro */
4357 PyObject_GenericSetAttr, /* tp_setattro */
4358 0, /* tp_as_buffer */
4359 0, /* tp_flags */
4360 "C level type with matrix operations defined",
4361 0, /* traverseproc tp_traverse */
4362 0, /* tp_clear */
4363 0, /* tp_richcompare */
4364 0, /* tp_weaklistoffset */
4365 0, /* tp_iter */
4366 0, /* tp_iternext */
4367 0, /* tp_methods */
4368 0, /* tp_members */
4369 0,
4370 0,
4371 0,
4372 0,
4373 0,
4374 0,
4375 0,
4376 0,
4377 PyType_GenericNew, /* tp_new */
4378 PyObject_Del, /* tp_free */
4379};
4380
Martin v. Löwis1a214512008-06-11 05:26:20 +00004381
Yury Selivanov75445082015-05-11 22:57:16 -04004382typedef struct {
4383 PyObject_HEAD
4384 PyObject *ao_iterator;
4385} awaitObject;
4386
4387
4388static PyObject *
4389awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4390{
4391 PyObject *v;
4392 awaitObject *ao;
4393
4394 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
4395 return NULL;
4396
4397 ao = (awaitObject *)type->tp_alloc(type, 0);
4398 if (ao == NULL) {
4399 return NULL;
4400 }
4401
4402 Py_INCREF(v);
4403 ao->ao_iterator = v;
4404
4405 return (PyObject *)ao;
4406}
4407
4408
4409static void
4410awaitObject_dealloc(awaitObject *ao)
4411{
4412 Py_CLEAR(ao->ao_iterator);
4413 Py_TYPE(ao)->tp_free(ao);
4414}
4415
4416
4417static PyObject *
4418awaitObject_await(awaitObject *ao)
4419{
4420 Py_INCREF(ao->ao_iterator);
4421 return ao->ao_iterator;
4422}
4423
4424static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04004425 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04004426 0, /* am_aiter */
4427 0 /* am_anext */
4428};
4429
4430
4431static PyTypeObject awaitType = {
4432 PyVarObject_HEAD_INIT(NULL, 0)
4433 "awaitType",
4434 sizeof(awaitObject), /* tp_basicsize */
4435 0, /* tp_itemsize */
4436 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
4437 0, /* tp_print */
4438 0, /* tp_getattr */
4439 0, /* tp_setattr */
4440 &awaitType_as_async, /* tp_as_async */
4441 0, /* tp_repr */
4442 0, /* tp_as_number */
4443 0, /* tp_as_sequence */
4444 0, /* tp_as_mapping */
4445 0, /* tp_hash */
4446 0, /* tp_call */
4447 0, /* tp_str */
4448 PyObject_GenericGetAttr, /* tp_getattro */
4449 PyObject_GenericSetAttr, /* tp_setattro */
4450 0, /* tp_as_buffer */
4451 0, /* tp_flags */
4452 "C level type with tp_as_async",
4453 0, /* traverseproc tp_traverse */
4454 0, /* tp_clear */
4455 0, /* tp_richcompare */
4456 0, /* tp_weaklistoffset */
4457 0, /* tp_iter */
4458 0, /* tp_iternext */
4459 0, /* tp_methods */
4460 0, /* tp_members */
4461 0,
4462 0,
4463 0,
4464 0,
4465 0,
4466 0,
4467 0,
4468 0,
4469 awaitObject_new, /* tp_new */
4470 PyObject_Del, /* tp_free */
4471};
4472
4473
Martin v. Löwis1a214512008-06-11 05:26:20 +00004474static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004475 PyModuleDef_HEAD_INIT,
4476 "_testcapi",
4477 NULL,
4478 -1,
4479 TestMethods,
4480 NULL,
4481 NULL,
4482 NULL,
4483 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004484};
4485
Nick Coghland5cacbb2015-05-23 22:24:10 +10004486/* Per PEP 489, this module will not be converted to multi-phase initialization
4487 */
4488
Mark Hammond62b1ab12002-07-23 06:31:15 +00004489PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004490PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00004491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004492 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004494 m = PyModule_Create(&_testcapimodule);
4495 if (m == NULL)
4496 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004498 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00004499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 Py_TYPE(&test_structmembersType)=&PyType_Type;
4501 Py_INCREF(&test_structmembersType);
4502 /* don't use a name starting with "test", since we don't want
4503 test_capi to automatically call this */
4504 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004505 if (PyType_Ready(&matmulType) < 0)
4506 return NULL;
4507 Py_INCREF(&matmulType);
4508 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004509
Yury Selivanov75445082015-05-11 22:57:16 -04004510 if (PyType_Ready(&awaitType) < 0)
4511 return NULL;
4512 Py_INCREF(&awaitType);
4513 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
4514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004515 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
4516 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
4517 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
4518 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
4519 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
4520 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
4521 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
4522 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
4523 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
4524 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
4525 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
4526 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
4527 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
4528 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
4529 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
4530 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
4531 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
4532 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
4533 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
4534 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
4535 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
4536 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02004537 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004538 Py_INCREF(&PyInstanceMethod_Type);
4539 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00004540
Larry Hastings2a727912014-01-16 11:32:01 -08004541 PyModule_AddIntConstant(m, "the_number_three", 3);
4542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004543 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
4544 Py_INCREF(TestError);
4545 PyModule_AddObject(m, "error", TestError);
4546 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004547}