blob: 64b7b690493948b91d4a9676ea05feca80086f64 [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
Zackery Spytze36ed472019-06-07 09:41:10 -0600819static PyObject *
820test_long_as_unsigned_long_long_mask(PyObject *self,
821 PyObject *Py_UNUSED(ignored))
822{
823 unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL);
824
825 if (res != (unsigned long long)-1 || !PyErr_Occurred()) {
826 return raiseTestError("test_long_as_unsigned_long_long_mask",
827 "PyLong_AsUnsignedLongLongMask(NULL) didn't "
828 "complain");
829 }
830 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
831 return raiseTestError("test_long_as_unsigned_long_long_mask",
832 "PyLong_AsUnsignedLongLongMask(NULL) raised "
833 "something other than SystemError");
834 }
835 PyErr_Clear();
836 Py_RETURN_NONE;
837}
838
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200839/* Test the PyLong_AsDouble API. At present this just tests that
840 non-integer arguments are handled correctly.
841 */
842
843static PyObject *
844test_long_as_double(PyObject *self)
845{
846 double out;
847
848 Py_INCREF(Py_None);
849
850 out = PyLong_AsDouble(Py_None);
851 if (out != -1.0 || !PyErr_Occurred())
852 return raiseTestError("test_long_as_double",
853 "PyLong_AsDouble(None) didn't complain");
854 if (!PyErr_ExceptionMatches(PyExc_TypeError))
855 return raiseTestError("test_long_as_double",
856 "PyLong_AsDouble(None) raised "
857 "something other than TypeError");
858 PyErr_Clear();
859
860 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
861 return Py_None;
862}
863
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700864/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000865 for both long and int arguments. The test may leak a little memory if
866 it fails.
867*/
868static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +0000869test_L_code(PyObject *self)
Tim Petersd38b1c72001-09-30 05:09:37 +0000870{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700872 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 tuple = PyTuple_New(1);
875 if (tuple == NULL)
876 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 num = PyLong_FromLong(42);
879 if (num == NULL)
880 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300885 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300887 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 if (value != 42)
889 return raiseTestError("test_L_code",
890 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 Py_DECREF(num);
893 num = PyLong_FromLong(42);
894 if (num == NULL)
895 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300900 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300902 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 if (value != 42)
904 return raiseTestError("test_L_code",
905 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200908 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000909}
910
Serhiy Storchakace412872016-05-08 23:36:44 +0300911static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300912return_none(void *unused)
913{
914 Py_RETURN_NONE;
915}
916
917static PyObject *
918raise_error(void *unused)
919{
920 PyErr_SetNone(PyExc_ValueError);
921 return NULL;
922}
923
924static int
925test_buildvalue_N_error(const char *fmt)
926{
927 PyObject *arg, *res;
928
929 arg = PyList_New(0);
930 if (arg == NULL) {
931 return -1;
932 }
933
934 Py_INCREF(arg);
935 res = Py_BuildValue(fmt, return_none, NULL, arg);
936 if (res == NULL) {
937 return -1;
938 }
939 Py_DECREF(res);
940 if (Py_REFCNT(arg) != 1) {
941 PyErr_Format(TestError, "test_buildvalue_N: "
942 "arg was not decrefed in successful "
943 "Py_BuildValue(\"%s\")", fmt);
944 return -1;
945 }
946
947 Py_INCREF(arg);
948 res = Py_BuildValue(fmt, raise_error, NULL, arg);
949 if (res != NULL || !PyErr_Occurred()) {
950 PyErr_Format(TestError, "test_buildvalue_N: "
951 "Py_BuildValue(\"%s\") didn't complain", fmt);
952 return -1;
953 }
954 PyErr_Clear();
955 if (Py_REFCNT(arg) != 1) {
956 PyErr_Format(TestError, "test_buildvalue_N: "
957 "arg was not decrefed in failed "
958 "Py_BuildValue(\"%s\")", fmt);
959 return -1;
960 }
961 Py_DECREF(arg);
962 return 0;
963}
964
965static PyObject *
Serhiy Storchakaad8ac542018-11-27 20:27:47 +0200966test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300967{
968 PyObject *arg, *res;
969
970 arg = PyList_New(0);
971 if (arg == NULL) {
972 return NULL;
973 }
974 Py_INCREF(arg);
975 res = Py_BuildValue("N", arg);
976 if (res == NULL) {
977 return NULL;
978 }
979 if (res != arg) {
980 return raiseTestError("test_buildvalue_N",
981 "Py_BuildValue(\"N\") returned wrong result");
982 }
983 if (Py_REFCNT(arg) != 2) {
984 return raiseTestError("test_buildvalue_N",
985 "arg was not decrefed in Py_BuildValue(\"N\")");
986 }
987 Py_DECREF(res);
988 Py_DECREF(arg);
989
990 if (test_buildvalue_N_error("O&N") < 0)
991 return NULL;
992 if (test_buildvalue_N_error("(O&N)") < 0)
993 return NULL;
994 if (test_buildvalue_N_error("[O&N]") < 0)
995 return NULL;
996 if (test_buildvalue_N_error("{O&N}") < 0)
997 return NULL;
998 if (test_buildvalue_N_error("{()O&(())N}") < 0)
999 return NULL;
1000
1001 Py_RETURN_NONE;
1002}
1003
1004
1005static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +03001006get_args(PyObject *self, PyObject *args)
1007{
1008 if (args == NULL) {
1009 args = Py_None;
1010 }
1011 Py_INCREF(args);
1012 return args;
1013}
1014
1015static PyObject *
1016get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1017{
1018 if (kwargs == NULL) {
1019 kwargs = Py_None;
1020 }
1021 Py_INCREF(kwargs);
1022 return kwargs;
1023}
1024
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001025/* Test tuple argument processing */
1026static PyObject *
1027getargs_tuple(PyObject *self, PyObject *args)
1028{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 int a, b, c;
1030 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1031 return NULL;
1032 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001033}
1034
Christian Heimes380f7f22008-02-28 11:19:05 +00001035/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001036static PyObject *
1037getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001040 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1044 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1045 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1046 return NULL;
1047 return Py_BuildValue("iiiiiiiiii",
1048 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1049 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001050}
1051
Larry Hastings83a9f482012-03-20 20:06:16 +00001052/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1053static PyObject *
1054getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1055{
1056 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1057 int required = -1;
1058 int optional = -1;
1059 int keyword_only = -1;
1060
1061 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1062 &required, &optional, &keyword_only))
1063 return NULL;
1064 return Py_BuildValue("iii", required, optional, keyword_only);
1065}
1066
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001067/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1068static PyObject *
1069getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1070{
1071 static char *keywords[] = {"", "", "keyword", NULL};
1072 int required = -1;
1073 int optional = -1;
1074 int keyword = -1;
1075
1076 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1077 &required, &optional, &keyword))
1078 return NULL;
1079 return Py_BuildValue("iii", required, optional, keyword);
1080}
1081
Thomas Heller3457e4b2003-04-24 16:14:27 +00001082/* Functions to call PyArg_ParseTuple with integer format codes,
1083 and return the result.
1084*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001085static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001086getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001087{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 unsigned char value;
1089 if (!PyArg_ParseTuple(args, "b", &value))
1090 return NULL;
1091 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001092}
1093
Thomas Heller3457e4b2003-04-24 16:14:27 +00001094static PyObject *
1095getargs_B(PyObject *self, PyObject *args)
1096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 unsigned char value;
1098 if (!PyArg_ParseTuple(args, "B", &value))
1099 return NULL;
1100 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001101}
1102
1103static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001104getargs_h(PyObject *self, PyObject *args)
1105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 short value;
1107 if (!PyArg_ParseTuple(args, "h", &value))
1108 return NULL;
1109 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001110}
1111
1112static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001113getargs_H(PyObject *self, PyObject *args)
1114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 unsigned short value;
1116 if (!PyArg_ParseTuple(args, "H", &value))
1117 return NULL;
1118 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001119}
1120
1121static PyObject *
1122getargs_I(PyObject *self, PyObject *args)
1123{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 unsigned int value;
1125 if (!PyArg_ParseTuple(args, "I", &value))
1126 return NULL;
1127 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001128}
1129
1130static PyObject *
1131getargs_k(PyObject *self, PyObject *args)
1132{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 unsigned long value;
1134 if (!PyArg_ParseTuple(args, "k", &value))
1135 return NULL;
1136 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001137}
1138
1139static PyObject *
1140getargs_i(PyObject *self, PyObject *args)
1141{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 int value;
1143 if (!PyArg_ParseTuple(args, "i", &value))
1144 return NULL;
1145 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001146}
1147
Thomas Hellera4ea6032003-04-17 18:55:45 +00001148static PyObject *
1149getargs_l(PyObject *self, PyObject *args)
1150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 long value;
1152 if (!PyArg_ParseTuple(args, "l", &value))
1153 return NULL;
1154 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001155}
1156
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001157static PyObject *
1158getargs_n(PyObject *self, PyObject *args)
1159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 Py_ssize_t value;
1161 if (!PyArg_ParseTuple(args, "n", &value))
1162 return NULL;
1163 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001164}
1165
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001166static PyObject *
1167getargs_p(PyObject *self, PyObject *args)
1168{
1169 int value;
1170 if (!PyArg_ParseTuple(args, "p", &value))
1171 return NULL;
1172 return PyLong_FromLong(value);
1173}
1174
Thomas Hellera4ea6032003-04-17 18:55:45 +00001175static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001176getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001177{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001178 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 if (!PyArg_ParseTuple(args, "L", &value))
1180 return NULL;
1181 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001182}
1183
Thomas Hellera4ea6032003-04-17 18:55:45 +00001184static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001185getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001186{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001187 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 if (!PyArg_ParseTuple(args, "K", &value))
1189 return NULL;
1190 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001191}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001192
1193/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001194 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001195static PyObject *
1196test_k_code(PyObject *self)
1197{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 PyObject *tuple, *num;
1199 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 tuple = PyTuple_New(1);
1202 if (tuple == NULL)
1203 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 /* a number larger than ULONG_MAX even on 64-bit platforms */
1206 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", 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 != ULONG_MAX)
1212 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001213 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001218 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001220 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 if (value != ULONG_MAX)
1222 return raiseTestError("test_k_code",
1223 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 Py_DECREF(num);
1226 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1227 if (num == NULL)
1228 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 value = PyLong_AsUnsignedLongMask(num);
1231 if (value != (unsigned long)-0x42)
1232 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001233 "PyLong_AsUnsignedLongMask() returned wrong "
1234 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001239 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001241 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 if (value != (unsigned long)-0x42)
1243 return raiseTestError("test_k_code",
1244 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001247 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001248}
1249
Victor Stinner06e49dd2010-06-13 18:21:50 +00001250static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001251getargs_f(PyObject *self, PyObject *args)
1252{
1253 float f;
1254 if (!PyArg_ParseTuple(args, "f", &f))
1255 return NULL;
1256 return PyFloat_FromDouble(f);
1257}
1258
1259static PyObject *
1260getargs_d(PyObject *self, PyObject *args)
1261{
1262 double d;
1263 if (!PyArg_ParseTuple(args, "d", &d))
1264 return NULL;
1265 return PyFloat_FromDouble(d);
1266}
1267
1268static PyObject *
1269getargs_D(PyObject *self, PyObject *args)
1270{
1271 Py_complex cval;
1272 if (!PyArg_ParseTuple(args, "D", &cval))
1273 return NULL;
1274 return PyComplex_FromCComplex(cval);
1275}
1276
1277static PyObject *
1278getargs_S(PyObject *self, PyObject *args)
1279{
1280 PyObject *obj;
1281 if (!PyArg_ParseTuple(args, "S", &obj))
1282 return NULL;
1283 Py_INCREF(obj);
1284 return obj;
1285}
1286
1287static PyObject *
1288getargs_Y(PyObject *self, PyObject *args)
1289{
1290 PyObject *obj;
1291 if (!PyArg_ParseTuple(args, "Y", &obj))
1292 return NULL;
1293 Py_INCREF(obj);
1294 return obj;
1295}
1296
1297static PyObject *
1298getargs_U(PyObject *self, PyObject *args)
1299{
1300 PyObject *obj;
1301 if (!PyArg_ParseTuple(args, "U", &obj))
1302 return NULL;
1303 Py_INCREF(obj);
1304 return obj;
1305}
1306
1307static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001308getargs_c(PyObject *self, PyObject *args)
1309{
1310 char c;
1311 if (!PyArg_ParseTuple(args, "c", &c))
1312 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001313 return PyLong_FromLong((unsigned char)c);
1314}
1315
1316static PyObject *
1317getargs_C(PyObject *self, PyObject *args)
1318{
1319 int c;
1320 if (!PyArg_ParseTuple(args, "C", &c))
1321 return NULL;
1322 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001323}
1324
1325static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001326getargs_s(PyObject *self, PyObject *args)
1327{
1328 char *str;
1329 if (!PyArg_ParseTuple(args, "s", &str))
1330 return NULL;
1331 return PyBytes_FromString(str);
1332}
1333
1334static PyObject *
1335getargs_s_star(PyObject *self, PyObject *args)
1336{
1337 Py_buffer buffer;
1338 PyObject *bytes;
1339 if (!PyArg_ParseTuple(args, "s*", &buffer))
1340 return NULL;
1341 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1342 PyBuffer_Release(&buffer);
1343 return bytes;
1344}
1345
1346static PyObject *
1347getargs_s_hash(PyObject *self, PyObject *args)
1348{
1349 char *str;
1350 Py_ssize_t size;
1351 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1352 return NULL;
1353 return PyBytes_FromStringAndSize(str, size);
1354}
1355
1356static PyObject *
1357getargs_z(PyObject *self, PyObject *args)
1358{
1359 char *str;
1360 if (!PyArg_ParseTuple(args, "z", &str))
1361 return NULL;
1362 if (str != NULL)
1363 return PyBytes_FromString(str);
1364 else
1365 Py_RETURN_NONE;
1366}
1367
1368static PyObject *
1369getargs_z_star(PyObject *self, PyObject *args)
1370{
1371 Py_buffer buffer;
1372 PyObject *bytes;
1373 if (!PyArg_ParseTuple(args, "z*", &buffer))
1374 return NULL;
1375 if (buffer.buf != NULL)
1376 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1377 else {
1378 Py_INCREF(Py_None);
1379 bytes = Py_None;
1380 }
1381 PyBuffer_Release(&buffer);
1382 return bytes;
1383}
1384
1385static PyObject *
1386getargs_z_hash(PyObject *self, PyObject *args)
1387{
1388 char *str;
1389 Py_ssize_t size;
1390 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1391 return NULL;
1392 if (str != NULL)
1393 return PyBytes_FromStringAndSize(str, size);
1394 else
1395 Py_RETURN_NONE;
1396}
1397
1398static PyObject *
1399getargs_y(PyObject *self, PyObject *args)
1400{
1401 char *str;
1402 if (!PyArg_ParseTuple(args, "y", &str))
1403 return NULL;
1404 return PyBytes_FromString(str);
1405}
1406
1407static PyObject *
1408getargs_y_star(PyObject *self, PyObject *args)
1409{
1410 Py_buffer buffer;
1411 PyObject *bytes;
1412 if (!PyArg_ParseTuple(args, "y*", &buffer))
1413 return NULL;
1414 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1415 PyBuffer_Release(&buffer);
1416 return bytes;
1417}
1418
1419static PyObject *
1420getargs_y_hash(PyObject *self, PyObject *args)
1421{
1422 char *str;
1423 Py_ssize_t size;
1424 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1425 return NULL;
1426 return PyBytes_FromStringAndSize(str, size);
1427}
1428
1429static PyObject *
1430getargs_u(PyObject *self, PyObject *args)
1431{
1432 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001433 if (!PyArg_ParseTuple(args, "u", &str))
1434 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001435 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001436}
1437
1438static PyObject *
1439getargs_u_hash(PyObject *self, PyObject *args)
1440{
1441 Py_UNICODE *str;
1442 Py_ssize_t size;
1443 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1444 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001445 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001446}
1447
1448static PyObject *
1449getargs_Z(PyObject *self, PyObject *args)
1450{
1451 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001452 if (!PyArg_ParseTuple(args, "Z", &str))
1453 return NULL;
1454 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001455 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001456 } else
1457 Py_RETURN_NONE;
1458}
1459
1460static PyObject *
1461getargs_Z_hash(PyObject *self, PyObject *args)
1462{
1463 Py_UNICODE *str;
1464 Py_ssize_t size;
1465 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1466 return NULL;
1467 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001468 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001469 else
1470 Py_RETURN_NONE;
1471}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001472
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001473static PyObject *
1474getargs_es(PyObject *self, PyObject *args)
1475{
1476 PyObject *arg, *result;
1477 const char *encoding = NULL;
1478 char *str;
1479
1480 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1481 return NULL;
1482 if (!PyArg_Parse(arg, "es", encoding, &str))
1483 return NULL;
1484 result = PyBytes_FromString(str);
1485 PyMem_Free(str);
1486 return result;
1487}
1488
1489static PyObject *
1490getargs_et(PyObject *self, PyObject *args)
1491{
1492 PyObject *arg, *result;
1493 const char *encoding = NULL;
1494 char *str;
1495
1496 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1497 return NULL;
1498 if (!PyArg_Parse(arg, "et", encoding, &str))
1499 return NULL;
1500 result = PyBytes_FromString(str);
1501 PyMem_Free(str);
1502 return result;
1503}
1504
1505static PyObject *
1506getargs_es_hash(PyObject *self, PyObject *args)
1507{
1508 PyObject *arg, *result;
1509 const char *encoding = NULL;
1510 PyByteArrayObject *buffer = NULL;
1511 char *str = NULL;
1512 Py_ssize_t size;
1513
1514 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1515 return NULL;
1516 if (buffer != NULL) {
1517 str = PyByteArray_AS_STRING(buffer);
1518 size = PyByteArray_GET_SIZE(buffer);
1519 }
1520 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1521 return NULL;
1522 result = PyBytes_FromStringAndSize(str, size);
1523 if (buffer == NULL)
1524 PyMem_Free(str);
1525 return result;
1526}
1527
1528static PyObject *
1529getargs_et_hash(PyObject *self, PyObject *args)
1530{
1531 PyObject *arg, *result;
1532 const char *encoding = NULL;
1533 PyByteArrayObject *buffer = NULL;
1534 char *str = NULL;
1535 Py_ssize_t size;
1536
1537 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1538 return NULL;
1539 if (buffer != NULL) {
1540 str = PyByteArray_AS_STRING(buffer);
1541 size = PyByteArray_GET_SIZE(buffer);
1542 }
1543 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1544 return NULL;
1545 result = PyBytes_FromStringAndSize(str, size);
1546 if (buffer == NULL)
1547 PyMem_Free(str);
1548 return result;
1549}
1550
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001551/* Test the s and z codes for PyArg_ParseTuple.
1552*/
1553static PyObject *
1554test_s_code(PyObject *self)
1555{
1556 /* Unicode strings should be accepted */
1557 PyObject *tuple, *obj;
1558 char *value;
1559
1560 tuple = PyTuple_New(1);
1561 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001563
1564 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001566 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001568
1569 PyTuple_SET_ITEM(tuple, 0, obj);
1570
1571 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001573 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001574 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1575 return NULL;
1576 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001577
Oren Milmanba7d7362017-08-29 11:58:27 +03001578 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1579 return NULL;
1580 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001581
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001582 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001583 Py_RETURN_NONE;
1584}
1585
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001586static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001587parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001588{
Larry Hastings8f904da2012-06-22 03:56:29 -07001589 PyObject *sub_args;
1590 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001591 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001592 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001593
Larry Hastings8f904da2012-06-22 03:56:29 -07001594 Py_ssize_t i, size;
1595 char *keywords[8 + 1]; /* space for NULL at end */
1596 PyObject *o;
1597 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001598
Larry Hastings8f904da2012-06-22 03:56:29 -07001599 int result;
1600 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001601
Larry Hastings22701e82012-08-08 14:52:22 -07001602 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001603
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001604 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001605 &sub_args, &sub_kwargs,
1606 &sub_format, &sub_keywords))
1607 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001608
Larry Hastings8f904da2012-06-22 03:56:29 -07001609 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1610 PyErr_SetString(PyExc_ValueError,
1611 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1612 return NULL;
1613 }
1614
1615 memset(buffers, 0, sizeof(buffers));
1616 memset(converted, 0, sizeof(converted));
1617 memset(keywords, 0, sizeof(keywords));
1618
1619 size = PySequence_Fast_GET_SIZE(sub_keywords);
1620 if (size > 8) {
1621 PyErr_SetString(PyExc_ValueError,
1622 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1623 goto exit;
1624 }
1625
1626 for (i = 0; i < size; i++) {
1627 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1628 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1629 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001630 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001631 goto exit;
1632 }
1633 keywords[i] = PyBytes_AS_STRING(converted[i]);
1634 }
1635
1636 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1637 sub_format, keywords,
1638 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1639 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1640
1641 if (result) {
1642 return_value = Py_None;
1643 Py_INCREF(Py_None);
1644 }
1645
1646exit:
1647 size = sizeof(converted) / sizeof(converted[0]);
1648 for (i = 0; i < size; i++) {
1649 Py_XDECREF(converted[i]);
1650 }
1651 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001652}
1653
Benjamin Peterson92035012008-12-27 16:00:54 +00001654static volatile int x;
1655
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001656/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1657 of an error.
1658*/
1659static PyObject *
Fred Drakeacee69f2002-04-01 14:28:58 +00001660test_u_code(PyObject *self)
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 PyObject *tuple, *obj;
1663 Py_UNICODE *value;
1664 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1667 /* Just use the macro and check that it compiles */
1668 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 tuple = PyTuple_New(1);
1671 if (tuple == NULL)
1672 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 obj = PyUnicode_Decode("test", strlen("test"),
1675 "ascii", NULL);
1676 if (obj == NULL)
1677 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001682 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001684 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 if (value != PyUnicode_AS_UNICODE(obj))
1686 return raiseTestError("test_u_code",
1687 "u code returned wrong value for u'test'");
1688 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001689 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001691 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 if (value != PyUnicode_AS_UNICODE(obj) ||
1693 len != PyUnicode_GET_SIZE(obj))
1694 return raiseTestError("test_u_code",
1695 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001698 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001699}
1700
Guido van Rossumfb67be22007-08-29 18:38:11 +00001701/* Test Z and Z# codes for PyArg_ParseTuple */
1702static PyObject *
1703test_Z_code(PyObject *self)
1704{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001706 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 tuple = PyTuple_New(2);
1710 if (tuple == NULL)
1711 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 obj = PyUnicode_FromString("test");
1714 PyTuple_SET_ITEM(tuple, 0, obj);
1715 Py_INCREF(Py_None);
1716 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 /* swap values on purpose */
1719 value1 = NULL;
1720 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001723 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001725 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 if (value1 != PyUnicode_AS_UNICODE(obj))
1727 return raiseTestError("test_Z_code",
1728 "Z code returned wrong value for 'test'");
1729 if (value2 != NULL)
1730 return raiseTestError("test_Z_code",
1731 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 value1 = NULL;
1734 value2 = PyUnicode_AS_UNICODE(obj);
1735 len1 = -1;
1736 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001739 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1740 &value2, &len2))
1741 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001743 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1745 len1 != PyUnicode_GET_SIZE(obj))
1746 return raiseTestError("test_Z_code",
1747 "Z# code returned wrong values for 'test'");
1748 if (value2 != NULL ||
1749 len2 != 0)
1750 return raiseTestError("test_Z_code",
1751 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 Py_DECREF(tuple);
1754 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001755}
1756
Thomas Wouters477c8d52006-05-27 19:21:47 +00001757static PyObject *
Mark Dickinson081dfee2009-03-18 14:47:41 +00001758test_widechar(PyObject *self)
1759{
1760#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1762 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001763 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001764#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1766 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1771 if (wide == NULL)
1772 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1775 if (utf8 == NULL) {
1776 Py_DECREF(wide);
1777 return NULL;
1778 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001779
Victor Stinner8ef18872011-11-21 02:06:57 +01001780 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 Py_DECREF(wide);
1782 Py_DECREF(utf8);
1783 return raiseTestError("test_widechar",
1784 "wide string and utf8 string "
1785 "have different length");
1786 }
1787 if (PyUnicode_Compare(wide, utf8)) {
1788 Py_DECREF(wide);
1789 Py_DECREF(utf8);
1790 if (PyErr_Occurred())
1791 return NULL;
1792 return raiseTestError("test_widechar",
1793 "wide string and utf8 string "
1794 "are different");
1795 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 Py_DECREF(wide);
1798 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001799
1800#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1801 wide = PyUnicode_FromWideChar(invalid, 1);
1802 if (wide == NULL)
1803 PyErr_Clear();
1804 else
1805 return raiseTestError("test_widechar",
1806 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1807
1808 wide = PyUnicode_FromUnicode(invalid, 1);
1809 if (wide == NULL)
1810 PyErr_Clear();
1811 else
1812 return raiseTestError("test_widechar",
1813 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001814
1815 wide = PyUnicode_FromUnicode(NULL, 1);
1816 if (wide == NULL)
1817 return NULL;
1818 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001819 if (_PyUnicode_Ready(wide) < 0) {
1820 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001821 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001822 }
1823 else {
1824 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001825 return raiseTestError("test_widechar",
1826 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001827 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001828#endif
1829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001831}
1832
1833static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001834unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001835{
1836 PyObject *unicode, *result;
1837 Py_ssize_t buflen, size;
1838 wchar_t *buffer;
1839
1840 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1841 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001842 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001843 if (buffer == NULL)
1844 return PyErr_NoMemory();
1845
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001846 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001847 if (size == -1) {
1848 PyMem_Free(buffer);
1849 return NULL;
1850 }
1851
1852 if (size < buflen)
1853 buflen = size + 1;
1854 else
1855 buflen = size;
1856 result = PyUnicode_FromWideChar(buffer, buflen);
1857 PyMem_Free(buffer);
1858 if (result == NULL)
1859 return NULL;
1860
1861 return Py_BuildValue("(Nn)", result, size);
1862}
1863
1864static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001865unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001866{
1867 PyObject *unicode, *result;
1868 Py_ssize_t size;
1869 wchar_t *buffer;
1870
1871 if (!PyArg_ParseTuple(args, "U", &unicode))
1872 return NULL;
1873
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001874 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001875 if (buffer == NULL)
1876 return NULL;
1877
1878 result = PyUnicode_FromWideChar(buffer, size + 1);
1879 PyMem_Free(buffer);
1880 if (result == NULL)
1881 return NULL;
1882 return Py_BuildValue("(Nn)", result, size);
1883}
1884
1885static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001886unicode_asucs4(PyObject *self, PyObject *args)
1887{
1888 PyObject *unicode, *result;
1889 Py_UCS4 *buffer;
1890 int copy_null;
1891 Py_ssize_t str_len, buf_len;
1892
1893 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1894 return NULL;
1895 }
1896
1897 buf_len = str_len + 1;
1898 buffer = PyMem_NEW(Py_UCS4, buf_len);
1899 if (buffer == NULL) {
1900 return PyErr_NoMemory();
1901 }
1902 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1903 buffer[str_len] = 0xffffU;
1904
1905 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1906 PyMem_FREE(buffer);
1907 return NULL;
1908 }
1909
1910 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1911 PyMem_FREE(buffer);
1912 return result;
1913}
1914
1915static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001916unicode_findchar(PyObject *self, PyObject *args)
1917{
1918 PyObject *str;
1919 int direction;
1920 unsigned int ch;
1921 Py_ssize_t result;
1922 Py_ssize_t start, end;
1923
1924 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1925 &start, &end, &direction)) {
1926 return NULL;
1927 }
1928
1929 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
1930 if (result == -2)
1931 return NULL;
1932 else
1933 return PyLong_FromSsize_t(result);
1934}
1935
1936static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001937unicode_copycharacters(PyObject *self, PyObject *args)
1938{
1939 PyObject *from, *to, *to_copy;
1940 Py_ssize_t from_start, to_start, how_many, copied;
1941
1942 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1943 &from, &from_start, &how_many)) {
1944 return NULL;
1945 }
1946
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001947 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1948 PyUnicode_MAX_CHAR_VALUE(to)))) {
1949 return NULL;
1950 }
1951 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
1952 Py_DECREF(to_copy);
1953 return NULL;
1954 }
1955
1956 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
1957 from_start, how_many)) < 0) {
1958 Py_DECREF(to_copy);
1959 return NULL;
1960 }
1961
1962 return Py_BuildValue("(Nn)", to_copy, copied);
1963}
1964
1965static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001966unicode_encodedecimal(PyObject *self, PyObject *args)
1967{
1968 Py_UNICODE *unicode;
1969 Py_ssize_t length;
1970 char *errors = NULL;
1971 PyObject *decimal;
1972 Py_ssize_t decimal_length, new_length;
1973 int res;
1974
1975 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1976 return NULL;
1977
1978 decimal_length = length * 7; /* len('&#8364;') */
1979 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1980 if (decimal == NULL)
1981 return NULL;
1982
1983 res = PyUnicode_EncodeDecimal(unicode, length,
1984 PyBytes_AS_STRING(decimal),
1985 errors);
1986 if (res < 0) {
1987 Py_DECREF(decimal);
1988 return NULL;
1989 }
1990
1991 new_length = strlen(PyBytes_AS_STRING(decimal));
1992 assert(new_length <= decimal_length);
1993 res = _PyBytes_Resize(&decimal, new_length);
1994 if (res < 0)
1995 return NULL;
1996
1997 return decimal;
1998}
1999
2000static PyObject *
2001unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
2002{
2003 Py_UNICODE *unicode;
2004 Py_ssize_t length;
2005 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
2006 return NULL;
2007 return PyUnicode_TransformDecimalToASCII(unicode, length);
2008}
2009
2010static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002011unicode_legacy_string(PyObject *self, PyObject *args)
2012{
2013 Py_UNICODE *data;
2014 Py_ssize_t len;
2015 PyObject *u;
2016
2017 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2018 return NULL;
2019
2020 u = PyUnicode_FromUnicode(NULL, len);
2021 if (u == NULL)
2022 return NULL;
2023
2024 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2025
2026 if (len > 0) { /* The empty string is always ready. */
2027 assert(!PyUnicode_IS_READY(u));
2028 }
2029
2030 return u;
2031}
2032
2033static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002034getargs_w_star(PyObject *self, PyObject *args)
2035{
2036 Py_buffer buffer;
2037 PyObject *result;
2038 char *str;
2039
2040 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2041 return NULL;
2042
2043 if (2 <= buffer.len) {
2044 str = buffer.buf;
2045 str[0] = '[';
2046 str[buffer.len-1] = ']';
2047 }
2048
2049 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2050 PyBuffer_Release(&buffer);
2051 return result;
2052}
2053
2054
2055static PyObject *
Benjamin Peterson92035012008-12-27 16:00:54 +00002056test_empty_argparse(PyObject *self)
2057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 /* Test that formats can begin with '|'. See issue #4720. */
2059 PyObject *tuple, *dict = NULL;
2060 static char *kwlist[] = {NULL};
2061 int result;
2062 tuple = PyTuple_New(0);
2063 if (!tuple)
2064 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002065 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002067 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 dict = PyDict_New();
2069 if (!dict)
2070 goto done;
2071 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002072 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 Py_DECREF(tuple);
2074 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002075 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002077 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 else {
2079 Py_RETURN_NONE;
2080 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002081}
2082
2083static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002084codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002085{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 const char *encoding, *errors = NULL;
2087 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2088 &encoding, &errors))
2089 return NULL;
2090 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002091}
2092
Thomas Wouters477c8d52006-05-27 19:21:47 +00002093static PyObject *
2094codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002095{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 const char *encoding, *errors = NULL;
2097 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2098 &encoding, &errors))
2099 return NULL;
2100 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002101}
2102
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002103
Tim Peters5b8132f2003-01-31 15:52:05 +00002104/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002105static PyObject *
2106test_long_numbits(PyObject *self)
2107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 struct triple {
2109 long input;
2110 size_t nbits;
2111 int sign;
2112 } testcases[] = {{0, 0, 0},
2113 {1L, 1, 1},
2114 {-1L, 1, -1},
2115 {2L, 2, 1},
2116 {-2L, 2, -1},
2117 {3L, 2, 1},
2118 {-3L, 2, -1},
2119 {4L, 3, 1},
2120 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002121 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 {-0x7fffL, 15, -1},
2123 {0xffffL, 16, 1},
2124 {-0xffffL, 16, -1},
2125 {0xfffffffL, 28, 1},
2126 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002127 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002128
Victor Stinner63941882011-09-29 00:42:28 +02002129 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002130 size_t nbits;
2131 int sign;
2132 PyObject *plong;
2133
2134 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002135 if (plong == NULL)
2136 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002137 nbits = _PyLong_NumBits(plong);
2138 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 Py_DECREF(plong);
2141 if (nbits != testcases[i].nbits)
2142 return raiseTestError("test_long_numbits",
2143 "wrong result for _PyLong_NumBits");
2144 if (sign != testcases[i].sign)
2145 return raiseTestError("test_long_numbits",
2146 "wrong result for _PyLong_Sign");
2147 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002148 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002149}
2150
Thomas Heller519a0422007-11-15 20:48:54 +00002151/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002152
2153static PyObject *
2154test_null_strings(PyObject *self)
2155{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2157 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2158 Py_XDECREF(o1);
2159 Py_XDECREF(o2);
2160 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002161}
2162
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002163static PyObject *
2164raise_exception(PyObject *self, PyObject *args)
2165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 PyObject *exc;
2167 PyObject *exc_args, *v;
2168 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2171 &exc, &num_args))
2172 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 exc_args = PyTuple_New(num_args);
2175 if (exc_args == NULL)
2176 return NULL;
2177 for (i = 0; i < num_args; ++i) {
2178 v = PyLong_FromLong(i);
2179 if (v == NULL) {
2180 Py_DECREF(exc_args);
2181 return NULL;
2182 }
2183 PyTuple_SET_ITEM(exc_args, i, v);
2184 }
2185 PyErr_SetObject(exc, exc_args);
2186 Py_DECREF(exc_args);
2187 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002188}
Tim Peters91621db2001-06-12 20:10:01 +00002189
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002190static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002191set_errno(PyObject *self, PyObject *args)
2192{
2193 int new_errno;
2194
2195 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2196 return NULL;
2197
2198 errno = new_errno;
2199 Py_RETURN_NONE;
2200}
2201
2202static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002203test_set_exc_info(PyObject *self, PyObject *args)
2204{
2205 PyObject *orig_exc;
2206 PyObject *new_type, *new_value, *new_tb;
2207 PyObject *type, *value, *tb;
2208 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2209 &new_type, &new_value, &new_tb))
2210 return NULL;
2211
2212 PyErr_GetExcInfo(&type, &value, &tb);
2213
2214 Py_INCREF(new_type);
2215 Py_INCREF(new_value);
2216 Py_INCREF(new_tb);
2217 PyErr_SetExcInfo(new_type, new_value, new_tb);
2218
2219 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2220 Py_XDECREF(type);
2221 Py_XDECREF(value);
2222 Py_XDECREF(tb);
2223 return orig_exc;
2224}
Benjamin Peterson16323982010-02-03 01:13:41 +00002225
2226static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002227
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002228static PyObject *
2229test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 if (PyDateTimeAPI) {
2231 if (test_run_counter) {
2232 /* Probably regrtest.py -R */
2233 Py_RETURN_NONE;
2234 }
2235 else {
2236 PyErr_SetString(PyExc_AssertionError,
2237 "PyDateTime_CAPI somehow initialized");
2238 return NULL;
2239 }
2240 }
2241 test_run_counter++;
2242 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 if (PyDateTimeAPI)
2245 Py_RETURN_NONE;
2246 else
2247 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002248}
2249
Paul Ganssle04af5b12018-01-24 17:29:30 -05002250/* Functions exposing the C API type checking for testing */
2251#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2252 PyObject *obj; \
2253 int exact = 0; \
2254 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2255 return NULL; \
2256 } \
2257 int rv = exact?exact_method(obj):check_method(obj); \
2258 if (rv) { \
2259 Py_RETURN_TRUE; \
2260 } else { \
2261 Py_RETURN_FALSE; \
2262 }
2263
2264static PyObject *
2265datetime_check_date(PyObject *self, PyObject *args) {
2266 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2267}
2268
2269static PyObject *
2270datetime_check_time(PyObject *self, PyObject *args) {
2271 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2272}
2273
2274static PyObject *
2275datetime_check_datetime(PyObject *self, PyObject *args) {
2276 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2277}
2278
2279static PyObject *
2280datetime_check_delta(PyObject *self, PyObject *args) {
2281 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2282}
2283
2284static PyObject *
2285datetime_check_tzinfo(PyObject *self, PyObject *args) {
2286 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2287}
2288
2289
2290/* Makes three variations on timezone representing UTC-5:
2291 1. timezone with offset and name from PyDateTimeAPI
2292 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2293 3. timezone with offset (no name) from PyTimeZone_FromOffset
2294*/
2295static PyObject *
2296make_timezones_capi(PyObject *self, PyObject *args) {
2297 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2298 PyObject *name = PyUnicode_FromString("EST");
2299
2300 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2301 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2302 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2303
2304 Py_DecRef(offset);
2305 Py_DecRef(name);
2306
2307 PyObject *rv = PyTuple_New(3);
2308
2309 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2310 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2311 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2312
2313 return rv;
2314}
2315
2316static PyObject *
Miss Islington (bot)24d6e3c2018-02-22 13:18:54 -08002317get_timezones_offset_zero(PyObject *self, PyObject *args) {
2318 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2319 PyObject *name = PyUnicode_FromString("");
2320
2321 // These two should return the UTC singleton
2322 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2323 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2324
2325 // This one will return +00:00 zone, but not the UTC singleton
2326 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2327
2328 Py_DecRef(offset);
2329 Py_DecRef(name);
2330
2331 PyObject *rv = PyTuple_New(3);
2332 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2333 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2334 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2335
2336 return rv;
2337}
2338
2339static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002340get_timezone_utc_capi(PyObject* self, PyObject *args) {
2341 int macro = 0;
2342 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2343 return NULL;
2344 }
2345 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002346 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002347 return PyDateTime_TimeZone_UTC;
2348 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002349 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002350 return PyDateTimeAPI->TimeZone_UTC;
2351 }
2352}
2353
Benjamin Peterson16323982010-02-03 01:13:41 +00002354
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002355/* test_thread_state spawns a thread of its own, and that thread releases
2356 * `thread_done` when it's finished. The driver code has to know when the
2357 * thread finishes, because the thread uses a PyObject (the callable) that
2358 * may go away when the driver finishes. The former lack of this explicit
2359 * synchronization caused rare segfaults, so rare that they were seen only
2360 * on a Mac buildbot (although they were possible on any box).
2361 */
2362static PyThread_type_lock thread_done = NULL;
2363
Benjamin Petersona786b022008-08-25 21:05:21 +00002364static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002365_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 PyObject *rc;
2368 int success;
2369 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002370 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 success = (rc != NULL);
2372 Py_XDECREF(rc);
2373 PyGILState_Release(s);
2374 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002375}
2376
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002377/* Same thing, but releases `thread_done` when it returns. This variant
2378 * should be called only from threads spawned by test_thread_state().
2379 */
2380static void
2381_make_call_from_thread(void *callable)
2382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 _make_call(callable);
2384 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002385}
2386
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002387static PyObject *
2388test_thread_state(PyObject *self, PyObject *args)
2389{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 PyObject *fn;
2391 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2394 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 if (!PyCallable_Check(fn)) {
2397 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2398 fn->ob_type->tp_name);
2399 return NULL;
2400 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 /* Ensure Python is set up for threading */
2403 PyEval_InitThreads();
2404 thread_done = PyThread_allocate_lock();
2405 if (thread_done == NULL)
2406 return PyErr_NoMemory();
2407 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 /* Start a new thread with our callback. */
2410 PyThread_start_new_thread(_make_call_from_thread, fn);
2411 /* Make the callback with the thread lock held by this thread */
2412 success &= _make_call(fn);
2413 /* Do it all again, but this time with the thread-lock released */
2414 Py_BEGIN_ALLOW_THREADS
2415 success &= _make_call(fn);
2416 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2417 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 /* And once more with and without a thread
2420 XXX - should use a lock and work out exactly what we are trying
2421 to test <wink>
2422 */
2423 Py_BEGIN_ALLOW_THREADS
2424 PyThread_start_new_thread(_make_call_from_thread, fn);
2425 success &= _make_call(fn);
2426 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2427 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 /* Release lock we acquired above. This is required on HP-UX. */
2430 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 PyThread_free_lock(thread_done);
2433 if (!success)
2434 return NULL;
2435 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002436}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002437
2438/* test Py_AddPendingCalls using threads */
2439static int _pending_callback(void *arg)
2440{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 /* we assume the argument is callable object to which we own a reference */
2442 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002443 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 Py_DECREF(callable);
2445 Py_XDECREF(r);
2446 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002447}
2448
2449/* The following requests n callbacks to _pending_callback. It can be
2450 * run from any python thread.
2451 */
Miss Islington (bot)123f2b42018-07-03 22:50:34 -07002452static PyObject *
2453pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 PyObject *callable;
2456 int r;
2457 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2458 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 /* create the reference for the callbackwhile we hold the lock */
2461 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 Py_BEGIN_ALLOW_THREADS
2464 r = Py_AddPendingCall(&_pending_callback, callable);
2465 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 if (r<0) {
2468 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002469 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002471 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002472}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002473
Neal Norwitzb0d26332007-08-25 00:49:05 +00002474/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002475static PyObject *
Serhiy Storchakaad8ac542018-11-27 20:27:47 +02002476test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 PyObject *result;
2479 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002480
Alexander Belopolskye239d232010-12-08 23:31:48 +00002481#define CHECK_1_FORMAT(FORMAT, TYPE) \
2482 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2483 if (result == NULL) \
2484 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002485 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002486 msg = FORMAT " failed at 1"; \
2487 goto Fail; \
2488 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 CHECK_1_FORMAT("%d", int);
2492 CHECK_1_FORMAT("%ld", long);
2493 /* The z width modifier was added in Python 2.5. */
2494 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 /* The u type code was added in Python 2.5. */
2497 CHECK_1_FORMAT("%u", unsigned int);
2498 CHECK_1_FORMAT("%lu", unsigned long);
2499 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002502 CHECK_1_FORMAT("%llu", unsigned long long);
2503 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002506
2507 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 Py_XDECREF(result);
2509 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002510
2511#undef CHECK_1_FORMAT
2512}
2513
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002514
2515static PyObject *
2516test_unicode_compare_with_ascii(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2518 int result;
2519 if (py_s == NULL)
2520 return NULL;
2521 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2522 Py_DECREF(py_s);
2523 if (!result) {
2524 PyErr_SetString(TestError, "Python string ending in NULL "
2525 "should not compare equal to c string.");
2526 return NULL;
2527 }
2528 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002529}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002530
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002531/* This is here to provide a docstring for test_descr. */
2532static PyObject *
2533test_with_docstring(PyObject *self)
2534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002536}
2537
Mark Dickinson725bfd82009-05-03 20:33:40 +00002538/* Test PyOS_string_to_double. */
2539static PyObject *
2540test_string_to_double(PyObject *self) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002542 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544#define CHECK_STRING(STR, expected) \
2545 result = PyOS_string_to_double(STR, NULL, NULL); \
2546 if (result == -1.0 && PyErr_Occurred()) \
2547 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002548 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 msg = "conversion of " STR " to float failed"; \
2550 goto fail; \
2551 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553#define CHECK_INVALID(STR) \
2554 result = PyOS_string_to_double(STR, NULL, NULL); \
2555 if (result == -1.0 && PyErr_Occurred()) { \
2556 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2557 PyErr_Clear(); \
2558 else \
2559 return NULL; \
2560 } \
2561 else { \
2562 msg = "conversion of " STR " didn't raise ValueError"; \
2563 goto fail; \
2564 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 CHECK_STRING("0.1", 0.1);
2567 CHECK_STRING("1.234", 1.234);
2568 CHECK_STRING("-1.35", -1.35);
2569 CHECK_STRING(".1e01", 1.0);
2570 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 CHECK_INVALID(" 0.1");
2573 CHECK_INVALID("\t\n-3");
2574 CHECK_INVALID(".123 ");
2575 CHECK_INVALID("3\n");
2576 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002579 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002580 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002581#undef CHECK_STRING
2582#undef CHECK_INVALID
2583}
2584
2585
Benjamin Petersonb173f782009-05-05 22:31:58 +00002586/* Coverage testing of capsule objects. */
2587
2588static const char *capsule_name = "capsule name";
2589static char *capsule_pointer = "capsule pointer";
2590static char *capsule_context = "capsule context";
2591static const char *capsule_error = NULL;
2592static int
2593capsule_destructor_call_count = 0;
2594
2595static void
2596capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002597 capsule_destructor_call_count++;
2598 if (PyCapsule_GetContext(o) != capsule_context) {
2599 capsule_error = "context did not match in destructor!";
2600 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2601 capsule_error = "destructor did not match in destructor! (woah!)";
2602 } else if (PyCapsule_GetName(o) != capsule_name) {
2603 capsule_error = "name did not match in destructor!";
2604 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2605 capsule_error = "pointer did not match in destructor!";
2606 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002607}
2608
2609typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 char *name;
2611 char *module;
2612 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002613} known_capsule;
2614
2615static PyObject *
Serhiy Storchakaad8ac542018-11-27 20:27:47 +02002616test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00002617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 PyObject *object;
2619 const char *error = NULL;
2620 void *pointer;
2621 void *pointer2;
2622 known_capsule known_capsules[] = {
2623 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2624 KNOWN_CAPSULE("_socket", "CAPI"),
2625 KNOWN_CAPSULE("_curses", "_C_API"),
2626 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2627 { NULL, NULL },
2628 };
2629 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002630
2631#define FAIL(x) { error = (x); goto exit; }
2632
2633#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 if (capsule_error) { \
2635 FAIL(capsule_error); \
2636 } \
2637 else if (!capsule_destructor_call_count) { \
2638 FAIL("destructor not called!"); \
2639 } \
2640 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2643 PyCapsule_SetContext(object, capsule_context);
2644 capsule_destructor(object);
2645 CHECK_DESTRUCTOR;
2646 Py_DECREF(object);
2647 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 object = PyCapsule_New(known, "ignored", NULL);
2650 PyCapsule_SetPointer(object, capsule_pointer);
2651 PyCapsule_SetName(object, capsule_name);
2652 PyCapsule_SetDestructor(object, capsule_destructor);
2653 PyCapsule_SetContext(object, capsule_context);
2654 capsule_destructor(object);
2655 CHECK_DESTRUCTOR;
2656 /* intentionally access using the wrong name */
2657 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2658 if (!PyErr_Occurred()) {
2659 FAIL("PyCapsule_GetPointer should have failed but did not!");
2660 }
2661 PyErr_Clear();
2662 if (pointer2) {
2663 if (pointer2 == capsule_pointer) {
2664 FAIL("PyCapsule_GetPointer should not have"
2665 " returned the internal pointer!");
2666 } else {
2667 FAIL("PyCapsule_GetPointer should have "
2668 "returned NULL pointer but did not!");
2669 }
2670 }
2671 PyCapsule_SetDestructor(object, NULL);
2672 Py_DECREF(object);
2673 if (capsule_destructor_call_count) {
2674 FAIL("destructor called when it should not have been!");
2675 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 for (known = &known_capsules[0]; known->module != NULL; known++) {
2678 /* yeah, ordinarily I wouldn't do this either,
2679 but it's fine for this test harness.
2680 */
2681 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002682#undef FAIL
2683#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 { \
2685 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2686 x, known->module, known->attribute); \
2687 error = buffer; \
2688 goto exit; \
2689 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002691 PyObject *module = PyImport_ImportModule(known->module);
2692 if (module) {
2693 pointer = PyCapsule_Import(known->name, 0);
2694 if (!pointer) {
2695 Py_DECREF(module);
2696 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2697 }
2698 object = PyObject_GetAttrString(module, known->attribute);
2699 if (!object) {
2700 Py_DECREF(module);
2701 return NULL;
2702 }
2703 pointer2 = PyCapsule_GetPointer(object,
2704 "weebles wobble but they don't fall down");
2705 if (!PyErr_Occurred()) {
2706 Py_DECREF(object);
2707 Py_DECREF(module);
2708 FAIL("PyCapsule_GetPointer should have failed but did not!");
2709 }
2710 PyErr_Clear();
2711 if (pointer2) {
2712 Py_DECREF(module);
2713 Py_DECREF(object);
2714 if (pointer2 == pointer) {
2715 FAIL("PyCapsule_GetPointer should not have"
2716 " returned its internal pointer!");
2717 } else {
2718 FAIL("PyCapsule_GetPointer should have"
2719 " returned NULL pointer but did not!");
2720 }
2721 }
2722 Py_DECREF(object);
2723 Py_DECREF(module);
2724 }
2725 else
2726 PyErr_Clear();
2727 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002728
2729 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 if (error) {
2731 return raiseTestError("test_capsule", error);
2732 }
2733 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002734#undef FAIL
2735}
2736
Guido van Rossumddefaf32007-01-14 03:31:43 +00002737#ifdef HAVE_GETTIMEOFDAY
2738/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002739static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002740{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 e->tv_sec -= s->tv_sec;
2742 e->tv_usec -= s->tv_usec;
2743 if (e->tv_usec < 0) {
2744 e->tv_sec -=1;
2745 e->tv_usec += 1000000;
2746 }
2747 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002748}
2749
2750static PyObject *
2751profile_int(PyObject *self, PyObject* args)
2752{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 int i, k;
2754 struct timeval start, stop;
2755 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002757 /* Test 1: Allocate and immediately deallocate
2758 many small integers */
2759 gettimeofday(&start, NULL);
2760 for(k=0; k < 20000; k++)
2761 for(i=0; i < 1000; i++) {
2762 single = PyLong_FromLong(i);
2763 Py_DECREF(single);
2764 }
2765 gettimeofday(&stop, NULL);
2766 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 /* Test 2: Allocate and immediately deallocate
2769 many large integers */
2770 gettimeofday(&start, NULL);
2771 for(k=0; k < 20000; k++)
2772 for(i=0; i < 1000; i++) {
2773 single = PyLong_FromLong(i+1000000);
2774 Py_DECREF(single);
2775 }
2776 gettimeofday(&stop, NULL);
2777 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 /* Test 3: Allocate a few integers, then release
2780 them all simultaneously. */
2781 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002782 if (multiple == NULL)
2783 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 gettimeofday(&start, NULL);
2785 for(k=0; k < 20000; k++) {
2786 for(i=0; i < 1000; i++) {
2787 multiple[i] = PyLong_FromLong(i+1000000);
2788 }
2789 for(i=0; i < 1000; i++) {
2790 Py_DECREF(multiple[i]);
2791 }
2792 }
2793 gettimeofday(&stop, NULL);
2794 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002795 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002797 /* Test 4: Allocate many integers, then release
2798 them all simultaneously. */
2799 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002800 if (multiple == NULL)
2801 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002802 gettimeofday(&start, NULL);
2803 for(k=0; k < 20; k++) {
2804 for(i=0; i < 1000000; i++) {
2805 multiple[i] = PyLong_FromLong(i+1000000);
2806 }
2807 for(i=0; i < 1000000; i++) {
2808 Py_DECREF(multiple[i]);
2809 }
2810 }
2811 gettimeofday(&stop, NULL);
2812 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002813 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002815 /* Test 5: Allocate many integers < 32000 */
2816 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002817 if (multiple == NULL)
2818 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 gettimeofday(&start, NULL);
2820 for(k=0; k < 10; k++) {
2821 for(i=0; i < 1000000; i++) {
2822 multiple[i] = PyLong_FromLong(i+1000);
2823 }
2824 for(i=0; i < 1000000; i++) {
2825 Py_DECREF(multiple[i]);
2826 }
2827 }
2828 gettimeofday(&stop, NULL);
2829 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002830 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 /* Test 6: Perform small int addition */
2833 op1 = PyLong_FromLong(1);
2834 gettimeofday(&start, NULL);
2835 for(i=0; i < 10000000; i++) {
2836 result = PyNumber_Add(op1, op1);
2837 Py_DECREF(result);
2838 }
2839 gettimeofday(&stop, NULL);
2840 Py_DECREF(op1);
2841 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002843 /* Test 7: Perform medium int addition */
2844 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002845 if (op1 == NULL)
2846 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 gettimeofday(&start, NULL);
2848 for(i=0; i < 10000000; i++) {
2849 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002850 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 }
2852 gettimeofday(&stop, NULL);
2853 Py_DECREF(op1);
2854 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002855
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002856 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002857}
2858#endif
2859
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002860/* To test the format of tracebacks as printed out. */
2861static PyObject *
2862traceback_print(PyObject *self, PyObject *args)
2863{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 PyObject *file;
2865 PyObject *traceback;
2866 int result;
2867
2868 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2869 &traceback, &file))
2870 return NULL;
2871
2872 result = PyTraceBack_Print(traceback, file);
2873 if (result < 0)
2874 return NULL;
2875 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002876}
2877
Benjamin Petersone6528212008-07-15 15:32:09 +00002878/* To test the format of exceptions as printed out. */
2879static PyObject *
2880exception_print(PyObject *self, PyObject *args)
2881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 PyObject *value;
2883 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 if (!PyArg_ParseTuple(args, "O:exception_print",
2886 &value))
2887 return NULL;
2888 if (!PyExceptionInstance_Check(value)) {
2889 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2890 return NULL;
2891 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 tb = PyException_GetTraceback(value);
2894 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2895 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002898}
2899
2900
2901
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002902
2903/* reliably raise a MemoryError */
2904static PyObject *
2905raise_memoryerror(PyObject *self)
2906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 PyErr_NoMemory();
2908 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002909}
2910
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002911/* Issue 6012 */
2912static PyObject *str1, *str2;
2913static int
2914failing_converter(PyObject *obj, void *arg)
2915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002916 /* Clone str1, then let the conversion fail. */
2917 assert(str1);
2918 str2 = str1;
2919 Py_INCREF(str2);
2920 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002921}
2922static PyObject*
2923argparsing(PyObject *o, PyObject *args)
2924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002925 PyObject *res;
2926 str1 = str2 = NULL;
2927 if (!PyArg_ParseTuple(args, "O&O&",
2928 PyUnicode_FSConverter, &str1,
2929 failing_converter, &str2)) {
2930 if (!str2)
2931 /* argument converter not called? */
2932 return NULL;
2933 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002934 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002935 Py_DECREF(str2);
2936 PyErr_Clear();
2937 return res;
2938 }
2939 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002940}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002941
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002942/* To test that the result of PyCode_NewEmpty has the right members. */
2943static PyObject *
2944code_newempty(PyObject *self, PyObject *args)
2945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 const char *filename;
2947 const char *funcname;
2948 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2951 &filename, &funcname, &firstlineno))
2952 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002955}
2956
Georg Brandl1e28a272009-12-28 08:41:01 +00002957/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2958 Run via Lib/test/test_exceptions.py */
2959static PyObject *
2960make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2961{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002962 const char *name;
2963 const char *doc = NULL;
2964 PyObject *base = NULL;
2965 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2970 "s|sOO:make_exception_with_doc", kwlist,
2971 &name, &doc, &base, &dict))
2972 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002974 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002975}
2976
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002977static PyObject *
2978make_memoryview_from_NULL_pointer(PyObject *self)
2979{
2980 Py_buffer info;
2981 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2982 return NULL;
2983 return PyMemoryView_FromBuffer(&info);
2984}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002985
Stefan Krah7213fcc2015-02-01 16:19:23 +01002986static PyObject *
Serhiy Storchakaad8ac542018-11-27 20:27:47 +02002987test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01002988{
2989 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2990 int init[5] = {0, 1, 2, 3, 4};
2991 Py_ssize_t itemsize = sizeof(int);
2992 Py_ssize_t shape = 5;
2993 Py_ssize_t strides = 2 * itemsize;
2994 Py_buffer view = {
2995 data,
2996 NULL,
2997 5 * itemsize,
2998 itemsize,
2999 1,
3000 1,
3001 NULL,
3002 &shape,
3003 &strides,
3004 NULL,
3005 NULL
3006 };
3007 int *ptr;
3008 int i;
3009
3010 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3011 ptr = view.buf;
3012 for (i = 0; i < 5; i++) {
3013 if (ptr[2*i] != i) {
3014 PyErr_SetString(TestError,
3015 "test_from_contiguous: incorrect result");
3016 return NULL;
3017 }
3018 }
3019
3020 view.buf = &data[8];
3021 view.strides[0] = -2 * itemsize;
3022
3023 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3024 ptr = view.buf;
3025 for (i = 0; i < 5; i++) {
3026 if (*(ptr-2*i) != i) {
3027 PyErr_SetString(TestError,
3028 "test_from_contiguous: incorrect result");
3029 return NULL;
3030 }
3031 }
3032
3033 Py_RETURN_NONE;
3034}
Stefan Krah650c1e82015-02-03 21:43:23 +01003035
Stefan Kraha7559c02015-02-03 22:27:21 +01003036#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003037extern PyTypeObject _PyBytesIOBuffer_Type;
3038
Stefan Krah5178d912015-02-03 16:57:21 +01003039static PyObject *
Serhiy Storchakaad8ac542018-11-27 20:27:47 +02003040test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003041{
Stefan Krah650c1e82015-02-03 21:43:23 +01003042 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003043 PyObject *b;
3044 char *dummy[1];
3045 int ret, match;
3046
Stefan Krah650c1e82015-02-03 21:43:23 +01003047 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003048 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3049 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3050 PyErr_Clear();
3051 if (ret != -1 || match == 0)
3052 goto error;
3053
Stefan Krah650c1e82015-02-03 21:43:23 +01003054 /* bytesiobuf_getbuffer() */
3055 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003056 if (b == NULL) {
3057 return NULL;
3058 }
3059
3060 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3061 Py_DECREF(b);
3062 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3063 PyErr_Clear();
3064 if (ret != -1 || match == 0)
3065 goto error;
3066
3067 Py_RETURN_NONE;
3068
3069error:
3070 PyErr_SetString(TestError,
3071 "test_pep3118_obsolete_write_locks: failure");
3072 return NULL;
3073}
Stefan Kraha7559c02015-02-03 22:27:21 +01003074#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003075
Stefan Krah650c1e82015-02-03 21:43:23 +01003076/* This tests functions that historically supported write locks. It is
3077 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3078 is entitled to segfault in that case. */
3079static PyObject *
3080getbuffer_with_null_view(PyObject* self, PyObject *obj)
3081{
3082 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3083 return NULL;
3084
3085 Py_RETURN_NONE;
3086}
3087
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003088/* Test that the fatal error from not having a current thread doesn't
3089 cause an infinite loop. Run via Lib/test/test_capi.py */
3090static PyObject *
3091crash_no_current_thread(PyObject *self)
3092{
3093 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003094 /* Using PyThreadState_Get() directly allows the test to pass in
3095 !pydebug mode. However, the test only actually tests anything
3096 in pydebug mode, since that's where the infinite loop was in
3097 the first place. */
3098 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003099 Py_END_ALLOW_THREADS
3100 return NULL;
3101}
3102
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003103/* To run some code in a sub-interpreter. */
3104static PyObject *
3105run_in_subinterp(PyObject *self, PyObject *args)
3106{
3107 const char *code;
3108 int r;
3109 PyThreadState *substate, *mainstate;
3110
3111 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3112 &code))
3113 return NULL;
3114
3115 mainstate = PyThreadState_Get();
3116
3117 PyThreadState_Swap(NULL);
3118
3119 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003120 if (substate == NULL) {
3121 /* Since no new thread state was created, there is no exception to
3122 propagate; raise a fresh one after swapping in the old thread
3123 state. */
3124 PyThreadState_Swap(mainstate);
3125 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3126 return NULL;
3127 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003128 r = PyRun_SimpleString(code);
3129 Py_EndInterpreter(substate);
3130
3131 PyThreadState_Swap(mainstate);
3132
3133 return PyLong_FromLong(r);
3134}
3135
Victor Stinner3c1b3792014-02-17 00:02:43 +01003136static int
3137check_time_rounding(int round)
3138{
Victor Stinner74474232015-09-02 01:43:56 +02003139 if (round != _PyTime_ROUND_FLOOR
3140 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003141 && round != _PyTime_ROUND_HALF_EVEN
3142 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003143 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3144 return -1;
3145 }
3146 return 0;
3147}
3148
Victor Stinner5d272cc2012-03-13 13:35:55 +01003149static PyObject *
3150test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3151{
3152 PyObject *obj;
3153 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003154 int round;
3155 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003156 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003157 if (check_time_rounding(round) < 0)
3158 return NULL;
3159 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003160 return NULL;
3161 return _PyLong_FromTime_t(sec);
3162}
3163
3164static PyObject *
3165test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3166{
3167 PyObject *obj;
3168 time_t sec;
3169 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003170 int round;
3171 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003172 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003173 if (check_time_rounding(round) < 0)
3174 return NULL;
3175 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003176 return NULL;
3177 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3178}
3179
Victor Stinner643cd682012-03-02 22:54:03 +01003180static PyObject *
3181test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3182{
3183 PyObject *obj;
3184 time_t sec;
3185 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003186 int round;
3187 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003188 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003189 if (check_time_rounding(round) < 0)
3190 return NULL;
3191 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003192 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003193 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003194}
3195
Antoine Pitrou796564c2013-07-30 19:59:21 +02003196static void
3197slot_tp_del(PyObject *self)
3198{
3199 _Py_IDENTIFIER(__tp_del__);
3200 PyObject *del, *res;
3201 PyObject *error_type, *error_value, *error_traceback;
3202
3203 /* Temporarily resurrect the object. */
3204 assert(self->ob_refcnt == 0);
3205 self->ob_refcnt = 1;
3206
3207 /* Save the current exception, if any. */
3208 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3209
3210 /* Execute __del__ method, if any. */
3211 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3212 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003213 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003214 if (res == NULL)
3215 PyErr_WriteUnraisable(del);
3216 else
3217 Py_DECREF(res);
3218 Py_DECREF(del);
3219 }
3220
3221 /* Restore the saved exception. */
3222 PyErr_Restore(error_type, error_value, error_traceback);
3223
3224 /* Undo the temporary resurrection; can't use DECREF here, it would
3225 * cause a recursive call.
3226 */
3227 assert(self->ob_refcnt > 0);
3228 if (--self->ob_refcnt == 0)
3229 return; /* this is the normal path out */
3230
3231 /* __del__ resurrected it! Make it look like the original Py_DECREF
3232 * never happened.
3233 */
3234 {
3235 Py_ssize_t refcnt = self->ob_refcnt;
3236 _Py_NewReference(self);
3237 self->ob_refcnt = refcnt;
3238 }
3239 assert(!PyType_IS_GC(Py_TYPE(self)) ||
3240 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
3241 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3242 * we need to undo that. */
3243 _Py_DEC_REFTOTAL;
3244 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3245 * chain, so no more to do there.
3246 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3247 * _Py_NewReference bumped tp_allocs: both of those need to be
3248 * undone.
3249 */
3250#ifdef COUNT_ALLOCS
3251 --Py_TYPE(self)->tp_frees;
3252 --Py_TYPE(self)->tp_allocs;
3253#endif
3254}
3255
3256static PyObject *
3257with_tp_del(PyObject *self, PyObject *args)
3258{
3259 PyObject *obj;
3260 PyTypeObject *tp;
3261
3262 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3263 return NULL;
3264 tp = (PyTypeObject *) obj;
3265 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3266 PyErr_Format(PyExc_TypeError,
3267 "heap type expected, got %R", obj);
3268 return NULL;
3269 }
3270 tp->tp_del = slot_tp_del;
3271 Py_INCREF(obj);
3272 return obj;
3273}
3274
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003275static PyMethodDef ml;
3276
3277static PyObject *
3278create_cfunction(PyObject *self, PyObject *args)
3279{
3280 return PyCFunction_NewEx(&ml, self, NULL);
3281}
3282
3283static PyMethodDef ml = {
3284 "create_cfunction",
3285 create_cfunction,
3286 METH_NOARGS,
3287 NULL
3288};
3289
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003290static PyObject *
3291_test_incref(PyObject *ob)
3292{
3293 Py_INCREF(ob);
3294 return ob;
3295}
3296
3297static PyObject *
3298test_xincref_doesnt_leak(PyObject *ob)
3299{
3300 PyObject *obj = PyLong_FromLong(0);
3301 Py_XINCREF(_test_incref(obj));
3302 Py_DECREF(obj);
3303 Py_DECREF(obj);
3304 Py_DECREF(obj);
3305 Py_RETURN_NONE;
3306}
3307
3308static PyObject *
3309test_incref_doesnt_leak(PyObject *ob)
3310{
3311 PyObject *obj = PyLong_FromLong(0);
3312 Py_INCREF(_test_incref(obj));
3313 Py_DECREF(obj);
3314 Py_DECREF(obj);
3315 Py_DECREF(obj);
3316 Py_RETURN_NONE;
3317}
3318
3319static PyObject *
3320test_xdecref_doesnt_leak(PyObject *ob)
3321{
3322 Py_XDECREF(PyLong_FromLong(0));
3323 Py_RETURN_NONE;
3324}
3325
3326static PyObject *
3327test_decref_doesnt_leak(PyObject *ob)
3328{
3329 Py_DECREF(PyLong_FromLong(0));
3330 Py_RETURN_NONE;
3331}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003332
Victor Stinner0507bf52013-07-07 02:05:46 +02003333static PyObject *
Christian Heimes4efdb412013-07-31 02:36:43 +02003334test_incref_decref_API(PyObject *ob)
3335{
3336 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003337 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003338 Py_DecRef(obj);
3339 Py_DecRef(obj);
3340 Py_RETURN_NONE;
3341}
3342
3343static PyObject *
Victor Stinner0507bf52013-07-07 02:05:46 +02003344test_pymem_alloc0(PyObject *self)
3345{
3346 void *ptr;
3347
Victor Stinnerdb067af2014-05-02 22:31:14 +02003348 ptr = PyMem_RawMalloc(0);
3349 if (ptr == NULL) {
3350 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3351 return NULL;
3352 }
3353 PyMem_RawFree(ptr);
3354
3355 ptr = PyMem_RawCalloc(0, 0);
3356 if (ptr == NULL) {
3357 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3358 return NULL;
3359 }
3360 PyMem_RawFree(ptr);
3361
Victor Stinner0507bf52013-07-07 02:05:46 +02003362 ptr = PyMem_Malloc(0);
3363 if (ptr == NULL) {
3364 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3365 return NULL;
3366 }
3367 PyMem_Free(ptr);
3368
Victor Stinnerdb067af2014-05-02 22:31:14 +02003369 ptr = PyMem_Calloc(0, 0);
3370 if (ptr == NULL) {
3371 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3372 return NULL;
3373 }
3374 PyMem_Free(ptr);
3375
Victor Stinner0507bf52013-07-07 02:05:46 +02003376 ptr = PyObject_Malloc(0);
3377 if (ptr == NULL) {
3378 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3379 return NULL;
3380 }
3381 PyObject_Free(ptr);
3382
Victor Stinnerdb067af2014-05-02 22:31:14 +02003383 ptr = PyObject_Calloc(0, 0);
3384 if (ptr == NULL) {
3385 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3386 return NULL;
3387 }
3388 PyObject_Free(ptr);
3389
Victor Stinner0507bf52013-07-07 02:05:46 +02003390 Py_RETURN_NONE;
3391}
3392
3393typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003394 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003395
3396 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003397 size_t calloc_nelem;
3398 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003399 void *realloc_ptr;
3400 size_t realloc_new_size;
3401 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003402 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003403} alloc_hook_t;
3404
Victor Stinner9ed83c42017-10-31 12:18:10 -07003405static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003406{
3407 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003408 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003409 hook->malloc_size = size;
3410 return hook->alloc.malloc(hook->alloc.ctx, size);
3411}
3412
Victor Stinner9ed83c42017-10-31 12:18:10 -07003413static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003414{
3415 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003416 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003417 hook->calloc_nelem = nelem;
3418 hook->calloc_elsize = elsize;
3419 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3420}
3421
Victor Stinner9ed83c42017-10-31 12:18:10 -07003422static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003423{
3424 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003425 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003426 hook->realloc_ptr = ptr;
3427 hook->realloc_new_size = new_size;
3428 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3429}
3430
Victor Stinner9ed83c42017-10-31 12:18:10 -07003431static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02003432{
3433 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003434 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003435 hook->free_ptr = ptr;
3436 hook->alloc.free(hook->alloc.ctx, ptr);
3437}
3438
3439static PyObject *
3440test_setallocators(PyMemAllocatorDomain domain)
3441{
3442 PyObject *res = NULL;
3443 const char *error_msg;
3444 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003445 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003446 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003447 void *ptr, *ptr2;
3448
Victor Stinnerdb067af2014-05-02 22:31:14 +02003449 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003450
3451 alloc.ctx = &hook;
3452 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003453 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003454 alloc.realloc = &hook_realloc;
3455 alloc.free = &hook_free;
3456 PyMem_GetAllocator(domain, &hook.alloc);
3457 PyMem_SetAllocator(domain, &alloc);
3458
Victor Stinner9ed83c42017-10-31 12:18:10 -07003459 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02003460 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003461 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02003462 switch(domain)
3463 {
3464 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3465 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3466 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3467 default: ptr = NULL; break;
3468 }
3469
Victor Stinner9ed83c42017-10-31 12:18:10 -07003470#define CHECK_CTX(FUNC) \
3471 if (hook.ctx != &hook) { \
3472 error_msg = FUNC " wrong context"; \
3473 goto fail; \
3474 } \
3475 hook.ctx = NULL; /* reset for next check */
3476
Victor Stinner0507bf52013-07-07 02:05:46 +02003477 if (ptr == NULL) {
3478 error_msg = "malloc failed";
3479 goto fail;
3480 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003481 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003482 if (hook.malloc_size != size) {
3483 error_msg = "malloc invalid size";
3484 goto fail;
3485 }
3486
3487 size2 = 200;
3488 switch(domain)
3489 {
3490 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3491 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3492 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003493 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003494 }
3495
3496 if (ptr2 == NULL) {
3497 error_msg = "realloc failed";
3498 goto fail;
3499 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003500 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003501 if (hook.realloc_ptr != ptr
3502 || hook.realloc_new_size != size2) {
3503 error_msg = "realloc invalid parameters";
3504 goto fail;
3505 }
3506
3507 switch(domain)
3508 {
3509 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3510 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3511 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3512 }
3513
Victor Stinner9ed83c42017-10-31 12:18:10 -07003514 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02003515 if (hook.free_ptr != ptr2) {
3516 error_msg = "free invalid pointer";
3517 goto fail;
3518 }
3519
Victor Stinner9ed83c42017-10-31 12:18:10 -07003520 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02003521 nelem = 2;
3522 elsize = 5;
3523 switch(domain)
3524 {
3525 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3526 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3527 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3528 default: ptr = NULL; break;
3529 }
3530
3531 if (ptr == NULL) {
3532 error_msg = "calloc failed";
3533 goto fail;
3534 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003535 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02003536 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3537 error_msg = "calloc invalid nelem or elsize";
3538 goto fail;
3539 }
3540
Victor Stinner9ed83c42017-10-31 12:18:10 -07003541 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003542 switch(domain)
3543 {
3544 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3545 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3546 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3547 }
3548
Victor Stinner9ed83c42017-10-31 12:18:10 -07003549 CHECK_CTX("calloc free");
3550 if (hook.free_ptr != ptr) {
3551 error_msg = "calloc free invalid pointer";
3552 goto fail;
3553 }
3554
Victor Stinner0507bf52013-07-07 02:05:46 +02003555 Py_INCREF(Py_None);
3556 res = Py_None;
3557 goto finally;
3558
3559fail:
3560 PyErr_SetString(PyExc_RuntimeError, error_msg);
3561
3562finally:
3563 PyMem_SetAllocator(domain, &hook.alloc);
3564 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003565
3566#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02003567}
3568
3569static PyObject *
3570test_pymem_setrawallocators(PyObject *self)
3571{
3572 return test_setallocators(PYMEM_DOMAIN_RAW);
3573}
3574
3575static PyObject *
3576test_pymem_setallocators(PyObject *self)
3577{
3578 return test_setallocators(PYMEM_DOMAIN_MEM);
3579}
3580
3581static PyObject *
3582test_pyobject_setallocators(PyObject *self)
3583{
3584 return test_setallocators(PYMEM_DOMAIN_OBJ);
3585}
3586
xdegaye85f64302017-07-01 14:14:45 +02003587/* Most part of the following code is inherited from the pyfailmalloc project
3588 * written by Victor Stinner. */
3589static struct {
3590 int installed;
3591 PyMemAllocatorEx raw;
3592 PyMemAllocatorEx mem;
3593 PyMemAllocatorEx obj;
3594} FmHook;
3595
3596static struct {
3597 int start;
3598 int stop;
3599 Py_ssize_t count;
3600} FmData;
3601
3602static int
3603fm_nomemory(void)
3604{
3605 FmData.count++;
3606 if (FmData.count > FmData.start &&
3607 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
3608 return 1;
3609 }
3610 return 0;
3611}
3612
3613static void *
3614hook_fmalloc(void *ctx, size_t size)
3615{
3616 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3617 if (fm_nomemory()) {
3618 return NULL;
3619 }
3620 return alloc->malloc(alloc->ctx, size);
3621}
3622
3623static void *
3624hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
3625{
3626 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3627 if (fm_nomemory()) {
3628 return NULL;
3629 }
3630 return alloc->calloc(alloc->ctx, nelem, elsize);
3631}
3632
3633static void *
3634hook_frealloc(void *ctx, void *ptr, size_t new_size)
3635{
3636 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3637 if (fm_nomemory()) {
3638 return NULL;
3639 }
3640 return alloc->realloc(alloc->ctx, ptr, new_size);
3641}
3642
3643static void
3644hook_ffree(void *ctx, void *ptr)
3645{
3646 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3647 alloc->free(alloc->ctx, ptr);
3648}
3649
3650static void
3651fm_setup_hooks(void)
3652{
3653 PyMemAllocatorEx alloc;
3654
3655 if (FmHook.installed) {
3656 return;
3657 }
3658 FmHook.installed = 1;
3659
3660 alloc.malloc = hook_fmalloc;
3661 alloc.calloc = hook_fcalloc;
3662 alloc.realloc = hook_frealloc;
3663 alloc.free = hook_ffree;
3664 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3665 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3666 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3667
3668 alloc.ctx = &FmHook.raw;
3669 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
3670
3671 alloc.ctx = &FmHook.mem;
3672 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
3673
3674 alloc.ctx = &FmHook.obj;
3675 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
3676}
3677
3678static void
3679fm_remove_hooks(void)
3680{
3681 if (FmHook.installed) {
3682 FmHook.installed = 0;
3683 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3684 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3685 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3686 }
3687}
3688
3689static PyObject*
3690set_nomemory(PyObject *self, PyObject *args)
3691{
3692 /* Memory allocation fails after 'start' allocation requests, and until
3693 * 'stop' allocation requests except when 'stop' is negative or equal
3694 * to 0 (default) in which case allocation failures never stop. */
3695 FmData.count = 0;
3696 FmData.stop = 0;
3697 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
3698 return NULL;
3699 }
3700 fm_setup_hooks();
3701 Py_RETURN_NONE;
3702}
3703
3704static PyObject*
3705remove_mem_hooks(PyObject *self)
3706{
3707 fm_remove_hooks();
3708 Py_RETURN_NONE;
3709}
3710
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003711PyDoc_STRVAR(docstring_empty,
3712""
3713);
3714
3715PyDoc_STRVAR(docstring_no_signature,
3716"This docstring has no signature."
3717);
3718
3719PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003720"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003721"\n"
3722"This docstring has an invalid signature."
3723);
3724
Larry Hastings2623c8c2014-02-08 22:15:29 -08003725PyDoc_STRVAR(docstring_with_invalid_signature2,
3726"docstring_with_invalid_signature2($module, /, boo)\n"
3727"\n"
3728"--\n"
3729"\n"
3730"This docstring also has an invalid signature."
3731);
3732
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003733PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003734"docstring_with_signature($module, /, sig)\n"
3735"--\n"
3736"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003737"This docstring has a valid signature."
3738);
3739
Zachary Ware8ef887c2015-04-13 18:22:35 -05003740PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3741"docstring_with_signature_but_no_doc($module, /, sig)\n"
3742"--\n"
3743"\n"
3744);
3745
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003746PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003747"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3748"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003749"\n"
3750"\n"
3751"This docstring has a valid signature and some extra newlines."
3752);
3753
Larry Hastings16c51912014-01-07 11:53:01 -08003754PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003755"docstring_with_signature_with_defaults(module, s='avocado',\n"
3756" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3757" local=the_number_three, sys=sys.maxsize,\n"
3758" exp=sys.maxsize - 1)\n"
3759"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003760"\n"
3761"\n"
3762"\n"
3763"This docstring has a valid signature with parameters,\n"
3764"and the parameters take defaults of varying types."
3765);
3766
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003767typedef struct {
3768 PyThread_type_lock start_event;
3769 PyThread_type_lock exit_event;
3770 PyObject *callback;
3771} test_c_thread_t;
3772
3773static void
3774temporary_c_thread(void *data)
3775{
3776 test_c_thread_t *test_c_thread = data;
3777 PyGILState_STATE state;
3778 PyObject *res;
3779
3780 PyThread_release_lock(test_c_thread->start_event);
3781
3782 /* Allocate a Python thread state for this thread */
3783 state = PyGILState_Ensure();
3784
Victor Stinner3466bde2016-09-05 18:16:01 -07003785 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003786 Py_CLEAR(test_c_thread->callback);
3787
3788 if (res == NULL) {
3789 PyErr_Print();
3790 }
3791 else {
3792 Py_DECREF(res);
3793 }
3794
3795 /* Destroy the Python thread state for this thread */
3796 PyGILState_Release(state);
3797
3798 PyThread_release_lock(test_c_thread->exit_event);
3799
3800 PyThread_exit_thread();
3801}
3802
3803static PyObject *
3804call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3805{
3806 PyObject *res = NULL;
3807 test_c_thread_t test_c_thread;
3808 long thread;
3809
3810 PyEval_InitThreads();
3811
3812 test_c_thread.start_event = PyThread_allocate_lock();
3813 test_c_thread.exit_event = PyThread_allocate_lock();
3814 test_c_thread.callback = NULL;
3815 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3816 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3817 goto exit;
3818 }
3819
3820 Py_INCREF(callback);
3821 test_c_thread.callback = callback;
3822
3823 PyThread_acquire_lock(test_c_thread.start_event, 1);
3824 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3825
3826 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3827 if (thread == -1) {
3828 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3829 PyThread_release_lock(test_c_thread.start_event);
3830 PyThread_release_lock(test_c_thread.exit_event);
3831 goto exit;
3832 }
3833
3834 PyThread_acquire_lock(test_c_thread.start_event, 1);
3835 PyThread_release_lock(test_c_thread.start_event);
3836
3837 Py_BEGIN_ALLOW_THREADS
3838 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3839 PyThread_release_lock(test_c_thread.exit_event);
3840 Py_END_ALLOW_THREADS
3841
3842 Py_INCREF(Py_None);
3843 res = Py_None;
3844
3845exit:
3846 Py_CLEAR(test_c_thread.callback);
3847 if (test_c_thread.start_event)
3848 PyThread_free_lock(test_c_thread.start_event);
3849 if (test_c_thread.exit_event)
3850 PyThread_free_lock(test_c_thread.exit_event);
3851 return res;
3852}
Victor Stinner13105102013-12-13 02:17:29 +01003853
Victor Stinner56e8c292014-07-21 12:30:22 +02003854static PyObject*
3855test_raise_signal(PyObject* self, PyObject *args)
3856{
3857 int signum, err;
3858
Oren Milmanba7d7362017-08-29 11:58:27 +03003859 if (!PyArg_ParseTuple(args, "i:raise_signal", &signum)) {
Victor Stinner56e8c292014-07-21 12:30:22 +02003860 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03003861 }
Victor Stinner56e8c292014-07-21 12:30:22 +02003862
3863 err = raise(signum);
3864 if (err)
3865 return PyErr_SetFromErrno(PyExc_OSError);
3866
3867 if (PyErr_CheckSignals() < 0)
3868 return NULL;
3869
3870 Py_RETURN_NONE;
3871}
3872
Serhiy Storchakab5181342015-02-06 08:58:56 +02003873/* marshal */
3874
3875static PyObject*
3876pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3877{
3878 long value;
3879 char *filename;
3880 int version;
3881 FILE *fp;
3882
3883 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3884 &value, &filename, &version))
3885 return NULL;
3886
3887 fp = fopen(filename, "wb");
3888 if (fp == NULL) {
3889 PyErr_SetFromErrno(PyExc_OSError);
3890 return NULL;
3891 }
3892
3893 PyMarshal_WriteLongToFile(value, fp, version);
3894
3895 fclose(fp);
3896 if (PyErr_Occurred())
3897 return NULL;
3898 Py_RETURN_NONE;
3899}
3900
3901static PyObject*
3902pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3903{
3904 PyObject *obj;
3905 char *filename;
3906 int version;
3907 FILE *fp;
3908
3909 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3910 &obj, &filename, &version))
3911 return NULL;
3912
3913 fp = fopen(filename, "wb");
3914 if (fp == NULL) {
3915 PyErr_SetFromErrno(PyExc_OSError);
3916 return NULL;
3917 }
3918
3919 PyMarshal_WriteObjectToFile(obj, fp, version);
3920
3921 fclose(fp);
3922 if (PyErr_Occurred())
3923 return NULL;
3924 Py_RETURN_NONE;
3925}
3926
3927static PyObject*
3928pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3929{
3930 int value;
3931 long pos;
3932 char *filename;
3933 FILE *fp;
3934
3935 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3936 return NULL;
3937
3938 fp = fopen(filename, "rb");
3939 if (fp == NULL) {
3940 PyErr_SetFromErrno(PyExc_OSError);
3941 return NULL;
3942 }
3943
3944 value = PyMarshal_ReadShortFromFile(fp);
3945 pos = ftell(fp);
3946
3947 fclose(fp);
3948 if (PyErr_Occurred())
3949 return NULL;
3950 return Py_BuildValue("il", value, pos);
3951}
3952
3953static PyObject*
3954pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3955{
3956 long value, pos;
3957 char *filename;
3958 FILE *fp;
3959
3960 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3961 return NULL;
3962
3963 fp = fopen(filename, "rb");
3964 if (fp == NULL) {
3965 PyErr_SetFromErrno(PyExc_OSError);
3966 return NULL;
3967 }
3968
3969 value = PyMarshal_ReadLongFromFile(fp);
3970 pos = ftell(fp);
3971
3972 fclose(fp);
3973 if (PyErr_Occurred())
3974 return NULL;
3975 return Py_BuildValue("ll", value, pos);
3976}
3977
3978static PyObject*
3979pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3980{
3981 PyObject *obj;
3982 long pos;
3983 char *filename;
3984 FILE *fp;
3985
3986 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3987 return NULL;
3988
3989 fp = fopen(filename, "rb");
3990 if (fp == NULL) {
3991 PyErr_SetFromErrno(PyExc_OSError);
3992 return NULL;
3993 }
3994
3995 obj = PyMarshal_ReadLastObjectFromFile(fp);
3996 pos = ftell(fp);
3997
3998 fclose(fp);
3999 return Py_BuildValue("Nl", obj, pos);
4000}
4001
4002static PyObject*
4003pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4004{
4005 PyObject *obj;
4006 long pos;
4007 char *filename;
4008 FILE *fp;
4009
4010 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
4011 return NULL;
4012
4013 fp = fopen(filename, "rb");
4014 if (fp == NULL) {
4015 PyErr_SetFromErrno(PyExc_OSError);
4016 return NULL;
4017 }
4018
4019 obj = PyMarshal_ReadObjectFromFile(fp);
4020 pos = ftell(fp);
4021
4022 fclose(fp);
4023 return Py_BuildValue("Nl", obj, pos);
4024}
4025
Victor Stinnerefde1462015-03-21 15:04:43 +01004026static PyObject*
4027return_null_without_error(PyObject *self, PyObject *args)
4028{
4029 /* invalid call: return NULL without setting an error,
4030 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4031 PyErr_Clear();
4032 return NULL;
4033}
4034
4035static PyObject*
4036return_result_with_error(PyObject *self, PyObject *args)
4037{
4038 /* invalid call: return a result with an error set,
4039 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4040 PyErr_SetNone(PyExc_ValueError);
4041 Py_RETURN_NONE;
4042}
4043
Victor Stinner992c43f2015-03-27 17:12:45 +01004044static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004045test_pytime_fromseconds(PyObject *self, PyObject *args)
4046{
4047 int seconds;
4048 _PyTime_t ts;
4049
4050 if (!PyArg_ParseTuple(args, "i", &seconds))
4051 return NULL;
4052 ts = _PyTime_FromSeconds(seconds);
4053 return _PyTime_AsNanosecondsObject(ts);
4054}
4055
4056static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004057test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4058{
4059 PyObject *obj;
4060 int round;
4061 _PyTime_t ts;
4062
4063 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4064 return NULL;
4065 if (check_time_rounding(round) < 0)
4066 return NULL;
4067 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4068 return NULL;
4069 return _PyTime_AsNanosecondsObject(ts);
4070}
4071
Victor Stinner4bfb4602015-03-27 22:27:24 +01004072static PyObject *
4073test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4074{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004075 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004076 _PyTime_t ts;
4077 double d;
4078
Victor Stinnerc29b5852017-11-02 07:28:27 -07004079 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004080 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004081 }
4082 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4083 return NULL;
4084 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004085 d = _PyTime_AsSecondsDouble(ts);
4086 return PyFloat_FromDouble(d);
4087}
4088
Victor Stinner95e9cef2015-03-28 01:26:47 +01004089static PyObject *
4090test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4091{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004092 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004093 int round;
4094 _PyTime_t t;
4095 struct timeval tv;
4096 PyObject *seconds;
4097
Victor Stinnerc29b5852017-11-02 07:28:27 -07004098 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004099 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004100 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004101 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004102 }
4103 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004104 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004105 }
4106 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4107 return NULL;
4108 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004109
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004110 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004111 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004112 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004113 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004114 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4115}
4116
Victor Stinner34dc0f42015-03-27 18:19:03 +01004117#ifdef HAVE_CLOCK_GETTIME
4118static PyObject *
4119test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4120{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004121 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004122 _PyTime_t t;
4123 struct timespec ts;
4124
Victor Stinnerc29b5852017-11-02 07:28:27 -07004125 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004126 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004127 }
4128 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004129 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004130 }
4131 if (_PyTime_AsTimespec(t, &ts) == -1) {
4132 return NULL;
4133 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004134 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4135}
4136#endif
4137
Victor Stinner62d1c702015-04-01 17:47:07 +02004138static PyObject *
4139test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4140{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004141 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004142 int round;
4143 _PyTime_t t, ms;
4144
Victor Stinnerc29b5852017-11-02 07:28:27 -07004145 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004146 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004147 }
4148 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004149 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004150 }
4151 if (check_time_rounding(round) < 0) {
4152 return NULL;
4153 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004154 ms = _PyTime_AsMilliseconds(t, round);
4155 /* This conversion rely on the fact that _PyTime_t is a number of
4156 nanoseconds */
4157 return _PyTime_AsNanosecondsObject(ms);
4158}
4159
4160static PyObject *
4161test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4162{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004163 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004164 int round;
4165 _PyTime_t t, ms;
4166
Victor Stinnerc29b5852017-11-02 07:28:27 -07004167 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004168 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004169 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004170 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004171 }
4172 if (check_time_rounding(round) < 0) {
4173 return NULL;
4174 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004175 ms = _PyTime_AsMicroseconds(t, round);
4176 /* This conversion rely on the fact that _PyTime_t is a number of
4177 nanoseconds */
4178 return _PyTime_AsNanosecondsObject(ms);
4179}
4180
Victor Stinner50856d52015-10-13 00:11:21 +02004181static PyObject*
4182get_recursion_depth(PyObject *self, PyObject *args)
4183{
4184 PyThreadState *tstate = PyThreadState_GET();
4185
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07004186 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02004187 return PyLong_FromLong(tstate->recursion_depth - 1);
4188}
4189
Victor Stinner34be807c2016-03-14 12:04:26 +01004190static PyObject*
4191pymem_buffer_overflow(PyObject *self, PyObject *args)
4192{
4193 char *buffer;
4194
4195 /* Deliberate buffer overflow to check that PyMem_Free() detects
4196 the overflow when debug hooks are installed. */
4197 buffer = PyMem_Malloc(16);
Miss Islington (bot)20fde532019-03-26 08:39:03 -07004198 if (buffer == NULL) {
4199 PyErr_NoMemory();
4200 return NULL;
4201 }
Victor Stinner34be807c2016-03-14 12:04:26 +01004202 buffer[16] = 'x';
4203 PyMem_Free(buffer);
4204
4205 Py_RETURN_NONE;
4206}
4207
4208static PyObject*
4209pymem_api_misuse(PyObject *self, PyObject *args)
4210{
4211 char *buffer;
4212
4213 /* Deliberate misusage of Python allocators:
4214 allococate with PyMem but release with PyMem_Raw. */
4215 buffer = PyMem_Malloc(16);
4216 PyMem_RawFree(buffer);
4217
4218 Py_RETURN_NONE;
4219}
4220
Victor Stinnerc4aec362016-03-14 22:26:53 +01004221static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004222pymem_malloc_without_gil(PyObject *self, PyObject *args)
4223{
4224 char *buffer;
4225
4226 /* Deliberate bug to test debug hooks on Python memory allocators:
4227 call PyMem_Malloc() without holding the GIL */
4228 Py_BEGIN_ALLOW_THREADS
4229 buffer = PyMem_Malloc(10);
4230 Py_END_ALLOW_THREADS
4231
4232 PyMem_Free(buffer);
4233
4234 Py_RETURN_NONE;
4235}
4236
Victor Stinner5d39e042017-11-29 17:20:38 +01004237
4238static PyObject*
4239test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4240{
4241 const char *name = _PyMem_GetAllocatorsName();
4242 if (name == NULL) {
4243 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4244 return NULL;
4245 }
4246 return PyUnicode_FromString(name);
4247}
4248
4249
Victor Stinnerad524372016-03-16 12:12:53 +01004250static PyObject*
Victor Stinner9e23f0a2019-04-11 22:30:31 +02004251pyobject_is_freed(PyObject *self, PyObject *op)
4252{
4253 int res = _PyObject_IsFreed(op);
4254 return PyBool_FromLong(res);
4255}
4256
4257
4258static PyObject*
4259pyobject_uninitialized(PyObject *self, PyObject *args)
4260{
4261 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4262 if (op == NULL) {
4263 return NULL;
4264 }
4265 /* Initialize reference count to avoid early crash in ceval or GC */
4266 Py_REFCNT(op) = 1;
4267 /* object fields like ob_type are uninitialized! */
4268 return op;
4269}
4270
4271
4272static PyObject*
4273pyobject_forbidden_bytes(PyObject *self, PyObject *args)
4274{
4275 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4276 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4277 if (op == NULL) {
4278 return NULL;
4279 }
4280 /* Initialize reference count to avoid early crash in ceval or GC */
4281 Py_REFCNT(op) = 1;
4282 /* ob_type field is after the memory block: part of "forbidden bytes"
4283 when using debug hooks on memory allocatrs! */
4284 return op;
4285}
4286
4287
4288static PyObject*
4289pyobject_freed(PyObject *self, PyObject *args)
4290{
4291 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4292 if (op == NULL) {
4293 return NULL;
4294 }
4295 Py_TYPE(op)->tp_dealloc(op);
4296 /* Reset reference count to avoid early crash in ceval or GC */
4297 Py_REFCNT(op) = 1;
4298 /* object memory is freed! */
4299 return op;
4300}
4301
4302
4303static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004304pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4305{
4306 char *buffer;
4307
Victor Stinnerad524372016-03-16 12:12:53 +01004308 /* Deliberate bug to test debug hooks on Python memory allocators:
4309 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004310 Py_BEGIN_ALLOW_THREADS
4311 buffer = PyObject_Malloc(10);
4312 Py_END_ALLOW_THREADS
4313
4314 PyObject_Free(buffer);
4315
4316 Py_RETURN_NONE;
4317}
4318
Victor Stinner10b73e12016-03-22 13:39:05 +01004319static PyObject *
4320tracemalloc_track(PyObject *self, PyObject *args)
4321{
4322 unsigned int domain;
4323 PyObject *ptr_obj;
4324 void *ptr;
4325 Py_ssize_t size;
4326 int release_gil = 0;
4327 int res;
4328
4329 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4330 return NULL;
4331 ptr = PyLong_AsVoidPtr(ptr_obj);
4332 if (PyErr_Occurred())
4333 return NULL;
4334
4335 if (release_gil) {
4336 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004337 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004338 Py_END_ALLOW_THREADS
4339 }
4340 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004341 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004342 }
4343
4344 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004345 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004346 return NULL;
4347 }
4348
4349 Py_RETURN_NONE;
4350}
4351
4352static PyObject *
4353tracemalloc_untrack(PyObject *self, PyObject *args)
4354{
4355 unsigned int domain;
4356 PyObject *ptr_obj;
4357 void *ptr;
4358 int res;
4359
4360 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4361 return NULL;
4362 ptr = PyLong_AsVoidPtr(ptr_obj);
4363 if (PyErr_Occurred())
4364 return NULL;
4365
Victor Stinner5ea4c062017-06-20 17:46:36 +02004366 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004367 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004368 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004369 return NULL;
4370 }
4371
4372 Py_RETURN_NONE;
4373}
4374
4375static PyObject *
4376tracemalloc_get_traceback(PyObject *self, PyObject *args)
4377{
4378 unsigned int domain;
4379 PyObject *ptr_obj;
4380 void *ptr;
4381
4382 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4383 return NULL;
4384 ptr = PyLong_AsVoidPtr(ptr_obj);
4385 if (PyErr_Occurred())
4386 return NULL;
4387
Benjamin Petersonca470632016-09-06 13:47:26 -07004388 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004389}
4390
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004391static PyObject *
4392dict_get_version(PyObject *self, PyObject *args)
4393{
4394 PyDictObject *dict;
4395 uint64_t version;
4396
4397 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4398 return NULL;
4399
4400 version = dict->ma_version_tag;
4401
4402 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4403 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4404}
4405
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004406
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004407static PyObject *
4408raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4409{
4410 PyGenObject *gen;
4411
4412 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4413 return NULL;
4414
4415 /* This is used in a test to check what happens if a signal arrives just
4416 as we're in the process of entering a yield from chain (see
4417 bpo-30039).
4418
4419 Needs to be done in C, because:
4420 - we don't have a Python wrapper for raise()
4421 - we need to make sure that the Python-level signal handler doesn't run
4422 *before* we enter the generator frame, which is impossible in Python
4423 because we check for signals before every bytecode operation.
4424 */
4425 raise(SIGINT);
4426 return _PyGen_Send(gen, Py_None);
4427}
4428
4429
Victor Stinner3b5cf852017-06-09 16:48:45 +02004430static int
4431fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4432{
4433 if (args == Py_None) {
4434 *stack = NULL;
4435 *nargs = 0;
4436 }
4437 else if (PyTuple_Check(args)) {
4438 *stack = &PyTuple_GET_ITEM(args, 0);
4439 *nargs = PyTuple_GET_SIZE(args);
4440 }
4441 else {
4442 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4443 return -1;
4444 }
4445 return 0;
4446}
4447
4448
4449static PyObject *
4450test_pyobject_fastcall(PyObject *self, PyObject *args)
4451{
4452 PyObject *func, *func_args;
4453 PyObject **stack;
4454 Py_ssize_t nargs;
4455
4456 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4457 return NULL;
4458 }
4459
4460 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4461 return NULL;
4462 }
4463 return _PyObject_FastCall(func, stack, nargs);
4464}
4465
4466
4467static PyObject *
4468test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4469{
4470 PyObject *func, *func_args, *kwargs;
4471 PyObject **stack;
4472 Py_ssize_t nargs;
4473
4474 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4475 return NULL;
4476 }
4477
4478 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4479 return NULL;
4480 }
4481
4482 if (kwargs == Py_None) {
4483 kwargs = NULL;
4484 }
4485 else if (!PyDict_Check(kwargs)) {
4486 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4487 return NULL;
4488 }
4489
4490 return _PyObject_FastCallDict(func, stack, nargs, kwargs);
4491}
4492
4493
4494static PyObject *
4495test_pyobject_fastcallkeywords(PyObject *self, PyObject *args)
4496{
4497 PyObject *func, *func_args, *kwnames = NULL;
4498 PyObject **stack;
4499 Py_ssize_t nargs, nkw;
4500
4501 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4502 return NULL;
4503 }
4504
4505 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4506 return NULL;
4507 }
4508
4509 if (kwnames == Py_None) {
4510 kwnames = NULL;
4511 }
4512 else if (PyTuple_Check(kwnames)) {
4513 nkw = PyTuple_GET_SIZE(kwnames);
4514 if (nargs < nkw) {
4515 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4516 return NULL;
4517 }
4518 nargs -= nkw;
4519 }
4520 else {
4521 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4522 return NULL;
4523 }
4524 return _PyObject_FastCallKeywords(func, stack, nargs, kwnames);
4525}
4526
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004527
Victor Stinner64fa4492017-07-10 14:37:49 +02004528static PyObject*
4529stack_pointer(PyObject *self, PyObject *args)
4530{
4531 int v = 5;
4532 return PyLong_FromVoidPtr(&v);
4533}
4534
Victor Stinner3b5cf852017-06-09 16:48:45 +02004535
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004536#ifdef W_STOPCODE
4537static PyObject*
4538py_w_stopcode(PyObject *self, PyObject *args)
4539{
4540 int sig, status;
4541 if (!PyArg_ParseTuple(args, "i", &sig)) {
4542 return NULL;
4543 }
4544 status = W_STOPCODE(sig);
4545 return PyLong_FromLong(status);
4546}
4547#endif
4548
4549
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004550static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03004551get_mapping_keys(PyObject* self, PyObject *obj)
4552{
4553 return PyMapping_Keys(obj);
4554}
4555
4556static PyObject *
4557get_mapping_values(PyObject* self, PyObject *obj)
4558{
4559 return PyMapping_Values(obj);
4560}
4561
4562static PyObject *
4563get_mapping_items(PyObject* self, PyObject *obj)
4564{
4565 return PyMapping_Items(obj);
4566}
4567
4568
4569static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004570test_pythread_tss_key_state(PyObject *self, PyObject *args)
4571{
4572 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
4573 if (PyThread_tss_is_created(&tss_key)) {
4574 return raiseTestError("test_pythread_tss_key_state",
4575 "TSS key not in an uninitialized state at "
4576 "creation time");
4577 }
4578 if (PyThread_tss_create(&tss_key) != 0) {
4579 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
4580 return NULL;
4581 }
4582 if (!PyThread_tss_is_created(&tss_key)) {
4583 return raiseTestError("test_pythread_tss_key_state",
4584 "PyThread_tss_create succeeded, "
4585 "but with TSS key in an uninitialized state");
4586 }
4587 if (PyThread_tss_create(&tss_key) != 0) {
4588 return raiseTestError("test_pythread_tss_key_state",
4589 "PyThread_tss_create unsuccessful with "
4590 "an already initialized key");
4591 }
4592#define CHECK_TSS_API(expr) \
4593 (void)(expr); \
4594 if (!PyThread_tss_is_created(&tss_key)) { \
4595 return raiseTestError("test_pythread_tss_key_state", \
4596 "TSS key initialization state was not " \
4597 "preserved after calling " #expr); }
4598 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
4599 CHECK_TSS_API(PyThread_tss_get(&tss_key));
4600#undef CHECK_TSS_API
4601 PyThread_tss_delete(&tss_key);
4602 if (PyThread_tss_is_created(&tss_key)) {
4603 return raiseTestError("test_pythread_tss_key_state",
4604 "PyThread_tss_delete called, but did not "
4605 "set the key state to uninitialized");
4606 }
4607
4608 Py_tss_t *ptr_key = PyThread_tss_alloc();
4609 if (ptr_key == NULL) {
4610 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
4611 return NULL;
4612 }
4613 if (PyThread_tss_is_created(ptr_key)) {
4614 return raiseTestError("test_pythread_tss_key_state",
4615 "TSS key not in an uninitialized state at "
4616 "allocation time");
4617 }
4618 PyThread_tss_free(ptr_key);
4619 ptr_key = NULL;
4620 Py_RETURN_NONE;
4621}
4622
4623
Yury Selivanovf23746a2018-01-22 19:11:18 -05004624static PyObject*
4625new_hamt(PyObject *self, PyObject *args)
4626{
4627 return _PyContext_NewHamtForTests();
4628}
4629
4630
Victor Stinner35c28d52018-11-14 02:01:52 +01004631static PyObject *
4632get_global_config(PyObject *self, PyObject *Py_UNUSED(args))
4633{
4634 return _Py_GetGlobalVariablesAsDict();
4635}
4636
4637
4638static PyObject *
4639get_core_config(PyObject *self, PyObject *Py_UNUSED(args))
4640{
4641 PyInterpreterState *interp = PyThreadState_GET()->interp;
4642 const _PyCoreConfig *config = &interp->core_config;
4643 return _PyCoreConfig_AsDict(config);
4644}
4645
4646
4647static PyObject *
4648get_main_config(PyObject *self, PyObject *Py_UNUSED(args))
4649{
4650 PyInterpreterState *interp = PyThreadState_GET()->interp;
4651 const _PyMainInterpreterConfig *config = &interp->config;
4652 return _PyMainInterpreterConfig_AsDict(config);
4653}
4654
4655
Tim Peters9ea17ac2001-02-02 05:57:15 +00004656static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004657 {"raise_exception", raise_exception, METH_VARARGS},
4658 {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02004659 {"set_errno", set_errno, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004660 {"test_config", (PyCFunction)test_config, METH_NOARGS},
Victor Stinner01076552013-10-29 19:39:52 +01004661 {"test_sizeof_c_types", (PyCFunction)test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004662 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05004663 {"datetime_check_date", datetime_check_date, METH_VARARGS},
4664 {"datetime_check_time", datetime_check_time, METH_VARARGS},
4665 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
4666 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
4667 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
4668 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Miss Islington (bot)24d6e3c2018-02-22 13:18:54 -08004669 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05004670 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 {"test_list_api", (PyCFunction)test_list_api, METH_NOARGS},
4672 {"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02004673 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01004674 {"dict_hassplittable", dict_hassplittable, METH_O},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004675 {"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07004677 {"test_xincref_doesnt_leak",(PyCFunction)test_xincref_doesnt_leak, METH_NOARGS},
4678 {"test_incref_doesnt_leak", (PyCFunction)test_incref_doesnt_leak, METH_NOARGS},
4679 {"test_xdecref_doesnt_leak",(PyCFunction)test_xdecref_doesnt_leak, METH_NOARGS},
4680 {"test_decref_doesnt_leak", (PyCFunction)test_decref_doesnt_leak, METH_NOARGS},
Christian Heimes4efdb412013-07-31 02:36:43 +02004681 {"test_incref_decref_API", (PyCFunction)test_incref_decref_API, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 {"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
4683 METH_NOARGS},
Nadeem Vawda3d5881e2011-09-07 21:40:26 +02004684 {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS},
4685 {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS},
Zackery Spytze36ed472019-06-07 09:41:10 -06004686 {"test_long_as_unsigned_long_long_mask",
4687 (PyCFunction)test_long_as_unsigned_long_long_mask, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004688 {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
4689 {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
4690 {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07004691 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004692 {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
4693 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
4694 {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
4695 PyDoc_STR("This is a pretty normal docstring.")},
4696 {"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
4697 {"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
4698 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01004699 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004700#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01004701 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004702#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01004703 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03004704 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03004705 {"get_args", get_args, METH_VARARGS},
4706 {"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004707 {"getargs_tuple", getargs_tuple, METH_VARARGS},
4708 {"getargs_keywords", (PyCFunction)getargs_keywords,
4709 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00004710 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
4711 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03004712 {"getargs_positional_only_and_keywords",
4713 (PyCFunction)getargs_positional_only_and_keywords,
4714 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 {"getargs_b", getargs_b, METH_VARARGS},
4716 {"getargs_B", getargs_B, METH_VARARGS},
4717 {"getargs_h", getargs_h, METH_VARARGS},
4718 {"getargs_H", getargs_H, METH_VARARGS},
4719 {"getargs_I", getargs_I, METH_VARARGS},
4720 {"getargs_k", getargs_k, METH_VARARGS},
4721 {"getargs_i", getargs_i, METH_VARARGS},
4722 {"getargs_l", getargs_l, METH_VARARGS},
4723 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07004724 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 {"getargs_L", getargs_L, METH_VARARGS},
4726 {"getargs_K", getargs_K, METH_VARARGS},
4727 {"test_longlong_api", test_longlong_api, METH_NOARGS},
4728 {"test_long_long_and_overflow",
4729 (PyCFunction)test_long_long_and_overflow, METH_NOARGS},
4730 {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03004731 {"getargs_f", getargs_f, METH_VARARGS},
4732 {"getargs_d", getargs_d, METH_VARARGS},
4733 {"getargs_D", getargs_D, METH_VARARGS},
4734 {"getargs_S", getargs_S, METH_VARARGS},
4735 {"getargs_Y", getargs_Y, METH_VARARGS},
4736 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03004737 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004738 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00004739 {"getargs_s", getargs_s, METH_VARARGS},
4740 {"getargs_s_star", getargs_s_star, METH_VARARGS},
4741 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
4742 {"getargs_z", getargs_z, METH_VARARGS},
4743 {"getargs_z_star", getargs_z_star, METH_VARARGS},
4744 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
4745 {"getargs_y", getargs_y, METH_VARARGS},
4746 {"getargs_y_star", getargs_y_star, METH_VARARGS},
4747 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
4748 {"getargs_u", getargs_u, METH_VARARGS},
4749 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
4750 {"getargs_Z", getargs_Z, METH_VARARGS},
4751 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00004752 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004753 {"getargs_es", getargs_es, METH_VARARGS},
4754 {"getargs_et", getargs_et, METH_VARARGS},
4755 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
4756 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004757 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004758 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004759 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004760 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004761 {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS},
4762 {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS},
4763 {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
4764 {"test_widechar", (PyCFunction)test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004765 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
4766 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03004767 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08004768 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03004769 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004770 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
4771 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01004772 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004773 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004775#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00004776 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004777#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00004778 {"traceback_print", traceback_print, METH_VARARGS},
4779 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02004780 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004781 {"argparsing", argparsing, METH_VARARGS},
4782 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004783 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
4784 METH_VARARGS | METH_KEYWORDS},
Antoine Pitrou5bffa792011-02-24 20:50:49 +00004785 {"make_memoryview_from_NULL_pointer", (PyCFunction)make_memoryview_from_NULL_pointer,
4786 METH_NOARGS},
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00004787 {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004788 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01004789 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
4790 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01004791 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02004792 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04004793 {"create_cfunction", create_cfunction, METH_NOARGS},
Victor Stinner0507bf52013-07-07 02:05:46 +02004794 {"test_pymem_alloc0",
Victor Stinner797bcb52014-06-02 21:29:07 +02004795 (PyCFunction)test_pymem_alloc0, METH_NOARGS},
4796 {"test_pymem_setrawallocators",
Victor Stinner0507bf52013-07-07 02:05:46 +02004797 (PyCFunction)test_pymem_setrawallocators, METH_NOARGS},
4798 {"test_pymem_setallocators",
4799 (PyCFunction)test_pymem_setallocators, METH_NOARGS},
4800 {"test_pyobject_setallocators",
4801 (PyCFunction)test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02004802 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
4803 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
4804 {"remove_mem_hooks", (PyCFunction)remove_mem_hooks, METH_NOARGS,
4805 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004806 {"no_docstring",
4807 (PyCFunction)test_with_docstring, METH_NOARGS},
4808 {"docstring_empty",
4809 (PyCFunction)test_with_docstring, METH_NOARGS,
4810 docstring_empty},
4811 {"docstring_no_signature",
4812 (PyCFunction)test_with_docstring, METH_NOARGS,
4813 docstring_no_signature},
4814 {"docstring_with_invalid_signature",
4815 (PyCFunction)test_with_docstring, METH_NOARGS,
4816 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004817 {"docstring_with_invalid_signature2",
4818 (PyCFunction)test_with_docstring, METH_NOARGS,
4819 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004820 {"docstring_with_signature",
4821 (PyCFunction)test_with_docstring, METH_NOARGS,
4822 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004823 {"docstring_with_signature_but_no_doc",
4824 (PyCFunction)test_with_docstring, METH_NOARGS,
4825 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004826 {"docstring_with_signature_and_extra_newlines",
4827 (PyCFunction)test_with_docstring, METH_NOARGS,
4828 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004829 {"docstring_with_signature_with_defaults",
4830 (PyCFunction)test_with_docstring, METH_NOARGS,
4831 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02004832 {"raise_signal",
4833 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004834 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4835 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02004836 {"pymarshal_write_long_to_file",
4837 pymarshal_write_long_to_file, METH_VARARGS},
4838 {"pymarshal_write_object_to_file",
4839 pymarshal_write_object_to_file, METH_VARARGS},
4840 {"pymarshal_read_short_from_file",
4841 pymarshal_read_short_from_file, METH_VARARGS},
4842 {"pymarshal_read_long_from_file",
4843 pymarshal_read_long_from_file, METH_VARARGS},
4844 {"pymarshal_read_last_object_from_file",
4845 pymarshal_read_last_object_from_file, METH_VARARGS},
4846 {"pymarshal_read_object_from_file",
4847 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004848 {"return_null_without_error",
4849 return_null_without_error, METH_NOARGS},
4850 {"return_result_with_error",
4851 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004852 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004853 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4854 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004855 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004856#ifdef HAVE_CLOCK_GETTIME
4857 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4858#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004859 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4860 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004861 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01004862 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
4863 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01004864 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01004865 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner9e23f0a2019-04-11 22:30:31 +02004866 {"pyobject_is_freed", (PyCFunction)(void(*)(void))pyobject_is_freed, METH_O},
4867 {"pyobject_uninitialized", pyobject_uninitialized, METH_NOARGS},
4868 {"pyobject_forbidden_bytes", pyobject_forbidden_bytes, METH_NOARGS},
4869 {"pyobject_freed", pyobject_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01004870 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01004871 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
4872 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
4873 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004874 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004875 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02004876 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
4877 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
4878 {"pyobject_fastcallkeywords", test_pyobject_fastcallkeywords, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02004879 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004880#ifdef W_STOPCODE
4881 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
4882#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03004883 {"get_mapping_keys", get_mapping_keys, METH_O},
4884 {"get_mapping_values", get_mapping_values, METH_O},
4885 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004886 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05004887 {"hamt", new_hamt, METH_NOARGS},
Victor Stinner35c28d52018-11-14 02:01:52 +01004888 {"get_global_config", get_global_config, METH_NOARGS},
4889 {"get_core_config", get_core_config, METH_NOARGS},
4890 {"get_main_config", get_main_config, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004891 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00004892};
4893
Thomas Hellera4ea6032003-04-17 18:55:45 +00004894#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
4895
Thomas Wouters89f507f2006-12-13 04:49:30 +00004896typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004897 char bool_member;
4898 char byte_member;
4899 unsigned char ubyte_member;
4900 short short_member;
4901 unsigned short ushort_member;
4902 int int_member;
4903 unsigned int uint_member;
4904 long long_member;
4905 unsigned long ulong_member;
4906 Py_ssize_t pyssizet_member;
4907 float float_member;
4908 double double_member;
4909 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07004910 long long longlong_member;
4911 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004912} all_structmembers;
4913
4914typedef struct {
4915 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004916 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004917} test_structmembers;
4918
4919static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004920 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
4921 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
4922 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
4923 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
4924 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
4925 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
4926 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
4927 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
4928 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
4929 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
4930 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
4931 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
4932 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004933 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
4934 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004935 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00004936};
4937
4938
Christian Heimes1af737c2008-01-23 08:24:23 +00004939static PyObject *
4940test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
4941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004942 static char *keywords[] = {
4943 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
4944 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
4945 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004946 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004947 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07004948 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004949 test_structmembers *ob;
4950 const char *s = NULL;
4951 Py_ssize_t string_len = 0;
4952 ob = PyObject_New(test_structmembers, type);
4953 if (ob == NULL)
4954 return NULL;
4955 memset(&ob->structmembers, 0, sizeof(all_structmembers));
4956 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
4957 &ob->structmembers.bool_member,
4958 &ob->structmembers.byte_member,
4959 &ob->structmembers.ubyte_member,
4960 &ob->structmembers.short_member,
4961 &ob->structmembers.ushort_member,
4962 &ob->structmembers.int_member,
4963 &ob->structmembers.uint_member,
4964 &ob->structmembers.long_member,
4965 &ob->structmembers.ulong_member,
4966 &ob->structmembers.pyssizet_member,
4967 &ob->structmembers.float_member,
4968 &ob->structmembers.double_member,
4969 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004970 , &ob->structmembers.longlong_member,
4971 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 )) {
4973 Py_DECREF(ob);
4974 return NULL;
4975 }
4976 if (s != NULL) {
4977 if (string_len > 5) {
4978 Py_DECREF(ob);
4979 PyErr_SetString(PyExc_ValueError, "string too long");
4980 return NULL;
4981 }
4982 strcpy(ob->structmembers.inplace_member, s);
4983 }
4984 else {
4985 strcpy(ob->structmembers.inplace_member, "");
4986 }
4987 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004988}
4989
Christian Heimes1af737c2008-01-23 08:24:23 +00004990static void
4991test_structmembers_free(PyObject *ob)
4992{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004993 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004994}
4995
4996static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004997 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998 "test_structmembersType",
4999 sizeof(test_structmembers), /* tp_basicsize */
5000 0, /* tp_itemsize */
5001 test_structmembers_free, /* destructor tp_dealloc */
5002 0, /* tp_print */
5003 0, /* tp_getattr */
5004 0, /* tp_setattr */
5005 0, /* tp_reserved */
5006 0, /* tp_repr */
5007 0, /* tp_as_number */
5008 0, /* tp_as_sequence */
5009 0, /* tp_as_mapping */
5010 0, /* tp_hash */
5011 0, /* tp_call */
5012 0, /* tp_str */
5013 PyObject_GenericGetAttr, /* tp_getattro */
5014 PyObject_GenericSetAttr, /* tp_setattro */
5015 0, /* tp_as_buffer */
5016 0, /* tp_flags */
5017 "Type containing all structmember types",
5018 0, /* traverseproc tp_traverse */
5019 0, /* tp_clear */
5020 0, /* tp_richcompare */
5021 0, /* tp_weaklistoffset */
5022 0, /* tp_iter */
5023 0, /* tp_iternext */
5024 0, /* tp_methods */
5025 test_members, /* tp_members */
5026 0,
5027 0,
5028 0,
5029 0,
5030 0,
5031 0,
5032 0,
5033 0,
5034 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005035};
5036
5037
Benjamin Petersond51374e2014-04-09 23:55:56 -04005038typedef struct {
5039 PyObject_HEAD
5040} matmulObject;
5041
5042static PyObject *
5043matmulType_matmul(PyObject *self, PyObject *other)
5044{
5045 return Py_BuildValue("(sOO)", "matmul", self, other);
5046}
5047
5048static PyObject *
5049matmulType_imatmul(PyObject *self, PyObject *other)
5050{
5051 return Py_BuildValue("(sOO)", "imatmul", self, other);
5052}
5053
5054static void
5055matmulType_dealloc(PyObject *self)
5056{
Zachary Ware420dc562014-04-23 13:51:27 -05005057 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005058}
5059
5060static PyNumberMethods matmulType_as_number = {
5061 0, /* nb_add */
5062 0, /* nb_subtract */
5063 0, /* nb_multiply */
5064 0, /* nb_remainde r*/
5065 0, /* nb_divmod */
5066 0, /* nb_power */
5067 0, /* nb_negative */
5068 0, /* tp_positive */
5069 0, /* tp_absolute */
5070 0, /* tp_bool */
5071 0, /* nb_invert */
5072 0, /* nb_lshift */
5073 0, /* nb_rshift */
5074 0, /* nb_and */
5075 0, /* nb_xor */
5076 0, /* nb_or */
5077 0, /* nb_int */
5078 0, /* nb_reserved */
5079 0, /* nb_float */
5080 0, /* nb_inplace_add */
5081 0, /* nb_inplace_subtract */
5082 0, /* nb_inplace_multiply */
5083 0, /* nb_inplace_remainder */
5084 0, /* nb_inplace_power */
5085 0, /* nb_inplace_lshift */
5086 0, /* nb_inplace_rshift */
5087 0, /* nb_inplace_and */
5088 0, /* nb_inplace_xor */
5089 0, /* nb_inplace_or */
5090 0, /* nb_floor_divide */
5091 0, /* nb_true_divide */
5092 0, /* nb_inplace_floor_divide */
5093 0, /* nb_inplace_true_divide */
5094 0, /* nb_index */
5095 matmulType_matmul, /* nb_matrix_multiply */
5096 matmulType_imatmul /* nb_matrix_inplace_multiply */
5097};
5098
5099static PyTypeObject matmulType = {
5100 PyVarObject_HEAD_INIT(NULL, 0)
5101 "matmulType",
5102 sizeof(matmulObject), /* tp_basicsize */
5103 0, /* tp_itemsize */
5104 matmulType_dealloc, /* destructor tp_dealloc */
5105 0, /* tp_print */
5106 0, /* tp_getattr */
5107 0, /* tp_setattr */
5108 0, /* tp_reserved */
5109 0, /* tp_repr */
5110 &matmulType_as_number, /* tp_as_number */
5111 0, /* tp_as_sequence */
5112 0, /* tp_as_mapping */
5113 0, /* tp_hash */
5114 0, /* tp_call */
5115 0, /* tp_str */
5116 PyObject_GenericGetAttr, /* tp_getattro */
5117 PyObject_GenericSetAttr, /* tp_setattro */
5118 0, /* tp_as_buffer */
5119 0, /* tp_flags */
5120 "C level type with matrix operations defined",
5121 0, /* traverseproc tp_traverse */
5122 0, /* tp_clear */
5123 0, /* tp_richcompare */
5124 0, /* tp_weaklistoffset */
5125 0, /* tp_iter */
5126 0, /* tp_iternext */
5127 0, /* tp_methods */
5128 0, /* tp_members */
5129 0,
5130 0,
5131 0,
5132 0,
5133 0,
5134 0,
5135 0,
5136 0,
5137 PyType_GenericNew, /* tp_new */
5138 PyObject_Del, /* tp_free */
5139};
5140
Martin v. Löwis1a214512008-06-11 05:26:20 +00005141
Yury Selivanov75445082015-05-11 22:57:16 -04005142typedef struct {
5143 PyObject_HEAD
5144 PyObject *ao_iterator;
5145} awaitObject;
5146
5147
5148static PyObject *
5149awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5150{
5151 PyObject *v;
5152 awaitObject *ao;
5153
5154 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
5155 return NULL;
5156
5157 ao = (awaitObject *)type->tp_alloc(type, 0);
5158 if (ao == NULL) {
5159 return NULL;
5160 }
5161
5162 Py_INCREF(v);
5163 ao->ao_iterator = v;
5164
5165 return (PyObject *)ao;
5166}
5167
5168
5169static void
5170awaitObject_dealloc(awaitObject *ao)
5171{
5172 Py_CLEAR(ao->ao_iterator);
5173 Py_TYPE(ao)->tp_free(ao);
5174}
5175
5176
5177static PyObject *
5178awaitObject_await(awaitObject *ao)
5179{
5180 Py_INCREF(ao->ao_iterator);
5181 return ao->ao_iterator;
5182}
5183
5184static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04005185 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04005186 0, /* am_aiter */
5187 0 /* am_anext */
5188};
5189
5190
5191static PyTypeObject awaitType = {
5192 PyVarObject_HEAD_INIT(NULL, 0)
5193 "awaitType",
5194 sizeof(awaitObject), /* tp_basicsize */
5195 0, /* tp_itemsize */
5196 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
5197 0, /* tp_print */
5198 0, /* tp_getattr */
5199 0, /* tp_setattr */
5200 &awaitType_as_async, /* tp_as_async */
5201 0, /* tp_repr */
5202 0, /* tp_as_number */
5203 0, /* tp_as_sequence */
5204 0, /* tp_as_mapping */
5205 0, /* tp_hash */
5206 0, /* tp_call */
5207 0, /* tp_str */
5208 PyObject_GenericGetAttr, /* tp_getattro */
5209 PyObject_GenericSetAttr, /* tp_setattro */
5210 0, /* tp_as_buffer */
5211 0, /* tp_flags */
5212 "C level type with tp_as_async",
5213 0, /* traverseproc tp_traverse */
5214 0, /* tp_clear */
5215 0, /* tp_richcompare */
5216 0, /* tp_weaklistoffset */
5217 0, /* tp_iter */
5218 0, /* tp_iternext */
5219 0, /* tp_methods */
5220 0, /* tp_members */
5221 0,
5222 0,
5223 0,
5224 0,
5225 0,
5226 0,
5227 0,
5228 0,
5229 awaitObject_new, /* tp_new */
5230 PyObject_Del, /* tp_free */
5231};
5232
5233
xdegaye56d1f5c2017-10-26 15:09:06 +02005234static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
5235
5236static PyTypeObject PyRecursingInfinitelyError_Type = {
5237 PyVarObject_HEAD_INIT(NULL, 0)
5238 "RecursingInfinitelyError", /* tp_name */
5239 sizeof(PyBaseExceptionObject), /* tp_basicsize */
5240 0, /* tp_itemsize */
5241 0, /* tp_dealloc */
5242 0, /* tp_print */
5243 0, /* tp_getattr */
5244 0, /* tp_setattr */
5245 0, /* tp_reserved */
5246 0, /* tp_repr */
5247 0, /* tp_as_number */
5248 0, /* tp_as_sequence */
5249 0, /* tp_as_mapping */
5250 0, /* tp_hash */
5251 0, /* tp_call */
5252 0, /* tp_str */
5253 0, /* tp_getattro */
5254 0, /* tp_setattro */
5255 0, /* tp_as_buffer */
5256 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5257 "Instantiating this exception starts infinite recursion.", /* tp_doc */
5258 0, /* tp_traverse */
5259 0, /* tp_clear */
5260 0, /* tp_richcompare */
5261 0, /* tp_weaklistoffset */
5262 0, /* tp_iter */
5263 0, /* tp_iternext */
5264 0, /* tp_methods */
5265 0, /* tp_members */
5266 0, /* tp_getset */
5267 0, /* tp_base */
5268 0, /* tp_dict */
5269 0, /* tp_descr_get */
5270 0, /* tp_descr_set */
5271 0, /* tp_dictoffset */
5272 (initproc)recurse_infinitely_error_init, /* tp_init */
5273 0, /* tp_alloc */
5274 0, /* tp_new */
5275};
5276
5277static int
5278recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
5279{
5280 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
5281
5282 /* Instantiating this exception starts infinite recursion. */
5283 Py_INCREF(type);
5284 PyErr_SetObject(type, NULL);
5285 return -1;
5286}
5287
5288
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005289/* Test PEP 560 */
5290
5291typedef struct {
5292 PyObject_HEAD
5293 PyObject *item;
5294} PyGenericAliasObject;
5295
5296static void
5297generic_alias_dealloc(PyGenericAliasObject *self)
5298{
5299 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01005300 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005301}
5302
5303static PyObject *
5304generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
5305{
5306 return PyTuple_Pack(1, self->item);
5307}
5308
5309static PyMethodDef generic_alias_methods[] = {
5310 {"__mro_entries__", (PyCFunction) generic_alias_mro_entries, METH_O, NULL},
5311 {NULL} /* sentinel */
5312};
5313
Miss Islington (bot)2cbd1bb2018-07-03 23:08:57 -07005314static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005315 PyVarObject_HEAD_INIT(NULL, 0)
5316 "GenericAlias",
5317 sizeof(PyGenericAliasObject),
5318 0,
5319 .tp_dealloc = (destructor)generic_alias_dealloc,
5320 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5321 .tp_methods = generic_alias_methods,
5322};
5323
5324static PyObject *
5325generic_alias_new(PyObject *item)
5326{
5327 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
5328 if (o == NULL) {
5329 return NULL;
5330 }
5331 Py_INCREF(item);
5332 o->item = item;
5333 return (PyObject*) o;
5334}
5335
5336typedef struct {
5337 PyObject_HEAD
5338} PyGenericObject;
5339
5340static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005341generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005342{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005343 return generic_alias_new(item);
5344}
5345
5346static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005347 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005348 {NULL} /* sentinel */
5349};
5350
Miss Islington (bot)2cbd1bb2018-07-03 23:08:57 -07005351static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005352 PyVarObject_HEAD_INIT(NULL, 0)
5353 "Generic",
5354 sizeof(PyGenericObject),
5355 0,
5356 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5357 .tp_methods = generic_methods,
5358};
5359
5360
Martin v. Löwis1a214512008-06-11 05:26:20 +00005361static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005362 PyModuleDef_HEAD_INIT,
5363 "_testcapi",
5364 NULL,
5365 -1,
5366 TestMethods,
5367 NULL,
5368 NULL,
5369 NULL,
5370 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005371};
5372
Nick Coghland5cacbb2015-05-23 22:24:10 +10005373/* Per PEP 489, this module will not be converted to multi-phase initialization
5374 */
5375
Mark Hammond62b1ab12002-07-23 06:31:15 +00005376PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005377PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00005378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005379 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 m = PyModule_Create(&_testcapimodule);
5382 if (m == NULL)
5383 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005385 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00005386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005387 Py_TYPE(&test_structmembersType)=&PyType_Type;
5388 Py_INCREF(&test_structmembersType);
5389 /* don't use a name starting with "test", since we don't want
5390 test_capi to automatically call this */
5391 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005392 if (PyType_Ready(&matmulType) < 0)
5393 return NULL;
5394 Py_INCREF(&matmulType);
5395 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005396
Yury Selivanov75445082015-05-11 22:57:16 -04005397 if (PyType_Ready(&awaitType) < 0)
5398 return NULL;
5399 Py_INCREF(&awaitType);
5400 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
5401
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005402 if (PyType_Ready(&GenericAlias_Type) < 0)
5403 return NULL;
5404 Py_INCREF(&GenericAlias_Type);
5405 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
5406
5407 if (PyType_Ready(&Generic_Type) < 0)
5408 return NULL;
5409 Py_INCREF(&Generic_Type);
5410 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
5411
xdegaye56d1f5c2017-10-26 15:09:06 +02005412 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
5413 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
5414 return NULL;
5415 }
5416 Py_INCREF(&PyRecursingInfinitelyError_Type);
5417 PyModule_AddObject(m, "RecursingInfinitelyError",
5418 (PyObject *)&PyRecursingInfinitelyError_Type);
5419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005420 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
5421 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
5422 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
5423 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
5424 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
5425 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
5426 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
5427 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
5428 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
5429 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
5430 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
5431 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
5432 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
5433 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
5434 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
5435 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
5436 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
5437 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
5438 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
5439 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
5440 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
5441 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02005442 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005443 Py_INCREF(&PyInstanceMethod_Type);
5444 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00005445
Larry Hastings2a727912014-01-16 11:32:01 -08005446 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner5d39e042017-11-29 17:20:38 +01005447#ifdef WITH_PYMALLOC
5448 PyModule_AddObject(m, "WITH_PYMALLOC", Py_True);
5449#else
5450 PyModule_AddObject(m, "WITH_PYMALLOC", Py_False);
5451#endif
Larry Hastings2a727912014-01-16 11:32:01 -08005452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005453 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
5454 Py_INCREF(TestError);
5455 PyModule_AddObject(m, "error", TestError);
5456 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005457}