blob: 1a296214739c63693dd9559bb934f524d1506769 [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
Victor Stinner7b7c6dc2017-08-10 12:37:39 +020021#ifdef HAVE_SYS_WAIT_H
22#include <sys/wait.h> /* For W_STOPCODE */
23#endif
24
Mark Hammond8d98d2c2003-04-19 15:41:53 +000025#include "pythread.h"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000026static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000027
Tim Peters91621db2001-06-12 20:10:01 +000028/* Raise TestError with test_name + ": " + msg, and return NULL. */
29
30static PyObject *
31raiseTestError(const char* test_name, const char* msg)
32{
Victor Stinner6ced7c42011-03-21 18:15:42 +010033 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000034 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000035}
36
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000037/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000038
39 The ones derived from autoconf on the UNIX-like OSes can be relied
40 upon (in the absence of sloppy cross-compiling), but the Windows
41 platforms have these hardcoded. Better safe than sorry.
42*/
43static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000044sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000046{
Victor Stinner499dfcf2011-03-21 13:26:24 +010047 PyErr_Format(TestError,
48 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000051}
52
53static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +000054test_config(PyObject *self)
Tim Peters9ea17ac2001-02-02 05:57:15 +000055{
Tim Peters9ea17ac2001-02-02 05:57:15 +000056#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 if (FATNAME != sizeof(TYPE)) \
58 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 CHECK_SIZEOF(SIZEOF_SHORT, short);
61 CHECK_SIZEOF(SIZEOF_INT, int);
62 CHECK_SIZEOF(SIZEOF_LONG, long);
63 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
64 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Benjamin Petersonaf580df2016-09-06 10:46:49 -070065 CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
Tim Peters9ea17ac2001-02-02 05:57:15 +000066
67#undef CHECK_SIZEOF
68
Serhiy Storchaka228b12e2017-01-23 09:47:21 +020069 Py_RETURN_NONE;
Tim Peters9ea17ac2001-02-02 05:57:15 +000070}
71
Tim Peters5c4d5bf2001-02-12 22:13:26 +000072static PyObject*
Victor Stinner01076552013-10-29 19:39:52 +010073test_sizeof_c_types(PyObject *self)
74{
Ned Deilye37a1942015-03-05 15:47:10 -080075#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020076#pragma GCC diagnostic push
77#pragma GCC diagnostic ignored "-Wtype-limits"
78#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010079#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010080 if (EXPECTED != sizeof(TYPE)) { \
81 PyErr_Format(TestError, \
82 "sizeof(%s) = %u instead of %u", \
83 #TYPE, sizeof(TYPE), EXPECTED); \
84 return (PyObject*)NULL; \
85 }
Victor Stinnerf866f972013-10-29 19:59:31 +010086#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
87#define CHECK_SIGNNESS(TYPE, SIGNED) \
88 if (IS_SIGNED(TYPE) != SIGNED) { \
89 PyErr_Format(TestError, \
90 "%s signness is, instead of %i", \
91 #TYPE, IS_SIGNED(TYPE), SIGNED); \
92 return (PyObject*)NULL; \
93 }
Victor Stinner01076552013-10-29 19:39:52 +010094
95 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +010096 CHECK_SIZEOF(Py_UCS1, 1);
97 CHECK_SIZEOF(Py_UCS2, 2);
98 CHECK_SIZEOF(Py_UCS4, 4);
99 CHECK_SIGNNESS(Py_UCS1, 0);
100 CHECK_SIGNNESS(Py_UCS2, 0);
101 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700102 CHECK_SIZEOF(int32_t, 4);
103 CHECK_SIGNNESS(int32_t, 1);
104 CHECK_SIZEOF(uint32_t, 4);
105 CHECK_SIGNNESS(uint32_t, 0);
106 CHECK_SIZEOF(int64_t, 8);
107 CHECK_SIGNNESS(int64_t, 1);
108 CHECK_SIZEOF(uint64_t, 8);
109 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100110
111 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100112 CHECK_SIZEOF(size_t, sizeof(void *));
113 CHECK_SIGNNESS(size_t, 0);
114 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
115 CHECK_SIGNNESS(Py_ssize_t, 1);
116
Benjamin Petersonca470632016-09-06 13:47:26 -0700117 CHECK_SIZEOF(uintptr_t, sizeof(void *));
118 CHECK_SIGNNESS(uintptr_t, 0);
119 CHECK_SIZEOF(intptr_t, sizeof(void *));
120 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100121
Serhiy Storchakad1302c02017-01-23 10:23:58 +0200122 Py_RETURN_NONE;
Victor Stinner01076552013-10-29 19:39:52 +0100123
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
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200172 Py_RETURN_NONE;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000173}
174
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000175static int
176test_dict_inner(int count)
177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 Py_ssize_t pos = 0, iterations = 0;
179 int i;
180 PyObject *dict = PyDict_New();
181 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 if (dict == NULL)
184 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 for (i = 0; i < count; i++) {
187 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200188 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200189 return -1;
190 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200191 if (PyDict_SetItem(dict, v, v) < 0) {
192 Py_DECREF(v);
193 return -1;
194 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 Py_DECREF(v);
196 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000198 while (PyDict_Next(dict, &pos, &k, &v)) {
199 PyObject *o;
200 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 i = PyLong_AS_LONG(v) + 1;
203 o = PyLong_FromLong(i);
204 if (o == NULL)
205 return -1;
206 if (PyDict_SetItem(dict, k, o) < 0) {
207 Py_DECREF(o);
208 return -1;
209 }
210 Py_DECREF(o);
211 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 if (iterations != count) {
216 PyErr_SetString(
217 TestError,
218 "test_dict_iteration: dict iteration went wrong ");
219 return -1;
220 } else {
221 return 0;
222 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000223}
224
225static PyObject*
Fred Drakeacee69f2002-04-01 14:28:58 +0000226test_dict_iteration(PyObject* self)
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 for (i = 0; i < 200; i++) {
231 if (test_dict_inner(i) < 0) {
232 return NULL;
233 }
234 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000235
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200236 Py_RETURN_NONE;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000237}
238
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200239static PyObject*
240dict_getitem_knownhash(PyObject *self, PyObject *args)
241{
242 PyObject *mp, *key, *result;
243 Py_ssize_t hash;
244
245 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
246 &mp, &key, &hash)) {
247 return NULL;
248 }
249
250 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
251 if (result == NULL && !PyErr_Occurred()) {
252 _PyErr_SetKeyError(key);
253 return NULL;
254 }
255
256 Py_XINCREF(result);
257 return result;
258}
Tim Peters91621db2001-06-12 20:10:01 +0000259
Victor Stinner3d3f2642016-12-15 17:21:23 +0100260static PyObject*
261dict_hassplittable(PyObject *self, PyObject *arg)
262{
263 if (!PyDict_Check(arg)) {
264 PyErr_Format(PyExc_TypeError,
265 "dict_hassplittable() argument must be dict, not '%s'",
266 arg->ob_type->tp_name);
267 return NULL;
268 }
269
270 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
271}
272
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000273/* Issue #4701: Check that PyObject_Hash implicitly calls
274 * PyType_Ready if it hasn't already been called
275 */
276static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 PyVarObject_HEAD_INIT(NULL, 0)
278 "hashinheritancetester", /* Name of this type */
279 sizeof(PyObject), /* Basic object size */
280 0, /* Item size for varobject */
281 (destructor)PyObject_Del, /* tp_dealloc */
282 0, /* tp_print */
283 0, /* tp_getattr */
284 0, /* tp_setattr */
285 0, /* tp_reserved */
286 0, /* tp_repr */
287 0, /* tp_as_number */
288 0, /* tp_as_sequence */
289 0, /* tp_as_mapping */
290 0, /* tp_hash */
291 0, /* tp_call */
292 0, /* tp_str */
293 PyObject_GenericGetAttr, /* tp_getattro */
294 0, /* tp_setattro */
295 0, /* tp_as_buffer */
296 Py_TPFLAGS_DEFAULT, /* tp_flags */
297 0, /* tp_doc */
298 0, /* tp_traverse */
299 0, /* tp_clear */
300 0, /* tp_richcompare */
301 0, /* tp_weaklistoffset */
302 0, /* tp_iter */
303 0, /* tp_iternext */
304 0, /* tp_methods */
305 0, /* tp_members */
306 0, /* tp_getset */
307 0, /* tp_base */
308 0, /* tp_dict */
309 0, /* tp_descr_get */
310 0, /* tp_descr_set */
311 0, /* tp_dictoffset */
312 0, /* tp_init */
313 0, /* tp_alloc */
314 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000315};
316
317static PyObject*
318test_lazy_hash_inheritance(PyObject* self)
319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 PyTypeObject *type;
321 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000322 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 if (type->tp_dict != NULL)
327 /* The type has already been initialized. This probably means
328 -R is being used. */
329 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000330
331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 obj = PyObject_New(PyObject, type);
333 if (obj == NULL) {
334 PyErr_Clear();
335 PyErr_SetString(
336 TestError,
337 "test_lazy_hash_inheritance: failed to create object");
338 return NULL;
339 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 if (type->tp_dict != NULL) {
342 PyErr_SetString(
343 TestError,
344 "test_lazy_hash_inheritance: type initialised too soon");
345 Py_DECREF(obj);
346 return NULL;
347 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 hash = PyObject_Hash(obj);
350 if ((hash == -1) && PyErr_Occurred()) {
351 PyErr_Clear();
352 PyErr_SetString(
353 TestError,
354 "test_lazy_hash_inheritance: could not hash object");
355 Py_DECREF(obj);
356 return NULL;
357 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 if (type->tp_dict == NULL) {
360 PyErr_SetString(
361 TestError,
362 "test_lazy_hash_inheritance: type not initialised by hash()");
363 Py_DECREF(obj);
364 return NULL;
365 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 if (type->tp_hash != PyType_Type.tp_hash) {
368 PyErr_SetString(
369 TestError,
370 "test_lazy_hash_inheritance: unexpected hash function");
371 Py_DECREF(obj);
372 return NULL;
373 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000378}
379
380
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700381/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000382 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000383
384 Note that the meat of the test is contained in testcapi_long.h.
385 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700386 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000387 dependence on type names makes it impossible to use a parameterized
388 function. A giant macro would be even worse than this. A C++ template
389 would be perfect.
390
391 The "report an error" functions are deliberately not part of the #include
392 file: if the test fails, you can set a breakpoint in the appropriate
393 error function directly, and crawl back from there in the debugger.
394*/
395
396#define UNBIND(X) Py_DECREF(X); (X) = NULL
397
398static PyObject *
399raise_test_long_error(const char* msg)
400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000402}
403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404#define TESTNAME test_long_api_inner
405#define TYPENAME long
406#define F_S_TO_PY PyLong_FromLong
407#define F_PY_TO_S PyLong_AsLong
408#define F_U_TO_PY PyLong_FromUnsignedLong
409#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000410
411#include "testcapi_long.h"
412
413static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000414test_long_api(PyObject* self)
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000417}
418
419#undef TESTNAME
420#undef TYPENAME
421#undef F_S_TO_PY
422#undef F_PY_TO_S
423#undef F_U_TO_PY
424#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000425
Tim Peters91621db2001-06-12 20:10:01 +0000426static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000427raise_test_longlong_error(const char* msg)
428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000430}
431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700433#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434#define F_S_TO_PY PyLong_FromLongLong
435#define F_PY_TO_S PyLong_AsLongLong
436#define F_U_TO_PY PyLong_FromUnsignedLongLong
437#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000438
439#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000440
441static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000442test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000445}
446
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000447#undef TESTNAME
448#undef TYPENAME
449#undef F_S_TO_PY
450#undef F_PY_TO_S
451#undef F_U_TO_PY
452#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000453
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000454/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
455 is tested by test_long_api_inner. This test will concentrate on proper
456 handling of overflow.
457*/
458
459static PyObject *
460test_long_and_overflow(PyObject *self)
461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 PyObject *num, *one, *temp;
463 long value;
464 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 /* Test that overflow is set properly for a large value. */
467 /* num is a number larger than LONG_MAX even on 64-bit platforms */
468 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
469 if (num == NULL)
470 return NULL;
471 overflow = 1234;
472 value = PyLong_AsLongAndOverflow(num, &overflow);
473 Py_DECREF(num);
474 if (value == -1 && PyErr_Occurred())
475 return NULL;
476 if (value != -1)
477 return raiseTestError("test_long_and_overflow",
478 "return value was not set to -1");
479 if (overflow != 1)
480 return raiseTestError("test_long_and_overflow",
481 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 /* Same again, with num = LONG_MAX + 1 */
484 num = PyLong_FromLong(LONG_MAX);
485 if (num == NULL)
486 return NULL;
487 one = PyLong_FromLong(1L);
488 if (one == NULL) {
489 Py_DECREF(num);
490 return NULL;
491 }
492 temp = PyNumber_Add(num, one);
493 Py_DECREF(one);
494 Py_DECREF(num);
495 num = temp;
496 if (num == NULL)
497 return NULL;
498 overflow = 0;
499 value = PyLong_AsLongAndOverflow(num, &overflow);
500 Py_DECREF(num);
501 if (value == -1 && PyErr_Occurred())
502 return NULL;
503 if (value != -1)
504 return raiseTestError("test_long_and_overflow",
505 "return value was not set to -1");
506 if (overflow != 1)
507 return raiseTestError("test_long_and_overflow",
508 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 /* Test that overflow is set properly for a large negative value. */
511 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
512 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
513 if (num == NULL)
514 return NULL;
515 overflow = 1234;
516 value = PyLong_AsLongAndOverflow(num, &overflow);
517 Py_DECREF(num);
518 if (value == -1 && PyErr_Occurred())
519 return NULL;
520 if (value != -1)
521 return raiseTestError("test_long_and_overflow",
522 "return value was not set to -1");
523 if (overflow != -1)
524 return raiseTestError("test_long_and_overflow",
525 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 /* Same again, with num = LONG_MIN - 1 */
528 num = PyLong_FromLong(LONG_MIN);
529 if (num == NULL)
530 return NULL;
531 one = PyLong_FromLong(1L);
532 if (one == NULL) {
533 Py_DECREF(num);
534 return NULL;
535 }
536 temp = PyNumber_Subtract(num, one);
537 Py_DECREF(one);
538 Py_DECREF(num);
539 num = temp;
540 if (num == NULL)
541 return NULL;
542 overflow = 0;
543 value = PyLong_AsLongAndOverflow(num, &overflow);
544 Py_DECREF(num);
545 if (value == -1 && PyErr_Occurred())
546 return NULL;
547 if (value != -1)
548 return raiseTestError("test_long_and_overflow",
549 "return value was not set to -1");
550 if (overflow != -1)
551 return raiseTestError("test_long_and_overflow",
552 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 /* Test that overflow is cleared properly for small values. */
555 num = PyLong_FromString("FF", NULL, 16);
556 if (num == NULL)
557 return NULL;
558 overflow = 1234;
559 value = PyLong_AsLongAndOverflow(num, &overflow);
560 Py_DECREF(num);
561 if (value == -1 && PyErr_Occurred())
562 return NULL;
563 if (value != 0xFF)
564 return raiseTestError("test_long_and_overflow",
565 "expected return value 0xFF");
566 if (overflow != 0)
567 return raiseTestError("test_long_and_overflow",
568 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 num = PyLong_FromString("-FF", NULL, 16);
571 if (num == NULL)
572 return NULL;
573 overflow = 0;
574 value = PyLong_AsLongAndOverflow(num, &overflow);
575 Py_DECREF(num);
576 if (value == -1 && PyErr_Occurred())
577 return NULL;
578 if (value != -0xFF)
579 return raiseTestError("test_long_and_overflow",
580 "expected return value 0xFF");
581 if (overflow != 0)
582 return raiseTestError("test_long_and_overflow",
583 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 num = PyLong_FromLong(LONG_MAX);
586 if (num == NULL)
587 return NULL;
588 overflow = 1234;
589 value = PyLong_AsLongAndOverflow(num, &overflow);
590 Py_DECREF(num);
591 if (value == -1 && PyErr_Occurred())
592 return NULL;
593 if (value != LONG_MAX)
594 return raiseTestError("test_long_and_overflow",
595 "expected return value LONG_MAX");
596 if (overflow != 0)
597 return raiseTestError("test_long_and_overflow",
598 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 num = PyLong_FromLong(LONG_MIN);
601 if (num == NULL)
602 return NULL;
603 overflow = 0;
604 value = PyLong_AsLongAndOverflow(num, &overflow);
605 Py_DECREF(num);
606 if (value == -1 && PyErr_Occurred())
607 return NULL;
608 if (value != LONG_MIN)
609 return raiseTestError("test_long_and_overflow",
610 "expected return value LONG_MIN");
611 if (overflow != 0)
612 return raiseTestError("test_long_and_overflow",
613 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000614
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200615 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000616}
617
Mark Dickinson93f562c2010-01-30 10:30:15 +0000618/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700619 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000620 concentrate on proper handling of overflow.
621*/
622
623static PyObject *
624test_long_long_and_overflow(PyObject *self)
625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700627 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 /* Test that overflow is set properly for a large value. */
631 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
632 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
633 if (num == NULL)
634 return NULL;
635 overflow = 1234;
636 value = PyLong_AsLongLongAndOverflow(num, &overflow);
637 Py_DECREF(num);
638 if (value == -1 && PyErr_Occurred())
639 return NULL;
640 if (value != -1)
641 return raiseTestError("test_long_long_and_overflow",
642 "return value was not set to -1");
643 if (overflow != 1)
644 return raiseTestError("test_long_long_and_overflow",
645 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 /* Same again, with num = PY_LLONG_MAX + 1 */
648 num = PyLong_FromLongLong(PY_LLONG_MAX);
649 if (num == NULL)
650 return NULL;
651 one = PyLong_FromLong(1L);
652 if (one == NULL) {
653 Py_DECREF(num);
654 return NULL;
655 }
656 temp = PyNumber_Add(num, one);
657 Py_DECREF(one);
658 Py_DECREF(num);
659 num = temp;
660 if (num == NULL)
661 return NULL;
662 overflow = 0;
663 value = PyLong_AsLongLongAndOverflow(num, &overflow);
664 Py_DECREF(num);
665 if (value == -1 && PyErr_Occurred())
666 return NULL;
667 if (value != -1)
668 return raiseTestError("test_long_long_and_overflow",
669 "return value was not set to -1");
670 if (overflow != 1)
671 return raiseTestError("test_long_long_and_overflow",
672 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 /* Test that overflow is set properly for a large negative value. */
675 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
676 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
677 if (num == NULL)
678 return NULL;
679 overflow = 1234;
680 value = PyLong_AsLongLongAndOverflow(num, &overflow);
681 Py_DECREF(num);
682 if (value == -1 && PyErr_Occurred())
683 return NULL;
684 if (value != -1)
685 return raiseTestError("test_long_long_and_overflow",
686 "return value was not set to -1");
687 if (overflow != -1)
688 return raiseTestError("test_long_long_and_overflow",
689 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 /* Same again, with num = PY_LLONG_MIN - 1 */
692 num = PyLong_FromLongLong(PY_LLONG_MIN);
693 if (num == NULL)
694 return NULL;
695 one = PyLong_FromLong(1L);
696 if (one == NULL) {
697 Py_DECREF(num);
698 return NULL;
699 }
700 temp = PyNumber_Subtract(num, one);
701 Py_DECREF(one);
702 Py_DECREF(num);
703 num = temp;
704 if (num == NULL)
705 return NULL;
706 overflow = 0;
707 value = PyLong_AsLongLongAndOverflow(num, &overflow);
708 Py_DECREF(num);
709 if (value == -1 && PyErr_Occurred())
710 return NULL;
711 if (value != -1)
712 return raiseTestError("test_long_long_and_overflow",
713 "return value was not set to -1");
714 if (overflow != -1)
715 return raiseTestError("test_long_long_and_overflow",
716 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 /* Test that overflow is cleared properly for small values. */
719 num = PyLong_FromString("FF", NULL, 16);
720 if (num == NULL)
721 return NULL;
722 overflow = 1234;
723 value = PyLong_AsLongLongAndOverflow(num, &overflow);
724 Py_DECREF(num);
725 if (value == -1 && PyErr_Occurred())
726 return NULL;
727 if (value != 0xFF)
728 return raiseTestError("test_long_long_and_overflow",
729 "expected return value 0xFF");
730 if (overflow != 0)
731 return raiseTestError("test_long_long_and_overflow",
732 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 num = PyLong_FromString("-FF", NULL, 16);
735 if (num == NULL)
736 return NULL;
737 overflow = 0;
738 value = PyLong_AsLongLongAndOverflow(num, &overflow);
739 Py_DECREF(num);
740 if (value == -1 && PyErr_Occurred())
741 return NULL;
742 if (value != -0xFF)
743 return raiseTestError("test_long_long_and_overflow",
744 "expected return value 0xFF");
745 if (overflow != 0)
746 return raiseTestError("test_long_long_and_overflow",
747 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 num = PyLong_FromLongLong(PY_LLONG_MAX);
750 if (num == NULL)
751 return NULL;
752 overflow = 1234;
753 value = PyLong_AsLongLongAndOverflow(num, &overflow);
754 Py_DECREF(num);
755 if (value == -1 && PyErr_Occurred())
756 return NULL;
757 if (value != PY_LLONG_MAX)
758 return raiseTestError("test_long_long_and_overflow",
759 "expected return value PY_LLONG_MAX");
760 if (overflow != 0)
761 return raiseTestError("test_long_long_and_overflow",
762 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 num = PyLong_FromLongLong(PY_LLONG_MIN);
765 if (num == NULL)
766 return NULL;
767 overflow = 0;
768 value = PyLong_AsLongLongAndOverflow(num, &overflow);
769 Py_DECREF(num);
770 if (value == -1 && PyErr_Occurred())
771 return NULL;
772 if (value != PY_LLONG_MIN)
773 return raiseTestError("test_long_long_and_overflow",
774 "expected return value PY_LLONG_MIN");
775 if (overflow != 0)
776 return raiseTestError("test_long_long_and_overflow",
777 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000778
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200779 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000780}
781
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200782/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
783 non-integer arguments are handled correctly. It should be extended to
784 test overflow handling.
785 */
786
787static PyObject *
788test_long_as_size_t(PyObject *self)
789{
790 size_t out_u;
791 Py_ssize_t out_s;
792
793 Py_INCREF(Py_None);
794
795 out_u = PyLong_AsSize_t(Py_None);
796 if (out_u != (size_t)-1 || !PyErr_Occurred())
797 return raiseTestError("test_long_as_size_t",
798 "PyLong_AsSize_t(None) didn't complain");
799 if (!PyErr_ExceptionMatches(PyExc_TypeError))
800 return raiseTestError("test_long_as_size_t",
801 "PyLong_AsSize_t(None) raised "
802 "something other than TypeError");
803 PyErr_Clear();
804
805 out_s = PyLong_AsSsize_t(Py_None);
806 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
807 return raiseTestError("test_long_as_size_t",
808 "PyLong_AsSsize_t(None) didn't complain");
809 if (!PyErr_ExceptionMatches(PyExc_TypeError))
810 return raiseTestError("test_long_as_size_t",
811 "PyLong_AsSsize_t(None) raised "
812 "something other than TypeError");
813 PyErr_Clear();
814
815 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
816 return Py_None;
817}
818
819/* Test the PyLong_AsDouble API. At present this just tests that
820 non-integer arguments are handled correctly.
821 */
822
823static PyObject *
824test_long_as_double(PyObject *self)
825{
826 double out;
827
828 Py_INCREF(Py_None);
829
830 out = PyLong_AsDouble(Py_None);
831 if (out != -1.0 || !PyErr_Occurred())
832 return raiseTestError("test_long_as_double",
833 "PyLong_AsDouble(None) didn't complain");
834 if (!PyErr_ExceptionMatches(PyExc_TypeError))
835 return raiseTestError("test_long_as_double",
836 "PyLong_AsDouble(None) raised "
837 "something other than TypeError");
838 PyErr_Clear();
839
840 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
841 return Py_None;
842}
843
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700844/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000845 for both long and int arguments. The test may leak a little memory if
846 it fails.
847*/
848static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000849test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000850{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700852 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 tuple = PyTuple_New(1);
855 if (tuple == NULL)
856 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 num = PyLong_FromLong(42);
859 if (num == NULL)
860 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300865 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300867 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 if (value != 42)
869 return raiseTestError("test_L_code",
870 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 Py_DECREF(num);
873 num = PyLong_FromLong(42);
874 if (num == NULL)
875 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300880 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300882 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 if (value != 42)
884 return raiseTestError("test_L_code",
885 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200888 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000889}
890
Serhiy Storchakace412872016-05-08 23:36:44 +0300891static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300892return_none(void *unused)
893{
894 Py_RETURN_NONE;
895}
896
897static PyObject *
898raise_error(void *unused)
899{
900 PyErr_SetNone(PyExc_ValueError);
901 return NULL;
902}
903
904static int
905test_buildvalue_N_error(const char *fmt)
906{
907 PyObject *arg, *res;
908
909 arg = PyList_New(0);
910 if (arg == NULL) {
911 return -1;
912 }
913
914 Py_INCREF(arg);
915 res = Py_BuildValue(fmt, return_none, NULL, arg);
916 if (res == NULL) {
917 return -1;
918 }
919 Py_DECREF(res);
920 if (Py_REFCNT(arg) != 1) {
921 PyErr_Format(TestError, "test_buildvalue_N: "
922 "arg was not decrefed in successful "
923 "Py_BuildValue(\"%s\")", fmt);
924 return -1;
925 }
926
927 Py_INCREF(arg);
928 res = Py_BuildValue(fmt, raise_error, NULL, arg);
929 if (res != NULL || !PyErr_Occurred()) {
930 PyErr_Format(TestError, "test_buildvalue_N: "
931 "Py_BuildValue(\"%s\") didn't complain", fmt);
932 return -1;
933 }
934 PyErr_Clear();
935 if (Py_REFCNT(arg) != 1) {
936 PyErr_Format(TestError, "test_buildvalue_N: "
937 "arg was not decrefed in failed "
938 "Py_BuildValue(\"%s\")", fmt);
939 return -1;
940 }
941 Py_DECREF(arg);
942 return 0;
943}
944
945static PyObject *
946test_buildvalue_N(PyObject *self, PyObject *noargs)
947{
948 PyObject *arg, *res;
949
950 arg = PyList_New(0);
951 if (arg == NULL) {
952 return NULL;
953 }
954 Py_INCREF(arg);
955 res = Py_BuildValue("N", arg);
956 if (res == NULL) {
957 return NULL;
958 }
959 if (res != arg) {
960 return raiseTestError("test_buildvalue_N",
961 "Py_BuildValue(\"N\") returned wrong result");
962 }
963 if (Py_REFCNT(arg) != 2) {
964 return raiseTestError("test_buildvalue_N",
965 "arg was not decrefed in Py_BuildValue(\"N\")");
966 }
967 Py_DECREF(res);
968 Py_DECREF(arg);
969
970 if (test_buildvalue_N_error("O&N") < 0)
971 return NULL;
972 if (test_buildvalue_N_error("(O&N)") < 0)
973 return NULL;
974 if (test_buildvalue_N_error("[O&N]") < 0)
975 return NULL;
976 if (test_buildvalue_N_error("{O&N}") < 0)
977 return NULL;
978 if (test_buildvalue_N_error("{()O&(())N}") < 0)
979 return NULL;
980
981 Py_RETURN_NONE;
982}
983
984
985static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +0300986get_args(PyObject *self, PyObject *args)
987{
988 if (args == NULL) {
989 args = Py_None;
990 }
991 Py_INCREF(args);
992 return args;
993}
994
995static PyObject *
996get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
997{
998 if (kwargs == NULL) {
999 kwargs = Py_None;
1000 }
1001 Py_INCREF(kwargs);
1002 return kwargs;
1003}
1004
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001005/* Test tuple argument processing */
1006static PyObject *
1007getargs_tuple(PyObject *self, PyObject *args)
1008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 int a, b, c;
1010 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1011 return NULL;
1012 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001013}
1014
Christian Heimes380f7f22008-02-28 11:19:05 +00001015/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001016static PyObject *
1017getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001020 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1024 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1025 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1026 return NULL;
1027 return Py_BuildValue("iiiiiiiiii",
1028 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1029 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001030}
1031
Larry Hastings83a9f482012-03-20 20:06:16 +00001032/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1033static PyObject *
1034getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1035{
1036 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1037 int required = -1;
1038 int optional = -1;
1039 int keyword_only = -1;
1040
1041 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1042 &required, &optional, &keyword_only))
1043 return NULL;
1044 return Py_BuildValue("iii", required, optional, keyword_only);
1045}
1046
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001047/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1048static PyObject *
1049getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1050{
1051 static char *keywords[] = {"", "", "keyword", NULL};
1052 int required = -1;
1053 int optional = -1;
1054 int keyword = -1;
1055
1056 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1057 &required, &optional, &keyword))
1058 return NULL;
1059 return Py_BuildValue("iii", required, optional, keyword);
1060}
1061
Thomas Heller3457e4b2003-04-24 16:14:27 +00001062/* Functions to call PyArg_ParseTuple with integer format codes,
1063 and return the result.
1064*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001065static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001066getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001067{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 unsigned char value;
1069 if (!PyArg_ParseTuple(args, "b", &value))
1070 return NULL;
1071 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001072}
1073
Thomas Heller3457e4b2003-04-24 16:14:27 +00001074static PyObject *
1075getargs_B(PyObject *self, PyObject *args)
1076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 unsigned char value;
1078 if (!PyArg_ParseTuple(args, "B", &value))
1079 return NULL;
1080 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001081}
1082
1083static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001084getargs_h(PyObject *self, PyObject *args)
1085{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 short value;
1087 if (!PyArg_ParseTuple(args, "h", &value))
1088 return NULL;
1089 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001090}
1091
1092static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001093getargs_H(PyObject *self, PyObject *args)
1094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 unsigned short value;
1096 if (!PyArg_ParseTuple(args, "H", &value))
1097 return NULL;
1098 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001099}
1100
1101static PyObject *
1102getargs_I(PyObject *self, PyObject *args)
1103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 unsigned int value;
1105 if (!PyArg_ParseTuple(args, "I", &value))
1106 return NULL;
1107 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001108}
1109
1110static PyObject *
1111getargs_k(PyObject *self, PyObject *args)
1112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 unsigned long value;
1114 if (!PyArg_ParseTuple(args, "k", &value))
1115 return NULL;
1116 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001117}
1118
1119static PyObject *
1120getargs_i(PyObject *self, PyObject *args)
1121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 int value;
1123 if (!PyArg_ParseTuple(args, "i", &value))
1124 return NULL;
1125 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001126}
1127
Thomas Hellera4ea6032003-04-17 18:55:45 +00001128static PyObject *
1129getargs_l(PyObject *self, PyObject *args)
1130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 long value;
1132 if (!PyArg_ParseTuple(args, "l", &value))
1133 return NULL;
1134 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001135}
1136
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001137static PyObject *
1138getargs_n(PyObject *self, PyObject *args)
1139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 Py_ssize_t value;
1141 if (!PyArg_ParseTuple(args, "n", &value))
1142 return NULL;
1143 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001144}
1145
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001146static PyObject *
1147getargs_p(PyObject *self, PyObject *args)
1148{
1149 int value;
1150 if (!PyArg_ParseTuple(args, "p", &value))
1151 return NULL;
1152 return PyLong_FromLong(value);
1153}
1154
Thomas Hellera4ea6032003-04-17 18:55:45 +00001155static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001156getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001157{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001158 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 if (!PyArg_ParseTuple(args, "L", &value))
1160 return NULL;
1161 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001162}
1163
Thomas Hellera4ea6032003-04-17 18:55:45 +00001164static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001165getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001166{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001167 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 if (!PyArg_ParseTuple(args, "K", &value))
1169 return NULL;
1170 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001171}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001172
1173/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001174 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001175static PyObject *
1176test_k_code(PyObject *self)
1177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 PyObject *tuple, *num;
1179 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 tuple = PyTuple_New(1);
1182 if (tuple == NULL)
1183 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 /* a number larger than ULONG_MAX even on 64-bit platforms */
1186 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1187 if (num == NULL)
1188 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 value = PyLong_AsUnsignedLongMask(num);
1191 if (value != ULONG_MAX)
1192 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001193 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001198 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001200 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 if (value != ULONG_MAX)
1202 return raiseTestError("test_k_code",
1203 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 Py_DECREF(num);
1206 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1207 if (num == NULL)
1208 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 value = PyLong_AsUnsignedLongMask(num);
1211 if (value != (unsigned long)-0x42)
1212 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001213 "PyLong_AsUnsignedLongMask() returned wrong "
1214 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001219 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001221 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 if (value != (unsigned long)-0x42)
1223 return raiseTestError("test_k_code",
1224 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001227 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001228}
1229
Victor Stinner06e49dd2010-06-13 18:21:50 +00001230static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001231getargs_f(PyObject *self, PyObject *args)
1232{
1233 float f;
1234 if (!PyArg_ParseTuple(args, "f", &f))
1235 return NULL;
1236 return PyFloat_FromDouble(f);
1237}
1238
1239static PyObject *
1240getargs_d(PyObject *self, PyObject *args)
1241{
1242 double d;
1243 if (!PyArg_ParseTuple(args, "d", &d))
1244 return NULL;
1245 return PyFloat_FromDouble(d);
1246}
1247
1248static PyObject *
1249getargs_D(PyObject *self, PyObject *args)
1250{
1251 Py_complex cval;
1252 if (!PyArg_ParseTuple(args, "D", &cval))
1253 return NULL;
1254 return PyComplex_FromCComplex(cval);
1255}
1256
1257static PyObject *
1258getargs_S(PyObject *self, PyObject *args)
1259{
1260 PyObject *obj;
1261 if (!PyArg_ParseTuple(args, "S", &obj))
1262 return NULL;
1263 Py_INCREF(obj);
1264 return obj;
1265}
1266
1267static PyObject *
1268getargs_Y(PyObject *self, PyObject *args)
1269{
1270 PyObject *obj;
1271 if (!PyArg_ParseTuple(args, "Y", &obj))
1272 return NULL;
1273 Py_INCREF(obj);
1274 return obj;
1275}
1276
1277static PyObject *
1278getargs_U(PyObject *self, PyObject *args)
1279{
1280 PyObject *obj;
1281 if (!PyArg_ParseTuple(args, "U", &obj))
1282 return NULL;
1283 Py_INCREF(obj);
1284 return obj;
1285}
1286
1287static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001288getargs_c(PyObject *self, PyObject *args)
1289{
1290 char c;
1291 if (!PyArg_ParseTuple(args, "c", &c))
1292 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001293 return PyLong_FromLong((unsigned char)c);
1294}
1295
1296static PyObject *
1297getargs_C(PyObject *self, PyObject *args)
1298{
1299 int c;
1300 if (!PyArg_ParseTuple(args, "C", &c))
1301 return NULL;
1302 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001303}
1304
1305static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001306getargs_s(PyObject *self, PyObject *args)
1307{
1308 char *str;
1309 if (!PyArg_ParseTuple(args, "s", &str))
1310 return NULL;
1311 return PyBytes_FromString(str);
1312}
1313
1314static PyObject *
1315getargs_s_star(PyObject *self, PyObject *args)
1316{
1317 Py_buffer buffer;
1318 PyObject *bytes;
1319 if (!PyArg_ParseTuple(args, "s*", &buffer))
1320 return NULL;
1321 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1322 PyBuffer_Release(&buffer);
1323 return bytes;
1324}
1325
1326static PyObject *
1327getargs_s_hash(PyObject *self, PyObject *args)
1328{
1329 char *str;
1330 Py_ssize_t size;
1331 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1332 return NULL;
1333 return PyBytes_FromStringAndSize(str, size);
1334}
1335
1336static PyObject *
1337getargs_z(PyObject *self, PyObject *args)
1338{
1339 char *str;
1340 if (!PyArg_ParseTuple(args, "z", &str))
1341 return NULL;
1342 if (str != NULL)
1343 return PyBytes_FromString(str);
1344 else
1345 Py_RETURN_NONE;
1346}
1347
1348static PyObject *
1349getargs_z_star(PyObject *self, PyObject *args)
1350{
1351 Py_buffer buffer;
1352 PyObject *bytes;
1353 if (!PyArg_ParseTuple(args, "z*", &buffer))
1354 return NULL;
1355 if (buffer.buf != NULL)
1356 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1357 else {
1358 Py_INCREF(Py_None);
1359 bytes = Py_None;
1360 }
1361 PyBuffer_Release(&buffer);
1362 return bytes;
1363}
1364
1365static PyObject *
1366getargs_z_hash(PyObject *self, PyObject *args)
1367{
1368 char *str;
1369 Py_ssize_t size;
1370 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1371 return NULL;
1372 if (str != NULL)
1373 return PyBytes_FromStringAndSize(str, size);
1374 else
1375 Py_RETURN_NONE;
1376}
1377
1378static PyObject *
1379getargs_y(PyObject *self, PyObject *args)
1380{
1381 char *str;
1382 if (!PyArg_ParseTuple(args, "y", &str))
1383 return NULL;
1384 return PyBytes_FromString(str);
1385}
1386
1387static PyObject *
1388getargs_y_star(PyObject *self, PyObject *args)
1389{
1390 Py_buffer buffer;
1391 PyObject *bytes;
1392 if (!PyArg_ParseTuple(args, "y*", &buffer))
1393 return NULL;
1394 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1395 PyBuffer_Release(&buffer);
1396 return bytes;
1397}
1398
1399static PyObject *
1400getargs_y_hash(PyObject *self, PyObject *args)
1401{
1402 char *str;
1403 Py_ssize_t size;
1404 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1405 return NULL;
1406 return PyBytes_FromStringAndSize(str, size);
1407}
1408
1409static PyObject *
1410getargs_u(PyObject *self, PyObject *args)
1411{
1412 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001413 if (!PyArg_ParseTuple(args, "u", &str))
1414 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001415 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001416}
1417
1418static PyObject *
1419getargs_u_hash(PyObject *self, PyObject *args)
1420{
1421 Py_UNICODE *str;
1422 Py_ssize_t size;
1423 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1424 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001425 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001426}
1427
1428static PyObject *
1429getargs_Z(PyObject *self, PyObject *args)
1430{
1431 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001432 if (!PyArg_ParseTuple(args, "Z", &str))
1433 return NULL;
1434 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001435 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001436 } else
1437 Py_RETURN_NONE;
1438}
1439
1440static PyObject *
1441getargs_Z_hash(PyObject *self, PyObject *args)
1442{
1443 Py_UNICODE *str;
1444 Py_ssize_t size;
1445 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1446 return NULL;
1447 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001448 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001449 else
1450 Py_RETURN_NONE;
1451}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001452
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001453static PyObject *
1454getargs_es(PyObject *self, PyObject *args)
1455{
1456 PyObject *arg, *result;
1457 const char *encoding = NULL;
1458 char *str;
1459
1460 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1461 return NULL;
1462 if (!PyArg_Parse(arg, "es", encoding, &str))
1463 return NULL;
1464 result = PyBytes_FromString(str);
1465 PyMem_Free(str);
1466 return result;
1467}
1468
1469static PyObject *
1470getargs_et(PyObject *self, PyObject *args)
1471{
1472 PyObject *arg, *result;
1473 const char *encoding = NULL;
1474 char *str;
1475
1476 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1477 return NULL;
1478 if (!PyArg_Parse(arg, "et", encoding, &str))
1479 return NULL;
1480 result = PyBytes_FromString(str);
1481 PyMem_Free(str);
1482 return result;
1483}
1484
1485static PyObject *
1486getargs_es_hash(PyObject *self, PyObject *args)
1487{
1488 PyObject *arg, *result;
1489 const char *encoding = NULL;
1490 PyByteArrayObject *buffer = NULL;
1491 char *str = NULL;
1492 Py_ssize_t size;
1493
1494 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1495 return NULL;
1496 if (buffer != NULL) {
1497 str = PyByteArray_AS_STRING(buffer);
1498 size = PyByteArray_GET_SIZE(buffer);
1499 }
1500 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1501 return NULL;
1502 result = PyBytes_FromStringAndSize(str, size);
1503 if (buffer == NULL)
1504 PyMem_Free(str);
1505 return result;
1506}
1507
1508static PyObject *
1509getargs_et_hash(PyObject *self, PyObject *args)
1510{
1511 PyObject *arg, *result;
1512 const char *encoding = NULL;
1513 PyByteArrayObject *buffer = NULL;
1514 char *str = NULL;
1515 Py_ssize_t size;
1516
1517 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1518 return NULL;
1519 if (buffer != NULL) {
1520 str = PyByteArray_AS_STRING(buffer);
1521 size = PyByteArray_GET_SIZE(buffer);
1522 }
1523 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1524 return NULL;
1525 result = PyBytes_FromStringAndSize(str, size);
1526 if (buffer == NULL)
1527 PyMem_Free(str);
1528 return result;
1529}
1530
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001531/* Test the s and z codes for PyArg_ParseTuple.
1532*/
1533static PyObject *
1534test_s_code(PyObject *self)
1535{
1536 /* Unicode strings should be accepted */
1537 PyObject *tuple, *obj;
1538 char *value;
1539
1540 tuple = PyTuple_New(1);
1541 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001543
1544 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001546 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001548
1549 PyTuple_SET_ITEM(tuple, 0, obj);
1550
1551 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001553 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001554 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1555 return NULL;
1556 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001557
Oren Milmanba7d7362017-08-29 11:58:27 +03001558 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1559 return NULL;
1560 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001561
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001562 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001563 Py_RETURN_NONE;
1564}
1565
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001566static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001567parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001568{
Larry Hastings8f904da2012-06-22 03:56:29 -07001569 PyObject *sub_args;
1570 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001571 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001572 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001573
Larry Hastings8f904da2012-06-22 03:56:29 -07001574 Py_ssize_t i, size;
1575 char *keywords[8 + 1]; /* space for NULL at end */
1576 PyObject *o;
1577 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001578
Larry Hastings8f904da2012-06-22 03:56:29 -07001579 int result;
1580 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001581
Larry Hastings22701e82012-08-08 14:52:22 -07001582 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001583
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001584 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001585 &sub_args, &sub_kwargs,
1586 &sub_format, &sub_keywords))
1587 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001588
Larry Hastings8f904da2012-06-22 03:56:29 -07001589 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1590 PyErr_SetString(PyExc_ValueError,
1591 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1592 return NULL;
1593 }
1594
1595 memset(buffers, 0, sizeof(buffers));
1596 memset(converted, 0, sizeof(converted));
1597 memset(keywords, 0, sizeof(keywords));
1598
1599 size = PySequence_Fast_GET_SIZE(sub_keywords);
1600 if (size > 8) {
1601 PyErr_SetString(PyExc_ValueError,
1602 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1603 goto exit;
1604 }
1605
1606 for (i = 0; i < size; i++) {
1607 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1608 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1609 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001610 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001611 goto exit;
1612 }
1613 keywords[i] = PyBytes_AS_STRING(converted[i]);
1614 }
1615
1616 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1617 sub_format, keywords,
1618 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1619 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1620
1621 if (result) {
1622 return_value = Py_None;
1623 Py_INCREF(Py_None);
1624 }
1625
1626exit:
1627 size = sizeof(converted) / sizeof(converted[0]);
1628 for (i = 0; i < size; i++) {
1629 Py_XDECREF(converted[i]);
1630 }
1631 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001632}
1633
Benjamin Peterson92035012008-12-27 16:00:54 +00001634static volatile int x;
1635
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001636/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1637 of an error.
1638*/
1639static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001640test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001641{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 PyObject *tuple, *obj;
1643 Py_UNICODE *value;
1644 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1647 /* Just use the macro and check that it compiles */
1648 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 tuple = PyTuple_New(1);
1651 if (tuple == NULL)
1652 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 obj = PyUnicode_Decode("test", strlen("test"),
1655 "ascii", NULL);
1656 if (obj == NULL)
1657 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001662 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001664 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 if (value != PyUnicode_AS_UNICODE(obj))
1666 return raiseTestError("test_u_code",
1667 "u code returned wrong value for u'test'");
1668 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001669 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001671 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 if (value != PyUnicode_AS_UNICODE(obj) ||
1673 len != PyUnicode_GET_SIZE(obj))
1674 return raiseTestError("test_u_code",
1675 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001678 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001679}
1680
Guido van Rossumfb67be22007-08-29 18:38:11 +00001681/* Test Z and Z# codes for PyArg_ParseTuple */
1682static PyObject *
1683test_Z_code(PyObject *self)
1684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001686 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 tuple = PyTuple_New(2);
1690 if (tuple == NULL)
1691 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 obj = PyUnicode_FromString("test");
1694 PyTuple_SET_ITEM(tuple, 0, obj);
1695 Py_INCREF(Py_None);
1696 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 /* swap values on purpose */
1699 value1 = NULL;
1700 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001703 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001705 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 if (value1 != PyUnicode_AS_UNICODE(obj))
1707 return raiseTestError("test_Z_code",
1708 "Z code returned wrong value for 'test'");
1709 if (value2 != NULL)
1710 return raiseTestError("test_Z_code",
1711 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 value1 = NULL;
1714 value2 = PyUnicode_AS_UNICODE(obj);
1715 len1 = -1;
1716 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001719 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1720 &value2, &len2))
1721 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001723 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1725 len1 != PyUnicode_GET_SIZE(obj))
1726 return raiseTestError("test_Z_code",
1727 "Z# code returned wrong values for 'test'");
1728 if (value2 != NULL ||
1729 len2 != 0)
1730 return raiseTestError("test_Z_code",
1731 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 Py_DECREF(tuple);
1734 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001735}
1736
Thomas Wouters477c8d52006-05-27 19:21:47 +00001737static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001738test_widechar(PyObject *self)
1739{
1740#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1742 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001743 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001744#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1746 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1751 if (wide == NULL)
1752 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1755 if (utf8 == NULL) {
1756 Py_DECREF(wide);
1757 return NULL;
1758 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001759
Victor Stinner8ef18872011-11-21 02:06:57 +01001760 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 Py_DECREF(wide);
1762 Py_DECREF(utf8);
1763 return raiseTestError("test_widechar",
1764 "wide string and utf8 string "
1765 "have different length");
1766 }
1767 if (PyUnicode_Compare(wide, utf8)) {
1768 Py_DECREF(wide);
1769 Py_DECREF(utf8);
1770 if (PyErr_Occurred())
1771 return NULL;
1772 return raiseTestError("test_widechar",
1773 "wide string and utf8 string "
1774 "are different");
1775 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 Py_DECREF(wide);
1778 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001779
1780#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1781 wide = PyUnicode_FromWideChar(invalid, 1);
1782 if (wide == NULL)
1783 PyErr_Clear();
1784 else
1785 return raiseTestError("test_widechar",
1786 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1787
1788 wide = PyUnicode_FromUnicode(invalid, 1);
1789 if (wide == NULL)
1790 PyErr_Clear();
1791 else
1792 return raiseTestError("test_widechar",
1793 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001794
1795 wide = PyUnicode_FromUnicode(NULL, 1);
1796 if (wide == NULL)
1797 return NULL;
1798 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001799 if (_PyUnicode_Ready(wide) < 0) {
1800 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001801 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001802 }
1803 else {
1804 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001805 return raiseTestError("test_widechar",
1806 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001807 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001808#endif
1809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001811}
1812
1813static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001814unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001815{
1816 PyObject *unicode, *result;
1817 Py_ssize_t buflen, size;
1818 wchar_t *buffer;
1819
1820 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1821 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001822 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001823 if (buffer == NULL)
1824 return PyErr_NoMemory();
1825
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001826 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001827 if (size == -1) {
1828 PyMem_Free(buffer);
1829 return NULL;
1830 }
1831
1832 if (size < buflen)
1833 buflen = size + 1;
1834 else
1835 buflen = size;
1836 result = PyUnicode_FromWideChar(buffer, buflen);
1837 PyMem_Free(buffer);
1838 if (result == NULL)
1839 return NULL;
1840
1841 return Py_BuildValue("(Nn)", result, size);
1842}
1843
1844static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001845unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001846{
1847 PyObject *unicode, *result;
1848 Py_ssize_t size;
1849 wchar_t *buffer;
1850
1851 if (!PyArg_ParseTuple(args, "U", &unicode))
1852 return NULL;
1853
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001854 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001855 if (buffer == NULL)
1856 return NULL;
1857
1858 result = PyUnicode_FromWideChar(buffer, size + 1);
1859 PyMem_Free(buffer);
1860 if (result == NULL)
1861 return NULL;
1862 return Py_BuildValue("(Nn)", result, size);
1863}
1864
1865static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001866unicode_asucs4(PyObject *self, PyObject *args)
1867{
1868 PyObject *unicode, *result;
1869 Py_UCS4 *buffer;
1870 int copy_null;
1871 Py_ssize_t str_len, buf_len;
1872
1873 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1874 return NULL;
1875 }
1876
1877 buf_len = str_len + 1;
1878 buffer = PyMem_NEW(Py_UCS4, buf_len);
1879 if (buffer == NULL) {
1880 return PyErr_NoMemory();
1881 }
1882 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1883 buffer[str_len] = 0xffffU;
1884
1885 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1886 PyMem_FREE(buffer);
1887 return NULL;
1888 }
1889
1890 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1891 PyMem_FREE(buffer);
1892 return result;
1893}
1894
1895static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001896unicode_findchar(PyObject *self, PyObject *args)
1897{
1898 PyObject *str;
1899 int direction;
1900 unsigned int ch;
1901 Py_ssize_t result;
1902 Py_ssize_t start, end;
1903
1904 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1905 &start, &end, &direction)) {
1906 return NULL;
1907 }
1908
1909 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
1910 if (result == -2)
1911 return NULL;
1912 else
1913 return PyLong_FromSsize_t(result);
1914}
1915
1916static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001917unicode_copycharacters(PyObject *self, PyObject *args)
1918{
1919 PyObject *from, *to, *to_copy;
1920 Py_ssize_t from_start, to_start, how_many, copied;
1921
1922 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1923 &from, &from_start, &how_many)) {
1924 return NULL;
1925 }
1926
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001927 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1928 PyUnicode_MAX_CHAR_VALUE(to)))) {
1929 return NULL;
1930 }
1931 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
1932 Py_DECREF(to_copy);
1933 return NULL;
1934 }
1935
1936 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
1937 from_start, how_many)) < 0) {
1938 Py_DECREF(to_copy);
1939 return NULL;
1940 }
1941
1942 return Py_BuildValue("(Nn)", to_copy, copied);
1943}
1944
1945static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001946unicode_encodedecimal(PyObject *self, PyObject *args)
1947{
1948 Py_UNICODE *unicode;
1949 Py_ssize_t length;
1950 char *errors = NULL;
1951 PyObject *decimal;
1952 Py_ssize_t decimal_length, new_length;
1953 int res;
1954
1955 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1956 return NULL;
1957
1958 decimal_length = length * 7; /* len('&#8364;') */
1959 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1960 if (decimal == NULL)
1961 return NULL;
1962
1963 res = PyUnicode_EncodeDecimal(unicode, length,
1964 PyBytes_AS_STRING(decimal),
1965 errors);
1966 if (res < 0) {
1967 Py_DECREF(decimal);
1968 return NULL;
1969 }
1970
1971 new_length = strlen(PyBytes_AS_STRING(decimal));
1972 assert(new_length <= decimal_length);
1973 res = _PyBytes_Resize(&decimal, new_length);
1974 if (res < 0)
1975 return NULL;
1976
1977 return decimal;
1978}
1979
1980static PyObject *
1981unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1982{
1983 Py_UNICODE *unicode;
1984 Py_ssize_t length;
1985 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1986 return NULL;
1987 return PyUnicode_TransformDecimalToASCII(unicode, length);
1988}
1989
1990static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001991unicode_legacy_string(PyObject *self, PyObject *args)
1992{
1993 Py_UNICODE *data;
1994 Py_ssize_t len;
1995 PyObject *u;
1996
1997 if (!PyArg_ParseTuple(args, "u#", &data, &len))
1998 return NULL;
1999
2000 u = PyUnicode_FromUnicode(NULL, len);
2001 if (u == NULL)
2002 return NULL;
2003
2004 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2005
2006 if (len > 0) { /* The empty string is always ready. */
2007 assert(!PyUnicode_IS_READY(u));
2008 }
2009
2010 return u;
2011}
2012
2013static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002014getargs_w_star(PyObject *self, PyObject *args)
2015{
2016 Py_buffer buffer;
2017 PyObject *result;
2018 char *str;
2019
2020 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2021 return NULL;
2022
2023 if (2 <= buffer.len) {
2024 str = buffer.buf;
2025 str[0] = '[';
2026 str[buffer.len-1] = ']';
2027 }
2028
2029 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2030 PyBuffer_Release(&buffer);
2031 return result;
2032}
2033
2034
2035static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00002036test_empty_argparse(PyObject *self)
2037{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 /* Test that formats can begin with '|'. See issue #4720. */
2039 PyObject *tuple, *dict = NULL;
2040 static char *kwlist[] = {NULL};
2041 int result;
2042 tuple = PyTuple_New(0);
2043 if (!tuple)
2044 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002045 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002047 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 dict = PyDict_New();
2049 if (!dict)
2050 goto done;
2051 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002052 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 Py_DECREF(tuple);
2054 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002055 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002057 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 else {
2059 Py_RETURN_NONE;
2060 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002061}
2062
2063static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002064codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002065{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 const char *encoding, *errors = NULL;
2067 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2068 &encoding, &errors))
2069 return NULL;
2070 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002071}
2072
Thomas Wouters477c8d52006-05-27 19:21:47 +00002073static PyObject *
2074codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002075{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 const char *encoding, *errors = NULL;
2077 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2078 &encoding, &errors))
2079 return NULL;
2080 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002081}
2082
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002083
Tim Peters5b8132f2003-01-31 15:52:05 +00002084/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002085static PyObject *
2086test_long_numbits(PyObject *self)
2087{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 struct triple {
2089 long input;
2090 size_t nbits;
2091 int sign;
2092 } testcases[] = {{0, 0, 0},
2093 {1L, 1, 1},
2094 {-1L, 1, -1},
2095 {2L, 2, 1},
2096 {-2L, 2, -1},
2097 {3L, 2, 1},
2098 {-3L, 2, -1},
2099 {4L, 3, 1},
2100 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002101 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 {-0x7fffL, 15, -1},
2103 {0xffffL, 16, 1},
2104 {-0xffffL, 16, -1},
2105 {0xfffffffL, 28, 1},
2106 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002107 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002108
Victor Stinner63941882011-09-29 00:42:28 +02002109 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002110 size_t nbits;
2111 int sign;
2112 PyObject *plong;
2113
2114 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002115 if (plong == NULL)
2116 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002117 nbits = _PyLong_NumBits(plong);
2118 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 Py_DECREF(plong);
2121 if (nbits != testcases[i].nbits)
2122 return raiseTestError("test_long_numbits",
2123 "wrong result for _PyLong_NumBits");
2124 if (sign != testcases[i].sign)
2125 return raiseTestError("test_long_numbits",
2126 "wrong result for _PyLong_Sign");
2127 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002128 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002129}
2130
Thomas Heller519a0422007-11-15 20:48:54 +00002131/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002132
2133static PyObject *
2134test_null_strings(PyObject *self)
2135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2137 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2138 Py_XDECREF(o1);
2139 Py_XDECREF(o2);
2140 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002141}
2142
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002143static PyObject *
2144raise_exception(PyObject *self, PyObject *args)
2145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 PyObject *exc;
2147 PyObject *exc_args, *v;
2148 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2151 &exc, &num_args))
2152 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 exc_args = PyTuple_New(num_args);
2155 if (exc_args == NULL)
2156 return NULL;
2157 for (i = 0; i < num_args; ++i) {
2158 v = PyLong_FromLong(i);
2159 if (v == NULL) {
2160 Py_DECREF(exc_args);
2161 return NULL;
2162 }
2163 PyTuple_SET_ITEM(exc_args, i, v);
2164 }
2165 PyErr_SetObject(exc, exc_args);
2166 Py_DECREF(exc_args);
2167 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002168}
Tim Peters91621db2001-06-12 20:10:01 +00002169
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002170static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002171set_errno(PyObject *self, PyObject *args)
2172{
2173 int new_errno;
2174
2175 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2176 return NULL;
2177
2178 errno = new_errno;
2179 Py_RETURN_NONE;
2180}
2181
2182static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002183test_set_exc_info(PyObject *self, PyObject *args)
2184{
2185 PyObject *orig_exc;
2186 PyObject *new_type, *new_value, *new_tb;
2187 PyObject *type, *value, *tb;
2188 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2189 &new_type, &new_value, &new_tb))
2190 return NULL;
2191
2192 PyErr_GetExcInfo(&type, &value, &tb);
2193
2194 Py_INCREF(new_type);
2195 Py_INCREF(new_value);
2196 Py_INCREF(new_tb);
2197 PyErr_SetExcInfo(new_type, new_value, new_tb);
2198
2199 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2200 Py_XDECREF(type);
2201 Py_XDECREF(value);
2202 Py_XDECREF(tb);
2203 return orig_exc;
2204}
Benjamin Peterson16323982010-02-03 01:13:41 +00002205
2206static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002207
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002208static PyObject *
2209test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 if (PyDateTimeAPI) {
2211 if (test_run_counter) {
2212 /* Probably regrtest.py -R */
2213 Py_RETURN_NONE;
2214 }
2215 else {
2216 PyErr_SetString(PyExc_AssertionError,
2217 "PyDateTime_CAPI somehow initialized");
2218 return NULL;
2219 }
2220 }
2221 test_run_counter++;
2222 PyDateTime_IMPORT;
2223 if (PyDateTimeAPI)
2224 Py_RETURN_NONE;
2225 else
2226 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002227}
2228
Benjamin Peterson16323982010-02-03 01:13:41 +00002229
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002230/* test_thread_state spawns a thread of its own, and that thread releases
2231 * `thread_done` when it's finished. The driver code has to know when the
2232 * thread finishes, because the thread uses a PyObject (the callable) that
2233 * may go away when the driver finishes. The former lack of this explicit
2234 * synchronization caused rare segfaults, so rare that they were seen only
2235 * on a Mac buildbot (although they were possible on any box).
2236 */
2237static PyThread_type_lock thread_done = NULL;
2238
Benjamin Petersona786b022008-08-25 21:05:21 +00002239static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002240_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242 PyObject *rc;
2243 int success;
2244 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002245 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 success = (rc != NULL);
2247 Py_XDECREF(rc);
2248 PyGILState_Release(s);
2249 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002250}
2251
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002252/* Same thing, but releases `thread_done` when it returns. This variant
2253 * should be called only from threads spawned by test_thread_state().
2254 */
2255static void
2256_make_call_from_thread(void *callable)
2257{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 _make_call(callable);
2259 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002260}
2261
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002262static PyObject *
2263test_thread_state(PyObject *self, PyObject *args)
2264{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 PyObject *fn;
2266 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2269 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 if (!PyCallable_Check(fn)) {
2272 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2273 fn->ob_type->tp_name);
2274 return NULL;
2275 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 /* Ensure Python is set up for threading */
2278 PyEval_InitThreads();
2279 thread_done = PyThread_allocate_lock();
2280 if (thread_done == NULL)
2281 return PyErr_NoMemory();
2282 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002284 /* Start a new thread with our callback. */
2285 PyThread_start_new_thread(_make_call_from_thread, fn);
2286 /* Make the callback with the thread lock held by this thread */
2287 success &= _make_call(fn);
2288 /* Do it all again, but this time with the thread-lock released */
2289 Py_BEGIN_ALLOW_THREADS
2290 success &= _make_call(fn);
2291 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2292 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 /* And once more with and without a thread
2295 XXX - should use a lock and work out exactly what we are trying
2296 to test <wink>
2297 */
2298 Py_BEGIN_ALLOW_THREADS
2299 PyThread_start_new_thread(_make_call_from_thread, fn);
2300 success &= _make_call(fn);
2301 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2302 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002304 /* Release lock we acquired above. This is required on HP-UX. */
2305 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 PyThread_free_lock(thread_done);
2308 if (!success)
2309 return NULL;
2310 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002311}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002312
2313/* test Py_AddPendingCalls using threads */
2314static int _pending_callback(void *arg)
2315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 /* we assume the argument is callable object to which we own a reference */
2317 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002318 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 Py_DECREF(callable);
2320 Py_XDECREF(r);
2321 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002322}
2323
2324/* The following requests n callbacks to _pending_callback. It can be
2325 * run from any python thread.
2326 */
2327PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
2328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 PyObject *callable;
2330 int r;
2331 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2332 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 /* create the reference for the callbackwhile we hold the lock */
2335 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 Py_BEGIN_ALLOW_THREADS
2338 r = Py_AddPendingCall(&_pending_callback, callable);
2339 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 if (r<0) {
2342 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002343 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002345 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002346}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002347
Neal Norwitzb0d26332007-08-25 00:49:05 +00002348/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002349static PyObject *
2350test_string_from_format(PyObject *self, PyObject *args)
2351{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 PyObject *result;
2353 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002354
Alexander Belopolskye239d232010-12-08 23:31:48 +00002355#define CHECK_1_FORMAT(FORMAT, TYPE) \
2356 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2357 if (result == NULL) \
2358 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002359 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002360 msg = FORMAT " failed at 1"; \
2361 goto Fail; \
2362 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 CHECK_1_FORMAT("%d", int);
2366 CHECK_1_FORMAT("%ld", long);
2367 /* The z width modifier was added in Python 2.5. */
2368 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 /* The u type code was added in Python 2.5. */
2371 CHECK_1_FORMAT("%u", unsigned int);
2372 CHECK_1_FORMAT("%lu", unsigned long);
2373 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002376 CHECK_1_FORMAT("%llu", unsigned long long);
2377 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002380
2381 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 Py_XDECREF(result);
2383 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002384
2385#undef CHECK_1_FORMAT
2386}
2387
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002388
2389static PyObject *
2390test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2392 int result;
2393 if (py_s == NULL)
2394 return NULL;
2395 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2396 Py_DECREF(py_s);
2397 if (!result) {
2398 PyErr_SetString(TestError, "Python string ending in NULL "
2399 "should not compare equal to c string.");
2400 return NULL;
2401 }
2402 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002403}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002404
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002405/* This is here to provide a docstring for test_descr. */
2406static PyObject *
2407test_with_docstring(PyObject *self)
2408{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002410}
2411
Mark Dickinson725bfd82009-05-03 20:33:40 +00002412/* Test PyOS_string_to_double. */
2413static PyObject *
2414test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 double result;
2416 char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418#define CHECK_STRING(STR, expected) \
2419 result = PyOS_string_to_double(STR, NULL, NULL); \
2420 if (result == -1.0 && PyErr_Occurred()) \
2421 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002422 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 msg = "conversion of " STR " to float failed"; \
2424 goto fail; \
2425 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427#define CHECK_INVALID(STR) \
2428 result = PyOS_string_to_double(STR, NULL, NULL); \
2429 if (result == -1.0 && PyErr_Occurred()) { \
2430 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2431 PyErr_Clear(); \
2432 else \
2433 return NULL; \
2434 } \
2435 else { \
2436 msg = "conversion of " STR " didn't raise ValueError"; \
2437 goto fail; \
2438 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 CHECK_STRING("0.1", 0.1);
2441 CHECK_STRING("1.234", 1.234);
2442 CHECK_STRING("-1.35", -1.35);
2443 CHECK_STRING(".1e01", 1.0);
2444 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 CHECK_INVALID(" 0.1");
2447 CHECK_INVALID("\t\n-3");
2448 CHECK_INVALID(".123 ");
2449 CHECK_INVALID("3\n");
2450 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002453 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002455#undef CHECK_STRING
2456#undef CHECK_INVALID
2457}
2458
2459
Benjamin Petersonb173f782009-05-05 22:31:58 +00002460/* Coverage testing of capsule objects. */
2461
2462static const char *capsule_name = "capsule name";
2463static char *capsule_pointer = "capsule pointer";
2464static char *capsule_context = "capsule context";
2465static const char *capsule_error = NULL;
2466static int
2467capsule_destructor_call_count = 0;
2468
2469static void
2470capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 capsule_destructor_call_count++;
2472 if (PyCapsule_GetContext(o) != capsule_context) {
2473 capsule_error = "context did not match in destructor!";
2474 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2475 capsule_error = "destructor did not match in destructor! (woah!)";
2476 } else if (PyCapsule_GetName(o) != capsule_name) {
2477 capsule_error = "name did not match in destructor!";
2478 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2479 capsule_error = "pointer did not match in destructor!";
2480 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002481}
2482
2483typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 char *name;
2485 char *module;
2486 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002487} known_capsule;
2488
2489static PyObject *
2490test_capsule(PyObject *self, PyObject *args)
2491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 PyObject *object;
2493 const char *error = NULL;
2494 void *pointer;
2495 void *pointer2;
2496 known_capsule known_capsules[] = {
2497 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2498 KNOWN_CAPSULE("_socket", "CAPI"),
2499 KNOWN_CAPSULE("_curses", "_C_API"),
2500 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2501 { NULL, NULL },
2502 };
2503 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002504
2505#define FAIL(x) { error = (x); goto exit; }
2506
2507#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 if (capsule_error) { \
2509 FAIL(capsule_error); \
2510 } \
2511 else if (!capsule_destructor_call_count) { \
2512 FAIL("destructor not called!"); \
2513 } \
2514 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2517 PyCapsule_SetContext(object, capsule_context);
2518 capsule_destructor(object);
2519 CHECK_DESTRUCTOR;
2520 Py_DECREF(object);
2521 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 object = PyCapsule_New(known, "ignored", NULL);
2524 PyCapsule_SetPointer(object, capsule_pointer);
2525 PyCapsule_SetName(object, capsule_name);
2526 PyCapsule_SetDestructor(object, capsule_destructor);
2527 PyCapsule_SetContext(object, capsule_context);
2528 capsule_destructor(object);
2529 CHECK_DESTRUCTOR;
2530 /* intentionally access using the wrong name */
2531 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2532 if (!PyErr_Occurred()) {
2533 FAIL("PyCapsule_GetPointer should have failed but did not!");
2534 }
2535 PyErr_Clear();
2536 if (pointer2) {
2537 if (pointer2 == capsule_pointer) {
2538 FAIL("PyCapsule_GetPointer should not have"
2539 " returned the internal pointer!");
2540 } else {
2541 FAIL("PyCapsule_GetPointer should have "
2542 "returned NULL pointer but did not!");
2543 }
2544 }
2545 PyCapsule_SetDestructor(object, NULL);
2546 Py_DECREF(object);
2547 if (capsule_destructor_call_count) {
2548 FAIL("destructor called when it should not have been!");
2549 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 for (known = &known_capsules[0]; known->module != NULL; known++) {
2552 /* yeah, ordinarily I wouldn't do this either,
2553 but it's fine for this test harness.
2554 */
2555 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002556#undef FAIL
2557#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 { \
2559 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2560 x, known->module, known->attribute); \
2561 error = buffer; \
2562 goto exit; \
2563 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 PyObject *module = PyImport_ImportModule(known->module);
2566 if (module) {
2567 pointer = PyCapsule_Import(known->name, 0);
2568 if (!pointer) {
2569 Py_DECREF(module);
2570 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2571 }
2572 object = PyObject_GetAttrString(module, known->attribute);
2573 if (!object) {
2574 Py_DECREF(module);
2575 return NULL;
2576 }
2577 pointer2 = PyCapsule_GetPointer(object,
2578 "weebles wobble but they don't fall down");
2579 if (!PyErr_Occurred()) {
2580 Py_DECREF(object);
2581 Py_DECREF(module);
2582 FAIL("PyCapsule_GetPointer should have failed but did not!");
2583 }
2584 PyErr_Clear();
2585 if (pointer2) {
2586 Py_DECREF(module);
2587 Py_DECREF(object);
2588 if (pointer2 == pointer) {
2589 FAIL("PyCapsule_GetPointer should not have"
2590 " returned its internal pointer!");
2591 } else {
2592 FAIL("PyCapsule_GetPointer should have"
2593 " returned NULL pointer but did not!");
2594 }
2595 }
2596 Py_DECREF(object);
2597 Py_DECREF(module);
2598 }
2599 else
2600 PyErr_Clear();
2601 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002602
2603 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002604 if (error) {
2605 return raiseTestError("test_capsule", error);
2606 }
2607 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002608#undef FAIL
2609}
2610
Guido van Rossumddefaf32007-01-14 03:31:43 +00002611#ifdef HAVE_GETTIMEOFDAY
2612/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002613static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 e->tv_sec -= s->tv_sec;
2616 e->tv_usec -= s->tv_usec;
2617 if (e->tv_usec < 0) {
2618 e->tv_sec -=1;
2619 e->tv_usec += 1000000;
2620 }
2621 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002622}
2623
2624static PyObject *
2625profile_int(PyObject *self, PyObject* args)
2626{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 int i, k;
2628 struct timeval start, stop;
2629 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 /* Test 1: Allocate and immediately deallocate
2632 many small integers */
2633 gettimeofday(&start, NULL);
2634 for(k=0; k < 20000; k++)
2635 for(i=0; i < 1000; i++) {
2636 single = PyLong_FromLong(i);
2637 Py_DECREF(single);
2638 }
2639 gettimeofday(&stop, NULL);
2640 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 /* Test 2: Allocate and immediately deallocate
2643 many large integers */
2644 gettimeofday(&start, NULL);
2645 for(k=0; k < 20000; k++)
2646 for(i=0; i < 1000; i++) {
2647 single = PyLong_FromLong(i+1000000);
2648 Py_DECREF(single);
2649 }
2650 gettimeofday(&stop, NULL);
2651 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 /* Test 3: Allocate a few integers, then release
2654 them all simultaneously. */
2655 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002656 if (multiple == NULL)
2657 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 gettimeofday(&start, NULL);
2659 for(k=0; k < 20000; k++) {
2660 for(i=0; i < 1000; i++) {
2661 multiple[i] = PyLong_FromLong(i+1000000);
2662 }
2663 for(i=0; i < 1000; i++) {
2664 Py_DECREF(multiple[i]);
2665 }
2666 }
2667 gettimeofday(&stop, NULL);
2668 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002669 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 /* Test 4: Allocate many integers, then release
2672 them all simultaneously. */
2673 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002674 if (multiple == NULL)
2675 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002676 gettimeofday(&start, NULL);
2677 for(k=0; k < 20; k++) {
2678 for(i=0; i < 1000000; i++) {
2679 multiple[i] = PyLong_FromLong(i+1000000);
2680 }
2681 for(i=0; i < 1000000; i++) {
2682 Py_DECREF(multiple[i]);
2683 }
2684 }
2685 gettimeofday(&stop, NULL);
2686 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002687 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 /* Test 5: Allocate many integers < 32000 */
2690 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002691 if (multiple == NULL)
2692 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 gettimeofday(&start, NULL);
2694 for(k=0; k < 10; k++) {
2695 for(i=0; i < 1000000; i++) {
2696 multiple[i] = PyLong_FromLong(i+1000);
2697 }
2698 for(i=0; i < 1000000; i++) {
2699 Py_DECREF(multiple[i]);
2700 }
2701 }
2702 gettimeofday(&stop, NULL);
2703 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002704 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 /* Test 6: Perform small int addition */
2707 op1 = PyLong_FromLong(1);
2708 gettimeofday(&start, NULL);
2709 for(i=0; i < 10000000; i++) {
2710 result = PyNumber_Add(op1, op1);
2711 Py_DECREF(result);
2712 }
2713 gettimeofday(&stop, NULL);
2714 Py_DECREF(op1);
2715 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002717 /* Test 7: Perform medium int addition */
2718 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002719 if (op1 == NULL)
2720 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002721 gettimeofday(&start, NULL);
2722 for(i=0; i < 10000000; i++) {
2723 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002724 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 }
2726 gettimeofday(&stop, NULL);
2727 Py_DECREF(op1);
2728 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002729
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002730 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002731}
2732#endif
2733
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002734/* To test the format of tracebacks as printed out. */
2735static PyObject *
2736traceback_print(PyObject *self, PyObject *args)
2737{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 PyObject *file;
2739 PyObject *traceback;
2740 int result;
2741
2742 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2743 &traceback, &file))
2744 return NULL;
2745
2746 result = PyTraceBack_Print(traceback, file);
2747 if (result < 0)
2748 return NULL;
2749 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002750}
2751
Benjamin Petersone6528212008-07-15 15:32:09 +00002752/* To test the format of exceptions as printed out. */
2753static PyObject *
2754exception_print(PyObject *self, PyObject *args)
2755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 PyObject *value;
2757 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 if (!PyArg_ParseTuple(args, "O:exception_print",
2760 &value))
2761 return NULL;
2762 if (!PyExceptionInstance_Check(value)) {
2763 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2764 return NULL;
2765 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 tb = PyException_GetTraceback(value);
2768 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2769 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002772}
2773
2774
2775
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002776
2777/* reliably raise a MemoryError */
2778static PyObject *
2779raise_memoryerror(PyObject *self)
2780{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 PyErr_NoMemory();
2782 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002783}
2784
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002785/* Issue 6012 */
2786static PyObject *str1, *str2;
2787static int
2788failing_converter(PyObject *obj, void *arg)
2789{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 /* Clone str1, then let the conversion fail. */
2791 assert(str1);
2792 str2 = str1;
2793 Py_INCREF(str2);
2794 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002795}
2796static PyObject*
2797argparsing(PyObject *o, PyObject *args)
2798{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 PyObject *res;
2800 str1 = str2 = NULL;
2801 if (!PyArg_ParseTuple(args, "O&O&",
2802 PyUnicode_FSConverter, &str1,
2803 failing_converter, &str2)) {
2804 if (!str2)
2805 /* argument converter not called? */
2806 return NULL;
2807 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002808 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002809 Py_DECREF(str2);
2810 PyErr_Clear();
2811 return res;
2812 }
2813 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002814}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002815
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002816/* To test that the result of PyCode_NewEmpty has the right members. */
2817static PyObject *
2818code_newempty(PyObject *self, PyObject *args)
2819{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 const char *filename;
2821 const char *funcname;
2822 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2825 &filename, &funcname, &firstlineno))
2826 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002829}
2830
Georg Brandl1e28a272009-12-28 08:41:01 +00002831/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2832 Run via Lib/test/test_exceptions.py */
2833static PyObject *
2834make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 const char *name;
2837 const char *doc = NULL;
2838 PyObject *base = NULL;
2839 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002843 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2844 "s|sOO:make_exception_with_doc", kwlist,
2845 &name, &doc, &base, &dict))
2846 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002849}
2850
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002851static PyObject *
2852make_memoryview_from_NULL_pointer(PyObject *self)
2853{
2854 Py_buffer info;
2855 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2856 return NULL;
2857 return PyMemoryView_FromBuffer(&info);
2858}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002859
Stefan Krah7213fcc2015-02-01 16:19:23 +01002860static PyObject *
2861test_from_contiguous(PyObject* self, PyObject *noargs)
2862{
2863 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2864 int init[5] = {0, 1, 2, 3, 4};
2865 Py_ssize_t itemsize = sizeof(int);
2866 Py_ssize_t shape = 5;
2867 Py_ssize_t strides = 2 * itemsize;
2868 Py_buffer view = {
2869 data,
2870 NULL,
2871 5 * itemsize,
2872 itemsize,
2873 1,
2874 1,
2875 NULL,
2876 &shape,
2877 &strides,
2878 NULL,
2879 NULL
2880 };
2881 int *ptr;
2882 int i;
2883
2884 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2885 ptr = view.buf;
2886 for (i = 0; i < 5; i++) {
2887 if (ptr[2*i] != i) {
2888 PyErr_SetString(TestError,
2889 "test_from_contiguous: incorrect result");
2890 return NULL;
2891 }
2892 }
2893
2894 view.buf = &data[8];
2895 view.strides[0] = -2 * itemsize;
2896
2897 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2898 ptr = view.buf;
2899 for (i = 0; i < 5; i++) {
2900 if (*(ptr-2*i) != i) {
2901 PyErr_SetString(TestError,
2902 "test_from_contiguous: incorrect result");
2903 return NULL;
2904 }
2905 }
2906
2907 Py_RETURN_NONE;
2908}
Stefan Krah650c1e82015-02-03 21:43:23 +01002909
Stefan Kraha7559c02015-02-03 22:27:21 +01002910#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01002911extern PyTypeObject _PyBytesIOBuffer_Type;
2912
Stefan Krah5178d912015-02-03 16:57:21 +01002913static PyObject *
2914test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
2915{
Stefan Krah650c1e82015-02-03 21:43:23 +01002916 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01002917 PyObject *b;
2918 char *dummy[1];
2919 int ret, match;
2920
Stefan Krah650c1e82015-02-03 21:43:23 +01002921 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01002922 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
2923 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2924 PyErr_Clear();
2925 if (ret != -1 || match == 0)
2926 goto error;
2927
Stefan Krah650c1e82015-02-03 21:43:23 +01002928 /* bytesiobuf_getbuffer() */
2929 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01002930 if (b == NULL) {
2931 return NULL;
2932 }
2933
2934 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
2935 Py_DECREF(b);
2936 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
2937 PyErr_Clear();
2938 if (ret != -1 || match == 0)
2939 goto error;
2940
2941 Py_RETURN_NONE;
2942
2943error:
2944 PyErr_SetString(TestError,
2945 "test_pep3118_obsolete_write_locks: failure");
2946 return NULL;
2947}
Stefan Kraha7559c02015-02-03 22:27:21 +01002948#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002949
Stefan Krah650c1e82015-02-03 21:43:23 +01002950/* This tests functions that historically supported write locks. It is
2951 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
2952 is entitled to segfault in that case. */
2953static PyObject *
2954getbuffer_with_null_view(PyObject* self, PyObject *obj)
2955{
2956 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
2957 return NULL;
2958
2959 Py_RETURN_NONE;
2960}
2961
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002962/* Test that the fatal error from not having a current thread doesn't
2963 cause an infinite loop. Run via Lib/test/test_capi.py */
2964static PyObject *
2965crash_no_current_thread(PyObject *self)
2966{
2967 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00002968 /* Using PyThreadState_Get() directly allows the test to pass in
2969 !pydebug mode. However, the test only actually tests anything
2970 in pydebug mode, since that's where the infinite loop was in
2971 the first place. */
2972 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00002973 Py_END_ALLOW_THREADS
2974 return NULL;
2975}
2976
Antoine Pitrou2f828f22012-01-18 00:21:11 +01002977/* To run some code in a sub-interpreter. */
2978static PyObject *
2979run_in_subinterp(PyObject *self, PyObject *args)
2980{
2981 const char *code;
2982 int r;
2983 PyThreadState *substate, *mainstate;
2984
2985 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
2986 &code))
2987 return NULL;
2988
2989 mainstate = PyThreadState_Get();
2990
2991 PyThreadState_Swap(NULL);
2992
2993 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05002994 if (substate == NULL) {
2995 /* Since no new thread state was created, there is no exception to
2996 propagate; raise a fresh one after swapping in the old thread
2997 state. */
2998 PyThreadState_Swap(mainstate);
2999 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3000 return NULL;
3001 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003002 r = PyRun_SimpleString(code);
3003 Py_EndInterpreter(substate);
3004
3005 PyThreadState_Swap(mainstate);
3006
3007 return PyLong_FromLong(r);
3008}
3009
Victor Stinner3c1b3792014-02-17 00:02:43 +01003010static int
3011check_time_rounding(int round)
3012{
Victor Stinner74474232015-09-02 01:43:56 +02003013 if (round != _PyTime_ROUND_FLOOR
3014 && round != _PyTime_ROUND_CEILING
Victor Stinner7667f582015-09-09 01:02:23 +02003015 && round != _PyTime_ROUND_HALF_EVEN) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003016 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3017 return -1;
3018 }
3019 return 0;
3020}
3021
Victor Stinner5d272cc2012-03-13 13:35:55 +01003022static PyObject *
3023test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3024{
3025 PyObject *obj;
3026 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003027 int round;
3028 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003029 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003030 if (check_time_rounding(round) < 0)
3031 return NULL;
3032 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003033 return NULL;
3034 return _PyLong_FromTime_t(sec);
3035}
3036
3037static PyObject *
3038test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3039{
3040 PyObject *obj;
3041 time_t sec;
3042 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003043 int round;
3044 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003045 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003046 if (check_time_rounding(round) < 0)
3047 return NULL;
3048 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003049 return NULL;
3050 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3051}
3052
Victor Stinner643cd682012-03-02 22:54:03 +01003053static PyObject *
3054test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3055{
3056 PyObject *obj;
3057 time_t sec;
3058 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003059 int round;
3060 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003061 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003062 if (check_time_rounding(round) < 0)
3063 return NULL;
3064 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003065 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003066 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003067}
3068
Antoine Pitrou796564c2013-07-30 19:59:21 +02003069static void
3070slot_tp_del(PyObject *self)
3071{
3072 _Py_IDENTIFIER(__tp_del__);
3073 PyObject *del, *res;
3074 PyObject *error_type, *error_value, *error_traceback;
3075
3076 /* Temporarily resurrect the object. */
3077 assert(self->ob_refcnt == 0);
3078 self->ob_refcnt = 1;
3079
3080 /* Save the current exception, if any. */
3081 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3082
3083 /* Execute __del__ method, if any. */
3084 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3085 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003086 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003087 if (res == NULL)
3088 PyErr_WriteUnraisable(del);
3089 else
3090 Py_DECREF(res);
3091 Py_DECREF(del);
3092 }
3093
3094 /* Restore the saved exception. */
3095 PyErr_Restore(error_type, error_value, error_traceback);
3096
3097 /* Undo the temporary resurrection; can't use DECREF here, it would
3098 * cause a recursive call.
3099 */
3100 assert(self->ob_refcnt > 0);
3101 if (--self->ob_refcnt == 0)
3102 return; /* this is the normal path out */
3103
3104 /* __del__ resurrected it! Make it look like the original Py_DECREF
3105 * never happened.
3106 */
3107 {
3108 Py_ssize_t refcnt = self->ob_refcnt;
3109 _Py_NewReference(self);
3110 self->ob_refcnt = refcnt;
3111 }
3112 assert(!PyType_IS_GC(Py_TYPE(self)) ||
3113 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
3114 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3115 * we need to undo that. */
3116 _Py_DEC_REFTOTAL;
3117 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3118 * chain, so no more to do there.
3119 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3120 * _Py_NewReference bumped tp_allocs: both of those need to be
3121 * undone.
3122 */
3123#ifdef COUNT_ALLOCS
3124 --Py_TYPE(self)->tp_frees;
3125 --Py_TYPE(self)->tp_allocs;
3126#endif
3127}
3128
3129static PyObject *
3130with_tp_del(PyObject *self, PyObject *args)
3131{
3132 PyObject *obj;
3133 PyTypeObject *tp;
3134
3135 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3136 return NULL;
3137 tp = (PyTypeObject *) obj;
3138 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3139 PyErr_Format(PyExc_TypeError,
3140 "heap type expected, got %R", obj);
3141 return NULL;
3142 }
3143 tp->tp_del = slot_tp_del;
3144 Py_INCREF(obj);
3145 return obj;
3146}
3147
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003148static PyMethodDef ml;
3149
3150static PyObject *
3151create_cfunction(PyObject *self, PyObject *args)
3152{
3153 return PyCFunction_NewEx(&ml, self, NULL);
3154}
3155
3156static PyMethodDef ml = {
3157 "create_cfunction",
3158 create_cfunction,
3159 METH_NOARGS,
3160 NULL
3161};
3162
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003163static PyObject *
3164_test_incref(PyObject *ob)
3165{
3166 Py_INCREF(ob);
3167 return ob;
3168}
3169
3170static PyObject *
3171test_xincref_doesnt_leak(PyObject *ob)
3172{
3173 PyObject *obj = PyLong_FromLong(0);
3174 Py_XINCREF(_test_incref(obj));
3175 Py_DECREF(obj);
3176 Py_DECREF(obj);
3177 Py_DECREF(obj);
3178 Py_RETURN_NONE;
3179}
3180
3181static PyObject *
3182test_incref_doesnt_leak(PyObject *ob)
3183{
3184 PyObject *obj = PyLong_FromLong(0);
3185 Py_INCREF(_test_incref(obj));
3186 Py_DECREF(obj);
3187 Py_DECREF(obj);
3188 Py_DECREF(obj);
3189 Py_RETURN_NONE;
3190}
3191
3192static PyObject *
3193test_xdecref_doesnt_leak(PyObject *ob)
3194{
3195 Py_XDECREF(PyLong_FromLong(0));
3196 Py_RETURN_NONE;
3197}
3198
3199static PyObject *
3200test_decref_doesnt_leak(PyObject *ob)
3201{
3202 Py_DECREF(PyLong_FromLong(0));
3203 Py_RETURN_NONE;
3204}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003205
Victor Stinner0507bf52013-07-07 02:05:46 +02003206static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02003207test_incref_decref_API(PyObject *ob)
3208{
3209 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003210 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003211 Py_DecRef(obj);
3212 Py_DecRef(obj);
3213 Py_RETURN_NONE;
3214}
3215
3216static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02003217test_pymem_alloc0(PyObject *self)
3218{
3219 void *ptr;
3220
Victor Stinnerdb067af2014-05-02 22:31:14 +02003221 ptr = PyMem_RawMalloc(0);
3222 if (ptr == NULL) {
3223 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3224 return NULL;
3225 }
3226 PyMem_RawFree(ptr);
3227
3228 ptr = PyMem_RawCalloc(0, 0);
3229 if (ptr == NULL) {
3230 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3231 return NULL;
3232 }
3233 PyMem_RawFree(ptr);
3234
Victor Stinner0507bf52013-07-07 02:05:46 +02003235 ptr = PyMem_Malloc(0);
3236 if (ptr == NULL) {
3237 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3238 return NULL;
3239 }
3240 PyMem_Free(ptr);
3241
Victor Stinnerdb067af2014-05-02 22:31:14 +02003242 ptr = PyMem_Calloc(0, 0);
3243 if (ptr == NULL) {
3244 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3245 return NULL;
3246 }
3247 PyMem_Free(ptr);
3248
Victor Stinner0507bf52013-07-07 02:05:46 +02003249 ptr = PyObject_Malloc(0);
3250 if (ptr == NULL) {
3251 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3252 return NULL;
3253 }
3254 PyObject_Free(ptr);
3255
Victor Stinnerdb067af2014-05-02 22:31:14 +02003256 ptr = PyObject_Calloc(0, 0);
3257 if (ptr == NULL) {
3258 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3259 return NULL;
3260 }
3261 PyObject_Free(ptr);
3262
Victor Stinner0507bf52013-07-07 02:05:46 +02003263 Py_RETURN_NONE;
3264}
3265
3266typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003267 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003268
3269 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003270 size_t calloc_nelem;
3271 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003272 void *realloc_ptr;
3273 size_t realloc_new_size;
3274 void *free_ptr;
3275} alloc_hook_t;
3276
3277static void* hook_malloc (void* ctx, size_t size)
3278{
3279 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3280 hook->malloc_size = size;
3281 return hook->alloc.malloc(hook->alloc.ctx, size);
3282}
3283
Victor Stinnerdb067af2014-05-02 22:31:14 +02003284static void* hook_calloc (void* ctx, size_t nelem, size_t elsize)
3285{
3286 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3287 hook->calloc_nelem = nelem;
3288 hook->calloc_elsize = elsize;
3289 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3290}
3291
Victor Stinner0507bf52013-07-07 02:05:46 +02003292static void* hook_realloc (void* ctx, void* ptr, size_t new_size)
3293{
3294 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3295 hook->realloc_ptr = ptr;
3296 hook->realloc_new_size = new_size;
3297 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3298}
3299
3300static void hook_free (void *ctx, void *ptr)
3301{
3302 alloc_hook_t *hook = (alloc_hook_t *)ctx;
3303 hook->free_ptr = ptr;
3304 hook->alloc.free(hook->alloc.ctx, ptr);
3305}
3306
3307static PyObject *
3308test_setallocators(PyMemAllocatorDomain domain)
3309{
3310 PyObject *res = NULL;
3311 const char *error_msg;
3312 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003313 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003314 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003315 void *ptr, *ptr2;
3316
Victor Stinnerdb067af2014-05-02 22:31:14 +02003317 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003318
3319 alloc.ctx = &hook;
3320 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003321 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003322 alloc.realloc = &hook_realloc;
3323 alloc.free = &hook_free;
3324 PyMem_GetAllocator(domain, &hook.alloc);
3325 PyMem_SetAllocator(domain, &alloc);
3326
3327 size = 42;
3328 switch(domain)
3329 {
3330 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3331 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3332 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3333 default: ptr = NULL; break;
3334 }
3335
3336 if (ptr == NULL) {
3337 error_msg = "malloc failed";
3338 goto fail;
3339 }
3340
3341 if (hook.malloc_size != size) {
3342 error_msg = "malloc invalid size";
3343 goto fail;
3344 }
3345
3346 size2 = 200;
3347 switch(domain)
3348 {
3349 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3350 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3351 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003352 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003353 }
3354
3355 if (ptr2 == NULL) {
3356 error_msg = "realloc failed";
3357 goto fail;
3358 }
3359
3360 if (hook.realloc_ptr != ptr
3361 || hook.realloc_new_size != size2) {
3362 error_msg = "realloc invalid parameters";
3363 goto fail;
3364 }
3365
3366 switch(domain)
3367 {
3368 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3369 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3370 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3371 }
3372
3373 if (hook.free_ptr != ptr2) {
3374 error_msg = "free invalid pointer";
3375 goto fail;
3376 }
3377
Victor Stinnerdb067af2014-05-02 22:31:14 +02003378 nelem = 2;
3379 elsize = 5;
3380 switch(domain)
3381 {
3382 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3383 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3384 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3385 default: ptr = NULL; break;
3386 }
3387
3388 if (ptr == NULL) {
3389 error_msg = "calloc failed";
3390 goto fail;
3391 }
3392
3393 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3394 error_msg = "calloc invalid nelem or elsize";
3395 goto fail;
3396 }
3397
3398 switch(domain)
3399 {
3400 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3401 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3402 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3403 }
3404
Victor Stinner0507bf52013-07-07 02:05:46 +02003405 Py_INCREF(Py_None);
3406 res = Py_None;
3407 goto finally;
3408
3409fail:
3410 PyErr_SetString(PyExc_RuntimeError, error_msg);
3411
3412finally:
3413 PyMem_SetAllocator(domain, &hook.alloc);
3414 return res;
3415}
3416
3417static PyObject *
3418test_pymem_setrawallocators(PyObject *self)
3419{
3420 return test_setallocators(PYMEM_DOMAIN_RAW);
3421}
3422
3423static PyObject *
3424test_pymem_setallocators(PyObject *self)
3425{
3426 return test_setallocators(PYMEM_DOMAIN_MEM);
3427}
3428
3429static PyObject *
3430test_pyobject_setallocators(PyObject *self)
3431{
3432 return test_setallocators(PYMEM_DOMAIN_OBJ);
3433}
3434
xdegaye85f64302017-07-01 14:14:45 +02003435/* Most part of the following code is inherited from the pyfailmalloc project
3436 * written by Victor Stinner. */
3437static struct {
3438 int installed;
3439 PyMemAllocatorEx raw;
3440 PyMemAllocatorEx mem;
3441 PyMemAllocatorEx obj;
3442} FmHook;
3443
3444static struct {
3445 int start;
3446 int stop;
3447 Py_ssize_t count;
3448} FmData;
3449
3450static int
3451fm_nomemory(void)
3452{
3453 FmData.count++;
3454 if (FmData.count > FmData.start &&
3455 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
3456 return 1;
3457 }
3458 return 0;
3459}
3460
3461static void *
3462hook_fmalloc(void *ctx, size_t size)
3463{
3464 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3465 if (fm_nomemory()) {
3466 return NULL;
3467 }
3468 return alloc->malloc(alloc->ctx, size);
3469}
3470
3471static void *
3472hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
3473{
3474 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3475 if (fm_nomemory()) {
3476 return NULL;
3477 }
3478 return alloc->calloc(alloc->ctx, nelem, elsize);
3479}
3480
3481static void *
3482hook_frealloc(void *ctx, void *ptr, size_t new_size)
3483{
3484 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3485 if (fm_nomemory()) {
3486 return NULL;
3487 }
3488 return alloc->realloc(alloc->ctx, ptr, new_size);
3489}
3490
3491static void
3492hook_ffree(void *ctx, void *ptr)
3493{
3494 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3495 alloc->free(alloc->ctx, ptr);
3496}
3497
3498static void
3499fm_setup_hooks(void)
3500{
3501 PyMemAllocatorEx alloc;
3502
3503 if (FmHook.installed) {
3504 return;
3505 }
3506 FmHook.installed = 1;
3507
3508 alloc.malloc = hook_fmalloc;
3509 alloc.calloc = hook_fcalloc;
3510 alloc.realloc = hook_frealloc;
3511 alloc.free = hook_ffree;
3512 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3513 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3514 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3515
3516 alloc.ctx = &FmHook.raw;
3517 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
3518
3519 alloc.ctx = &FmHook.mem;
3520 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
3521
3522 alloc.ctx = &FmHook.obj;
3523 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
3524}
3525
3526static void
3527fm_remove_hooks(void)
3528{
3529 if (FmHook.installed) {
3530 FmHook.installed = 0;
3531 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3532 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3533 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3534 }
3535}
3536
3537static PyObject*
3538set_nomemory(PyObject *self, PyObject *args)
3539{
3540 /* Memory allocation fails after 'start' allocation requests, and until
3541 * 'stop' allocation requests except when 'stop' is negative or equal
3542 * to 0 (default) in which case allocation failures never stop. */
3543 FmData.count = 0;
3544 FmData.stop = 0;
3545 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
3546 return NULL;
3547 }
3548 fm_setup_hooks();
3549 Py_RETURN_NONE;
3550}
3551
3552static PyObject*
3553remove_mem_hooks(PyObject *self)
3554{
3555 fm_remove_hooks();
3556 Py_RETURN_NONE;
3557}
3558
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003559PyDoc_STRVAR(docstring_empty,
3560""
3561);
3562
3563PyDoc_STRVAR(docstring_no_signature,
3564"This docstring has no signature."
3565);
3566
3567PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003568"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003569"\n"
3570"This docstring has an invalid signature."
3571);
3572
Larry Hastings2623c8c2014-02-08 22:15:29 -08003573PyDoc_STRVAR(docstring_with_invalid_signature2,
3574"docstring_with_invalid_signature2($module, /, boo)\n"
3575"\n"
3576"--\n"
3577"\n"
3578"This docstring also has an invalid signature."
3579);
3580
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003581PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003582"docstring_with_signature($module, /, sig)\n"
3583"--\n"
3584"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003585"This docstring has a valid signature."
3586);
3587
Zachary Ware8ef887c2015-04-13 18:22:35 -05003588PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3589"docstring_with_signature_but_no_doc($module, /, sig)\n"
3590"--\n"
3591"\n"
3592);
3593
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003594PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003595"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3596"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003597"\n"
3598"\n"
3599"This docstring has a valid signature and some extra newlines."
3600);
3601
Larry Hastings16c51912014-01-07 11:53:01 -08003602PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003603"docstring_with_signature_with_defaults(module, s='avocado',\n"
3604" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3605" local=the_number_three, sys=sys.maxsize,\n"
3606" exp=sys.maxsize - 1)\n"
3607"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003608"\n"
3609"\n"
3610"\n"
3611"This docstring has a valid signature with parameters,\n"
3612"and the parameters take defaults of varying types."
3613);
3614
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003615typedef struct {
3616 PyThread_type_lock start_event;
3617 PyThread_type_lock exit_event;
3618 PyObject *callback;
3619} test_c_thread_t;
3620
3621static void
3622temporary_c_thread(void *data)
3623{
3624 test_c_thread_t *test_c_thread = data;
3625 PyGILState_STATE state;
3626 PyObject *res;
3627
3628 PyThread_release_lock(test_c_thread->start_event);
3629
3630 /* Allocate a Python thread state for this thread */
3631 state = PyGILState_Ensure();
3632
Victor Stinner3466bde2016-09-05 18:16:01 -07003633 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003634 Py_CLEAR(test_c_thread->callback);
3635
3636 if (res == NULL) {
3637 PyErr_Print();
3638 }
3639 else {
3640 Py_DECREF(res);
3641 }
3642
3643 /* Destroy the Python thread state for this thread */
3644 PyGILState_Release(state);
3645
3646 PyThread_release_lock(test_c_thread->exit_event);
3647
3648 PyThread_exit_thread();
3649}
3650
3651static PyObject *
3652call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3653{
3654 PyObject *res = NULL;
3655 test_c_thread_t test_c_thread;
3656 long thread;
3657
3658 PyEval_InitThreads();
3659
3660 test_c_thread.start_event = PyThread_allocate_lock();
3661 test_c_thread.exit_event = PyThread_allocate_lock();
3662 test_c_thread.callback = NULL;
3663 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3664 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3665 goto exit;
3666 }
3667
3668 Py_INCREF(callback);
3669 test_c_thread.callback = callback;
3670
3671 PyThread_acquire_lock(test_c_thread.start_event, 1);
3672 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3673
3674 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3675 if (thread == -1) {
3676 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3677 PyThread_release_lock(test_c_thread.start_event);
3678 PyThread_release_lock(test_c_thread.exit_event);
3679 goto exit;
3680 }
3681
3682 PyThread_acquire_lock(test_c_thread.start_event, 1);
3683 PyThread_release_lock(test_c_thread.start_event);
3684
3685 Py_BEGIN_ALLOW_THREADS
3686 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3687 PyThread_release_lock(test_c_thread.exit_event);
3688 Py_END_ALLOW_THREADS
3689
3690 Py_INCREF(Py_None);
3691 res = Py_None;
3692
3693exit:
3694 Py_CLEAR(test_c_thread.callback);
3695 if (test_c_thread.start_event)
3696 PyThread_free_lock(test_c_thread.start_event);
3697 if (test_c_thread.exit_event)
3698 PyThread_free_lock(test_c_thread.exit_event);
3699 return res;
3700}
Victor Stinner13105102013-12-13 02:17:29 +01003701
Victor Stinner56e8c292014-07-21 12:30:22 +02003702static PyObject*
3703test_raise_signal(PyObject* self, PyObject *args)
3704{
3705 int signum, err;
3706
Oren Milmanba7d7362017-08-29 11:58:27 +03003707 if (!PyArg_ParseTuple(args, "i:raise_signal", &signum)) {
Victor Stinner56e8c292014-07-21 12:30:22 +02003708 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03003709 }
Victor Stinner56e8c292014-07-21 12:30:22 +02003710
3711 err = raise(signum);
3712 if (err)
3713 return PyErr_SetFromErrno(PyExc_OSError);
3714
3715 if (PyErr_CheckSignals() < 0)
3716 return NULL;
3717
3718 Py_RETURN_NONE;
3719}
3720
Serhiy Storchakab5181342015-02-06 08:58:56 +02003721/* marshal */
3722
3723static PyObject*
3724pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3725{
3726 long value;
3727 char *filename;
3728 int version;
3729 FILE *fp;
3730
3731 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3732 &value, &filename, &version))
3733 return NULL;
3734
3735 fp = fopen(filename, "wb");
3736 if (fp == NULL) {
3737 PyErr_SetFromErrno(PyExc_OSError);
3738 return NULL;
3739 }
3740
3741 PyMarshal_WriteLongToFile(value, fp, version);
3742
3743 fclose(fp);
3744 if (PyErr_Occurred())
3745 return NULL;
3746 Py_RETURN_NONE;
3747}
3748
3749static PyObject*
3750pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3751{
3752 PyObject *obj;
3753 char *filename;
3754 int version;
3755 FILE *fp;
3756
3757 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3758 &obj, &filename, &version))
3759 return NULL;
3760
3761 fp = fopen(filename, "wb");
3762 if (fp == NULL) {
3763 PyErr_SetFromErrno(PyExc_OSError);
3764 return NULL;
3765 }
3766
3767 PyMarshal_WriteObjectToFile(obj, fp, version);
3768
3769 fclose(fp);
3770 if (PyErr_Occurred())
3771 return NULL;
3772 Py_RETURN_NONE;
3773}
3774
3775static PyObject*
3776pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3777{
3778 int value;
3779 long pos;
3780 char *filename;
3781 FILE *fp;
3782
3783 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3784 return NULL;
3785
3786 fp = fopen(filename, "rb");
3787 if (fp == NULL) {
3788 PyErr_SetFromErrno(PyExc_OSError);
3789 return NULL;
3790 }
3791
3792 value = PyMarshal_ReadShortFromFile(fp);
3793 pos = ftell(fp);
3794
3795 fclose(fp);
3796 if (PyErr_Occurred())
3797 return NULL;
3798 return Py_BuildValue("il", value, pos);
3799}
3800
3801static PyObject*
3802pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3803{
3804 long value, pos;
3805 char *filename;
3806 FILE *fp;
3807
3808 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3809 return NULL;
3810
3811 fp = fopen(filename, "rb");
3812 if (fp == NULL) {
3813 PyErr_SetFromErrno(PyExc_OSError);
3814 return NULL;
3815 }
3816
3817 value = PyMarshal_ReadLongFromFile(fp);
3818 pos = ftell(fp);
3819
3820 fclose(fp);
3821 if (PyErr_Occurred())
3822 return NULL;
3823 return Py_BuildValue("ll", value, pos);
3824}
3825
3826static PyObject*
3827pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3828{
3829 PyObject *obj;
3830 long pos;
3831 char *filename;
3832 FILE *fp;
3833
3834 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3835 return NULL;
3836
3837 fp = fopen(filename, "rb");
3838 if (fp == NULL) {
3839 PyErr_SetFromErrno(PyExc_OSError);
3840 return NULL;
3841 }
3842
3843 obj = PyMarshal_ReadLastObjectFromFile(fp);
3844 pos = ftell(fp);
3845
3846 fclose(fp);
3847 return Py_BuildValue("Nl", obj, pos);
3848}
3849
3850static PyObject*
3851pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3852{
3853 PyObject *obj;
3854 long pos;
3855 char *filename;
3856 FILE *fp;
3857
3858 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3859 return NULL;
3860
3861 fp = fopen(filename, "rb");
3862 if (fp == NULL) {
3863 PyErr_SetFromErrno(PyExc_OSError);
3864 return NULL;
3865 }
3866
3867 obj = PyMarshal_ReadObjectFromFile(fp);
3868 pos = ftell(fp);
3869
3870 fclose(fp);
3871 return Py_BuildValue("Nl", obj, pos);
3872}
3873
Victor Stinnerefde1462015-03-21 15:04:43 +01003874static PyObject*
3875return_null_without_error(PyObject *self, PyObject *args)
3876{
3877 /* invalid call: return NULL without setting an error,
3878 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3879 PyErr_Clear();
3880 return NULL;
3881}
3882
3883static PyObject*
3884return_result_with_error(PyObject *self, PyObject *args)
3885{
3886 /* invalid call: return a result with an error set,
3887 * _Py_CheckFunctionResult() must detect such bug at runtime. */
3888 PyErr_SetNone(PyExc_ValueError);
3889 Py_RETURN_NONE;
3890}
3891
Victor Stinner992c43f2015-03-27 17:12:45 +01003892static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02003893test_pytime_fromseconds(PyObject *self, PyObject *args)
3894{
3895 int seconds;
3896 _PyTime_t ts;
3897
3898 if (!PyArg_ParseTuple(args, "i", &seconds))
3899 return NULL;
3900 ts = _PyTime_FromSeconds(seconds);
3901 return _PyTime_AsNanosecondsObject(ts);
3902}
3903
3904static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01003905test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
3906{
3907 PyObject *obj;
3908 int round;
3909 _PyTime_t ts;
3910
3911 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
3912 return NULL;
3913 if (check_time_rounding(round) < 0)
3914 return NULL;
3915 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
3916 return NULL;
3917 return _PyTime_AsNanosecondsObject(ts);
3918}
3919
Victor Stinner4bfb4602015-03-27 22:27:24 +01003920static PyObject *
3921test_pytime_assecondsdouble(PyObject *self, PyObject *args)
3922{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003923 long long ns;
Victor Stinner4bfb4602015-03-27 22:27:24 +01003924 _PyTime_t ts;
3925 double d;
3926
3927 if (!PyArg_ParseTuple(args, "L", &ns))
3928 return NULL;
3929 ts = _PyTime_FromNanoseconds(ns);
3930 d = _PyTime_AsSecondsDouble(ts);
3931 return PyFloat_FromDouble(d);
3932}
3933
Victor Stinner95e9cef2015-03-28 01:26:47 +01003934static PyObject *
3935test_PyTime_AsTimeval(PyObject *self, PyObject *args)
3936{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003937 long long ns;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003938 int round;
3939 _PyTime_t t;
3940 struct timeval tv;
3941 PyObject *seconds;
3942
3943 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3944 return NULL;
3945 if (check_time_rounding(round) < 0)
3946 return NULL;
3947 t = _PyTime_FromNanoseconds(ns);
Victor Stinnerea9c0dd2015-03-30 02:51:13 +02003948 if (_PyTime_AsTimeval(t, &tv, round) < 0)
Victor Stinner95e9cef2015-03-28 01:26:47 +01003949 return NULL;
Victor Stinner95e9cef2015-03-28 01:26:47 +01003950
Benjamin Peterson2c134c32017-04-13 01:44:54 -07003951 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinner95e9cef2015-03-28 01:26:47 +01003952 if (seconds == NULL)
3953 return NULL;
3954 return Py_BuildValue("Nl", seconds, tv.tv_usec);
3955}
3956
Victor Stinner34dc0f42015-03-27 18:19:03 +01003957#ifdef HAVE_CLOCK_GETTIME
3958static PyObject *
3959test_PyTime_AsTimespec(PyObject *self, PyObject *args)
3960{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003961 long long ns;
Victor Stinner34dc0f42015-03-27 18:19:03 +01003962 _PyTime_t t;
3963 struct timespec ts;
3964
3965 if (!PyArg_ParseTuple(args, "L", &ns))
3966 return NULL;
3967 t = _PyTime_FromNanoseconds(ns);
3968 if (_PyTime_AsTimespec(t, &ts) == -1)
3969 return NULL;
3970 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
3971}
3972#endif
3973
Victor Stinner62d1c702015-04-01 17:47:07 +02003974static PyObject *
3975test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
3976{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003977 long long ns;
Victor Stinner62d1c702015-04-01 17:47:07 +02003978 int round;
3979 _PyTime_t t, ms;
3980
3981 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
3982 return NULL;
3983 if (check_time_rounding(round) < 0)
3984 return NULL;
3985 t = _PyTime_FromNanoseconds(ns);
3986 ms = _PyTime_AsMilliseconds(t, round);
3987 /* This conversion rely on the fact that _PyTime_t is a number of
3988 nanoseconds */
3989 return _PyTime_AsNanosecondsObject(ms);
3990}
3991
3992static PyObject *
3993test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
3994{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07003995 long long ns;
Victor Stinner62d1c702015-04-01 17:47:07 +02003996 int round;
3997 _PyTime_t t, ms;
3998
3999 if (!PyArg_ParseTuple(args, "Li", &ns, &round))
4000 return NULL;
4001 if (check_time_rounding(round) < 0)
4002 return NULL;
4003 t = _PyTime_FromNanoseconds(ns);
4004 ms = _PyTime_AsMicroseconds(t, round);
4005 /* This conversion rely on the fact that _PyTime_t is a number of
4006 nanoseconds */
4007 return _PyTime_AsNanosecondsObject(ms);
4008}
4009
Victor Stinner50856d52015-10-13 00:11:21 +02004010static PyObject*
4011get_recursion_depth(PyObject *self, PyObject *args)
4012{
4013 PyThreadState *tstate = PyThreadState_GET();
4014
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07004015 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02004016 return PyLong_FromLong(tstate->recursion_depth - 1);
4017}
4018
Victor Stinner34be8072016-03-14 12:04:26 +01004019static PyObject*
4020pymem_buffer_overflow(PyObject *self, PyObject *args)
4021{
4022 char *buffer;
4023
4024 /* Deliberate buffer overflow to check that PyMem_Free() detects
4025 the overflow when debug hooks are installed. */
4026 buffer = PyMem_Malloc(16);
4027 buffer[16] = 'x';
4028 PyMem_Free(buffer);
4029
4030 Py_RETURN_NONE;
4031}
4032
4033static PyObject*
4034pymem_api_misuse(PyObject *self, PyObject *args)
4035{
4036 char *buffer;
4037
4038 /* Deliberate misusage of Python allocators:
4039 allococate with PyMem but release with PyMem_Raw. */
4040 buffer = PyMem_Malloc(16);
4041 PyMem_RawFree(buffer);
4042
4043 Py_RETURN_NONE;
4044}
4045
Victor Stinnerc4aec362016-03-14 22:26:53 +01004046static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004047pymem_malloc_without_gil(PyObject *self, PyObject *args)
4048{
4049 char *buffer;
4050
4051 /* Deliberate bug to test debug hooks on Python memory allocators:
4052 call PyMem_Malloc() without holding the GIL */
4053 Py_BEGIN_ALLOW_THREADS
4054 buffer = PyMem_Malloc(10);
4055 Py_END_ALLOW_THREADS
4056
4057 PyMem_Free(buffer);
4058
4059 Py_RETURN_NONE;
4060}
4061
4062static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004063pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4064{
4065 char *buffer;
4066
Victor Stinnerad524372016-03-16 12:12:53 +01004067 /* Deliberate bug to test debug hooks on Python memory allocators:
4068 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004069 Py_BEGIN_ALLOW_THREADS
4070 buffer = PyObject_Malloc(10);
4071 Py_END_ALLOW_THREADS
4072
4073 PyObject_Free(buffer);
4074
4075 Py_RETURN_NONE;
4076}
4077
Victor Stinner10b73e12016-03-22 13:39:05 +01004078static PyObject *
4079tracemalloc_track(PyObject *self, PyObject *args)
4080{
4081 unsigned int domain;
4082 PyObject *ptr_obj;
4083 void *ptr;
4084 Py_ssize_t size;
4085 int release_gil = 0;
4086 int res;
4087
4088 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4089 return NULL;
4090 ptr = PyLong_AsVoidPtr(ptr_obj);
4091 if (PyErr_Occurred())
4092 return NULL;
4093
4094 if (release_gil) {
4095 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004096 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004097 Py_END_ALLOW_THREADS
4098 }
4099 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004100 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004101 }
4102
4103 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004104 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004105 return NULL;
4106 }
4107
4108 Py_RETURN_NONE;
4109}
4110
4111static PyObject *
4112tracemalloc_untrack(PyObject *self, PyObject *args)
4113{
4114 unsigned int domain;
4115 PyObject *ptr_obj;
4116 void *ptr;
4117 int res;
4118
4119 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4120 return NULL;
4121 ptr = PyLong_AsVoidPtr(ptr_obj);
4122 if (PyErr_Occurred())
4123 return NULL;
4124
Victor Stinner5ea4c062017-06-20 17:46:36 +02004125 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004126 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004127 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004128 return NULL;
4129 }
4130
4131 Py_RETURN_NONE;
4132}
4133
4134static PyObject *
4135tracemalloc_get_traceback(PyObject *self, PyObject *args)
4136{
4137 unsigned int domain;
4138 PyObject *ptr_obj;
4139 void *ptr;
4140
4141 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4142 return NULL;
4143 ptr = PyLong_AsVoidPtr(ptr_obj);
4144 if (PyErr_Occurred())
4145 return NULL;
4146
Benjamin Petersonca470632016-09-06 13:47:26 -07004147 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004148}
4149
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004150static PyObject *
4151dict_get_version(PyObject *self, PyObject *args)
4152{
4153 PyDictObject *dict;
4154 uint64_t version;
4155
4156 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4157 return NULL;
4158
4159 version = dict->ma_version_tag;
4160
4161 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4162 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4163}
4164
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004165
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004166static PyObject *
4167raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4168{
4169 PyGenObject *gen;
4170
4171 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4172 return NULL;
4173
4174 /* This is used in a test to check what happens if a signal arrives just
4175 as we're in the process of entering a yield from chain (see
4176 bpo-30039).
4177
4178 Needs to be done in C, because:
4179 - we don't have a Python wrapper for raise()
4180 - we need to make sure that the Python-level signal handler doesn't run
4181 *before* we enter the generator frame, which is impossible in Python
4182 because we check for signals before every bytecode operation.
4183 */
4184 raise(SIGINT);
4185 return _PyGen_Send(gen, Py_None);
4186}
4187
4188
Victor Stinner3b5cf852017-06-09 16:48:45 +02004189static int
4190fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4191{
4192 if (args == Py_None) {
4193 *stack = NULL;
4194 *nargs = 0;
4195 }
4196 else if (PyTuple_Check(args)) {
4197 *stack = &PyTuple_GET_ITEM(args, 0);
4198 *nargs = PyTuple_GET_SIZE(args);
4199 }
4200 else {
4201 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4202 return -1;
4203 }
4204 return 0;
4205}
4206
4207
4208static PyObject *
4209test_pyobject_fastcall(PyObject *self, PyObject *args)
4210{
4211 PyObject *func, *func_args;
4212 PyObject **stack;
4213 Py_ssize_t nargs;
4214
4215 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4216 return NULL;
4217 }
4218
4219 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4220 return NULL;
4221 }
4222 return _PyObject_FastCall(func, stack, nargs);
4223}
4224
4225
4226static PyObject *
4227test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4228{
4229 PyObject *func, *func_args, *kwargs;
4230 PyObject **stack;
4231 Py_ssize_t nargs;
4232
4233 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4234 return NULL;
4235 }
4236
4237 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4238 return NULL;
4239 }
4240
4241 if (kwargs == Py_None) {
4242 kwargs = NULL;
4243 }
4244 else if (!PyDict_Check(kwargs)) {
4245 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4246 return NULL;
4247 }
4248
4249 return _PyObject_FastCallDict(func, stack, nargs, kwargs);
4250}
4251
4252
4253static PyObject *
4254test_pyobject_fastcallkeywords(PyObject *self, PyObject *args)
4255{
4256 PyObject *func, *func_args, *kwnames = NULL;
4257 PyObject **stack;
4258 Py_ssize_t nargs, nkw;
4259
4260 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4261 return NULL;
4262 }
4263
4264 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4265 return NULL;
4266 }
4267
4268 if (kwnames == Py_None) {
4269 kwnames = NULL;
4270 }
4271 else if (PyTuple_Check(kwnames)) {
4272 nkw = PyTuple_GET_SIZE(kwnames);
4273 if (nargs < nkw) {
4274 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4275 return NULL;
4276 }
4277 nargs -= nkw;
4278 }
4279 else {
4280 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4281 return NULL;
4282 }
4283 return _PyObject_FastCallKeywords(func, stack, nargs, kwnames);
4284}
4285
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004286
Victor Stinner64fa4492017-07-10 14:37:49 +02004287static PyObject*
4288stack_pointer(PyObject *self, PyObject *args)
4289{
4290 int v = 5;
4291 return PyLong_FromVoidPtr(&v);
4292}
4293
Victor Stinner3b5cf852017-06-09 16:48:45 +02004294
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004295#ifdef W_STOPCODE
4296static PyObject*
4297py_w_stopcode(PyObject *self, PyObject *args)
4298{
4299 int sig, status;
4300 if (!PyArg_ParseTuple(args, "i", &sig)) {
4301 return NULL;
4302 }
4303 status = W_STOPCODE(sig);
4304 return PyLong_FromLong(status);
4305}
4306#endif
4307
4308
Tim Peters9ea17ac2001-02-02 05:57:15 +00004309static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004310 {"raise_exception", raise_exception, METH_VARARGS},
4311 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02004312 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004313 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01004314 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004315 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
4316 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
4317 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02004318 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01004319 {"dict_hassplittable", dict_hassplittable, METH_O},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004320 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004321 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07004322 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
4323 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
4324 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
4325 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02004326 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004327 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
4328 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02004329 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
4330 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004331 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
4332 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
4333 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07004334 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004335 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
4336 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
4337 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
4338 PyDoc_STR("This is a pretty normal docstring.")},
4339 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
4340 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
4341 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01004342 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004343#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01004344 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004345#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01004346 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03004347 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03004348 {"get_args", get_args, METH_VARARGS},
4349 {"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004350 {"getargs_tuple", getargs_tuple, METH_VARARGS},
4351 {"getargs_keywords", (PyCFunction)getargs_keywords,
4352 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00004353 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
4354 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03004355 {"getargs_positional_only_and_keywords",
4356 (PyCFunction)getargs_positional_only_and_keywords,
4357 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004358 {"getargs_b", getargs_b, METH_VARARGS},
4359 {"getargs_B", getargs_B, METH_VARARGS},
4360 {"getargs_h", getargs_h, METH_VARARGS},
4361 {"getargs_H", getargs_H, METH_VARARGS},
4362 {"getargs_I", getargs_I, METH_VARARGS},
4363 {"getargs_k", getargs_k, METH_VARARGS},
4364 {"getargs_i", getargs_i, METH_VARARGS},
4365 {"getargs_l", getargs_l, METH_VARARGS},
4366 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07004367 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004368 {"getargs_L", getargs_L, METH_VARARGS},
4369 {"getargs_K", getargs_K, METH_VARARGS},
4370 {"test_longlong_api", test_longlong_api, METH_NOARGS},
4371 {"test_long_long_and_overflow",
4372 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
4373 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03004374 {"getargs_f", getargs_f, METH_VARARGS},
4375 {"getargs_d", getargs_d, METH_VARARGS},
4376 {"getargs_D", getargs_D, METH_VARARGS},
4377 {"getargs_S", getargs_S, METH_VARARGS},
4378 {"getargs_Y", getargs_Y, METH_VARARGS},
4379 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03004380 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004381 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00004382 {"getargs_s", getargs_s, METH_VARARGS},
4383 {"getargs_s_star", getargs_s_star, METH_VARARGS},
4384 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
4385 {"getargs_z", getargs_z, METH_VARARGS},
4386 {"getargs_z_star", getargs_z_star, METH_VARARGS},
4387 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
4388 {"getargs_y", getargs_y, METH_VARARGS},
4389 {"getargs_y_star", getargs_y_star, METH_VARARGS},
4390 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
4391 {"getargs_u", getargs_u, METH_VARARGS},
4392 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
4393 {"getargs_Z", getargs_Z, METH_VARARGS},
4394 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00004395 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004396 {"getargs_es", getargs_es, METH_VARARGS},
4397 {"getargs_et", getargs_et, METH_VARARGS},
4398 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
4399 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004400 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004401 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004402 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004403 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
4405 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
4406 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
4407 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004408 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
4409 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03004410 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08004411 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03004412 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004413 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
4414 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01004415 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004416 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004418#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00004419 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004420#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00004421 {"traceback_print", traceback_print, METH_VARARGS},
4422 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02004423 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004424 {"argparsing", argparsing, METH_VARARGS},
4425 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004426 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
4427 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00004428 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
4429 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00004430 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004431 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01004432 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
4433 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01004434 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02004435 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04004436 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02004437 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02004438 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
4439 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02004440 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
4441 {"test_pymem_setallocators",
4442 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
4443 {"test_pyobject_setallocators",
4444 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02004445 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
4446 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
4447 {"remove_mem_hooks", (PyCFunction)remove_mem_hooks, METH_NOARGS,
4448 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004449 {"no_docstring",
4450 (PyCFunction)test_with_docstring, METH_NOARGS},
4451 {"docstring_empty",
4452 (PyCFunction)test_with_docstring, METH_NOARGS,
4453 docstring_empty},
4454 {"docstring_no_signature",
4455 (PyCFunction)test_with_docstring, METH_NOARGS,
4456 docstring_no_signature},
4457 {"docstring_with_invalid_signature",
4458 (PyCFunction)test_with_docstring, METH_NOARGS,
4459 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004460 {"docstring_with_invalid_signature2",
4461 (PyCFunction)test_with_docstring, METH_NOARGS,
4462 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004463 {"docstring_with_signature",
4464 (PyCFunction)test_with_docstring, METH_NOARGS,
4465 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004466 {"docstring_with_signature_but_no_doc",
4467 (PyCFunction)test_with_docstring, METH_NOARGS,
4468 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004469 {"docstring_with_signature_and_extra_newlines",
4470 (PyCFunction)test_with_docstring, METH_NOARGS,
4471 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004472 {"docstring_with_signature_with_defaults",
4473 (PyCFunction)test_with_docstring, METH_NOARGS,
4474 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02004475 {"raise_signal",
4476 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004477 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4478 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02004479 {"pymarshal_write_long_to_file",
4480 pymarshal_write_long_to_file, METH_VARARGS},
4481 {"pymarshal_write_object_to_file",
4482 pymarshal_write_object_to_file, METH_VARARGS},
4483 {"pymarshal_read_short_from_file",
4484 pymarshal_read_short_from_file, METH_VARARGS},
4485 {"pymarshal_read_long_from_file",
4486 pymarshal_read_long_from_file, METH_VARARGS},
4487 {"pymarshal_read_last_object_from_file",
4488 pymarshal_read_last_object_from_file, METH_VARARGS},
4489 {"pymarshal_read_object_from_file",
4490 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004491 {"return_null_without_error",
4492 return_null_without_error, METH_NOARGS},
4493 {"return_result_with_error",
4494 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004495 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004496 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4497 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004498 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004499#ifdef HAVE_CLOCK_GETTIME
4500 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4501#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004502 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4503 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004504 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be8072016-03-14 12:04:26 +01004505 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
4506 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01004507 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01004508 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01004509 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
4510 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
4511 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004512 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004513 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02004514 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
4515 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
4516 {"pyobject_fastcallkeywords", test_pyobject_fastcallkeywords, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02004517 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004518#ifdef W_STOPCODE
4519 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
4520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004521 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00004522};
4523
Thomas Hellera4ea6032003-04-17 18:55:45 +00004524#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
4525
Thomas Wouters89f507f2006-12-13 04:49:30 +00004526typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004527 char bool_member;
4528 char byte_member;
4529 unsigned char ubyte_member;
4530 short short_member;
4531 unsigned short ushort_member;
4532 int int_member;
4533 unsigned int uint_member;
4534 long long_member;
4535 unsigned long ulong_member;
4536 Py_ssize_t pyssizet_member;
4537 float float_member;
4538 double double_member;
4539 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07004540 long long longlong_member;
4541 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004542} all_structmembers;
4543
4544typedef struct {
4545 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004546 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004547} test_structmembers;
4548
4549static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004550 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
4551 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
4552 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
4553 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
4554 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
4555 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
4556 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
4557 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
4558 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
4559 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
4560 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
4561 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
4562 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004563 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
4564 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004565 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00004566};
4567
4568
Christian Heimes1af737c2008-01-23 08:24:23 +00004569static PyObject *
4570test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
4571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004572 static char *keywords[] = {
4573 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
4574 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
4575 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004576 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07004578 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 test_structmembers *ob;
4580 const char *s = NULL;
4581 Py_ssize_t string_len = 0;
4582 ob = PyObject_New(test_structmembers, type);
4583 if (ob == NULL)
4584 return NULL;
4585 memset(&ob->structmembers, 0, sizeof(all_structmembers));
4586 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
4587 &ob->structmembers.bool_member,
4588 &ob->structmembers.byte_member,
4589 &ob->structmembers.ubyte_member,
4590 &ob->structmembers.short_member,
4591 &ob->structmembers.ushort_member,
4592 &ob->structmembers.int_member,
4593 &ob->structmembers.uint_member,
4594 &ob->structmembers.long_member,
4595 &ob->structmembers.ulong_member,
4596 &ob->structmembers.pyssizet_member,
4597 &ob->structmembers.float_member,
4598 &ob->structmembers.double_member,
4599 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004600 , &ob->structmembers.longlong_member,
4601 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004602 )) {
4603 Py_DECREF(ob);
4604 return NULL;
4605 }
4606 if (s != NULL) {
4607 if (string_len > 5) {
4608 Py_DECREF(ob);
4609 PyErr_SetString(PyExc_ValueError, "string too long");
4610 return NULL;
4611 }
4612 strcpy(ob->structmembers.inplace_member, s);
4613 }
4614 else {
4615 strcpy(ob->structmembers.inplace_member, "");
4616 }
4617 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004618}
4619
Christian Heimes1af737c2008-01-23 08:24:23 +00004620static void
4621test_structmembers_free(PyObject *ob)
4622{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004624}
4625
4626static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004627 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004628 "test_structmembersType",
4629 sizeof(test_structmembers), /* tp_basicsize */
4630 0, /* tp_itemsize */
4631 test_structmembers_free, /* destructor tp_dealloc */
4632 0, /* tp_print */
4633 0, /* tp_getattr */
4634 0, /* tp_setattr */
4635 0, /* tp_reserved */
4636 0, /* tp_repr */
4637 0, /* tp_as_number */
4638 0, /* tp_as_sequence */
4639 0, /* tp_as_mapping */
4640 0, /* tp_hash */
4641 0, /* tp_call */
4642 0, /* tp_str */
4643 PyObject_GenericGetAttr, /* tp_getattro */
4644 PyObject_GenericSetAttr, /* tp_setattro */
4645 0, /* tp_as_buffer */
4646 0, /* tp_flags */
4647 "Type containing all structmember types",
4648 0, /* traverseproc tp_traverse */
4649 0, /* tp_clear */
4650 0, /* tp_richcompare */
4651 0, /* tp_weaklistoffset */
4652 0, /* tp_iter */
4653 0, /* tp_iternext */
4654 0, /* tp_methods */
4655 test_members, /* tp_members */
4656 0,
4657 0,
4658 0,
4659 0,
4660 0,
4661 0,
4662 0,
4663 0,
4664 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004665};
4666
4667
Benjamin Petersond51374e2014-04-09 23:55:56 -04004668typedef struct {
4669 PyObject_HEAD
4670} matmulObject;
4671
4672static PyObject *
4673matmulType_matmul(PyObject *self, PyObject *other)
4674{
4675 return Py_BuildValue("(sOO)", "matmul", self, other);
4676}
4677
4678static PyObject *
4679matmulType_imatmul(PyObject *self, PyObject *other)
4680{
4681 return Py_BuildValue("(sOO)", "imatmul", self, other);
4682}
4683
4684static void
4685matmulType_dealloc(PyObject *self)
4686{
Zachary Ware420dc562014-04-23 13:51:27 -05004687 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004688}
4689
4690static PyNumberMethods matmulType_as_number = {
4691 0, /* nb_add */
4692 0, /* nb_subtract */
4693 0, /* nb_multiply */
4694 0, /* nb_remainde r*/
4695 0, /* nb_divmod */
4696 0, /* nb_power */
4697 0, /* nb_negative */
4698 0, /* tp_positive */
4699 0, /* tp_absolute */
4700 0, /* tp_bool */
4701 0, /* nb_invert */
4702 0, /* nb_lshift */
4703 0, /* nb_rshift */
4704 0, /* nb_and */
4705 0, /* nb_xor */
4706 0, /* nb_or */
4707 0, /* nb_int */
4708 0, /* nb_reserved */
4709 0, /* nb_float */
4710 0, /* nb_inplace_add */
4711 0, /* nb_inplace_subtract */
4712 0, /* nb_inplace_multiply */
4713 0, /* nb_inplace_remainder */
4714 0, /* nb_inplace_power */
4715 0, /* nb_inplace_lshift */
4716 0, /* nb_inplace_rshift */
4717 0, /* nb_inplace_and */
4718 0, /* nb_inplace_xor */
4719 0, /* nb_inplace_or */
4720 0, /* nb_floor_divide */
4721 0, /* nb_true_divide */
4722 0, /* nb_inplace_floor_divide */
4723 0, /* nb_inplace_true_divide */
4724 0, /* nb_index */
4725 matmulType_matmul, /* nb_matrix_multiply */
4726 matmulType_imatmul /* nb_matrix_inplace_multiply */
4727};
4728
4729static PyTypeObject matmulType = {
4730 PyVarObject_HEAD_INIT(NULL, 0)
4731 "matmulType",
4732 sizeof(matmulObject), /* tp_basicsize */
4733 0, /* tp_itemsize */
4734 matmulType_dealloc, /* destructor tp_dealloc */
4735 0, /* tp_print */
4736 0, /* tp_getattr */
4737 0, /* tp_setattr */
4738 0, /* tp_reserved */
4739 0, /* tp_repr */
4740 &matmulType_as_number, /* tp_as_number */
4741 0, /* tp_as_sequence */
4742 0, /* tp_as_mapping */
4743 0, /* tp_hash */
4744 0, /* tp_call */
4745 0, /* tp_str */
4746 PyObject_GenericGetAttr, /* tp_getattro */
4747 PyObject_GenericSetAttr, /* tp_setattro */
4748 0, /* tp_as_buffer */
4749 0, /* tp_flags */
4750 "C level type with matrix operations defined",
4751 0, /* traverseproc tp_traverse */
4752 0, /* tp_clear */
4753 0, /* tp_richcompare */
4754 0, /* tp_weaklistoffset */
4755 0, /* tp_iter */
4756 0, /* tp_iternext */
4757 0, /* tp_methods */
4758 0, /* tp_members */
4759 0,
4760 0,
4761 0,
4762 0,
4763 0,
4764 0,
4765 0,
4766 0,
4767 PyType_GenericNew, /* tp_new */
4768 PyObject_Del, /* tp_free */
4769};
4770
Martin v. Löwis1a214512008-06-11 05:26:20 +00004771
Yury Selivanov75445082015-05-11 22:57:16 -04004772typedef struct {
4773 PyObject_HEAD
4774 PyObject *ao_iterator;
4775} awaitObject;
4776
4777
4778static PyObject *
4779awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4780{
4781 PyObject *v;
4782 awaitObject *ao;
4783
4784 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
4785 return NULL;
4786
4787 ao = (awaitObject *)type->tp_alloc(type, 0);
4788 if (ao == NULL) {
4789 return NULL;
4790 }
4791
4792 Py_INCREF(v);
4793 ao->ao_iterator = v;
4794
4795 return (PyObject *)ao;
4796}
4797
4798
4799static void
4800awaitObject_dealloc(awaitObject *ao)
4801{
4802 Py_CLEAR(ao->ao_iterator);
4803 Py_TYPE(ao)->tp_free(ao);
4804}
4805
4806
4807static PyObject *
4808awaitObject_await(awaitObject *ao)
4809{
4810 Py_INCREF(ao->ao_iterator);
4811 return ao->ao_iterator;
4812}
4813
4814static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04004815 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04004816 0, /* am_aiter */
4817 0 /* am_anext */
4818};
4819
4820
4821static PyTypeObject awaitType = {
4822 PyVarObject_HEAD_INIT(NULL, 0)
4823 "awaitType",
4824 sizeof(awaitObject), /* tp_basicsize */
4825 0, /* tp_itemsize */
4826 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
4827 0, /* tp_print */
4828 0, /* tp_getattr */
4829 0, /* tp_setattr */
4830 &awaitType_as_async, /* tp_as_async */
4831 0, /* tp_repr */
4832 0, /* tp_as_number */
4833 0, /* tp_as_sequence */
4834 0, /* tp_as_mapping */
4835 0, /* tp_hash */
4836 0, /* tp_call */
4837 0, /* tp_str */
4838 PyObject_GenericGetAttr, /* tp_getattro */
4839 PyObject_GenericSetAttr, /* tp_setattro */
4840 0, /* tp_as_buffer */
4841 0, /* tp_flags */
4842 "C level type with tp_as_async",
4843 0, /* traverseproc tp_traverse */
4844 0, /* tp_clear */
4845 0, /* tp_richcompare */
4846 0, /* tp_weaklistoffset */
4847 0, /* tp_iter */
4848 0, /* tp_iternext */
4849 0, /* tp_methods */
4850 0, /* tp_members */
4851 0,
4852 0,
4853 0,
4854 0,
4855 0,
4856 0,
4857 0,
4858 0,
4859 awaitObject_new, /* tp_new */
4860 PyObject_Del, /* tp_free */
4861};
4862
4863
Martin v. Löwis1a214512008-06-11 05:26:20 +00004864static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004865 PyModuleDef_HEAD_INIT,
4866 "_testcapi",
4867 NULL,
4868 -1,
4869 TestMethods,
4870 NULL,
4871 NULL,
4872 NULL,
4873 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004874};
4875
Nick Coghland5cacbb2015-05-23 22:24:10 +10004876/* Per PEP 489, this module will not be converted to multi-phase initialization
4877 */
4878
Mark Hammond62b1ab12002-07-23 06:31:15 +00004879PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004880PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00004881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004882 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004884 m = PyModule_Create(&_testcapimodule);
4885 if (m == NULL)
4886 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004888 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00004889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004890 Py_TYPE(&test_structmembersType)=&PyType_Type;
4891 Py_INCREF(&test_structmembersType);
4892 /* don't use a name starting with "test", since we don't want
4893 test_capi to automatically call this */
4894 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04004895 if (PyType_Ready(&matmulType) < 0)
4896 return NULL;
4897 Py_INCREF(&matmulType);
4898 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004899
Yury Selivanov75445082015-05-11 22:57:16 -04004900 if (PyType_Ready(&awaitType) < 0)
4901 return NULL;
4902 Py_INCREF(&awaitType);
4903 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
4904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
4906 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
4907 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
4908 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
4909 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
4910 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
4911 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
4912 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
4913 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
4914 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
4915 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
4916 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
4917 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
4918 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
4919 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
4920 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
4921 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
4922 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
4923 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
4924 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
4925 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
4926 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02004927 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004928 Py_INCREF(&PyInstanceMethod_Type);
4929 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00004930
Larry Hastings2a727912014-01-16 11:32:01 -08004931 PyModule_AddIntConstant(m, "the_number_three", 3);
4932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004933 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
4934 Py_INCREF(TestError);
4935 PyModule_AddObject(m, "error", TestError);
4936 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00004937}