blob: 83ba33dd7acfec097cb2c7fe4bc660b81e8070e5 [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);
Benjamin Petersonaf580df2016-09-06 10:46:49 -070063 CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
Tim Peters9ea17ac2001-02-02 05:57:15 +000064
65#undef CHECK_SIZEOF
66
Serhiy Storchaka228b12e2017-01-23 09:47:21 +020067 Py_RETURN_NONE;
Tim Peters9ea17ac2001-02-02 05:57:15 +000068}
69
Tim Peters5c4d5bf2001-02-12 22:13:26 +000070static PyObject*
Victor Stinner01076552013-10-29 19:39:52 +010071test_sizeof_c_types(PyObject *self)
72{
Ned Deilye37a1942015-03-05 15:47:10 -080073#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020074#pragma GCC diagnostic push
75#pragma GCC diagnostic ignored "-Wtype-limits"
76#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010077#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010078 if (EXPECTED != sizeof(TYPE)) { \
79 PyErr_Format(TestError, \
80 "sizeof(%s) = %u instead of %u", \
81 #TYPE, sizeof(TYPE), EXPECTED); \
82 return (PyObject*)NULL; \
83 }
Victor Stinnerf866f972013-10-29 19:59:31 +010084#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
85#define CHECK_SIGNNESS(TYPE, SIGNED) \
86 if (IS_SIGNED(TYPE) != SIGNED) { \
87 PyErr_Format(TestError, \
88 "%s signness is, instead of %i", \
89 #TYPE, IS_SIGNED(TYPE), SIGNED); \
90 return (PyObject*)NULL; \
91 }
Victor Stinner01076552013-10-29 19:39:52 +010092
93 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +010094 CHECK_SIZEOF(Py_UCS1, 1);
95 CHECK_SIZEOF(Py_UCS2, 2);
96 CHECK_SIZEOF(Py_UCS4, 4);
97 CHECK_SIGNNESS(Py_UCS1, 0);
98 CHECK_SIGNNESS(Py_UCS2, 0);
99 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700100 CHECK_SIZEOF(int32_t, 4);
101 CHECK_SIGNNESS(int32_t, 1);
102 CHECK_SIZEOF(uint32_t, 4);
103 CHECK_SIGNNESS(uint32_t, 0);
104 CHECK_SIZEOF(int64_t, 8);
105 CHECK_SIGNNESS(int64_t, 1);
106 CHECK_SIZEOF(uint64_t, 8);
107 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100108
109 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100110 CHECK_SIZEOF(size_t, sizeof(void *));
111 CHECK_SIGNNESS(size_t, 0);
112 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
113 CHECK_SIGNNESS(Py_ssize_t, 1);
114
Benjamin Petersonca470632016-09-06 13:47:26 -0700115 CHECK_SIZEOF(uintptr_t, sizeof(void *));
116 CHECK_SIGNNESS(uintptr_t, 0);
117 CHECK_SIZEOF(intptr_t, sizeof(void *));
118 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100119
Serhiy Storchakad1302c02017-01-23 10:23:58 +0200120 Py_RETURN_NONE;
Victor Stinner01076552013-10-29 19:39:52 +0100121
Victor Stinnerf866f972013-10-29 19:59:31 +0100122#undef IS_SIGNED
123#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100124#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800125#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200126#pragma GCC diagnostic pop
127#endif
Victor Stinner01076552013-10-29 19:39:52 +0100128}
129
130
131static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000132test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 PyObject* list;
135 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000138#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 list = PyList_New(NLIST);
140 if (list == (PyObject*)NULL)
141 return (PyObject*)NULL;
142 /* list = range(NLIST) */
143 for (i = 0; i < NLIST; ++i) {
144 PyObject* anint = PyLong_FromLong(i);
145 if (anint == (PyObject*)NULL) {
146 Py_DECREF(list);
147 return (PyObject*)NULL;
148 }
149 PyList_SET_ITEM(list, i, anint);
150 }
151 /* list.reverse(), via PyList_Reverse() */
152 i = PyList_Reverse(list); /* should not blow up! */
153 if (i != 0) {
154 Py_DECREF(list);
155 return (PyObject*)NULL;
156 }
157 /* Check that list == range(29, -1, -1) now */
158 for (i = 0; i < NLIST; ++i) {
159 PyObject* anint = PyList_GET_ITEM(list, i);
160 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
161 PyErr_SetString(TestError,
162 "test_list_api: reverse screwed up");
163 Py_DECREF(list);
164 return (PyObject*)NULL;
165 }
166 }
167 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000168#undef NLIST
169
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200170 Py_RETURN_NONE;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000171}
172
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000173static int
174test_dict_inner(int count)
175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 Py_ssize_t pos = 0, iterations = 0;
177 int i;
178 PyObject *dict = PyDict_New();
179 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 if (dict == NULL)
182 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 for (i = 0; i < count; i++) {
185 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200186 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200187 return -1;
188 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200189 if (PyDict_SetItem(dict, v, v) < 0) {
190 Py_DECREF(v);
191 return -1;
192 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193 Py_DECREF(v);
194 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000196 while (PyDict_Next(dict, &pos, &k, &v)) {
197 PyObject *o;
198 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 i = PyLong_AS_LONG(v) + 1;
201 o = PyLong_FromLong(i);
202 if (o == NULL)
203 return -1;
204 if (PyDict_SetItem(dict, k, o) < 0) {
205 Py_DECREF(o);
206 return -1;
207 }
208 Py_DECREF(o);
209 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 if (iterations != count) {
214 PyErr_SetString(
215 TestError,
216 "test_dict_iteration: dict iteration went wrong ");
217 return -1;
218 } else {
219 return 0;
220 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000221}
222
223static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000224test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 for (i = 0; i < 200; i++) {
229 if (test_dict_inner(i) < 0) {
230 return NULL;
231 }
232 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000233
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200234 Py_RETURN_NONE;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000235}
236
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200237static PyObject*
238dict_getitem_knownhash(PyObject *self, PyObject *args)
239{
240 PyObject *mp, *key, *result;
241 Py_ssize_t hash;
242
243 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
244 &mp, &key, &hash)) {
245 return NULL;
246 }
247
248 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
249 if (result == NULL && !PyErr_Occurred()) {
250 _PyErr_SetKeyError(key);
251 return NULL;
252 }
253
254 Py_XINCREF(result);
255 return result;
256}
Tim Peters91621db2001-06-12 20:10:01 +0000257
Victor Stinner3d3f2642016-12-15 17:21:23 +0100258static PyObject*
259dict_hassplittable(PyObject *self, PyObject *arg)
260{
261 if (!PyDict_Check(arg)) {
262 PyErr_Format(PyExc_TypeError,
263 "dict_hassplittable() argument must be dict, not '%s'",
264 arg->ob_type->tp_name);
265 return NULL;
266 }
267
268 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
269}
270
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000271/* Issue #4701: Check that PyObject_Hash implicitly calls
272 * PyType_Ready if it hasn't already been called
273 */
274static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 PyVarObject_HEAD_INIT(NULL, 0)
276 "hashinheritancetester", /* Name of this type */
277 sizeof(PyObject), /* Basic object size */
278 0, /* Item size for varobject */
279 (destructor)PyObject_Del, /* tp_dealloc */
280 0, /* tp_print */
281 0, /* tp_getattr */
282 0, /* tp_setattr */
283 0, /* tp_reserved */
284 0, /* tp_repr */
285 0, /* tp_as_number */
286 0, /* tp_as_sequence */
287 0, /* tp_as_mapping */
288 0, /* tp_hash */
289 0, /* tp_call */
290 0, /* tp_str */
291 PyObject_GenericGetAttr, /* tp_getattro */
292 0, /* tp_setattro */
293 0, /* tp_as_buffer */
294 Py_TPFLAGS_DEFAULT, /* tp_flags */
295 0, /* tp_doc */
296 0, /* tp_traverse */
297 0, /* tp_clear */
298 0, /* tp_richcompare */
299 0, /* tp_weaklistoffset */
300 0, /* tp_iter */
301 0, /* tp_iternext */
302 0, /* tp_methods */
303 0, /* tp_members */
304 0, /* tp_getset */
305 0, /* tp_base */
306 0, /* tp_dict */
307 0, /* tp_descr_get */
308 0, /* tp_descr_set */
309 0, /* tp_dictoffset */
310 0, /* tp_init */
311 0, /* tp_alloc */
312 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000313};
314
315static PyObject*
316test_lazy_hash_inheritance(PyObject* self)
317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 PyTypeObject *type;
319 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000320 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 if (type->tp_dict != NULL)
325 /* The type has already been initialized. This probably means
326 -R is being used. */
327 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000328
329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 obj = PyObject_New(PyObject, type);
331 if (obj == NULL) {
332 PyErr_Clear();
333 PyErr_SetString(
334 TestError,
335 "test_lazy_hash_inheritance: failed to create object");
336 return NULL;
337 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 if (type->tp_dict != NULL) {
340 PyErr_SetString(
341 TestError,
342 "test_lazy_hash_inheritance: type initialised too soon");
343 Py_DECREF(obj);
344 return NULL;
345 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 hash = PyObject_Hash(obj);
348 if ((hash == -1) && PyErr_Occurred()) {
349 PyErr_Clear();
350 PyErr_SetString(
351 TestError,
352 "test_lazy_hash_inheritance: could not hash object");
353 Py_DECREF(obj);
354 return NULL;
355 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 if (type->tp_dict == NULL) {
358 PyErr_SetString(
359 TestError,
360 "test_lazy_hash_inheritance: type not initialised by hash()");
361 Py_DECREF(obj);
362 return NULL;
363 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 if (type->tp_hash != PyType_Type.tp_hash) {
366 PyErr_SetString(
367 TestError,
368 "test_lazy_hash_inheritance: unexpected hash function");
369 Py_DECREF(obj);
370 return NULL;
371 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000373 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000376}
377
378
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700379/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000380 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000381
382 Note that the meat of the test is contained in testcapi_long.h.
383 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700384 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000385 dependence on type names makes it impossible to use a parameterized
386 function. A giant macro would be even worse than this. A C++ template
387 would be perfect.
388
389 The "report an error" functions are deliberately not part of the #include
390 file: if the test fails, you can set a breakpoint in the appropriate
391 error function directly, and crawl back from there in the debugger.
392*/
393
394#define UNBIND(X) Py_DECREF(X); (X) = NULL
395
396static PyObject *
397raise_test_long_error(const char* msg)
398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000400}
401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402#define TESTNAME test_long_api_inner
403#define TYPENAME long
404#define F_S_TO_PY PyLong_FromLong
405#define F_PY_TO_S PyLong_AsLong
406#define F_U_TO_PY PyLong_FromUnsignedLong
407#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000408
409#include "testcapi_long.h"
410
411static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000412test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000415}
416
417#undef TESTNAME
418#undef TYPENAME
419#undef F_S_TO_PY
420#undef F_PY_TO_S
421#undef F_U_TO_PY
422#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000423
Tim Peters91621db2001-06-12 20:10:01 +0000424static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000425raise_test_longlong_error(const char* msg)
426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000428}
429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700431#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432#define F_S_TO_PY PyLong_FromLongLong
433#define F_PY_TO_S PyLong_AsLongLong
434#define F_U_TO_PY PyLong_FromUnsignedLongLong
435#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000436
437#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000438
439static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000440test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000441{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000443}
444
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000445#undef TESTNAME
446#undef TYPENAME
447#undef F_S_TO_PY
448#undef F_PY_TO_S
449#undef F_U_TO_PY
450#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000451
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000452/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
453 is tested by test_long_api_inner. This test will concentrate on proper
454 handling of overflow.
455*/
456
457static PyObject *
458test_long_and_overflow(PyObject *self)
459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 PyObject *num, *one, *temp;
461 long value;
462 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 /* Test that overflow is set properly for a large value. */
465 /* num is a number larger than LONG_MAX even on 64-bit platforms */
466 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
467 if (num == NULL)
468 return NULL;
469 overflow = 1234;
470 value = PyLong_AsLongAndOverflow(num, &overflow);
471 Py_DECREF(num);
472 if (value == -1 && PyErr_Occurred())
473 return NULL;
474 if (value != -1)
475 return raiseTestError("test_long_and_overflow",
476 "return value was not set to -1");
477 if (overflow != 1)
478 return raiseTestError("test_long_and_overflow",
479 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 /* Same again, with num = LONG_MAX + 1 */
482 num = PyLong_FromLong(LONG_MAX);
483 if (num == NULL)
484 return NULL;
485 one = PyLong_FromLong(1L);
486 if (one == NULL) {
487 Py_DECREF(num);
488 return NULL;
489 }
490 temp = PyNumber_Add(num, one);
491 Py_DECREF(one);
492 Py_DECREF(num);
493 num = temp;
494 if (num == NULL)
495 return NULL;
496 overflow = 0;
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 /* Test that overflow is set properly for a large negative value. */
509 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
510 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
511 if (num == NULL)
512 return NULL;
513 overflow = 1234;
514 value = PyLong_AsLongAndOverflow(num, &overflow);
515 Py_DECREF(num);
516 if (value == -1 && PyErr_Occurred())
517 return NULL;
518 if (value != -1)
519 return raiseTestError("test_long_and_overflow",
520 "return value was not set to -1");
521 if (overflow != -1)
522 return raiseTestError("test_long_and_overflow",
523 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 /* Same again, with num = LONG_MIN - 1 */
526 num = PyLong_FromLong(LONG_MIN);
527 if (num == NULL)
528 return NULL;
529 one = PyLong_FromLong(1L);
530 if (one == NULL) {
531 Py_DECREF(num);
532 return NULL;
533 }
534 temp = PyNumber_Subtract(num, one);
535 Py_DECREF(one);
536 Py_DECREF(num);
537 num = temp;
538 if (num == NULL)
539 return NULL;
540 overflow = 0;
541 value = PyLong_AsLongAndOverflow(num, &overflow);
542 Py_DECREF(num);
543 if (value == -1 && PyErr_Occurred())
544 return NULL;
545 if (value != -1)
546 return raiseTestError("test_long_and_overflow",
547 "return value was not set to -1");
548 if (overflow != -1)
549 return raiseTestError("test_long_and_overflow",
550 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 /* Test that overflow is cleared properly for small values. */
553 num = PyLong_FromString("FF", NULL, 16);
554 if (num == NULL)
555 return NULL;
556 overflow = 1234;
557 value = PyLong_AsLongAndOverflow(num, &overflow);
558 Py_DECREF(num);
559 if (value == -1 && PyErr_Occurred())
560 return NULL;
561 if (value != 0xFF)
562 return raiseTestError("test_long_and_overflow",
563 "expected return value 0xFF");
564 if (overflow != 0)
565 return raiseTestError("test_long_and_overflow",
566 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 num = PyLong_FromString("-FF", NULL, 16);
569 if (num == NULL)
570 return NULL;
571 overflow = 0;
572 value = PyLong_AsLongAndOverflow(num, &overflow);
573 Py_DECREF(num);
574 if (value == -1 && PyErr_Occurred())
575 return NULL;
576 if (value != -0xFF)
577 return raiseTestError("test_long_and_overflow",
578 "expected return value 0xFF");
579 if (overflow != 0)
580 return raiseTestError("test_long_and_overflow",
581 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 num = PyLong_FromLong(LONG_MAX);
584 if (num == NULL)
585 return NULL;
586 overflow = 1234;
587 value = PyLong_AsLongAndOverflow(num, &overflow);
588 Py_DECREF(num);
589 if (value == -1 && PyErr_Occurred())
590 return NULL;
591 if (value != LONG_MAX)
592 return raiseTestError("test_long_and_overflow",
593 "expected return value LONG_MAX");
594 if (overflow != 0)
595 return raiseTestError("test_long_and_overflow",
596 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 num = PyLong_FromLong(LONG_MIN);
599 if (num == NULL)
600 return NULL;
601 overflow = 0;
602 value = PyLong_AsLongAndOverflow(num, &overflow);
603 Py_DECREF(num);
604 if (value == -1 && PyErr_Occurred())
605 return NULL;
606 if (value != LONG_MIN)
607 return raiseTestError("test_long_and_overflow",
608 "expected return value LONG_MIN");
609 if (overflow != 0)
610 return raiseTestError("test_long_and_overflow",
611 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000612
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200613 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000614}
615
Mark Dickinson93f562c2010-01-30 10:30:15 +0000616/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700617 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000618 concentrate on proper handling of overflow.
619*/
620
621static PyObject *
622test_long_long_and_overflow(PyObject *self)
623{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700625 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 /* Test that overflow is set properly for a large value. */
629 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
630 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
631 if (num == NULL)
632 return NULL;
633 overflow = 1234;
634 value = PyLong_AsLongLongAndOverflow(num, &overflow);
635 Py_DECREF(num);
636 if (value == -1 && PyErr_Occurred())
637 return NULL;
638 if (value != -1)
639 return raiseTestError("test_long_long_and_overflow",
640 "return value was not set to -1");
641 if (overflow != 1)
642 return raiseTestError("test_long_long_and_overflow",
643 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 /* Same again, with num = PY_LLONG_MAX + 1 */
646 num = PyLong_FromLongLong(PY_LLONG_MAX);
647 if (num == NULL)
648 return NULL;
649 one = PyLong_FromLong(1L);
650 if (one == NULL) {
651 Py_DECREF(num);
652 return NULL;
653 }
654 temp = PyNumber_Add(num, one);
655 Py_DECREF(one);
656 Py_DECREF(num);
657 num = temp;
658 if (num == NULL)
659 return NULL;
660 overflow = 0;
661 value = PyLong_AsLongLongAndOverflow(num, &overflow);
662 Py_DECREF(num);
663 if (value == -1 && PyErr_Occurred())
664 return NULL;
665 if (value != -1)
666 return raiseTestError("test_long_long_and_overflow",
667 "return value was not set to -1");
668 if (overflow != 1)
669 return raiseTestError("test_long_long_and_overflow",
670 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 /* Test that overflow is set properly for a large negative value. */
673 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
674 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
675 if (num == NULL)
676 return NULL;
677 overflow = 1234;
678 value = PyLong_AsLongLongAndOverflow(num, &overflow);
679 Py_DECREF(num);
680 if (value == -1 && PyErr_Occurred())
681 return NULL;
682 if (value != -1)
683 return raiseTestError("test_long_long_and_overflow",
684 "return value was not set to -1");
685 if (overflow != -1)
686 return raiseTestError("test_long_long_and_overflow",
687 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 /* Same again, with num = PY_LLONG_MIN - 1 */
690 num = PyLong_FromLongLong(PY_LLONG_MIN);
691 if (num == NULL)
692 return NULL;
693 one = PyLong_FromLong(1L);
694 if (one == NULL) {
695 Py_DECREF(num);
696 return NULL;
697 }
698 temp = PyNumber_Subtract(num, one);
699 Py_DECREF(one);
700 Py_DECREF(num);
701 num = temp;
702 if (num == NULL)
703 return NULL;
704 overflow = 0;
705 value = PyLong_AsLongLongAndOverflow(num, &overflow);
706 Py_DECREF(num);
707 if (value == -1 && PyErr_Occurred())
708 return NULL;
709 if (value != -1)
710 return raiseTestError("test_long_long_and_overflow",
711 "return value was not set to -1");
712 if (overflow != -1)
713 return raiseTestError("test_long_long_and_overflow",
714 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 /* Test that overflow is cleared properly for small values. */
717 num = PyLong_FromString("FF", NULL, 16);
718 if (num == NULL)
719 return NULL;
720 overflow = 1234;
721 value = PyLong_AsLongLongAndOverflow(num, &overflow);
722 Py_DECREF(num);
723 if (value == -1 && PyErr_Occurred())
724 return NULL;
725 if (value != 0xFF)
726 return raiseTestError("test_long_long_and_overflow",
727 "expected return value 0xFF");
728 if (overflow != 0)
729 return raiseTestError("test_long_long_and_overflow",
730 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 num = PyLong_FromString("-FF", NULL, 16);
733 if (num == NULL)
734 return NULL;
735 overflow = 0;
736 value = PyLong_AsLongLongAndOverflow(num, &overflow);
737 Py_DECREF(num);
738 if (value == -1 && PyErr_Occurred())
739 return NULL;
740 if (value != -0xFF)
741 return raiseTestError("test_long_long_and_overflow",
742 "expected return value 0xFF");
743 if (overflow != 0)
744 return raiseTestError("test_long_long_and_overflow",
745 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 num = PyLong_FromLongLong(PY_LLONG_MAX);
748 if (num == NULL)
749 return NULL;
750 overflow = 1234;
751 value = PyLong_AsLongLongAndOverflow(num, &overflow);
752 Py_DECREF(num);
753 if (value == -1 && PyErr_Occurred())
754 return NULL;
755 if (value != PY_LLONG_MAX)
756 return raiseTestError("test_long_long_and_overflow",
757 "expected return value PY_LLONG_MAX");
758 if (overflow != 0)
759 return raiseTestError("test_long_long_and_overflow",
760 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 num = PyLong_FromLongLong(PY_LLONG_MIN);
763 if (num == NULL)
764 return NULL;
765 overflow = 0;
766 value = PyLong_AsLongLongAndOverflow(num, &overflow);
767 Py_DECREF(num);
768 if (value == -1 && PyErr_Occurred())
769 return NULL;
770 if (value != PY_LLONG_MIN)
771 return raiseTestError("test_long_long_and_overflow",
772 "expected return value PY_LLONG_MIN");
773 if (overflow != 0)
774 return raiseTestError("test_long_long_and_overflow",
775 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000776
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200777 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000778}
779
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200780/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
781 non-integer arguments are handled correctly. It should be extended to
782 test overflow handling.
783 */
784
785static PyObject *
786test_long_as_size_t(PyObject *self)
787{
788 size_t out_u;
789 Py_ssize_t out_s;
790
791 Py_INCREF(Py_None);
792
793 out_u = PyLong_AsSize_t(Py_None);
794 if (out_u != (size_t)-1 || !PyErr_Occurred())
795 return raiseTestError("test_long_as_size_t",
796 "PyLong_AsSize_t(None) didn't complain");
797 if (!PyErr_ExceptionMatches(PyExc_TypeError))
798 return raiseTestError("test_long_as_size_t",
799 "PyLong_AsSize_t(None) raised "
800 "something other than TypeError");
801 PyErr_Clear();
802
803 out_s = PyLong_AsSsize_t(Py_None);
804 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
805 return raiseTestError("test_long_as_size_t",
806 "PyLong_AsSsize_t(None) didn't complain");
807 if (!PyErr_ExceptionMatches(PyExc_TypeError))
808 return raiseTestError("test_long_as_size_t",
809 "PyLong_AsSsize_t(None) raised "
810 "something other than TypeError");
811 PyErr_Clear();
812
813 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
814 return Py_None;
815}
816
817/* Test the PyLong_AsDouble API. At present this just tests that
818 non-integer arguments are handled correctly.
819 */
820
821static PyObject *
822test_long_as_double(PyObject *self)
823{
824 double out;
825
826 Py_INCREF(Py_None);
827
828 out = PyLong_AsDouble(Py_None);
829 if (out != -1.0 || !PyErr_Occurred())
830 return raiseTestError("test_long_as_double",
831 "PyLong_AsDouble(None) didn't complain");
832 if (!PyErr_ExceptionMatches(PyExc_TypeError))
833 return raiseTestError("test_long_as_double",
834 "PyLong_AsDouble(None) raised "
835 "something other than TypeError");
836 PyErr_Clear();
837
838 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
839 return Py_None;
840}
841
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700842/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000843 for both long and int arguments. The test may leak a little memory if
844 it fails.
845*/
846static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000847test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000848{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700850 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 tuple = PyTuple_New(1);
853 if (tuple == NULL)
854 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 num = PyLong_FromLong(42);
857 if (num == NULL)
858 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 value = -1;
863 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
864 return NULL;
865 if (value != 42)
866 return raiseTestError("test_L_code",
867 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 Py_DECREF(num);
870 num = PyLong_FromLong(42);
871 if (num == NULL)
872 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 value = -1;
877 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
878 return NULL;
879 if (value != 42)
880 return raiseTestError("test_L_code",
881 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200884 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000885}
886
Serhiy Storchakace412872016-05-08 23:36:44 +0300887static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300888return_none(void *unused)
889{
890 Py_RETURN_NONE;
891}
892
893static PyObject *
894raise_error(void *unused)
895{
896 PyErr_SetNone(PyExc_ValueError);
897 return NULL;
898}
899
900static int
901test_buildvalue_N_error(const char *fmt)
902{
903 PyObject *arg, *res;
904
905 arg = PyList_New(0);
906 if (arg == NULL) {
907 return -1;
908 }
909
910 Py_INCREF(arg);
911 res = Py_BuildValue(fmt, return_none, NULL, arg);
912 if (res == NULL) {
913 return -1;
914 }
915 Py_DECREF(res);
916 if (Py_REFCNT(arg) != 1) {
917 PyErr_Format(TestError, "test_buildvalue_N: "
918 "arg was not decrefed in successful "
919 "Py_BuildValue(\"%s\")", fmt);
920 return -1;
921 }
922
923 Py_INCREF(arg);
924 res = Py_BuildValue(fmt, raise_error, NULL, arg);
925 if (res != NULL || !PyErr_Occurred()) {
926 PyErr_Format(TestError, "test_buildvalue_N: "
927 "Py_BuildValue(\"%s\") didn't complain", fmt);
928 return -1;
929 }
930 PyErr_Clear();
931 if (Py_REFCNT(arg) != 1) {
932 PyErr_Format(TestError, "test_buildvalue_N: "
933 "arg was not decrefed in failed "
934 "Py_BuildValue(\"%s\")", fmt);
935 return -1;
936 }
937 Py_DECREF(arg);
938 return 0;
939}
940
941static PyObject *
942test_buildvalue_N(PyObject *self, PyObject *noargs)
943{
944 PyObject *arg, *res;
945
946 arg = PyList_New(0);
947 if (arg == NULL) {
948 return NULL;
949 }
950 Py_INCREF(arg);
951 res = Py_BuildValue("N", arg);
952 if (res == NULL) {
953 return NULL;
954 }
955 if (res != arg) {
956 return raiseTestError("test_buildvalue_N",
957 "Py_BuildValue(\"N\") returned wrong result");
958 }
959 if (Py_REFCNT(arg) != 2) {
960 return raiseTestError("test_buildvalue_N",
961 "arg was not decrefed in Py_BuildValue(\"N\")");
962 }
963 Py_DECREF(res);
964 Py_DECREF(arg);
965
966 if (test_buildvalue_N_error("O&N") < 0)
967 return NULL;
968 if (test_buildvalue_N_error("(O&N)") < 0)
969 return NULL;
970 if (test_buildvalue_N_error("[O&N]") < 0)
971 return NULL;
972 if (test_buildvalue_N_error("{O&N}") < 0)
973 return NULL;
974 if (test_buildvalue_N_error("{()O&(())N}") < 0)
975 return NULL;
976
977 Py_RETURN_NONE;
978}
979
980
981static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +0300982get_args(PyObject *self, PyObject *args)
983{
984 if (args == NULL) {
985 args = Py_None;
986 }
987 Py_INCREF(args);
988 return args;
989}
990
991static PyObject *
992get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
993{
994 if (kwargs == NULL) {
995 kwargs = Py_None;
996 }
997 Py_INCREF(kwargs);
998 return kwargs;
999}
1000
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001001/* Test tuple argument processing */
1002static PyObject *
1003getargs_tuple(PyObject *self, PyObject *args)
1004{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 int a, b, c;
1006 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1007 return NULL;
1008 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001009}
1010
Christian Heimes380f7f22008-02-28 11:19:05 +00001011/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001012static PyObject *
1013getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001016 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1020 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1021 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1022 return NULL;
1023 return Py_BuildValue("iiiiiiiiii",
1024 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1025 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001026}
1027
Larry Hastings83a9f482012-03-20 20:06:16 +00001028/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1029static PyObject *
1030getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1031{
1032 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1033 int required = -1;
1034 int optional = -1;
1035 int keyword_only = -1;
1036
1037 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1038 &required, &optional, &keyword_only))
1039 return NULL;
1040 return Py_BuildValue("iii", required, optional, keyword_only);
1041}
1042
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001043/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1044static PyObject *
1045getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1046{
1047 static char *keywords[] = {"", "", "keyword", NULL};
1048 int required = -1;
1049 int optional = -1;
1050 int keyword = -1;
1051
1052 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1053 &required, &optional, &keyword))
1054 return NULL;
1055 return Py_BuildValue("iii", required, optional, keyword);
1056}
1057
Thomas Heller3457e4b2003-04-24 16:14:27 +00001058/* Functions to call PyArg_ParseTuple with integer format codes,
1059 and return the result.
1060*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001061static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001062getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001063{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 unsigned char value;
1065 if (!PyArg_ParseTuple(args, "b", &value))
1066 return NULL;
1067 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001068}
1069
Thomas Heller3457e4b2003-04-24 16:14:27 +00001070static PyObject *
1071getargs_B(PyObject *self, PyObject *args)
1072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 unsigned char value;
1074 if (!PyArg_ParseTuple(args, "B", &value))
1075 return NULL;
1076 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001077}
1078
1079static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001080getargs_h(PyObject *self, PyObject *args)
1081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 short value;
1083 if (!PyArg_ParseTuple(args, "h", &value))
1084 return NULL;
1085 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001086}
1087
1088static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001089getargs_H(PyObject *self, PyObject *args)
1090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 unsigned short value;
1092 if (!PyArg_ParseTuple(args, "H", &value))
1093 return NULL;
1094 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001095}
1096
1097static PyObject *
1098getargs_I(PyObject *self, PyObject *args)
1099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 unsigned int value;
1101 if (!PyArg_ParseTuple(args, "I", &value))
1102 return NULL;
1103 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001104}
1105
1106static PyObject *
1107getargs_k(PyObject *self, PyObject *args)
1108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 unsigned long value;
1110 if (!PyArg_ParseTuple(args, "k", &value))
1111 return NULL;
1112 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001113}
1114
1115static PyObject *
1116getargs_i(PyObject *self, PyObject *args)
1117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 int value;
1119 if (!PyArg_ParseTuple(args, "i", &value))
1120 return NULL;
1121 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001122}
1123
Thomas Hellera4ea6032003-04-17 18:55:45 +00001124static PyObject *
1125getargs_l(PyObject *self, PyObject *args)
1126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 long value;
1128 if (!PyArg_ParseTuple(args, "l", &value))
1129 return NULL;
1130 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001131}
1132
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001133static PyObject *
1134getargs_n(PyObject *self, PyObject *args)
1135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 Py_ssize_t value;
1137 if (!PyArg_ParseTuple(args, "n", &value))
1138 return NULL;
1139 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001140}
1141
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001142static PyObject *
1143getargs_p(PyObject *self, PyObject *args)
1144{
1145 int value;
1146 if (!PyArg_ParseTuple(args, "p", &value))
1147 return NULL;
1148 return PyLong_FromLong(value);
1149}
1150
Thomas Hellera4ea6032003-04-17 18:55:45 +00001151static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001152getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001153{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001154 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 if (!PyArg_ParseTuple(args, "L", &value))
1156 return NULL;
1157 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001158}
1159
Thomas Hellera4ea6032003-04-17 18:55:45 +00001160static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001161getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001162{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001163 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 if (!PyArg_ParseTuple(args, "K", &value))
1165 return NULL;
1166 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001167}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001168
1169/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001170 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001171static PyObject *
1172test_k_code(PyObject *self)
1173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 PyObject *tuple, *num;
1175 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 tuple = PyTuple_New(1);
1178 if (tuple == NULL)
1179 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 /* a number larger than ULONG_MAX even on 64-bit platforms */
1182 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1183 if (num == NULL)
1184 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 value = PyLong_AsUnsignedLongMask(num);
1187 if (value != ULONG_MAX)
1188 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001189 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 value = 0;
1194 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1195 return NULL;
1196 if (value != ULONG_MAX)
1197 return raiseTestError("test_k_code",
1198 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 Py_DECREF(num);
1201 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1202 if (num == NULL)
1203 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 value = PyLong_AsUnsignedLongMask(num);
1206 if (value != (unsigned long)-0x42)
1207 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001208 "PyLong_AsUnsignedLongMask() returned wrong "
1209 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 value = 0;
1214 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1215 return NULL;
1216 if (value != (unsigned long)-0x42)
1217 return raiseTestError("test_k_code",
1218 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001221 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001222}
1223
Victor Stinner06e49dd2010-06-13 18:21:50 +00001224static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001225getargs_f(PyObject *self, PyObject *args)
1226{
1227 float f;
1228 if (!PyArg_ParseTuple(args, "f", &f))
1229 return NULL;
1230 return PyFloat_FromDouble(f);
1231}
1232
1233static PyObject *
1234getargs_d(PyObject *self, PyObject *args)
1235{
1236 double d;
1237 if (!PyArg_ParseTuple(args, "d", &d))
1238 return NULL;
1239 return PyFloat_FromDouble(d);
1240}
1241
1242static PyObject *
1243getargs_D(PyObject *self, PyObject *args)
1244{
1245 Py_complex cval;
1246 if (!PyArg_ParseTuple(args, "D", &cval))
1247 return NULL;
1248 return PyComplex_FromCComplex(cval);
1249}
1250
1251static PyObject *
1252getargs_S(PyObject *self, PyObject *args)
1253{
1254 PyObject *obj;
1255 if (!PyArg_ParseTuple(args, "S", &obj))
1256 return NULL;
1257 Py_INCREF(obj);
1258 return obj;
1259}
1260
1261static PyObject *
1262getargs_Y(PyObject *self, PyObject *args)
1263{
1264 PyObject *obj;
1265 if (!PyArg_ParseTuple(args, "Y", &obj))
1266 return NULL;
1267 Py_INCREF(obj);
1268 return obj;
1269}
1270
1271static PyObject *
1272getargs_U(PyObject *self, PyObject *args)
1273{
1274 PyObject *obj;
1275 if (!PyArg_ParseTuple(args, "U", &obj))
1276 return NULL;
1277 Py_INCREF(obj);
1278 return obj;
1279}
1280
1281static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001282getargs_c(PyObject *self, PyObject *args)
1283{
1284 char c;
1285 if (!PyArg_ParseTuple(args, "c", &c))
1286 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001287 return PyLong_FromLong((unsigned char)c);
1288}
1289
1290static PyObject *
1291getargs_C(PyObject *self, PyObject *args)
1292{
1293 int c;
1294 if (!PyArg_ParseTuple(args, "C", &c))
1295 return NULL;
1296 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001297}
1298
1299static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001300getargs_s(PyObject *self, PyObject *args)
1301{
1302 char *str;
1303 if (!PyArg_ParseTuple(args, "s", &str))
1304 return NULL;
1305 return PyBytes_FromString(str);
1306}
1307
1308static PyObject *
1309getargs_s_star(PyObject *self, PyObject *args)
1310{
1311 Py_buffer buffer;
1312 PyObject *bytes;
1313 if (!PyArg_ParseTuple(args, "s*", &buffer))
1314 return NULL;
1315 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1316 PyBuffer_Release(&buffer);
1317 return bytes;
1318}
1319
1320static PyObject *
1321getargs_s_hash(PyObject *self, PyObject *args)
1322{
1323 char *str;
1324 Py_ssize_t size;
1325 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1326 return NULL;
1327 return PyBytes_FromStringAndSize(str, size);
1328}
1329
1330static PyObject *
1331getargs_z(PyObject *self, PyObject *args)
1332{
1333 char *str;
1334 if (!PyArg_ParseTuple(args, "z", &str))
1335 return NULL;
1336 if (str != NULL)
1337 return PyBytes_FromString(str);
1338 else
1339 Py_RETURN_NONE;
1340}
1341
1342static PyObject *
1343getargs_z_star(PyObject *self, PyObject *args)
1344{
1345 Py_buffer buffer;
1346 PyObject *bytes;
1347 if (!PyArg_ParseTuple(args, "z*", &buffer))
1348 return NULL;
1349 if (buffer.buf != NULL)
1350 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1351 else {
1352 Py_INCREF(Py_None);
1353 bytes = Py_None;
1354 }
1355 PyBuffer_Release(&buffer);
1356 return bytes;
1357}
1358
1359static PyObject *
1360getargs_z_hash(PyObject *self, PyObject *args)
1361{
1362 char *str;
1363 Py_ssize_t size;
1364 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1365 return NULL;
1366 if (str != NULL)
1367 return PyBytes_FromStringAndSize(str, size);
1368 else
1369 Py_RETURN_NONE;
1370}
1371
1372static PyObject *
1373getargs_y(PyObject *self, PyObject *args)
1374{
1375 char *str;
1376 if (!PyArg_ParseTuple(args, "y", &str))
1377 return NULL;
1378 return PyBytes_FromString(str);
1379}
1380
1381static PyObject *
1382getargs_y_star(PyObject *self, PyObject *args)
1383{
1384 Py_buffer buffer;
1385 PyObject *bytes;
1386 if (!PyArg_ParseTuple(args, "y*", &buffer))
1387 return NULL;
1388 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1389 PyBuffer_Release(&buffer);
1390 return bytes;
1391}
1392
1393static PyObject *
1394getargs_y_hash(PyObject *self, PyObject *args)
1395{
1396 char *str;
1397 Py_ssize_t size;
1398 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1399 return NULL;
1400 return PyBytes_FromStringAndSize(str, size);
1401}
1402
1403static PyObject *
1404getargs_u(PyObject *self, PyObject *args)
1405{
1406 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001407 if (!PyArg_ParseTuple(args, "u", &str))
1408 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001409 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001410}
1411
1412static PyObject *
1413getargs_u_hash(PyObject *self, PyObject *args)
1414{
1415 Py_UNICODE *str;
1416 Py_ssize_t size;
1417 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1418 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001419 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001420}
1421
1422static PyObject *
1423getargs_Z(PyObject *self, PyObject *args)
1424{
1425 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001426 if (!PyArg_ParseTuple(args, "Z", &str))
1427 return NULL;
1428 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001429 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001430 } else
1431 Py_RETURN_NONE;
1432}
1433
1434static PyObject *
1435getargs_Z_hash(PyObject *self, PyObject *args)
1436{
1437 Py_UNICODE *str;
1438 Py_ssize_t size;
1439 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1440 return NULL;
1441 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001442 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001443 else
1444 Py_RETURN_NONE;
1445}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001446
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001447static PyObject *
1448getargs_es(PyObject *self, PyObject *args)
1449{
1450 PyObject *arg, *result;
1451 const char *encoding = NULL;
1452 char *str;
1453
1454 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1455 return NULL;
1456 if (!PyArg_Parse(arg, "es", encoding, &str))
1457 return NULL;
1458 result = PyBytes_FromString(str);
1459 PyMem_Free(str);
1460 return result;
1461}
1462
1463static PyObject *
1464getargs_et(PyObject *self, PyObject *args)
1465{
1466 PyObject *arg, *result;
1467 const char *encoding = NULL;
1468 char *str;
1469
1470 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1471 return NULL;
1472 if (!PyArg_Parse(arg, "et", encoding, &str))
1473 return NULL;
1474 result = PyBytes_FromString(str);
1475 PyMem_Free(str);
1476 return result;
1477}
1478
1479static PyObject *
1480getargs_es_hash(PyObject *self, PyObject *args)
1481{
1482 PyObject *arg, *result;
1483 const char *encoding = NULL;
1484 PyByteArrayObject *buffer = NULL;
1485 char *str = NULL;
1486 Py_ssize_t size;
1487
1488 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1489 return NULL;
1490 if (buffer != NULL) {
1491 str = PyByteArray_AS_STRING(buffer);
1492 size = PyByteArray_GET_SIZE(buffer);
1493 }
1494 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1495 return NULL;
1496 result = PyBytes_FromStringAndSize(str, size);
1497 if (buffer == NULL)
1498 PyMem_Free(str);
1499 return result;
1500}
1501
1502static PyObject *
1503getargs_et_hash(PyObject *self, PyObject *args)
1504{
1505 PyObject *arg, *result;
1506 const char *encoding = NULL;
1507 PyByteArrayObject *buffer = NULL;
1508 char *str = NULL;
1509 Py_ssize_t size;
1510
1511 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1512 return NULL;
1513 if (buffer != NULL) {
1514 str = PyByteArray_AS_STRING(buffer);
1515 size = PyByteArray_GET_SIZE(buffer);
1516 }
1517 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1518 return NULL;
1519 result = PyBytes_FromStringAndSize(str, size);
1520 if (buffer == NULL)
1521 PyMem_Free(str);
1522 return result;
1523}
1524
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001525/* Test the s and z codes for PyArg_ParseTuple.
1526*/
1527static PyObject *
1528test_s_code(PyObject *self)
1529{
1530 /* Unicode strings should be accepted */
1531 PyObject *tuple, *obj;
1532 char *value;
1533
1534 tuple = PyTuple_New(1);
1535 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001537
1538 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001540 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001542
1543 PyTuple_SET_ITEM(tuple, 0, obj);
1544
1545 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001547 */
1548 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001550
1551 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001553
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001554 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001555 Py_RETURN_NONE;
1556}
1557
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001558static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001559parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001560{
Larry Hastings8f904da2012-06-22 03:56:29 -07001561 PyObject *sub_args;
1562 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001563 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001564 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001565
Larry Hastings8f904da2012-06-22 03:56:29 -07001566 Py_ssize_t i, size;
1567 char *keywords[8 + 1]; /* space for NULL at end */
1568 PyObject *o;
1569 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001570
Larry Hastings8f904da2012-06-22 03:56:29 -07001571 int result;
1572 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001573
Larry Hastings22701e82012-08-08 14:52:22 -07001574 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001575
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001576 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001577 &sub_args, &sub_kwargs,
1578 &sub_format, &sub_keywords))
1579 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001580
Larry Hastings8f904da2012-06-22 03:56:29 -07001581 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1582 PyErr_SetString(PyExc_ValueError,
1583 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1584 return NULL;
1585 }
1586
1587 memset(buffers, 0, sizeof(buffers));
1588 memset(converted, 0, sizeof(converted));
1589 memset(keywords, 0, sizeof(keywords));
1590
1591 size = PySequence_Fast_GET_SIZE(sub_keywords);
1592 if (size > 8) {
1593 PyErr_SetString(PyExc_ValueError,
1594 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1595 goto exit;
1596 }
1597
1598 for (i = 0; i < size; i++) {
1599 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1600 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1601 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001602 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001603 goto exit;
1604 }
1605 keywords[i] = PyBytes_AS_STRING(converted[i]);
1606 }
1607
1608 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1609 sub_format, keywords,
1610 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1611 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1612
1613 if (result) {
1614 return_value = Py_None;
1615 Py_INCREF(Py_None);
1616 }
1617
1618exit:
1619 size = sizeof(converted) / sizeof(converted[0]);
1620 for (i = 0; i < size; i++) {
1621 Py_XDECREF(converted[i]);
1622 }
1623 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001624}
1625
Benjamin Peterson92035012008-12-27 16:00:54 +00001626static volatile int x;
1627
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001628/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1629 of an error.
1630*/
1631static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001632test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 PyObject *tuple, *obj;
1635 Py_UNICODE *value;
1636 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1639 /* Just use the macro and check that it compiles */
1640 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 tuple = PyTuple_New(1);
1643 if (tuple == NULL)
1644 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 obj = PyUnicode_Decode("test", strlen("test"),
1647 "ascii", NULL);
1648 if (obj == NULL)
1649 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 value = 0;
1654 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1655 return NULL;
1656 if (value != PyUnicode_AS_UNICODE(obj))
1657 return raiseTestError("test_u_code",
1658 "u code returned wrong value for u'test'");
1659 value = 0;
1660 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1661 return NULL;
1662 if (value != PyUnicode_AS_UNICODE(obj) ||
1663 len != PyUnicode_GET_SIZE(obj))
1664 return raiseTestError("test_u_code",
1665 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001668 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001669}
1670
Guido van Rossumfb67be22007-08-29 18:38:11 +00001671/* Test Z and Z# codes for PyArg_ParseTuple */
1672static PyObject *
1673test_Z_code(PyObject *self)
1674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001676 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 tuple = PyTuple_New(2);
1680 if (tuple == NULL)
1681 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 obj = PyUnicode_FromString("test");
1684 PyTuple_SET_ITEM(tuple, 0, obj);
1685 Py_INCREF(Py_None);
1686 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 /* swap values on purpose */
1689 value1 = NULL;
1690 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 /* Test Z for both values */
1693 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1694 return NULL;
1695 if (value1 != PyUnicode_AS_UNICODE(obj))
1696 return raiseTestError("test_Z_code",
1697 "Z code returned wrong value for 'test'");
1698 if (value2 != NULL)
1699 return raiseTestError("test_Z_code",
1700 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 value1 = NULL;
1703 value2 = PyUnicode_AS_UNICODE(obj);
1704 len1 = -1;
1705 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 /* Test Z# for both values */
1708 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1709 &value2, &len2) < 0)
1710 return NULL;
1711 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1712 len1 != PyUnicode_GET_SIZE(obj))
1713 return raiseTestError("test_Z_code",
1714 "Z# code returned wrong values for 'test'");
1715 if (value2 != NULL ||
1716 len2 != 0)
1717 return raiseTestError("test_Z_code",
1718 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 Py_DECREF(tuple);
1721 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001722}
1723
Thomas Wouters477c8d52006-05-27 19:21:47 +00001724static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001725test_widechar(PyObject *self)
1726{
1727#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1729 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001730 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001731#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1733 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1738 if (wide == NULL)
1739 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1742 if (utf8 == NULL) {
1743 Py_DECREF(wide);
1744 return NULL;
1745 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001746
Victor Stinner8ef18872011-11-21 02:06:57 +01001747 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 Py_DECREF(wide);
1749 Py_DECREF(utf8);
1750 return raiseTestError("test_widechar",
1751 "wide string and utf8 string "
1752 "have different length");
1753 }
1754 if (PyUnicode_Compare(wide, utf8)) {
1755 Py_DECREF(wide);
1756 Py_DECREF(utf8);
1757 if (PyErr_Occurred())
1758 return NULL;
1759 return raiseTestError("test_widechar",
1760 "wide string and utf8 string "
1761 "are different");
1762 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 Py_DECREF(wide);
1765 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001766
1767#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1768 wide = PyUnicode_FromWideChar(invalid, 1);
1769 if (wide == NULL)
1770 PyErr_Clear();
1771 else
1772 return raiseTestError("test_widechar",
1773 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1774
1775 wide = PyUnicode_FromUnicode(invalid, 1);
1776 if (wide == NULL)
1777 PyErr_Clear();
1778 else
1779 return raiseTestError("test_widechar",
1780 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001781
1782 wide = PyUnicode_FromUnicode(NULL, 1);
1783 if (wide == NULL)
1784 return NULL;
1785 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001786 if (_PyUnicode_Ready(wide) < 0) {
1787 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001788 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001789 }
1790 else {
1791 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001792 return raiseTestError("test_widechar",
1793 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001794 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001795#endif
1796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001798}
1799
1800static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001801unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001802{
1803 PyObject *unicode, *result;
1804 Py_ssize_t buflen, size;
1805 wchar_t *buffer;
1806
1807 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1808 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001809 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001810 if (buffer == NULL)
1811 return PyErr_NoMemory();
1812
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001813 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001814 if (size == -1) {
1815 PyMem_Free(buffer);
1816 return NULL;
1817 }
1818
1819 if (size < buflen)
1820 buflen = size + 1;
1821 else
1822 buflen = size;
1823 result = PyUnicode_FromWideChar(buffer, buflen);
1824 PyMem_Free(buffer);
1825 if (result == NULL)
1826 return NULL;
1827
1828 return Py_BuildValue("(Nn)", result, size);
1829}
1830
1831static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001832unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001833{
1834 PyObject *unicode, *result;
1835 Py_ssize_t size;
1836 wchar_t *buffer;
1837
1838 if (!PyArg_ParseTuple(args, "U", &unicode))
1839 return NULL;
1840
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001841 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001842 if (buffer == NULL)
1843 return NULL;
1844
1845 result = PyUnicode_FromWideChar(buffer, size + 1);
1846 PyMem_Free(buffer);
1847 if (result == NULL)
1848 return NULL;
1849 return Py_BuildValue("(Nn)", result, size);
1850}
1851
1852static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001853unicode_asucs4(PyObject *self, PyObject *args)
1854{
1855 PyObject *unicode, *result;
1856 Py_UCS4 *buffer;
1857 int copy_null;
1858 Py_ssize_t str_len, buf_len;
1859
1860 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1861 return NULL;
1862 }
1863
1864 buf_len = str_len + 1;
1865 buffer = PyMem_NEW(Py_UCS4, buf_len);
1866 if (buffer == NULL) {
1867 return PyErr_NoMemory();
1868 }
1869 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1870 buffer[str_len] = 0xffffU;
1871
1872 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1873 PyMem_FREE(buffer);
1874 return NULL;
1875 }
1876
1877 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1878 PyMem_FREE(buffer);
1879 return result;
1880}
1881
1882static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001883unicode_findchar(PyObject *self, PyObject *args)
1884{
1885 PyObject *str;
1886 int direction;
1887 unsigned int ch;
1888 Py_ssize_t result;
1889 Py_ssize_t start, end;
1890
1891 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1892 &start, &end, &direction)) {
1893 return NULL;
1894 }
1895
1896 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
1897 if (result == -2)
1898 return NULL;
1899 else
1900 return PyLong_FromSsize_t(result);
1901}
1902
1903static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001904unicode_copycharacters(PyObject *self, PyObject *args)
1905{
1906 PyObject *from, *to, *to_copy;
1907 Py_ssize_t from_start, to_start, how_many, copied;
1908
1909 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1910 &from, &from_start, &how_many)) {
1911 return NULL;
1912 }
1913
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001914 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1915 PyUnicode_MAX_CHAR_VALUE(to)))) {
1916 return NULL;
1917 }
1918 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
1919 Py_DECREF(to_copy);
1920 return NULL;
1921 }
1922
1923 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
1924 from_start, how_many)) < 0) {
1925 Py_DECREF(to_copy);
1926 return NULL;
1927 }
1928
1929 return Py_BuildValue("(Nn)", to_copy, copied);
1930}
1931
1932static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001933unicode_encodedecimal(PyObject *self, PyObject *args)
1934{
1935 Py_UNICODE *unicode;
1936 Py_ssize_t length;
1937 char *errors = NULL;
1938 PyObject *decimal;
1939 Py_ssize_t decimal_length, new_length;
1940 int res;
1941
1942 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1943 return NULL;
1944
1945 decimal_length = length * 7; /* len('&#8364;') */
1946 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1947 if (decimal == NULL)
1948 return NULL;
1949
1950 res = PyUnicode_EncodeDecimal(unicode, length,
1951 PyBytes_AS_STRING(decimal),
1952 errors);
1953 if (res < 0) {
1954 Py_DECREF(decimal);
1955 return NULL;
1956 }
1957
1958 new_length = strlen(PyBytes_AS_STRING(decimal));
1959 assert(new_length <= decimal_length);
1960 res = _PyBytes_Resize(&decimal, new_length);
1961 if (res < 0)
1962 return NULL;
1963
1964 return decimal;
1965}
1966
1967static PyObject *
1968unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1969{
1970 Py_UNICODE *unicode;
1971 Py_ssize_t length;
1972 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1973 return NULL;
1974 return PyUnicode_TransformDecimalToASCII(unicode, length);
1975}
1976
1977static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001978unicode_legacy_string(PyObject *self, PyObject *args)
1979{
1980 Py_UNICODE *data;
1981 Py_ssize_t len;
1982 PyObject *u;
1983
1984 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1985 return NULL;
1986
1987 u = PyUnicode_FromUnicode(NULL, len);
1988 if (u == NULL)
1989 return NULL;
1990
1991 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1992
1993 if (len > 0) { /* The empty string is always ready. */
1994 assert(!PyUnicode_IS_READY(u));
1995 }
1996
1997 return u;
1998}
1999
2000static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002001getargs_w_star(PyObject *self, PyObject *args)
2002{
2003 Py_buffer buffer;
2004 PyObject *result;
2005 char *str;
2006
2007 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2008 return NULL;
2009
2010 if (2 <= buffer.len) {
2011 str = buffer.buf;
2012 str[0] = '[';
2013 str[buffer.len-1] = ']';
2014 }
2015
2016 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2017 PyBuffer_Release(&buffer);
2018 return result;
2019}
2020
2021
2022static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00002023test_empty_argparse(PyObject *self)
2024{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 /* Test that formats can begin with '|'. See issue #4720. */
2026 PyObject *tuple, *dict = NULL;
2027 static char *kwlist[] = {NULL};
2028 int result;
2029 tuple = PyTuple_New(0);
2030 if (!tuple)
2031 return NULL;
2032 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
2033 goto done;
2034 dict = PyDict_New();
2035 if (!dict)
2036 goto done;
2037 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002038 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 Py_DECREF(tuple);
2040 Py_XDECREF(dict);
2041 if (result < 0)
2042 return NULL;
2043 else {
2044 Py_RETURN_NONE;
2045 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002046}
2047
2048static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002049codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 const char *encoding, *errors = NULL;
2052 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2053 &encoding, &errors))
2054 return NULL;
2055 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002056}
2057
Thomas Wouters477c8d52006-05-27 19:21:47 +00002058static PyObject *
2059codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002060{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 const char *encoding, *errors = NULL;
2062 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2063 &encoding, &errors))
2064 return NULL;
2065 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002066}
2067
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002068
Tim Peters5b8132f2003-01-31 15:52:05 +00002069/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002070static PyObject *
2071test_long_numbits(PyObject *self)
2072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 struct triple {
2074 long input;
2075 size_t nbits;
2076 int sign;
2077 } testcases[] = {{0, 0, 0},
2078 {1L, 1, 1},
2079 {-1L, 1, -1},
2080 {2L, 2, 1},
2081 {-2L, 2, -1},
2082 {3L, 2, 1},
2083 {-3L, 2, -1},
2084 {4L, 3, 1},
2085 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002086 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 {-0x7fffL, 15, -1},
2088 {0xffffL, 16, 1},
2089 {-0xffffL, 16, -1},
2090 {0xfffffffL, 28, 1},
2091 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002092 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002093
Victor Stinner63941882011-09-29 00:42:28 +02002094 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002095 size_t nbits;
2096 int sign;
2097 PyObject *plong;
2098
2099 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002100 if (plong == NULL)
2101 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002102 nbits = _PyLong_NumBits(plong);
2103 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 Py_DECREF(plong);
2106 if (nbits != testcases[i].nbits)
2107 return raiseTestError("test_long_numbits",
2108 "wrong result for _PyLong_NumBits");
2109 if (sign != testcases[i].sign)
2110 return raiseTestError("test_long_numbits",
2111 "wrong result for _PyLong_Sign");
2112 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002113 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002114}
2115
Thomas Heller519a0422007-11-15 20:48:54 +00002116/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002117
2118static PyObject *
2119test_null_strings(PyObject *self)
2120{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2122 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2123 Py_XDECREF(o1);
2124 Py_XDECREF(o2);
2125 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002126}
2127
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002128static PyObject *
2129raise_exception(PyObject *self, PyObject *args)
2130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 PyObject *exc;
2132 PyObject *exc_args, *v;
2133 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2136 &exc, &num_args))
2137 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 exc_args = PyTuple_New(num_args);
2140 if (exc_args == NULL)
2141 return NULL;
2142 for (i = 0; i < num_args; ++i) {
2143 v = PyLong_FromLong(i);
2144 if (v == NULL) {
2145 Py_DECREF(exc_args);
2146 return NULL;
2147 }
2148 PyTuple_SET_ITEM(exc_args, i, v);
2149 }
2150 PyErr_SetObject(exc, exc_args);
2151 Py_DECREF(exc_args);
2152 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002153}
Tim Peters91621db2001-06-12 20:10:01 +00002154
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002155static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002156set_errno(PyObject *self, PyObject *args)
2157{
2158 int new_errno;
2159
2160 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2161 return NULL;
2162
2163 errno = new_errno;
2164 Py_RETURN_NONE;
2165}
2166
2167static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002168test_set_exc_info(PyObject *self, PyObject *args)
2169{
2170 PyObject *orig_exc;
2171 PyObject *new_type, *new_value, *new_tb;
2172 PyObject *type, *value, *tb;
2173 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2174 &new_type, &new_value, &new_tb))
2175 return NULL;
2176
2177 PyErr_GetExcInfo(&type, &value, &tb);
2178
2179 Py_INCREF(new_type);
2180 Py_INCREF(new_value);
2181 Py_INCREF(new_tb);
2182 PyErr_SetExcInfo(new_type, new_value, new_tb);
2183
2184 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2185 Py_XDECREF(type);
2186 Py_XDECREF(value);
2187 Py_XDECREF(tb);
2188 return orig_exc;
2189}
Benjamin Peterson16323982010-02-03 01:13:41 +00002190
2191static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002192
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002193static PyObject *
2194test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 if (PyDateTimeAPI) {
2196 if (test_run_counter) {
2197 /* Probably regrtest.py -R */
2198 Py_RETURN_NONE;
2199 }
2200 else {
2201 PyErr_SetString(PyExc_AssertionError,
2202 "PyDateTime_CAPI somehow initialized");
2203 return NULL;
2204 }
2205 }
2206 test_run_counter++;
2207 PyDateTime_IMPORT;
2208 if (PyDateTimeAPI)
2209 Py_RETURN_NONE;
2210 else
2211 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002212}
2213
Benjamin Peterson16323982010-02-03 01:13:41 +00002214
2215#ifdef WITH_THREAD
2216
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002217/* test_thread_state spawns a thread of its own, and that thread releases
2218 * `thread_done` when it's finished. The driver code has to know when the
2219 * thread finishes, because the thread uses a PyObject (the callable) that
2220 * may go away when the driver finishes. The former lack of this explicit
2221 * synchronization caused rare segfaults, so rare that they were seen only
2222 * on a Mac buildbot (although they were possible on any box).
2223 */
2224static PyThread_type_lock thread_done = NULL;
2225
Benjamin Petersona786b022008-08-25 21:05:21 +00002226static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002227_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 PyObject *rc;
2230 int success;
2231 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002232 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 success = (rc != NULL);
2234 Py_XDECREF(rc);
2235 PyGILState_Release(s);
2236 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002237}
2238
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002239/* Same thing, but releases `thread_done` when it returns. This variant
2240 * should be called only from threads spawned by test_thread_state().
2241 */
2242static void
2243_make_call_from_thread(void *callable)
2244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 _make_call(callable);
2246 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002247}
2248
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002249static PyObject *
2250test_thread_state(PyObject *self, PyObject *args)
2251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 PyObject *fn;
2253 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2256 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 if (!PyCallable_Check(fn)) {
2259 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2260 fn->ob_type->tp_name);
2261 return NULL;
2262 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 /* Ensure Python is set up for threading */
2265 PyEval_InitThreads();
2266 thread_done = PyThread_allocate_lock();
2267 if (thread_done == NULL)
2268 return PyErr_NoMemory();
2269 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 /* Start a new thread with our callback. */
2272 PyThread_start_new_thread(_make_call_from_thread, fn);
2273 /* Make the callback with the thread lock held by this thread */
2274 success &= _make_call(fn);
2275 /* Do it all again, but this time with the thread-lock released */
2276 Py_BEGIN_ALLOW_THREADS
2277 success &= _make_call(fn);
2278 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2279 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 /* And once more with and without a thread
2282 XXX - should use a lock and work out exactly what we are trying
2283 to test <wink>
2284 */
2285 Py_BEGIN_ALLOW_THREADS
2286 PyThread_start_new_thread(_make_call_from_thread, fn);
2287 success &= _make_call(fn);
2288 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2289 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 /* Release lock we acquired above. This is required on HP-UX. */
2292 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 PyThread_free_lock(thread_done);
2295 if (!success)
2296 return NULL;
2297 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002298}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002299
2300/* test Py_AddPendingCalls using threads */
2301static int _pending_callback(void *arg)
2302{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 /* we assume the argument is callable object to which we own a reference */
2304 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002305 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 Py_DECREF(callable);
2307 Py_XDECREF(r);
2308 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002309}
2310
2311/* The following requests n callbacks to _pending_callback. It can be
2312 * run from any python thread.
2313 */
2314PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
2315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 PyObject *callable;
2317 int r;
2318 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2319 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 /* create the reference for the callbackwhile we hold the lock */
2322 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 Py_BEGIN_ALLOW_THREADS
2325 r = Py_AddPendingCall(&_pending_callback, callable);
2326 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 if (r<0) {
2329 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002330 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002332 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002333}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002334#endif
2335
Neal Norwitzb0d26332007-08-25 00:49:05 +00002336/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002337static PyObject *
2338test_string_from_format(PyObject *self, PyObject *args)
2339{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 PyObject *result;
2341 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002342
Alexander Belopolskye239d232010-12-08 23:31:48 +00002343#define CHECK_1_FORMAT(FORMAT, TYPE) \
2344 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2345 if (result == NULL) \
2346 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002347 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002348 msg = FORMAT " failed at 1"; \
2349 goto Fail; \
2350 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 CHECK_1_FORMAT("%d", int);
2354 CHECK_1_FORMAT("%ld", long);
2355 /* The z width modifier was added in Python 2.5. */
2356 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 /* The u type code was added in Python 2.5. */
2359 CHECK_1_FORMAT("%u", unsigned int);
2360 CHECK_1_FORMAT("%lu", unsigned long);
2361 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002364 CHECK_1_FORMAT("%llu", unsigned long long);
2365 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002368
2369 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 Py_XDECREF(result);
2371 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002372
2373#undef CHECK_1_FORMAT
2374}
2375
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002376
2377static PyObject *
2378test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2380 int result;
2381 if (py_s == NULL)
2382 return NULL;
2383 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2384 Py_DECREF(py_s);
2385 if (!result) {
2386 PyErr_SetString(TestError, "Python string ending in NULL "
2387 "should not compare equal to c string.");
2388 return NULL;
2389 }
2390 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002391}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002392
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002393/* This is here to provide a docstring for test_descr. */
2394static PyObject *
2395test_with_docstring(PyObject *self)
2396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002398}
2399
Mark Dickinson725bfd82009-05-03 20:33:40 +00002400/* Test PyOS_string_to_double. */
2401static PyObject *
2402test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 double result;
2404 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406#define CHECK_STRING(STR, expected) \
2407 result = PyOS_string_to_double(STR, NULL, NULL); \
2408 if (result == -1.0 && PyErr_Occurred()) \
2409 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002410 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 msg = "conversion of " STR " to float failed"; \
2412 goto fail; \
2413 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415#define CHECK_INVALID(STR) \
2416 result = PyOS_string_to_double(STR, NULL, NULL); \
2417 if (result == -1.0 && PyErr_Occurred()) { \
2418 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2419 PyErr_Clear(); \
2420 else \
2421 return NULL; \
2422 } \
2423 else { \
2424 msg = "conversion of " STR " didn't raise ValueError"; \
2425 goto fail; \
2426 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 CHECK_STRING("0.1", 0.1);
2429 CHECK_STRING("1.234", 1.234);
2430 CHECK_STRING("-1.35", -1.35);
2431 CHECK_STRING(".1e01", 1.0);
2432 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002434 CHECK_INVALID(" 0.1");
2435 CHECK_INVALID("\t\n-3");
2436 CHECK_INVALID(".123 ");
2437 CHECK_INVALID("3\n");
2438 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002441 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002443#undef CHECK_STRING
2444#undef CHECK_INVALID
2445}
2446
2447
Benjamin Petersonb173f782009-05-05 22:31:58 +00002448/* Coverage testing of capsule objects. */
2449
2450static const char *capsule_name = "capsule name";
2451static char *capsule_pointer = "capsule pointer";
2452static char *capsule_context = "capsule context";
2453static const char *capsule_error = NULL;
2454static int
2455capsule_destructor_call_count = 0;
2456
2457static void
2458capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 capsule_destructor_call_count++;
2460 if (PyCapsule_GetContext(o) != capsule_context) {
2461 capsule_error = "context did not match in destructor!";
2462 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2463 capsule_error = "destructor did not match in destructor! (woah!)";
2464 } else if (PyCapsule_GetName(o) != capsule_name) {
2465 capsule_error = "name did not match in destructor!";
2466 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2467 capsule_error = "pointer did not match in destructor!";
2468 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002469}
2470
2471typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002472 char *name;
2473 char *module;
2474 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002475} known_capsule;
2476
2477static PyObject *
2478test_capsule(PyObject *self, PyObject *args)
2479{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 PyObject *object;
2481 const char *error = NULL;
2482 void *pointer;
2483 void *pointer2;
2484 known_capsule known_capsules[] = {
2485 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2486 KNOWN_CAPSULE("_socket", "CAPI"),
2487 KNOWN_CAPSULE("_curses", "_C_API"),
2488 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2489 { NULL, NULL },
2490 };
2491 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002492
2493#define FAIL(x) { error = (x); goto exit; }
2494
2495#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 if (capsule_error) { \
2497 FAIL(capsule_error); \
2498 } \
2499 else if (!capsule_destructor_call_count) { \
2500 FAIL("destructor not called!"); \
2501 } \
2502 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2505 PyCapsule_SetContext(object, capsule_context);
2506 capsule_destructor(object);
2507 CHECK_DESTRUCTOR;
2508 Py_DECREF(object);
2509 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 object = PyCapsule_New(known, "ignored", NULL);
2512 PyCapsule_SetPointer(object, capsule_pointer);
2513 PyCapsule_SetName(object, capsule_name);
2514 PyCapsule_SetDestructor(object, capsule_destructor);
2515 PyCapsule_SetContext(object, capsule_context);
2516 capsule_destructor(object);
2517 CHECK_DESTRUCTOR;
2518 /* intentionally access using the wrong name */
2519 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2520 if (!PyErr_Occurred()) {
2521 FAIL("PyCapsule_GetPointer should have failed but did not!");
2522 }
2523 PyErr_Clear();
2524 if (pointer2) {
2525 if (pointer2 == capsule_pointer) {
2526 FAIL("PyCapsule_GetPointer should not have"
2527 " returned the internal pointer!");
2528 } else {
2529 FAIL("PyCapsule_GetPointer should have "
2530 "returned NULL pointer but did not!");
2531 }
2532 }
2533 PyCapsule_SetDestructor(object, NULL);
2534 Py_DECREF(object);
2535 if (capsule_destructor_call_count) {
2536 FAIL("destructor called when it should not have been!");
2537 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 for (known = &known_capsules[0]; known->module != NULL; known++) {
2540 /* yeah, ordinarily I wouldn't do this either,
2541 but it's fine for this test harness.
2542 */
2543 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002544#undef FAIL
2545#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 { \
2547 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2548 x, known->module, known->attribute); \
2549 error = buffer; \
2550 goto exit; \
2551 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 PyObject *module = PyImport_ImportModule(known->module);
2554 if (module) {
2555 pointer = PyCapsule_Import(known->name, 0);
2556 if (!pointer) {
2557 Py_DECREF(module);
2558 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2559 }
2560 object = PyObject_GetAttrString(module, known->attribute);
2561 if (!object) {
2562 Py_DECREF(module);
2563 return NULL;
2564 }
2565 pointer2 = PyCapsule_GetPointer(object,
2566 "weebles wobble but they don't fall down");
2567 if (!PyErr_Occurred()) {
2568 Py_DECREF(object);
2569 Py_DECREF(module);
2570 FAIL("PyCapsule_GetPointer should have failed but did not!");
2571 }
2572 PyErr_Clear();
2573 if (pointer2) {
2574 Py_DECREF(module);
2575 Py_DECREF(object);
2576 if (pointer2 == pointer) {
2577 FAIL("PyCapsule_GetPointer should not have"
2578 " returned its internal pointer!");
2579 } else {
2580 FAIL("PyCapsule_GetPointer should have"
2581 " returned NULL pointer but did not!");
2582 }
2583 }
2584 Py_DECREF(object);
2585 Py_DECREF(module);
2586 }
2587 else
2588 PyErr_Clear();
2589 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002590
2591 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 if (error) {
2593 return raiseTestError("test_capsule", error);
2594 }
2595 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002596#undef FAIL
2597}
2598
Guido van Rossumddefaf32007-01-14 03:31:43 +00002599#ifdef HAVE_GETTIMEOFDAY
2600/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002601static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002602{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 e->tv_sec -= s->tv_sec;
2604 e->tv_usec -= s->tv_usec;
2605 if (e->tv_usec < 0) {
2606 e->tv_sec -=1;
2607 e->tv_usec += 1000000;
2608 }
2609 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002610}
2611
2612static PyObject *
2613profile_int(PyObject *self, PyObject* args)
2614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 int i, k;
2616 struct timeval start, stop;
2617 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 /* Test 1: Allocate and immediately deallocate
2620 many small integers */
2621 gettimeofday(&start, NULL);
2622 for(k=0; k < 20000; k++)
2623 for(i=0; i < 1000; i++) {
2624 single = PyLong_FromLong(i);
2625 Py_DECREF(single);
2626 }
2627 gettimeofday(&stop, NULL);
2628 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 /* Test 2: Allocate and immediately deallocate
2631 many large integers */
2632 gettimeofday(&start, NULL);
2633 for(k=0; k < 20000; k++)
2634 for(i=0; i < 1000; i++) {
2635 single = PyLong_FromLong(i+1000000);
2636 Py_DECREF(single);
2637 }
2638 gettimeofday(&stop, NULL);
2639 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002641 /* Test 3: Allocate a few integers, then release
2642 them all simultaneously. */
2643 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002644 if (multiple == NULL)
2645 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002646 gettimeofday(&start, NULL);
2647 for(k=0; k < 20000; k++) {
2648 for(i=0; i < 1000; i++) {
2649 multiple[i] = PyLong_FromLong(i+1000000);
2650 }
2651 for(i=0; i < 1000; i++) {
2652 Py_DECREF(multiple[i]);
2653 }
2654 }
2655 gettimeofday(&stop, NULL);
2656 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002657 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 /* Test 4: Allocate many integers, then release
2660 them all simultaneously. */
2661 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002662 if (multiple == NULL)
2663 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 gettimeofday(&start, NULL);
2665 for(k=0; k < 20; k++) {
2666 for(i=0; i < 1000000; i++) {
2667 multiple[i] = PyLong_FromLong(i+1000000);
2668 }
2669 for(i=0; i < 1000000; i++) {
2670 Py_DECREF(multiple[i]);
2671 }
2672 }
2673 gettimeofday(&stop, NULL);
2674 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002675 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 /* Test 5: Allocate many integers < 32000 */
2678 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002679 if (multiple == NULL)
2680 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 gettimeofday(&start, NULL);
2682 for(k=0; k < 10; k++) {
2683 for(i=0; i < 1000000; i++) {
2684 multiple[i] = PyLong_FromLong(i+1000);
2685 }
2686 for(i=0; i < 1000000; i++) {
2687 Py_DECREF(multiple[i]);
2688 }
2689 }
2690 gettimeofday(&stop, NULL);
2691 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002692 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 /* Test 6: Perform small int addition */
2695 op1 = PyLong_FromLong(1);
2696 gettimeofday(&start, NULL);
2697 for(i=0; i < 10000000; i++) {
2698 result = PyNumber_Add(op1, op1);
2699 Py_DECREF(result);
2700 }
2701 gettimeofday(&stop, NULL);
2702 Py_DECREF(op1);
2703 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 /* Test 7: Perform medium int addition */
2706 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002707 if (op1 == NULL)
2708 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 gettimeofday(&start, NULL);
2710 for(i=0; i < 10000000; i++) {
2711 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002712 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 }
2714 gettimeofday(&stop, NULL);
2715 Py_DECREF(op1);
2716 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002717
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002718 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002719}
2720#endif
2721
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002722/* To test the format of tracebacks as printed out. */
2723static PyObject *
2724traceback_print(PyObject *self, PyObject *args)
2725{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 PyObject *file;
2727 PyObject *traceback;
2728 int result;
2729
2730 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2731 &traceback, &file))
2732 return NULL;
2733
2734 result = PyTraceBack_Print(traceback, file);
2735 if (result < 0)
2736 return NULL;
2737 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002738}
2739
Benjamin Petersone6528212008-07-15 15:32:09 +00002740/* To test the format of exceptions as printed out. */
2741static PyObject *
2742exception_print(PyObject *self, PyObject *args)
2743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 PyObject *value;
2745 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 if (!PyArg_ParseTuple(args, "O:exception_print",
2748 &value))
2749 return NULL;
2750 if (!PyExceptionInstance_Check(value)) {
2751 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2752 return NULL;
2753 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 tb = PyException_GetTraceback(value);
2756 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2757 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002760}
2761
2762
2763
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002764
2765/* reliably raise a MemoryError */
2766static PyObject *
2767raise_memoryerror(PyObject *self)
2768{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 PyErr_NoMemory();
2770 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002771}
2772
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002773/* Issue 6012 */
2774static PyObject *str1, *str2;
2775static int
2776failing_converter(PyObject *obj, void *arg)
2777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778 /* Clone str1, then let the conversion fail. */
2779 assert(str1);
2780 str2 = str1;
2781 Py_INCREF(str2);
2782 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002783}
2784static PyObject*
2785argparsing(PyObject *o, PyObject *args)
2786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 PyObject *res;
2788 str1 = str2 = NULL;
2789 if (!PyArg_ParseTuple(args, "O&O&",
2790 PyUnicode_FSConverter, &str1,
2791 failing_converter, &str2)) {
2792 if (!str2)
2793 /* argument converter not called? */
2794 return NULL;
2795 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002796 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002797 Py_DECREF(str2);
2798 PyErr_Clear();
2799 return res;
2800 }
2801 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002802}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002803
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002804/* To test that the result of PyCode_NewEmpty has the right members. */
2805static PyObject *
2806code_newempty(PyObject *self, PyObject *args)
2807{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002808 const char *filename;
2809 const char *funcname;
2810 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2813 &filename, &funcname, &firstlineno))
2814 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002817}
2818
Georg Brandl1e28a272009-12-28 08:41:01 +00002819/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2820 Run via Lib/test/test_exceptions.py */
2821static PyObject *
2822make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2823{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 const char *name;
2825 const char *doc = NULL;
2826 PyObject *base = NULL;
2827 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2832 "s|sOO:make_exception_with_doc", kwlist,
2833 &name, &doc, &base, &dict))
2834 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002837}
2838
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002839static PyObject *
2840make_memoryview_from_NULL_pointer(PyObject *self)
2841{
2842 Py_buffer info;
2843 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2844 return NULL;
2845 return PyMemoryView_FromBuffer(&info);
2846}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002847
Stefan Krah7213fcc2015-02-01 16:19:23 +01002848static PyObject *
2849test_from_contiguous(PyObject* self, PyObject *noargs)
2850{
2851 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2852 int init[5] = {0, 1, 2, 3, 4};
2853 Py_ssize_t itemsize = sizeof(int);
2854 Py_ssize_t shape = 5;
2855 Py_ssize_t strides = 2 * itemsize;
2856 Py_buffer view = {
2857 data,
2858 NULL,
2859 5 * itemsize,
2860 itemsize,
2861 1,
2862 1,
2863 NULL,
2864 &shape,
2865 &strides,
2866 NULL,
2867 NULL
2868 };
2869 int *ptr;
2870 int i;
2871
2872 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2873 ptr = view.buf;
2874 for (i = 0; i < 5; i++) {
2875 if (ptr[2*i] != i) {
2876 PyErr_SetString(TestError,
2877 "test_from_contiguous: incorrect result");
2878 return NULL;
2879 }
2880 }
2881
2882 view.buf = &data[8];
2883 view.strides[0] = -2 * itemsize;
2884
2885 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2886 ptr = view.buf;
2887 for (i = 0; i < 5; i++) {
2888 if (*(ptr-2*i) != i) {
2889 PyErr_SetString(TestError,
2890 "test_from_contiguous: incorrect result");
2891 return NULL;
2892 }
2893 }
2894
2895 Py_RETURN_NONE;
2896}
Stefan Krah650c1e82015-02-03 21:43:23 +01002897
Stefan Kraha7559c02015-02-03 22:27:21 +01002898#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01002899extern PyTypeObject _PyBytesIOBuffer_Type;
2900
Stefan Krah5178d912015-02-03 16:57:21 +01002901static PyObject *
2902test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
2903{
Stefan Krah650c1e82015-02-03 21:43:23 +01002904 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01002905 PyObject *b;
2906 char *dummy[1];
2907 int ret, match;
2908
Stefan Krah650c1e82015-02-03 21:43:23 +01002909 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01002910 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
2911 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2912 PyErr_Clear();
2913 if (ret != -1 || match == 0)
2914 goto error;
2915
Stefan Krah650c1e82015-02-03 21:43:23 +01002916 /* bytesiobuf_getbuffer() */
2917 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01002918 if (b == NULL) {
2919 return NULL;
2920 }
2921
2922 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
2923 Py_DECREF(b);
2924 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2925 PyErr_Clear();
2926 if (ret != -1 || match == 0)
2927 goto error;
2928
2929 Py_RETURN_NONE;
2930
2931error:
2932 PyErr_SetString(TestError,
2933 "test_pep3118_obsolete_write_locks: failure");
2934 return NULL;
2935}
Stefan Kraha7559c02015-02-03 22:27:21 +01002936#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002937
Stefan Krah650c1e82015-02-03 21:43:23 +01002938/* This tests functions that historically supported write locks. It is
2939 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
2940 is entitled to segfault in that case. */
2941static PyObject *
2942getbuffer_with_null_view(PyObject* self, PyObject *obj)
2943{
2944 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
2945 return NULL;
2946
2947 Py_RETURN_NONE;
2948}
2949
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002950/* Test that the fatal error from not having a current thread doesn't
2951 cause an infinite loop. Run via Lib/test/test_capi.py */
2952static PyObject *
2953crash_no_current_thread(PyObject *self)
2954{
2955 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002956 /* Using PyThreadState_Get() directly allows the test to pass in
2957 !pydebug mode. However, the test only actually tests anything
2958 in pydebug mode, since that's where the infinite loop was in
2959 the first place. */
2960 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002961 Py_END_ALLOW_THREADS
2962 return NULL;
2963}
2964
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002965/* To run some code in a sub-interpreter. */
2966static PyObject *
2967run_in_subinterp(PyObject *self, PyObject *args)
2968{
2969 const char *code;
2970 int r;
2971 PyThreadState *substate, *mainstate;
2972
2973 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2974 &code))
2975 return NULL;
2976
2977 mainstate = PyThreadState_Get();
2978
2979 PyThreadState_Swap(NULL);
2980
2981 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002982 if (substate == NULL) {
2983 /* Since no new thread state was created, there is no exception to
2984 propagate; raise a fresh one after swapping in the old thread
2985 state. */
2986 PyThreadState_Swap(mainstate);
2987 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2988 return NULL;
2989 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002990 r = PyRun_SimpleString(code);
2991 Py_EndInterpreter(substate);
2992
2993 PyThreadState_Swap(mainstate);
2994
2995 return PyLong_FromLong(r);
2996}
2997
Victor Stinner3c1b3792014-02-17 00:02:43 +01002998static int
2999check_time_rounding(int round)
3000{
Victor Stinner74474232015-09-02 01:43:56 +02003001 if (round != _PyTime_ROUND_FLOOR
3002 && round != _PyTime_ROUND_CEILING
Victor Stinner7667f582015-09-09 01:02:23 +02003003 && round != _PyTime_ROUND_HALF_EVEN) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003004 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3005 return -1;
3006 }
3007 return 0;
3008}
3009
Victor Stinner5d272cc2012-03-13 13:35:55 +01003010static PyObject *
3011test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3012{
3013 PyObject *obj;
3014 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003015 int round;
3016 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003017 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003018 if (check_time_rounding(round) < 0)
3019 return NULL;
3020 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003021 return NULL;
3022 return _PyLong_FromTime_t(sec);
3023}
3024
3025static PyObject *
3026test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3027{
3028 PyObject *obj;
3029 time_t sec;
3030 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003031 int round;
3032 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003033 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003034 if (check_time_rounding(round) < 0)
3035 return NULL;
3036 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003037 return NULL;
3038 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3039}
3040
Victor Stinner643cd682012-03-02 22:54:03 +01003041static PyObject *
3042test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3043{
3044 PyObject *obj;
3045 time_t sec;
3046 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003047 int round;
3048 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003049 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003050 if (check_time_rounding(round) < 0)
3051 return NULL;
3052 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003053 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003054 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003055}
3056
Antoine Pitrou796564c2013-07-30 19:59:21 +02003057static void
3058slot_tp_del(PyObject *self)
3059{
3060 _Py_IDENTIFIER(__tp_del__);
3061 PyObject *del, *res;
3062 PyObject *error_type, *error_value, *error_traceback;
3063
3064 /* Temporarily resurrect the object. */
3065 assert(self->ob_refcnt == 0);
3066 self->ob_refcnt = 1;
3067
3068 /* Save the current exception, if any. */
3069 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3070
3071 /* Execute __del__ method, if any. */
3072 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3073 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003074 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003075 if (res == NULL)
3076 PyErr_WriteUnraisable(del);
3077 else
3078 Py_DECREF(res);
3079 Py_DECREF(del);
3080 }
3081
3082 /* Restore the saved exception. */
3083 PyErr_Restore(error_type, error_value, error_traceback);
3084
3085 /* Undo the temporary resurrection; can't use DECREF here, it would
3086 * cause a recursive call.
3087 */
3088 assert(self->ob_refcnt > 0);
3089 if (--self->ob_refcnt == 0)
3090 return; /* this is the normal path out */
3091
3092 /* __del__ resurrected it! Make it look like the original Py_DECREF
3093 * never happened.
3094 */
3095 {
3096 Py_ssize_t refcnt = self->ob_refcnt;
3097 _Py_NewReference(self);
3098 self->ob_refcnt = refcnt;
3099 }
3100 assert(!PyType_IS_GC(Py_TYPE(self)) ||
3101 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
3102 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3103 * we need to undo that. */
3104 _Py_DEC_REFTOTAL;
3105 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3106 * chain, so no more to do there.
3107 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3108 * _Py_NewReference bumped tp_allocs: both of those need to be
3109 * undone.
3110 */
3111#ifdef COUNT_ALLOCS
3112 --Py_TYPE(self)->tp_frees;
3113 --Py_TYPE(self)->tp_allocs;
3114#endif
3115}
3116
3117static PyObject *
3118with_tp_del(PyObject *self, PyObject *args)
3119{
3120 PyObject *obj;
3121 PyTypeObject *tp;
3122
3123 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3124 return NULL;
3125 tp = (PyTypeObject *) obj;
3126 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3127 PyErr_Format(PyExc_TypeError,
3128 "heap type expected, got %R", obj);
3129 return NULL;
3130 }
3131 tp->tp_del = slot_tp_del;
3132 Py_INCREF(obj);
3133 return obj;
3134}
3135
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003136static PyMethodDef ml;
3137
3138static PyObject *
3139create_cfunction(PyObject *self, PyObject *args)
3140{
3141 return PyCFunction_NewEx(&ml, self, NULL);
3142}
3143
3144static PyMethodDef ml = {
3145 "create_cfunction",
3146 create_cfunction,
3147 METH_NOARGS,
3148 NULL
3149};
3150
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003151static PyObject *
3152_test_incref(PyObject *ob)
3153{
3154 Py_INCREF(ob);
3155 return ob;
3156}
3157
3158static PyObject *
3159test_xincref_doesnt_leak(PyObject *ob)
3160{
3161 PyObject *obj = PyLong_FromLong(0);
3162 Py_XINCREF(_test_incref(obj));
3163 Py_DECREF(obj);
3164 Py_DECREF(obj);
3165 Py_DECREF(obj);
3166 Py_RETURN_NONE;
3167}
3168
3169static PyObject *
3170test_incref_doesnt_leak(PyObject *ob)
3171{
3172 PyObject *obj = PyLong_FromLong(0);
3173 Py_INCREF(_test_incref(obj));
3174 Py_DECREF(obj);
3175 Py_DECREF(obj);
3176 Py_DECREF(obj);
3177 Py_RETURN_NONE;
3178}
3179
3180static PyObject *
3181test_xdecref_doesnt_leak(PyObject *ob)
3182{
3183 Py_XDECREF(PyLong_FromLong(0));
3184 Py_RETURN_NONE;
3185}
3186
3187static PyObject *
3188test_decref_doesnt_leak(PyObject *ob)
3189{
3190 Py_DECREF(PyLong_FromLong(0));
3191 Py_RETURN_NONE;
3192}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003193
Victor Stinner0507bf52013-07-07 02:05:46 +02003194static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02003195test_incref_decref_API(PyObject *ob)
3196{
3197 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003198 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003199 Py_DecRef(obj);
3200 Py_DecRef(obj);
3201 Py_RETURN_NONE;
3202}
3203
3204static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02003205test_pymem_alloc0(PyObject *self)
3206{
3207 void *ptr;
3208
Victor Stinnerdb067af2014-05-02 22:31:14 +02003209 ptr = PyMem_RawMalloc(0);
3210 if (ptr == NULL) {
3211 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3212 return NULL;
3213 }
3214 PyMem_RawFree(ptr);
3215
3216 ptr = PyMem_RawCalloc(0, 0);
3217 if (ptr == NULL) {
3218 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3219 return NULL;
3220 }
3221 PyMem_RawFree(ptr);
3222
Victor Stinner0507bf52013-07-07 02:05:46 +02003223 ptr = PyMem_Malloc(0);
3224 if (ptr == NULL) {
3225 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3226 return NULL;
3227 }
3228 PyMem_Free(ptr);
3229
Victor Stinnerdb067af2014-05-02 22:31:14 +02003230 ptr = PyMem_Calloc(0, 0);
3231 if (ptr == NULL) {
3232 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3233 return NULL;
3234 }
3235 PyMem_Free(ptr);
3236
Victor Stinner0507bf52013-07-07 02:05:46 +02003237 ptr = PyObject_Malloc(0);
3238 if (ptr == NULL) {
3239 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3240 return NULL;
3241 }
3242 PyObject_Free(ptr);
3243
Victor Stinnerdb067af2014-05-02 22:31:14 +02003244 ptr = PyObject_Calloc(0, 0);
3245 if (ptr == NULL) {
3246 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3247 return NULL;
3248 }
3249 PyObject_Free(ptr);
3250
Victor Stinner0507bf52013-07-07 02:05:46 +02003251 Py_RETURN_NONE;
3252}
3253
3254typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003255 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003256
3257 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003258 size_t calloc_nelem;
3259 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003260 void *realloc_ptr;
3261 size_t realloc_new_size;
3262 void *free_ptr;
3263} alloc_hook_t;
3264
3265static void* hook_malloc (void* ctx, size_t size)
3266{
3267 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3268 hook->malloc_size = size;
3269 return hook->alloc.malloc(hook->alloc.ctx, size);
3270}
3271
Victor Stinnerdb067af2014-05-02 22:31:14 +02003272static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
3273{
3274 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3275 hook->calloc_nelem = nelem;
3276 hook->calloc_elsize = elsize;
3277 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3278}
3279
Victor Stinner0507bf52013-07-07 02:05:46 +02003280static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
3281{
3282 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3283 hook->realloc_ptr = ptr;
3284 hook->realloc_new_size = new_size;
3285 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3286}
3287
3288static void hook_free (void *ctx, void *ptr)
3289{
3290 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3291 hook->free_ptr = ptr;
3292 hook->alloc.free(hook->alloc.ctx, ptr);
3293}
3294
3295static PyObject *
3296test_setallocators(PyMemAllocatorDomain domain)
3297{
3298 PyObject *res = NULL;
3299 const char *error_msg;
3300 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003301 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003302 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003303 void *ptr, *ptr2;
3304
Victor Stinnerdb067af2014-05-02 22:31:14 +02003305 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003306
3307 alloc.ctx = &hook;
3308 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003309 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003310 alloc.realloc = &hook_realloc;
3311 alloc.free = &hook_free;
3312 PyMem_GetAllocator(domain, &hook.alloc);
3313 PyMem_SetAllocator(domain, &alloc);
3314
3315 size = 42;
3316 switch(domain)
3317 {
3318 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3319 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3320 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3321 default: ptr = NULL; break;
3322 }
3323
3324 if (ptr == NULL) {
3325 error_msg = "malloc failed";
3326 goto fail;
3327 }
3328
3329 if (hook.malloc_size != size) {
3330 error_msg = "malloc invalid size";
3331 goto fail;
3332 }
3333
3334 size2 = 200;
3335 switch(domain)
3336 {
3337 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3338 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3339 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003340 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003341 }
3342
3343 if (ptr2 == NULL) {
3344 error_msg = "realloc failed";
3345 goto fail;
3346 }
3347
3348 if (hook.realloc_ptr != ptr
3349 || hook.realloc_new_size != size2) {
3350 error_msg = "realloc invalid parameters";
3351 goto fail;
3352 }
3353
3354 switch(domain)
3355 {
3356 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3357 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3358 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3359 }
3360
3361 if (hook.free_ptr != ptr2) {
3362 error_msg = "free invalid pointer";
3363 goto fail;
3364 }
3365
Victor Stinnerdb067af2014-05-02 22:31:14 +02003366 nelem = 2;
3367 elsize = 5;
3368 switch(domain)
3369 {
3370 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3371 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3372 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3373 default: ptr = NULL; break;
3374 }
3375
3376 if (ptr == NULL) {
3377 error_msg = "calloc failed";
3378 goto fail;
3379 }
3380
3381 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3382 error_msg = "calloc invalid nelem or elsize";
3383 goto fail;
3384 }
3385
3386 switch(domain)
3387 {
3388 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3389 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3390 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3391 }
3392
Victor Stinner0507bf52013-07-07 02:05:46 +02003393 Py_INCREF(Py_None);
3394 res = Py_None;
3395 goto finally;
3396
3397fail:
3398 PyErr_SetString(PyExc_RuntimeError, error_msg);
3399
3400finally:
3401 PyMem_SetAllocator(domain, &hook.alloc);
3402 return res;
3403}
3404
3405static PyObject *
3406test_pymem_setrawallocators(PyObject *self)
3407{
3408 return test_setallocators(PYMEM_DOMAIN_RAW);
3409}
3410
3411static PyObject *
3412test_pymem_setallocators(PyObject *self)
3413{
3414 return test_setallocators(PYMEM_DOMAIN_MEM);
3415}
3416
3417static PyObject *
3418test_pyobject_setallocators(PyObject *self)
3419{
3420 return test_setallocators(PYMEM_DOMAIN_OBJ);
3421}
3422
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003423PyDoc_STRVAR(docstring_empty,
3424""
3425);
3426
3427PyDoc_STRVAR(docstring_no_signature,
3428"This docstring has no signature."
3429);
3430
3431PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003432"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003433"\n"
3434"This docstring has an invalid signature."
3435);
3436
Larry Hastings2623c8c2014-02-08 22:15:29 -08003437PyDoc_STRVAR(docstring_with_invalid_signature2,
3438"docstring_with_invalid_signature2($module, /, boo)\n"
3439"\n"
3440"--\n"
3441"\n"
3442"This docstring also has an invalid signature."
3443);
3444
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003445PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003446"docstring_with_signature($module, /, sig)\n"
3447"--\n"
3448"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003449"This docstring has a valid signature."
3450);
3451
Zachary Ware8ef887c2015-04-13 18:22:35 -05003452PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3453"docstring_with_signature_but_no_doc($module, /, sig)\n"
3454"--\n"
3455"\n"
3456);
3457
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003458PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003459"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3460"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003461"\n"
3462"\n"
3463"This docstring has a valid signature and some extra newlines."
3464);
3465
Larry Hastings16c51912014-01-07 11:53:01 -08003466PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003467"docstring_with_signature_with_defaults(module, s='avocado',\n"
3468" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3469" local=the_number_three, sys=sys.maxsize,\n"
3470" exp=sys.maxsize - 1)\n"
3471"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003472"\n"
3473"\n"
3474"\n"
3475"This docstring has a valid signature with parameters,\n"
3476"and the parameters take defaults of varying types."
3477);
3478
Victor Stinner258e4d32013-12-13 02:30:12 +01003479#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003480typedef struct {
3481 PyThread_type_lock start_event;
3482 PyThread_type_lock exit_event;
3483 PyObject *callback;
3484} test_c_thread_t;
3485
3486static void
3487temporary_c_thread(void *data)
3488{
3489 test_c_thread_t *test_c_thread = data;
3490 PyGILState_STATE state;
3491 PyObject *res;
3492
3493 PyThread_release_lock(test_c_thread->start_event);
3494
3495 /* Allocate a Python thread state for this thread */
3496 state = PyGILState_Ensure();
3497
Victor Stinner3466bde2016-09-05 18:16:01 -07003498 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003499 Py_CLEAR(test_c_thread->callback);
3500
3501 if (res == NULL) {
3502 PyErr_Print();
3503 }
3504 else {
3505 Py_DECREF(res);
3506 }
3507
3508 /* Destroy the Python thread state for this thread */
3509 PyGILState_Release(state);
3510
3511 PyThread_release_lock(test_c_thread->exit_event);
3512
3513 PyThread_exit_thread();
3514}
3515
3516static PyObject *
3517call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3518{
3519 PyObject *res = NULL;
3520 test_c_thread_t test_c_thread;
3521 long thread;
3522
3523 PyEval_InitThreads();
3524
3525 test_c_thread.start_event = PyThread_allocate_lock();
3526 test_c_thread.exit_event = PyThread_allocate_lock();
3527 test_c_thread.callback = NULL;
3528 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3529 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3530 goto exit;
3531 }
3532
3533 Py_INCREF(callback);
3534 test_c_thread.callback = callback;
3535
3536 PyThread_acquire_lock(test_c_thread.start_event, 1);
3537 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3538
3539 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3540 if (thread == -1) {
3541 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3542 PyThread_release_lock(test_c_thread.start_event);
3543 PyThread_release_lock(test_c_thread.exit_event);
3544 goto exit;
3545 }
3546
3547 PyThread_acquire_lock(test_c_thread.start_event, 1);
3548 PyThread_release_lock(test_c_thread.start_event);
3549
3550 Py_BEGIN_ALLOW_THREADS
3551 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3552 PyThread_release_lock(test_c_thread.exit_event);
3553 Py_END_ALLOW_THREADS
3554
3555 Py_INCREF(Py_None);
3556 res = Py_None;
3557
3558exit:
3559 Py_CLEAR(test_c_thread.callback);
3560 if (test_c_thread.start_event)
3561 PyThread_free_lock(test_c_thread.start_event);
3562 if (test_c_thread.exit_event)
3563 PyThread_free_lock(test_c_thread.exit_event);
3564 return res;
3565}
Victor Stinner258e4d32013-12-13 02:30:12 +01003566#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003567
Victor Stinner56e8c292014-07-21 12:30:22 +02003568static PyObject*
3569test_raise_signal(PyObject* self, PyObject *args)
3570{
3571 int signum, err;
3572
3573 if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0)
3574 return NULL;
3575
3576 err = raise(signum);
3577 if (err)
3578 return PyErr_SetFromErrno(PyExc_OSError);
3579
3580 if (PyErr_CheckSignals() < 0)
3581 return NULL;
3582
3583 Py_RETURN_NONE;
3584}
3585
Serhiy Storchakab5181342015-02-06 08:58:56 +02003586/* marshal */
3587
3588static PyObject*
3589pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3590{
3591 long value;
3592 char *filename;
3593 int version;
3594 FILE *fp;
3595
3596 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3597 &value, &filename, &version))
3598 return NULL;
3599
3600 fp = fopen(filename, "wb");
3601 if (fp == NULL) {
3602 PyErr_SetFromErrno(PyExc_OSError);
3603 return NULL;
3604 }
3605
3606 PyMarshal_WriteLongToFile(value, fp, version);
3607
3608 fclose(fp);
3609 if (PyErr_Occurred())
3610 return NULL;
3611 Py_RETURN_NONE;
3612}
3613
3614static PyObject*
3615pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3616{
3617 PyObject *obj;
3618 char *filename;
3619 int version;
3620 FILE *fp;
3621
3622 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3623 &obj, &filename, &version))
3624 return NULL;
3625
3626 fp = fopen(filename, "wb");
3627 if (fp == NULL) {
3628 PyErr_SetFromErrno(PyExc_OSError);
3629 return NULL;
3630 }
3631
3632 PyMarshal_WriteObjectToFile(obj, fp, version);
3633
3634 fclose(fp);
3635 if (PyErr_Occurred())
3636 return NULL;
3637 Py_RETURN_NONE;
3638}
3639
3640static PyObject*
3641pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3642{
3643 int value;
3644 long pos;
3645 char *filename;
3646 FILE *fp;
3647
3648 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3649 return NULL;
3650
3651 fp = fopen(filename, "rb");
3652 if (fp == NULL) {
3653 PyErr_SetFromErrno(PyExc_OSError);
3654 return NULL;
3655 }
3656
3657 value = PyMarshal_ReadShortFromFile(fp);
3658 pos = ftell(fp);
3659
3660 fclose(fp);
3661 if (PyErr_Occurred())
3662 return NULL;
3663 return Py_BuildValue("il", value, pos);
3664}
3665
3666static PyObject*
3667pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3668{
3669 long value, pos;
3670 char *filename;
3671 FILE *fp;
3672
3673 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3674 return NULL;
3675
3676 fp = fopen(filename, "rb");
3677 if (fp == NULL) {
3678 PyErr_SetFromErrno(PyExc_OSError);
3679 return NULL;
3680 }
3681
3682 value = PyMarshal_ReadLongFromFile(fp);
3683 pos = ftell(fp);
3684
3685 fclose(fp);
3686 if (PyErr_Occurred())
3687 return NULL;
3688 return Py_BuildValue("ll", value, pos);
3689}
3690
3691static PyObject*
3692pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3693{
3694 PyObject *obj;
3695 long pos;
3696 char *filename;
3697 FILE *fp;
3698
3699 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3700 return NULL;
3701
3702 fp = fopen(filename, "rb");
3703 if (fp == NULL) {
3704 PyErr_SetFromErrno(PyExc_OSError);
3705 return NULL;
3706 }
3707
3708 obj = PyMarshal_ReadLastObjectFromFile(fp);
3709 pos = ftell(fp);
3710
3711 fclose(fp);
3712 return Py_BuildValue("Nl", obj, pos);
3713}
3714
3715static PyObject*
3716pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3717{
3718 PyObject *obj;
3719 long pos;
3720 char *filename;
3721 FILE *fp;
3722
3723 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3724 return NULL;
3725
3726 fp = fopen(filename, "rb");
3727 if (fp == NULL) {
3728 PyErr_SetFromErrno(PyExc_OSError);
3729 return NULL;
3730 }
3731
3732 obj = PyMarshal_ReadObjectFromFile(fp);
3733 pos = ftell(fp);
3734
3735 fclose(fp);
3736 return Py_BuildValue("Nl", obj, pos);
3737}
3738
Victor Stinnerefde1462015-03-21 15:04:43 +01003739static PyObject*
3740return_null_without_error(PyObject *self, PyObject *args)
3741{
3742 /* invalid call: return NULL without setting an error,
3743 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3744 PyErr_Clear();
3745 return NULL;
3746}
3747
3748static PyObject*
3749return_result_with_error(PyObject *self, PyObject *args)
3750{
3751 /* invalid call: return a result with an error set,
3752 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3753 PyErr_SetNone(PyExc_ValueError);
3754 Py_RETURN_NONE;
3755}
3756
Victor Stinner992c43f2015-03-27 17:12:45 +01003757static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02003758test_pytime_fromseconds(PyObject *self, PyObject *args)
3759{
3760 int seconds;
3761 _PyTime_t ts;
3762
3763 if (!PyArg_ParseTuple(args, "i", &seconds))
3764 return NULL;
3765 ts = _PyTime_FromSeconds(seconds);
3766 return _PyTime_AsNanosecondsObject(ts);
3767}
3768
3769static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01003770test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
3771{
3772 PyObject *obj;
3773 int round;
3774 _PyTime_t ts;
3775
3776 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
3777 return NULL;
3778 if (check_time_rounding(round) < 0)
3779 return NULL;
3780 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
3781 return NULL;
3782 return _PyTime_AsNanosecondsObject(ts);
3783}
3784
Victor Stinner4bfb4602015-03-27 22:27:24 +01003785static PyObject *
3786test_pytime_assecondsdouble(PyObject *self, PyObject *args)
3787{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003788 long long ns;
Victor Stinner4bfb4602015-03-27 22:27:24 +01003789 _PyTime_t ts;
3790 double d;
3791
3792 if (!PyArg_ParseTuple(args, "L", &ns))
3793 return NULL;
3794 ts = _PyTime_FromNanoseconds(ns);
3795 d = _PyTime_AsSecondsDouble(ts);
3796 return PyFloat_FromDouble(d);
3797}
3798
Victor Stinner95e9cef2015-03-28 01:26:47 +01003799static PyObject *
3800test_PyTime_AsTimeval(PyObject *self, PyObject *args)
3801{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003802 long long ns;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003803 int round;
3804 _PyTime_t t;
3805 struct timeval tv;
3806 PyObject *seconds;
3807
3808 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3809 return NULL;
3810 if (check_time_rounding(round) < 0)
3811 return NULL;
3812 t = _PyTime_FromNanoseconds(ns);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +02003813 if (_PyTime_AsTimeval(t, &tv, round) < 0)
Victor Stinner95e9cef2015-03-28 01:26:47 +01003814 return NULL;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003815
Benjamin Peterson2c134c32017-04-13 01:44:54 -07003816 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinner95e9cef2015-03-28 01:26:47 +01003817 if (seconds == NULL)
3818 return NULL;
3819 return Py_BuildValue("Nl", seconds, tv.tv_usec);
3820}
3821
Victor Stinner34dc0f42015-03-27 18:19:03 +01003822#ifdef HAVE_CLOCK_GETTIME
3823static PyObject *
3824test_PyTime_AsTimespec(PyObject *self, PyObject *args)
3825{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003826 long long ns;
Victor Stinner34dc0f42015-03-27 18:19:03 +01003827 _PyTime_t t;
3828 struct timespec ts;
3829
3830 if (!PyArg_ParseTuple(args, "L", &ns))
3831 return NULL;
3832 t = _PyTime_FromNanoseconds(ns);
3833 if (_PyTime_AsTimespec(t, &ts) == -1)
3834 return NULL;
3835 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
3836}
3837#endif
3838
Victor Stinner62d1c702015-04-01 17:47:07 +02003839static PyObject *
3840test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
3841{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003842 long long ns;
Victor Stinner62d1c702015-04-01 17:47:07 +02003843 int round;
3844 _PyTime_t t, ms;
3845
3846 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3847 return NULL;
3848 if (check_time_rounding(round) < 0)
3849 return NULL;
3850 t = _PyTime_FromNanoseconds(ns);
3851 ms = _PyTime_AsMilliseconds(t, round);
3852 /* This conversion rely on the fact that _PyTime_t is a number of
3853 nanoseconds */
3854 return _PyTime_AsNanosecondsObject(ms);
3855}
3856
3857static PyObject *
3858test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
3859{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003860 long long ns;
Victor Stinner62d1c702015-04-01 17:47:07 +02003861 int round;
3862 _PyTime_t t, ms;
3863
3864 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3865 return NULL;
3866 if (check_time_rounding(round) < 0)
3867 return NULL;
3868 t = _PyTime_FromNanoseconds(ns);
3869 ms = _PyTime_AsMicroseconds(t, round);
3870 /* This conversion rely on the fact that _PyTime_t is a number of
3871 nanoseconds */
3872 return _PyTime_AsNanosecondsObject(ms);
3873}
3874
Victor Stinner50856d52015-10-13 00:11:21 +02003875static PyObject*
3876get_recursion_depth(PyObject *self, PyObject *args)
3877{
3878 PyThreadState *tstate = PyThreadState_GET();
3879
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07003880 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02003881 return PyLong_FromLong(tstate->recursion_depth - 1);
3882}
3883
Victor Stinner34be8072016-03-14 12:04:26 +01003884static PyObject*
3885pymem_buffer_overflow(PyObject *self, PyObject *args)
3886{
3887 char *buffer;
3888
3889 /* Deliberate buffer overflow to check that PyMem_Free() detects
3890 the overflow when debug hooks are installed. */
3891 buffer = PyMem_Malloc(16);
3892 buffer[16] = 'x';
3893 PyMem_Free(buffer);
3894
3895 Py_RETURN_NONE;
3896}
3897
3898static PyObject*
3899pymem_api_misuse(PyObject *self, PyObject *args)
3900{
3901 char *buffer;
3902
3903 /* Deliberate misusage of Python allocators:
3904 allococate with PyMem but release with PyMem_Raw. */
3905 buffer = PyMem_Malloc(16);
3906 PyMem_RawFree(buffer);
3907
3908 Py_RETURN_NONE;
3909}
3910
Victor Stinnerc4aec362016-03-14 22:26:53 +01003911static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01003912pymem_malloc_without_gil(PyObject *self, PyObject *args)
3913{
3914 char *buffer;
3915
3916 /* Deliberate bug to test debug hooks on Python memory allocators:
3917 call PyMem_Malloc() without holding the GIL */
3918 Py_BEGIN_ALLOW_THREADS
3919 buffer = PyMem_Malloc(10);
3920 Py_END_ALLOW_THREADS
3921
3922 PyMem_Free(buffer);
3923
3924 Py_RETURN_NONE;
3925}
3926
3927static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01003928pyobject_malloc_without_gil(PyObject *self, PyObject *args)
3929{
3930 char *buffer;
3931
Victor Stinnerad524372016-03-16 12:12:53 +01003932 /* Deliberate bug to test debug hooks on Python memory allocators:
3933 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01003934 Py_BEGIN_ALLOW_THREADS
3935 buffer = PyObject_Malloc(10);
3936 Py_END_ALLOW_THREADS
3937
3938 PyObject_Free(buffer);
3939
3940 Py_RETURN_NONE;
3941}
3942
Victor Stinner10b73e12016-03-22 13:39:05 +01003943static PyObject *
3944tracemalloc_track(PyObject *self, PyObject *args)
3945{
3946 unsigned int domain;
3947 PyObject *ptr_obj;
3948 void *ptr;
3949 Py_ssize_t size;
3950 int release_gil = 0;
3951 int res;
3952
3953 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
3954 return NULL;
3955 ptr = PyLong_AsVoidPtr(ptr_obj);
3956 if (PyErr_Occurred())
3957 return NULL;
3958
3959 if (release_gil) {
3960 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02003961 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01003962 Py_END_ALLOW_THREADS
3963 }
3964 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02003965 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01003966 }
3967
3968 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02003969 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01003970 return NULL;
3971 }
3972
3973 Py_RETURN_NONE;
3974}
3975
3976static PyObject *
3977tracemalloc_untrack(PyObject *self, PyObject *args)
3978{
3979 unsigned int domain;
3980 PyObject *ptr_obj;
3981 void *ptr;
3982 int res;
3983
3984 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
3985 return NULL;
3986 ptr = PyLong_AsVoidPtr(ptr_obj);
3987 if (PyErr_Occurred())
3988 return NULL;
3989
Victor Stinner5ea4c062017-06-20 17:46:36 +02003990 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01003991 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02003992 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01003993 return NULL;
3994 }
3995
3996 Py_RETURN_NONE;
3997}
3998
3999static PyObject *
4000tracemalloc_get_traceback(PyObject *self, PyObject *args)
4001{
4002 unsigned int domain;
4003 PyObject *ptr_obj;
4004 void *ptr;
4005
4006 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4007 return NULL;
4008 ptr = PyLong_AsVoidPtr(ptr_obj);
4009 if (PyErr_Occurred())
4010 return NULL;
4011
Benjamin Petersonca470632016-09-06 13:47:26 -07004012 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004013}
4014
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004015static PyObject *
4016dict_get_version(PyObject *self, PyObject *args)
4017{
4018 PyDictObject *dict;
4019 uint64_t version;
4020
4021 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4022 return NULL;
4023
4024 version = dict->ma_version_tag;
4025
4026 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4027 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4028}
4029
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004030
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004031static PyObject *
4032raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4033{
4034 PyGenObject *gen;
4035
4036 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4037 return NULL;
4038
4039 /* This is used in a test to check what happens if a signal arrives just
4040 as we're in the process of entering a yield from chain (see
4041 bpo-30039).
4042
4043 Needs to be done in C, because:
4044 - we don't have a Python wrapper for raise()
4045 - we need to make sure that the Python-level signal handler doesn't run
4046 *before* we enter the generator frame, which is impossible in Python
4047 because we check for signals before every bytecode operation.
4048 */
4049 raise(SIGINT);
4050 return _PyGen_Send(gen, Py_None);
4051}
4052
4053
Victor Stinner3b5cf852017-06-09 16:48:45 +02004054static int
4055fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4056{
4057 if (args == Py_None) {
4058 *stack = NULL;
4059 *nargs = 0;
4060 }
4061 else if (PyTuple_Check(args)) {
4062 *stack = &PyTuple_GET_ITEM(args, 0);
4063 *nargs = PyTuple_GET_SIZE(args);
4064 }
4065 else {
4066 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4067 return -1;
4068 }
4069 return 0;
4070}
4071
4072
4073static PyObject *
4074test_pyobject_fastcall(PyObject *self, PyObject *args)
4075{
4076 PyObject *func, *func_args;
4077 PyObject **stack;
4078 Py_ssize_t nargs;
4079
4080 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4081 return NULL;
4082 }
4083
4084 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4085 return NULL;
4086 }
4087 return _PyObject_FastCall(func, stack, nargs);
4088}
4089
4090
4091static PyObject *
4092test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4093{
4094 PyObject *func, *func_args, *kwargs;
4095 PyObject **stack;
4096 Py_ssize_t nargs;
4097
4098 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4099 return NULL;
4100 }
4101
4102 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4103 return NULL;
4104 }
4105
4106 if (kwargs == Py_None) {
4107 kwargs = NULL;
4108 }
4109 else if (!PyDict_Check(kwargs)) {
4110 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4111 return NULL;
4112 }
4113
4114 return _PyObject_FastCallDict(func, stack, nargs, kwargs);
4115}
4116
4117
4118static PyObject *
4119test_pyobject_fastcallkeywords(PyObject *self, PyObject *args)
4120{
4121 PyObject *func, *func_args, *kwnames = NULL;
4122 PyObject **stack;
4123 Py_ssize_t nargs, nkw;
4124
4125 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4126 return NULL;
4127 }
4128
4129 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4130 return NULL;
4131 }
4132
4133 if (kwnames == Py_None) {
4134 kwnames = NULL;
4135 }
4136 else if (PyTuple_Check(kwnames)) {
4137 nkw = PyTuple_GET_SIZE(kwnames);
4138 if (nargs < nkw) {
4139 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4140 return NULL;
4141 }
4142 nargs -= nkw;
4143 }
4144 else {
4145 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4146 return NULL;
4147 }
4148 return _PyObject_FastCallKeywords(func, stack, nargs, kwnames);
4149}
4150
4151
Tim Peters9ea17ac2001-02-02 05:57:15 +00004152static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004153 {"raise_exception", raise_exception, METH_VARARGS},
4154 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02004155 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004156 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01004157 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004158 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
4159 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
4160 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02004161 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01004162 {"dict_hassplittable", dict_hassplittable, METH_O},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004163 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004164 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07004165 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
4166 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
4167 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
4168 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02004169 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004170 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
4171 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02004172 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
4173 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004174 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
4175 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
4176 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07004177 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004178 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
4179 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
4180 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
4181 PyDoc_STR("This is a pretty normal docstring.")},
4182 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
4183 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
4184 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01004185 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004186#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01004187 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004188#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01004189 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03004190 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03004191 {"get_args", get_args, METH_VARARGS},
4192 {"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004193 {"getargs_tuple", getargs_tuple, METH_VARARGS},
4194 {"getargs_keywords", (PyCFunction)getargs_keywords,
4195 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00004196 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
4197 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03004198 {"getargs_positional_only_and_keywords",
4199 (PyCFunction)getargs_positional_only_and_keywords,
4200 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004201 {"getargs_b", getargs_b, METH_VARARGS},
4202 {"getargs_B", getargs_B, METH_VARARGS},
4203 {"getargs_h", getargs_h, METH_VARARGS},
4204 {"getargs_H", getargs_H, METH_VARARGS},
4205 {"getargs_I", getargs_I, METH_VARARGS},
4206 {"getargs_k", getargs_k, METH_VARARGS},
4207 {"getargs_i", getargs_i, METH_VARARGS},
4208 {"getargs_l", getargs_l, METH_VARARGS},
4209 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07004210 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004211 {"getargs_L", getargs_L, METH_VARARGS},
4212 {"getargs_K", getargs_K, METH_VARARGS},
4213 {"test_longlong_api", test_longlong_api, METH_NOARGS},
4214 {"test_long_long_and_overflow",
4215 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
4216 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03004217 {"getargs_f", getargs_f, METH_VARARGS},
4218 {"getargs_d", getargs_d, METH_VARARGS},
4219 {"getargs_D", getargs_D, METH_VARARGS},
4220 {"getargs_S", getargs_S, METH_VARARGS},
4221 {"getargs_Y", getargs_Y, METH_VARARGS},
4222 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03004223 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004224 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00004225 {"getargs_s", getargs_s, METH_VARARGS},
4226 {"getargs_s_star", getargs_s_star, METH_VARARGS},
4227 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
4228 {"getargs_z", getargs_z, METH_VARARGS},
4229 {"getargs_z_star", getargs_z_star, METH_VARARGS},
4230 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
4231 {"getargs_y", getargs_y, METH_VARARGS},
4232 {"getargs_y_star", getargs_y_star, METH_VARARGS},
4233 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
4234 {"getargs_u", getargs_u, METH_VARARGS},
4235 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
4236 {"getargs_Z", getargs_Z, METH_VARARGS},
4237 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00004238 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004239 {"getargs_es", getargs_es, METH_VARARGS},
4240 {"getargs_et", getargs_et, METH_VARARGS},
4241 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
4242 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004243 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004244 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004245 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004246 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004247 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
4248 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
4249 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
4250 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004251 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
4252 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03004253 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08004254 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03004255 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004256 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
4257 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01004258 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004259#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00004260 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004262#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00004263#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00004264 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004265#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00004266 {"traceback_print", traceback_print, METH_VARARGS},
4267 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02004268 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004269 {"argparsing", argparsing, METH_VARARGS},
4270 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
4272 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00004273 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
4274 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00004275 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004276 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01004277 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
4278 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01004279 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02004280 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04004281 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02004282 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02004283 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
4284 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02004285 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
4286 {"test_pymem_setallocators",
4287 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
4288 {"test_pyobject_setallocators",
4289 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004290 {"no_docstring",
4291 (PyCFunction)test_with_docstring, METH_NOARGS},
4292 {"docstring_empty",
4293 (PyCFunction)test_with_docstring, METH_NOARGS,
4294 docstring_empty},
4295 {"docstring_no_signature",
4296 (PyCFunction)test_with_docstring, METH_NOARGS,
4297 docstring_no_signature},
4298 {"docstring_with_invalid_signature",
4299 (PyCFunction)test_with_docstring, METH_NOARGS,
4300 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004301 {"docstring_with_invalid_signature2",
4302 (PyCFunction)test_with_docstring, METH_NOARGS,
4303 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004304 {"docstring_with_signature",
4305 (PyCFunction)test_with_docstring, METH_NOARGS,
4306 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004307 {"docstring_with_signature_but_no_doc",
4308 (PyCFunction)test_with_docstring, METH_NOARGS,
4309 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004310 {"docstring_with_signature_and_extra_newlines",
4311 (PyCFunction)test_with_docstring, METH_NOARGS,
4312 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004313 {"docstring_with_signature_with_defaults",
4314 (PyCFunction)test_with_docstring, METH_NOARGS,
4315 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02004316 {"raise_signal",
4317 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01004318#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004319 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4320 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01004321#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02004322 {"pymarshal_write_long_to_file",
4323 pymarshal_write_long_to_file, METH_VARARGS},
4324 {"pymarshal_write_object_to_file",
4325 pymarshal_write_object_to_file, METH_VARARGS},
4326 {"pymarshal_read_short_from_file",
4327 pymarshal_read_short_from_file, METH_VARARGS},
4328 {"pymarshal_read_long_from_file",
4329 pymarshal_read_long_from_file, METH_VARARGS},
4330 {"pymarshal_read_last_object_from_file",
4331 pymarshal_read_last_object_from_file, METH_VARARGS},
4332 {"pymarshal_read_object_from_file",
4333 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004334 {"return_null_without_error",
4335 return_null_without_error, METH_NOARGS},
4336 {"return_result_with_error",
4337 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004338 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004339 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4340 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004341 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004342#ifdef HAVE_CLOCK_GETTIME
4343 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4344#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004345 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4346 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004347 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be8072016-03-14 12:04:26 +01004348 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
4349 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01004350 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01004351 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01004352 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
4353 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
4354 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004355 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004356 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02004357 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
4358 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
4359 {"pyobject_fastcallkeywords", test_pyobject_fastcallkeywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004360 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00004361};
4362
Thomas Hellera4ea6032003-04-17 18:55:45 +00004363#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
4364
Thomas Wouters89f507f2006-12-13 04:49:30 +00004365typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004366 char bool_member;
4367 char byte_member;
4368 unsigned char ubyte_member;
4369 short short_member;
4370 unsigned short ushort_member;
4371 int int_member;
4372 unsigned int uint_member;
4373 long long_member;
4374 unsigned long ulong_member;
4375 Py_ssize_t pyssizet_member;
4376 float float_member;
4377 double double_member;
4378 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07004379 long long longlong_member;
4380 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004381} all_structmembers;
4382
4383typedef struct {
4384 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004385 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004386} test_structmembers;
4387
4388static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004389 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
4390 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
4391 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
4392 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
4393 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
4394 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
4395 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
4396 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
4397 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
4398 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
4399 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
4400 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
4401 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004402 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
4403 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00004405};
4406
4407
Christian Heimes1af737c2008-01-23 08:24:23 +00004408static PyObject *
4409test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
4410{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004411 static char *keywords[] = {
4412 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
4413 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
4414 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004415 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004416 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07004417 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004418 test_structmembers *ob;
4419 const char *s = NULL;
4420 Py_ssize_t string_len = 0;
4421 ob = PyObject_New(test_structmembers, type);
4422 if (ob == NULL)
4423 return NULL;
4424 memset(&ob->structmembers, 0, sizeof(all_structmembers));
4425 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
4426 &ob->structmembers.bool_member,
4427 &ob->structmembers.byte_member,
4428 &ob->structmembers.ubyte_member,
4429 &ob->structmembers.short_member,
4430 &ob->structmembers.ushort_member,
4431 &ob->structmembers.int_member,
4432 &ob->structmembers.uint_member,
4433 &ob->structmembers.long_member,
4434 &ob->structmembers.ulong_member,
4435 &ob->structmembers.pyssizet_member,
4436 &ob->structmembers.float_member,
4437 &ob->structmembers.double_member,
4438 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004439 , &ob->structmembers.longlong_member,
4440 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004441 )) {
4442 Py_DECREF(ob);
4443 return NULL;
4444 }
4445 if (s != NULL) {
4446 if (string_len > 5) {
4447 Py_DECREF(ob);
4448 PyErr_SetString(PyExc_ValueError, "string too long");
4449 return NULL;
4450 }
4451 strcpy(ob->structmembers.inplace_member, s);
4452 }
4453 else {
4454 strcpy(ob->structmembers.inplace_member, "");
4455 }
4456 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004457}
4458
Christian Heimes1af737c2008-01-23 08:24:23 +00004459static void
4460test_structmembers_free(PyObject *ob)
4461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004462 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004463}
4464
4465static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004466 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004467 "test_structmembersType",
4468 sizeof(test_structmembers), /* tp_basicsize */
4469 0, /* tp_itemsize */
4470 test_structmembers_free, /* destructor tp_dealloc */
4471 0, /* tp_print */
4472 0, /* tp_getattr */
4473 0, /* tp_setattr */
4474 0, /* tp_reserved */
4475 0, /* tp_repr */
4476 0, /* tp_as_number */
4477 0, /* tp_as_sequence */
4478 0, /* tp_as_mapping */
4479 0, /* tp_hash */
4480 0, /* tp_call */
4481 0, /* tp_str */
4482 PyObject_GenericGetAttr, /* tp_getattro */
4483 PyObject_GenericSetAttr, /* tp_setattro */
4484 0, /* tp_as_buffer */
4485 0, /* tp_flags */
4486 "Type containing all structmember types",
4487 0, /* traverseproc tp_traverse */
4488 0, /* tp_clear */
4489 0, /* tp_richcompare */
4490 0, /* tp_weaklistoffset */
4491 0, /* tp_iter */
4492 0, /* tp_iternext */
4493 0, /* tp_methods */
4494 test_members, /* tp_members */
4495 0,
4496 0,
4497 0,
4498 0,
4499 0,
4500 0,
4501 0,
4502 0,
4503 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004504};
4505
4506
Benjamin Petersond51374e2014-04-09 23:55:56 -04004507typedef struct {
4508 PyObject_HEAD
4509} matmulObject;
4510
4511static PyObject *
4512matmulType_matmul(PyObject *self, PyObject *other)
4513{
4514 return Py_BuildValue("(sOO)", "matmul", self, other);
4515}
4516
4517static PyObject *
4518matmulType_imatmul(PyObject *self, PyObject *other)
4519{
4520 return Py_BuildValue("(sOO)", "imatmul", self, other);
4521}
4522
4523static void
4524matmulType_dealloc(PyObject *self)
4525{
Zachary Ware420dc562014-04-23 13:51:27 -05004526 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004527}
4528
4529static PyNumberMethods matmulType_as_number = {
4530 0, /* nb_add */
4531 0, /* nb_subtract */
4532 0, /* nb_multiply */
4533 0, /* nb_remainde r*/
4534 0, /* nb_divmod */
4535 0, /* nb_power */
4536 0, /* nb_negative */
4537 0, /* tp_positive */
4538 0, /* tp_absolute */
4539 0, /* tp_bool */
4540 0, /* nb_invert */
4541 0, /* nb_lshift */
4542 0, /* nb_rshift */
4543 0, /* nb_and */
4544 0, /* nb_xor */
4545 0, /* nb_or */
4546 0, /* nb_int */
4547 0, /* nb_reserved */
4548 0, /* nb_float */
4549 0, /* nb_inplace_add */
4550 0, /* nb_inplace_subtract */
4551 0, /* nb_inplace_multiply */
4552 0, /* nb_inplace_remainder */
4553 0, /* nb_inplace_power */
4554 0, /* nb_inplace_lshift */
4555 0, /* nb_inplace_rshift */
4556 0, /* nb_inplace_and */
4557 0, /* nb_inplace_xor */
4558 0, /* nb_inplace_or */
4559 0, /* nb_floor_divide */
4560 0, /* nb_true_divide */
4561 0, /* nb_inplace_floor_divide */
4562 0, /* nb_inplace_true_divide */
4563 0, /* nb_index */
4564 matmulType_matmul, /* nb_matrix_multiply */
4565 matmulType_imatmul /* nb_matrix_inplace_multiply */
4566};
4567
4568static PyTypeObject matmulType = {
4569 PyVarObject_HEAD_INIT(NULL, 0)
4570 "matmulType",
4571 sizeof(matmulObject), /* tp_basicsize */
4572 0, /* tp_itemsize */
4573 matmulType_dealloc, /* destructor tp_dealloc */
4574 0, /* tp_print */
4575 0, /* tp_getattr */
4576 0, /* tp_setattr */
4577 0, /* tp_reserved */
4578 0, /* tp_repr */
4579 &matmulType_as_number, /* tp_as_number */
4580 0, /* tp_as_sequence */
4581 0, /* tp_as_mapping */
4582 0, /* tp_hash */
4583 0, /* tp_call */
4584 0, /* tp_str */
4585 PyObject_GenericGetAttr, /* tp_getattro */
4586 PyObject_GenericSetAttr, /* tp_setattro */
4587 0, /* tp_as_buffer */
4588 0, /* tp_flags */
4589 "C level type with matrix operations defined",
4590 0, /* traverseproc tp_traverse */
4591 0, /* tp_clear */
4592 0, /* tp_richcompare */
4593 0, /* tp_weaklistoffset */
4594 0, /* tp_iter */
4595 0, /* tp_iternext */
4596 0, /* tp_methods */
4597 0, /* tp_members */
4598 0,
4599 0,
4600 0,
4601 0,
4602 0,
4603 0,
4604 0,
4605 0,
4606 PyType_GenericNew, /* tp_new */
4607 PyObject_Del, /* tp_free */
4608};
4609
Martin v. Löwis1a214512008-06-11 05:26:20 +00004610
Yury Selivanov75445082015-05-11 22:57:16 -04004611typedef struct {
4612 PyObject_HEAD
4613 PyObject *ao_iterator;
4614} awaitObject;
4615
4616
4617static PyObject *
4618awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4619{
4620 PyObject *v;
4621 awaitObject *ao;
4622
4623 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
4624 return NULL;
4625
4626 ao = (awaitObject *)type->tp_alloc(type, 0);
4627 if (ao == NULL) {
4628 return NULL;
4629 }
4630
4631 Py_INCREF(v);
4632 ao->ao_iterator = v;
4633
4634 return (PyObject *)ao;
4635}
4636
4637
4638static void
4639awaitObject_dealloc(awaitObject *ao)
4640{
4641 Py_CLEAR(ao->ao_iterator);
4642 Py_TYPE(ao)->tp_free(ao);
4643}
4644
4645
4646static PyObject *
4647awaitObject_await(awaitObject *ao)
4648{
4649 Py_INCREF(ao->ao_iterator);
4650 return ao->ao_iterator;
4651}
4652
4653static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04004654 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04004655 0, /* am_aiter */
4656 0 /* am_anext */
4657};
4658
4659
4660static PyTypeObject awaitType = {
4661 PyVarObject_HEAD_INIT(NULL, 0)
4662 "awaitType",
4663 sizeof(awaitObject), /* tp_basicsize */
4664 0, /* tp_itemsize */
4665 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
4666 0, /* tp_print */
4667 0, /* tp_getattr */
4668 0, /* tp_setattr */
4669 &awaitType_as_async, /* tp_as_async */
4670 0, /* tp_repr */
4671 0, /* tp_as_number */
4672 0, /* tp_as_sequence */
4673 0, /* tp_as_mapping */
4674 0, /* tp_hash */
4675 0, /* tp_call */
4676 0, /* tp_str */
4677 PyObject_GenericGetAttr, /* tp_getattro */
4678 PyObject_GenericSetAttr, /* tp_setattro */
4679 0, /* tp_as_buffer */
4680 0, /* tp_flags */
4681 "C level type with tp_as_async",
4682 0, /* traverseproc tp_traverse */
4683 0, /* tp_clear */
4684 0, /* tp_richcompare */
4685 0, /* tp_weaklistoffset */
4686 0, /* tp_iter */
4687 0, /* tp_iternext */
4688 0, /* tp_methods */
4689 0, /* tp_members */
4690 0,
4691 0,
4692 0,
4693 0,
4694 0,
4695 0,
4696 0,
4697 0,
4698 awaitObject_new, /* tp_new */
4699 PyObject_Del, /* tp_free */
4700};
4701
4702
Martin v. Löwis1a214512008-06-11 05:26:20 +00004703static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004704 PyModuleDef_HEAD_INIT,
4705 "_testcapi",
4706 NULL,
4707 -1,
4708 TestMethods,
4709 NULL,
4710 NULL,
4711 NULL,
4712 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004713};
4714
Nick Coghland5cacbb2015-05-23 22:24:10 +10004715/* Per PEP 489, this module will not be converted to multi-phase initialization
4716 */
4717
Mark Hammond62b1ab12002-07-23 06:31:15 +00004718PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004719PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00004720{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004721 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004723 m = PyModule_Create(&_testcapimodule);
4724 if (m == NULL)
4725 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004727 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00004728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 Py_TYPE(&test_structmembersType)=&PyType_Type;
4730 Py_INCREF(&test_structmembersType);
4731 /* don't use a name starting with "test", since we don't want
4732 test_capi to automatically call this */
4733 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004734 if (PyType_Ready(&matmulType) < 0)
4735 return NULL;
4736 Py_INCREF(&matmulType);
4737 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004738
Yury Selivanov75445082015-05-11 22:57:16 -04004739 if (PyType_Ready(&awaitType) < 0)
4740 return NULL;
4741 Py_INCREF(&awaitType);
4742 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
4743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
4745 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
4746 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
4747 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
4748 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
4749 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
4750 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
4751 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
4752 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
4753 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
4754 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
4755 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
4756 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
4757 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
4758 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
4759 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
4760 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
4761 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
4762 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
4763 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
4764 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
4765 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02004766 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004767 Py_INCREF(&PyInstanceMethod_Type);
4768 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00004769
Larry Hastings2a727912014-01-16 11:32:01 -08004770 PyModule_AddIntConstant(m, "the_number_three", 3);
4771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004772 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
4773 Py_INCREF(TestError);
4774 PyModule_AddObject(m, "error", TestError);
4775 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004776}