blob: c53e07993926915b33c8ed91046826a975d0c264 [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
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001892 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1893 PyUnicode_MAX_CHAR_VALUE(to)))) {
1894 return NULL;
1895 }
1896 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
1897 Py_DECREF(to_copy);
1898 return NULL;
1899 }
1900
1901 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
1902 from_start, how_many)) < 0) {
1903 Py_DECREF(to_copy);
1904 return NULL;
1905 }
1906
1907 return Py_BuildValue("(Nn)", to_copy, copied);
1908}
1909
1910static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001911unicode_encodedecimal(PyObject *self, PyObject *args)
1912{
1913 Py_UNICODE *unicode;
1914 Py_ssize_t length;
1915 char *errors = NULL;
1916 PyObject *decimal;
1917 Py_ssize_t decimal_length, new_length;
1918 int res;
1919
1920 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1921 return NULL;
1922
1923 decimal_length = length * 7; /* len('&#8364;') */
1924 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1925 if (decimal == NULL)
1926 return NULL;
1927
1928 res = PyUnicode_EncodeDecimal(unicode, length,
1929 PyBytes_AS_STRING(decimal),
1930 errors);
1931 if (res < 0) {
1932 Py_DECREF(decimal);
1933 return NULL;
1934 }
1935
1936 new_length = strlen(PyBytes_AS_STRING(decimal));
1937 assert(new_length <= decimal_length);
1938 res = _PyBytes_Resize(&decimal, new_length);
1939 if (res < 0)
1940 return NULL;
1941
1942 return decimal;
1943}
1944
1945static PyObject *
1946unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1947{
1948 Py_UNICODE *unicode;
1949 Py_ssize_t length;
1950 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1951 return NULL;
1952 return PyUnicode_TransformDecimalToASCII(unicode, length);
1953}
1954
1955static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001956unicode_legacy_string(PyObject *self, PyObject *args)
1957{
1958 Py_UNICODE *data;
1959 Py_ssize_t len;
1960 PyObject *u;
1961
1962 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1963 return NULL;
1964
1965 u = PyUnicode_FromUnicode(NULL, len);
1966 if (u == NULL)
1967 return NULL;
1968
1969 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
1970
1971 if (len > 0) { /* The empty string is always ready. */
1972 assert(!PyUnicode_IS_READY(u));
1973 }
1974
1975 return u;
1976}
1977
1978static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00001979getargs_w_star(PyObject *self, PyObject *args)
1980{
1981 Py_buffer buffer;
1982 PyObject *result;
1983 char *str;
1984
1985 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
1986 return NULL;
1987
1988 if (2 <= buffer.len) {
1989 str = buffer.buf;
1990 str[0] = '[';
1991 str[buffer.len-1] = ']';
1992 }
1993
1994 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1995 PyBuffer_Release(&buffer);
1996 return result;
1997}
1998
1999
2000static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00002001test_empty_argparse(PyObject *self)
2002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 /* Test that formats can begin with '|'. See issue #4720. */
2004 PyObject *tuple, *dict = NULL;
2005 static char *kwlist[] = {NULL};
2006 int result;
2007 tuple = PyTuple_New(0);
2008 if (!tuple)
2009 return NULL;
2010 if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
2011 goto done;
2012 dict = PyDict_New();
2013 if (!dict)
2014 goto done;
2015 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002016 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 Py_DECREF(tuple);
2018 Py_XDECREF(dict);
2019 if (result < 0)
2020 return NULL;
2021 else {
2022 Py_RETURN_NONE;
2023 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002024}
2025
2026static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002027codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002028{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 const char *encoding, *errors = NULL;
2030 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2031 &encoding, &errors))
2032 return NULL;
2033 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002034}
2035
Thomas Wouters477c8d52006-05-27 19:21:47 +00002036static PyObject *
2037codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 const char *encoding, *errors = NULL;
2040 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2041 &encoding, &errors))
2042 return NULL;
2043 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002044}
2045
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002046
Tim Peters5b8132f2003-01-31 15:52:05 +00002047/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002048static PyObject *
2049test_long_numbits(PyObject *self)
2050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 struct triple {
2052 long input;
2053 size_t nbits;
2054 int sign;
2055 } testcases[] = {{0, 0, 0},
2056 {1L, 1, 1},
2057 {-1L, 1, -1},
2058 {2L, 2, 1},
2059 {-2L, 2, -1},
2060 {3L, 2, 1},
2061 {-3L, 2, -1},
2062 {4L, 3, 1},
2063 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002064 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 {-0x7fffL, 15, -1},
2066 {0xffffL, 16, 1},
2067 {-0xffffL, 16, -1},
2068 {0xfffffffL, 28, 1},
2069 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002070 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002071
Victor Stinner63941882011-09-29 00:42:28 +02002072 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002073 size_t nbits;
2074 int sign;
2075 PyObject *plong;
2076
2077 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002078 if (plong == NULL)
2079 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002080 nbits = _PyLong_NumBits(plong);
2081 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 Py_DECREF(plong);
2084 if (nbits != testcases[i].nbits)
2085 return raiseTestError("test_long_numbits",
2086 "wrong result for _PyLong_NumBits");
2087 if (sign != testcases[i].sign)
2088 return raiseTestError("test_long_numbits",
2089 "wrong result for _PyLong_Sign");
2090 }
2091 Py_INCREF(Py_None);
2092 return Py_None;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002093}
2094
Thomas Heller519a0422007-11-15 20:48:54 +00002095/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002096
2097static PyObject *
2098test_null_strings(PyObject *self)
2099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2101 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2102 Py_XDECREF(o1);
2103 Py_XDECREF(o2);
2104 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002105}
2106
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002107static PyObject *
2108raise_exception(PyObject *self, PyObject *args)
2109{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 PyObject *exc;
2111 PyObject *exc_args, *v;
2112 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2115 &exc, &num_args))
2116 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 exc_args = PyTuple_New(num_args);
2119 if (exc_args == NULL)
2120 return NULL;
2121 for (i = 0; i < num_args; ++i) {
2122 v = PyLong_FromLong(i);
2123 if (v == NULL) {
2124 Py_DECREF(exc_args);
2125 return NULL;
2126 }
2127 PyTuple_SET_ITEM(exc_args, i, v);
2128 }
2129 PyErr_SetObject(exc, exc_args);
2130 Py_DECREF(exc_args);
2131 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002132}
Tim Peters91621db2001-06-12 20:10:01 +00002133
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002134static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002135set_errno(PyObject *self, PyObject *args)
2136{
2137 int new_errno;
2138
2139 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2140 return NULL;
2141
2142 errno = new_errno;
2143 Py_RETURN_NONE;
2144}
2145
2146static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002147test_set_exc_info(PyObject *self, PyObject *args)
2148{
2149 PyObject *orig_exc;
2150 PyObject *new_type, *new_value, *new_tb;
2151 PyObject *type, *value, *tb;
2152 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2153 &new_type, &new_value, &new_tb))
2154 return NULL;
2155
2156 PyErr_GetExcInfo(&type, &value, &tb);
2157
2158 Py_INCREF(new_type);
2159 Py_INCREF(new_value);
2160 Py_INCREF(new_tb);
2161 PyErr_SetExcInfo(new_type, new_value, new_tb);
2162
2163 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2164 Py_XDECREF(type);
2165 Py_XDECREF(value);
2166 Py_XDECREF(tb);
2167 return orig_exc;
2168}
Benjamin Peterson16323982010-02-03 01:13:41 +00002169
2170static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002171
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002172static PyObject *
2173test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 if (PyDateTimeAPI) {
2175 if (test_run_counter) {
2176 /* Probably regrtest.py -R */
2177 Py_RETURN_NONE;
2178 }
2179 else {
2180 PyErr_SetString(PyExc_AssertionError,
2181 "PyDateTime_CAPI somehow initialized");
2182 return NULL;
2183 }
2184 }
2185 test_run_counter++;
2186 PyDateTime_IMPORT;
2187 if (PyDateTimeAPI)
2188 Py_RETURN_NONE;
2189 else
2190 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002191}
2192
Benjamin Peterson16323982010-02-03 01:13:41 +00002193
2194#ifdef WITH_THREAD
2195
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002196/* test_thread_state spawns a thread of its own, and that thread releases
2197 * `thread_done` when it's finished. The driver code has to know when the
2198 * thread finishes, because the thread uses a PyObject (the callable) that
2199 * may go away when the driver finishes. The former lack of this explicit
2200 * synchronization caused rare segfaults, so rare that they were seen only
2201 * on a Mac buildbot (although they were possible on any box).
2202 */
2203static PyThread_type_lock thread_done = NULL;
2204
Benjamin Petersona786b022008-08-25 21:05:21 +00002205static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002206_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002207{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002208 PyObject *rc;
2209 int success;
2210 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002211 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 success = (rc != NULL);
2213 Py_XDECREF(rc);
2214 PyGILState_Release(s);
2215 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002216}
2217
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002218/* Same thing, but releases `thread_done` when it returns. This variant
2219 * should be called only from threads spawned by test_thread_state().
2220 */
2221static void
2222_make_call_from_thread(void *callable)
2223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 _make_call(callable);
2225 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002226}
2227
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002228static PyObject *
2229test_thread_state(PyObject *self, PyObject *args)
2230{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 PyObject *fn;
2232 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2235 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 if (!PyCallable_Check(fn)) {
2238 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2239 fn->ob_type->tp_name);
2240 return NULL;
2241 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 /* Ensure Python is set up for threading */
2244 PyEval_InitThreads();
2245 thread_done = PyThread_allocate_lock();
2246 if (thread_done == NULL)
2247 return PyErr_NoMemory();
2248 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 /* Start a new thread with our callback. */
2251 PyThread_start_new_thread(_make_call_from_thread, fn);
2252 /* Make the callback with the thread lock held by this thread */
2253 success &= _make_call(fn);
2254 /* Do it all again, but this time with the thread-lock released */
2255 Py_BEGIN_ALLOW_THREADS
2256 success &= _make_call(fn);
2257 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2258 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 /* And once more with and without a thread
2261 XXX - should use a lock and work out exactly what we are trying
2262 to test <wink>
2263 */
2264 Py_BEGIN_ALLOW_THREADS
2265 PyThread_start_new_thread(_make_call_from_thread, fn);
2266 success &= _make_call(fn);
2267 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2268 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 /* Release lock we acquired above. This is required on HP-UX. */
2271 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 PyThread_free_lock(thread_done);
2274 if (!success)
2275 return NULL;
2276 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002277}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002278
2279/* test Py_AddPendingCalls using threads */
2280static int _pending_callback(void *arg)
2281{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 /* we assume the argument is callable object to which we own a reference */
2283 PyObject *callable = (PyObject *)arg;
2284 PyObject *r = PyObject_CallObject(callable, NULL);
2285 Py_DECREF(callable);
2286 Py_XDECREF(r);
2287 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002288}
2289
2290/* The following requests n callbacks to _pending_callback. It can be
2291 * run from any python thread.
2292 */
2293PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
2294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 PyObject *callable;
2296 int r;
2297 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2298 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 /* create the reference for the callbackwhile we hold the lock */
2301 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 Py_BEGIN_ALLOW_THREADS
2304 r = Py_AddPendingCall(&_pending_callback, callable);
2305 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 if (r<0) {
2308 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
2309 Py_INCREF(Py_False);
2310 return Py_False;
2311 }
2312 Py_INCREF(Py_True);
2313 return Py_True;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002314}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002315#endif
2316
Neal Norwitzb0d26332007-08-25 00:49:05 +00002317/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002318static PyObject *
2319test_string_from_format(PyObject *self, PyObject *args)
2320{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 PyObject *result;
2322 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002323
Alexander Belopolskye239d232010-12-08 23:31:48 +00002324#define CHECK_1_FORMAT(FORMAT, TYPE) \
2325 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2326 if (result == NULL) \
2327 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002328 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002329 msg = FORMAT " failed at 1"; \
2330 goto Fail; \
2331 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 CHECK_1_FORMAT("%d", int);
2335 CHECK_1_FORMAT("%ld", long);
2336 /* The z width modifier was added in Python 2.5. */
2337 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 /* The u type code was added in Python 2.5. */
2340 CHECK_1_FORMAT("%u", unsigned int);
2341 CHECK_1_FORMAT("%lu", unsigned long);
2342 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002345 CHECK_1_FORMAT("%llu", unsigned long long);
2346 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002349
2350 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 Py_XDECREF(result);
2352 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002353
2354#undef CHECK_1_FORMAT
2355}
2356
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002357
2358static PyObject *
2359test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2361 int result;
2362 if (py_s == NULL)
2363 return NULL;
2364 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2365 Py_DECREF(py_s);
2366 if (!result) {
2367 PyErr_SetString(TestError, "Python string ending in NULL "
2368 "should not compare equal to c string.");
2369 return NULL;
2370 }
2371 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002372}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002373
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002374/* This is here to provide a docstring for test_descr. */
2375static PyObject *
2376test_with_docstring(PyObject *self)
2377{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002379}
2380
Mark Dickinson725bfd82009-05-03 20:33:40 +00002381/* Test PyOS_string_to_double. */
2382static PyObject *
2383test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 double result;
2385 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387#define CHECK_STRING(STR, expected) \
2388 result = PyOS_string_to_double(STR, NULL, NULL); \
2389 if (result == -1.0 && PyErr_Occurred()) \
2390 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002391 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 msg = "conversion of " STR " to float failed"; \
2393 goto fail; \
2394 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396#define CHECK_INVALID(STR) \
2397 result = PyOS_string_to_double(STR, NULL, NULL); \
2398 if (result == -1.0 && PyErr_Occurred()) { \
2399 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2400 PyErr_Clear(); \
2401 else \
2402 return NULL; \
2403 } \
2404 else { \
2405 msg = "conversion of " STR " didn't raise ValueError"; \
2406 goto fail; \
2407 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 CHECK_STRING("0.1", 0.1);
2410 CHECK_STRING("1.234", 1.234);
2411 CHECK_STRING("-1.35", -1.35);
2412 CHECK_STRING(".1e01", 1.0);
2413 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 CHECK_INVALID(" 0.1");
2416 CHECK_INVALID("\t\n-3");
2417 CHECK_INVALID(".123 ");
2418 CHECK_INVALID("3\n");
2419 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002422 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002424#undef CHECK_STRING
2425#undef CHECK_INVALID
2426}
2427
2428
Benjamin Petersonb173f782009-05-05 22:31:58 +00002429/* Coverage testing of capsule objects. */
2430
2431static const char *capsule_name = "capsule name";
2432static char *capsule_pointer = "capsule pointer";
2433static char *capsule_context = "capsule context";
2434static const char *capsule_error = NULL;
2435static int
2436capsule_destructor_call_count = 0;
2437
2438static void
2439capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 capsule_destructor_call_count++;
2441 if (PyCapsule_GetContext(o) != capsule_context) {
2442 capsule_error = "context did not match in destructor!";
2443 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2444 capsule_error = "destructor did not match in destructor! (woah!)";
2445 } else if (PyCapsule_GetName(o) != capsule_name) {
2446 capsule_error = "name did not match in destructor!";
2447 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2448 capsule_error = "pointer did not match in destructor!";
2449 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002450}
2451
2452typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 char *name;
2454 char *module;
2455 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002456} known_capsule;
2457
2458static PyObject *
2459test_capsule(PyObject *self, PyObject *args)
2460{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 PyObject *object;
2462 const char *error = NULL;
2463 void *pointer;
2464 void *pointer2;
2465 known_capsule known_capsules[] = {
2466 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2467 KNOWN_CAPSULE("_socket", "CAPI"),
2468 KNOWN_CAPSULE("_curses", "_C_API"),
2469 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2470 { NULL, NULL },
2471 };
2472 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002473
2474#define FAIL(x) { error = (x); goto exit; }
2475
2476#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002477 if (capsule_error) { \
2478 FAIL(capsule_error); \
2479 } \
2480 else if (!capsule_destructor_call_count) { \
2481 FAIL("destructor not called!"); \
2482 } \
2483 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2486 PyCapsule_SetContext(object, capsule_context);
2487 capsule_destructor(object);
2488 CHECK_DESTRUCTOR;
2489 Py_DECREF(object);
2490 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 object = PyCapsule_New(known, "ignored", NULL);
2493 PyCapsule_SetPointer(object, capsule_pointer);
2494 PyCapsule_SetName(object, capsule_name);
2495 PyCapsule_SetDestructor(object, capsule_destructor);
2496 PyCapsule_SetContext(object, capsule_context);
2497 capsule_destructor(object);
2498 CHECK_DESTRUCTOR;
2499 /* intentionally access using the wrong name */
2500 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2501 if (!PyErr_Occurred()) {
2502 FAIL("PyCapsule_GetPointer should have failed but did not!");
2503 }
2504 PyErr_Clear();
2505 if (pointer2) {
2506 if (pointer2 == capsule_pointer) {
2507 FAIL("PyCapsule_GetPointer should not have"
2508 " returned the internal pointer!");
2509 } else {
2510 FAIL("PyCapsule_GetPointer should have "
2511 "returned NULL pointer but did not!");
2512 }
2513 }
2514 PyCapsule_SetDestructor(object, NULL);
2515 Py_DECREF(object);
2516 if (capsule_destructor_call_count) {
2517 FAIL("destructor called when it should not have been!");
2518 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 for (known = &known_capsules[0]; known->module != NULL; known++) {
2521 /* yeah, ordinarily I wouldn't do this either,
2522 but it's fine for this test harness.
2523 */
2524 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002525#undef FAIL
2526#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 { \
2528 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2529 x, known->module, known->attribute); \
2530 error = buffer; \
2531 goto exit; \
2532 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 PyObject *module = PyImport_ImportModule(known->module);
2535 if (module) {
2536 pointer = PyCapsule_Import(known->name, 0);
2537 if (!pointer) {
2538 Py_DECREF(module);
2539 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2540 }
2541 object = PyObject_GetAttrString(module, known->attribute);
2542 if (!object) {
2543 Py_DECREF(module);
2544 return NULL;
2545 }
2546 pointer2 = PyCapsule_GetPointer(object,
2547 "weebles wobble but they don't fall down");
2548 if (!PyErr_Occurred()) {
2549 Py_DECREF(object);
2550 Py_DECREF(module);
2551 FAIL("PyCapsule_GetPointer should have failed but did not!");
2552 }
2553 PyErr_Clear();
2554 if (pointer2) {
2555 Py_DECREF(module);
2556 Py_DECREF(object);
2557 if (pointer2 == pointer) {
2558 FAIL("PyCapsule_GetPointer should not have"
2559 " returned its internal pointer!");
2560 } else {
2561 FAIL("PyCapsule_GetPointer should have"
2562 " returned NULL pointer but did not!");
2563 }
2564 }
2565 Py_DECREF(object);
2566 Py_DECREF(module);
2567 }
2568 else
2569 PyErr_Clear();
2570 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002571
2572 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002573 if (error) {
2574 return raiseTestError("test_capsule", error);
2575 }
2576 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002577#undef FAIL
2578}
2579
Guido van Rossumddefaf32007-01-14 03:31:43 +00002580#ifdef HAVE_GETTIMEOFDAY
2581/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002582static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002584 e->tv_sec -= s->tv_sec;
2585 e->tv_usec -= s->tv_usec;
2586 if (e->tv_usec < 0) {
2587 e->tv_sec -=1;
2588 e->tv_usec += 1000000;
2589 }
2590 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002591}
2592
2593static PyObject *
2594profile_int(PyObject *self, PyObject* args)
2595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 int i, k;
2597 struct timeval start, stop;
2598 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 /* Test 1: Allocate and immediately deallocate
2601 many small integers */
2602 gettimeofday(&start, NULL);
2603 for(k=0; k < 20000; k++)
2604 for(i=0; i < 1000; i++) {
2605 single = PyLong_FromLong(i);
2606 Py_DECREF(single);
2607 }
2608 gettimeofday(&stop, NULL);
2609 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 /* Test 2: Allocate and immediately deallocate
2612 many large integers */
2613 gettimeofday(&start, NULL);
2614 for(k=0; k < 20000; k++)
2615 for(i=0; i < 1000; i++) {
2616 single = PyLong_FromLong(i+1000000);
2617 Py_DECREF(single);
2618 }
2619 gettimeofday(&stop, NULL);
2620 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 /* Test 3: Allocate a few integers, then release
2623 them all simultaneously. */
2624 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002625 if (multiple == NULL)
2626 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 gettimeofday(&start, NULL);
2628 for(k=0; k < 20000; k++) {
2629 for(i=0; i < 1000; i++) {
2630 multiple[i] = PyLong_FromLong(i+1000000);
2631 }
2632 for(i=0; i < 1000; i++) {
2633 Py_DECREF(multiple[i]);
2634 }
2635 }
2636 gettimeofday(&stop, NULL);
2637 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002638 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 /* Test 4: Allocate many integers, then release
2641 them all simultaneously. */
2642 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002643 if (multiple == NULL)
2644 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002645 gettimeofday(&start, NULL);
2646 for(k=0; k < 20; k++) {
2647 for(i=0; i < 1000000; i++) {
2648 multiple[i] = PyLong_FromLong(i+1000000);
2649 }
2650 for(i=0; i < 1000000; i++) {
2651 Py_DECREF(multiple[i]);
2652 }
2653 }
2654 gettimeofday(&stop, NULL);
2655 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002656 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 /* Test 5: Allocate many integers < 32000 */
2659 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002660 if (multiple == NULL)
2661 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 gettimeofday(&start, NULL);
2663 for(k=0; k < 10; k++) {
2664 for(i=0; i < 1000000; i++) {
2665 multiple[i] = PyLong_FromLong(i+1000);
2666 }
2667 for(i=0; i < 1000000; i++) {
2668 Py_DECREF(multiple[i]);
2669 }
2670 }
2671 gettimeofday(&stop, NULL);
2672 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002673 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 /* Test 6: Perform small int addition */
2676 op1 = PyLong_FromLong(1);
2677 gettimeofday(&start, NULL);
2678 for(i=0; i < 10000000; i++) {
2679 result = PyNumber_Add(op1, op1);
2680 Py_DECREF(result);
2681 }
2682 gettimeofday(&stop, NULL);
2683 Py_DECREF(op1);
2684 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 /* Test 7: Perform medium int addition */
2687 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002688 if (op1 == NULL)
2689 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 gettimeofday(&start, NULL);
2691 for(i=0; i < 10000000; i++) {
2692 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002693 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 }
2695 gettimeofday(&stop, NULL);
2696 Py_DECREF(op1);
2697 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 Py_INCREF(Py_None);
2700 return Py_None;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002701}
2702#endif
2703
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002704/* To test the format of tracebacks as printed out. */
2705static PyObject *
2706traceback_print(PyObject *self, PyObject *args)
2707{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 PyObject *file;
2709 PyObject *traceback;
2710 int result;
2711
2712 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2713 &traceback, &file))
2714 return NULL;
2715
2716 result = PyTraceBack_Print(traceback, file);
2717 if (result < 0)
2718 return NULL;
2719 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002720}
2721
Benjamin Petersone6528212008-07-15 15:32:09 +00002722/* To test the format of exceptions as printed out. */
2723static PyObject *
2724exception_print(PyObject *self, PyObject *args)
2725{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 PyObject *value;
2727 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 if (!PyArg_ParseTuple(args, "O:exception_print",
2730 &value))
2731 return NULL;
2732 if (!PyExceptionInstance_Check(value)) {
2733 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2734 return NULL;
2735 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 tb = PyException_GetTraceback(value);
2738 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2739 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002742}
2743
2744
2745
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002746
2747/* reliably raise a MemoryError */
2748static PyObject *
2749raise_memoryerror(PyObject *self)
2750{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 PyErr_NoMemory();
2752 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002753}
2754
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002755/* Issue 6012 */
2756static PyObject *str1, *str2;
2757static int
2758failing_converter(PyObject *obj, void *arg)
2759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 /* Clone str1, then let the conversion fail. */
2761 assert(str1);
2762 str2 = str1;
2763 Py_INCREF(str2);
2764 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002765}
2766static PyObject*
2767argparsing(PyObject *o, PyObject *args)
2768{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 PyObject *res;
2770 str1 = str2 = NULL;
2771 if (!PyArg_ParseTuple(args, "O&O&",
2772 PyUnicode_FSConverter, &str1,
2773 failing_converter, &str2)) {
2774 if (!str2)
2775 /* argument converter not called? */
2776 return NULL;
2777 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002778 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 Py_DECREF(str2);
2780 PyErr_Clear();
2781 return res;
2782 }
2783 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002784}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002785
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002786/* To test that the result of PyCode_NewEmpty has the right members. */
2787static PyObject *
2788code_newempty(PyObject *self, PyObject *args)
2789{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 const char *filename;
2791 const char *funcname;
2792 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2795 &filename, &funcname, &firstlineno))
2796 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002799}
2800
Georg Brandl1e28a272009-12-28 08:41:01 +00002801/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2802 Run via Lib/test/test_exceptions.py */
2803static PyObject *
2804make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2805{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806 const char *name;
2807 const char *doc = NULL;
2808 PyObject *base = NULL;
2809 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002813 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2814 "s|sOO:make_exception_with_doc", kwlist,
2815 &name, &doc, &base, &dict))
2816 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002819}
2820
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002821static PyObject *
2822make_memoryview_from_NULL_pointer(PyObject *self)
2823{
2824 Py_buffer info;
2825 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2826 return NULL;
2827 return PyMemoryView_FromBuffer(&info);
2828}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002829
Stefan Krah7213fcc2015-02-01 16:19:23 +01002830static PyObject *
2831test_from_contiguous(PyObject* self, PyObject *noargs)
2832{
2833 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2834 int init[5] = {0, 1, 2, 3, 4};
2835 Py_ssize_t itemsize = sizeof(int);
2836 Py_ssize_t shape = 5;
2837 Py_ssize_t strides = 2 * itemsize;
2838 Py_buffer view = {
2839 data,
2840 NULL,
2841 5 * itemsize,
2842 itemsize,
2843 1,
2844 1,
2845 NULL,
2846 &shape,
2847 &strides,
2848 NULL,
2849 NULL
2850 };
2851 int *ptr;
2852 int i;
2853
2854 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2855 ptr = view.buf;
2856 for (i = 0; i < 5; i++) {
2857 if (ptr[2*i] != i) {
2858 PyErr_SetString(TestError,
2859 "test_from_contiguous: incorrect result");
2860 return NULL;
2861 }
2862 }
2863
2864 view.buf = &data[8];
2865 view.strides[0] = -2 * itemsize;
2866
2867 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2868 ptr = view.buf;
2869 for (i = 0; i < 5; i++) {
2870 if (*(ptr-2*i) != i) {
2871 PyErr_SetString(TestError,
2872 "test_from_contiguous: incorrect result");
2873 return NULL;
2874 }
2875 }
2876
2877 Py_RETURN_NONE;
2878}
Stefan Krah650c1e82015-02-03 21:43:23 +01002879
Stefan Kraha7559c02015-02-03 22:27:21 +01002880#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01002881extern PyTypeObject _PyBytesIOBuffer_Type;
2882
Stefan Krah5178d912015-02-03 16:57:21 +01002883static PyObject *
2884test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
2885{
Stefan Krah650c1e82015-02-03 21:43:23 +01002886 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01002887 PyObject *b;
2888 char *dummy[1];
2889 int ret, match;
2890
Stefan Krah650c1e82015-02-03 21:43:23 +01002891 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01002892 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
2893 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2894 PyErr_Clear();
2895 if (ret != -1 || match == 0)
2896 goto error;
2897
Stefan Krah650c1e82015-02-03 21:43:23 +01002898 /* bytesiobuf_getbuffer() */
2899 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01002900 if (b == NULL) {
2901 return NULL;
2902 }
2903
2904 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
2905 Py_DECREF(b);
2906 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2907 PyErr_Clear();
2908 if (ret != -1 || match == 0)
2909 goto error;
2910
2911 Py_RETURN_NONE;
2912
2913error:
2914 PyErr_SetString(TestError,
2915 "test_pep3118_obsolete_write_locks: failure");
2916 return NULL;
2917}
Stefan Kraha7559c02015-02-03 22:27:21 +01002918#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002919
Stefan Krah650c1e82015-02-03 21:43:23 +01002920/* This tests functions that historically supported write locks. It is
2921 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
2922 is entitled to segfault in that case. */
2923static PyObject *
2924getbuffer_with_null_view(PyObject* self, PyObject *obj)
2925{
2926 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
2927 return NULL;
2928
2929 Py_RETURN_NONE;
2930}
2931
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002932/* Test that the fatal error from not having a current thread doesn't
2933 cause an infinite loop. Run via Lib/test/test_capi.py */
2934static PyObject *
2935crash_no_current_thread(PyObject *self)
2936{
2937 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002938 /* Using PyThreadState_Get() directly allows the test to pass in
2939 !pydebug mode. However, the test only actually tests anything
2940 in pydebug mode, since that's where the infinite loop was in
2941 the first place. */
2942 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002943 Py_END_ALLOW_THREADS
2944 return NULL;
2945}
2946
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002947/* To run some code in a sub-interpreter. */
2948static PyObject *
2949run_in_subinterp(PyObject *self, PyObject *args)
2950{
2951 const char *code;
2952 int r;
2953 PyThreadState *substate, *mainstate;
2954
2955 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2956 &code))
2957 return NULL;
2958
2959 mainstate = PyThreadState_Get();
2960
2961 PyThreadState_Swap(NULL);
2962
2963 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002964 if (substate == NULL) {
2965 /* Since no new thread state was created, there is no exception to
2966 propagate; raise a fresh one after swapping in the old thread
2967 state. */
2968 PyThreadState_Swap(mainstate);
2969 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
2970 return NULL;
2971 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002972 r = PyRun_SimpleString(code);
2973 Py_EndInterpreter(substate);
2974
2975 PyThreadState_Swap(mainstate);
2976
2977 return PyLong_FromLong(r);
2978}
2979
Victor Stinner3c1b3792014-02-17 00:02:43 +01002980static int
2981check_time_rounding(int round)
2982{
Victor Stinner74474232015-09-02 01:43:56 +02002983 if (round != _PyTime_ROUND_FLOOR
2984 && round != _PyTime_ROUND_CEILING
Victor Stinner7667f582015-09-09 01:02:23 +02002985 && round != _PyTime_ROUND_HALF_EVEN) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01002986 PyErr_SetString(PyExc_ValueError, "invalid rounding");
2987 return -1;
2988 }
2989 return 0;
2990}
2991
Victor Stinner5d272cc2012-03-13 13:35:55 +01002992static PyObject *
2993test_pytime_object_to_time_t(PyObject *self, PyObject *args)
2994{
2995 PyObject *obj;
2996 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01002997 int round;
2998 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01002999 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003000 if (check_time_rounding(round) < 0)
3001 return NULL;
3002 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003003 return NULL;
3004 return _PyLong_FromTime_t(sec);
3005}
3006
3007static PyObject *
3008test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3009{
3010 PyObject *obj;
3011 time_t sec;
3012 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003013 int round;
3014 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003015 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003016 if (check_time_rounding(round) < 0)
3017 return NULL;
3018 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003019 return NULL;
3020 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3021}
3022
Victor Stinner643cd682012-03-02 22:54:03 +01003023static PyObject *
3024test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3025{
3026 PyObject *obj;
3027 time_t sec;
3028 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003029 int round;
3030 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003031 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003032 if (check_time_rounding(round) < 0)
3033 return NULL;
3034 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003035 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003036 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003037}
3038
Antoine Pitrou796564c2013-07-30 19:59:21 +02003039static void
3040slot_tp_del(PyObject *self)
3041{
3042 _Py_IDENTIFIER(__tp_del__);
3043 PyObject *del, *res;
3044 PyObject *error_type, *error_value, *error_traceback;
3045
3046 /* Temporarily resurrect the object. */
3047 assert(self->ob_refcnt == 0);
3048 self->ob_refcnt = 1;
3049
3050 /* Save the current exception, if any. */
3051 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3052
3053 /* Execute __del__ method, if any. */
3054 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3055 if (del != NULL) {
3056 res = PyEval_CallObject(del, NULL);
3057 if (res == NULL)
3058 PyErr_WriteUnraisable(del);
3059 else
3060 Py_DECREF(res);
3061 Py_DECREF(del);
3062 }
3063
3064 /* Restore the saved exception. */
3065 PyErr_Restore(error_type, error_value, error_traceback);
3066
3067 /* Undo the temporary resurrection; can't use DECREF here, it would
3068 * cause a recursive call.
3069 */
3070 assert(self->ob_refcnt > 0);
3071 if (--self->ob_refcnt == 0)
3072 return; /* this is the normal path out */
3073
3074 /* __del__ resurrected it! Make it look like the original Py_DECREF
3075 * never happened.
3076 */
3077 {
3078 Py_ssize_t refcnt = self->ob_refcnt;
3079 _Py_NewReference(self);
3080 self->ob_refcnt = refcnt;
3081 }
3082 assert(!PyType_IS_GC(Py_TYPE(self)) ||
3083 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
3084 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3085 * we need to undo that. */
3086 _Py_DEC_REFTOTAL;
3087 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3088 * chain, so no more to do there.
3089 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3090 * _Py_NewReference bumped tp_allocs: both of those need to be
3091 * undone.
3092 */
3093#ifdef COUNT_ALLOCS
3094 --Py_TYPE(self)->tp_frees;
3095 --Py_TYPE(self)->tp_allocs;
3096#endif
3097}
3098
3099static PyObject *
3100with_tp_del(PyObject *self, PyObject *args)
3101{
3102 PyObject *obj;
3103 PyTypeObject *tp;
3104
3105 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3106 return NULL;
3107 tp = (PyTypeObject *) obj;
3108 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3109 PyErr_Format(PyExc_TypeError,
3110 "heap type expected, got %R", obj);
3111 return NULL;
3112 }
3113 tp->tp_del = slot_tp_del;
3114 Py_INCREF(obj);
3115 return obj;
3116}
3117
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003118static PyMethodDef ml;
3119
3120static PyObject *
3121create_cfunction(PyObject *self, PyObject *args)
3122{
3123 return PyCFunction_NewEx(&ml, self, NULL);
3124}
3125
3126static PyMethodDef ml = {
3127 "create_cfunction",
3128 create_cfunction,
3129 METH_NOARGS,
3130 NULL
3131};
3132
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003133static PyObject *
3134_test_incref(PyObject *ob)
3135{
3136 Py_INCREF(ob);
3137 return ob;
3138}
3139
3140static PyObject *
3141test_xincref_doesnt_leak(PyObject *ob)
3142{
3143 PyObject *obj = PyLong_FromLong(0);
3144 Py_XINCREF(_test_incref(obj));
3145 Py_DECREF(obj);
3146 Py_DECREF(obj);
3147 Py_DECREF(obj);
3148 Py_RETURN_NONE;
3149}
3150
3151static PyObject *
3152test_incref_doesnt_leak(PyObject *ob)
3153{
3154 PyObject *obj = PyLong_FromLong(0);
3155 Py_INCREF(_test_incref(obj));
3156 Py_DECREF(obj);
3157 Py_DECREF(obj);
3158 Py_DECREF(obj);
3159 Py_RETURN_NONE;
3160}
3161
3162static PyObject *
3163test_xdecref_doesnt_leak(PyObject *ob)
3164{
3165 Py_XDECREF(PyLong_FromLong(0));
3166 Py_RETURN_NONE;
3167}
3168
3169static PyObject *
3170test_decref_doesnt_leak(PyObject *ob)
3171{
3172 Py_DECREF(PyLong_FromLong(0));
3173 Py_RETURN_NONE;
3174}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003175
Victor Stinner0507bf52013-07-07 02:05:46 +02003176static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02003177test_incref_decref_API(PyObject *ob)
3178{
3179 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003180 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003181 Py_DecRef(obj);
3182 Py_DecRef(obj);
3183 Py_RETURN_NONE;
3184}
3185
3186static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02003187test_pymem_alloc0(PyObject *self)
3188{
3189 void *ptr;
3190
Victor Stinnerdb067af2014-05-02 22:31:14 +02003191 ptr = PyMem_RawMalloc(0);
3192 if (ptr == NULL) {
3193 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3194 return NULL;
3195 }
3196 PyMem_RawFree(ptr);
3197
3198 ptr = PyMem_RawCalloc(0, 0);
3199 if (ptr == NULL) {
3200 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3201 return NULL;
3202 }
3203 PyMem_RawFree(ptr);
3204
Victor Stinner0507bf52013-07-07 02:05:46 +02003205 ptr = PyMem_Malloc(0);
3206 if (ptr == NULL) {
3207 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3208 return NULL;
3209 }
3210 PyMem_Free(ptr);
3211
Victor Stinnerdb067af2014-05-02 22:31:14 +02003212 ptr = PyMem_Calloc(0, 0);
3213 if (ptr == NULL) {
3214 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3215 return NULL;
3216 }
3217 PyMem_Free(ptr);
3218
Victor Stinner0507bf52013-07-07 02:05:46 +02003219 ptr = PyObject_Malloc(0);
3220 if (ptr == NULL) {
3221 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3222 return NULL;
3223 }
3224 PyObject_Free(ptr);
3225
Victor Stinnerdb067af2014-05-02 22:31:14 +02003226 ptr = PyObject_Calloc(0, 0);
3227 if (ptr == NULL) {
3228 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3229 return NULL;
3230 }
3231 PyObject_Free(ptr);
3232
Victor Stinner0507bf52013-07-07 02:05:46 +02003233 Py_RETURN_NONE;
3234}
3235
3236typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003237 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003238
3239 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003240 size_t calloc_nelem;
3241 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003242 void *realloc_ptr;
3243 size_t realloc_new_size;
3244 void *free_ptr;
3245} alloc_hook_t;
3246
3247static void* hook_malloc (void* ctx, size_t size)
3248{
3249 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3250 hook->malloc_size = size;
3251 return hook->alloc.malloc(hook->alloc.ctx, size);
3252}
3253
Victor Stinnerdb067af2014-05-02 22:31:14 +02003254static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
3255{
3256 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3257 hook->calloc_nelem = nelem;
3258 hook->calloc_elsize = elsize;
3259 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3260}
3261
Victor Stinner0507bf52013-07-07 02:05:46 +02003262static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
3263{
3264 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3265 hook->realloc_ptr = ptr;
3266 hook->realloc_new_size = new_size;
3267 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3268}
3269
3270static void hook_free (void *ctx, void *ptr)
3271{
3272 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3273 hook->free_ptr = ptr;
3274 hook->alloc.free(hook->alloc.ctx, ptr);
3275}
3276
3277static PyObject *
3278test_setallocators(PyMemAllocatorDomain domain)
3279{
3280 PyObject *res = NULL;
3281 const char *error_msg;
3282 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003283 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003284 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003285 void *ptr, *ptr2;
3286
Victor Stinnerdb067af2014-05-02 22:31:14 +02003287 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003288
3289 alloc.ctx = &hook;
3290 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003291 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003292 alloc.realloc = &hook_realloc;
3293 alloc.free = &hook_free;
3294 PyMem_GetAllocator(domain, &hook.alloc);
3295 PyMem_SetAllocator(domain, &alloc);
3296
3297 size = 42;
3298 switch(domain)
3299 {
3300 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3301 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3302 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3303 default: ptr = NULL; break;
3304 }
3305
3306 if (ptr == NULL) {
3307 error_msg = "malloc failed";
3308 goto fail;
3309 }
3310
3311 if (hook.malloc_size != size) {
3312 error_msg = "malloc invalid size";
3313 goto fail;
3314 }
3315
3316 size2 = 200;
3317 switch(domain)
3318 {
3319 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3320 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3321 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003322 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003323 }
3324
3325 if (ptr2 == NULL) {
3326 error_msg = "realloc failed";
3327 goto fail;
3328 }
3329
3330 if (hook.realloc_ptr != ptr
3331 || hook.realloc_new_size != size2) {
3332 error_msg = "realloc invalid parameters";
3333 goto fail;
3334 }
3335
3336 switch(domain)
3337 {
3338 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3339 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3340 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3341 }
3342
3343 if (hook.free_ptr != ptr2) {
3344 error_msg = "free invalid pointer";
3345 goto fail;
3346 }
3347
Victor Stinnerdb067af2014-05-02 22:31:14 +02003348 nelem = 2;
3349 elsize = 5;
3350 switch(domain)
3351 {
3352 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3353 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3354 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3355 default: ptr = NULL; break;
3356 }
3357
3358 if (ptr == NULL) {
3359 error_msg = "calloc failed";
3360 goto fail;
3361 }
3362
3363 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3364 error_msg = "calloc invalid nelem or elsize";
3365 goto fail;
3366 }
3367
3368 switch(domain)
3369 {
3370 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3371 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3372 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3373 }
3374
Victor Stinner0507bf52013-07-07 02:05:46 +02003375 Py_INCREF(Py_None);
3376 res = Py_None;
3377 goto finally;
3378
3379fail:
3380 PyErr_SetString(PyExc_RuntimeError, error_msg);
3381
3382finally:
3383 PyMem_SetAllocator(domain, &hook.alloc);
3384 return res;
3385}
3386
3387static PyObject *
3388test_pymem_setrawallocators(PyObject *self)
3389{
3390 return test_setallocators(PYMEM_DOMAIN_RAW);
3391}
3392
3393static PyObject *
3394test_pymem_setallocators(PyObject *self)
3395{
3396 return test_setallocators(PYMEM_DOMAIN_MEM);
3397}
3398
3399static PyObject *
3400test_pyobject_setallocators(PyObject *self)
3401{
3402 return test_setallocators(PYMEM_DOMAIN_OBJ);
3403}
3404
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003405PyDoc_STRVAR(docstring_empty,
3406""
3407);
3408
3409PyDoc_STRVAR(docstring_no_signature,
3410"This docstring has no signature."
3411);
3412
3413PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003414"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003415"\n"
3416"This docstring has an invalid signature."
3417);
3418
Larry Hastings2623c8c2014-02-08 22:15:29 -08003419PyDoc_STRVAR(docstring_with_invalid_signature2,
3420"docstring_with_invalid_signature2($module, /, boo)\n"
3421"\n"
3422"--\n"
3423"\n"
3424"This docstring also has an invalid signature."
3425);
3426
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003427PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003428"docstring_with_signature($module, /, sig)\n"
3429"--\n"
3430"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003431"This docstring has a valid signature."
3432);
3433
Zachary Ware8ef887c2015-04-13 18:22:35 -05003434PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3435"docstring_with_signature_but_no_doc($module, /, sig)\n"
3436"--\n"
3437"\n"
3438);
3439
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003440PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003441"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3442"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003443"\n"
3444"\n"
3445"This docstring has a valid signature and some extra newlines."
3446);
3447
Larry Hastings16c51912014-01-07 11:53:01 -08003448PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003449"docstring_with_signature_with_defaults(module, s='avocado',\n"
3450" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3451" local=the_number_three, sys=sys.maxsize,\n"
3452" exp=sys.maxsize - 1)\n"
3453"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003454"\n"
3455"\n"
3456"\n"
3457"This docstring has a valid signature with parameters,\n"
3458"and the parameters take defaults of varying types."
3459);
3460
Victor Stinner258e4d32013-12-13 02:30:12 +01003461#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003462typedef struct {
3463 PyThread_type_lock start_event;
3464 PyThread_type_lock exit_event;
3465 PyObject *callback;
3466} test_c_thread_t;
3467
3468static void
3469temporary_c_thread(void *data)
3470{
3471 test_c_thread_t *test_c_thread = data;
3472 PyGILState_STATE state;
3473 PyObject *res;
3474
3475 PyThread_release_lock(test_c_thread->start_event);
3476
3477 /* Allocate a Python thread state for this thread */
3478 state = PyGILState_Ensure();
3479
Victor Stinner3466bde2016-09-05 18:16:01 -07003480 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003481 Py_CLEAR(test_c_thread->callback);
3482
3483 if (res == NULL) {
3484 PyErr_Print();
3485 }
3486 else {
3487 Py_DECREF(res);
3488 }
3489
3490 /* Destroy the Python thread state for this thread */
3491 PyGILState_Release(state);
3492
3493 PyThread_release_lock(test_c_thread->exit_event);
3494
3495 PyThread_exit_thread();
3496}
3497
3498static PyObject *
3499call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3500{
3501 PyObject *res = NULL;
3502 test_c_thread_t test_c_thread;
3503 long thread;
3504
3505 PyEval_InitThreads();
3506
3507 test_c_thread.start_event = PyThread_allocate_lock();
3508 test_c_thread.exit_event = PyThread_allocate_lock();
3509 test_c_thread.callback = NULL;
3510 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3511 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3512 goto exit;
3513 }
3514
3515 Py_INCREF(callback);
3516 test_c_thread.callback = callback;
3517
3518 PyThread_acquire_lock(test_c_thread.start_event, 1);
3519 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3520
3521 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3522 if (thread == -1) {
3523 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3524 PyThread_release_lock(test_c_thread.start_event);
3525 PyThread_release_lock(test_c_thread.exit_event);
3526 goto exit;
3527 }
3528
3529 PyThread_acquire_lock(test_c_thread.start_event, 1);
3530 PyThread_release_lock(test_c_thread.start_event);
3531
3532 Py_BEGIN_ALLOW_THREADS
3533 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3534 PyThread_release_lock(test_c_thread.exit_event);
3535 Py_END_ALLOW_THREADS
3536
3537 Py_INCREF(Py_None);
3538 res = Py_None;
3539
3540exit:
3541 Py_CLEAR(test_c_thread.callback);
3542 if (test_c_thread.start_event)
3543 PyThread_free_lock(test_c_thread.start_event);
3544 if (test_c_thread.exit_event)
3545 PyThread_free_lock(test_c_thread.exit_event);
3546 return res;
3547}
Victor Stinner258e4d32013-12-13 02:30:12 +01003548#endif /* WITH_THREAD */
Victor Stinner13105102013-12-13 02:17:29 +01003549
Victor Stinner56e8c292014-07-21 12:30:22 +02003550static PyObject*
3551test_raise_signal(PyObject* self, PyObject *args)
3552{
3553 int signum, err;
3554
3555 if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0)
3556 return NULL;
3557
3558 err = raise(signum);
3559 if (err)
3560 return PyErr_SetFromErrno(PyExc_OSError);
3561
3562 if (PyErr_CheckSignals() < 0)
3563 return NULL;
3564
3565 Py_RETURN_NONE;
3566}
3567
Serhiy Storchakab5181342015-02-06 08:58:56 +02003568/* marshal */
3569
3570static PyObject*
3571pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3572{
3573 long value;
3574 char *filename;
3575 int version;
3576 FILE *fp;
3577
3578 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3579 &value, &filename, &version))
3580 return NULL;
3581
3582 fp = fopen(filename, "wb");
3583 if (fp == NULL) {
3584 PyErr_SetFromErrno(PyExc_OSError);
3585 return NULL;
3586 }
3587
3588 PyMarshal_WriteLongToFile(value, fp, version);
3589
3590 fclose(fp);
3591 if (PyErr_Occurred())
3592 return NULL;
3593 Py_RETURN_NONE;
3594}
3595
3596static PyObject*
3597pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3598{
3599 PyObject *obj;
3600 char *filename;
3601 int version;
3602 FILE *fp;
3603
3604 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3605 &obj, &filename, &version))
3606 return NULL;
3607
3608 fp = fopen(filename, "wb");
3609 if (fp == NULL) {
3610 PyErr_SetFromErrno(PyExc_OSError);
3611 return NULL;
3612 }
3613
3614 PyMarshal_WriteObjectToFile(obj, fp, version);
3615
3616 fclose(fp);
3617 if (PyErr_Occurred())
3618 return NULL;
3619 Py_RETURN_NONE;
3620}
3621
3622static PyObject*
3623pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3624{
3625 int value;
3626 long pos;
3627 char *filename;
3628 FILE *fp;
3629
3630 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3631 return NULL;
3632
3633 fp = fopen(filename, "rb");
3634 if (fp == NULL) {
3635 PyErr_SetFromErrno(PyExc_OSError);
3636 return NULL;
3637 }
3638
3639 value = PyMarshal_ReadShortFromFile(fp);
3640 pos = ftell(fp);
3641
3642 fclose(fp);
3643 if (PyErr_Occurred())
3644 return NULL;
3645 return Py_BuildValue("il", value, pos);
3646}
3647
3648static PyObject*
3649pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3650{
3651 long value, pos;
3652 char *filename;
3653 FILE *fp;
3654
3655 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3656 return NULL;
3657
3658 fp = fopen(filename, "rb");
3659 if (fp == NULL) {
3660 PyErr_SetFromErrno(PyExc_OSError);
3661 return NULL;
3662 }
3663
3664 value = PyMarshal_ReadLongFromFile(fp);
3665 pos = ftell(fp);
3666
3667 fclose(fp);
3668 if (PyErr_Occurred())
3669 return NULL;
3670 return Py_BuildValue("ll", value, pos);
3671}
3672
3673static PyObject*
3674pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3675{
3676 PyObject *obj;
3677 long pos;
3678 char *filename;
3679 FILE *fp;
3680
3681 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3682 return NULL;
3683
3684 fp = fopen(filename, "rb");
3685 if (fp == NULL) {
3686 PyErr_SetFromErrno(PyExc_OSError);
3687 return NULL;
3688 }
3689
3690 obj = PyMarshal_ReadLastObjectFromFile(fp);
3691 pos = ftell(fp);
3692
3693 fclose(fp);
3694 return Py_BuildValue("Nl", obj, pos);
3695}
3696
3697static PyObject*
3698pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3699{
3700 PyObject *obj;
3701 long pos;
3702 char *filename;
3703 FILE *fp;
3704
3705 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3706 return NULL;
3707
3708 fp = fopen(filename, "rb");
3709 if (fp == NULL) {
3710 PyErr_SetFromErrno(PyExc_OSError);
3711 return NULL;
3712 }
3713
3714 obj = PyMarshal_ReadObjectFromFile(fp);
3715 pos = ftell(fp);
3716
3717 fclose(fp);
3718 return Py_BuildValue("Nl", obj, pos);
3719}
3720
Victor Stinnerefde1462015-03-21 15:04:43 +01003721static PyObject*
3722return_null_without_error(PyObject *self, PyObject *args)
3723{
3724 /* invalid call: return NULL without setting an error,
3725 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3726 PyErr_Clear();
3727 return NULL;
3728}
3729
3730static PyObject*
3731return_result_with_error(PyObject *self, PyObject *args)
3732{
3733 /* invalid call: return a result with an error set,
3734 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3735 PyErr_SetNone(PyExc_ValueError);
3736 Py_RETURN_NONE;
3737}
3738
Victor Stinner992c43f2015-03-27 17:12:45 +01003739static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02003740test_pytime_fromseconds(PyObject *self, PyObject *args)
3741{
3742 int seconds;
3743 _PyTime_t ts;
3744
3745 if (!PyArg_ParseTuple(args, "i", &seconds))
3746 return NULL;
3747 ts = _PyTime_FromSeconds(seconds);
3748 return _PyTime_AsNanosecondsObject(ts);
3749}
3750
3751static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01003752test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
3753{
3754 PyObject *obj;
3755 int round;
3756 _PyTime_t ts;
3757
3758 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
3759 return NULL;
3760 if (check_time_rounding(round) < 0)
3761 return NULL;
3762 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
3763 return NULL;
3764 return _PyTime_AsNanosecondsObject(ts);
3765}
3766
Victor Stinner4bfb4602015-03-27 22:27:24 +01003767static PyObject *
3768test_pytime_assecondsdouble(PyObject *self, PyObject *args)
3769{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003770 long long ns;
Victor Stinner4bfb4602015-03-27 22:27:24 +01003771 _PyTime_t ts;
3772 double d;
3773
3774 if (!PyArg_ParseTuple(args, "L", &ns))
3775 return NULL;
3776 ts = _PyTime_FromNanoseconds(ns);
3777 d = _PyTime_AsSecondsDouble(ts);
3778 return PyFloat_FromDouble(d);
3779}
3780
Victor Stinner95e9cef2015-03-28 01:26:47 +01003781static PyObject *
3782test_PyTime_AsTimeval(PyObject *self, PyObject *args)
3783{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003784 long long ns;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003785 int round;
3786 _PyTime_t t;
3787 struct timeval tv;
3788 PyObject *seconds;
3789
3790 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3791 return NULL;
3792 if (check_time_rounding(round) < 0)
3793 return NULL;
3794 t = _PyTime_FromNanoseconds(ns);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +02003795 if (_PyTime_AsTimeval(t, &tv, round) < 0)
Victor Stinner95e9cef2015-03-28 01:26:47 +01003796 return NULL;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003797
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003798 seconds = PyLong_FromLong((long long)tv.tv_sec);
Victor Stinner95e9cef2015-03-28 01:26:47 +01003799 if (seconds == NULL)
3800 return NULL;
3801 return Py_BuildValue("Nl", seconds, tv.tv_usec);
3802}
3803
Victor Stinner34dc0f42015-03-27 18:19:03 +01003804#ifdef HAVE_CLOCK_GETTIME
3805static PyObject *
3806test_PyTime_AsTimespec(PyObject *self, PyObject *args)
3807{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003808 long long ns;
Victor Stinner34dc0f42015-03-27 18:19:03 +01003809 _PyTime_t t;
3810 struct timespec ts;
3811
3812 if (!PyArg_ParseTuple(args, "L", &ns))
3813 return NULL;
3814 t = _PyTime_FromNanoseconds(ns);
3815 if (_PyTime_AsTimespec(t, &ts) == -1)
3816 return NULL;
3817 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
3818}
3819#endif
3820
Victor Stinner62d1c702015-04-01 17:47:07 +02003821static PyObject *
3822test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
3823{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003824 long long ns;
Victor Stinner62d1c702015-04-01 17:47:07 +02003825 int round;
3826 _PyTime_t t, ms;
3827
3828 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3829 return NULL;
3830 if (check_time_rounding(round) < 0)
3831 return NULL;
3832 t = _PyTime_FromNanoseconds(ns);
3833 ms = _PyTime_AsMilliseconds(t, round);
3834 /* This conversion rely on the fact that _PyTime_t is a number of
3835 nanoseconds */
3836 return _PyTime_AsNanosecondsObject(ms);
3837}
3838
3839static PyObject *
3840test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
3841{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003842 long long ns;
Victor Stinner62d1c702015-04-01 17:47:07 +02003843 int round;
3844 _PyTime_t t, ms;
3845
3846 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3847 return NULL;
3848 if (check_time_rounding(round) < 0)
3849 return NULL;
3850 t = _PyTime_FromNanoseconds(ns);
3851 ms = _PyTime_AsMicroseconds(t, round);
3852 /* This conversion rely on the fact that _PyTime_t is a number of
3853 nanoseconds */
3854 return _PyTime_AsNanosecondsObject(ms);
3855}
3856
Victor Stinner50856d52015-10-13 00:11:21 +02003857static PyObject*
3858get_recursion_depth(PyObject *self, PyObject *args)
3859{
3860 PyThreadState *tstate = PyThreadState_GET();
3861
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07003862 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02003863 return PyLong_FromLong(tstate->recursion_depth - 1);
3864}
3865
Victor Stinner34be807c2016-03-14 12:04:26 +01003866static PyObject*
3867pymem_buffer_overflow(PyObject *self, PyObject *args)
3868{
3869 char *buffer;
3870
3871 /* Deliberate buffer overflow to check that PyMem_Free() detects
3872 the overflow when debug hooks are installed. */
3873 buffer = PyMem_Malloc(16);
3874 buffer[16] = 'x';
3875 PyMem_Free(buffer);
3876
3877 Py_RETURN_NONE;
3878}
3879
3880static PyObject*
3881pymem_api_misuse(PyObject *self, PyObject *args)
3882{
3883 char *buffer;
3884
3885 /* Deliberate misusage of Python allocators:
3886 allococate with PyMem but release with PyMem_Raw. */
3887 buffer = PyMem_Malloc(16);
3888 PyMem_RawFree(buffer);
3889
3890 Py_RETURN_NONE;
3891}
3892
Victor Stinnerc4aec362016-03-14 22:26:53 +01003893static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01003894pymem_malloc_without_gil(PyObject *self, PyObject *args)
3895{
3896 char *buffer;
3897
3898 /* Deliberate bug to test debug hooks on Python memory allocators:
3899 call PyMem_Malloc() without holding the GIL */
3900 Py_BEGIN_ALLOW_THREADS
3901 buffer = PyMem_Malloc(10);
3902 Py_END_ALLOW_THREADS
3903
3904 PyMem_Free(buffer);
3905
3906 Py_RETURN_NONE;
3907}
3908
3909static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01003910pyobject_malloc_without_gil(PyObject *self, PyObject *args)
3911{
3912 char *buffer;
3913
Victor Stinnerad524372016-03-16 12:12:53 +01003914 /* Deliberate bug to test debug hooks on Python memory allocators:
3915 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01003916 Py_BEGIN_ALLOW_THREADS
3917 buffer = PyObject_Malloc(10);
3918 Py_END_ALLOW_THREADS
3919
3920 PyObject_Free(buffer);
3921
3922 Py_RETURN_NONE;
3923}
3924
Victor Stinner10b73e12016-03-22 13:39:05 +01003925static PyObject *
3926tracemalloc_track(PyObject *self, PyObject *args)
3927{
3928 unsigned int domain;
3929 PyObject *ptr_obj;
3930 void *ptr;
3931 Py_ssize_t size;
3932 int release_gil = 0;
3933 int res;
3934
3935 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
3936 return NULL;
3937 ptr = PyLong_AsVoidPtr(ptr_obj);
3938 if (PyErr_Occurred())
3939 return NULL;
3940
3941 if (release_gil) {
3942 Py_BEGIN_ALLOW_THREADS
Benjamin Petersonca470632016-09-06 13:47:26 -07003943 res = _PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01003944 Py_END_ALLOW_THREADS
3945 }
3946 else {
Benjamin Petersonca470632016-09-06 13:47:26 -07003947 res = _PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01003948 }
3949
3950 if (res < 0) {
3951 PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
3952 return NULL;
3953 }
3954
3955 Py_RETURN_NONE;
3956}
3957
3958static PyObject *
3959tracemalloc_untrack(PyObject *self, PyObject *args)
3960{
3961 unsigned int domain;
3962 PyObject *ptr_obj;
3963 void *ptr;
3964 int res;
3965
3966 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
3967 return NULL;
3968 ptr = PyLong_AsVoidPtr(ptr_obj);
3969 if (PyErr_Occurred())
3970 return NULL;
3971
Benjamin Petersonca470632016-09-06 13:47:26 -07003972 res = _PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01003973 if (res < 0) {
3974 PyErr_SetString(PyExc_RuntimeError, "_PyTraceMalloc_Track error");
3975 return NULL;
3976 }
3977
3978 Py_RETURN_NONE;
3979}
3980
3981static PyObject *
3982tracemalloc_get_traceback(PyObject *self, PyObject *args)
3983{
3984 unsigned int domain;
3985 PyObject *ptr_obj;
3986 void *ptr;
3987
3988 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
3989 return NULL;
3990 ptr = PyLong_AsVoidPtr(ptr_obj);
3991 if (PyErr_Occurred())
3992 return NULL;
3993
Benjamin Petersonca470632016-09-06 13:47:26 -07003994 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01003995}
3996
Victor Stinner3b6a6b42016-09-08 12:51:24 -07003997static PyObject *
3998dict_get_version(PyObject *self, PyObject *args)
3999{
4000 PyDictObject *dict;
4001 uint64_t version;
4002
4003 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4004 return NULL;
4005
4006 version = dict->ma_version_tag;
4007
4008 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4009 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4010}
4011
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004012
Tim Peters9ea17ac2001-02-02 05:57:15 +00004013static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004014 {"raise_exception", raise_exception, METH_VARARGS},
4015 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02004016 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004017 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01004018 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004019 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
4020 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
4021 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02004022 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004023 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004024 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07004025 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
4026 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
4027 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
4028 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02004029 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004030 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
4031 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02004032 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
4033 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004034 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
4035 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
4036 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07004037 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004038 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
4039 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
4040 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
4041 PyDoc_STR("This is a pretty normal docstring.")},
4042 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
4043 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
4044 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01004045 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004046#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01004047 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004048#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01004049 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03004050 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03004051 {"get_args", get_args, METH_VARARGS},
4052 {"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004053 {"getargs_tuple", getargs_tuple, METH_VARARGS},
4054 {"getargs_keywords", (PyCFunction)getargs_keywords,
4055 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00004056 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
4057 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03004058 {"getargs_positional_only_and_keywords",
4059 (PyCFunction)getargs_positional_only_and_keywords,
4060 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004061 {"getargs_b", getargs_b, METH_VARARGS},
4062 {"getargs_B", getargs_B, METH_VARARGS},
4063 {"getargs_h", getargs_h, METH_VARARGS},
4064 {"getargs_H", getargs_H, METH_VARARGS},
4065 {"getargs_I", getargs_I, METH_VARARGS},
4066 {"getargs_k", getargs_k, METH_VARARGS},
4067 {"getargs_i", getargs_i, METH_VARARGS},
4068 {"getargs_l", getargs_l, METH_VARARGS},
4069 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07004070 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004071 {"getargs_L", getargs_L, METH_VARARGS},
4072 {"getargs_K", getargs_K, METH_VARARGS},
4073 {"test_longlong_api", test_longlong_api, METH_NOARGS},
4074 {"test_long_long_and_overflow",
4075 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
4076 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03004077 {"getargs_f", getargs_f, METH_VARARGS},
4078 {"getargs_d", getargs_d, METH_VARARGS},
4079 {"getargs_D", getargs_D, METH_VARARGS},
4080 {"getargs_S", getargs_S, METH_VARARGS},
4081 {"getargs_Y", getargs_Y, METH_VARARGS},
4082 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03004083 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004084 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00004085 {"getargs_s", getargs_s, METH_VARARGS},
4086 {"getargs_s_star", getargs_s_star, METH_VARARGS},
4087 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
4088 {"getargs_z", getargs_z, METH_VARARGS},
4089 {"getargs_z_star", getargs_z_star, METH_VARARGS},
4090 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
4091 {"getargs_y", getargs_y, METH_VARARGS},
4092 {"getargs_y_star", getargs_y_star, METH_VARARGS},
4093 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
4094 {"getargs_u", getargs_u, METH_VARARGS},
4095 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
4096 {"getargs_Z", getargs_Z, METH_VARARGS},
4097 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00004098 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004099 {"getargs_es", getargs_es, METH_VARARGS},
4100 {"getargs_et", getargs_et, METH_VARARGS},
4101 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
4102 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004103 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004104 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004105 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004106 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004107 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
4108 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
4109 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
4110 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004111 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
4112 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03004113 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03004114 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004115 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
4116 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01004117 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004118#ifdef WITH_THREAD
Victor Stinner1c24bd02010-10-02 11:03:13 +00004119 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004120 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Mark Hammond8d98d2c2003-04-19 15:41:53 +00004121#endif
Guido van Rossumddefaf32007-01-14 03:31:43 +00004122#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00004123 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004124#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00004125 {"traceback_print", traceback_print, METH_VARARGS},
4126 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02004127 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004128 {"argparsing", argparsing, METH_VARARGS},
4129 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004130 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
4131 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00004132 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
4133 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00004134 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004135 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01004136 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
4137 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01004138 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02004139 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04004140 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02004141 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02004142 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
4143 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02004144 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
4145 {"test_pymem_setallocators",
4146 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
4147 {"test_pyobject_setallocators",
4148 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004149 {"no_docstring",
4150 (PyCFunction)test_with_docstring, METH_NOARGS},
4151 {"docstring_empty",
4152 (PyCFunction)test_with_docstring, METH_NOARGS,
4153 docstring_empty},
4154 {"docstring_no_signature",
4155 (PyCFunction)test_with_docstring, METH_NOARGS,
4156 docstring_no_signature},
4157 {"docstring_with_invalid_signature",
4158 (PyCFunction)test_with_docstring, METH_NOARGS,
4159 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004160 {"docstring_with_invalid_signature2",
4161 (PyCFunction)test_with_docstring, METH_NOARGS,
4162 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004163 {"docstring_with_signature",
4164 (PyCFunction)test_with_docstring, METH_NOARGS,
4165 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004166 {"docstring_with_signature_but_no_doc",
4167 (PyCFunction)test_with_docstring, METH_NOARGS,
4168 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004169 {"docstring_with_signature_and_extra_newlines",
4170 (PyCFunction)test_with_docstring, METH_NOARGS,
4171 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004172 {"docstring_with_signature_with_defaults",
4173 (PyCFunction)test_with_docstring, METH_NOARGS,
4174 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02004175 {"raise_signal",
4176 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinner258e4d32013-12-13 02:30:12 +01004177#ifdef WITH_THREAD
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004178 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4179 PyDoc_STR("set_error_class(error_class) -> None")},
Victor Stinner258e4d32013-12-13 02:30:12 +01004180#endif
Serhiy Storchakab5181342015-02-06 08:58:56 +02004181 {"pymarshal_write_long_to_file",
4182 pymarshal_write_long_to_file, METH_VARARGS},
4183 {"pymarshal_write_object_to_file",
4184 pymarshal_write_object_to_file, METH_VARARGS},
4185 {"pymarshal_read_short_from_file",
4186 pymarshal_read_short_from_file, METH_VARARGS},
4187 {"pymarshal_read_long_from_file",
4188 pymarshal_read_long_from_file, METH_VARARGS},
4189 {"pymarshal_read_last_object_from_file",
4190 pymarshal_read_last_object_from_file, METH_VARARGS},
4191 {"pymarshal_read_object_from_file",
4192 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004193 {"return_null_without_error",
4194 return_null_without_error, METH_NOARGS},
4195 {"return_result_with_error",
4196 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004197 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004198 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4199 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004200 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004201#ifdef HAVE_CLOCK_GETTIME
4202 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4203#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004204 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4205 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004206 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01004207 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
4208 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01004209 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01004210 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01004211 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
4212 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
4213 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004214 {"dict_get_version", dict_get_version, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004215 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00004216};
4217
Thomas Hellera4ea6032003-04-17 18:55:45 +00004218#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
4219
Thomas Wouters89f507f2006-12-13 04:49:30 +00004220typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004221 char bool_member;
4222 char byte_member;
4223 unsigned char ubyte_member;
4224 short short_member;
4225 unsigned short ushort_member;
4226 int int_member;
4227 unsigned int uint_member;
4228 long long_member;
4229 unsigned long ulong_member;
4230 Py_ssize_t pyssizet_member;
4231 float float_member;
4232 double double_member;
4233 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07004234 long long longlong_member;
4235 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004236} all_structmembers;
4237
4238typedef struct {
4239 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004240 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004241} test_structmembers;
4242
4243static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004244 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
4245 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
4246 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
4247 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
4248 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
4249 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
4250 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
4251 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
4252 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
4253 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
4254 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
4255 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
4256 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004257 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
4258 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004259 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00004260};
4261
4262
Christian Heimes1af737c2008-01-23 08:24:23 +00004263static PyObject *
4264test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
4265{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004266 static char *keywords[] = {
4267 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
4268 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
4269 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004270 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07004272 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004273 test_structmembers *ob;
4274 const char *s = NULL;
4275 Py_ssize_t string_len = 0;
4276 ob = PyObject_New(test_structmembers, type);
4277 if (ob == NULL)
4278 return NULL;
4279 memset(&ob->structmembers, 0, sizeof(all_structmembers));
4280 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
4281 &ob->structmembers.bool_member,
4282 &ob->structmembers.byte_member,
4283 &ob->structmembers.ubyte_member,
4284 &ob->structmembers.short_member,
4285 &ob->structmembers.ushort_member,
4286 &ob->structmembers.int_member,
4287 &ob->structmembers.uint_member,
4288 &ob->structmembers.long_member,
4289 &ob->structmembers.ulong_member,
4290 &ob->structmembers.pyssizet_member,
4291 &ob->structmembers.float_member,
4292 &ob->structmembers.double_member,
4293 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004294 , &ob->structmembers.longlong_member,
4295 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004296 )) {
4297 Py_DECREF(ob);
4298 return NULL;
4299 }
4300 if (s != NULL) {
4301 if (string_len > 5) {
4302 Py_DECREF(ob);
4303 PyErr_SetString(PyExc_ValueError, "string too long");
4304 return NULL;
4305 }
4306 strcpy(ob->structmembers.inplace_member, s);
4307 }
4308 else {
4309 strcpy(ob->structmembers.inplace_member, "");
4310 }
4311 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004312}
4313
Christian Heimes1af737c2008-01-23 08:24:23 +00004314static void
4315test_structmembers_free(PyObject *ob)
4316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004317 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004318}
4319
4320static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004321 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004322 "test_structmembersType",
4323 sizeof(test_structmembers), /* tp_basicsize */
4324 0, /* tp_itemsize */
4325 test_structmembers_free, /* destructor tp_dealloc */
4326 0, /* tp_print */
4327 0, /* tp_getattr */
4328 0, /* tp_setattr */
4329 0, /* tp_reserved */
4330 0, /* tp_repr */
4331 0, /* tp_as_number */
4332 0, /* tp_as_sequence */
4333 0, /* tp_as_mapping */
4334 0, /* tp_hash */
4335 0, /* tp_call */
4336 0, /* tp_str */
4337 PyObject_GenericGetAttr, /* tp_getattro */
4338 PyObject_GenericSetAttr, /* tp_setattro */
4339 0, /* tp_as_buffer */
4340 0, /* tp_flags */
4341 "Type containing all structmember types",
4342 0, /* traverseproc tp_traverse */
4343 0, /* tp_clear */
4344 0, /* tp_richcompare */
4345 0, /* tp_weaklistoffset */
4346 0, /* tp_iter */
4347 0, /* tp_iternext */
4348 0, /* tp_methods */
4349 test_members, /* tp_members */
4350 0,
4351 0,
4352 0,
4353 0,
4354 0,
4355 0,
4356 0,
4357 0,
4358 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004359};
4360
4361
Benjamin Petersond51374e2014-04-09 23:55:56 -04004362typedef struct {
4363 PyObject_HEAD
4364} matmulObject;
4365
4366static PyObject *
4367matmulType_matmul(PyObject *self, PyObject *other)
4368{
4369 return Py_BuildValue("(sOO)", "matmul", self, other);
4370}
4371
4372static PyObject *
4373matmulType_imatmul(PyObject *self, PyObject *other)
4374{
4375 return Py_BuildValue("(sOO)", "imatmul", self, other);
4376}
4377
4378static void
4379matmulType_dealloc(PyObject *self)
4380{
Zachary Ware420dc562014-04-23 13:51:27 -05004381 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004382}
4383
4384static PyNumberMethods matmulType_as_number = {
4385 0, /* nb_add */
4386 0, /* nb_subtract */
4387 0, /* nb_multiply */
4388 0, /* nb_remainde r*/
4389 0, /* nb_divmod */
4390 0, /* nb_power */
4391 0, /* nb_negative */
4392 0, /* tp_positive */
4393 0, /* tp_absolute */
4394 0, /* tp_bool */
4395 0, /* nb_invert */
4396 0, /* nb_lshift */
4397 0, /* nb_rshift */
4398 0, /* nb_and */
4399 0, /* nb_xor */
4400 0, /* nb_or */
4401 0, /* nb_int */
4402 0, /* nb_reserved */
4403 0, /* nb_float */
4404 0, /* nb_inplace_add */
4405 0, /* nb_inplace_subtract */
4406 0, /* nb_inplace_multiply */
4407 0, /* nb_inplace_remainder */
4408 0, /* nb_inplace_power */
4409 0, /* nb_inplace_lshift */
4410 0, /* nb_inplace_rshift */
4411 0, /* nb_inplace_and */
4412 0, /* nb_inplace_xor */
4413 0, /* nb_inplace_or */
4414 0, /* nb_floor_divide */
4415 0, /* nb_true_divide */
4416 0, /* nb_inplace_floor_divide */
4417 0, /* nb_inplace_true_divide */
4418 0, /* nb_index */
4419 matmulType_matmul, /* nb_matrix_multiply */
4420 matmulType_imatmul /* nb_matrix_inplace_multiply */
4421};
4422
4423static PyTypeObject matmulType = {
4424 PyVarObject_HEAD_INIT(NULL, 0)
4425 "matmulType",
4426 sizeof(matmulObject), /* tp_basicsize */
4427 0, /* tp_itemsize */
4428 matmulType_dealloc, /* destructor tp_dealloc */
4429 0, /* tp_print */
4430 0, /* tp_getattr */
4431 0, /* tp_setattr */
4432 0, /* tp_reserved */
4433 0, /* tp_repr */
4434 &matmulType_as_number, /* tp_as_number */
4435 0, /* tp_as_sequence */
4436 0, /* tp_as_mapping */
4437 0, /* tp_hash */
4438 0, /* tp_call */
4439 0, /* tp_str */
4440 PyObject_GenericGetAttr, /* tp_getattro */
4441 PyObject_GenericSetAttr, /* tp_setattro */
4442 0, /* tp_as_buffer */
4443 0, /* tp_flags */
4444 "C level type with matrix operations defined",
4445 0, /* traverseproc tp_traverse */
4446 0, /* tp_clear */
4447 0, /* tp_richcompare */
4448 0, /* tp_weaklistoffset */
4449 0, /* tp_iter */
4450 0, /* tp_iternext */
4451 0, /* tp_methods */
4452 0, /* tp_members */
4453 0,
4454 0,
4455 0,
4456 0,
4457 0,
4458 0,
4459 0,
4460 0,
4461 PyType_GenericNew, /* tp_new */
4462 PyObject_Del, /* tp_free */
4463};
4464
Martin v. Löwis1a214512008-06-11 05:26:20 +00004465
Yury Selivanov75445082015-05-11 22:57:16 -04004466typedef struct {
4467 PyObject_HEAD
4468 PyObject *ao_iterator;
4469} awaitObject;
4470
4471
4472static PyObject *
4473awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4474{
4475 PyObject *v;
4476 awaitObject *ao;
4477
4478 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
4479 return NULL;
4480
4481 ao = (awaitObject *)type->tp_alloc(type, 0);
4482 if (ao == NULL) {
4483 return NULL;
4484 }
4485
4486 Py_INCREF(v);
4487 ao->ao_iterator = v;
4488
4489 return (PyObject *)ao;
4490}
4491
4492
4493static void
4494awaitObject_dealloc(awaitObject *ao)
4495{
4496 Py_CLEAR(ao->ao_iterator);
4497 Py_TYPE(ao)->tp_free(ao);
4498}
4499
4500
4501static PyObject *
4502awaitObject_await(awaitObject *ao)
4503{
4504 Py_INCREF(ao->ao_iterator);
4505 return ao->ao_iterator;
4506}
4507
4508static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04004509 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04004510 0, /* am_aiter */
4511 0 /* am_anext */
4512};
4513
4514
4515static PyTypeObject awaitType = {
4516 PyVarObject_HEAD_INIT(NULL, 0)
4517 "awaitType",
4518 sizeof(awaitObject), /* tp_basicsize */
4519 0, /* tp_itemsize */
4520 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
4521 0, /* tp_print */
4522 0, /* tp_getattr */
4523 0, /* tp_setattr */
4524 &awaitType_as_async, /* tp_as_async */
4525 0, /* tp_repr */
4526 0, /* tp_as_number */
4527 0, /* tp_as_sequence */
4528 0, /* tp_as_mapping */
4529 0, /* tp_hash */
4530 0, /* tp_call */
4531 0, /* tp_str */
4532 PyObject_GenericGetAttr, /* tp_getattro */
4533 PyObject_GenericSetAttr, /* tp_setattro */
4534 0, /* tp_as_buffer */
4535 0, /* tp_flags */
4536 "C level type with tp_as_async",
4537 0, /* traverseproc tp_traverse */
4538 0, /* tp_clear */
4539 0, /* tp_richcompare */
4540 0, /* tp_weaklistoffset */
4541 0, /* tp_iter */
4542 0, /* tp_iternext */
4543 0, /* tp_methods */
4544 0, /* tp_members */
4545 0,
4546 0,
4547 0,
4548 0,
4549 0,
4550 0,
4551 0,
4552 0,
4553 awaitObject_new, /* tp_new */
4554 PyObject_Del, /* tp_free */
4555};
4556
4557
Martin v. Löwis1a214512008-06-11 05:26:20 +00004558static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004559 PyModuleDef_HEAD_INIT,
4560 "_testcapi",
4561 NULL,
4562 -1,
4563 TestMethods,
4564 NULL,
4565 NULL,
4566 NULL,
4567 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004568};
4569
Nick Coghland5cacbb2015-05-23 22:24:10 +10004570/* Per PEP 489, this module will not be converted to multi-phase initialization
4571 */
4572
Mark Hammond62b1ab12002-07-23 06:31:15 +00004573PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004574PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00004575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004576 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004578 m = PyModule_Create(&_testcapimodule);
4579 if (m == NULL)
4580 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00004583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004584 Py_TYPE(&test_structmembersType)=&PyType_Type;
4585 Py_INCREF(&test_structmembersType);
4586 /* don't use a name starting with "test", since we don't want
4587 test_capi to automatically call this */
4588 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004589 if (PyType_Ready(&matmulType) < 0)
4590 return NULL;
4591 Py_INCREF(&matmulType);
4592 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004593
Yury Selivanov75445082015-05-11 22:57:16 -04004594 if (PyType_Ready(&awaitType) < 0)
4595 return NULL;
4596 Py_INCREF(&awaitType);
4597 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
4598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004599 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
4600 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
4601 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
4602 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
4603 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
4604 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
4605 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
4606 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
4607 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
4608 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
4609 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
4610 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
4611 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
4612 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
4613 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
4614 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
4615 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
4616 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
4617 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
4618 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
4619 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
4620 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02004621 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004622 Py_INCREF(&PyInstanceMethod_Type);
4623 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00004624
Larry Hastings2a727912014-01-16 11:32:01 -08004625 PyModule_AddIntConstant(m, "the_number_three", 3);
4626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004627 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
4628 Py_INCREF(TestError);
4629 PyModule_AddObject(m, "error", TestError);
4630 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004631}