blob: ecbec972caf2fc54edb6c657b5dcb7f2c0ed3966 [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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 Py_INCREF(Py_None);
68 return Py_None;
Tim Peters9ea17ac2001-02-02 05:57:15 +000069}
70
Tim Peters5c4d5bf2001-02-12 22:13:26 +000071static PyObject*
Victor Stinner01076552013-10-29 19:39:52 +010072test_sizeof_c_types(PyObject *self)
73{
Ned Deilye37a1942015-03-05 15:47:10 -080074#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020075#pragma GCC diagnostic push
76#pragma GCC diagnostic ignored "-Wtype-limits"
77#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010078#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010079 if (EXPECTED != sizeof(TYPE)) { \
80 PyErr_Format(TestError, \
81 "sizeof(%s) = %u instead of %u", \
82 #TYPE, sizeof(TYPE), EXPECTED); \
83 return (PyObject*)NULL; \
84 }
Victor Stinnerf866f972013-10-29 19:59:31 +010085#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
86#define CHECK_SIGNNESS(TYPE, SIGNED) \
87 if (IS_SIGNED(TYPE) != SIGNED) { \
88 PyErr_Format(TestError, \
89 "%s signness is, instead of %i", \
90 #TYPE, IS_SIGNED(TYPE), SIGNED); \
91 return (PyObject*)NULL; \
92 }
Victor Stinner01076552013-10-29 19:39:52 +010093
94 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +010095 CHECK_SIZEOF(Py_UCS1, 1);
96 CHECK_SIZEOF(Py_UCS2, 2);
97 CHECK_SIZEOF(Py_UCS4, 4);
98 CHECK_SIGNNESS(Py_UCS1, 0);
99 CHECK_SIGNNESS(Py_UCS2, 0);
100 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700101 CHECK_SIZEOF(int32_t, 4);
102 CHECK_SIGNNESS(int32_t, 1);
103 CHECK_SIZEOF(uint32_t, 4);
104 CHECK_SIGNNESS(uint32_t, 0);
105 CHECK_SIZEOF(int64_t, 8);
106 CHECK_SIGNNESS(int64_t, 1);
107 CHECK_SIZEOF(uint64_t, 8);
108 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100109
110 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100111 CHECK_SIZEOF(size_t, sizeof(void *));
112 CHECK_SIGNNESS(size_t, 0);
113 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
114 CHECK_SIGNNESS(Py_ssize_t, 1);
115
Benjamin Petersonca470632016-09-06 13:47:26 -0700116 CHECK_SIZEOF(uintptr_t, sizeof(void *));
117 CHECK_SIGNNESS(uintptr_t, 0);
118 CHECK_SIZEOF(intptr_t, sizeof(void *));
119 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100120
121 Py_INCREF(Py_None);
122 return Py_None;
123
Victor Stinnerf866f972013-10-29 19:59:31 +0100124#undef IS_SIGNED
125#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100126#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800127#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200128#pragma GCC diagnostic pop
129#endif
Victor Stinner01076552013-10-29 19:39:52 +0100130}
131
132
133static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000134test_list_api(PyObject *self)
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 PyObject* list;
137 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000140#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 list = PyList_New(NLIST);
142 if (list == (PyObject*)NULL)
143 return (PyObject*)NULL;
144 /* list = range(NLIST) */
145 for (i = 0; i < NLIST; ++i) {
146 PyObject* anint = PyLong_FromLong(i);
147 if (anint == (PyObject*)NULL) {
148 Py_DECREF(list);
149 return (PyObject*)NULL;
150 }
151 PyList_SET_ITEM(list, i, anint);
152 }
153 /* list.reverse(), via PyList_Reverse() */
154 i = PyList_Reverse(list); /* should not blow up! */
155 if (i != 0) {
156 Py_DECREF(list);
157 return (PyObject*)NULL;
158 }
159 /* Check that list == range(29, -1, -1) now */
160 for (i = 0; i < NLIST; ++i) {
161 PyObject* anint = PyList_GET_ITEM(list, i);
162 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
163 PyErr_SetString(TestError,
164 "test_list_api: reverse screwed up");
165 Py_DECREF(list);
166 return (PyObject*)NULL;
167 }
168 }
169 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000170#undef NLIST
171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 Py_INCREF(Py_None);
173 return Py_None;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000174}
175
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000176static int
177test_dict_inner(int count)
178{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 Py_ssize_t pos = 0, iterations = 0;
180 int i;
181 PyObject *dict = PyDict_New();
182 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 if (dict == NULL)
185 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 for (i = 0; i < count; i++) {
188 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200189 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200190 return -1;
191 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200192 if (PyDict_SetItem(dict, v, v) < 0) {
193 Py_DECREF(v);
194 return -1;
195 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000196 Py_DECREF(v);
197 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 while (PyDict_Next(dict, &pos, &k, &v)) {
200 PyObject *o;
201 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 i = PyLong_AS_LONG(v) + 1;
204 o = PyLong_FromLong(i);
205 if (o == NULL)
206 return -1;
207 if (PyDict_SetItem(dict, k, o) < 0) {
208 Py_DECREF(o);
209 return -1;
210 }
211 Py_DECREF(o);
212 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000216 if (iterations != count) {
217 PyErr_SetString(
218 TestError,
219 "test_dict_iteration: dict iteration went wrong ");
220 return -1;
221 } else {
222 return 0;
223 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000224}
225
226static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000227test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 for (i = 0; i < 200; i++) {
232 if (test_dict_inner(i) < 0) {
233 return NULL;
234 }
235 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 Py_INCREF(Py_None);
238 return Py_None;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000239}
240
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200241static PyObject*
242dict_getitem_knownhash(PyObject *self, PyObject *args)
243{
244 PyObject *mp, *key, *result;
245 Py_ssize_t hash;
246
247 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
248 &mp, &key, &hash)) {
249 return NULL;
250 }
251
252 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
253 if (result == NULL && !PyErr_Occurred()) {
254 _PyErr_SetKeyError(key);
255 return NULL;
256 }
257
258 Py_XINCREF(result);
259 return result;
260}
Tim Peters91621db2001-06-12 20:10:01 +0000261
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000262/* Issue #4701: Check that PyObject_Hash implicitly calls
263 * PyType_Ready if it hasn't already been called
264 */
265static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 PyVarObject_HEAD_INIT(NULL, 0)
267 "hashinheritancetester", /* Name of this type */
268 sizeof(PyObject), /* Basic object size */
269 0, /* Item size for varobject */
270 (destructor)PyObject_Del, /* tp_dealloc */
271 0, /* tp_print */
272 0, /* tp_getattr */
273 0, /* tp_setattr */
274 0, /* tp_reserved */
275 0, /* tp_repr */
276 0, /* tp_as_number */
277 0, /* tp_as_sequence */
278 0, /* tp_as_mapping */
279 0, /* tp_hash */
280 0, /* tp_call */
281 0, /* tp_str */
282 PyObject_GenericGetAttr, /* tp_getattro */
283 0, /* tp_setattro */
284 0, /* tp_as_buffer */
285 Py_TPFLAGS_DEFAULT, /* tp_flags */
286 0, /* tp_doc */
287 0, /* tp_traverse */
288 0, /* tp_clear */
289 0, /* tp_richcompare */
290 0, /* tp_weaklistoffset */
291 0, /* tp_iter */
292 0, /* tp_iternext */
293 0, /* tp_methods */
294 0, /* tp_members */
295 0, /* tp_getset */
296 0, /* tp_base */
297 0, /* tp_dict */
298 0, /* tp_descr_get */
299 0, /* tp_descr_set */
300 0, /* tp_dictoffset */
301 0, /* tp_init */
302 0, /* tp_alloc */
303 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000304};
305
306static PyObject*
307test_lazy_hash_inheritance(PyObject* self)
308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 PyTypeObject *type;
310 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000311 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 if (type->tp_dict != NULL)
316 /* The type has already been initialized. This probably means
317 -R is being used. */
318 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000319
320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 obj = PyObject_New(PyObject, type);
322 if (obj == NULL) {
323 PyErr_Clear();
324 PyErr_SetString(
325 TestError,
326 "test_lazy_hash_inheritance: failed to create object");
327 return NULL;
328 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 if (type->tp_dict != NULL) {
331 PyErr_SetString(
332 TestError,
333 "test_lazy_hash_inheritance: type initialised too soon");
334 Py_DECREF(obj);
335 return NULL;
336 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 hash = PyObject_Hash(obj);
339 if ((hash == -1) && PyErr_Occurred()) {
340 PyErr_Clear();
341 PyErr_SetString(
342 TestError,
343 "test_lazy_hash_inheritance: could not hash object");
344 Py_DECREF(obj);
345 return NULL;
346 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 if (type->tp_dict == NULL) {
349 PyErr_SetString(
350 TestError,
351 "test_lazy_hash_inheritance: type not initialised by hash()");
352 Py_DECREF(obj);
353 return NULL;
354 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 if (type->tp_hash != PyType_Type.tp_hash) {
357 PyErr_SetString(
358 TestError,
359 "test_lazy_hash_inheritance: unexpected hash function");
360 Py_DECREF(obj);
361 return NULL;
362 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000367}
368
369
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700370/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000371 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000372
373 Note that the meat of the test is contained in testcapi_long.h.
374 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700375 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000376 dependence on type names makes it impossible to use a parameterized
377 function. A giant macro would be even worse than this. A C++ template
378 would be perfect.
379
380 The "report an error" functions are deliberately not part of the #include
381 file: if the test fails, you can set a breakpoint in the appropriate
382 error function directly, and crawl back from there in the debugger.
383*/
384
385#define UNBIND(X) Py_DECREF(X); (X) = NULL
386
387static PyObject *
388raise_test_long_error(const char* msg)
389{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000391}
392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393#define TESTNAME test_long_api_inner
394#define TYPENAME long
395#define F_S_TO_PY PyLong_FromLong
396#define F_PY_TO_S PyLong_AsLong
397#define F_U_TO_PY PyLong_FromUnsignedLong
398#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000399
400#include "testcapi_long.h"
401
402static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000403test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000404{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000406}
407
408#undef TESTNAME
409#undef TYPENAME
410#undef F_S_TO_PY
411#undef F_PY_TO_S
412#undef F_U_TO_PY
413#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000414
Tim Peters91621db2001-06-12 20:10:01 +0000415static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000416raise_test_longlong_error(const char* msg)
417{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000419}
420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700422#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423#define F_S_TO_PY PyLong_FromLongLong
424#define F_PY_TO_S PyLong_AsLongLong
425#define F_U_TO_PY PyLong_FromUnsignedLongLong
426#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000427
428#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000429
430static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000431test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000432{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000434}
435
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000436#undef TESTNAME
437#undef TYPENAME
438#undef F_S_TO_PY
439#undef F_PY_TO_S
440#undef F_U_TO_PY
441#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000442
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000443/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
444 is tested by test_long_api_inner. This test will concentrate on proper
445 handling of overflow.
446*/
447
448static PyObject *
449test_long_and_overflow(PyObject *self)
450{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 PyObject *num, *one, *temp;
452 long value;
453 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 /* Test that overflow is set properly for a large value. */
456 /* num is a number larger than LONG_MAX even on 64-bit platforms */
457 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
458 if (num == NULL)
459 return NULL;
460 overflow = 1234;
461 value = PyLong_AsLongAndOverflow(num, &overflow);
462 Py_DECREF(num);
463 if (value == -1 && PyErr_Occurred())
464 return NULL;
465 if (value != -1)
466 return raiseTestError("test_long_and_overflow",
467 "return value was not set to -1");
468 if (overflow != 1)
469 return raiseTestError("test_long_and_overflow",
470 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 /* Same again, with num = LONG_MAX + 1 */
473 num = PyLong_FromLong(LONG_MAX);
474 if (num == NULL)
475 return NULL;
476 one = PyLong_FromLong(1L);
477 if (one == NULL) {
478 Py_DECREF(num);
479 return NULL;
480 }
481 temp = PyNumber_Add(num, one);
482 Py_DECREF(one);
483 Py_DECREF(num);
484 num = temp;
485 if (num == NULL)
486 return NULL;
487 overflow = 0;
488 value = PyLong_AsLongAndOverflow(num, &overflow);
489 Py_DECREF(num);
490 if (value == -1 && PyErr_Occurred())
491 return NULL;
492 if (value != -1)
493 return raiseTestError("test_long_and_overflow",
494 "return value was not set to -1");
495 if (overflow != 1)
496 return raiseTestError("test_long_and_overflow",
497 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 /* Test that overflow is set properly for a large negative value. */
500 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
501 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
502 if (num == NULL)
503 return NULL;
504 overflow = 1234;
505 value = PyLong_AsLongAndOverflow(num, &overflow);
506 Py_DECREF(num);
507 if (value == -1 && PyErr_Occurred())
508 return NULL;
509 if (value != -1)
510 return raiseTestError("test_long_and_overflow",
511 "return value was not set to -1");
512 if (overflow != -1)
513 return raiseTestError("test_long_and_overflow",
514 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 /* Same again, with num = LONG_MIN - 1 */
517 num = PyLong_FromLong(LONG_MIN);
518 if (num == NULL)
519 return NULL;
520 one = PyLong_FromLong(1L);
521 if (one == NULL) {
522 Py_DECREF(num);
523 return NULL;
524 }
525 temp = PyNumber_Subtract(num, one);
526 Py_DECREF(one);
527 Py_DECREF(num);
528 num = temp;
529 if (num == NULL)
530 return NULL;
531 overflow = 0;
532 value = PyLong_AsLongAndOverflow(num, &overflow);
533 Py_DECREF(num);
534 if (value == -1 && PyErr_Occurred())
535 return NULL;
536 if (value != -1)
537 return raiseTestError("test_long_and_overflow",
538 "return value was not set to -1");
539 if (overflow != -1)
540 return raiseTestError("test_long_and_overflow",
541 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 /* Test that overflow is cleared properly for small values. */
544 num = PyLong_FromString("FF", NULL, 16);
545 if (num == NULL)
546 return NULL;
547 overflow = 1234;
548 value = PyLong_AsLongAndOverflow(num, &overflow);
549 Py_DECREF(num);
550 if (value == -1 && PyErr_Occurred())
551 return NULL;
552 if (value != 0xFF)
553 return raiseTestError("test_long_and_overflow",
554 "expected return value 0xFF");
555 if (overflow != 0)
556 return raiseTestError("test_long_and_overflow",
557 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 num = PyLong_FromString("-FF", NULL, 16);
560 if (num == NULL)
561 return NULL;
562 overflow = 0;
563 value = PyLong_AsLongAndOverflow(num, &overflow);
564 Py_DECREF(num);
565 if (value == -1 && PyErr_Occurred())
566 return NULL;
567 if (value != -0xFF)
568 return raiseTestError("test_long_and_overflow",
569 "expected return value 0xFF");
570 if (overflow != 0)
571 return raiseTestError("test_long_and_overflow",
572 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 num = PyLong_FromLong(LONG_MAX);
575 if (num == NULL)
576 return NULL;
577 overflow = 1234;
578 value = PyLong_AsLongAndOverflow(num, &overflow);
579 Py_DECREF(num);
580 if (value == -1 && PyErr_Occurred())
581 return NULL;
582 if (value != LONG_MAX)
583 return raiseTestError("test_long_and_overflow",
584 "expected return value LONG_MAX");
585 if (overflow != 0)
586 return raiseTestError("test_long_and_overflow",
587 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 num = PyLong_FromLong(LONG_MIN);
590 if (num == NULL)
591 return NULL;
592 overflow = 0;
593 value = PyLong_AsLongAndOverflow(num, &overflow);
594 Py_DECREF(num);
595 if (value == -1 && PyErr_Occurred())
596 return NULL;
597 if (value != LONG_MIN)
598 return raiseTestError("test_long_and_overflow",
599 "expected return value LONG_MIN");
600 if (overflow != 0)
601 return raiseTestError("test_long_and_overflow",
602 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 Py_INCREF(Py_None);
605 return Py_None;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000606}
607
Mark Dickinson93f562c2010-01-30 10:30:15 +0000608/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700609 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000610 concentrate on proper handling of overflow.
611*/
612
613static PyObject *
614test_long_long_and_overflow(PyObject *self)
615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700617 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 /* Test that overflow is set properly for a large value. */
621 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
622 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
623 if (num == NULL)
624 return NULL;
625 overflow = 1234;
626 value = PyLong_AsLongLongAndOverflow(num, &overflow);
627 Py_DECREF(num);
628 if (value == -1 && PyErr_Occurred())
629 return NULL;
630 if (value != -1)
631 return raiseTestError("test_long_long_and_overflow",
632 "return value was not set to -1");
633 if (overflow != 1)
634 return raiseTestError("test_long_long_and_overflow",
635 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 /* Same again, with num = PY_LLONG_MAX + 1 */
638 num = PyLong_FromLongLong(PY_LLONG_MAX);
639 if (num == NULL)
640 return NULL;
641 one = PyLong_FromLong(1L);
642 if (one == NULL) {
643 Py_DECREF(num);
644 return NULL;
645 }
646 temp = PyNumber_Add(num, one);
647 Py_DECREF(one);
648 Py_DECREF(num);
649 num = temp;
650 if (num == NULL)
651 return NULL;
652 overflow = 0;
653 value = PyLong_AsLongLongAndOverflow(num, &overflow);
654 Py_DECREF(num);
655 if (value == -1 && PyErr_Occurred())
656 return NULL;
657 if (value != -1)
658 return raiseTestError("test_long_long_and_overflow",
659 "return value was not set to -1");
660 if (overflow != 1)
661 return raiseTestError("test_long_long_and_overflow",
662 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 /* Test that overflow is set properly for a large negative value. */
665 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
666 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
667 if (num == NULL)
668 return NULL;
669 overflow = 1234;
670 value = PyLong_AsLongLongAndOverflow(num, &overflow);
671 Py_DECREF(num);
672 if (value == -1 && PyErr_Occurred())
673 return NULL;
674 if (value != -1)
675 return raiseTestError("test_long_long_and_overflow",
676 "return value was not set to -1");
677 if (overflow != -1)
678 return raiseTestError("test_long_long_and_overflow",
679 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 /* Same again, with num = PY_LLONG_MIN - 1 */
682 num = PyLong_FromLongLong(PY_LLONG_MIN);
683 if (num == NULL)
684 return NULL;
685 one = PyLong_FromLong(1L);
686 if (one == NULL) {
687 Py_DECREF(num);
688 return NULL;
689 }
690 temp = PyNumber_Subtract(num, one);
691 Py_DECREF(one);
692 Py_DECREF(num);
693 num = temp;
694 if (num == NULL)
695 return NULL;
696 overflow = 0;
697 value = PyLong_AsLongLongAndOverflow(num, &overflow);
698 Py_DECREF(num);
699 if (value == -1 && PyErr_Occurred())
700 return NULL;
701 if (value != -1)
702 return raiseTestError("test_long_long_and_overflow",
703 "return value was not set to -1");
704 if (overflow != -1)
705 return raiseTestError("test_long_long_and_overflow",
706 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 /* Test that overflow is cleared properly for small values. */
709 num = PyLong_FromString("FF", NULL, 16);
710 if (num == NULL)
711 return NULL;
712 overflow = 1234;
713 value = PyLong_AsLongLongAndOverflow(num, &overflow);
714 Py_DECREF(num);
715 if (value == -1 && PyErr_Occurred())
716 return NULL;
717 if (value != 0xFF)
718 return raiseTestError("test_long_long_and_overflow",
719 "expected return value 0xFF");
720 if (overflow != 0)
721 return raiseTestError("test_long_long_and_overflow",
722 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 num = PyLong_FromString("-FF", NULL, 16);
725 if (num == NULL)
726 return NULL;
727 overflow = 0;
728 value = PyLong_AsLongLongAndOverflow(num, &overflow);
729 Py_DECREF(num);
730 if (value == -1 && PyErr_Occurred())
731 return NULL;
732 if (value != -0xFF)
733 return raiseTestError("test_long_long_and_overflow",
734 "expected return value 0xFF");
735 if (overflow != 0)
736 return raiseTestError("test_long_long_and_overflow",
737 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 num = PyLong_FromLongLong(PY_LLONG_MAX);
740 if (num == NULL)
741 return NULL;
742 overflow = 1234;
743 value = PyLong_AsLongLongAndOverflow(num, &overflow);
744 Py_DECREF(num);
745 if (value == -1 && PyErr_Occurred())
746 return NULL;
747 if (value != PY_LLONG_MAX)
748 return raiseTestError("test_long_long_and_overflow",
749 "expected return value PY_LLONG_MAX");
750 if (overflow != 0)
751 return raiseTestError("test_long_long_and_overflow",
752 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 num = PyLong_FromLongLong(PY_LLONG_MIN);
755 if (num == NULL)
756 return NULL;
757 overflow = 0;
758 value = PyLong_AsLongLongAndOverflow(num, &overflow);
759 Py_DECREF(num);
760 if (value == -1 && PyErr_Occurred())
761 return NULL;
762 if (value != PY_LLONG_MIN)
763 return raiseTestError("test_long_long_and_overflow",
764 "expected return value PY_LLONG_MIN");
765 if (overflow != 0)
766 return raiseTestError("test_long_long_and_overflow",
767 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 Py_INCREF(Py_None);
770 return Py_None;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000771}
772
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200773/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
774 non-integer arguments are handled correctly. It should be extended to
775 test overflow handling.
776 */
777
778static PyObject *
779test_long_as_size_t(PyObject *self)
780{
781 size_t out_u;
782 Py_ssize_t out_s;
783
784 Py_INCREF(Py_None);
785
786 out_u = PyLong_AsSize_t(Py_None);
787 if (out_u != (size_t)-1 || !PyErr_Occurred())
788 return raiseTestError("test_long_as_size_t",
789 "PyLong_AsSize_t(None) didn't complain");
790 if (!PyErr_ExceptionMatches(PyExc_TypeError))
791 return raiseTestError("test_long_as_size_t",
792 "PyLong_AsSize_t(None) raised "
793 "something other than TypeError");
794 PyErr_Clear();
795
796 out_s = PyLong_AsSsize_t(Py_None);
797 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
798 return raiseTestError("test_long_as_size_t",
799 "PyLong_AsSsize_t(None) didn't complain");
800 if (!PyErr_ExceptionMatches(PyExc_TypeError))
801 return raiseTestError("test_long_as_size_t",
802 "PyLong_AsSsize_t(None) raised "
803 "something other than TypeError");
804 PyErr_Clear();
805
806 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
807 return Py_None;
808}
809
810/* Test the PyLong_AsDouble API. At present this just tests that
811 non-integer arguments are handled correctly.
812 */
813
814static PyObject *
815test_long_as_double(PyObject *self)
816{
817 double out;
818
819 Py_INCREF(Py_None);
820
821 out = PyLong_AsDouble(Py_None);
822 if (out != -1.0 || !PyErr_Occurred())
823 return raiseTestError("test_long_as_double",
824 "PyLong_AsDouble(None) didn't complain");
825 if (!PyErr_ExceptionMatches(PyExc_TypeError))
826 return raiseTestError("test_long_as_double",
827 "PyLong_AsDouble(None) raised "
828 "something other than TypeError");
829 PyErr_Clear();
830
831 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
832 return Py_None;
833}
834
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700835/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000836 for both long and int arguments. The test may leak a little memory if
837 it fails.
838*/
839static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000840test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700843 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 tuple = PyTuple_New(1);
846 if (tuple == NULL)
847 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 num = PyLong_FromLong(42);
850 if (num == NULL)
851 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 value = -1;
856 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
857 return NULL;
858 if (value != 42)
859 return raiseTestError("test_L_code",
860 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 Py_DECREF(num);
863 num = PyLong_FromLong(42);
864 if (num == NULL)
865 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 value = -1;
870 if (PyArg_ParseTuple(tuple, "L:test_L_code", &value) < 0)
871 return NULL;
872 if (value != 42)
873 return raiseTestError("test_L_code",
874 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 Py_DECREF(tuple);
877 Py_INCREF(Py_None);
878 return Py_None;
Tim Petersd38b1c72001-09-30 05:09:37 +0000879}
880
Serhiy Storchakace412872016-05-08 23:36:44 +0300881static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300882return_none(void *unused)
883{
884 Py_RETURN_NONE;
885}
886
887static PyObject *
888raise_error(void *unused)
889{
890 PyErr_SetNone(PyExc_ValueError);
891 return NULL;
892}
893
894static int
895test_buildvalue_N_error(const char *fmt)
896{
897 PyObject *arg, *res;
898
899 arg = PyList_New(0);
900 if (arg == NULL) {
901 return -1;
902 }
903
904 Py_INCREF(arg);
905 res = Py_BuildValue(fmt, return_none, NULL, arg);
906 if (res == NULL) {
907 return -1;
908 }
909 Py_DECREF(res);
910 if (Py_REFCNT(arg) != 1) {
911 PyErr_Format(TestError, "test_buildvalue_N: "
912 "arg was not decrefed in successful "
913 "Py_BuildValue(\"%s\")", fmt);
914 return -1;
915 }
916
917 Py_INCREF(arg);
918 res = Py_BuildValue(fmt, raise_error, NULL, arg);
919 if (res != NULL || !PyErr_Occurred()) {
920 PyErr_Format(TestError, "test_buildvalue_N: "
921 "Py_BuildValue(\"%s\") didn't complain", fmt);
922 return -1;
923 }
924 PyErr_Clear();
925 if (Py_REFCNT(arg) != 1) {
926 PyErr_Format(TestError, "test_buildvalue_N: "
927 "arg was not decrefed in failed "
928 "Py_BuildValue(\"%s\")", fmt);
929 return -1;
930 }
931 Py_DECREF(arg);
932 return 0;
933}
934
935static PyObject *
936test_buildvalue_N(PyObject *self, PyObject *noargs)
937{
938 PyObject *arg, *res;
939
940 arg = PyList_New(0);
941 if (arg == NULL) {
942 return NULL;
943 }
944 Py_INCREF(arg);
945 res = Py_BuildValue("N", arg);
946 if (res == NULL) {
947 return NULL;
948 }
949 if (res != arg) {
950 return raiseTestError("test_buildvalue_N",
951 "Py_BuildValue(\"N\") returned wrong result");
952 }
953 if (Py_REFCNT(arg) != 2) {
954 return raiseTestError("test_buildvalue_N",
955 "arg was not decrefed in Py_BuildValue(\"N\")");
956 }
957 Py_DECREF(res);
958 Py_DECREF(arg);
959
960 if (test_buildvalue_N_error("O&N") < 0)
961 return NULL;
962 if (test_buildvalue_N_error("(O&N)") < 0)
963 return NULL;
964 if (test_buildvalue_N_error("[O&N]") < 0)
965 return NULL;
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
971 Py_RETURN_NONE;
972}
973
974
975static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +0300976get_args(PyObject *self, PyObject *args)
977{
978 if (args == NULL) {
979 args = Py_None;
980 }
981 Py_INCREF(args);
982 return args;
983}
984
985static PyObject *
986get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
987{
988 if (kwargs == NULL) {
989 kwargs = Py_None;
990 }
991 Py_INCREF(kwargs);
992 return kwargs;
993}
994
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000995/* Test tuple argument processing */
996static PyObject *
997getargs_tuple(PyObject *self, PyObject *args)
998{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 int a, b, c;
1000 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1001 return NULL;
1002 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001003}
1004
Christian Heimes380f7f22008-02-28 11:19:05 +00001005/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001006static PyObject *
1007getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001010 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1014 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1015 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1016 return NULL;
1017 return Py_BuildValue("iiiiiiiiii",
1018 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1019 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001020}
1021
Larry Hastings83a9f482012-03-20 20:06:16 +00001022/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1023static PyObject *
1024getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1025{
1026 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1027 int required = -1;
1028 int optional = -1;
1029 int keyword_only = -1;
1030
1031 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1032 &required, &optional, &keyword_only))
1033 return NULL;
1034 return Py_BuildValue("iii", required, optional, keyword_only);
1035}
1036
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001037/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1038static PyObject *
1039getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1040{
1041 static char *keywords[] = {"", "", "keyword", NULL};
1042 int required = -1;
1043 int optional = -1;
1044 int keyword = -1;
1045
1046 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1047 &required, &optional, &keyword))
1048 return NULL;
1049 return Py_BuildValue("iii", required, optional, keyword);
1050}
1051
Thomas Heller3457e4b2003-04-24 16:14:27 +00001052/* Functions to call PyArg_ParseTuple with integer format codes,
1053 and return the result.
1054*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001055static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001056getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 unsigned char value;
1059 if (!PyArg_ParseTuple(args, "b", &value))
1060 return NULL;
1061 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001062}
1063
Thomas Heller3457e4b2003-04-24 16:14:27 +00001064static PyObject *
1065getargs_B(PyObject *self, PyObject *args)
1066{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 unsigned char value;
1068 if (!PyArg_ParseTuple(args, "B", &value))
1069 return NULL;
1070 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001071}
1072
1073static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001074getargs_h(PyObject *self, PyObject *args)
1075{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 short value;
1077 if (!PyArg_ParseTuple(args, "h", &value))
1078 return NULL;
1079 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001080}
1081
1082static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001083getargs_H(PyObject *self, PyObject *args)
1084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 unsigned short value;
1086 if (!PyArg_ParseTuple(args, "H", &value))
1087 return NULL;
1088 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001089}
1090
1091static PyObject *
1092getargs_I(PyObject *self, PyObject *args)
1093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 unsigned int value;
1095 if (!PyArg_ParseTuple(args, "I", &value))
1096 return NULL;
1097 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001098}
1099
1100static PyObject *
1101getargs_k(PyObject *self, PyObject *args)
1102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 unsigned long value;
1104 if (!PyArg_ParseTuple(args, "k", &value))
1105 return NULL;
1106 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001107}
1108
1109static PyObject *
1110getargs_i(PyObject *self, PyObject *args)
1111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 int value;
1113 if (!PyArg_ParseTuple(args, "i", &value))
1114 return NULL;
1115 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001116}
1117
Thomas Hellera4ea6032003-04-17 18:55:45 +00001118static PyObject *
1119getargs_l(PyObject *self, PyObject *args)
1120{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 long value;
1122 if (!PyArg_ParseTuple(args, "l", &value))
1123 return NULL;
1124 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001125}
1126
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001127static PyObject *
1128getargs_n(PyObject *self, PyObject *args)
1129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 Py_ssize_t value;
1131 if (!PyArg_ParseTuple(args, "n", &value))
1132 return NULL;
1133 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001134}
1135
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001136static PyObject *
1137getargs_p(PyObject *self, PyObject *args)
1138{
1139 int value;
1140 if (!PyArg_ParseTuple(args, "p", &value))
1141 return NULL;
1142 return PyLong_FromLong(value);
1143}
1144
Thomas Hellera4ea6032003-04-17 18:55:45 +00001145static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001146getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001147{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001148 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 if (!PyArg_ParseTuple(args, "L", &value))
1150 return NULL;
1151 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001152}
1153
Thomas Hellera4ea6032003-04-17 18:55:45 +00001154static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001155getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001156{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001157 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 if (!PyArg_ParseTuple(args, "K", &value))
1159 return NULL;
1160 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001161}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001162
1163/* This function not only tests the 'k' getargs code, but also the
Christian Heimes217cfd12007-12-02 14:31:20 +00001164 PyLong_AsUnsignedLongMask() and PyLong_AsUnsignedLongMask() functions. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001165static PyObject *
1166test_k_code(PyObject *self)
1167{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 PyObject *tuple, *num;
1169 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 tuple = PyTuple_New(1);
1172 if (tuple == NULL)
1173 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 /* a number larger than ULONG_MAX even on 64-bit platforms */
1176 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1177 if (num == NULL)
1178 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 value = PyLong_AsUnsignedLongMask(num);
1181 if (value != ULONG_MAX)
1182 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001183 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 value = 0;
1188 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1189 return NULL;
1190 if (value != ULONG_MAX)
1191 return raiseTestError("test_k_code",
1192 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 Py_DECREF(num);
1195 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1196 if (num == NULL)
1197 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 value = PyLong_AsUnsignedLongMask(num);
1200 if (value != (unsigned long)-0x42)
1201 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001202 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 value = 0;
1207 if (PyArg_ParseTuple(tuple, "k:test_k_code", &value) < 0)
1208 return NULL;
1209 if (value != (unsigned long)-0x42)
1210 return raiseTestError("test_k_code",
1211 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 Py_DECREF(tuple);
1214 Py_INCREF(Py_None);
1215 return Py_None;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001216}
1217
Victor Stinner06e49dd2010-06-13 18:21:50 +00001218static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001219getargs_f(PyObject *self, PyObject *args)
1220{
1221 float f;
1222 if (!PyArg_ParseTuple(args, "f", &f))
1223 return NULL;
1224 return PyFloat_FromDouble(f);
1225}
1226
1227static PyObject *
1228getargs_d(PyObject *self, PyObject *args)
1229{
1230 double d;
1231 if (!PyArg_ParseTuple(args, "d", &d))
1232 return NULL;
1233 return PyFloat_FromDouble(d);
1234}
1235
1236static PyObject *
1237getargs_D(PyObject *self, PyObject *args)
1238{
1239 Py_complex cval;
1240 if (!PyArg_ParseTuple(args, "D", &cval))
1241 return NULL;
1242 return PyComplex_FromCComplex(cval);
1243}
1244
1245static PyObject *
1246getargs_S(PyObject *self, PyObject *args)
1247{
1248 PyObject *obj;
1249 if (!PyArg_ParseTuple(args, "S", &obj))
1250 return NULL;
1251 Py_INCREF(obj);
1252 return obj;
1253}
1254
1255static PyObject *
1256getargs_Y(PyObject *self, PyObject *args)
1257{
1258 PyObject *obj;
1259 if (!PyArg_ParseTuple(args, "Y", &obj))
1260 return NULL;
1261 Py_INCREF(obj);
1262 return obj;
1263}
1264
1265static PyObject *
1266getargs_U(PyObject *self, PyObject *args)
1267{
1268 PyObject *obj;
1269 if (!PyArg_ParseTuple(args, "U", &obj))
1270 return NULL;
1271 Py_INCREF(obj);
1272 return obj;
1273}
1274
1275static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001276getargs_c(PyObject *self, PyObject *args)
1277{
1278 char c;
1279 if (!PyArg_ParseTuple(args, "c", &c))
1280 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001281 return PyLong_FromLong((unsigned char)c);
1282}
1283
1284static PyObject *
1285getargs_C(PyObject *self, PyObject *args)
1286{
1287 int c;
1288 if (!PyArg_ParseTuple(args, "C", &c))
1289 return NULL;
1290 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001291}
1292
1293static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001294getargs_s(PyObject *self, PyObject *args)
1295{
1296 char *str;
1297 if (!PyArg_ParseTuple(args, "s", &str))
1298 return NULL;
1299 return PyBytes_FromString(str);
1300}
1301
1302static PyObject *
1303getargs_s_star(PyObject *self, PyObject *args)
1304{
1305 Py_buffer buffer;
1306 PyObject *bytes;
1307 if (!PyArg_ParseTuple(args, "s*", &buffer))
1308 return NULL;
1309 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1310 PyBuffer_Release(&buffer);
1311 return bytes;
1312}
1313
1314static PyObject *
1315getargs_s_hash(PyObject *self, PyObject *args)
1316{
1317 char *str;
1318 Py_ssize_t size;
1319 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1320 return NULL;
1321 return PyBytes_FromStringAndSize(str, size);
1322}
1323
1324static PyObject *
1325getargs_z(PyObject *self, PyObject *args)
1326{
1327 char *str;
1328 if (!PyArg_ParseTuple(args, "z", &str))
1329 return NULL;
1330 if (str != NULL)
1331 return PyBytes_FromString(str);
1332 else
1333 Py_RETURN_NONE;
1334}
1335
1336static PyObject *
1337getargs_z_star(PyObject *self, PyObject *args)
1338{
1339 Py_buffer buffer;
1340 PyObject *bytes;
1341 if (!PyArg_ParseTuple(args, "z*", &buffer))
1342 return NULL;
1343 if (buffer.buf != NULL)
1344 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1345 else {
1346 Py_INCREF(Py_None);
1347 bytes = Py_None;
1348 }
1349 PyBuffer_Release(&buffer);
1350 return bytes;
1351}
1352
1353static PyObject *
1354getargs_z_hash(PyObject *self, PyObject *args)
1355{
1356 char *str;
1357 Py_ssize_t size;
1358 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1359 return NULL;
1360 if (str != NULL)
1361 return PyBytes_FromStringAndSize(str, size);
1362 else
1363 Py_RETURN_NONE;
1364}
1365
1366static PyObject *
1367getargs_y(PyObject *self, PyObject *args)
1368{
1369 char *str;
1370 if (!PyArg_ParseTuple(args, "y", &str))
1371 return NULL;
1372 return PyBytes_FromString(str);
1373}
1374
1375static PyObject *
1376getargs_y_star(PyObject *self, PyObject *args)
1377{
1378 Py_buffer buffer;
1379 PyObject *bytes;
1380 if (!PyArg_ParseTuple(args, "y*", &buffer))
1381 return NULL;
1382 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1383 PyBuffer_Release(&buffer);
1384 return bytes;
1385}
1386
1387static PyObject *
1388getargs_y_hash(PyObject *self, PyObject *args)
1389{
1390 char *str;
1391 Py_ssize_t size;
1392 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1393 return NULL;
1394 return PyBytes_FromStringAndSize(str, size);
1395}
1396
1397static PyObject *
1398getargs_u(PyObject *self, PyObject *args)
1399{
1400 Py_UNICODE *str;
1401 Py_ssize_t size;
1402 if (!PyArg_ParseTuple(args, "u", &str))
1403 return NULL;
1404 size = Py_UNICODE_strlen(str);
1405 return PyUnicode_FromUnicode(str, size);
1406}
1407
1408static PyObject *
1409getargs_u_hash(PyObject *self, PyObject *args)
1410{
1411 Py_UNICODE *str;
1412 Py_ssize_t size;
1413 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1414 return NULL;
1415 return PyUnicode_FromUnicode(str, size);
1416}
1417
1418static PyObject *
1419getargs_Z(PyObject *self, PyObject *args)
1420{
1421 Py_UNICODE *str;
1422 Py_ssize_t size;
1423 if (!PyArg_ParseTuple(args, "Z", &str))
1424 return NULL;
1425 if (str != NULL) {
1426 size = Py_UNICODE_strlen(str);
1427 return PyUnicode_FromUnicode(str, size);
1428 } else
1429 Py_RETURN_NONE;
1430}
1431
1432static PyObject *
1433getargs_Z_hash(PyObject *self, PyObject *args)
1434{
1435 Py_UNICODE *str;
1436 Py_ssize_t size;
1437 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1438 return NULL;
1439 if (str != NULL)
1440 return PyUnicode_FromUnicode(str, size);
1441 else
1442 Py_RETURN_NONE;
1443}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001444
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001445static PyObject *
1446getargs_es(PyObject *self, PyObject *args)
1447{
1448 PyObject *arg, *result;
1449 const char *encoding = NULL;
1450 char *str;
1451
1452 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1453 return NULL;
1454 if (!PyArg_Parse(arg, "es", encoding, &str))
1455 return NULL;
1456 result = PyBytes_FromString(str);
1457 PyMem_Free(str);
1458 return result;
1459}
1460
1461static PyObject *
1462getargs_et(PyObject *self, PyObject *args)
1463{
1464 PyObject *arg, *result;
1465 const char *encoding = NULL;
1466 char *str;
1467
1468 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1469 return NULL;
1470 if (!PyArg_Parse(arg, "et", encoding, &str))
1471 return NULL;
1472 result = PyBytes_FromString(str);
1473 PyMem_Free(str);
1474 return result;
1475}
1476
1477static PyObject *
1478getargs_es_hash(PyObject *self, PyObject *args)
1479{
1480 PyObject *arg, *result;
1481 const char *encoding = NULL;
1482 PyByteArrayObject *buffer = NULL;
1483 char *str = NULL;
1484 Py_ssize_t size;
1485
1486 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1487 return NULL;
1488 if (buffer != NULL) {
1489 str = PyByteArray_AS_STRING(buffer);
1490 size = PyByteArray_GET_SIZE(buffer);
1491 }
1492 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1493 return NULL;
1494 result = PyBytes_FromStringAndSize(str, size);
1495 if (buffer == NULL)
1496 PyMem_Free(str);
1497 return result;
1498}
1499
1500static PyObject *
1501getargs_et_hash(PyObject *self, PyObject *args)
1502{
1503 PyObject *arg, *result;
1504 const char *encoding = NULL;
1505 PyByteArrayObject *buffer = NULL;
1506 char *str = NULL;
1507 Py_ssize_t size;
1508
1509 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1510 return NULL;
1511 if (buffer != NULL) {
1512 str = PyByteArray_AS_STRING(buffer);
1513 size = PyByteArray_GET_SIZE(buffer);
1514 }
1515 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1516 return NULL;
1517 result = PyBytes_FromStringAndSize(str, size);
1518 if (buffer == NULL)
1519 PyMem_Free(str);
1520 return result;
1521}
1522
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001523/* Test the s and z codes for PyArg_ParseTuple.
1524*/
1525static PyObject *
1526test_s_code(PyObject *self)
1527{
1528 /* Unicode strings should be accepted */
1529 PyObject *tuple, *obj;
1530 char *value;
1531
1532 tuple = PyTuple_New(1);
1533 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001535
1536 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001538 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001540
1541 PyTuple_SET_ITEM(tuple, 0, obj);
1542
1543 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001545 */
1546 if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001548
1549 if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001551
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001552 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001553 Py_RETURN_NONE;
1554}
1555
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001556static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001557parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001558{
Larry Hastings8f904da2012-06-22 03:56:29 -07001559 PyObject *sub_args;
1560 PyObject *sub_kwargs;
1561 char *sub_format;
1562 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001563
Larry Hastings8f904da2012-06-22 03:56:29 -07001564 Py_ssize_t i, size;
1565 char *keywords[8 + 1]; /* space for NULL at end */
1566 PyObject *o;
1567 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001568
Larry Hastings8f904da2012-06-22 03:56:29 -07001569 int result;
1570 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001571
Larry Hastings22701e82012-08-08 14:52:22 -07001572 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001573
Larry Hastings8f904da2012-06-22 03:56:29 -07001574 if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords",
1575 &sub_args, &sub_kwargs,
1576 &sub_format, &sub_keywords))
1577 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001578
Larry Hastings8f904da2012-06-22 03:56:29 -07001579 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1580 PyErr_SetString(PyExc_ValueError,
1581 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1582 return NULL;
1583 }
1584
1585 memset(buffers, 0, sizeof(buffers));
1586 memset(converted, 0, sizeof(converted));
1587 memset(keywords, 0, sizeof(keywords));
1588
1589 size = PySequence_Fast_GET_SIZE(sub_keywords);
1590 if (size > 8) {
1591 PyErr_SetString(PyExc_ValueError,
1592 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1593 goto exit;
1594 }
1595
1596 for (i = 0; i < size; i++) {
1597 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1598 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1599 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001600 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001601 goto exit;
1602 }
1603 keywords[i] = PyBytes_AS_STRING(converted[i]);
1604 }
1605
1606 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1607 sub_format, keywords,
1608 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1609 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1610
1611 if (result) {
1612 return_value = Py_None;
1613 Py_INCREF(Py_None);
1614 }
1615
1616exit:
1617 size = sizeof(converted) / sizeof(converted[0]);
1618 for (i = 0; i < size; i++) {
1619 Py_XDECREF(converted[i]);
1620 }
1621 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001622}
1623
Benjamin Peterson92035012008-12-27 16:00:54 +00001624static volatile int x;
1625
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001626/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1627 of an error.
1628*/
1629static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001630test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001631{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 PyObject *tuple, *obj;
1633 Py_UNICODE *value;
1634 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1637 /* Just use the macro and check that it compiles */
1638 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 tuple = PyTuple_New(1);
1641 if (tuple == NULL)
1642 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001644 obj = PyUnicode_Decode("test", strlen("test"),
1645 "ascii", NULL);
1646 if (obj == NULL)
1647 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 value = 0;
1652 if (PyArg_ParseTuple(tuple, "u:test_u_code", &value) < 0)
1653 return NULL;
1654 if (value != PyUnicode_AS_UNICODE(obj))
1655 return raiseTestError("test_u_code",
1656 "u code returned wrong value for u'test'");
1657 value = 0;
1658 if (PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len) < 0)
1659 return NULL;
1660 if (value != PyUnicode_AS_UNICODE(obj) ||
1661 len != PyUnicode_GET_SIZE(obj))
1662 return raiseTestError("test_u_code",
1663 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 Py_DECREF(tuple);
1666 Py_INCREF(Py_None);
1667 return Py_None;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001668}
1669
Guido van Rossumfb67be22007-08-29 18:38:11 +00001670/* Test Z and Z# codes for PyArg_ParseTuple */
1671static PyObject *
1672test_Z_code(PyObject *self)
1673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001675 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 tuple = PyTuple_New(2);
1679 if (tuple == NULL)
1680 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 obj = PyUnicode_FromString("test");
1683 PyTuple_SET_ITEM(tuple, 0, obj);
1684 Py_INCREF(Py_None);
1685 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 /* swap values on purpose */
1688 value1 = NULL;
1689 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 /* Test Z for both values */
1692 if (PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2) < 0)
1693 return NULL;
1694 if (value1 != PyUnicode_AS_UNICODE(obj))
1695 return raiseTestError("test_Z_code",
1696 "Z code returned wrong value for 'test'");
1697 if (value2 != NULL)
1698 return raiseTestError("test_Z_code",
1699 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 value1 = NULL;
1702 value2 = PyUnicode_AS_UNICODE(obj);
1703 len1 = -1;
1704 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 /* Test Z# for both values */
1707 if (PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1708 &value2, &len2) < 0)
1709 return NULL;
1710 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1711 len1 != PyUnicode_GET_SIZE(obj))
1712 return raiseTestError("test_Z_code",
1713 "Z# code returned wrong values for 'test'");
1714 if (value2 != NULL ||
1715 len2 != 0)
1716 return raiseTestError("test_Z_code",
1717 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 Py_DECREF(tuple);
1720 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001721}
1722
Thomas Wouters477c8d52006-05-27 19:21:47 +00001723static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001724test_widechar(PyObject *self)
1725{
1726#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1728 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001729 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001730#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1732 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001733#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1737 if (wide == NULL)
1738 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1741 if (utf8 == NULL) {
1742 Py_DECREF(wide);
1743 return NULL;
1744 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001745
Victor Stinner8ef18872011-11-21 02:06:57 +01001746 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 Py_DECREF(wide);
1748 Py_DECREF(utf8);
1749 return raiseTestError("test_widechar",
1750 "wide string and utf8 string "
1751 "have different length");
1752 }
1753 if (PyUnicode_Compare(wide, utf8)) {
1754 Py_DECREF(wide);
1755 Py_DECREF(utf8);
1756 if (PyErr_Occurred())
1757 return NULL;
1758 return raiseTestError("test_widechar",
1759 "wide string and utf8 string "
1760 "are different");
1761 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 Py_DECREF(wide);
1764 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001765
1766#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1767 wide = PyUnicode_FromWideChar(invalid, 1);
1768 if (wide == NULL)
1769 PyErr_Clear();
1770 else
1771 return raiseTestError("test_widechar",
1772 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1773
1774 wide = PyUnicode_FromUnicode(invalid, 1);
1775 if (wide == NULL)
1776 PyErr_Clear();
1777 else
1778 return raiseTestError("test_widechar",
1779 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001780
1781 wide = PyUnicode_FromUnicode(NULL, 1);
1782 if (wide == NULL)
1783 return NULL;
1784 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001785 if (_PyUnicode_Ready(wide) < 0) {
1786 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001787 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001788 }
1789 else {
1790 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001791 return raiseTestError("test_widechar",
1792 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001793 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001794#endif
1795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001797}
1798
1799static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001800unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001801{
1802 PyObject *unicode, *result;
1803 Py_ssize_t buflen, size;
1804 wchar_t *buffer;
1805
1806 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1807 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001808 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001809 if (buffer == NULL)
1810 return PyErr_NoMemory();
1811
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001812 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001813 if (size == -1) {
1814 PyMem_Free(buffer);
1815 return NULL;
1816 }
1817
1818 if (size < buflen)
1819 buflen = size + 1;
1820 else
1821 buflen = size;
1822 result = PyUnicode_FromWideChar(buffer, buflen);
1823 PyMem_Free(buffer);
1824 if (result == NULL)
1825 return NULL;
1826
1827 return Py_BuildValue("(Nn)", result, size);
1828}
1829
1830static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001831unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001832{
1833 PyObject *unicode, *result;
1834 Py_ssize_t size;
1835 wchar_t *buffer;
1836
1837 if (!PyArg_ParseTuple(args, "U", &unicode))
1838 return NULL;
1839
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001840 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001841 if (buffer == NULL)
1842 return NULL;
1843
1844 result = PyUnicode_FromWideChar(buffer, size + 1);
1845 PyMem_Free(buffer);
1846 if (result == NULL)
1847 return NULL;
1848 return Py_BuildValue("(Nn)", result, size);
1849}
1850
1851static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001852unicode_asucs4(PyObject *self, PyObject *args)
1853{
1854 PyObject *unicode, *result;
1855 Py_UCS4 *buffer;
1856 int copy_null;
1857 Py_ssize_t str_len, buf_len;
1858
1859 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1860 return NULL;
1861 }
1862
1863 buf_len = str_len + 1;
1864 buffer = PyMem_NEW(Py_UCS4, buf_len);
1865 if (buffer == NULL) {
1866 return PyErr_NoMemory();
1867 }
1868 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1869 buffer[str_len] = 0xffffU;
1870
1871 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1872 PyMem_FREE(buffer);
1873 return NULL;
1874 }
1875
1876 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1877 PyMem_FREE(buffer);
1878 return result;
1879}
1880
1881static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001882unicode_copycharacters(PyObject *self, PyObject *args)
1883{
1884 PyObject *from, *to, *to_copy;
1885 Py_ssize_t from_start, to_start, how_many, copied;
1886
1887 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1888 &from, &from_start, &how_many)) {
1889 return NULL;
1890 }
1891
1892 if (PyUnicode_READY(to) < 0) {
1893 return NULL;
1894 }
1895
1896 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1897 PyUnicode_MAX_CHAR_VALUE(to)))) {
1898 return NULL;
1899 }
1900 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
1901 Py_DECREF(to_copy);
1902 return NULL;
1903 }
1904
1905 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
1906 from_start, how_many)) < 0) {
1907 Py_DECREF(to_copy);
1908 return NULL;
1909 }
1910
1911 return Py_BuildValue("(Nn)", to_copy, copied);
1912}
1913
1914static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001915unicode_encodedecimal(PyObject *self, PyObject *args)
1916{
1917 Py_UNICODE *unicode;
1918 Py_ssize_t length;
1919 char *errors = NULL;
1920 PyObject *decimal;
1921 Py_ssize_t decimal_length, new_length;
1922 int res;
1923
1924 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1925 return NULL;
1926
1927 decimal_length = length * 7; /* len('&#8364;') */
1928 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1929 if (decimal == NULL)
1930 return NULL;
1931
1932 res = PyUnicode_EncodeDecimal(unicode, length,
1933 PyBytes_AS_STRING(decimal),
1934 errors);
1935 if (res < 0) {
1936 Py_DECREF(decimal);
1937 return NULL;
1938 }
1939
1940 new_length = strlen(PyBytes_AS_STRING(decimal));
1941 assert(new_length <= decimal_length);
1942 res = _PyBytes_Resize(&decimal, new_length);
1943 if (res < 0)
1944 return NULL;
1945
1946 return decimal;
1947}
1948
1949static PyObject *
1950unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1951{
1952 Py_UNICODE *unicode;
1953 Py_ssize_t length;
1954 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1955 return NULL;
1956 return PyUnicode_TransformDecimalToASCII(unicode, length);
1957}
1958
1959static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001960unicode_legacy_string(PyObject *self, PyObject *args)
1961{
1962 Py_UNICODE *data;
1963 Py_ssize_t len;
1964 PyObject *u;
1965
1966 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1967 return NULL;
1968
1969 u = PyUnicode_FromUnicode(NULL, len);
1970 if (u == NULL)
1971 return NULL;
1972
1973 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1974
1975 if (len > 0) { /* The empty string is always ready. */
1976 assert(!PyUnicode_IS_READY(u));
1977 }
1978
1979 return u;
1980}
1981
1982static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001983getargs_w_star(PyObject *self, PyObject *args)
1984{
1985 Py_buffer buffer;
1986 PyObject *result;
1987 char *str;
1988
1989 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1990 return NULL;
1991
1992 if (2 <= buffer.len) {
1993 str = buffer.buf;
1994 str[0] = '[';
1995 str[buffer.len-1] = ']';
1996 }
1997
1998 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1999 PyBuffer_Release(&buffer);
2000 return result;
2001}
2002
2003
2004static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00002005test_empty_argparse(PyObject *self)
2006{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002007 /* Test that formats can begin with '|'. See issue #4720. */
2008 PyObject *tuple, *dict = NULL;
2009 static char *kwlist[] = {NULL};
2010 int result;
2011 tuple = PyTuple_New(0);
2012 if (!tuple)
2013 return NULL;
2014 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
2015 goto done;
2016 dict = PyDict_New();
2017 if (!dict)
2018 goto done;
2019 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002020 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 Py_DECREF(tuple);
2022 Py_XDECREF(dict);
2023 if (result < 0)
2024 return NULL;
2025 else {
2026 Py_RETURN_NONE;
2027 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002028}
2029
2030static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002031codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 const char *encoding, *errors = NULL;
2034 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2035 &encoding, &errors))
2036 return NULL;
2037 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002038}
2039
Thomas Wouters477c8d52006-05-27 19:21:47 +00002040static PyObject *
2041codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 const char *encoding, *errors = NULL;
2044 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2045 &encoding, &errors))
2046 return NULL;
2047 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002048}
2049
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002050
Tim Peters5b8132f2003-01-31 15:52:05 +00002051/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002052static PyObject *
2053test_long_numbits(PyObject *self)
2054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 struct triple {
2056 long input;
2057 size_t nbits;
2058 int sign;
2059 } testcases[] = {{0, 0, 0},
2060 {1L, 1, 1},
2061 {-1L, 1, -1},
2062 {2L, 2, 1},
2063 {-2L, 2, -1},
2064 {3L, 2, 1},
2065 {-3L, 2, -1},
2066 {4L, 3, 1},
2067 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002068 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 {-0x7fffL, 15, -1},
2070 {0xffffL, 16, 1},
2071 {-0xffffL, 16, -1},
2072 {0xfffffffL, 28, 1},
2073 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002074 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002075
Victor Stinner63941882011-09-29 00:42:28 +02002076 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002077 size_t nbits;
2078 int sign;
2079 PyObject *plong;
2080
2081 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002082 if (plong == NULL)
2083 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002084 nbits = _PyLong_NumBits(plong);
2085 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 Py_DECREF(plong);
2088 if (nbits != testcases[i].nbits)
2089 return raiseTestError("test_long_numbits",
2090 "wrong result for _PyLong_NumBits");
2091 if (sign != testcases[i].sign)
2092 return raiseTestError("test_long_numbits",
2093 "wrong result for _PyLong_Sign");
2094 }
2095 Py_INCREF(Py_None);
2096 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002097}
2098
Thomas Heller519a0422007-11-15 20:48:54 +00002099/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002100
2101static PyObject *
2102test_null_strings(PyObject *self)
2103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2105 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2106 Py_XDECREF(o1);
2107 Py_XDECREF(o2);
2108 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002109}
2110
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002111static PyObject *
2112raise_exception(PyObject *self, PyObject *args)
2113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 PyObject *exc;
2115 PyObject *exc_args, *v;
2116 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2119 &exc, &num_args))
2120 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 exc_args = PyTuple_New(num_args);
2123 if (exc_args == NULL)
2124 return NULL;
2125 for (i = 0; i < num_args; ++i) {
2126 v = PyLong_FromLong(i);
2127 if (v == NULL) {
2128 Py_DECREF(exc_args);
2129 return NULL;
2130 }
2131 PyTuple_SET_ITEM(exc_args, i, v);
2132 }
2133 PyErr_SetObject(exc, exc_args);
2134 Py_DECREF(exc_args);
2135 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002136}
Tim Peters91621db2001-06-12 20:10:01 +00002137
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002138static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002139set_errno(PyObject *self, PyObject *args)
2140{
2141 int new_errno;
2142
2143 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2144 return NULL;
2145
2146 errno = new_errno;
2147 Py_RETURN_NONE;
2148}
2149
2150static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002151test_set_exc_info(PyObject *self, PyObject *args)
2152{
2153 PyObject *orig_exc;
2154 PyObject *new_type, *new_value, *new_tb;
2155 PyObject *type, *value, *tb;
2156 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2157 &new_type, &new_value, &new_tb))
2158 return NULL;
2159
2160 PyErr_GetExcInfo(&type, &value, &tb);
2161
2162 Py_INCREF(new_type);
2163 Py_INCREF(new_value);
2164 Py_INCREF(new_tb);
2165 PyErr_SetExcInfo(new_type, new_value, new_tb);
2166
2167 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2168 Py_XDECREF(type);
2169 Py_XDECREF(value);
2170 Py_XDECREF(tb);
2171 return orig_exc;
2172}
Benjamin Peterson16323982010-02-03 01:13:41 +00002173
2174static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002175
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002176static PyObject *
2177test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 if (PyDateTimeAPI) {
2179 if (test_run_counter) {
2180 /* Probably regrtest.py -R */
2181 Py_RETURN_NONE;
2182 }
2183 else {
2184 PyErr_SetString(PyExc_AssertionError,
2185 "PyDateTime_CAPI somehow initialized");
2186 return NULL;
2187 }
2188 }
2189 test_run_counter++;
2190 PyDateTime_IMPORT;
2191 if (PyDateTimeAPI)
2192 Py_RETURN_NONE;
2193 else
2194 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002195}
2196
Benjamin Peterson16323982010-02-03 01:13:41 +00002197
2198#ifdef WITH_THREAD
2199
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002200/* test_thread_state spawns a thread of its own, and that thread releases
2201 * `thread_done` when it's finished. The driver code has to know when the
2202 * thread finishes, because the thread uses a PyObject (the callable) that
2203 * may go away when the driver finishes. The former lack of this explicit
2204 * synchronization caused rare segfaults, so rare that they were seen only
2205 * on a Mac buildbot (although they were possible on any box).
2206 */
2207static PyThread_type_lock thread_done = NULL;
2208
Benjamin Petersona786b022008-08-25 21:05:21 +00002209static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002210_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 PyObject *rc;
2213 int success;
2214 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002215 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 success = (rc != NULL);
2217 Py_XDECREF(rc);
2218 PyGILState_Release(s);
2219 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002220}
2221
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002222/* Same thing, but releases `thread_done` when it returns. This variant
2223 * should be called only from threads spawned by test_thread_state().
2224 */
2225static void
2226_make_call_from_thread(void *callable)
2227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228 _make_call(callable);
2229 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002230}
2231
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002232static PyObject *
2233test_thread_state(PyObject *self, PyObject *args)
2234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002235 PyObject *fn;
2236 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2239 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 if (!PyCallable_Check(fn)) {
2242 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2243 fn->ob_type->tp_name);
2244 return NULL;
2245 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002247 /* Ensure Python is set up for threading */
2248 PyEval_InitThreads();
2249 thread_done = PyThread_allocate_lock();
2250 if (thread_done == NULL)
2251 return PyErr_NoMemory();
2252 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 /* Start a new thread with our callback. */
2255 PyThread_start_new_thread(_make_call_from_thread, fn);
2256 /* Make the callback with the thread lock held by this thread */
2257 success &= _make_call(fn);
2258 /* Do it all again, but this time with the thread-lock released */
2259 Py_BEGIN_ALLOW_THREADS
2260 success &= _make_call(fn);
2261 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2262 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 /* And once more with and without a thread
2265 XXX - should use a lock and work out exactly what we are trying
2266 to test <wink>
2267 */
2268 Py_BEGIN_ALLOW_THREADS
2269 PyThread_start_new_thread(_make_call_from_thread, fn);
2270 success &= _make_call(fn);
2271 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2272 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 /* Release lock we acquired above. This is required on HP-UX. */
2275 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 PyThread_free_lock(thread_done);
2278 if (!success)
2279 return NULL;
2280 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002281}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002282
2283/* test Py_AddPendingCalls using threads */
2284static int _pending_callback(void *arg)
2285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 /* we assume the argument is callable object to which we own a reference */
2287 PyObject *callable = (PyObject *)arg;
2288 PyObject *r = PyObject_CallObject(callable, NULL);
2289 Py_DECREF(callable);
2290 Py_XDECREF(r);
2291 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002292}
2293
2294/* The following requests n callbacks to _pending_callback. It can be
2295 * run from any python thread.
2296 */
2297PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
2298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 PyObject *callable;
2300 int r;
2301 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2302 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002304 /* create the reference for the callbackwhile we hold the lock */
2305 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 Py_BEGIN_ALLOW_THREADS
2308 r = Py_AddPendingCall(&_pending_callback, callable);
2309 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002311 if (r<0) {
2312 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
2313 Py_INCREF(Py_False);
2314 return Py_False;
2315 }
2316 Py_INCREF(Py_True);
2317 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002318}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002319#endif
2320
Neal Norwitzb0d26332007-08-25 00:49:05 +00002321/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002322static PyObject *
2323test_string_from_format(PyObject *self, PyObject *args)
2324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 PyObject *result;
2326 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002327
Alexander Belopolskye239d232010-12-08 23:31:48 +00002328#define CHECK_1_FORMAT(FORMAT, TYPE) \
2329 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2330 if (result == NULL) \
2331 return NULL; \
Victor Stinner2b979bf2011-11-20 19:32:09 +01002332 if (PyUnicode_CompareWithASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002333 msg = FORMAT " failed at 1"; \
2334 goto Fail; \
2335 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 CHECK_1_FORMAT("%d", int);
2339 CHECK_1_FORMAT("%ld", long);
2340 /* The z width modifier was added in Python 2.5. */
2341 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 /* The u type code was added in Python 2.5. */
2344 CHECK_1_FORMAT("%u", unsigned int);
2345 CHECK_1_FORMAT("%lu", unsigned long);
2346 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002349 CHECK_1_FORMAT("%llu", unsigned long long);
2350 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002353
2354 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 Py_XDECREF(result);
2356 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002357
2358#undef CHECK_1_FORMAT
2359}
2360
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002361
2362static PyObject *
2363test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2365 int result;
2366 if (py_s == NULL)
2367 return NULL;
2368 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2369 Py_DECREF(py_s);
2370 if (!result) {
2371 PyErr_SetString(TestError, "Python string ending in NULL "
2372 "should not compare equal to c string.");
2373 return NULL;
2374 }
2375 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002376}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002377
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002378/* This is here to provide a docstring for test_descr. */
2379static PyObject *
2380test_with_docstring(PyObject *self)
2381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002383}
2384
Mark Dickinson725bfd82009-05-03 20:33:40 +00002385/* Test PyOS_string_to_double. */
2386static PyObject *
2387test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 double result;
2389 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391#define CHECK_STRING(STR, expected) \
2392 result = PyOS_string_to_double(STR, NULL, NULL); \
2393 if (result == -1.0 && PyErr_Occurred()) \
2394 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002395 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 msg = "conversion of " STR " to float failed"; \
2397 goto fail; \
2398 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400#define CHECK_INVALID(STR) \
2401 result = PyOS_string_to_double(STR, NULL, NULL); \
2402 if (result == -1.0 && PyErr_Occurred()) { \
2403 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2404 PyErr_Clear(); \
2405 else \
2406 return NULL; \
2407 } \
2408 else { \
2409 msg = "conversion of " STR " didn't raise ValueError"; \
2410 goto fail; \
2411 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 CHECK_STRING("0.1", 0.1);
2414 CHECK_STRING("1.234", 1.234);
2415 CHECK_STRING("-1.35", -1.35);
2416 CHECK_STRING(".1e01", 1.0);
2417 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 CHECK_INVALID(" 0.1");
2420 CHECK_INVALID("\t\n-3");
2421 CHECK_INVALID(".123 ");
2422 CHECK_INVALID("3\n");
2423 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002426 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002428#undef CHECK_STRING
2429#undef CHECK_INVALID
2430}
2431
2432
Benjamin Petersonb173f782009-05-05 22:31:58 +00002433/* Coverage testing of capsule objects. */
2434
2435static const char *capsule_name = "capsule name";
2436static char *capsule_pointer = "capsule pointer";
2437static char *capsule_context = "capsule context";
2438static const char *capsule_error = NULL;
2439static int
2440capsule_destructor_call_count = 0;
2441
2442static void
2443capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 capsule_destructor_call_count++;
2445 if (PyCapsule_GetContext(o) != capsule_context) {
2446 capsule_error = "context did not match in destructor!";
2447 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2448 capsule_error = "destructor did not match in destructor! (woah!)";
2449 } else if (PyCapsule_GetName(o) != capsule_name) {
2450 capsule_error = "name did not match in destructor!";
2451 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2452 capsule_error = "pointer did not match in destructor!";
2453 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002454}
2455
2456typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 char *name;
2458 char *module;
2459 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002460} known_capsule;
2461
2462static PyObject *
2463test_capsule(PyObject *self, PyObject *args)
2464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 PyObject *object;
2466 const char *error = NULL;
2467 void *pointer;
2468 void *pointer2;
2469 known_capsule known_capsules[] = {
2470 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2471 KNOWN_CAPSULE("_socket", "CAPI"),
2472 KNOWN_CAPSULE("_curses", "_C_API"),
2473 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2474 { NULL, NULL },
2475 };
2476 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002477
2478#define FAIL(x) { error = (x); goto exit; }
2479
2480#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 if (capsule_error) { \
2482 FAIL(capsule_error); \
2483 } \
2484 else if (!capsule_destructor_call_count) { \
2485 FAIL("destructor not called!"); \
2486 } \
2487 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2490 PyCapsule_SetContext(object, capsule_context);
2491 capsule_destructor(object);
2492 CHECK_DESTRUCTOR;
2493 Py_DECREF(object);
2494 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 object = PyCapsule_New(known, "ignored", NULL);
2497 PyCapsule_SetPointer(object, capsule_pointer);
2498 PyCapsule_SetName(object, capsule_name);
2499 PyCapsule_SetDestructor(object, capsule_destructor);
2500 PyCapsule_SetContext(object, capsule_context);
2501 capsule_destructor(object);
2502 CHECK_DESTRUCTOR;
2503 /* intentionally access using the wrong name */
2504 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2505 if (!PyErr_Occurred()) {
2506 FAIL("PyCapsule_GetPointer should have failed but did not!");
2507 }
2508 PyErr_Clear();
2509 if (pointer2) {
2510 if (pointer2 == capsule_pointer) {
2511 FAIL("PyCapsule_GetPointer should not have"
2512 " returned the internal pointer!");
2513 } else {
2514 FAIL("PyCapsule_GetPointer should have "
2515 "returned NULL pointer but did not!");
2516 }
2517 }
2518 PyCapsule_SetDestructor(object, NULL);
2519 Py_DECREF(object);
2520 if (capsule_destructor_call_count) {
2521 FAIL("destructor called when it should not have been!");
2522 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 for (known = &known_capsules[0]; known->module != NULL; known++) {
2525 /* yeah, ordinarily I wouldn't do this either,
2526 but it's fine for this test harness.
2527 */
2528 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002529#undef FAIL
2530#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531 { \
2532 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2533 x, known->module, known->attribute); \
2534 error = buffer; \
2535 goto exit; \
2536 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 PyObject *module = PyImport_ImportModule(known->module);
2539 if (module) {
2540 pointer = PyCapsule_Import(known->name, 0);
2541 if (!pointer) {
2542 Py_DECREF(module);
2543 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2544 }
2545 object = PyObject_GetAttrString(module, known->attribute);
2546 if (!object) {
2547 Py_DECREF(module);
2548 return NULL;
2549 }
2550 pointer2 = PyCapsule_GetPointer(object,
2551 "weebles wobble but they don't fall down");
2552 if (!PyErr_Occurred()) {
2553 Py_DECREF(object);
2554 Py_DECREF(module);
2555 FAIL("PyCapsule_GetPointer should have failed but did not!");
2556 }
2557 PyErr_Clear();
2558 if (pointer2) {
2559 Py_DECREF(module);
2560 Py_DECREF(object);
2561 if (pointer2 == pointer) {
2562 FAIL("PyCapsule_GetPointer should not have"
2563 " returned its internal pointer!");
2564 } else {
2565 FAIL("PyCapsule_GetPointer should have"
2566 " returned NULL pointer but did not!");
2567 }
2568 }
2569 Py_DECREF(object);
2570 Py_DECREF(module);
2571 }
2572 else
2573 PyErr_Clear();
2574 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002575
2576 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002577 if (error) {
2578 return raiseTestError("test_capsule", error);
2579 }
2580 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002581#undef FAIL
2582}
2583
Guido van Rossumddefaf32007-01-14 03:31:43 +00002584#ifdef HAVE_GETTIMEOFDAY
2585/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002586static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002588 e->tv_sec -= s->tv_sec;
2589 e->tv_usec -= s->tv_usec;
2590 if (e->tv_usec < 0) {
2591 e->tv_sec -=1;
2592 e->tv_usec += 1000000;
2593 }
2594 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002595}
2596
2597static PyObject *
2598profile_int(PyObject *self, PyObject* args)
2599{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 int i, k;
2601 struct timeval start, stop;
2602 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002604 /* Test 1: Allocate and immediately deallocate
2605 many small integers */
2606 gettimeofday(&start, NULL);
2607 for(k=0; k < 20000; k++)
2608 for(i=0; i < 1000; i++) {
2609 single = PyLong_FromLong(i);
2610 Py_DECREF(single);
2611 }
2612 gettimeofday(&stop, NULL);
2613 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 /* Test 2: Allocate and immediately deallocate
2616 many large integers */
2617 gettimeofday(&start, NULL);
2618 for(k=0; k < 20000; k++)
2619 for(i=0; i < 1000; i++) {
2620 single = PyLong_FromLong(i+1000000);
2621 Py_DECREF(single);
2622 }
2623 gettimeofday(&stop, NULL);
2624 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002626 /* Test 3: Allocate a few integers, then release
2627 them all simultaneously. */
2628 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002629 if (multiple == NULL)
2630 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 gettimeofday(&start, NULL);
2632 for(k=0; k < 20000; k++) {
2633 for(i=0; i < 1000; i++) {
2634 multiple[i] = PyLong_FromLong(i+1000000);
2635 }
2636 for(i=0; i < 1000; i++) {
2637 Py_DECREF(multiple[i]);
2638 }
2639 }
2640 gettimeofday(&stop, NULL);
2641 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002642 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 /* Test 4: Allocate many integers, then release
2645 them all simultaneously. */
2646 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002647 if (multiple == NULL)
2648 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 gettimeofday(&start, NULL);
2650 for(k=0; k < 20; k++) {
2651 for(i=0; i < 1000000; i++) {
2652 multiple[i] = PyLong_FromLong(i+1000000);
2653 }
2654 for(i=0; i < 1000000; i++) {
2655 Py_DECREF(multiple[i]);
2656 }
2657 }
2658 gettimeofday(&stop, NULL);
2659 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002660 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 /* Test 5: Allocate many integers < 32000 */
2663 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002664 if (multiple == NULL)
2665 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 gettimeofday(&start, NULL);
2667 for(k=0; k < 10; k++) {
2668 for(i=0; i < 1000000; i++) {
2669 multiple[i] = PyLong_FromLong(i+1000);
2670 }
2671 for(i=0; i < 1000000; i++) {
2672 Py_DECREF(multiple[i]);
2673 }
2674 }
2675 gettimeofday(&stop, NULL);
2676 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002677 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002679 /* Test 6: Perform small int addition */
2680 op1 = PyLong_FromLong(1);
2681 gettimeofday(&start, NULL);
2682 for(i=0; i < 10000000; i++) {
2683 result = PyNumber_Add(op1, op1);
2684 Py_DECREF(result);
2685 }
2686 gettimeofday(&stop, NULL);
2687 Py_DECREF(op1);
2688 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 /* Test 7: Perform medium int addition */
2691 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002692 if (op1 == NULL)
2693 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 gettimeofday(&start, NULL);
2695 for(i=0; i < 10000000; i++) {
2696 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002697 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 }
2699 gettimeofday(&stop, NULL);
2700 Py_DECREF(op1);
2701 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 Py_INCREF(Py_None);
2704 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002705}
2706#endif
2707
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002708/* To test the format of tracebacks as printed out. */
2709static PyObject *
2710traceback_print(PyObject *self, PyObject *args)
2711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 PyObject *file;
2713 PyObject *traceback;
2714 int result;
2715
2716 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2717 &traceback, &file))
2718 return NULL;
2719
2720 result = PyTraceBack_Print(traceback, file);
2721 if (result < 0)
2722 return NULL;
2723 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002724}
2725
Benjamin Petersone6528212008-07-15 15:32:09 +00002726/* To test the format of exceptions as printed out. */
2727static PyObject *
2728exception_print(PyObject *self, PyObject *args)
2729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 PyObject *value;
2731 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 if (!PyArg_ParseTuple(args, "O:exception_print",
2734 &value))
2735 return NULL;
2736 if (!PyExceptionInstance_Check(value)) {
2737 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2738 return NULL;
2739 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 tb = PyException_GetTraceback(value);
2742 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2743 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002746}
2747
2748
2749
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002750
2751/* reliably raise a MemoryError */
2752static PyObject *
2753raise_memoryerror(PyObject *self)
2754{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 PyErr_NoMemory();
2756 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002757}
2758
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002759/* Issue 6012 */
2760static PyObject *str1, *str2;
2761static int
2762failing_converter(PyObject *obj, void *arg)
2763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 /* Clone str1, then let the conversion fail. */
2765 assert(str1);
2766 str2 = str1;
2767 Py_INCREF(str2);
2768 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002769}
2770static PyObject*
2771argparsing(PyObject *o, PyObject *args)
2772{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 PyObject *res;
2774 str1 = str2 = NULL;
2775 if (!PyArg_ParseTuple(args, "O&O&",
2776 PyUnicode_FSConverter, &str1,
2777 failing_converter, &str2)) {
2778 if (!str2)
2779 /* argument converter not called? */
2780 return NULL;
2781 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002782 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 Py_DECREF(str2);
2784 PyErr_Clear();
2785 return res;
2786 }
2787 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002788}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002789
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002790/* To test that the result of PyCode_NewEmpty has the right members. */
2791static PyObject *
2792code_newempty(PyObject *self, PyObject *args)
2793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794 const char *filename;
2795 const char *funcname;
2796 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2799 &filename, &funcname, &firstlineno))
2800 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002802 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002803}
2804
Georg Brandl1e28a272009-12-28 08:41:01 +00002805/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2806 Run via Lib/test/test_exceptions.py */
2807static PyObject *
2808make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2809{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 const char *name;
2811 const char *doc = NULL;
2812 PyObject *base = NULL;
2813 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002815 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2818 "s|sOO:make_exception_with_doc", kwlist,
2819 &name, &doc, &base, &dict))
2820 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002823}
2824
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002825static PyObject *
2826make_memoryview_from_NULL_pointer(PyObject *self)
2827{
2828 Py_buffer info;
2829 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2830 return NULL;
2831 return PyMemoryView_FromBuffer(&info);
2832}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002833
Stefan Krah7213fcc2015-02-01 16:19:23 +01002834static PyObject *
2835test_from_contiguous(PyObject* self, PyObject *noargs)
2836{
2837 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2838 int init[5] = {0, 1, 2, 3, 4};
2839 Py_ssize_t itemsize = sizeof(int);
2840 Py_ssize_t shape = 5;
2841 Py_ssize_t strides = 2 * itemsize;
2842 Py_buffer view = {
2843 data,
2844 NULL,
2845 5 * itemsize,
2846 itemsize,
2847 1,
2848 1,
2849 NULL,
2850 &shape,
2851 &strides,
2852 NULL,
2853 NULL
2854 };
2855 int *ptr;
2856 int i;
2857
2858 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2859 ptr = view.buf;
2860 for (i = 0; i < 5; i++) {
2861 if (ptr[2*i] != i) {
2862 PyErr_SetString(TestError,
2863 "test_from_contiguous: incorrect result");
2864 return NULL;
2865 }
2866 }
2867
2868 view.buf = &data[8];
2869 view.strides[0] = -2 * itemsize;
2870
2871 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2872 ptr = view.buf;
2873 for (i = 0; i < 5; i++) {
2874 if (*(ptr-2*i) != i) {
2875 PyErr_SetString(TestError,
2876 "test_from_contiguous: incorrect result");
2877 return NULL;
2878 }
2879 }
2880
2881 Py_RETURN_NONE;
2882}
Stefan Krah650c1e82015-02-03 21:43:23 +01002883
Stefan Kraha7559c02015-02-03 22:27:21 +01002884#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01002885extern PyTypeObject _PyBytesIOBuffer_Type;
2886
Stefan Krah5178d912015-02-03 16:57:21 +01002887static PyObject *
2888test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
2889{
Stefan Krah650c1e82015-02-03 21:43:23 +01002890 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01002891 PyObject *b;
2892 char *dummy[1];
2893 int ret, match;
2894
Stefan Krah650c1e82015-02-03 21:43:23 +01002895 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01002896 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
2897 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2898 PyErr_Clear();
2899 if (ret != -1 || match == 0)
2900 goto error;
2901
Stefan Krah650c1e82015-02-03 21:43:23 +01002902 /* bytesiobuf_getbuffer() */
2903 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01002904 if (b == NULL) {
2905 return NULL;
2906 }
2907
2908 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
2909 Py_DECREF(b);
2910 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2911 PyErr_Clear();
2912 if (ret != -1 || match == 0)
2913 goto error;
2914
2915 Py_RETURN_NONE;
2916
2917error:
2918 PyErr_SetString(TestError,
2919 "test_pep3118_obsolete_write_locks: failure");
2920 return NULL;
2921}
Stefan Kraha7559c02015-02-03 22:27:21 +01002922#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002923
Stefan Krah650c1e82015-02-03 21:43:23 +01002924/* This tests functions that historically supported write locks. It is
2925 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
2926 is entitled to segfault in that case. */
2927static PyObject *
2928getbuffer_with_null_view(PyObject* self, PyObject *obj)
2929{
2930 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
2931 return NULL;
2932
2933 Py_RETURN_NONE;
2934}
2935
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002936/* Test that the fatal error from not having a current thread doesn't
2937 cause an infinite loop. Run via Lib/test/test_capi.py */
2938static PyObject *
2939crash_no_current_thread(PyObject *self)
2940{
2941 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002942 /* Using PyThreadState_Get() directly allows the test to pass in
2943 !pydebug mode. However, the test only actually tests anything
2944 in pydebug mode, since that's where the infinite loop was in
2945 the first place. */
2946 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002947 Py_END_ALLOW_THREADS
2948 return NULL;
2949}
2950
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002951/* To run some code in a sub-interpreter. */
2952static PyObject *
2953run_in_subinterp(PyObject *self, PyObject *args)
2954{
2955 const char *code;
2956 int r;
2957 PyThreadState *substate, *mainstate;
2958
2959 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2960 &code))
2961 return NULL;
2962
2963 mainstate = PyThreadState_Get();
2964
2965 PyThreadState_Swap(NULL);
2966
2967 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002968 if (substate == NULL) {
2969 /* Since no new thread state was created, there is no exception to
2970 propagate; raise a fresh one after swapping in the old thread
2971 state. */
2972 PyThreadState_Swap(mainstate);
2973 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2974 return NULL;
2975 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002976 r = PyRun_SimpleString(code);
2977 Py_EndInterpreter(substate);
2978
2979 PyThreadState_Swap(mainstate);
2980
2981 return PyLong_FromLong(r);
2982}
2983
Victor Stinner3c1b3792014-02-17 00:02:43 +01002984static int
2985check_time_rounding(int round)
2986{
Victor Stinner74474232015-09-02 01:43:56 +02002987 if (round != _PyTime_ROUND_FLOOR
2988 && round != _PyTime_ROUND_CEILING
Victor Stinner7667f582015-09-09 01:02:23 +02002989 && round != _PyTime_ROUND_HALF_EVEN) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01002990 PyErr_SetString(PyExc_ValueError, "invalid rounding");
2991 return -1;
2992 }
2993 return 0;
2994}
2995
Victor Stinner5d272cc2012-03-13 13:35:55 +01002996static PyObject *
2997test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2998{
2999 PyObject *obj;
3000 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003001 int round;
3002 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003003 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003004 if (check_time_rounding(round) < 0)
3005 return NULL;
3006 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003007 return NULL;
3008 return _PyLong_FromTime_t(sec);
3009}
3010
3011static PyObject *
3012test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3013{
3014 PyObject *obj;
3015 time_t sec;
3016 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003017 int round;
3018 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003019 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003020 if (check_time_rounding(round) < 0)
3021 return NULL;
3022 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003023 return NULL;
3024 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3025}
3026
Victor Stinner643cd682012-03-02 22:54:03 +01003027static PyObject *
3028test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3029{
3030 PyObject *obj;
3031 time_t sec;
3032 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003033 int round;
3034 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003035 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003036 if (check_time_rounding(round) < 0)
3037 return NULL;
3038 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003039 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003040 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003041}
3042
Antoine Pitrou796564c2013-07-30 19:59:21 +02003043static void
3044slot_tp_del(PyObject *self)
3045{
3046 _Py_IDENTIFIER(__tp_del__);
3047 PyObject *del, *res;
3048 PyObject *error_type, *error_value, *error_traceback;
3049
3050 /* Temporarily resurrect the object. */
3051 assert(self->ob_refcnt == 0);
3052 self->ob_refcnt = 1;
3053
3054 /* Save the current exception, if any. */
3055 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3056
3057 /* Execute __del__ method, if any. */
3058 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3059 if (del != NULL) {
3060 res = PyEval_CallObject(del, NULL);
3061 if (res == NULL)
3062 PyErr_WriteUnraisable(del);
3063 else
3064 Py_DECREF(res);
3065 Py_DECREF(del);
3066 }
3067
3068 /* Restore the saved exception. */
3069 PyErr_Restore(error_type, error_value, error_traceback);
3070
3071 /* Undo the temporary resurrection; can't use DECREF here, it would
3072 * cause a recursive call.
3073 */
3074 assert(self->ob_refcnt > 0);
3075 if (--self->ob_refcnt == 0)
3076 return; /* this is the normal path out */
3077
3078 /* __del__ resurrected it! Make it look like the original Py_DECREF
3079 * never happened.
3080 */
3081 {
3082 Py_ssize_t refcnt = self->ob_refcnt;
3083 _Py_NewReference(self);
3084 self->ob_refcnt = refcnt;
3085 }
3086 assert(!PyType_IS_GC(Py_TYPE(self)) ||
3087 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
3088 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3089 * we need to undo that. */
3090 _Py_DEC_REFTOTAL;
3091 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3092 * chain, so no more to do there.
3093 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3094 * _Py_NewReference bumped tp_allocs: both of those need to be
3095 * undone.
3096 */
3097#ifdef COUNT_ALLOCS
3098 --Py_TYPE(self)->tp_frees;
3099 --Py_TYPE(self)->tp_allocs;
3100#endif
3101}
3102
3103static PyObject *
3104with_tp_del(PyObject *self, PyObject *args)
3105{
3106 PyObject *obj;
3107 PyTypeObject *tp;
3108
3109 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3110 return NULL;
3111 tp = (PyTypeObject *) obj;
3112 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3113 PyErr_Format(PyExc_TypeError,
3114 "heap type expected, got %R", obj);
3115 return NULL;
3116 }
3117 tp->tp_del = slot_tp_del;
3118 Py_INCREF(obj);
3119 return obj;
3120}
3121
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003122static PyMethodDef ml;
3123
3124static PyObject *
3125create_cfunction(PyObject *self, PyObject *args)
3126{
3127 return PyCFunction_NewEx(&ml, self, NULL);
3128}
3129
3130static PyMethodDef ml = {
3131 "create_cfunction",
3132 create_cfunction,
3133 METH_NOARGS,
3134 NULL
3135};
3136
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003137static PyObject *
3138_test_incref(PyObject *ob)
3139{
3140 Py_INCREF(ob);
3141 return ob;
3142}
3143
3144static PyObject *
3145test_xincref_doesnt_leak(PyObject *ob)
3146{
3147 PyObject *obj = PyLong_FromLong(0);
3148 Py_XINCREF(_test_incref(obj));
3149 Py_DECREF(obj);
3150 Py_DECREF(obj);
3151 Py_DECREF(obj);
3152 Py_RETURN_NONE;
3153}
3154
3155static PyObject *
3156test_incref_doesnt_leak(PyObject *ob)
3157{
3158 PyObject *obj = PyLong_FromLong(0);
3159 Py_INCREF(_test_incref(obj));
3160 Py_DECREF(obj);
3161 Py_DECREF(obj);
3162 Py_DECREF(obj);
3163 Py_RETURN_NONE;
3164}
3165
3166static PyObject *
3167test_xdecref_doesnt_leak(PyObject *ob)
3168{
3169 Py_XDECREF(PyLong_FromLong(0));
3170 Py_RETURN_NONE;
3171}
3172
3173static PyObject *
3174test_decref_doesnt_leak(PyObject *ob)
3175{
3176 Py_DECREF(PyLong_FromLong(0));
3177 Py_RETURN_NONE;
3178}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003179
Victor Stinner0507bf52013-07-07 02:05:46 +02003180static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02003181test_incref_decref_API(PyObject *ob)
3182{
3183 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003184 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003185 Py_DecRef(obj);
3186 Py_DecRef(obj);
3187 Py_RETURN_NONE;
3188}
3189
3190static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02003191test_pymem_alloc0(PyObject *self)
3192{
3193 void *ptr;
3194
Victor Stinnerdb067af2014-05-02 22:31:14 +02003195 ptr = PyMem_RawMalloc(0);
3196 if (ptr == NULL) {
3197 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3198 return NULL;
3199 }
3200 PyMem_RawFree(ptr);
3201
3202 ptr = PyMem_RawCalloc(0, 0);
3203 if (ptr == NULL) {
3204 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3205 return NULL;
3206 }
3207 PyMem_RawFree(ptr);
3208
Victor Stinner0507bf52013-07-07 02:05:46 +02003209 ptr = PyMem_Malloc(0);
3210 if (ptr == NULL) {
3211 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3212 return NULL;
3213 }
3214 PyMem_Free(ptr);
3215
Victor Stinnerdb067af2014-05-02 22:31:14 +02003216 ptr = PyMem_Calloc(0, 0);
3217 if (ptr == NULL) {
3218 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3219 return NULL;
3220 }
3221 PyMem_Free(ptr);
3222
Victor Stinner0507bf52013-07-07 02:05:46 +02003223 ptr = PyObject_Malloc(0);
3224 if (ptr == NULL) {
3225 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3226 return NULL;
3227 }
3228 PyObject_Free(ptr);
3229
Victor Stinnerdb067af2014-05-02 22:31:14 +02003230 ptr = PyObject_Calloc(0, 0);
3231 if (ptr == NULL) {
3232 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3233 return NULL;
3234 }
3235 PyObject_Free(ptr);
3236
Victor Stinner0507bf52013-07-07 02:05:46 +02003237 Py_RETURN_NONE;
3238}
3239
3240typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003241 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003242
3243 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003244 size_t calloc_nelem;
3245 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003246 void *realloc_ptr;
3247 size_t realloc_new_size;
3248 void *free_ptr;
3249} alloc_hook_t;
3250
3251static void* hook_malloc (void* ctx, size_t size)
3252{
3253 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3254 hook->malloc_size = size;
3255 return hook->alloc.malloc(hook->alloc.ctx, size);
3256}
3257
Victor Stinnerdb067af2014-05-02 22:31:14 +02003258static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
3259{
3260 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3261 hook->calloc_nelem = nelem;
3262 hook->calloc_elsize = elsize;
3263 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3264}
3265
Victor Stinner0507bf52013-07-07 02:05:46 +02003266static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
3267{
3268 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3269 hook->realloc_ptr = ptr;
3270 hook->realloc_new_size = new_size;
3271 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3272}
3273
3274static void hook_free (void *ctx, void *ptr)
3275{
3276 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3277 hook->free_ptr = ptr;
3278 hook->alloc.free(hook->alloc.ctx, ptr);
3279}
3280
3281static PyObject *
3282test_setallocators(PyMemAllocatorDomain domain)
3283{
3284 PyObject *res = NULL;
3285 const char *error_msg;
3286 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003287 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003288 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003289 void *ptr, *ptr2;
3290
Victor Stinnerdb067af2014-05-02 22:31:14 +02003291 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003292
3293 alloc.ctx = &hook;
3294 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003295 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003296 alloc.realloc = &hook_realloc;
3297 alloc.free = &hook_free;
3298 PyMem_GetAllocator(domain, &hook.alloc);
3299 PyMem_SetAllocator(domain, &alloc);
3300
3301 size = 42;
3302 switch(domain)
3303 {
3304 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3305 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3306 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3307 default: ptr = NULL; break;
3308 }
3309
3310 if (ptr == NULL) {
3311 error_msg = "malloc failed";
3312 goto fail;
3313 }
3314
3315 if (hook.malloc_size != size) {
3316 error_msg = "malloc invalid size";
3317 goto fail;
3318 }
3319
3320 size2 = 200;
3321 switch(domain)
3322 {
3323 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3324 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3325 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003326 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003327 }
3328
3329 if (ptr2 == NULL) {
3330 error_msg = "realloc failed";
3331 goto fail;
3332 }
3333
3334 if (hook.realloc_ptr != ptr
3335 || hook.realloc_new_size != size2) {
3336 error_msg = "realloc invalid parameters";
3337 goto fail;
3338 }
3339
3340 switch(domain)
3341 {
3342 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3343 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3344 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3345 }
3346
3347 if (hook.free_ptr != ptr2) {
3348 error_msg = "free invalid pointer";
3349 goto fail;
3350 }
3351
Victor Stinnerdb067af2014-05-02 22:31:14 +02003352 nelem = 2;
3353 elsize = 5;
3354 switch(domain)
3355 {
3356 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3357 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3358 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3359 default: ptr = NULL; break;
3360 }
3361
3362 if (ptr == NULL) {
3363 error_msg = "calloc failed";
3364 goto fail;
3365 }
3366
3367 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3368 error_msg = "calloc invalid nelem or elsize";
3369 goto fail;
3370 }
3371
3372 switch(domain)
3373 {
3374 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3375 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3376 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3377 }
3378
Victor Stinner0507bf52013-07-07 02:05:46 +02003379 Py_INCREF(Py_None);
3380 res = Py_None;
3381 goto finally;
3382
3383fail:
3384 PyErr_SetString(PyExc_RuntimeError, error_msg);
3385
3386finally:
3387 PyMem_SetAllocator(domain, &hook.alloc);
3388 return res;
3389}
3390
3391static PyObject *
3392test_pymem_setrawallocators(PyObject *self)
3393{
3394 return test_setallocators(PYMEM_DOMAIN_RAW);
3395}
3396
3397static PyObject *
3398test_pymem_setallocators(PyObject *self)
3399{
3400 return test_setallocators(PYMEM_DOMAIN_MEM);
3401}
3402
3403static PyObject *
3404test_pyobject_setallocators(PyObject *self)
3405{
3406 return test_setallocators(PYMEM_DOMAIN_OBJ);
3407}
3408
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003409PyDoc_STRVAR(docstring_empty,
3410""
3411);
3412
3413PyDoc_STRVAR(docstring_no_signature,
3414"This docstring has no signature."
3415);
3416
3417PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003418"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003419"\n"
3420"This docstring has an invalid signature."
3421);
3422
Larry Hastings2623c8c2014-02-08 22:15:29 -08003423PyDoc_STRVAR(docstring_with_invalid_signature2,
3424"docstring_with_invalid_signature2($module, /, boo)\n"
3425"\n"
3426"--\n"
3427"\n"
3428"This docstring also has an invalid signature."
3429);
3430
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003431PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003432"docstring_with_signature($module, /, sig)\n"
3433"--\n"
3434"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003435"This docstring has a valid signature."
3436);
3437
Zachary Ware8ef887c2015-04-13 18:22:35 -05003438PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3439"docstring_with_signature_but_no_doc($module, /, sig)\n"
3440"--\n"
3441"\n"
3442);
3443
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003444PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003445"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3446"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003447"\n"
3448"\n"
3449"This docstring has a valid signature and some extra newlines."
3450);
3451
Larry Hastings16c51912014-01-07 11:53:01 -08003452PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003453"docstring_with_signature_with_defaults(module, s='avocado',\n"
3454" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3455" local=the_number_three, sys=sys.maxsize,\n"
3456" exp=sys.maxsize - 1)\n"
3457"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003458"\n"
3459"\n"
3460"\n"
3461"This docstring has a valid signature with parameters,\n"
3462"and the parameters take defaults of varying types."
3463);
3464
Victor Stinner258e4d32013-12-13 02:30:12 +01003465#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003466typedef struct {
3467 PyThread_type_lock start_event;
3468 PyThread_type_lock exit_event;
3469 PyObject *callback;
3470} test_c_thread_t;
3471
3472static void
3473temporary_c_thread(void *data)
3474{
3475 test_c_thread_t *test_c_thread = data;
3476 PyGILState_STATE state;
3477 PyObject *res;
3478
3479 PyThread_release_lock(test_c_thread->start_event);
3480
3481 /* Allocate a Python thread state for this thread */
3482 state = PyGILState_Ensure();
3483
Victor Stinner3466bde2016-09-05 18:16:01 -07003484 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003485 Py_CLEAR(test_c_thread->callback);
3486
3487 if (res == NULL) {
3488 PyErr_Print();
3489 }
3490 else {
3491 Py_DECREF(res);
3492 }
3493
3494 /* Destroy the Python thread state for this thread */
3495 PyGILState_Release(state);
3496
3497 PyThread_release_lock(test_c_thread->exit_event);
3498
3499 PyThread_exit_thread();
3500}
3501
3502static PyObject *
3503call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3504{
3505 PyObject *res = NULL;
3506 test_c_thread_t test_c_thread;
3507 long thread;
3508
3509 PyEval_InitThreads();
3510
3511 test_c_thread.start_event = PyThread_allocate_lock();
3512 test_c_thread.exit_event = PyThread_allocate_lock();
3513 test_c_thread.callback = NULL;
3514 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3515 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3516 goto exit;
3517 }
3518
3519 Py_INCREF(callback);
3520 test_c_thread.callback = callback;
3521
3522 PyThread_acquire_lock(test_c_thread.start_event, 1);
3523 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3524
3525 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3526 if (thread == -1) {
3527 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3528 PyThread_release_lock(test_c_thread.start_event);
3529 PyThread_release_lock(test_c_thread.exit_event);
3530 goto exit;
3531 }
3532
3533 PyThread_acquire_lock(test_c_thread.start_event, 1);
3534 PyThread_release_lock(test_c_thread.start_event);
3535
3536 Py_BEGIN_ALLOW_THREADS
3537 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3538 PyThread_release_lock(test_c_thread.exit_event);
3539 Py_END_ALLOW_THREADS
3540
3541 Py_INCREF(Py_None);
3542 res = Py_None;
3543
3544exit:
3545 Py_CLEAR(test_c_thread.callback);
3546 if (test_c_thread.start_event)
3547 PyThread_free_lock(test_c_thread.start_event);
3548 if (test_c_thread.exit_event)
3549 PyThread_free_lock(test_c_thread.exit_event);
3550 return res;
3551}
Victor Stinner258e4d32013-12-13 02:30:12 +01003552#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003553
Victor Stinner56e8c292014-07-21 12:30:22 +02003554static PyObject*
3555test_raise_signal(PyObject* self, PyObject *args)
3556{
3557 int signum, err;
3558
3559 if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0)
3560 return NULL;
3561
3562 err = raise(signum);
3563 if (err)
3564 return PyErr_SetFromErrno(PyExc_OSError);
3565
3566 if (PyErr_CheckSignals() < 0)
3567 return NULL;
3568
3569 Py_RETURN_NONE;
3570}
3571
Serhiy Storchakab5181342015-02-06 08:58:56 +02003572/* marshal */
3573
3574static PyObject*
3575pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3576{
3577 long value;
3578 char *filename;
3579 int version;
3580 FILE *fp;
3581
3582 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3583 &value, &filename, &version))
3584 return NULL;
3585
3586 fp = fopen(filename, "wb");
3587 if (fp == NULL) {
3588 PyErr_SetFromErrno(PyExc_OSError);
3589 return NULL;
3590 }
3591
3592 PyMarshal_WriteLongToFile(value, fp, version);
3593
3594 fclose(fp);
3595 if (PyErr_Occurred())
3596 return NULL;
3597 Py_RETURN_NONE;
3598}
3599
3600static PyObject*
3601pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3602{
3603 PyObject *obj;
3604 char *filename;
3605 int version;
3606 FILE *fp;
3607
3608 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3609 &obj, &filename, &version))
3610 return NULL;
3611
3612 fp = fopen(filename, "wb");
3613 if (fp == NULL) {
3614 PyErr_SetFromErrno(PyExc_OSError);
3615 return NULL;
3616 }
3617
3618 PyMarshal_WriteObjectToFile(obj, fp, version);
3619
3620 fclose(fp);
3621 if (PyErr_Occurred())
3622 return NULL;
3623 Py_RETURN_NONE;
3624}
3625
3626static PyObject*
3627pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3628{
3629 int value;
3630 long pos;
3631 char *filename;
3632 FILE *fp;
3633
3634 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3635 return NULL;
3636
3637 fp = fopen(filename, "rb");
3638 if (fp == NULL) {
3639 PyErr_SetFromErrno(PyExc_OSError);
3640 return NULL;
3641 }
3642
3643 value = PyMarshal_ReadShortFromFile(fp);
3644 pos = ftell(fp);
3645
3646 fclose(fp);
3647 if (PyErr_Occurred())
3648 return NULL;
3649 return Py_BuildValue("il", value, pos);
3650}
3651
3652static PyObject*
3653pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3654{
3655 long value, pos;
3656 char *filename;
3657 FILE *fp;
3658
3659 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3660 return NULL;
3661
3662 fp = fopen(filename, "rb");
3663 if (fp == NULL) {
3664 PyErr_SetFromErrno(PyExc_OSError);
3665 return NULL;
3666 }
3667
3668 value = PyMarshal_ReadLongFromFile(fp);
3669 pos = ftell(fp);
3670
3671 fclose(fp);
3672 if (PyErr_Occurred())
3673 return NULL;
3674 return Py_BuildValue("ll", value, pos);
3675}
3676
3677static PyObject*
3678pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3679{
3680 PyObject *obj;
3681 long pos;
3682 char *filename;
3683 FILE *fp;
3684
3685 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3686 return NULL;
3687
3688 fp = fopen(filename, "rb");
3689 if (fp == NULL) {
3690 PyErr_SetFromErrno(PyExc_OSError);
3691 return NULL;
3692 }
3693
3694 obj = PyMarshal_ReadLastObjectFromFile(fp);
3695 pos = ftell(fp);
3696
3697 fclose(fp);
3698 return Py_BuildValue("Nl", obj, pos);
3699}
3700
3701static PyObject*
3702pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3703{
3704 PyObject *obj;
3705 long pos;
3706 char *filename;
3707 FILE *fp;
3708
3709 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3710 return NULL;
3711
3712 fp = fopen(filename, "rb");
3713 if (fp == NULL) {
3714 PyErr_SetFromErrno(PyExc_OSError);
3715 return NULL;
3716 }
3717
3718 obj = PyMarshal_ReadObjectFromFile(fp);
3719 pos = ftell(fp);
3720
3721 fclose(fp);
3722 return Py_BuildValue("Nl", obj, pos);
3723}
3724
Victor Stinnerefde1462015-03-21 15:04:43 +01003725static PyObject*
3726return_null_without_error(PyObject *self, PyObject *args)
3727{
3728 /* invalid call: return NULL without setting an error,
3729 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3730 PyErr_Clear();
3731 return NULL;
3732}
3733
3734static PyObject*
3735return_result_with_error(PyObject *self, PyObject *args)
3736{
3737 /* invalid call: return a result with an error set,
3738 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3739 PyErr_SetNone(PyExc_ValueError);
3740 Py_RETURN_NONE;
3741}
3742
Victor Stinner992c43f2015-03-27 17:12:45 +01003743static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02003744test_pytime_fromseconds(PyObject *self, PyObject *args)
3745{
3746 int seconds;
3747 _PyTime_t ts;
3748
3749 if (!PyArg_ParseTuple(args, "i", &seconds))
3750 return NULL;
3751 ts = _PyTime_FromSeconds(seconds);
3752 return _PyTime_AsNanosecondsObject(ts);
3753}
3754
3755static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01003756test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
3757{
3758 PyObject *obj;
3759 int round;
3760 _PyTime_t ts;
3761
3762 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
3763 return NULL;
3764 if (check_time_rounding(round) < 0)
3765 return NULL;
3766 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
3767 return NULL;
3768 return _PyTime_AsNanosecondsObject(ts);
3769}
3770
Victor Stinner4bfb4602015-03-27 22:27:24 +01003771static PyObject *
3772test_pytime_assecondsdouble(PyObject *self, PyObject *args)
3773{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003774 long long ns;
Victor Stinner4bfb4602015-03-27 22:27:24 +01003775 _PyTime_t ts;
3776 double d;
3777
3778 if (!PyArg_ParseTuple(args, "L", &ns))
3779 return NULL;
3780 ts = _PyTime_FromNanoseconds(ns);
3781 d = _PyTime_AsSecondsDouble(ts);
3782 return PyFloat_FromDouble(d);
3783}
3784
Victor Stinner95e9cef2015-03-28 01:26:47 +01003785static PyObject *
3786test_PyTime_AsTimeval(PyObject *self, PyObject *args)
3787{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003788 long long ns;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003789 int round;
3790 _PyTime_t t;
3791 struct timeval tv;
3792 PyObject *seconds;
3793
3794 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3795 return NULL;
3796 if (check_time_rounding(round) < 0)
3797 return NULL;
3798 t = _PyTime_FromNanoseconds(ns);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +02003799 if (_PyTime_AsTimeval(t, &tv, round) < 0)
Victor Stinner95e9cef2015-03-28 01:26:47 +01003800 return NULL;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003801
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003802 seconds = PyLong_FromLong((long long)tv.tv_sec);
Victor Stinner95e9cef2015-03-28 01:26:47 +01003803 if (seconds == NULL)
3804 return NULL;
3805 return Py_BuildValue("Nl", seconds, tv.tv_usec);
3806}
3807
Victor Stinner34dc0f42015-03-27 18:19:03 +01003808#ifdef HAVE_CLOCK_GETTIME
3809static PyObject *
3810test_PyTime_AsTimespec(PyObject *self, PyObject *args)
3811{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003812 long long ns;
Victor Stinner34dc0f42015-03-27 18:19:03 +01003813 _PyTime_t t;
3814 struct timespec ts;
3815
3816 if (!PyArg_ParseTuple(args, "L", &ns))
3817 return NULL;
3818 t = _PyTime_FromNanoseconds(ns);
3819 if (_PyTime_AsTimespec(t, &ts) == -1)
3820 return NULL;
3821 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
3822}
3823#endif
3824
Victor Stinner62d1c702015-04-01 17:47:07 +02003825static PyObject *
3826test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
3827{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003828 long long ns;
Victor Stinner62d1c702015-04-01 17:47:07 +02003829 int round;
3830 _PyTime_t t, ms;
3831
3832 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3833 return NULL;
3834 if (check_time_rounding(round) < 0)
3835 return NULL;
3836 t = _PyTime_FromNanoseconds(ns);
3837 ms = _PyTime_AsMilliseconds(t, round);
3838 /* This conversion rely on the fact that _PyTime_t is a number of
3839 nanoseconds */
3840 return _PyTime_AsNanosecondsObject(ms);
3841}
3842
3843static PyObject *
3844test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
3845{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003846 long long ns;
Victor Stinner62d1c702015-04-01 17:47:07 +02003847 int round;
3848 _PyTime_t t, ms;
3849
3850 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3851 return NULL;
3852 if (check_time_rounding(round) < 0)
3853 return NULL;
3854 t = _PyTime_FromNanoseconds(ns);
3855 ms = _PyTime_AsMicroseconds(t, round);
3856 /* This conversion rely on the fact that _PyTime_t is a number of
3857 nanoseconds */
3858 return _PyTime_AsNanosecondsObject(ms);
3859}
3860
Victor Stinner50856d52015-10-13 00:11:21 +02003861static PyObject*
3862get_recursion_depth(PyObject *self, PyObject *args)
3863{
3864 PyThreadState *tstate = PyThreadState_GET();
3865
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07003866 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02003867 return PyLong_FromLong(tstate->recursion_depth - 1);
3868}
3869
Victor Stinner34be807c2016-03-14 12:04:26 +01003870static PyObject*
3871pymem_buffer_overflow(PyObject *self, PyObject *args)
3872{
3873 char *buffer;
3874
3875 /* Deliberate buffer overflow to check that PyMem_Free() detects
3876 the overflow when debug hooks are installed. */
3877 buffer = PyMem_Malloc(16);
3878 buffer[16] = 'x';
3879 PyMem_Free(buffer);
3880
3881 Py_RETURN_NONE;
3882}
3883
3884static PyObject*
3885pymem_api_misuse(PyObject *self, PyObject *args)
3886{
3887 char *buffer;
3888
3889 /* Deliberate misusage of Python allocators:
3890 allococate with PyMem but release with PyMem_Raw. */
3891 buffer = PyMem_Malloc(16);
3892 PyMem_RawFree(buffer);
3893
3894 Py_RETURN_NONE;
3895}
3896
Victor Stinnerc4aec362016-03-14 22:26:53 +01003897static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01003898pymem_malloc_without_gil(PyObject *self, PyObject *args)
3899{
3900 char *buffer;
3901
3902 /* Deliberate bug to test debug hooks on Python memory allocators:
3903 call PyMem_Malloc() without holding the GIL */
3904 Py_BEGIN_ALLOW_THREADS
3905 buffer = PyMem_Malloc(10);
3906 Py_END_ALLOW_THREADS
3907
3908 PyMem_Free(buffer);
3909
3910 Py_RETURN_NONE;
3911}
3912
3913static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01003914pyobject_malloc_without_gil(PyObject *self, PyObject *args)
3915{
3916 char *buffer;
3917
Victor Stinnerad524372016-03-16 12:12:53 +01003918 /* Deliberate bug to test debug hooks on Python memory allocators:
3919 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01003920 Py_BEGIN_ALLOW_THREADS
3921 buffer = PyObject_Malloc(10);
3922 Py_END_ALLOW_THREADS
3923
3924 PyObject_Free(buffer);
3925
3926 Py_RETURN_NONE;
3927}
3928
Victor Stinner10b73e12016-03-22 13:39:05 +01003929static PyObject *
3930tracemalloc_track(PyObject *self, PyObject *args)
3931{
3932 unsigned int domain;
3933 PyObject *ptr_obj;
3934 void *ptr;
3935 Py_ssize_t size;
3936 int release_gil = 0;
3937 int res;
3938
3939 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
3940 return NULL;
3941 ptr = PyLong_AsVoidPtr(ptr_obj);
3942 if (PyErr_Occurred())
3943 return NULL;
3944
3945 if (release_gil) {
3946 Py_BEGIN_ALLOW_THREADS
Benjamin Petersonca470632016-09-06 13:47:26 -07003947 res = _PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01003948 Py_END_ALLOW_THREADS
3949 }
3950 else {
Benjamin Petersonca470632016-09-06 13:47:26 -07003951 res = _PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01003952 }
3953
3954 if (res < 0) {
3955 PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
3956 return NULL;
3957 }
3958
3959 Py_RETURN_NONE;
3960}
3961
3962static PyObject *
3963tracemalloc_untrack(PyObject *self, PyObject *args)
3964{
3965 unsigned int domain;
3966 PyObject *ptr_obj;
3967 void *ptr;
3968 int res;
3969
3970 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
3971 return NULL;
3972 ptr = PyLong_AsVoidPtr(ptr_obj);
3973 if (PyErr_Occurred())
3974 return NULL;
3975
Benjamin Petersonca470632016-09-06 13:47:26 -07003976 res = _PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01003977 if (res < 0) {
3978 PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
3979 return NULL;
3980 }
3981
3982 Py_RETURN_NONE;
3983}
3984
3985static PyObject *
3986tracemalloc_get_traceback(PyObject *self, PyObject *args)
3987{
3988 unsigned int domain;
3989 PyObject *ptr_obj;
3990 void *ptr;
3991
3992 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
3993 return NULL;
3994 ptr = PyLong_AsVoidPtr(ptr_obj);
3995 if (PyErr_Occurred())
3996 return NULL;
3997
Benjamin Petersonca470632016-09-06 13:47:26 -07003998 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01003999}
4000
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004001static PyObject *
4002dict_get_version(PyObject *self, PyObject *args)
4003{
4004 PyDictObject *dict;
4005 uint64_t version;
4006
4007 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4008 return NULL;
4009
4010 version = dict->ma_version_tag;
4011
4012 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4013 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4014}
4015
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004016
Tim Peters9ea17ac2001-02-02 05:57:15 +00004017static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004018 {"raise_exception", raise_exception, METH_VARARGS},
4019 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02004020 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004021 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01004022 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004023 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
4024 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
4025 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02004026 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004027 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004028 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07004029 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
4030 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
4031 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
4032 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02004033 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004034 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
4035 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02004036 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
4037 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004038 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
4039 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
4040 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07004041 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004042 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
4043 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
4044 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
4045 PyDoc_STR("This is a pretty normal docstring.")},
4046 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
4047 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
4048 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01004049 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004050#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01004051 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004052#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01004053 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03004054 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03004055 {"get_args", get_args, METH_VARARGS},
4056 {"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004057 {"getargs_tuple", getargs_tuple, METH_VARARGS},
4058 {"getargs_keywords", (PyCFunction)getargs_keywords,
4059 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00004060 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
4061 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03004062 {"getargs_positional_only_and_keywords",
4063 (PyCFunction)getargs_positional_only_and_keywords,
4064 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004065 {"getargs_b", getargs_b, METH_VARARGS},
4066 {"getargs_B", getargs_B, METH_VARARGS},
4067 {"getargs_h", getargs_h, METH_VARARGS},
4068 {"getargs_H", getargs_H, METH_VARARGS},
4069 {"getargs_I", getargs_I, METH_VARARGS},
4070 {"getargs_k", getargs_k, METH_VARARGS},
4071 {"getargs_i", getargs_i, METH_VARARGS},
4072 {"getargs_l", getargs_l, METH_VARARGS},
4073 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07004074 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004075 {"getargs_L", getargs_L, METH_VARARGS},
4076 {"getargs_K", getargs_K, METH_VARARGS},
4077 {"test_longlong_api", test_longlong_api, METH_NOARGS},
4078 {"test_long_long_and_overflow",
4079 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
4080 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03004081 {"getargs_f", getargs_f, METH_VARARGS},
4082 {"getargs_d", getargs_d, METH_VARARGS},
4083 {"getargs_D", getargs_D, METH_VARARGS},
4084 {"getargs_S", getargs_S, METH_VARARGS},
4085 {"getargs_Y", getargs_Y, METH_VARARGS},
4086 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03004087 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004088 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00004089 {"getargs_s", getargs_s, METH_VARARGS},
4090 {"getargs_s_star", getargs_s_star, METH_VARARGS},
4091 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
4092 {"getargs_z", getargs_z, METH_VARARGS},
4093 {"getargs_z_star", getargs_z_star, METH_VARARGS},
4094 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
4095 {"getargs_y", getargs_y, METH_VARARGS},
4096 {"getargs_y_star", getargs_y_star, METH_VARARGS},
4097 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
4098 {"getargs_u", getargs_u, METH_VARARGS},
4099 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
4100 {"getargs_Z", getargs_Z, METH_VARARGS},
4101 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00004102 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004103 {"getargs_es", getargs_es, METH_VARARGS},
4104 {"getargs_et", getargs_et, METH_VARARGS},
4105 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
4106 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004107 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004108 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004109 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004110 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004111 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
4112 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
4113 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
4114 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004115 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
4116 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03004117 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03004118 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004119 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
4120 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01004121 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004122#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00004123 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004124 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004125#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00004126#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00004127 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004128#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00004129 {"traceback_print", traceback_print, METH_VARARGS},
4130 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02004131 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004132 {"argparsing", argparsing, METH_VARARGS},
4133 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004134 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
4135 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00004136 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
4137 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00004138 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004139 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01004140 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
4141 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01004142 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02004143 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04004144 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02004145 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02004146 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
4147 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02004148 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
4149 {"test_pymem_setallocators",
4150 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
4151 {"test_pyobject_setallocators",
4152 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004153 {"no_docstring",
4154 (PyCFunction)test_with_docstring, METH_NOARGS},
4155 {"docstring_empty",
4156 (PyCFunction)test_with_docstring, METH_NOARGS,
4157 docstring_empty},
4158 {"docstring_no_signature",
4159 (PyCFunction)test_with_docstring, METH_NOARGS,
4160 docstring_no_signature},
4161 {"docstring_with_invalid_signature",
4162 (PyCFunction)test_with_docstring, METH_NOARGS,
4163 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004164 {"docstring_with_invalid_signature2",
4165 (PyCFunction)test_with_docstring, METH_NOARGS,
4166 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004167 {"docstring_with_signature",
4168 (PyCFunction)test_with_docstring, METH_NOARGS,
4169 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004170 {"docstring_with_signature_but_no_doc",
4171 (PyCFunction)test_with_docstring, METH_NOARGS,
4172 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004173 {"docstring_with_signature_and_extra_newlines",
4174 (PyCFunction)test_with_docstring, METH_NOARGS,
4175 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004176 {"docstring_with_signature_with_defaults",
4177 (PyCFunction)test_with_docstring, METH_NOARGS,
4178 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02004179 {"raise_signal",
4180 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01004181#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004182 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4183 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01004184#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02004185 {"pymarshal_write_long_to_file",
4186 pymarshal_write_long_to_file, METH_VARARGS},
4187 {"pymarshal_write_object_to_file",
4188 pymarshal_write_object_to_file, METH_VARARGS},
4189 {"pymarshal_read_short_from_file",
4190 pymarshal_read_short_from_file, METH_VARARGS},
4191 {"pymarshal_read_long_from_file",
4192 pymarshal_read_long_from_file, METH_VARARGS},
4193 {"pymarshal_read_last_object_from_file",
4194 pymarshal_read_last_object_from_file, METH_VARARGS},
4195 {"pymarshal_read_object_from_file",
4196 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004197 {"return_null_without_error",
4198 return_null_without_error, METH_NOARGS},
4199 {"return_result_with_error",
4200 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004201 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004202 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4203 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004204 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004205#ifdef HAVE_CLOCK_GETTIME
4206 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4207#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004208 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4209 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004210 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01004211 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
4212 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01004213 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01004214 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01004215 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
4216 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
4217 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004218 {"dict_get_version", dict_get_version, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004219 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00004220};
4221
Thomas Hellera4ea6032003-04-17 18:55:45 +00004222#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
4223
Thomas Wouters89f507f2006-12-13 04:49:30 +00004224typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004225 char bool_member;
4226 char byte_member;
4227 unsigned char ubyte_member;
4228 short short_member;
4229 unsigned short ushort_member;
4230 int int_member;
4231 unsigned int uint_member;
4232 long long_member;
4233 unsigned long ulong_member;
4234 Py_ssize_t pyssizet_member;
4235 float float_member;
4236 double double_member;
4237 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07004238 long long longlong_member;
4239 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004240} all_structmembers;
4241
4242typedef struct {
4243 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004244 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004245} test_structmembers;
4246
4247static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004248 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
4249 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
4250 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
4251 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
4252 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
4253 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
4254 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
4255 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
4256 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
4257 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
4258 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
4259 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
4260 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
4262 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004263 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00004264};
4265
4266
Christian Heimes1af737c2008-01-23 08:24:23 +00004267static PyObject *
4268test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
4269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004270 static char *keywords[] = {
4271 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
4272 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
4273 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004274 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004275 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07004276 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004277 test_structmembers *ob;
4278 const char *s = NULL;
4279 Py_ssize_t string_len = 0;
4280 ob = PyObject_New(test_structmembers, type);
4281 if (ob == NULL)
4282 return NULL;
4283 memset(&ob->structmembers, 0, sizeof(all_structmembers));
4284 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
4285 &ob->structmembers.bool_member,
4286 &ob->structmembers.byte_member,
4287 &ob->structmembers.ubyte_member,
4288 &ob->structmembers.short_member,
4289 &ob->structmembers.ushort_member,
4290 &ob->structmembers.int_member,
4291 &ob->structmembers.uint_member,
4292 &ob->structmembers.long_member,
4293 &ob->structmembers.ulong_member,
4294 &ob->structmembers.pyssizet_member,
4295 &ob->structmembers.float_member,
4296 &ob->structmembers.double_member,
4297 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 , &ob->structmembers.longlong_member,
4299 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 )) {
4301 Py_DECREF(ob);
4302 return NULL;
4303 }
4304 if (s != NULL) {
4305 if (string_len > 5) {
4306 Py_DECREF(ob);
4307 PyErr_SetString(PyExc_ValueError, "string too long");
4308 return NULL;
4309 }
4310 strcpy(ob->structmembers.inplace_member, s);
4311 }
4312 else {
4313 strcpy(ob->structmembers.inplace_member, "");
4314 }
4315 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004316}
4317
Christian Heimes1af737c2008-01-23 08:24:23 +00004318static void
4319test_structmembers_free(PyObject *ob)
4320{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004321 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004322}
4323
4324static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004325 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004326 "test_structmembersType",
4327 sizeof(test_structmembers), /* tp_basicsize */
4328 0, /* tp_itemsize */
4329 test_structmembers_free, /* destructor tp_dealloc */
4330 0, /* tp_print */
4331 0, /* tp_getattr */
4332 0, /* tp_setattr */
4333 0, /* tp_reserved */
4334 0, /* tp_repr */
4335 0, /* tp_as_number */
4336 0, /* tp_as_sequence */
4337 0, /* tp_as_mapping */
4338 0, /* tp_hash */
4339 0, /* tp_call */
4340 0, /* tp_str */
4341 PyObject_GenericGetAttr, /* tp_getattro */
4342 PyObject_GenericSetAttr, /* tp_setattro */
4343 0, /* tp_as_buffer */
4344 0, /* tp_flags */
4345 "Type containing all structmember types",
4346 0, /* traverseproc tp_traverse */
4347 0, /* tp_clear */
4348 0, /* tp_richcompare */
4349 0, /* tp_weaklistoffset */
4350 0, /* tp_iter */
4351 0, /* tp_iternext */
4352 0, /* tp_methods */
4353 test_members, /* tp_members */
4354 0,
4355 0,
4356 0,
4357 0,
4358 0,
4359 0,
4360 0,
4361 0,
4362 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004363};
4364
4365
Benjamin Petersond51374e2014-04-09 23:55:56 -04004366typedef struct {
4367 PyObject_HEAD
4368} matmulObject;
4369
4370static PyObject *
4371matmulType_matmul(PyObject *self, PyObject *other)
4372{
4373 return Py_BuildValue("(sOO)", "matmul", self, other);
4374}
4375
4376static PyObject *
4377matmulType_imatmul(PyObject *self, PyObject *other)
4378{
4379 return Py_BuildValue("(sOO)", "imatmul", self, other);
4380}
4381
4382static void
4383matmulType_dealloc(PyObject *self)
4384{
Zachary Ware420dc562014-04-23 13:51:27 -05004385 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004386}
4387
4388static PyNumberMethods matmulType_as_number = {
4389 0, /* nb_add */
4390 0, /* nb_subtract */
4391 0, /* nb_multiply */
4392 0, /* nb_remainde r*/
4393 0, /* nb_divmod */
4394 0, /* nb_power */
4395 0, /* nb_negative */
4396 0, /* tp_positive */
4397 0, /* tp_absolute */
4398 0, /* tp_bool */
4399 0, /* nb_invert */
4400 0, /* nb_lshift */
4401 0, /* nb_rshift */
4402 0, /* nb_and */
4403 0, /* nb_xor */
4404 0, /* nb_or */
4405 0, /* nb_int */
4406 0, /* nb_reserved */
4407 0, /* nb_float */
4408 0, /* nb_inplace_add */
4409 0, /* nb_inplace_subtract */
4410 0, /* nb_inplace_multiply */
4411 0, /* nb_inplace_remainder */
4412 0, /* nb_inplace_power */
4413 0, /* nb_inplace_lshift */
4414 0, /* nb_inplace_rshift */
4415 0, /* nb_inplace_and */
4416 0, /* nb_inplace_xor */
4417 0, /* nb_inplace_or */
4418 0, /* nb_floor_divide */
4419 0, /* nb_true_divide */
4420 0, /* nb_inplace_floor_divide */
4421 0, /* nb_inplace_true_divide */
4422 0, /* nb_index */
4423 matmulType_matmul, /* nb_matrix_multiply */
4424 matmulType_imatmul /* nb_matrix_inplace_multiply */
4425};
4426
4427static PyTypeObject matmulType = {
4428 PyVarObject_HEAD_INIT(NULL, 0)
4429 "matmulType",
4430 sizeof(matmulObject), /* tp_basicsize */
4431 0, /* tp_itemsize */
4432 matmulType_dealloc, /* destructor tp_dealloc */
4433 0, /* tp_print */
4434 0, /* tp_getattr */
4435 0, /* tp_setattr */
4436 0, /* tp_reserved */
4437 0, /* tp_repr */
4438 &matmulType_as_number, /* tp_as_number */
4439 0, /* tp_as_sequence */
4440 0, /* tp_as_mapping */
4441 0, /* tp_hash */
4442 0, /* tp_call */
4443 0, /* tp_str */
4444 PyObject_GenericGetAttr, /* tp_getattro */
4445 PyObject_GenericSetAttr, /* tp_setattro */
4446 0, /* tp_as_buffer */
4447 0, /* tp_flags */
4448 "C level type with matrix operations defined",
4449 0, /* traverseproc tp_traverse */
4450 0, /* tp_clear */
4451 0, /* tp_richcompare */
4452 0, /* tp_weaklistoffset */
4453 0, /* tp_iter */
4454 0, /* tp_iternext */
4455 0, /* tp_methods */
4456 0, /* tp_members */
4457 0,
4458 0,
4459 0,
4460 0,
4461 0,
4462 0,
4463 0,
4464 0,
4465 PyType_GenericNew, /* tp_new */
4466 PyObject_Del, /* tp_free */
4467};
4468
Martin v. Löwis1a214512008-06-11 05:26:20 +00004469
Yury Selivanov75445082015-05-11 22:57:16 -04004470typedef struct {
4471 PyObject_HEAD
4472 PyObject *ao_iterator;
4473} awaitObject;
4474
4475
4476static PyObject *
4477awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4478{
4479 PyObject *v;
4480 awaitObject *ao;
4481
4482 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
4483 return NULL;
4484
4485 ao = (awaitObject *)type->tp_alloc(type, 0);
4486 if (ao == NULL) {
4487 return NULL;
4488 }
4489
4490 Py_INCREF(v);
4491 ao->ao_iterator = v;
4492
4493 return (PyObject *)ao;
4494}
4495
4496
4497static void
4498awaitObject_dealloc(awaitObject *ao)
4499{
4500 Py_CLEAR(ao->ao_iterator);
4501 Py_TYPE(ao)->tp_free(ao);
4502}
4503
4504
4505static PyObject *
4506awaitObject_await(awaitObject *ao)
4507{
4508 Py_INCREF(ao->ao_iterator);
4509 return ao->ao_iterator;
4510}
4511
4512static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04004513 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04004514 0, /* am_aiter */
4515 0 /* am_anext */
4516};
4517
4518
4519static PyTypeObject awaitType = {
4520 PyVarObject_HEAD_INIT(NULL, 0)
4521 "awaitType",
4522 sizeof(awaitObject), /* tp_basicsize */
4523 0, /* tp_itemsize */
4524 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
4525 0, /* tp_print */
4526 0, /* tp_getattr */
4527 0, /* tp_setattr */
4528 &awaitType_as_async, /* tp_as_async */
4529 0, /* tp_repr */
4530 0, /* tp_as_number */
4531 0, /* tp_as_sequence */
4532 0, /* tp_as_mapping */
4533 0, /* tp_hash */
4534 0, /* tp_call */
4535 0, /* tp_str */
4536 PyObject_GenericGetAttr, /* tp_getattro */
4537 PyObject_GenericSetAttr, /* tp_setattro */
4538 0, /* tp_as_buffer */
4539 0, /* tp_flags */
4540 "C level type with tp_as_async",
4541 0, /* traverseproc tp_traverse */
4542 0, /* tp_clear */
4543 0, /* tp_richcompare */
4544 0, /* tp_weaklistoffset */
4545 0, /* tp_iter */
4546 0, /* tp_iternext */
4547 0, /* tp_methods */
4548 0, /* tp_members */
4549 0,
4550 0,
4551 0,
4552 0,
4553 0,
4554 0,
4555 0,
4556 0,
4557 awaitObject_new, /* tp_new */
4558 PyObject_Del, /* tp_free */
4559};
4560
4561
Martin v. Löwis1a214512008-06-11 05:26:20 +00004562static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004563 PyModuleDef_HEAD_INIT,
4564 "_testcapi",
4565 NULL,
4566 -1,
4567 TestMethods,
4568 NULL,
4569 NULL,
4570 NULL,
4571 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004572};
4573
Nick Coghland5cacbb2015-05-23 22:24:10 +10004574/* Per PEP 489, this module will not be converted to multi-phase initialization
4575 */
4576
Mark Hammond62b1ab12002-07-23 06:31:15 +00004577PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004578PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00004579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 m = PyModule_Create(&_testcapimodule);
4583 if (m == NULL)
4584 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004586 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00004587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 Py_TYPE(&test_structmembersType)=&PyType_Type;
4589 Py_INCREF(&test_structmembersType);
4590 /* don't use a name starting with "test", since we don't want
4591 test_capi to automatically call this */
4592 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004593 if (PyType_Ready(&matmulType) < 0)
4594 return NULL;
4595 Py_INCREF(&matmulType);
4596 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004597
Yury Selivanov75445082015-05-11 22:57:16 -04004598 if (PyType_Ready(&awaitType) < 0)
4599 return NULL;
4600 Py_INCREF(&awaitType);
4601 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
4602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004603 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
4604 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
4605 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
4606 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
4607 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
4608 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
4609 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
4610 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
4611 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
4612 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
4613 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
4614 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
4615 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
4616 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
4617 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
4618 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
4619 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
4620 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
4621 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
4622 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
4623 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
4624 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02004625 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 Py_INCREF(&PyInstanceMethod_Type);
4627 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00004628
Larry Hastings2a727912014-01-16 11:32:01 -08004629 PyModule_AddIntConstant(m, "the_number_three", 3);
4630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004631 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
4632 Py_INCREF(TestError);
4633 PyModule_AddObject(m, "error", TestError);
4634 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004635}