blob: 4933ef3b61c43b61c580d3c4a8992ff27b329d60 [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"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000011#include "datetime.h"
Serhiy Storchakab5181342015-02-06 08:58:56 +020012#include "marshal.h"
Victor Stinnera1c249c2018-11-01 03:15:58 +010013#include "pythread.h"
14#include "structmember.h"
15#include <float.h>
Victor Stinner56e8c292014-07-21 12:30:22 +020016#include <signal.h>
Tim Peters9ea17ac2001-02-02 05:57:15 +000017
Victor Stinner95e9cef2015-03-28 01:26:47 +010018#ifdef MS_WINDOWS
Victor Stinner09e5cf22015-03-30 00:09:18 +020019# include <winsock2.h> /* struct timeval */
Victor Stinner95e9cef2015-03-28 01:26:47 +010020#endif
21
Victor Stinner7b7c6dc2017-08-10 12:37:39 +020022#ifdef HAVE_SYS_WAIT_H
23#include <sys/wait.h> /* For W_STOPCODE */
24#endif
25
Victor Stinner5ed69952018-11-06 15:59:52 +010026#ifdef Py_BUILD_CORE
27# error "_testcapi must test the public Python C API, not CPython internal C API"
28#endif
29
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000031
Tim Peters91621db2001-06-12 20:10:01 +000032/* Raise TestError with test_name + ": " + msg, and return NULL. */
33
34static PyObject *
35raiseTestError(const char* test_name, const char* msg)
36{
Victor Stinner6ced7c42011-03-21 18:15:42 +010037 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000038 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000039}
40
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000041/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000042
43 The ones derived from autoconf on the UNIX-like OSes can be relied
44 upon (in the absence of sloppy cross-compiling), but the Windows
45 platforms have these hardcoded. Better safe than sorry.
46*/
47static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000048sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000050{
Victor Stinner499dfcf2011-03-21 13:26:24 +010051 PyErr_Format(TestError,
52 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000055}
56
57static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053058test_config(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters9ea17ac2001-02-02 05:57:15 +000059{
Tim Peters9ea17ac2001-02-02 05:57:15 +000060#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 if (FATNAME != sizeof(TYPE)) \
62 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 CHECK_SIZEOF(SIZEOF_SHORT, short);
65 CHECK_SIZEOF(SIZEOF_INT, int);
66 CHECK_SIZEOF(SIZEOF_LONG, long);
67 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
68 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Benjamin Petersonaf580df2016-09-06 10:46:49 -070069 CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
Tim Peters9ea17ac2001-02-02 05:57:15 +000070
71#undef CHECK_SIZEOF
72
Serhiy Storchaka228b12e2017-01-23 09:47:21 +020073 Py_RETURN_NONE;
Tim Peters9ea17ac2001-02-02 05:57:15 +000074}
75
Tim Peters5c4d5bf2001-02-12 22:13:26 +000076static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053077test_sizeof_c_types(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner01076552013-10-29 19:39:52 +010078{
Ned Deilye37a1942015-03-05 15:47:10 -080079#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020080#pragma GCC diagnostic push
81#pragma GCC diagnostic ignored "-Wtype-limits"
82#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010083#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010084 if (EXPECTED != sizeof(TYPE)) { \
85 PyErr_Format(TestError, \
86 "sizeof(%s) = %u instead of %u", \
87 #TYPE, sizeof(TYPE), EXPECTED); \
88 return (PyObject*)NULL; \
89 }
Victor Stinnerf866f972013-10-29 19:59:31 +010090#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
91#define CHECK_SIGNNESS(TYPE, SIGNED) \
92 if (IS_SIGNED(TYPE) != SIGNED) { \
93 PyErr_Format(TestError, \
94 "%s signness is, instead of %i", \
95 #TYPE, IS_SIGNED(TYPE), SIGNED); \
96 return (PyObject*)NULL; \
97 }
Victor Stinner01076552013-10-29 19:39:52 +010098
99 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100100 CHECK_SIZEOF(Py_UCS1, 1);
101 CHECK_SIZEOF(Py_UCS2, 2);
102 CHECK_SIZEOF(Py_UCS4, 4);
103 CHECK_SIGNNESS(Py_UCS1, 0);
104 CHECK_SIGNNESS(Py_UCS2, 0);
105 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700106 CHECK_SIZEOF(int32_t, 4);
107 CHECK_SIGNNESS(int32_t, 1);
108 CHECK_SIZEOF(uint32_t, 4);
109 CHECK_SIGNNESS(uint32_t, 0);
110 CHECK_SIZEOF(int64_t, 8);
111 CHECK_SIGNNESS(int64_t, 1);
112 CHECK_SIZEOF(uint64_t, 8);
113 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100114
115 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100116 CHECK_SIZEOF(size_t, sizeof(void *));
117 CHECK_SIGNNESS(size_t, 0);
118 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
119 CHECK_SIGNNESS(Py_ssize_t, 1);
120
Benjamin Petersonca470632016-09-06 13:47:26 -0700121 CHECK_SIZEOF(uintptr_t, sizeof(void *));
122 CHECK_SIGNNESS(uintptr_t, 0);
123 CHECK_SIZEOF(intptr_t, sizeof(void *));
124 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100125
Serhiy Storchakad1302c02017-01-23 10:23:58 +0200126 Py_RETURN_NONE;
Victor Stinner01076552013-10-29 19:39:52 +0100127
Victor Stinnerf866f972013-10-29 19:59:31 +0100128#undef IS_SIGNED
129#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100130#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800131#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200132#pragma GCC diagnostic pop
133#endif
Victor Stinner01076552013-10-29 19:39:52 +0100134}
135
136
137static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530138test_list_api(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 PyObject* list;
141 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000144#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 list = PyList_New(NLIST);
146 if (list == (PyObject*)NULL)
147 return (PyObject*)NULL;
148 /* list = range(NLIST) */
149 for (i = 0; i < NLIST; ++i) {
150 PyObject* anint = PyLong_FromLong(i);
151 if (anint == (PyObject*)NULL) {
152 Py_DECREF(list);
153 return (PyObject*)NULL;
154 }
155 PyList_SET_ITEM(list, i, anint);
156 }
157 /* list.reverse(), via PyList_Reverse() */
158 i = PyList_Reverse(list); /* should not blow up! */
159 if (i != 0) {
160 Py_DECREF(list);
161 return (PyObject*)NULL;
162 }
163 /* Check that list == range(29, -1, -1) now */
164 for (i = 0; i < NLIST; ++i) {
165 PyObject* anint = PyList_GET_ITEM(list, i);
166 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
167 PyErr_SetString(TestError,
168 "test_list_api: reverse screwed up");
169 Py_DECREF(list);
170 return (PyObject*)NULL;
171 }
172 }
173 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000174#undef NLIST
175
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200176 Py_RETURN_NONE;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000177}
178
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000179static int
180test_dict_inner(int count)
181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 Py_ssize_t pos = 0, iterations = 0;
183 int i;
184 PyObject *dict = PyDict_New();
185 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 if (dict == NULL)
188 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 for (i = 0; i < count; i++) {
191 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200192 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200193 return -1;
194 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200195 if (PyDict_SetItem(dict, v, v) < 0) {
196 Py_DECREF(v);
197 return -1;
198 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 Py_DECREF(v);
200 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 while (PyDict_Next(dict, &pos, &k, &v)) {
203 PyObject *o;
204 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 i = PyLong_AS_LONG(v) + 1;
207 o = PyLong_FromLong(i);
208 if (o == NULL)
209 return -1;
210 if (PyDict_SetItem(dict, k, o) < 0) {
211 Py_DECREF(o);
212 return -1;
213 }
214 Py_DECREF(o);
215 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000219 if (iterations != count) {
220 PyErr_SetString(
221 TestError,
222 "test_dict_iteration: dict iteration went wrong ");
223 return -1;
224 } else {
225 return 0;
226 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000227}
228
229static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530230test_dict_iteration(PyObject* self, PyObject *Py_UNUSED(ignored))
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 for (i = 0; i < 200; i++) {
235 if (test_dict_inner(i) < 0) {
236 return NULL;
237 }
238 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000239
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200240 Py_RETURN_NONE;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000241}
242
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200243static PyObject*
244dict_getitem_knownhash(PyObject *self, PyObject *args)
245{
246 PyObject *mp, *key, *result;
247 Py_ssize_t hash;
248
249 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
250 &mp, &key, &hash)) {
251 return NULL;
252 }
253
254 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
255 if (result == NULL && !PyErr_Occurred()) {
256 _PyErr_SetKeyError(key);
257 return NULL;
258 }
259
260 Py_XINCREF(result);
261 return result;
262}
Tim Peters91621db2001-06-12 20:10:01 +0000263
Victor Stinner3d3f2642016-12-15 17:21:23 +0100264static PyObject*
265dict_hassplittable(PyObject *self, PyObject *arg)
266{
267 if (!PyDict_Check(arg)) {
268 PyErr_Format(PyExc_TypeError,
269 "dict_hassplittable() argument must be dict, not '%s'",
270 arg->ob_type->tp_name);
271 return NULL;
272 }
273
274 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
275}
276
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000277/* Issue #4701: Check that PyObject_Hash implicitly calls
278 * PyType_Ready if it hasn't already been called
279 */
280static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 PyVarObject_HEAD_INIT(NULL, 0)
282 "hashinheritancetester", /* Name of this type */
283 sizeof(PyObject), /* Basic object size */
284 0, /* Item size for varobject */
285 (destructor)PyObject_Del, /* tp_dealloc */
286 0, /* tp_print */
287 0, /* tp_getattr */
288 0, /* tp_setattr */
289 0, /* tp_reserved */
290 0, /* tp_repr */
291 0, /* tp_as_number */
292 0, /* tp_as_sequence */
293 0, /* tp_as_mapping */
294 0, /* tp_hash */
295 0, /* tp_call */
296 0, /* tp_str */
297 PyObject_GenericGetAttr, /* tp_getattro */
298 0, /* tp_setattro */
299 0, /* tp_as_buffer */
300 Py_TPFLAGS_DEFAULT, /* tp_flags */
301 0, /* tp_doc */
302 0, /* tp_traverse */
303 0, /* tp_clear */
304 0, /* tp_richcompare */
305 0, /* tp_weaklistoffset */
306 0, /* tp_iter */
307 0, /* tp_iternext */
308 0, /* tp_methods */
309 0, /* tp_members */
310 0, /* tp_getset */
311 0, /* tp_base */
312 0, /* tp_dict */
313 0, /* tp_descr_get */
314 0, /* tp_descr_set */
315 0, /* tp_dictoffset */
316 0, /* tp_init */
317 0, /* tp_alloc */
318 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000319};
320
321static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530322test_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 PyTypeObject *type;
325 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000326 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 if (type->tp_dict != NULL)
331 /* The type has already been initialized. This probably means
332 -R is being used. */
333 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000334
335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 obj = PyObject_New(PyObject, type);
337 if (obj == NULL) {
338 PyErr_Clear();
339 PyErr_SetString(
340 TestError,
341 "test_lazy_hash_inheritance: failed to create object");
342 return NULL;
343 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 if (type->tp_dict != NULL) {
346 PyErr_SetString(
347 TestError,
348 "test_lazy_hash_inheritance: type initialised too soon");
349 Py_DECREF(obj);
350 return NULL;
351 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 hash = PyObject_Hash(obj);
354 if ((hash == -1) && PyErr_Occurred()) {
355 PyErr_Clear();
356 PyErr_SetString(
357 TestError,
358 "test_lazy_hash_inheritance: could not hash object");
359 Py_DECREF(obj);
360 return NULL;
361 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 if (type->tp_dict == NULL) {
364 PyErr_SetString(
365 TestError,
366 "test_lazy_hash_inheritance: type not initialised by hash()");
367 Py_DECREF(obj);
368 return NULL;
369 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 if (type->tp_hash != PyType_Type.tp_hash) {
372 PyErr_SetString(
373 TestError,
374 "test_lazy_hash_inheritance: unexpected hash function");
375 Py_DECREF(obj);
376 return NULL;
377 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000382}
383
384
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700385/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000386 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000387
388 Note that the meat of the test is contained in testcapi_long.h.
389 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700390 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000391 dependence on type names makes it impossible to use a parameterized
392 function. A giant macro would be even worse than this. A C++ template
393 would be perfect.
394
395 The "report an error" functions are deliberately not part of the #include
396 file: if the test fails, you can set a breakpoint in the appropriate
397 error function directly, and crawl back from there in the debugger.
398*/
399
400#define UNBIND(X) Py_DECREF(X); (X) = NULL
401
402static PyObject *
403raise_test_long_error(const char* msg)
404{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000406}
407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408#define TESTNAME test_long_api_inner
409#define TYPENAME long
410#define F_S_TO_PY PyLong_FromLong
411#define F_PY_TO_S PyLong_AsLong
412#define F_U_TO_PY PyLong_FromUnsignedLong
413#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000414
415#include "testcapi_long.h"
416
417static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530418test_long_api(PyObject* self, PyObject *Py_UNUSED(ignored))
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000421}
422
423#undef TESTNAME
424#undef TYPENAME
425#undef F_S_TO_PY
426#undef F_PY_TO_S
427#undef F_U_TO_PY
428#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000429
Tim Peters91621db2001-06-12 20:10:01 +0000430static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000431raise_test_longlong_error(const char* msg)
432{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000434}
435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700437#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438#define F_S_TO_PY PyLong_FromLongLong
439#define F_PY_TO_S PyLong_AsLongLong
440#define F_U_TO_PY PyLong_FromUnsignedLongLong
441#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000442
443#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000444
445static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000446test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000449}
450
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000451#undef TESTNAME
452#undef TYPENAME
453#undef F_S_TO_PY
454#undef F_PY_TO_S
455#undef F_U_TO_PY
456#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000457
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000458/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
459 is tested by test_long_api_inner. This test will concentrate on proper
460 handling of overflow.
461*/
462
463static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530464test_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000465{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 PyObject *num, *one, *temp;
467 long value;
468 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 /* Test that overflow is set properly for a large value. */
471 /* num is a number larger than LONG_MAX even on 64-bit platforms */
472 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
473 if (num == NULL)
474 return NULL;
475 overflow = 1234;
476 value = PyLong_AsLongAndOverflow(num, &overflow);
477 Py_DECREF(num);
478 if (value == -1 && PyErr_Occurred())
479 return NULL;
480 if (value != -1)
481 return raiseTestError("test_long_and_overflow",
482 "return value was not set to -1");
483 if (overflow != 1)
484 return raiseTestError("test_long_and_overflow",
485 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 /* Same again, with num = LONG_MAX + 1 */
488 num = PyLong_FromLong(LONG_MAX);
489 if (num == NULL)
490 return NULL;
491 one = PyLong_FromLong(1L);
492 if (one == NULL) {
493 Py_DECREF(num);
494 return NULL;
495 }
496 temp = PyNumber_Add(num, one);
497 Py_DECREF(one);
498 Py_DECREF(num);
499 num = temp;
500 if (num == NULL)
501 return NULL;
502 overflow = 0;
503 value = PyLong_AsLongAndOverflow(num, &overflow);
504 Py_DECREF(num);
505 if (value == -1 && PyErr_Occurred())
506 return NULL;
507 if (value != -1)
508 return raiseTestError("test_long_and_overflow",
509 "return value was not set to -1");
510 if (overflow != 1)
511 return raiseTestError("test_long_and_overflow",
512 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 /* Test that overflow is set properly for a large negative value. */
515 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
516 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
517 if (num == NULL)
518 return NULL;
519 overflow = 1234;
520 value = PyLong_AsLongAndOverflow(num, &overflow);
521 Py_DECREF(num);
522 if (value == -1 && PyErr_Occurred())
523 return NULL;
524 if (value != -1)
525 return raiseTestError("test_long_and_overflow",
526 "return value was not set to -1");
527 if (overflow != -1)
528 return raiseTestError("test_long_and_overflow",
529 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 /* Same again, with num = LONG_MIN - 1 */
532 num = PyLong_FromLong(LONG_MIN);
533 if (num == NULL)
534 return NULL;
535 one = PyLong_FromLong(1L);
536 if (one == NULL) {
537 Py_DECREF(num);
538 return NULL;
539 }
540 temp = PyNumber_Subtract(num, one);
541 Py_DECREF(one);
542 Py_DECREF(num);
543 num = temp;
544 if (num == NULL)
545 return NULL;
546 overflow = 0;
547 value = PyLong_AsLongAndOverflow(num, &overflow);
548 Py_DECREF(num);
549 if (value == -1 && PyErr_Occurred())
550 return NULL;
551 if (value != -1)
552 return raiseTestError("test_long_and_overflow",
553 "return value was not set to -1");
554 if (overflow != -1)
555 return raiseTestError("test_long_and_overflow",
556 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 /* Test that overflow is cleared properly for small values. */
559 num = PyLong_FromString("FF", NULL, 16);
560 if (num == NULL)
561 return NULL;
562 overflow = 1234;
563 value = PyLong_AsLongAndOverflow(num, &overflow);
564 Py_DECREF(num);
565 if (value == -1 && PyErr_Occurred())
566 return NULL;
567 if (value != 0xFF)
568 return raiseTestError("test_long_and_overflow",
569 "expected return value 0xFF");
570 if (overflow != 0)
571 return raiseTestError("test_long_and_overflow",
572 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 num = PyLong_FromString("-FF", NULL, 16);
575 if (num == NULL)
576 return NULL;
577 overflow = 0;
578 value = PyLong_AsLongAndOverflow(num, &overflow);
579 Py_DECREF(num);
580 if (value == -1 && PyErr_Occurred())
581 return NULL;
582 if (value != -0xFF)
583 return raiseTestError("test_long_and_overflow",
584 "expected return value 0xFF");
585 if (overflow != 0)
586 return raiseTestError("test_long_and_overflow",
587 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 num = PyLong_FromLong(LONG_MAX);
590 if (num == NULL)
591 return NULL;
592 overflow = 1234;
593 value = PyLong_AsLongAndOverflow(num, &overflow);
594 Py_DECREF(num);
595 if (value == -1 && PyErr_Occurred())
596 return NULL;
597 if (value != LONG_MAX)
598 return raiseTestError("test_long_and_overflow",
599 "expected return value LONG_MAX");
600 if (overflow != 0)
601 return raiseTestError("test_long_and_overflow",
602 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 num = PyLong_FromLong(LONG_MIN);
605 if (num == NULL)
606 return NULL;
607 overflow = 0;
608 value = PyLong_AsLongAndOverflow(num, &overflow);
609 Py_DECREF(num);
610 if (value == -1 && PyErr_Occurred())
611 return NULL;
612 if (value != LONG_MIN)
613 return raiseTestError("test_long_and_overflow",
614 "expected return value LONG_MIN");
615 if (overflow != 0)
616 return raiseTestError("test_long_and_overflow",
617 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000618
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200619 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000620}
621
Mark Dickinson93f562c2010-01-30 10:30:15 +0000622/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700623 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000624 concentrate on proper handling of overflow.
625*/
626
627static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530628test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson93f562c2010-01-30 10:30:15 +0000629{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700631 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 /* Test that overflow is set properly for a large value. */
635 /* num is a number larger than PY_LLONG_MAX on a typical machine. */
636 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
637 if (num == NULL)
638 return NULL;
639 overflow = 1234;
640 value = PyLong_AsLongLongAndOverflow(num, &overflow);
641 Py_DECREF(num);
642 if (value == -1 && PyErr_Occurred())
643 return NULL;
644 if (value != -1)
645 return raiseTestError("test_long_long_and_overflow",
646 "return value was not set to -1");
647 if (overflow != 1)
648 return raiseTestError("test_long_long_and_overflow",
649 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 /* Same again, with num = PY_LLONG_MAX + 1 */
652 num = PyLong_FromLongLong(PY_LLONG_MAX);
653 if (num == NULL)
654 return NULL;
655 one = PyLong_FromLong(1L);
656 if (one == NULL) {
657 Py_DECREF(num);
658 return NULL;
659 }
660 temp = PyNumber_Add(num, one);
661 Py_DECREF(one);
662 Py_DECREF(num);
663 num = temp;
664 if (num == NULL)
665 return NULL;
666 overflow = 0;
667 value = PyLong_AsLongLongAndOverflow(num, &overflow);
668 Py_DECREF(num);
669 if (value == -1 && PyErr_Occurred())
670 return NULL;
671 if (value != -1)
672 return raiseTestError("test_long_long_and_overflow",
673 "return value was not set to -1");
674 if (overflow != 1)
675 return raiseTestError("test_long_long_and_overflow",
676 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 /* Test that overflow is set properly for a large negative value. */
679 /* num is a number smaller than PY_LLONG_MIN on a typical platform */
680 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
681 if (num == NULL)
682 return NULL;
683 overflow = 1234;
684 value = PyLong_AsLongLongAndOverflow(num, &overflow);
685 Py_DECREF(num);
686 if (value == -1 && PyErr_Occurred())
687 return NULL;
688 if (value != -1)
689 return raiseTestError("test_long_long_and_overflow",
690 "return value was not set to -1");
691 if (overflow != -1)
692 return raiseTestError("test_long_long_and_overflow",
693 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 /* Same again, with num = PY_LLONG_MIN - 1 */
696 num = PyLong_FromLongLong(PY_LLONG_MIN);
697 if (num == NULL)
698 return NULL;
699 one = PyLong_FromLong(1L);
700 if (one == NULL) {
701 Py_DECREF(num);
702 return NULL;
703 }
704 temp = PyNumber_Subtract(num, one);
705 Py_DECREF(one);
706 Py_DECREF(num);
707 num = temp;
708 if (num == NULL)
709 return NULL;
710 overflow = 0;
711 value = PyLong_AsLongLongAndOverflow(num, &overflow);
712 Py_DECREF(num);
713 if (value == -1 && PyErr_Occurred())
714 return NULL;
715 if (value != -1)
716 return raiseTestError("test_long_long_and_overflow",
717 "return value was not set to -1");
718 if (overflow != -1)
719 return raiseTestError("test_long_long_and_overflow",
720 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 /* Test that overflow is cleared properly for small values. */
723 num = PyLong_FromString("FF", NULL, 16);
724 if (num == NULL)
725 return NULL;
726 overflow = 1234;
727 value = PyLong_AsLongLongAndOverflow(num, &overflow);
728 Py_DECREF(num);
729 if (value == -1 && PyErr_Occurred())
730 return NULL;
731 if (value != 0xFF)
732 return raiseTestError("test_long_long_and_overflow",
733 "expected return value 0xFF");
734 if (overflow != 0)
735 return raiseTestError("test_long_long_and_overflow",
736 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 num = PyLong_FromString("-FF", NULL, 16);
739 if (num == NULL)
740 return NULL;
741 overflow = 0;
742 value = PyLong_AsLongLongAndOverflow(num, &overflow);
743 Py_DECREF(num);
744 if (value == -1 && PyErr_Occurred())
745 return NULL;
746 if (value != -0xFF)
747 return raiseTestError("test_long_long_and_overflow",
748 "expected return value 0xFF");
749 if (overflow != 0)
750 return raiseTestError("test_long_long_and_overflow",
751 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 num = PyLong_FromLongLong(PY_LLONG_MAX);
754 if (num == NULL)
755 return NULL;
756 overflow = 1234;
757 value = PyLong_AsLongLongAndOverflow(num, &overflow);
758 Py_DECREF(num);
759 if (value == -1 && PyErr_Occurred())
760 return NULL;
761 if (value != PY_LLONG_MAX)
762 return raiseTestError("test_long_long_and_overflow",
763 "expected return value PY_LLONG_MAX");
764 if (overflow != 0)
765 return raiseTestError("test_long_long_and_overflow",
766 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 num = PyLong_FromLongLong(PY_LLONG_MIN);
769 if (num == NULL)
770 return NULL;
771 overflow = 0;
772 value = PyLong_AsLongLongAndOverflow(num, &overflow);
773 Py_DECREF(num);
774 if (value == -1 && PyErr_Occurred())
775 return NULL;
776 if (value != PY_LLONG_MIN)
777 return raiseTestError("test_long_long_and_overflow",
778 "expected return value PY_LLONG_MIN");
779 if (overflow != 0)
780 return raiseTestError("test_long_long_and_overflow",
781 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000782
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200783 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000784}
785
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200786/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
787 non-integer arguments are handled correctly. It should be extended to
788 test overflow handling.
789 */
790
791static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530792test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200793{
794 size_t out_u;
795 Py_ssize_t out_s;
796
797 Py_INCREF(Py_None);
798
799 out_u = PyLong_AsSize_t(Py_None);
800 if (out_u != (size_t)-1 || !PyErr_Occurred())
801 return raiseTestError("test_long_as_size_t",
802 "PyLong_AsSize_t(None) didn't complain");
803 if (!PyErr_ExceptionMatches(PyExc_TypeError))
804 return raiseTestError("test_long_as_size_t",
805 "PyLong_AsSize_t(None) raised "
806 "something other than TypeError");
807 PyErr_Clear();
808
809 out_s = PyLong_AsSsize_t(Py_None);
810 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
811 return raiseTestError("test_long_as_size_t",
812 "PyLong_AsSsize_t(None) didn't complain");
813 if (!PyErr_ExceptionMatches(PyExc_TypeError))
814 return raiseTestError("test_long_as_size_t",
815 "PyLong_AsSsize_t(None) raised "
816 "something other than TypeError");
817 PyErr_Clear();
818
819 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
820 return Py_None;
821}
822
823/* Test the PyLong_AsDouble API. At present this just tests that
824 non-integer arguments are handled correctly.
825 */
826
827static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530828test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200829{
830 double out;
831
832 Py_INCREF(Py_None);
833
834 out = PyLong_AsDouble(Py_None);
835 if (out != -1.0 || !PyErr_Occurred())
836 return raiseTestError("test_long_as_double",
837 "PyLong_AsDouble(None) didn't complain");
838 if (!PyErr_ExceptionMatches(PyExc_TypeError))
839 return raiseTestError("test_long_as_double",
840 "PyLong_AsDouble(None) raised "
841 "something other than TypeError");
842 PyErr_Clear();
843
844 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
845 return Py_None;
846}
847
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700848/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000849 for both long and int arguments. The test may leak a little memory if
850 it fails.
851*/
852static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530853test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersd38b1c72001-09-30 05:09:37 +0000854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700856 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 tuple = PyTuple_New(1);
859 if (tuple == NULL)
860 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 num = PyLong_FromLong(42);
863 if (num == NULL)
864 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300869 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300871 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 if (value != 42)
873 return raiseTestError("test_L_code",
874 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 Py_DECREF(num);
877 num = PyLong_FromLong(42);
878 if (num == NULL)
879 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300884 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300886 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 if (value != 42)
888 return raiseTestError("test_L_code",
889 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200892 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000893}
894
Serhiy Storchakace412872016-05-08 23:36:44 +0300895static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300896return_none(void *unused)
897{
898 Py_RETURN_NONE;
899}
900
901static PyObject *
902raise_error(void *unused)
903{
904 PyErr_SetNone(PyExc_ValueError);
905 return NULL;
906}
907
908static int
909test_buildvalue_N_error(const char *fmt)
910{
911 PyObject *arg, *res;
912
913 arg = PyList_New(0);
914 if (arg == NULL) {
915 return -1;
916 }
917
918 Py_INCREF(arg);
919 res = Py_BuildValue(fmt, return_none, NULL, arg);
920 if (res == NULL) {
921 return -1;
922 }
923 Py_DECREF(res);
924 if (Py_REFCNT(arg) != 1) {
925 PyErr_Format(TestError, "test_buildvalue_N: "
926 "arg was not decrefed in successful "
927 "Py_BuildValue(\"%s\")", fmt);
928 return -1;
929 }
930
931 Py_INCREF(arg);
932 res = Py_BuildValue(fmt, raise_error, NULL, arg);
933 if (res != NULL || !PyErr_Occurred()) {
934 PyErr_Format(TestError, "test_buildvalue_N: "
935 "Py_BuildValue(\"%s\") didn't complain", fmt);
936 return -1;
937 }
938 PyErr_Clear();
939 if (Py_REFCNT(arg) != 1) {
940 PyErr_Format(TestError, "test_buildvalue_N: "
941 "arg was not decrefed in failed "
942 "Py_BuildValue(\"%s\")", fmt);
943 return -1;
944 }
945 Py_DECREF(arg);
946 return 0;
947}
948
949static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +0200950test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300951{
952 PyObject *arg, *res;
953
954 arg = PyList_New(0);
955 if (arg == NULL) {
956 return NULL;
957 }
958 Py_INCREF(arg);
959 res = Py_BuildValue("N", arg);
960 if (res == NULL) {
961 return NULL;
962 }
963 if (res != arg) {
964 return raiseTestError("test_buildvalue_N",
965 "Py_BuildValue(\"N\") returned wrong result");
966 }
967 if (Py_REFCNT(arg) != 2) {
968 return raiseTestError("test_buildvalue_N",
969 "arg was not decrefed in Py_BuildValue(\"N\")");
970 }
971 Py_DECREF(res);
972 Py_DECREF(arg);
973
974 if (test_buildvalue_N_error("O&N") < 0)
975 return NULL;
976 if (test_buildvalue_N_error("(O&N)") < 0)
977 return NULL;
978 if (test_buildvalue_N_error("[O&N]") < 0)
979 return NULL;
980 if (test_buildvalue_N_error("{O&N}") < 0)
981 return NULL;
982 if (test_buildvalue_N_error("{()O&(())N}") < 0)
983 return NULL;
984
985 Py_RETURN_NONE;
986}
987
988
989static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +0300990get_args(PyObject *self, PyObject *args)
991{
992 if (args == NULL) {
993 args = Py_None;
994 }
995 Py_INCREF(args);
996 return args;
997}
998
999static PyObject *
1000get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1001{
1002 if (kwargs == NULL) {
1003 kwargs = Py_None;
1004 }
1005 Py_INCREF(kwargs);
1006 return kwargs;
1007}
1008
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001009/* Test tuple argument processing */
1010static PyObject *
1011getargs_tuple(PyObject *self, PyObject *args)
1012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 int a, b, c;
1014 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1015 return NULL;
1016 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001017}
1018
Christian Heimes380f7f22008-02-28 11:19:05 +00001019/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001020static PyObject *
1021getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001024 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1028 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1029 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1030 return NULL;
1031 return Py_BuildValue("iiiiiiiiii",
1032 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1033 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001034}
1035
Larry Hastings83a9f482012-03-20 20:06:16 +00001036/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1037static PyObject *
1038getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1039{
1040 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1041 int required = -1;
1042 int optional = -1;
1043 int keyword_only = -1;
1044
1045 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1046 &required, &optional, &keyword_only))
1047 return NULL;
1048 return Py_BuildValue("iii", required, optional, keyword_only);
1049}
1050
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001051/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1052static PyObject *
1053getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1054{
1055 static char *keywords[] = {"", "", "keyword", NULL};
1056 int required = -1;
1057 int optional = -1;
1058 int keyword = -1;
1059
1060 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1061 &required, &optional, &keyword))
1062 return NULL;
1063 return Py_BuildValue("iii", required, optional, keyword);
1064}
1065
Thomas Heller3457e4b2003-04-24 16:14:27 +00001066/* Functions to call PyArg_ParseTuple with integer format codes,
1067 and return the result.
1068*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001069static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001070getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001071{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 unsigned char value;
1073 if (!PyArg_ParseTuple(args, "b", &value))
1074 return NULL;
1075 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001076}
1077
Thomas Heller3457e4b2003-04-24 16:14:27 +00001078static PyObject *
1079getargs_B(PyObject *self, PyObject *args)
1080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 unsigned char value;
1082 if (!PyArg_ParseTuple(args, "B", &value))
1083 return NULL;
1084 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001085}
1086
1087static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001088getargs_h(PyObject *self, PyObject *args)
1089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 short value;
1091 if (!PyArg_ParseTuple(args, "h", &value))
1092 return NULL;
1093 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001094}
1095
1096static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001097getargs_H(PyObject *self, PyObject *args)
1098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 unsigned short value;
1100 if (!PyArg_ParseTuple(args, "H", &value))
1101 return NULL;
1102 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001103}
1104
1105static PyObject *
1106getargs_I(PyObject *self, PyObject *args)
1107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 unsigned int value;
1109 if (!PyArg_ParseTuple(args, "I", &value))
1110 return NULL;
1111 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001112}
1113
1114static PyObject *
1115getargs_k(PyObject *self, PyObject *args)
1116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 unsigned long value;
1118 if (!PyArg_ParseTuple(args, "k", &value))
1119 return NULL;
1120 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001121}
1122
1123static PyObject *
1124getargs_i(PyObject *self, PyObject *args)
1125{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 int value;
1127 if (!PyArg_ParseTuple(args, "i", &value))
1128 return NULL;
1129 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001130}
1131
Thomas Hellera4ea6032003-04-17 18:55:45 +00001132static PyObject *
1133getargs_l(PyObject *self, PyObject *args)
1134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 long value;
1136 if (!PyArg_ParseTuple(args, "l", &value))
1137 return NULL;
1138 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001139}
1140
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001141static PyObject *
1142getargs_n(PyObject *self, PyObject *args)
1143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 Py_ssize_t value;
1145 if (!PyArg_ParseTuple(args, "n", &value))
1146 return NULL;
1147 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001148}
1149
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001150static PyObject *
1151getargs_p(PyObject *self, PyObject *args)
1152{
1153 int value;
1154 if (!PyArg_ParseTuple(args, "p", &value))
1155 return NULL;
1156 return PyLong_FromLong(value);
1157}
1158
Thomas Hellera4ea6032003-04-17 18:55:45 +00001159static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001160getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001161{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001162 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 if (!PyArg_ParseTuple(args, "L", &value))
1164 return NULL;
1165 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001166}
1167
Thomas Hellera4ea6032003-04-17 18:55:45 +00001168static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001169getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001170{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001171 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 if (!PyArg_ParseTuple(args, "K", &value))
1173 return NULL;
1174 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001175}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001176
1177/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001178 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001179static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301180test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 PyObject *tuple, *num;
1183 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 tuple = PyTuple_New(1);
1186 if (tuple == NULL)
1187 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 /* a number larger than ULONG_MAX even on 64-bit platforms */
1190 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1191 if (num == NULL)
1192 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 value = PyLong_AsUnsignedLongMask(num);
1195 if (value != ULONG_MAX)
1196 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001197 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001202 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001204 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 if (value != ULONG_MAX)
1206 return raiseTestError("test_k_code",
1207 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 Py_DECREF(num);
1210 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1211 if (num == NULL)
1212 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 value = PyLong_AsUnsignedLongMask(num);
1215 if (value != (unsigned long)-0x42)
1216 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001217 "PyLong_AsUnsignedLongMask() returned wrong "
1218 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001223 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001225 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 if (value != (unsigned long)-0x42)
1227 return raiseTestError("test_k_code",
1228 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001231 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001232}
1233
Victor Stinner06e49dd2010-06-13 18:21:50 +00001234static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001235getargs_f(PyObject *self, PyObject *args)
1236{
1237 float f;
1238 if (!PyArg_ParseTuple(args, "f", &f))
1239 return NULL;
1240 return PyFloat_FromDouble(f);
1241}
1242
1243static PyObject *
1244getargs_d(PyObject *self, PyObject *args)
1245{
1246 double d;
1247 if (!PyArg_ParseTuple(args, "d", &d))
1248 return NULL;
1249 return PyFloat_FromDouble(d);
1250}
1251
1252static PyObject *
1253getargs_D(PyObject *self, PyObject *args)
1254{
1255 Py_complex cval;
1256 if (!PyArg_ParseTuple(args, "D", &cval))
1257 return NULL;
1258 return PyComplex_FromCComplex(cval);
1259}
1260
1261static PyObject *
1262getargs_S(PyObject *self, PyObject *args)
1263{
1264 PyObject *obj;
1265 if (!PyArg_ParseTuple(args, "S", &obj))
1266 return NULL;
1267 Py_INCREF(obj);
1268 return obj;
1269}
1270
1271static PyObject *
1272getargs_Y(PyObject *self, PyObject *args)
1273{
1274 PyObject *obj;
1275 if (!PyArg_ParseTuple(args, "Y", &obj))
1276 return NULL;
1277 Py_INCREF(obj);
1278 return obj;
1279}
1280
1281static PyObject *
1282getargs_U(PyObject *self, PyObject *args)
1283{
1284 PyObject *obj;
1285 if (!PyArg_ParseTuple(args, "U", &obj))
1286 return NULL;
1287 Py_INCREF(obj);
1288 return obj;
1289}
1290
1291static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001292getargs_c(PyObject *self, PyObject *args)
1293{
1294 char c;
1295 if (!PyArg_ParseTuple(args, "c", &c))
1296 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001297 return PyLong_FromLong((unsigned char)c);
1298}
1299
1300static PyObject *
1301getargs_C(PyObject *self, PyObject *args)
1302{
1303 int c;
1304 if (!PyArg_ParseTuple(args, "C", &c))
1305 return NULL;
1306 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001307}
1308
1309static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001310getargs_s(PyObject *self, PyObject *args)
1311{
1312 char *str;
1313 if (!PyArg_ParseTuple(args, "s", &str))
1314 return NULL;
1315 return PyBytes_FromString(str);
1316}
1317
1318static PyObject *
1319getargs_s_star(PyObject *self, PyObject *args)
1320{
1321 Py_buffer buffer;
1322 PyObject *bytes;
1323 if (!PyArg_ParseTuple(args, "s*", &buffer))
1324 return NULL;
1325 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1326 PyBuffer_Release(&buffer);
1327 return bytes;
1328}
1329
1330static PyObject *
1331getargs_s_hash(PyObject *self, PyObject *args)
1332{
1333 char *str;
1334 Py_ssize_t size;
1335 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1336 return NULL;
1337 return PyBytes_FromStringAndSize(str, size);
1338}
1339
1340static PyObject *
1341getargs_z(PyObject *self, PyObject *args)
1342{
1343 char *str;
1344 if (!PyArg_ParseTuple(args, "z", &str))
1345 return NULL;
1346 if (str != NULL)
1347 return PyBytes_FromString(str);
1348 else
1349 Py_RETURN_NONE;
1350}
1351
1352static PyObject *
1353getargs_z_star(PyObject *self, PyObject *args)
1354{
1355 Py_buffer buffer;
1356 PyObject *bytes;
1357 if (!PyArg_ParseTuple(args, "z*", &buffer))
1358 return NULL;
1359 if (buffer.buf != NULL)
1360 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1361 else {
1362 Py_INCREF(Py_None);
1363 bytes = Py_None;
1364 }
1365 PyBuffer_Release(&buffer);
1366 return bytes;
1367}
1368
1369static PyObject *
1370getargs_z_hash(PyObject *self, PyObject *args)
1371{
1372 char *str;
1373 Py_ssize_t size;
1374 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1375 return NULL;
1376 if (str != NULL)
1377 return PyBytes_FromStringAndSize(str, size);
1378 else
1379 Py_RETURN_NONE;
1380}
1381
1382static PyObject *
1383getargs_y(PyObject *self, PyObject *args)
1384{
1385 char *str;
1386 if (!PyArg_ParseTuple(args, "y", &str))
1387 return NULL;
1388 return PyBytes_FromString(str);
1389}
1390
1391static PyObject *
1392getargs_y_star(PyObject *self, PyObject *args)
1393{
1394 Py_buffer buffer;
1395 PyObject *bytes;
1396 if (!PyArg_ParseTuple(args, "y*", &buffer))
1397 return NULL;
1398 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1399 PyBuffer_Release(&buffer);
1400 return bytes;
1401}
1402
1403static PyObject *
1404getargs_y_hash(PyObject *self, PyObject *args)
1405{
1406 char *str;
1407 Py_ssize_t size;
1408 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1409 return NULL;
1410 return PyBytes_FromStringAndSize(str, size);
1411}
1412
1413static PyObject *
1414getargs_u(PyObject *self, PyObject *args)
1415{
1416 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001417 if (!PyArg_ParseTuple(args, "u", &str))
1418 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001419 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001420}
1421
1422static PyObject *
1423getargs_u_hash(PyObject *self, PyObject *args)
1424{
1425 Py_UNICODE *str;
1426 Py_ssize_t size;
1427 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1428 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001429 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001430}
1431
1432static PyObject *
1433getargs_Z(PyObject *self, PyObject *args)
1434{
1435 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001436 if (!PyArg_ParseTuple(args, "Z", &str))
1437 return NULL;
1438 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001439 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001440 } else
1441 Py_RETURN_NONE;
1442}
1443
1444static PyObject *
1445getargs_Z_hash(PyObject *self, PyObject *args)
1446{
1447 Py_UNICODE *str;
1448 Py_ssize_t size;
1449 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1450 return NULL;
1451 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001452 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001453 else
1454 Py_RETURN_NONE;
1455}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001456
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001457static PyObject *
1458getargs_es(PyObject *self, PyObject *args)
1459{
1460 PyObject *arg, *result;
1461 const char *encoding = NULL;
1462 char *str;
1463
1464 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1465 return NULL;
1466 if (!PyArg_Parse(arg, "es", encoding, &str))
1467 return NULL;
1468 result = PyBytes_FromString(str);
1469 PyMem_Free(str);
1470 return result;
1471}
1472
1473static PyObject *
1474getargs_et(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, "et", encoding, &str))
1483 return NULL;
1484 result = PyBytes_FromString(str);
1485 PyMem_Free(str);
1486 return result;
1487}
1488
1489static PyObject *
1490getargs_es_hash(PyObject *self, PyObject *args)
1491{
1492 PyObject *arg, *result;
1493 const char *encoding = NULL;
1494 PyByteArrayObject *buffer = NULL;
1495 char *str = NULL;
1496 Py_ssize_t size;
1497
1498 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1499 return NULL;
1500 if (buffer != NULL) {
1501 str = PyByteArray_AS_STRING(buffer);
1502 size = PyByteArray_GET_SIZE(buffer);
1503 }
1504 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1505 return NULL;
1506 result = PyBytes_FromStringAndSize(str, size);
1507 if (buffer == NULL)
1508 PyMem_Free(str);
1509 return result;
1510}
1511
1512static PyObject *
1513getargs_et_hash(PyObject *self, PyObject *args)
1514{
1515 PyObject *arg, *result;
1516 const char *encoding = NULL;
1517 PyByteArrayObject *buffer = NULL;
1518 char *str = NULL;
1519 Py_ssize_t size;
1520
1521 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1522 return NULL;
1523 if (buffer != NULL) {
1524 str = PyByteArray_AS_STRING(buffer);
1525 size = PyByteArray_GET_SIZE(buffer);
1526 }
1527 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1528 return NULL;
1529 result = PyBytes_FromStringAndSize(str, size);
1530 if (buffer == NULL)
1531 PyMem_Free(str);
1532 return result;
1533}
1534
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001535/* Test the s and z codes for PyArg_ParseTuple.
1536*/
1537static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301538test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001539{
1540 /* Unicode strings should be accepted */
1541 PyObject *tuple, *obj;
1542 char *value;
1543
1544 tuple = PyTuple_New(1);
1545 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001547
1548 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001550 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001552
1553 PyTuple_SET_ITEM(tuple, 0, obj);
1554
1555 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001557 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001558 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1559 return NULL;
1560 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001561
Oren Milmanba7d7362017-08-29 11:58:27 +03001562 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1563 return NULL;
1564 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001565
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001566 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001567 Py_RETURN_NONE;
1568}
1569
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001570static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001571parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001572{
Larry Hastings8f904da2012-06-22 03:56:29 -07001573 PyObject *sub_args;
1574 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001575 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001576 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001577
Larry Hastings8f904da2012-06-22 03:56:29 -07001578 Py_ssize_t i, size;
1579 char *keywords[8 + 1]; /* space for NULL at end */
1580 PyObject *o;
1581 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001582
Larry Hastings8f904da2012-06-22 03:56:29 -07001583 int result;
1584 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001585
Larry Hastings22701e82012-08-08 14:52:22 -07001586 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001587
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001588 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001589 &sub_args, &sub_kwargs,
1590 &sub_format, &sub_keywords))
1591 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001592
Larry Hastings8f904da2012-06-22 03:56:29 -07001593 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1594 PyErr_SetString(PyExc_ValueError,
1595 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1596 return NULL;
1597 }
1598
1599 memset(buffers, 0, sizeof(buffers));
1600 memset(converted, 0, sizeof(converted));
1601 memset(keywords, 0, sizeof(keywords));
1602
1603 size = PySequence_Fast_GET_SIZE(sub_keywords);
1604 if (size > 8) {
1605 PyErr_SetString(PyExc_ValueError,
1606 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1607 goto exit;
1608 }
1609
1610 for (i = 0; i < size; i++) {
1611 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1612 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1613 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001614 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001615 goto exit;
1616 }
1617 keywords[i] = PyBytes_AS_STRING(converted[i]);
1618 }
1619
1620 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1621 sub_format, keywords,
1622 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1623 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1624
1625 if (result) {
1626 return_value = Py_None;
1627 Py_INCREF(Py_None);
1628 }
1629
1630exit:
1631 size = sizeof(converted) / sizeof(converted[0]);
1632 for (i = 0; i < size; i++) {
1633 Py_XDECREF(converted[i]);
1634 }
1635 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001636}
1637
Benjamin Peterson92035012008-12-27 16:00:54 +00001638static volatile int x;
1639
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001640/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1641 of an error.
1642*/
1643static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301644test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001645{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 PyObject *tuple, *obj;
1647 Py_UNICODE *value;
1648 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1651 /* Just use the macro and check that it compiles */
1652 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 tuple = PyTuple_New(1);
1655 if (tuple == NULL)
1656 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 obj = PyUnicode_Decode("test", strlen("test"),
1659 "ascii", NULL);
1660 if (obj == NULL)
1661 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001666 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001668 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 if (value != PyUnicode_AS_UNICODE(obj))
1670 return raiseTestError("test_u_code",
1671 "u code returned wrong value for u'test'");
1672 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001673 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001675 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 if (value != PyUnicode_AS_UNICODE(obj) ||
1677 len != PyUnicode_GET_SIZE(obj))
1678 return raiseTestError("test_u_code",
1679 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001682 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001683}
1684
Guido van Rossumfb67be22007-08-29 18:38:11 +00001685/* Test Z and Z# codes for PyArg_ParseTuple */
1686static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301687test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001688{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001690 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 tuple = PyTuple_New(2);
1694 if (tuple == NULL)
1695 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 obj = PyUnicode_FromString("test");
1698 PyTuple_SET_ITEM(tuple, 0, obj);
1699 Py_INCREF(Py_None);
1700 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 /* swap values on purpose */
1703 value1 = NULL;
1704 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001707 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001709 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 if (value1 != PyUnicode_AS_UNICODE(obj))
1711 return raiseTestError("test_Z_code",
1712 "Z code returned wrong value for 'test'");
1713 if (value2 != NULL)
1714 return raiseTestError("test_Z_code",
1715 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 value1 = NULL;
1718 value2 = PyUnicode_AS_UNICODE(obj);
1719 len1 = -1;
1720 len2 = -1;
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, "Z#Z#:test_Z_code", &value1, &len1,
1724 &value2, &len2))
1725 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001727 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1729 len1 != PyUnicode_GET_SIZE(obj))
1730 return raiseTestError("test_Z_code",
1731 "Z# code returned wrong values for 'test'");
1732 if (value2 != NULL ||
1733 len2 != 0)
1734 return raiseTestError("test_Z_code",
1735 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 Py_DECREF(tuple);
1738 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001739}
1740
Thomas Wouters477c8d52006-05-27 19:21:47 +00001741static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301742test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001743{
1744#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1746 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001747 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001748#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1750 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1755 if (wide == NULL)
1756 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1759 if (utf8 == NULL) {
1760 Py_DECREF(wide);
1761 return NULL;
1762 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001763
Victor Stinner8ef18872011-11-21 02:06:57 +01001764 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 Py_DECREF(wide);
1766 Py_DECREF(utf8);
1767 return raiseTestError("test_widechar",
1768 "wide string and utf8 string "
1769 "have different length");
1770 }
1771 if (PyUnicode_Compare(wide, utf8)) {
1772 Py_DECREF(wide);
1773 Py_DECREF(utf8);
1774 if (PyErr_Occurred())
1775 return NULL;
1776 return raiseTestError("test_widechar",
1777 "wide string and utf8 string "
1778 "are different");
1779 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 Py_DECREF(wide);
1782 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001783
1784#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1785 wide = PyUnicode_FromWideChar(invalid, 1);
1786 if (wide == NULL)
1787 PyErr_Clear();
1788 else
1789 return raiseTestError("test_widechar",
1790 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1791
1792 wide = PyUnicode_FromUnicode(invalid, 1);
1793 if (wide == NULL)
1794 PyErr_Clear();
1795 else
1796 return raiseTestError("test_widechar",
1797 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001798
1799 wide = PyUnicode_FromUnicode(NULL, 1);
1800 if (wide == NULL)
1801 return NULL;
1802 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001803 if (_PyUnicode_Ready(wide) < 0) {
1804 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001805 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001806 }
1807 else {
1808 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001809 return raiseTestError("test_widechar",
1810 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001811 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001812#endif
1813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001815}
1816
1817static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001818unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001819{
1820 PyObject *unicode, *result;
1821 Py_ssize_t buflen, size;
1822 wchar_t *buffer;
1823
1824 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1825 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001826 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001827 if (buffer == NULL)
1828 return PyErr_NoMemory();
1829
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001830 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001831 if (size == -1) {
1832 PyMem_Free(buffer);
1833 return NULL;
1834 }
1835
1836 if (size < buflen)
1837 buflen = size + 1;
1838 else
1839 buflen = size;
1840 result = PyUnicode_FromWideChar(buffer, buflen);
1841 PyMem_Free(buffer);
1842 if (result == NULL)
1843 return NULL;
1844
1845 return Py_BuildValue("(Nn)", result, size);
1846}
1847
1848static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001849unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001850{
1851 PyObject *unicode, *result;
1852 Py_ssize_t size;
1853 wchar_t *buffer;
1854
1855 if (!PyArg_ParseTuple(args, "U", &unicode))
1856 return NULL;
1857
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001858 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001859 if (buffer == NULL)
1860 return NULL;
1861
1862 result = PyUnicode_FromWideChar(buffer, size + 1);
1863 PyMem_Free(buffer);
1864 if (result == NULL)
1865 return NULL;
1866 return Py_BuildValue("(Nn)", result, size);
1867}
1868
1869static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001870unicode_asucs4(PyObject *self, PyObject *args)
1871{
1872 PyObject *unicode, *result;
1873 Py_UCS4 *buffer;
1874 int copy_null;
1875 Py_ssize_t str_len, buf_len;
1876
1877 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1878 return NULL;
1879 }
1880
1881 buf_len = str_len + 1;
1882 buffer = PyMem_NEW(Py_UCS4, buf_len);
1883 if (buffer == NULL) {
1884 return PyErr_NoMemory();
1885 }
1886 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1887 buffer[str_len] = 0xffffU;
1888
1889 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1890 PyMem_FREE(buffer);
1891 return NULL;
1892 }
1893
1894 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1895 PyMem_FREE(buffer);
1896 return result;
1897}
1898
1899static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001900unicode_findchar(PyObject *self, PyObject *args)
1901{
1902 PyObject *str;
1903 int direction;
1904 unsigned int ch;
1905 Py_ssize_t result;
1906 Py_ssize_t start, end;
1907
1908 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1909 &start, &end, &direction)) {
1910 return NULL;
1911 }
1912
1913 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
1914 if (result == -2)
1915 return NULL;
1916 else
1917 return PyLong_FromSsize_t(result);
1918}
1919
1920static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001921unicode_copycharacters(PyObject *self, PyObject *args)
1922{
1923 PyObject *from, *to, *to_copy;
1924 Py_ssize_t from_start, to_start, how_many, copied;
1925
1926 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1927 &from, &from_start, &how_many)) {
1928 return NULL;
1929 }
1930
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001931 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1932 PyUnicode_MAX_CHAR_VALUE(to)))) {
1933 return NULL;
1934 }
1935 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
1936 Py_DECREF(to_copy);
1937 return NULL;
1938 }
1939
1940 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
1941 from_start, how_many)) < 0) {
1942 Py_DECREF(to_copy);
1943 return NULL;
1944 }
1945
1946 return Py_BuildValue("(Nn)", to_copy, copied);
1947}
1948
1949static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001950unicode_encodedecimal(PyObject *self, PyObject *args)
1951{
1952 Py_UNICODE *unicode;
1953 Py_ssize_t length;
1954 char *errors = NULL;
1955 PyObject *decimal;
1956 Py_ssize_t decimal_length, new_length;
1957 int res;
1958
1959 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1960 return NULL;
1961
1962 decimal_length = length * 7; /* len('&#8364;') */
1963 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1964 if (decimal == NULL)
1965 return NULL;
1966
1967 res = PyUnicode_EncodeDecimal(unicode, length,
1968 PyBytes_AS_STRING(decimal),
1969 errors);
1970 if (res < 0) {
1971 Py_DECREF(decimal);
1972 return NULL;
1973 }
1974
1975 new_length = strlen(PyBytes_AS_STRING(decimal));
1976 assert(new_length <= decimal_length);
1977 res = _PyBytes_Resize(&decimal, new_length);
1978 if (res < 0)
1979 return NULL;
1980
1981 return decimal;
1982}
1983
1984static PyObject *
1985unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1986{
1987 Py_UNICODE *unicode;
1988 Py_ssize_t length;
1989 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1990 return NULL;
1991 return PyUnicode_TransformDecimalToASCII(unicode, length);
1992}
1993
1994static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001995unicode_legacy_string(PyObject *self, PyObject *args)
1996{
1997 Py_UNICODE *data;
1998 Py_ssize_t len;
1999 PyObject *u;
2000
2001 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2002 return NULL;
2003
2004 u = PyUnicode_FromUnicode(NULL, len);
2005 if (u == NULL)
2006 return NULL;
2007
2008 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2009
2010 if (len > 0) { /* The empty string is always ready. */
2011 assert(!PyUnicode_IS_READY(u));
2012 }
2013
2014 return u;
2015}
2016
2017static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002018getargs_w_star(PyObject *self, PyObject *args)
2019{
2020 Py_buffer buffer;
2021 PyObject *result;
2022 char *str;
2023
2024 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2025 return NULL;
2026
2027 if (2 <= buffer.len) {
2028 str = buffer.buf;
2029 str[0] = '[';
2030 str[buffer.len-1] = ']';
2031 }
2032
2033 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2034 PyBuffer_Release(&buffer);
2035 return result;
2036}
2037
2038
2039static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302040test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 /* Test that formats can begin with '|'. See issue #4720. */
2043 PyObject *tuple, *dict = NULL;
2044 static char *kwlist[] = {NULL};
2045 int result;
2046 tuple = PyTuple_New(0);
2047 if (!tuple)
2048 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002049 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002051 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 dict = PyDict_New();
2053 if (!dict)
2054 goto done;
2055 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002056 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 Py_DECREF(tuple);
2058 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002059 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002061 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 else {
2063 Py_RETURN_NONE;
2064 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002065}
2066
2067static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002068codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 const char *encoding, *errors = NULL;
2071 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2072 &encoding, &errors))
2073 return NULL;
2074 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002075}
2076
Thomas Wouters477c8d52006-05-27 19:21:47 +00002077static PyObject *
2078codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002079{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 const char *encoding, *errors = NULL;
2081 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2082 &encoding, &errors))
2083 return NULL;
2084 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002085}
2086
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002087
Tim Peters5b8132f2003-01-31 15:52:05 +00002088/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002089static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302090test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002091{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 struct triple {
2093 long input;
2094 size_t nbits;
2095 int sign;
2096 } testcases[] = {{0, 0, 0},
2097 {1L, 1, 1},
2098 {-1L, 1, -1},
2099 {2L, 2, 1},
2100 {-2L, 2, -1},
2101 {3L, 2, 1},
2102 {-3L, 2, -1},
2103 {4L, 3, 1},
2104 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002105 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 {-0x7fffL, 15, -1},
2107 {0xffffL, 16, 1},
2108 {-0xffffL, 16, -1},
2109 {0xfffffffL, 28, 1},
2110 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002111 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002112
Victor Stinner63941882011-09-29 00:42:28 +02002113 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002114 size_t nbits;
2115 int sign;
2116 PyObject *plong;
2117
2118 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002119 if (plong == NULL)
2120 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002121 nbits = _PyLong_NumBits(plong);
2122 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 Py_DECREF(plong);
2125 if (nbits != testcases[i].nbits)
2126 return raiseTestError("test_long_numbits",
2127 "wrong result for _PyLong_NumBits");
2128 if (sign != testcases[i].sign)
2129 return raiseTestError("test_long_numbits",
2130 "wrong result for _PyLong_Sign");
2131 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002132 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002133}
2134
Thomas Heller519a0422007-11-15 20:48:54 +00002135/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002136
2137static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302138test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2141 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2142 Py_XDECREF(o1);
2143 Py_XDECREF(o2);
2144 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002145}
2146
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002147static PyObject *
2148raise_exception(PyObject *self, PyObject *args)
2149{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 PyObject *exc;
2151 PyObject *exc_args, *v;
2152 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2155 &exc, &num_args))
2156 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 exc_args = PyTuple_New(num_args);
2159 if (exc_args == NULL)
2160 return NULL;
2161 for (i = 0; i < num_args; ++i) {
2162 v = PyLong_FromLong(i);
2163 if (v == NULL) {
2164 Py_DECREF(exc_args);
2165 return NULL;
2166 }
2167 PyTuple_SET_ITEM(exc_args, i, v);
2168 }
2169 PyErr_SetObject(exc, exc_args);
2170 Py_DECREF(exc_args);
2171 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002172}
Tim Peters91621db2001-06-12 20:10:01 +00002173
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002174static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002175set_errno(PyObject *self, PyObject *args)
2176{
2177 int new_errno;
2178
2179 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2180 return NULL;
2181
2182 errno = new_errno;
2183 Py_RETURN_NONE;
2184}
2185
2186static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002187test_set_exc_info(PyObject *self, PyObject *args)
2188{
2189 PyObject *orig_exc;
2190 PyObject *new_type, *new_value, *new_tb;
2191 PyObject *type, *value, *tb;
2192 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2193 &new_type, &new_value, &new_tb))
2194 return NULL;
2195
2196 PyErr_GetExcInfo(&type, &value, &tb);
2197
2198 Py_INCREF(new_type);
2199 Py_INCREF(new_value);
2200 Py_INCREF(new_tb);
2201 PyErr_SetExcInfo(new_type, new_value, new_tb);
2202
2203 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2204 Py_XDECREF(type);
2205 Py_XDECREF(value);
2206 Py_XDECREF(tb);
2207 return orig_exc;
2208}
Benjamin Peterson16323982010-02-03 01:13:41 +00002209
2210static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002211
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002212static PyObject *
2213test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214 if (PyDateTimeAPI) {
2215 if (test_run_counter) {
2216 /* Probably regrtest.py -R */
2217 Py_RETURN_NONE;
2218 }
2219 else {
2220 PyErr_SetString(PyExc_AssertionError,
2221 "PyDateTime_CAPI somehow initialized");
2222 return NULL;
2223 }
2224 }
2225 test_run_counter++;
2226 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228 if (PyDateTimeAPI)
2229 Py_RETURN_NONE;
2230 else
2231 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002232}
2233
Paul Ganssle04af5b12018-01-24 17:29:30 -05002234/* Functions exposing the C API type checking for testing */
2235#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2236 PyObject *obj; \
2237 int exact = 0; \
2238 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2239 return NULL; \
2240 } \
2241 int rv = exact?exact_method(obj):check_method(obj); \
2242 if (rv) { \
2243 Py_RETURN_TRUE; \
2244 } else { \
2245 Py_RETURN_FALSE; \
2246 }
2247
2248static PyObject *
2249datetime_check_date(PyObject *self, PyObject *args) {
2250 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2251}
2252
2253static PyObject *
2254datetime_check_time(PyObject *self, PyObject *args) {
2255 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2256}
2257
2258static PyObject *
2259datetime_check_datetime(PyObject *self, PyObject *args) {
2260 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2261}
2262
2263static PyObject *
2264datetime_check_delta(PyObject *self, PyObject *args) {
2265 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2266}
2267
2268static PyObject *
2269datetime_check_tzinfo(PyObject *self, PyObject *args) {
2270 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2271}
2272
2273
2274/* Makes three variations on timezone representing UTC-5:
2275 1. timezone with offset and name from PyDateTimeAPI
2276 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2277 3. timezone with offset (no name) from PyTimeZone_FromOffset
2278*/
2279static PyObject *
2280make_timezones_capi(PyObject *self, PyObject *args) {
2281 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2282 PyObject *name = PyUnicode_FromString("EST");
2283
2284 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2285 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2286 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2287
2288 Py_DecRef(offset);
2289 Py_DecRef(name);
2290
2291 PyObject *rv = PyTuple_New(3);
2292
2293 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2294 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2295 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2296
2297 return rv;
2298}
2299
2300static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002301get_timezones_offset_zero(PyObject *self, PyObject *args) {
2302 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2303 PyObject *name = PyUnicode_FromString("");
2304
2305 // These two should return the UTC singleton
2306 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2307 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2308
2309 // This one will return +00:00 zone, but not the UTC singleton
2310 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2311
2312 Py_DecRef(offset);
2313 Py_DecRef(name);
2314
2315 PyObject *rv = PyTuple_New(3);
2316 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2317 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2318 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2319
2320 return rv;
2321}
2322
2323static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002324get_timezone_utc_capi(PyObject* self, PyObject *args) {
2325 int macro = 0;
2326 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2327 return NULL;
2328 }
2329 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002330 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002331 return PyDateTime_TimeZone_UTC;
2332 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002333 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002334 return PyDateTimeAPI->TimeZone_UTC;
2335 }
2336}
2337
Benjamin Peterson16323982010-02-03 01:13:41 +00002338
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002339/* test_thread_state spawns a thread of its own, and that thread releases
2340 * `thread_done` when it's finished. The driver code has to know when the
2341 * thread finishes, because the thread uses a PyObject (the callable) that
2342 * may go away when the driver finishes. The former lack of this explicit
2343 * synchronization caused rare segfaults, so rare that they were seen only
2344 * on a Mac buildbot (although they were possible on any box).
2345 */
2346static PyThread_type_lock thread_done = NULL;
2347
Benjamin Petersona786b022008-08-25 21:05:21 +00002348static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002349_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 PyObject *rc;
2352 int success;
2353 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002354 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 success = (rc != NULL);
2356 Py_XDECREF(rc);
2357 PyGILState_Release(s);
2358 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002359}
2360
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002361/* Same thing, but releases `thread_done` when it returns. This variant
2362 * should be called only from threads spawned by test_thread_state().
2363 */
2364static void
2365_make_call_from_thread(void *callable)
2366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 _make_call(callable);
2368 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002369}
2370
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002371static PyObject *
2372test_thread_state(PyObject *self, PyObject *args)
2373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 PyObject *fn;
2375 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2378 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 if (!PyCallable_Check(fn)) {
2381 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2382 fn->ob_type->tp_name);
2383 return NULL;
2384 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 /* Ensure Python is set up for threading */
2387 PyEval_InitThreads();
2388 thread_done = PyThread_allocate_lock();
2389 if (thread_done == NULL)
2390 return PyErr_NoMemory();
2391 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393 /* Start a new thread with our callback. */
2394 PyThread_start_new_thread(_make_call_from_thread, fn);
2395 /* Make the callback with the thread lock held by this thread */
2396 success &= _make_call(fn);
2397 /* Do it all again, but this time with the thread-lock released */
2398 Py_BEGIN_ALLOW_THREADS
2399 success &= _make_call(fn);
2400 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2401 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 /* And once more with and without a thread
2404 XXX - should use a lock and work out exactly what we are trying
2405 to test <wink>
2406 */
2407 Py_BEGIN_ALLOW_THREADS
2408 PyThread_start_new_thread(_make_call_from_thread, fn);
2409 success &= _make_call(fn);
2410 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2411 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 /* Release lock we acquired above. This is required on HP-UX. */
2414 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 PyThread_free_lock(thread_done);
2417 if (!success)
2418 return NULL;
2419 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002420}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002421
2422/* test Py_AddPendingCalls using threads */
2423static int _pending_callback(void *arg)
2424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 /* we assume the argument is callable object to which we own a reference */
2426 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002427 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 Py_DECREF(callable);
2429 Py_XDECREF(r);
2430 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002431}
2432
2433/* The following requests n callbacks to _pending_callback. It can be
2434 * run from any python thread.
2435 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07002436static PyObject *
2437pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 PyObject *callable;
2440 int r;
2441 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2442 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 /* create the reference for the callbackwhile we hold the lock */
2445 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 Py_BEGIN_ALLOW_THREADS
2448 r = Py_AddPendingCall(&_pending_callback, callable);
2449 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 if (r<0) {
2452 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002453 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002455 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002456}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002457
Neal Norwitzb0d26332007-08-25 00:49:05 +00002458/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002459static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002460test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 PyObject *result;
2463 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002464
Alexander Belopolskye239d232010-12-08 23:31:48 +00002465#define CHECK_1_FORMAT(FORMAT, TYPE) \
2466 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2467 if (result == NULL) \
2468 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002469 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002470 msg = FORMAT " failed at 1"; \
2471 goto Fail; \
2472 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 CHECK_1_FORMAT("%d", int);
2476 CHECK_1_FORMAT("%ld", long);
2477 /* The z width modifier was added in Python 2.5. */
2478 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 /* The u type code was added in Python 2.5. */
2481 CHECK_1_FORMAT("%u", unsigned int);
2482 CHECK_1_FORMAT("%lu", unsigned long);
2483 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002486 CHECK_1_FORMAT("%llu", unsigned long long);
2487 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002490
2491 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 Py_XDECREF(result);
2493 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002494
2495#undef CHECK_1_FORMAT
2496}
2497
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002498
2499static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302500test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2502 int result;
2503 if (py_s == NULL)
2504 return NULL;
2505 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2506 Py_DECREF(py_s);
2507 if (!result) {
2508 PyErr_SetString(TestError, "Python string ending in NULL "
2509 "should not compare equal to c string.");
2510 return NULL;
2511 }
2512 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002513}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002514
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002515/* This is here to provide a docstring for test_descr. */
2516static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302517test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002520}
2521
Mark Dickinson725bfd82009-05-03 20:33:40 +00002522/* Test PyOS_string_to_double. */
2523static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302524test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002526 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528#define CHECK_STRING(STR, expected) \
2529 result = PyOS_string_to_double(STR, NULL, NULL); \
2530 if (result == -1.0 && PyErr_Occurred()) \
2531 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002532 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 msg = "conversion of " STR " to float failed"; \
2534 goto fail; \
2535 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537#define CHECK_INVALID(STR) \
2538 result = PyOS_string_to_double(STR, NULL, NULL); \
2539 if (result == -1.0 && PyErr_Occurred()) { \
2540 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2541 PyErr_Clear(); \
2542 else \
2543 return NULL; \
2544 } \
2545 else { \
2546 msg = "conversion of " STR " didn't raise ValueError"; \
2547 goto fail; \
2548 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 CHECK_STRING("0.1", 0.1);
2551 CHECK_STRING("1.234", 1.234);
2552 CHECK_STRING("-1.35", -1.35);
2553 CHECK_STRING(".1e01", 1.0);
2554 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 CHECK_INVALID(" 0.1");
2557 CHECK_INVALID("\t\n-3");
2558 CHECK_INVALID(".123 ");
2559 CHECK_INVALID("3\n");
2560 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002563 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002565#undef CHECK_STRING
2566#undef CHECK_INVALID
2567}
2568
2569
Benjamin Petersonb173f782009-05-05 22:31:58 +00002570/* Coverage testing of capsule objects. */
2571
2572static const char *capsule_name = "capsule name";
2573static char *capsule_pointer = "capsule pointer";
2574static char *capsule_context = "capsule context";
2575static const char *capsule_error = NULL;
2576static int
2577capsule_destructor_call_count = 0;
2578
2579static void
2580capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 capsule_destructor_call_count++;
2582 if (PyCapsule_GetContext(o) != capsule_context) {
2583 capsule_error = "context did not match in destructor!";
2584 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2585 capsule_error = "destructor did not match in destructor! (woah!)";
2586 } else if (PyCapsule_GetName(o) != capsule_name) {
2587 capsule_error = "name did not match in destructor!";
2588 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2589 capsule_error = "pointer did not match in destructor!";
2590 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002591}
2592
2593typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002594 char *name;
2595 char *module;
2596 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002597} known_capsule;
2598
2599static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002600test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00002601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 PyObject *object;
2603 const char *error = NULL;
2604 void *pointer;
2605 void *pointer2;
2606 known_capsule known_capsules[] = {
2607 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2608 KNOWN_CAPSULE("_socket", "CAPI"),
2609 KNOWN_CAPSULE("_curses", "_C_API"),
2610 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2611 { NULL, NULL },
2612 };
2613 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002614
2615#define FAIL(x) { error = (x); goto exit; }
2616
2617#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 if (capsule_error) { \
2619 FAIL(capsule_error); \
2620 } \
2621 else if (!capsule_destructor_call_count) { \
2622 FAIL("destructor not called!"); \
2623 } \
2624 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002626 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2627 PyCapsule_SetContext(object, capsule_context);
2628 capsule_destructor(object);
2629 CHECK_DESTRUCTOR;
2630 Py_DECREF(object);
2631 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 object = PyCapsule_New(known, "ignored", NULL);
2634 PyCapsule_SetPointer(object, capsule_pointer);
2635 PyCapsule_SetName(object, capsule_name);
2636 PyCapsule_SetDestructor(object, capsule_destructor);
2637 PyCapsule_SetContext(object, capsule_context);
2638 capsule_destructor(object);
2639 CHECK_DESTRUCTOR;
2640 /* intentionally access using the wrong name */
2641 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2642 if (!PyErr_Occurred()) {
2643 FAIL("PyCapsule_GetPointer should have failed but did not!");
2644 }
2645 PyErr_Clear();
2646 if (pointer2) {
2647 if (pointer2 == capsule_pointer) {
2648 FAIL("PyCapsule_GetPointer should not have"
2649 " returned the internal pointer!");
2650 } else {
2651 FAIL("PyCapsule_GetPointer should have "
2652 "returned NULL pointer but did not!");
2653 }
2654 }
2655 PyCapsule_SetDestructor(object, NULL);
2656 Py_DECREF(object);
2657 if (capsule_destructor_call_count) {
2658 FAIL("destructor called when it should not have been!");
2659 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 for (known = &known_capsules[0]; known->module != NULL; known++) {
2662 /* yeah, ordinarily I wouldn't do this either,
2663 but it's fine for this test harness.
2664 */
2665 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002666#undef FAIL
2667#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002668 { \
2669 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2670 x, known->module, known->attribute); \
2671 error = buffer; \
2672 goto exit; \
2673 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 PyObject *module = PyImport_ImportModule(known->module);
2676 if (module) {
2677 pointer = PyCapsule_Import(known->name, 0);
2678 if (!pointer) {
2679 Py_DECREF(module);
2680 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2681 }
2682 object = PyObject_GetAttrString(module, known->attribute);
2683 if (!object) {
2684 Py_DECREF(module);
2685 return NULL;
2686 }
2687 pointer2 = PyCapsule_GetPointer(object,
2688 "weebles wobble but they don't fall down");
2689 if (!PyErr_Occurred()) {
2690 Py_DECREF(object);
2691 Py_DECREF(module);
2692 FAIL("PyCapsule_GetPointer should have failed but did not!");
2693 }
2694 PyErr_Clear();
2695 if (pointer2) {
2696 Py_DECREF(module);
2697 Py_DECREF(object);
2698 if (pointer2 == pointer) {
2699 FAIL("PyCapsule_GetPointer should not have"
2700 " returned its internal pointer!");
2701 } else {
2702 FAIL("PyCapsule_GetPointer should have"
2703 " returned NULL pointer but did not!");
2704 }
2705 }
2706 Py_DECREF(object);
2707 Py_DECREF(module);
2708 }
2709 else
2710 PyErr_Clear();
2711 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002712
2713 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 if (error) {
2715 return raiseTestError("test_capsule", error);
2716 }
2717 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002718#undef FAIL
2719}
2720
Guido van Rossumddefaf32007-01-14 03:31:43 +00002721#ifdef HAVE_GETTIMEOFDAY
2722/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002723static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 e->tv_sec -= s->tv_sec;
2726 e->tv_usec -= s->tv_usec;
2727 if (e->tv_usec < 0) {
2728 e->tv_sec -=1;
2729 e->tv_usec += 1000000;
2730 }
2731 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002732}
2733
2734static PyObject *
2735profile_int(PyObject *self, PyObject* args)
2736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 int i, k;
2738 struct timeval start, stop;
2739 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 /* Test 1: Allocate and immediately deallocate
2742 many small integers */
2743 gettimeofday(&start, NULL);
2744 for(k=0; k < 20000; k++)
2745 for(i=0; i < 1000; i++) {
2746 single = PyLong_FromLong(i);
2747 Py_DECREF(single);
2748 }
2749 gettimeofday(&stop, NULL);
2750 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 /* Test 2: Allocate and immediately deallocate
2753 many large integers */
2754 gettimeofday(&start, NULL);
2755 for(k=0; k < 20000; k++)
2756 for(i=0; i < 1000; i++) {
2757 single = PyLong_FromLong(i+1000000);
2758 Py_DECREF(single);
2759 }
2760 gettimeofday(&stop, NULL);
2761 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 /* Test 3: Allocate a few integers, then release
2764 them all simultaneously. */
2765 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002766 if (multiple == NULL)
2767 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 gettimeofday(&start, NULL);
2769 for(k=0; k < 20000; k++) {
2770 for(i=0; i < 1000; i++) {
2771 multiple[i] = PyLong_FromLong(i+1000000);
2772 }
2773 for(i=0; i < 1000; i++) {
2774 Py_DECREF(multiple[i]);
2775 }
2776 }
2777 gettimeofday(&stop, NULL);
2778 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002779 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 /* Test 4: Allocate many integers, then release
2782 them all simultaneously. */
2783 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002784 if (multiple == NULL)
2785 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 gettimeofday(&start, NULL);
2787 for(k=0; k < 20; k++) {
2788 for(i=0; i < 1000000; i++) {
2789 multiple[i] = PyLong_FromLong(i+1000000);
2790 }
2791 for(i=0; i < 1000000; i++) {
2792 Py_DECREF(multiple[i]);
2793 }
2794 }
2795 gettimeofday(&stop, NULL);
2796 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002797 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 /* Test 5: Allocate many integers < 32000 */
2800 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002801 if (multiple == NULL)
2802 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 gettimeofday(&start, NULL);
2804 for(k=0; k < 10; k++) {
2805 for(i=0; i < 1000000; i++) {
2806 multiple[i] = PyLong_FromLong(i+1000);
2807 }
2808 for(i=0; i < 1000000; i++) {
2809 Py_DECREF(multiple[i]);
2810 }
2811 }
2812 gettimeofday(&stop, NULL);
2813 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002814 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 /* Test 6: Perform small int addition */
2817 op1 = PyLong_FromLong(1);
2818 gettimeofday(&start, NULL);
2819 for(i=0; i < 10000000; i++) {
2820 result = PyNumber_Add(op1, op1);
2821 Py_DECREF(result);
2822 }
2823 gettimeofday(&stop, NULL);
2824 Py_DECREF(op1);
2825 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 /* Test 7: Perform medium int addition */
2828 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002829 if (op1 == NULL)
2830 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 gettimeofday(&start, NULL);
2832 for(i=0; i < 10000000; i++) {
2833 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002834 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 }
2836 gettimeofday(&stop, NULL);
2837 Py_DECREF(op1);
2838 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002839
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002840 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002841}
2842#endif
2843
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002844/* To test the format of tracebacks as printed out. */
2845static PyObject *
2846traceback_print(PyObject *self, PyObject *args)
2847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 PyObject *file;
2849 PyObject *traceback;
2850 int result;
2851
2852 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2853 &traceback, &file))
2854 return NULL;
2855
2856 result = PyTraceBack_Print(traceback, file);
2857 if (result < 0)
2858 return NULL;
2859 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002860}
2861
Benjamin Petersone6528212008-07-15 15:32:09 +00002862/* To test the format of exceptions as printed out. */
2863static PyObject *
2864exception_print(PyObject *self, PyObject *args)
2865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002866 PyObject *value;
2867 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002869 if (!PyArg_ParseTuple(args, "O:exception_print",
2870 &value))
2871 return NULL;
2872 if (!PyExceptionInstance_Check(value)) {
2873 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2874 return NULL;
2875 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 tb = PyException_GetTraceback(value);
2878 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2879 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002882}
2883
2884
2885
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002886
2887/* reliably raise a MemoryError */
2888static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302889raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002890{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 PyErr_NoMemory();
2892 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002893}
2894
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002895/* Issue 6012 */
2896static PyObject *str1, *str2;
2897static int
2898failing_converter(PyObject *obj, void *arg)
2899{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002900 /* Clone str1, then let the conversion fail. */
2901 assert(str1);
2902 str2 = str1;
2903 Py_INCREF(str2);
2904 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002905}
2906static PyObject*
2907argparsing(PyObject *o, PyObject *args)
2908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909 PyObject *res;
2910 str1 = str2 = NULL;
2911 if (!PyArg_ParseTuple(args, "O&O&",
2912 PyUnicode_FSConverter, &str1,
2913 failing_converter, &str2)) {
2914 if (!str2)
2915 /* argument converter not called? */
2916 return NULL;
2917 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002918 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 Py_DECREF(str2);
2920 PyErr_Clear();
2921 return res;
2922 }
2923 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002924}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002925
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002926/* To test that the result of PyCode_NewEmpty has the right members. */
2927static PyObject *
2928code_newempty(PyObject *self, PyObject *args)
2929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930 const char *filename;
2931 const char *funcname;
2932 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2935 &filename, &funcname, &firstlineno))
2936 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002938 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002939}
2940
Georg Brandl1e28a272009-12-28 08:41:01 +00002941/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2942 Run via Lib/test/test_exceptions.py */
2943static PyObject *
2944make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 const char *name;
2947 const char *doc = NULL;
2948 PyObject *base = NULL;
2949 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2954 "s|sOO:make_exception_with_doc", kwlist,
2955 &name, &doc, &base, &dict))
2956 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002959}
2960
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002961static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302962make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002963{
2964 Py_buffer info;
2965 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2966 return NULL;
2967 return PyMemoryView_FromBuffer(&info);
2968}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002969
Stefan Krah7213fcc2015-02-01 16:19:23 +01002970static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002971test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01002972{
2973 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2974 int init[5] = {0, 1, 2, 3, 4};
2975 Py_ssize_t itemsize = sizeof(int);
2976 Py_ssize_t shape = 5;
2977 Py_ssize_t strides = 2 * itemsize;
2978 Py_buffer view = {
2979 data,
2980 NULL,
2981 5 * itemsize,
2982 itemsize,
2983 1,
2984 1,
2985 NULL,
2986 &shape,
2987 &strides,
2988 NULL,
2989 NULL
2990 };
2991 int *ptr;
2992 int i;
2993
2994 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2995 ptr = view.buf;
2996 for (i = 0; i < 5; i++) {
2997 if (ptr[2*i] != i) {
2998 PyErr_SetString(TestError,
2999 "test_from_contiguous: incorrect result");
3000 return NULL;
3001 }
3002 }
3003
3004 view.buf = &data[8];
3005 view.strides[0] = -2 * itemsize;
3006
3007 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3008 ptr = view.buf;
3009 for (i = 0; i < 5; i++) {
3010 if (*(ptr-2*i) != i) {
3011 PyErr_SetString(TestError,
3012 "test_from_contiguous: incorrect result");
3013 return NULL;
3014 }
3015 }
3016
3017 Py_RETURN_NONE;
3018}
Stefan Krah650c1e82015-02-03 21:43:23 +01003019
Stefan Kraha7559c02015-02-03 22:27:21 +01003020#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003021extern PyTypeObject _PyBytesIOBuffer_Type;
3022
Stefan Krah5178d912015-02-03 16:57:21 +01003023static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003024test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003025{
Stefan Krah650c1e82015-02-03 21:43:23 +01003026 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003027 PyObject *b;
3028 char *dummy[1];
3029 int ret, match;
3030
Stefan Krah650c1e82015-02-03 21:43:23 +01003031 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003032 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3033 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3034 PyErr_Clear();
3035 if (ret != -1 || match == 0)
3036 goto error;
3037
Stefan Krah650c1e82015-02-03 21:43:23 +01003038 /* bytesiobuf_getbuffer() */
3039 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003040 if (b == NULL) {
3041 return NULL;
3042 }
3043
3044 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3045 Py_DECREF(b);
3046 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3047 PyErr_Clear();
3048 if (ret != -1 || match == 0)
3049 goto error;
3050
3051 Py_RETURN_NONE;
3052
3053error:
3054 PyErr_SetString(TestError,
3055 "test_pep3118_obsolete_write_locks: failure");
3056 return NULL;
3057}
Stefan Kraha7559c02015-02-03 22:27:21 +01003058#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003059
Stefan Krah650c1e82015-02-03 21:43:23 +01003060/* This tests functions that historically supported write locks. It is
3061 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3062 is entitled to segfault in that case. */
3063static PyObject *
3064getbuffer_with_null_view(PyObject* self, PyObject *obj)
3065{
3066 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3067 return NULL;
3068
3069 Py_RETURN_NONE;
3070}
3071
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003072/* Test that the fatal error from not having a current thread doesn't
3073 cause an infinite loop. Run via Lib/test/test_capi.py */
3074static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303075crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003076{
3077 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003078 /* Using PyThreadState_Get() directly allows the test to pass in
3079 !pydebug mode. However, the test only actually tests anything
3080 in pydebug mode, since that's where the infinite loop was in
3081 the first place. */
3082 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003083 Py_END_ALLOW_THREADS
3084 return NULL;
3085}
3086
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003087/* To run some code in a sub-interpreter. */
3088static PyObject *
3089run_in_subinterp(PyObject *self, PyObject *args)
3090{
3091 const char *code;
3092 int r;
3093 PyThreadState *substate, *mainstate;
3094
3095 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3096 &code))
3097 return NULL;
3098
3099 mainstate = PyThreadState_Get();
3100
3101 PyThreadState_Swap(NULL);
3102
3103 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003104 if (substate == NULL) {
3105 /* Since no new thread state was created, there is no exception to
3106 propagate; raise a fresh one after swapping in the old thread
3107 state. */
3108 PyThreadState_Swap(mainstate);
3109 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3110 return NULL;
3111 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003112 r = PyRun_SimpleString(code);
3113 Py_EndInterpreter(substate);
3114
3115 PyThreadState_Swap(mainstate);
3116
3117 return PyLong_FromLong(r);
3118}
3119
Victor Stinner3c1b3792014-02-17 00:02:43 +01003120static int
3121check_time_rounding(int round)
3122{
Victor Stinner74474232015-09-02 01:43:56 +02003123 if (round != _PyTime_ROUND_FLOOR
3124 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003125 && round != _PyTime_ROUND_HALF_EVEN
3126 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003127 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3128 return -1;
3129 }
3130 return 0;
3131}
3132
Victor Stinner5d272cc2012-03-13 13:35:55 +01003133static PyObject *
3134test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3135{
3136 PyObject *obj;
3137 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003138 int round;
3139 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003140 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003141 if (check_time_rounding(round) < 0)
3142 return NULL;
3143 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003144 return NULL;
3145 return _PyLong_FromTime_t(sec);
3146}
3147
3148static PyObject *
3149test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3150{
3151 PyObject *obj;
3152 time_t sec;
3153 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003154 int round;
3155 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &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_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003160 return NULL;
3161 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3162}
3163
Victor Stinner643cd682012-03-02 22:54:03 +01003164static PyObject *
3165test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3166{
3167 PyObject *obj;
3168 time_t sec;
3169 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003170 int round;
3171 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003172 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003173 if (check_time_rounding(round) < 0)
3174 return NULL;
3175 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003176 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003177 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003178}
3179
Antoine Pitrou796564c2013-07-30 19:59:21 +02003180static void
3181slot_tp_del(PyObject *self)
3182{
3183 _Py_IDENTIFIER(__tp_del__);
3184 PyObject *del, *res;
3185 PyObject *error_type, *error_value, *error_traceback;
3186
3187 /* Temporarily resurrect the object. */
3188 assert(self->ob_refcnt == 0);
3189 self->ob_refcnt = 1;
3190
3191 /* Save the current exception, if any. */
3192 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3193
3194 /* Execute __del__ method, if any. */
3195 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3196 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003197 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003198 if (res == NULL)
3199 PyErr_WriteUnraisable(del);
3200 else
3201 Py_DECREF(res);
3202 Py_DECREF(del);
3203 }
3204
3205 /* Restore the saved exception. */
3206 PyErr_Restore(error_type, error_value, error_traceback);
3207
3208 /* Undo the temporary resurrection; can't use DECREF here, it would
3209 * cause a recursive call.
3210 */
3211 assert(self->ob_refcnt > 0);
3212 if (--self->ob_refcnt == 0)
3213 return; /* this is the normal path out */
3214
3215 /* __del__ resurrected it! Make it look like the original Py_DECREF
3216 * never happened.
3217 */
3218 {
3219 Py_ssize_t refcnt = self->ob_refcnt;
3220 _Py_NewReference(self);
3221 self->ob_refcnt = refcnt;
3222 }
INADA Naokid8521422018-05-17 11:07:21 +09003223 assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self));
Antoine Pitrou796564c2013-07-30 19:59:21 +02003224 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3225 * we need to undo that. */
3226 _Py_DEC_REFTOTAL;
3227 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3228 * chain, so no more to do there.
3229 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3230 * _Py_NewReference bumped tp_allocs: both of those need to be
3231 * undone.
3232 */
3233#ifdef COUNT_ALLOCS
3234 --Py_TYPE(self)->tp_frees;
3235 --Py_TYPE(self)->tp_allocs;
3236#endif
3237}
3238
3239static PyObject *
3240with_tp_del(PyObject *self, PyObject *args)
3241{
3242 PyObject *obj;
3243 PyTypeObject *tp;
3244
3245 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3246 return NULL;
3247 tp = (PyTypeObject *) obj;
3248 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3249 PyErr_Format(PyExc_TypeError,
3250 "heap type expected, got %R", obj);
3251 return NULL;
3252 }
3253 tp->tp_del = slot_tp_del;
3254 Py_INCREF(obj);
3255 return obj;
3256}
3257
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003258static PyMethodDef ml;
3259
3260static PyObject *
3261create_cfunction(PyObject *self, PyObject *args)
3262{
3263 return PyCFunction_NewEx(&ml, self, NULL);
3264}
3265
3266static PyMethodDef ml = {
3267 "create_cfunction",
3268 create_cfunction,
3269 METH_NOARGS,
3270 NULL
3271};
3272
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003273static PyObject *
3274_test_incref(PyObject *ob)
3275{
3276 Py_INCREF(ob);
3277 return ob;
3278}
3279
3280static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303281test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003282{
3283 PyObject *obj = PyLong_FromLong(0);
3284 Py_XINCREF(_test_incref(obj));
3285 Py_DECREF(obj);
3286 Py_DECREF(obj);
3287 Py_DECREF(obj);
3288 Py_RETURN_NONE;
3289}
3290
3291static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303292test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003293{
3294 PyObject *obj = PyLong_FromLong(0);
3295 Py_INCREF(_test_incref(obj));
3296 Py_DECREF(obj);
3297 Py_DECREF(obj);
3298 Py_DECREF(obj);
3299 Py_RETURN_NONE;
3300}
3301
3302static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303303test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003304{
3305 Py_XDECREF(PyLong_FromLong(0));
3306 Py_RETURN_NONE;
3307}
3308
3309static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303310test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003311{
3312 Py_DECREF(PyLong_FromLong(0));
3313 Py_RETURN_NONE;
3314}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003315
Victor Stinner0507bf52013-07-07 02:05:46 +02003316static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003317test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3318 PyObject *Py_UNUSED(args))
3319{
3320 PyStructSequence_Desc descr;
3321 PyStructSequence_Field descr_fields[3];
3322
3323 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3324 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3325 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3326
3327 descr.name = "_testcapi.test_descr";
3328 descr.doc = "This is used to test for memory leaks in NewType";
3329 descr.fields = descr_fields;
3330 descr.n_in_sequence = 1;
3331
3332 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3333 assert(structseq_type != NULL);
3334 assert(PyType_Check(structseq_type));
3335 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3336 Py_DECREF(structseq_type);
3337
3338 Py_RETURN_NONE;
3339}
3340
3341static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303342test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003343{
3344 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003345 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003346 Py_DecRef(obj);
3347 Py_DecRef(obj);
3348 Py_RETURN_NONE;
3349}
3350
3351static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303352test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003353{
3354 void *ptr;
3355
Victor Stinnerdb067af2014-05-02 22:31:14 +02003356 ptr = PyMem_RawMalloc(0);
3357 if (ptr == NULL) {
3358 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3359 return NULL;
3360 }
3361 PyMem_RawFree(ptr);
3362
3363 ptr = PyMem_RawCalloc(0, 0);
3364 if (ptr == NULL) {
3365 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3366 return NULL;
3367 }
3368 PyMem_RawFree(ptr);
3369
Victor Stinner0507bf52013-07-07 02:05:46 +02003370 ptr = PyMem_Malloc(0);
3371 if (ptr == NULL) {
3372 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3373 return NULL;
3374 }
3375 PyMem_Free(ptr);
3376
Victor Stinnerdb067af2014-05-02 22:31:14 +02003377 ptr = PyMem_Calloc(0, 0);
3378 if (ptr == NULL) {
3379 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3380 return NULL;
3381 }
3382 PyMem_Free(ptr);
3383
Victor Stinner0507bf52013-07-07 02:05:46 +02003384 ptr = PyObject_Malloc(0);
3385 if (ptr == NULL) {
3386 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3387 return NULL;
3388 }
3389 PyObject_Free(ptr);
3390
Victor Stinnerdb067af2014-05-02 22:31:14 +02003391 ptr = PyObject_Calloc(0, 0);
3392 if (ptr == NULL) {
3393 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3394 return NULL;
3395 }
3396 PyObject_Free(ptr);
3397
Victor Stinner0507bf52013-07-07 02:05:46 +02003398 Py_RETURN_NONE;
3399}
3400
3401typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003402 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003403
3404 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003405 size_t calloc_nelem;
3406 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003407 void *realloc_ptr;
3408 size_t realloc_new_size;
3409 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003410 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003411} alloc_hook_t;
3412
Victor Stinner9ed83c42017-10-31 12:18:10 -07003413static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003414{
3415 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003416 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003417 hook->malloc_size = size;
3418 return hook->alloc.malloc(hook->alloc.ctx, size);
3419}
3420
Victor Stinner9ed83c42017-10-31 12:18:10 -07003421static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003422{
3423 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003424 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003425 hook->calloc_nelem = nelem;
3426 hook->calloc_elsize = elsize;
3427 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3428}
3429
Victor Stinner9ed83c42017-10-31 12:18:10 -07003430static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003431{
3432 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003433 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003434 hook->realloc_ptr = ptr;
3435 hook->realloc_new_size = new_size;
3436 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3437}
3438
Victor Stinner9ed83c42017-10-31 12:18:10 -07003439static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02003440{
3441 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003442 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003443 hook->free_ptr = ptr;
3444 hook->alloc.free(hook->alloc.ctx, ptr);
3445}
3446
3447static PyObject *
3448test_setallocators(PyMemAllocatorDomain domain)
3449{
3450 PyObject *res = NULL;
3451 const char *error_msg;
3452 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003453 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003454 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003455 void *ptr, *ptr2;
3456
Victor Stinnerdb067af2014-05-02 22:31:14 +02003457 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003458
3459 alloc.ctx = &hook;
3460 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003461 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003462 alloc.realloc = &hook_realloc;
3463 alloc.free = &hook_free;
3464 PyMem_GetAllocator(domain, &hook.alloc);
3465 PyMem_SetAllocator(domain, &alloc);
3466
Victor Stinner9ed83c42017-10-31 12:18:10 -07003467 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02003468 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003469 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02003470 switch(domain)
3471 {
3472 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3473 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3474 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3475 default: ptr = NULL; break;
3476 }
3477
Victor Stinner9ed83c42017-10-31 12:18:10 -07003478#define CHECK_CTX(FUNC) \
3479 if (hook.ctx != &hook) { \
3480 error_msg = FUNC " wrong context"; \
3481 goto fail; \
3482 } \
3483 hook.ctx = NULL; /* reset for next check */
3484
Victor Stinner0507bf52013-07-07 02:05:46 +02003485 if (ptr == NULL) {
3486 error_msg = "malloc failed";
3487 goto fail;
3488 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003489 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003490 if (hook.malloc_size != size) {
3491 error_msg = "malloc invalid size";
3492 goto fail;
3493 }
3494
3495 size2 = 200;
3496 switch(domain)
3497 {
3498 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3499 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3500 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003501 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003502 }
3503
3504 if (ptr2 == NULL) {
3505 error_msg = "realloc failed";
3506 goto fail;
3507 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003508 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003509 if (hook.realloc_ptr != ptr
3510 || hook.realloc_new_size != size2) {
3511 error_msg = "realloc invalid parameters";
3512 goto fail;
3513 }
3514
3515 switch(domain)
3516 {
3517 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3518 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3519 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3520 }
3521
Victor Stinner9ed83c42017-10-31 12:18:10 -07003522 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02003523 if (hook.free_ptr != ptr2) {
3524 error_msg = "free invalid pointer";
3525 goto fail;
3526 }
3527
Victor Stinner9ed83c42017-10-31 12:18:10 -07003528 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02003529 nelem = 2;
3530 elsize = 5;
3531 switch(domain)
3532 {
3533 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3534 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3535 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3536 default: ptr = NULL; break;
3537 }
3538
3539 if (ptr == NULL) {
3540 error_msg = "calloc failed";
3541 goto fail;
3542 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003543 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02003544 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3545 error_msg = "calloc invalid nelem or elsize";
3546 goto fail;
3547 }
3548
Victor Stinner9ed83c42017-10-31 12:18:10 -07003549 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003550 switch(domain)
3551 {
3552 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3553 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3554 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3555 }
3556
Victor Stinner9ed83c42017-10-31 12:18:10 -07003557 CHECK_CTX("calloc free");
3558 if (hook.free_ptr != ptr) {
3559 error_msg = "calloc free invalid pointer";
3560 goto fail;
3561 }
3562
Victor Stinner0507bf52013-07-07 02:05:46 +02003563 Py_INCREF(Py_None);
3564 res = Py_None;
3565 goto finally;
3566
3567fail:
3568 PyErr_SetString(PyExc_RuntimeError, error_msg);
3569
3570finally:
3571 PyMem_SetAllocator(domain, &hook.alloc);
3572 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003573
3574#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02003575}
3576
3577static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303578test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003579{
3580 return test_setallocators(PYMEM_DOMAIN_RAW);
3581}
3582
3583static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303584test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003585{
3586 return test_setallocators(PYMEM_DOMAIN_MEM);
3587}
3588
3589static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303590test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003591{
3592 return test_setallocators(PYMEM_DOMAIN_OBJ);
3593}
3594
xdegaye85f64302017-07-01 14:14:45 +02003595/* Most part of the following code is inherited from the pyfailmalloc project
3596 * written by Victor Stinner. */
3597static struct {
3598 int installed;
3599 PyMemAllocatorEx raw;
3600 PyMemAllocatorEx mem;
3601 PyMemAllocatorEx obj;
3602} FmHook;
3603
3604static struct {
3605 int start;
3606 int stop;
3607 Py_ssize_t count;
3608} FmData;
3609
3610static int
3611fm_nomemory(void)
3612{
3613 FmData.count++;
3614 if (FmData.count > FmData.start &&
3615 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
3616 return 1;
3617 }
3618 return 0;
3619}
3620
3621static void *
3622hook_fmalloc(void *ctx, size_t size)
3623{
3624 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3625 if (fm_nomemory()) {
3626 return NULL;
3627 }
3628 return alloc->malloc(alloc->ctx, size);
3629}
3630
3631static void *
3632hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
3633{
3634 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3635 if (fm_nomemory()) {
3636 return NULL;
3637 }
3638 return alloc->calloc(alloc->ctx, nelem, elsize);
3639}
3640
3641static void *
3642hook_frealloc(void *ctx, void *ptr, size_t new_size)
3643{
3644 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3645 if (fm_nomemory()) {
3646 return NULL;
3647 }
3648 return alloc->realloc(alloc->ctx, ptr, new_size);
3649}
3650
3651static void
3652hook_ffree(void *ctx, void *ptr)
3653{
3654 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3655 alloc->free(alloc->ctx, ptr);
3656}
3657
3658static void
3659fm_setup_hooks(void)
3660{
3661 PyMemAllocatorEx alloc;
3662
3663 if (FmHook.installed) {
3664 return;
3665 }
3666 FmHook.installed = 1;
3667
3668 alloc.malloc = hook_fmalloc;
3669 alloc.calloc = hook_fcalloc;
3670 alloc.realloc = hook_frealloc;
3671 alloc.free = hook_ffree;
3672 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3673 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3674 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3675
3676 alloc.ctx = &FmHook.raw;
3677 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
3678
3679 alloc.ctx = &FmHook.mem;
3680 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
3681
3682 alloc.ctx = &FmHook.obj;
3683 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
3684}
3685
3686static void
3687fm_remove_hooks(void)
3688{
3689 if (FmHook.installed) {
3690 FmHook.installed = 0;
3691 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3692 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3693 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3694 }
3695}
3696
3697static PyObject*
3698set_nomemory(PyObject *self, PyObject *args)
3699{
3700 /* Memory allocation fails after 'start' allocation requests, and until
3701 * 'stop' allocation requests except when 'stop' is negative or equal
3702 * to 0 (default) in which case allocation failures never stop. */
3703 FmData.count = 0;
3704 FmData.stop = 0;
3705 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
3706 return NULL;
3707 }
3708 fm_setup_hooks();
3709 Py_RETURN_NONE;
3710}
3711
3712static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303713remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02003714{
3715 fm_remove_hooks();
3716 Py_RETURN_NONE;
3717}
3718
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003719PyDoc_STRVAR(docstring_empty,
3720""
3721);
3722
3723PyDoc_STRVAR(docstring_no_signature,
3724"This docstring has no signature."
3725);
3726
3727PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003728"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003729"\n"
3730"This docstring has an invalid signature."
3731);
3732
Larry Hastings2623c8c2014-02-08 22:15:29 -08003733PyDoc_STRVAR(docstring_with_invalid_signature2,
3734"docstring_with_invalid_signature2($module, /, boo)\n"
3735"\n"
3736"--\n"
3737"\n"
3738"This docstring also has an invalid signature."
3739);
3740
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003741PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003742"docstring_with_signature($module, /, sig)\n"
3743"--\n"
3744"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003745"This docstring has a valid signature."
3746);
3747
Zachary Ware8ef887c2015-04-13 18:22:35 -05003748PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3749"docstring_with_signature_but_no_doc($module, /, sig)\n"
3750"--\n"
3751"\n"
3752);
3753
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003754PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003755"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3756"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003757"\n"
3758"\n"
3759"This docstring has a valid signature and some extra newlines."
3760);
3761
Larry Hastings16c51912014-01-07 11:53:01 -08003762PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003763"docstring_with_signature_with_defaults(module, s='avocado',\n"
3764" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3765" local=the_number_three, sys=sys.maxsize,\n"
3766" exp=sys.maxsize - 1)\n"
3767"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003768"\n"
3769"\n"
3770"\n"
3771"This docstring has a valid signature with parameters,\n"
3772"and the parameters take defaults of varying types."
3773);
3774
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003775typedef struct {
3776 PyThread_type_lock start_event;
3777 PyThread_type_lock exit_event;
3778 PyObject *callback;
3779} test_c_thread_t;
3780
3781static void
3782temporary_c_thread(void *data)
3783{
3784 test_c_thread_t *test_c_thread = data;
3785 PyGILState_STATE state;
3786 PyObject *res;
3787
3788 PyThread_release_lock(test_c_thread->start_event);
3789
3790 /* Allocate a Python thread state for this thread */
3791 state = PyGILState_Ensure();
3792
Victor Stinner3466bde2016-09-05 18:16:01 -07003793 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003794 Py_CLEAR(test_c_thread->callback);
3795
3796 if (res == NULL) {
3797 PyErr_Print();
3798 }
3799 else {
3800 Py_DECREF(res);
3801 }
3802
3803 /* Destroy the Python thread state for this thread */
3804 PyGILState_Release(state);
3805
3806 PyThread_release_lock(test_c_thread->exit_event);
3807
3808 PyThread_exit_thread();
3809}
3810
3811static PyObject *
3812call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3813{
3814 PyObject *res = NULL;
3815 test_c_thread_t test_c_thread;
3816 long thread;
3817
3818 PyEval_InitThreads();
3819
3820 test_c_thread.start_event = PyThread_allocate_lock();
3821 test_c_thread.exit_event = PyThread_allocate_lock();
3822 test_c_thread.callback = NULL;
3823 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3824 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3825 goto exit;
3826 }
3827
3828 Py_INCREF(callback);
3829 test_c_thread.callback = callback;
3830
3831 PyThread_acquire_lock(test_c_thread.start_event, 1);
3832 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3833
3834 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3835 if (thread == -1) {
3836 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3837 PyThread_release_lock(test_c_thread.start_event);
3838 PyThread_release_lock(test_c_thread.exit_event);
3839 goto exit;
3840 }
3841
3842 PyThread_acquire_lock(test_c_thread.start_event, 1);
3843 PyThread_release_lock(test_c_thread.start_event);
3844
3845 Py_BEGIN_ALLOW_THREADS
3846 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3847 PyThread_release_lock(test_c_thread.exit_event);
3848 Py_END_ALLOW_THREADS
3849
3850 Py_INCREF(Py_None);
3851 res = Py_None;
3852
3853exit:
3854 Py_CLEAR(test_c_thread.callback);
3855 if (test_c_thread.start_event)
3856 PyThread_free_lock(test_c_thread.start_event);
3857 if (test_c_thread.exit_event)
3858 PyThread_free_lock(test_c_thread.exit_event);
3859 return res;
3860}
Victor Stinner13105102013-12-13 02:17:29 +01003861
Victor Stinner56e8c292014-07-21 12:30:22 +02003862static PyObject*
3863test_raise_signal(PyObject* self, PyObject *args)
3864{
3865 int signum, err;
3866
Oren Milmanba7d7362017-08-29 11:58:27 +03003867 if (!PyArg_ParseTuple(args, "i:raise_signal", &signum)) {
Victor Stinner56e8c292014-07-21 12:30:22 +02003868 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03003869 }
Victor Stinner56e8c292014-07-21 12:30:22 +02003870
3871 err = raise(signum);
3872 if (err)
3873 return PyErr_SetFromErrno(PyExc_OSError);
3874
3875 if (PyErr_CheckSignals() < 0)
3876 return NULL;
3877
3878 Py_RETURN_NONE;
3879}
3880
Serhiy Storchakab5181342015-02-06 08:58:56 +02003881/* marshal */
3882
3883static PyObject*
3884pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3885{
3886 long value;
3887 char *filename;
3888 int version;
3889 FILE *fp;
3890
3891 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3892 &value, &filename, &version))
3893 return NULL;
3894
3895 fp = fopen(filename, "wb");
3896 if (fp == NULL) {
3897 PyErr_SetFromErrno(PyExc_OSError);
3898 return NULL;
3899 }
3900
3901 PyMarshal_WriteLongToFile(value, fp, version);
3902
3903 fclose(fp);
3904 if (PyErr_Occurred())
3905 return NULL;
3906 Py_RETURN_NONE;
3907}
3908
3909static PyObject*
3910pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3911{
3912 PyObject *obj;
3913 char *filename;
3914 int version;
3915 FILE *fp;
3916
3917 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3918 &obj, &filename, &version))
3919 return NULL;
3920
3921 fp = fopen(filename, "wb");
3922 if (fp == NULL) {
3923 PyErr_SetFromErrno(PyExc_OSError);
3924 return NULL;
3925 }
3926
3927 PyMarshal_WriteObjectToFile(obj, fp, version);
3928
3929 fclose(fp);
3930 if (PyErr_Occurred())
3931 return NULL;
3932 Py_RETURN_NONE;
3933}
3934
3935static PyObject*
3936pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3937{
3938 int value;
3939 long pos;
3940 char *filename;
3941 FILE *fp;
3942
3943 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3944 return NULL;
3945
3946 fp = fopen(filename, "rb");
3947 if (fp == NULL) {
3948 PyErr_SetFromErrno(PyExc_OSError);
3949 return NULL;
3950 }
3951
3952 value = PyMarshal_ReadShortFromFile(fp);
3953 pos = ftell(fp);
3954
3955 fclose(fp);
3956 if (PyErr_Occurred())
3957 return NULL;
3958 return Py_BuildValue("il", value, pos);
3959}
3960
3961static PyObject*
3962pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3963{
3964 long value, pos;
3965 char *filename;
3966 FILE *fp;
3967
3968 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3969 return NULL;
3970
3971 fp = fopen(filename, "rb");
3972 if (fp == NULL) {
3973 PyErr_SetFromErrno(PyExc_OSError);
3974 return NULL;
3975 }
3976
3977 value = PyMarshal_ReadLongFromFile(fp);
3978 pos = ftell(fp);
3979
3980 fclose(fp);
3981 if (PyErr_Occurred())
3982 return NULL;
3983 return Py_BuildValue("ll", value, pos);
3984}
3985
3986static PyObject*
3987pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3988{
3989 PyObject *obj;
3990 long pos;
3991 char *filename;
3992 FILE *fp;
3993
3994 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3995 return NULL;
3996
3997 fp = fopen(filename, "rb");
3998 if (fp == NULL) {
3999 PyErr_SetFromErrno(PyExc_OSError);
4000 return NULL;
4001 }
4002
4003 obj = PyMarshal_ReadLastObjectFromFile(fp);
4004 pos = ftell(fp);
4005
4006 fclose(fp);
4007 return Py_BuildValue("Nl", obj, pos);
4008}
4009
4010static PyObject*
4011pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4012{
4013 PyObject *obj;
4014 long pos;
4015 char *filename;
4016 FILE *fp;
4017
4018 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
4019 return NULL;
4020
4021 fp = fopen(filename, "rb");
4022 if (fp == NULL) {
4023 PyErr_SetFromErrno(PyExc_OSError);
4024 return NULL;
4025 }
4026
4027 obj = PyMarshal_ReadObjectFromFile(fp);
4028 pos = ftell(fp);
4029
4030 fclose(fp);
4031 return Py_BuildValue("Nl", obj, pos);
4032}
4033
Victor Stinnerefde1462015-03-21 15:04:43 +01004034static PyObject*
4035return_null_without_error(PyObject *self, PyObject *args)
4036{
4037 /* invalid call: return NULL without setting an error,
4038 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4039 PyErr_Clear();
4040 return NULL;
4041}
4042
4043static PyObject*
4044return_result_with_error(PyObject *self, PyObject *args)
4045{
4046 /* invalid call: return a result with an error set,
4047 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4048 PyErr_SetNone(PyExc_ValueError);
4049 Py_RETURN_NONE;
4050}
4051
Victor Stinner992c43f2015-03-27 17:12:45 +01004052static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004053test_pytime_fromseconds(PyObject *self, PyObject *args)
4054{
4055 int seconds;
4056 _PyTime_t ts;
4057
4058 if (!PyArg_ParseTuple(args, "i", &seconds))
4059 return NULL;
4060 ts = _PyTime_FromSeconds(seconds);
4061 return _PyTime_AsNanosecondsObject(ts);
4062}
4063
4064static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004065test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4066{
4067 PyObject *obj;
4068 int round;
4069 _PyTime_t ts;
4070
4071 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4072 return NULL;
4073 if (check_time_rounding(round) < 0)
4074 return NULL;
4075 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4076 return NULL;
4077 return _PyTime_AsNanosecondsObject(ts);
4078}
4079
Victor Stinner4bfb4602015-03-27 22:27:24 +01004080static PyObject *
4081test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4082{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004083 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004084 _PyTime_t ts;
4085 double d;
4086
Victor Stinnerc29b5852017-11-02 07:28:27 -07004087 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004088 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004089 }
4090 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4091 return NULL;
4092 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004093 d = _PyTime_AsSecondsDouble(ts);
4094 return PyFloat_FromDouble(d);
4095}
4096
Victor Stinner95e9cef2015-03-28 01:26:47 +01004097static PyObject *
4098test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4099{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004100 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004101 int round;
4102 _PyTime_t t;
4103 struct timeval tv;
4104 PyObject *seconds;
4105
Victor Stinnerc29b5852017-11-02 07:28:27 -07004106 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004107 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004108 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004109 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004110 }
4111 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004112 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004113 }
4114 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4115 return NULL;
4116 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004117
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004118 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004119 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004120 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004121 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004122 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4123}
4124
Victor Stinner34dc0f42015-03-27 18:19:03 +01004125#ifdef HAVE_CLOCK_GETTIME
4126static PyObject *
4127test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4128{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004129 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004130 _PyTime_t t;
4131 struct timespec ts;
4132
Victor Stinnerc29b5852017-11-02 07:28:27 -07004133 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004134 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004135 }
4136 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004137 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004138 }
4139 if (_PyTime_AsTimespec(t, &ts) == -1) {
4140 return NULL;
4141 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004142 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4143}
4144#endif
4145
Victor Stinner62d1c702015-04-01 17:47:07 +02004146static PyObject *
4147test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4148{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004149 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004150 int round;
4151 _PyTime_t t, ms;
4152
Victor Stinnerc29b5852017-11-02 07:28:27 -07004153 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004154 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004155 }
4156 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004157 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004158 }
4159 if (check_time_rounding(round) < 0) {
4160 return NULL;
4161 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004162 ms = _PyTime_AsMilliseconds(t, round);
4163 /* This conversion rely on the fact that _PyTime_t is a number of
4164 nanoseconds */
4165 return _PyTime_AsNanosecondsObject(ms);
4166}
4167
4168static PyObject *
4169test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4170{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004171 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004172 int round;
4173 _PyTime_t t, ms;
4174
Victor Stinnerc29b5852017-11-02 07:28:27 -07004175 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004176 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004177 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004178 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004179 }
4180 if (check_time_rounding(round) < 0) {
4181 return NULL;
4182 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004183 ms = _PyTime_AsMicroseconds(t, round);
4184 /* This conversion rely on the fact that _PyTime_t is a number of
4185 nanoseconds */
4186 return _PyTime_AsNanosecondsObject(ms);
4187}
4188
Victor Stinner50856d52015-10-13 00:11:21 +02004189static PyObject*
4190get_recursion_depth(PyObject *self, PyObject *args)
4191{
Victor Stinner50b48572018-11-01 01:51:40 +01004192 PyThreadState *tstate = PyThreadState_Get();
Victor Stinner50856d52015-10-13 00:11:21 +02004193
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07004194 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02004195 return PyLong_FromLong(tstate->recursion_depth - 1);
4196}
4197
Victor Stinner34be8072016-03-14 12:04:26 +01004198static PyObject*
4199pymem_buffer_overflow(PyObject *self, PyObject *args)
4200{
4201 char *buffer;
4202
4203 /* Deliberate buffer overflow to check that PyMem_Free() detects
4204 the overflow when debug hooks are installed. */
4205 buffer = PyMem_Malloc(16);
4206 buffer[16] = 'x';
4207 PyMem_Free(buffer);
4208
4209 Py_RETURN_NONE;
4210}
4211
4212static PyObject*
4213pymem_api_misuse(PyObject *self, PyObject *args)
4214{
4215 char *buffer;
4216
4217 /* Deliberate misusage of Python allocators:
4218 allococate with PyMem but release with PyMem_Raw. */
4219 buffer = PyMem_Malloc(16);
4220 PyMem_RawFree(buffer);
4221
4222 Py_RETURN_NONE;
4223}
4224
Victor Stinnerc4aec362016-03-14 22:26:53 +01004225static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004226pymem_malloc_without_gil(PyObject *self, PyObject *args)
4227{
4228 char *buffer;
4229
4230 /* Deliberate bug to test debug hooks on Python memory allocators:
4231 call PyMem_Malloc() without holding the GIL */
4232 Py_BEGIN_ALLOW_THREADS
4233 buffer = PyMem_Malloc(10);
4234 Py_END_ALLOW_THREADS
4235
4236 PyMem_Free(buffer);
4237
4238 Py_RETURN_NONE;
4239}
4240
Victor Stinner5d39e042017-11-29 17:20:38 +01004241
4242static PyObject*
4243test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4244{
4245 const char *name = _PyMem_GetAllocatorsName();
4246 if (name == NULL) {
4247 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4248 return NULL;
4249 }
4250 return PyUnicode_FromString(name);
4251}
4252
4253
Victor Stinnerad524372016-03-16 12:12:53 +01004254static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004255pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4256{
4257 char *buffer;
4258
Victor Stinnerad524372016-03-16 12:12:53 +01004259 /* Deliberate bug to test debug hooks on Python memory allocators:
4260 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004261 Py_BEGIN_ALLOW_THREADS
4262 buffer = PyObject_Malloc(10);
4263 Py_END_ALLOW_THREADS
4264
4265 PyObject_Free(buffer);
4266
4267 Py_RETURN_NONE;
4268}
4269
Victor Stinner10b73e12016-03-22 13:39:05 +01004270static PyObject *
4271tracemalloc_track(PyObject *self, PyObject *args)
4272{
4273 unsigned int domain;
4274 PyObject *ptr_obj;
4275 void *ptr;
4276 Py_ssize_t size;
4277 int release_gil = 0;
4278 int res;
4279
4280 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4281 return NULL;
4282 ptr = PyLong_AsVoidPtr(ptr_obj);
4283 if (PyErr_Occurred())
4284 return NULL;
4285
4286 if (release_gil) {
4287 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004288 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004289 Py_END_ALLOW_THREADS
4290 }
4291 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004292 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004293 }
4294
4295 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004296 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004297 return NULL;
4298 }
4299
4300 Py_RETURN_NONE;
4301}
4302
4303static PyObject *
4304tracemalloc_untrack(PyObject *self, PyObject *args)
4305{
4306 unsigned int domain;
4307 PyObject *ptr_obj;
4308 void *ptr;
4309 int res;
4310
4311 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4312 return NULL;
4313 ptr = PyLong_AsVoidPtr(ptr_obj);
4314 if (PyErr_Occurred())
4315 return NULL;
4316
Victor Stinner5ea4c062017-06-20 17:46:36 +02004317 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004318 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004319 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004320 return NULL;
4321 }
4322
4323 Py_RETURN_NONE;
4324}
4325
4326static PyObject *
4327tracemalloc_get_traceback(PyObject *self, PyObject *args)
4328{
4329 unsigned int domain;
4330 PyObject *ptr_obj;
4331 void *ptr;
4332
4333 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4334 return NULL;
4335 ptr = PyLong_AsVoidPtr(ptr_obj);
4336 if (PyErr_Occurred())
4337 return NULL;
4338
Benjamin Petersonca470632016-09-06 13:47:26 -07004339 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004340}
4341
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004342static PyObject *
4343dict_get_version(PyObject *self, PyObject *args)
4344{
4345 PyDictObject *dict;
4346 uint64_t version;
4347
4348 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4349 return NULL;
4350
4351 version = dict->ma_version_tag;
4352
4353 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4354 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4355}
4356
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004357
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004358static PyObject *
4359raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4360{
4361 PyGenObject *gen;
4362
4363 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4364 return NULL;
4365
4366 /* This is used in a test to check what happens if a signal arrives just
4367 as we're in the process of entering a yield from chain (see
4368 bpo-30039).
4369
4370 Needs to be done in C, because:
4371 - we don't have a Python wrapper for raise()
4372 - we need to make sure that the Python-level signal handler doesn't run
4373 *before* we enter the generator frame, which is impossible in Python
4374 because we check for signals before every bytecode operation.
4375 */
4376 raise(SIGINT);
4377 return _PyGen_Send(gen, Py_None);
4378}
4379
4380
Victor Stinner3b5cf852017-06-09 16:48:45 +02004381static int
4382fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4383{
4384 if (args == Py_None) {
4385 *stack = NULL;
4386 *nargs = 0;
4387 }
4388 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01004389 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02004390 *nargs = PyTuple_GET_SIZE(args);
4391 }
4392 else {
4393 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4394 return -1;
4395 }
4396 return 0;
4397}
4398
4399
4400static PyObject *
4401test_pyobject_fastcall(PyObject *self, PyObject *args)
4402{
4403 PyObject *func, *func_args;
4404 PyObject **stack;
4405 Py_ssize_t nargs;
4406
4407 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4408 return NULL;
4409 }
4410
4411 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4412 return NULL;
4413 }
4414 return _PyObject_FastCall(func, stack, nargs);
4415}
4416
4417
4418static PyObject *
4419test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4420{
4421 PyObject *func, *func_args, *kwargs;
4422 PyObject **stack;
4423 Py_ssize_t nargs;
4424
4425 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4426 return NULL;
4427 }
4428
4429 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4430 return NULL;
4431 }
4432
4433 if (kwargs == Py_None) {
4434 kwargs = NULL;
4435 }
4436 else if (!PyDict_Check(kwargs)) {
4437 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4438 return NULL;
4439 }
4440
4441 return _PyObject_FastCallDict(func, stack, nargs, kwargs);
4442}
4443
4444
4445static PyObject *
4446test_pyobject_fastcallkeywords(PyObject *self, PyObject *args)
4447{
4448 PyObject *func, *func_args, *kwnames = NULL;
4449 PyObject **stack;
4450 Py_ssize_t nargs, nkw;
4451
4452 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4453 return NULL;
4454 }
4455
4456 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4457 return NULL;
4458 }
4459
4460 if (kwnames == Py_None) {
4461 kwnames = NULL;
4462 }
4463 else if (PyTuple_Check(kwnames)) {
4464 nkw = PyTuple_GET_SIZE(kwnames);
4465 if (nargs < nkw) {
4466 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4467 return NULL;
4468 }
4469 nargs -= nkw;
4470 }
4471 else {
4472 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4473 return NULL;
4474 }
4475 return _PyObject_FastCallKeywords(func, stack, nargs, kwnames);
4476}
4477
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004478
Victor Stinner64fa4492017-07-10 14:37:49 +02004479static PyObject*
4480stack_pointer(PyObject *self, PyObject *args)
4481{
4482 int v = 5;
4483 return PyLong_FromVoidPtr(&v);
4484}
4485
Victor Stinner3b5cf852017-06-09 16:48:45 +02004486
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004487#ifdef W_STOPCODE
4488static PyObject*
4489py_w_stopcode(PyObject *self, PyObject *args)
4490{
4491 int sig, status;
4492 if (!PyArg_ParseTuple(args, "i", &sig)) {
4493 return NULL;
4494 }
4495 status = W_STOPCODE(sig);
4496 return PyLong_FromLong(status);
4497}
4498#endif
4499
4500
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004501static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03004502get_mapping_keys(PyObject* self, PyObject *obj)
4503{
4504 return PyMapping_Keys(obj);
4505}
4506
4507static PyObject *
4508get_mapping_values(PyObject* self, PyObject *obj)
4509{
4510 return PyMapping_Values(obj);
4511}
4512
4513static PyObject *
4514get_mapping_items(PyObject* self, PyObject *obj)
4515{
4516 return PyMapping_Items(obj);
4517}
4518
4519
4520static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004521test_pythread_tss_key_state(PyObject *self, PyObject *args)
4522{
4523 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
4524 if (PyThread_tss_is_created(&tss_key)) {
4525 return raiseTestError("test_pythread_tss_key_state",
4526 "TSS key not in an uninitialized state at "
4527 "creation time");
4528 }
4529 if (PyThread_tss_create(&tss_key) != 0) {
4530 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
4531 return NULL;
4532 }
4533 if (!PyThread_tss_is_created(&tss_key)) {
4534 return raiseTestError("test_pythread_tss_key_state",
4535 "PyThread_tss_create succeeded, "
4536 "but with TSS key in an uninitialized state");
4537 }
4538 if (PyThread_tss_create(&tss_key) != 0) {
4539 return raiseTestError("test_pythread_tss_key_state",
4540 "PyThread_tss_create unsuccessful with "
4541 "an already initialized key");
4542 }
4543#define CHECK_TSS_API(expr) \
4544 (void)(expr); \
4545 if (!PyThread_tss_is_created(&tss_key)) { \
4546 return raiseTestError("test_pythread_tss_key_state", \
4547 "TSS key initialization state was not " \
4548 "preserved after calling " #expr); }
4549 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
4550 CHECK_TSS_API(PyThread_tss_get(&tss_key));
4551#undef CHECK_TSS_API
4552 PyThread_tss_delete(&tss_key);
4553 if (PyThread_tss_is_created(&tss_key)) {
4554 return raiseTestError("test_pythread_tss_key_state",
4555 "PyThread_tss_delete called, but did not "
4556 "set the key state to uninitialized");
4557 }
4558
4559 Py_tss_t *ptr_key = PyThread_tss_alloc();
4560 if (ptr_key == NULL) {
4561 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
4562 return NULL;
4563 }
4564 if (PyThread_tss_is_created(ptr_key)) {
4565 return raiseTestError("test_pythread_tss_key_state",
4566 "TSS key not in an uninitialized state at "
4567 "allocation time");
4568 }
4569 PyThread_tss_free(ptr_key);
4570 ptr_key = NULL;
4571 Py_RETURN_NONE;
4572}
4573
4574
Yury Selivanovf23746a2018-01-22 19:11:18 -05004575static PyObject*
4576new_hamt(PyObject *self, PyObject *args)
4577{
4578 return _PyContext_NewHamtForTests();
4579}
4580
4581
jdemeyer5a306202018-10-19 23:50:06 +02004582/* def bad_get(self, obj, cls):
4583 cls()
4584 return repr(self)
4585*/
4586static PyObject*
4587bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4588{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02004589 PyObject *self, *obj, *cls;
4590 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02004591 return NULL;
4592 }
4593
Serhiy Storchakab1dede32018-11-20 20:45:40 +02004594 PyObject *res = PyObject_CallObject(cls, NULL);
jdemeyer5a306202018-10-19 23:50:06 +02004595 if (res == NULL) {
4596 return NULL;
4597 }
4598 Py_DECREF(res);
4599
Serhiy Storchakab1dede32018-11-20 20:45:40 +02004600 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02004601}
4602
4603
Victor Stinner3d4226a2018-08-29 22:21:32 +02004604static PyObject *
4605encode_locale_ex(PyObject *self, PyObject *args)
4606{
4607 PyObject *unicode;
4608 int current_locale = 0;
4609 wchar_t *wstr;
4610 PyObject *res = NULL;
4611 const char *errors = NULL;
4612
4613 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
4614 return NULL;
4615 }
4616 wstr = PyUnicode_AsWideCharString(unicode, NULL);
4617 if (wstr == NULL) {
4618 return NULL;
4619 }
4620 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
4621
4622 char *str = NULL;
4623 size_t error_pos;
4624 const char *reason = NULL;
4625 int ret = _Py_EncodeLocaleEx(wstr,
4626 &str, &error_pos, &reason,
4627 current_locale, error_handler);
4628 PyMem_Free(wstr);
4629
4630 switch(ret) {
4631 case 0:
4632 res = PyBytes_FromString(str);
4633 PyMem_RawFree(str);
4634 break;
4635 case -1:
4636 PyErr_NoMemory();
4637 break;
4638 case -2:
4639 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
4640 error_pos, reason);
4641 break;
4642 case -3:
4643 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
4644 break;
4645 default:
4646 PyErr_SetString(PyExc_ValueError, "unknow error code");
4647 break;
4648 }
4649 return res;
4650}
4651
4652
4653static PyObject *
4654decode_locale_ex(PyObject *self, PyObject *args)
4655{
4656 char *str;
4657 int current_locale = 0;
4658 PyObject *res = NULL;
4659 const char *errors = NULL;
4660
4661 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
4662 return NULL;
4663 }
4664 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
4665
4666 wchar_t *wstr = NULL;
4667 size_t wlen = 0;
4668 const char *reason = NULL;
4669 int ret = _Py_DecodeLocaleEx(str,
4670 &wstr, &wlen, &reason,
4671 current_locale, error_handler);
4672
4673 switch(ret) {
4674 case 0:
4675 res = PyUnicode_FromWideChar(wstr, wlen);
4676 PyMem_RawFree(wstr);
4677 break;
4678 case -1:
4679 PyErr_NoMemory();
4680 break;
4681 case -2:
4682 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
4683 wlen, reason);
4684 break;
4685 case -3:
4686 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
4687 break;
4688 default:
4689 PyErr_SetString(PyExc_ValueError, "unknow error code");
4690 break;
4691 }
4692 return res;
4693}
4694
4695
Victor Stinner2094c2b2018-09-03 17:06:39 +02004696static PyObject *
Victor Stinner7ddd56f2018-11-14 00:24:28 +01004697get_global_config(PyObject *self, PyObject *Py_UNUSED(args))
4698{
4699 return _Py_GetGlobalVariablesAsDict();
4700}
4701
4702
4703static PyObject *
4704get_core_config(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2094c2b2018-09-03 17:06:39 +02004705{
4706 PyInterpreterState *interp = _PyInterpreterState_Get();
4707 const _PyCoreConfig *config = &interp->core_config;
Victor Stinner5ed69952018-11-06 15:59:52 +01004708 return _PyCoreConfig_AsDict(config);
Victor Stinner2094c2b2018-09-03 17:06:39 +02004709}
4710
4711
Victor Stinner00b137c2018-11-13 19:59:26 +01004712static PyObject *
Victor Stinner7ddd56f2018-11-14 00:24:28 +01004713get_main_config(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner00b137c2018-11-13 19:59:26 +01004714{
4715 PyInterpreterState *interp = _PyInterpreterState_Get();
4716 const _PyMainInterpreterConfig *config = &interp->config;
4717 return _PyMainInterpreterConfig_AsDict(config);
4718}
4719
4720
Victor Stinner18618e652018-10-25 17:28:11 +02004721#ifdef Py_REF_DEBUG
4722static PyObject *
4723negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
4724{
4725 PyObject *obj = PyUnicode_FromString("negative_refcount");
4726 if (obj == NULL) {
4727 return NULL;
4728 }
4729 assert(Py_REFCNT(obj) == 1);
4730
4731 Py_REFCNT(obj) = 0;
4732 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
4733 Py_DECREF(obj);
4734
4735 Py_RETURN_NONE;
4736}
4737#endif
4738
4739
Tim Peters9ea17ac2001-02-02 05:57:15 +00004740static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004741 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304742 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02004743 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304744 {"test_config", test_config, METH_NOARGS},
4745 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05004747 {"datetime_check_date", datetime_check_date, METH_VARARGS},
4748 {"datetime_check_time", datetime_check_time, METH_VARARGS},
4749 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
4750 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
4751 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
4752 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05004753 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05004754 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304755 {"test_list_api", test_list_api, METH_NOARGS},
4756 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02004757 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01004758 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304759 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
4760 {"test_long_api", test_long_api, METH_NOARGS},
4761 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
4762 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
4763 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
4764 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08004765 {"test_structseq_newtype_doesnt_leak",
4766 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304767 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
4768 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
4769 {"test_long_as_double", test_long_as_double, METH_NOARGS},
4770 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
4771 {"test_long_numbits", test_long_numbits, METH_NOARGS},
4772 {"test_k_code", test_k_code, METH_NOARGS},
4773 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07004774 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304775 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004776 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304777 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004778 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304779 {"test_string_to_double", test_string_to_double, METH_NOARGS},
4780 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
4781 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004782 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01004783 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004784#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01004785 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004786#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01004787 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03004788 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03004789 {"get_args", get_args, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004790 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004792 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004793 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004794 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00004795 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03004796 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004797 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03004798 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004799 {"getargs_b", getargs_b, METH_VARARGS},
4800 {"getargs_B", getargs_B, METH_VARARGS},
4801 {"getargs_h", getargs_h, METH_VARARGS},
4802 {"getargs_H", getargs_H, METH_VARARGS},
4803 {"getargs_I", getargs_I, METH_VARARGS},
4804 {"getargs_k", getargs_k, METH_VARARGS},
4805 {"getargs_i", getargs_i, METH_VARARGS},
4806 {"getargs_l", getargs_l, METH_VARARGS},
4807 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07004808 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004809 {"getargs_L", getargs_L, METH_VARARGS},
4810 {"getargs_K", getargs_K, METH_VARARGS},
4811 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304812 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
4813 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03004814 {"getargs_f", getargs_f, METH_VARARGS},
4815 {"getargs_d", getargs_d, METH_VARARGS},
4816 {"getargs_D", getargs_D, METH_VARARGS},
4817 {"getargs_S", getargs_S, METH_VARARGS},
4818 {"getargs_Y", getargs_Y, METH_VARARGS},
4819 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03004820 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004821 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00004822 {"getargs_s", getargs_s, METH_VARARGS},
4823 {"getargs_s_star", getargs_s_star, METH_VARARGS},
4824 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
4825 {"getargs_z", getargs_z, METH_VARARGS},
4826 {"getargs_z_star", getargs_z_star, METH_VARARGS},
4827 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
4828 {"getargs_y", getargs_y, METH_VARARGS},
4829 {"getargs_y_star", getargs_y_star, METH_VARARGS},
4830 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
4831 {"getargs_u", getargs_u, METH_VARARGS},
4832 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
4833 {"getargs_Z", getargs_Z, METH_VARARGS},
4834 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00004835 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004836 {"getargs_es", getargs_es, METH_VARARGS},
4837 {"getargs_et", getargs_et, METH_VARARGS},
4838 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
4839 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004840 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004841 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004842 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004843 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304844 {"test_s_code", test_s_code, METH_NOARGS},
4845 {"test_u_code", test_u_code, METH_NOARGS},
4846 {"test_Z_code", test_Z_code, METH_NOARGS},
4847 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004848 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
4849 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03004850 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08004851 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03004852 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004853 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
4854 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01004855 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004856 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004857 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004858#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00004859 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004860#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00004861 {"traceback_print", traceback_print, METH_VARARGS},
4862 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02004863 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004864 {"argparsing", argparsing, METH_VARARGS},
4865 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004866 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004867 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304868 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00004869 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304870 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004871 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01004872 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
4873 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01004874 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02004875 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04004876 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304877 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
4878 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
4879 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
4880 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02004881 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
4882 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304883 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02004884 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004885 {"no_docstring",
4886 (PyCFunction)test_with_docstring, METH_NOARGS},
4887 {"docstring_empty",
4888 (PyCFunction)test_with_docstring, METH_NOARGS,
4889 docstring_empty},
4890 {"docstring_no_signature",
4891 (PyCFunction)test_with_docstring, METH_NOARGS,
4892 docstring_no_signature},
4893 {"docstring_with_invalid_signature",
4894 (PyCFunction)test_with_docstring, METH_NOARGS,
4895 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004896 {"docstring_with_invalid_signature2",
4897 (PyCFunction)test_with_docstring, METH_NOARGS,
4898 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004899 {"docstring_with_signature",
4900 (PyCFunction)test_with_docstring, METH_NOARGS,
4901 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004902 {"docstring_with_signature_but_no_doc",
4903 (PyCFunction)test_with_docstring, METH_NOARGS,
4904 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004905 {"docstring_with_signature_and_extra_newlines",
4906 (PyCFunction)test_with_docstring, METH_NOARGS,
4907 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004908 {"docstring_with_signature_with_defaults",
4909 (PyCFunction)test_with_docstring, METH_NOARGS,
4910 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02004911 {"raise_signal",
4912 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004913 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4914 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02004915 {"pymarshal_write_long_to_file",
4916 pymarshal_write_long_to_file, METH_VARARGS},
4917 {"pymarshal_write_object_to_file",
4918 pymarshal_write_object_to_file, METH_VARARGS},
4919 {"pymarshal_read_short_from_file",
4920 pymarshal_read_short_from_file, METH_VARARGS},
4921 {"pymarshal_read_long_from_file",
4922 pymarshal_read_long_from_file, METH_VARARGS},
4923 {"pymarshal_read_last_object_from_file",
4924 pymarshal_read_last_object_from_file, METH_VARARGS},
4925 {"pymarshal_read_object_from_file",
4926 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004927 {"return_null_without_error",
4928 return_null_without_error, METH_NOARGS},
4929 {"return_result_with_error",
4930 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004931 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004932 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4933 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004934 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004935#ifdef HAVE_CLOCK_GETTIME
4936 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4937#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004938 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4939 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004940 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be8072016-03-14 12:04:26 +01004941 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
4942 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01004943 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01004944 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01004945 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01004946 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
4947 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
4948 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004949 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004950 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02004951 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
4952 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
4953 {"pyobject_fastcallkeywords", test_pyobject_fastcallkeywords, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02004954 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004955#ifdef W_STOPCODE
4956 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
4957#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03004958 {"get_mapping_keys", get_mapping_keys, METH_O},
4959 {"get_mapping_values", get_mapping_values, METH_O},
4960 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004961 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05004962 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004963 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02004964 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
4965 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner7ddd56f2018-11-14 00:24:28 +01004966 {"get_global_config", get_global_config, METH_NOARGS},
4967 {"get_core_config", get_core_config, METH_NOARGS},
4968 {"get_main_config", get_main_config, METH_NOARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02004969#ifdef Py_REF_DEBUG
4970 {"negative_refcount", negative_refcount, METH_NOARGS},
4971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00004973};
4974
Thomas Hellera4ea6032003-04-17 18:55:45 +00004975#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
4976
Thomas Wouters89f507f2006-12-13 04:49:30 +00004977typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 char bool_member;
4979 char byte_member;
4980 unsigned char ubyte_member;
4981 short short_member;
4982 unsigned short ushort_member;
4983 int int_member;
4984 unsigned int uint_member;
4985 long long_member;
4986 unsigned long ulong_member;
4987 Py_ssize_t pyssizet_member;
4988 float float_member;
4989 double double_member;
4990 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07004991 long long longlong_member;
4992 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004993} all_structmembers;
4994
4995typedef struct {
4996 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004997 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004998} test_structmembers;
4999
5000static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005001 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5002 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5003 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5004 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5005 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5006 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5007 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5008 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5009 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5010 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5011 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5012 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5013 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5015 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005016 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005017};
5018
5019
Christian Heimes1af737c2008-01-23 08:24:23 +00005020static PyObject *
5021test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005023 static char *keywords[] = {
5024 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5025 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5026 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005027 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005028 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005029 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005030 test_structmembers *ob;
5031 const char *s = NULL;
5032 Py_ssize_t string_len = 0;
5033 ob = PyObject_New(test_structmembers, type);
5034 if (ob == NULL)
5035 return NULL;
5036 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5037 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5038 &ob->structmembers.bool_member,
5039 &ob->structmembers.byte_member,
5040 &ob->structmembers.ubyte_member,
5041 &ob->structmembers.short_member,
5042 &ob->structmembers.ushort_member,
5043 &ob->structmembers.int_member,
5044 &ob->structmembers.uint_member,
5045 &ob->structmembers.long_member,
5046 &ob->structmembers.ulong_member,
5047 &ob->structmembers.pyssizet_member,
5048 &ob->structmembers.float_member,
5049 &ob->structmembers.double_member,
5050 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005051 , &ob->structmembers.longlong_member,
5052 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005053 )) {
5054 Py_DECREF(ob);
5055 return NULL;
5056 }
5057 if (s != NULL) {
5058 if (string_len > 5) {
5059 Py_DECREF(ob);
5060 PyErr_SetString(PyExc_ValueError, "string too long");
5061 return NULL;
5062 }
5063 strcpy(ob->structmembers.inplace_member, s);
5064 }
5065 else {
5066 strcpy(ob->structmembers.inplace_member, "");
5067 }
5068 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005069}
5070
Christian Heimes1af737c2008-01-23 08:24:23 +00005071static void
5072test_structmembers_free(PyObject *ob)
5073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005075}
5076
5077static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005078 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005079 "test_structmembersType",
5080 sizeof(test_structmembers), /* tp_basicsize */
5081 0, /* tp_itemsize */
5082 test_structmembers_free, /* destructor tp_dealloc */
5083 0, /* tp_print */
5084 0, /* tp_getattr */
5085 0, /* tp_setattr */
5086 0, /* tp_reserved */
5087 0, /* tp_repr */
5088 0, /* tp_as_number */
5089 0, /* tp_as_sequence */
5090 0, /* tp_as_mapping */
5091 0, /* tp_hash */
5092 0, /* tp_call */
5093 0, /* tp_str */
5094 PyObject_GenericGetAttr, /* tp_getattro */
5095 PyObject_GenericSetAttr, /* tp_setattro */
5096 0, /* tp_as_buffer */
5097 0, /* tp_flags */
5098 "Type containing all structmember types",
5099 0, /* traverseproc tp_traverse */
5100 0, /* tp_clear */
5101 0, /* tp_richcompare */
5102 0, /* tp_weaklistoffset */
5103 0, /* tp_iter */
5104 0, /* tp_iternext */
5105 0, /* tp_methods */
5106 test_members, /* tp_members */
5107 0,
5108 0,
5109 0,
5110 0,
5111 0,
5112 0,
5113 0,
5114 0,
5115 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005116};
5117
5118
Benjamin Petersond51374e2014-04-09 23:55:56 -04005119typedef struct {
5120 PyObject_HEAD
5121} matmulObject;
5122
5123static PyObject *
5124matmulType_matmul(PyObject *self, PyObject *other)
5125{
5126 return Py_BuildValue("(sOO)", "matmul", self, other);
5127}
5128
5129static PyObject *
5130matmulType_imatmul(PyObject *self, PyObject *other)
5131{
5132 return Py_BuildValue("(sOO)", "imatmul", self, other);
5133}
5134
5135static void
5136matmulType_dealloc(PyObject *self)
5137{
Zachary Ware420dc562014-04-23 13:51:27 -05005138 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005139}
5140
5141static PyNumberMethods matmulType_as_number = {
5142 0, /* nb_add */
5143 0, /* nb_subtract */
5144 0, /* nb_multiply */
5145 0, /* nb_remainde r*/
5146 0, /* nb_divmod */
5147 0, /* nb_power */
5148 0, /* nb_negative */
5149 0, /* tp_positive */
5150 0, /* tp_absolute */
5151 0, /* tp_bool */
5152 0, /* nb_invert */
5153 0, /* nb_lshift */
5154 0, /* nb_rshift */
5155 0, /* nb_and */
5156 0, /* nb_xor */
5157 0, /* nb_or */
5158 0, /* nb_int */
5159 0, /* nb_reserved */
5160 0, /* nb_float */
5161 0, /* nb_inplace_add */
5162 0, /* nb_inplace_subtract */
5163 0, /* nb_inplace_multiply */
5164 0, /* nb_inplace_remainder */
5165 0, /* nb_inplace_power */
5166 0, /* nb_inplace_lshift */
5167 0, /* nb_inplace_rshift */
5168 0, /* nb_inplace_and */
5169 0, /* nb_inplace_xor */
5170 0, /* nb_inplace_or */
5171 0, /* nb_floor_divide */
5172 0, /* nb_true_divide */
5173 0, /* nb_inplace_floor_divide */
5174 0, /* nb_inplace_true_divide */
5175 0, /* nb_index */
5176 matmulType_matmul, /* nb_matrix_multiply */
5177 matmulType_imatmul /* nb_matrix_inplace_multiply */
5178};
5179
5180static PyTypeObject matmulType = {
5181 PyVarObject_HEAD_INIT(NULL, 0)
5182 "matmulType",
5183 sizeof(matmulObject), /* tp_basicsize */
5184 0, /* tp_itemsize */
5185 matmulType_dealloc, /* destructor tp_dealloc */
5186 0, /* tp_print */
5187 0, /* tp_getattr */
5188 0, /* tp_setattr */
5189 0, /* tp_reserved */
5190 0, /* tp_repr */
5191 &matmulType_as_number, /* tp_as_number */
5192 0, /* tp_as_sequence */
5193 0, /* tp_as_mapping */
5194 0, /* tp_hash */
5195 0, /* tp_call */
5196 0, /* tp_str */
5197 PyObject_GenericGetAttr, /* tp_getattro */
5198 PyObject_GenericSetAttr, /* tp_setattro */
5199 0, /* tp_as_buffer */
5200 0, /* tp_flags */
5201 "C level type with matrix operations defined",
5202 0, /* traverseproc tp_traverse */
5203 0, /* tp_clear */
5204 0, /* tp_richcompare */
5205 0, /* tp_weaklistoffset */
5206 0, /* tp_iter */
5207 0, /* tp_iternext */
5208 0, /* tp_methods */
5209 0, /* tp_members */
5210 0,
5211 0,
5212 0,
5213 0,
5214 0,
5215 0,
5216 0,
5217 0,
5218 PyType_GenericNew, /* tp_new */
5219 PyObject_Del, /* tp_free */
5220};
5221
Martin v. Löwis1a214512008-06-11 05:26:20 +00005222
Yury Selivanov75445082015-05-11 22:57:16 -04005223typedef struct {
5224 PyObject_HEAD
5225 PyObject *ao_iterator;
5226} awaitObject;
5227
5228
5229static PyObject *
5230awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5231{
5232 PyObject *v;
5233 awaitObject *ao;
5234
5235 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
5236 return NULL;
5237
5238 ao = (awaitObject *)type->tp_alloc(type, 0);
5239 if (ao == NULL) {
5240 return NULL;
5241 }
5242
5243 Py_INCREF(v);
5244 ao->ao_iterator = v;
5245
5246 return (PyObject *)ao;
5247}
5248
5249
5250static void
5251awaitObject_dealloc(awaitObject *ao)
5252{
5253 Py_CLEAR(ao->ao_iterator);
5254 Py_TYPE(ao)->tp_free(ao);
5255}
5256
5257
5258static PyObject *
5259awaitObject_await(awaitObject *ao)
5260{
5261 Py_INCREF(ao->ao_iterator);
5262 return ao->ao_iterator;
5263}
5264
5265static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04005266 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04005267 0, /* am_aiter */
5268 0 /* am_anext */
5269};
5270
5271
5272static PyTypeObject awaitType = {
5273 PyVarObject_HEAD_INIT(NULL, 0)
5274 "awaitType",
5275 sizeof(awaitObject), /* tp_basicsize */
5276 0, /* tp_itemsize */
5277 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
5278 0, /* tp_print */
5279 0, /* tp_getattr */
5280 0, /* tp_setattr */
5281 &awaitType_as_async, /* tp_as_async */
5282 0, /* tp_repr */
5283 0, /* tp_as_number */
5284 0, /* tp_as_sequence */
5285 0, /* tp_as_mapping */
5286 0, /* tp_hash */
5287 0, /* tp_call */
5288 0, /* tp_str */
5289 PyObject_GenericGetAttr, /* tp_getattro */
5290 PyObject_GenericSetAttr, /* tp_setattro */
5291 0, /* tp_as_buffer */
5292 0, /* tp_flags */
5293 "C level type with tp_as_async",
5294 0, /* traverseproc tp_traverse */
5295 0, /* tp_clear */
5296 0, /* tp_richcompare */
5297 0, /* tp_weaklistoffset */
5298 0, /* tp_iter */
5299 0, /* tp_iternext */
5300 0, /* tp_methods */
5301 0, /* tp_members */
5302 0,
5303 0,
5304 0,
5305 0,
5306 0,
5307 0,
5308 0,
5309 0,
5310 awaitObject_new, /* tp_new */
5311 PyObject_Del, /* tp_free */
5312};
5313
5314
xdegaye56d1f5c2017-10-26 15:09:06 +02005315static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
5316
5317static PyTypeObject PyRecursingInfinitelyError_Type = {
5318 PyVarObject_HEAD_INIT(NULL, 0)
5319 "RecursingInfinitelyError", /* tp_name */
5320 sizeof(PyBaseExceptionObject), /* tp_basicsize */
5321 0, /* tp_itemsize */
5322 0, /* tp_dealloc */
5323 0, /* tp_print */
5324 0, /* tp_getattr */
5325 0, /* tp_setattr */
5326 0, /* tp_reserved */
5327 0, /* tp_repr */
5328 0, /* tp_as_number */
5329 0, /* tp_as_sequence */
5330 0, /* tp_as_mapping */
5331 0, /* tp_hash */
5332 0, /* tp_call */
5333 0, /* tp_str */
5334 0, /* tp_getattro */
5335 0, /* tp_setattro */
5336 0, /* tp_as_buffer */
5337 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5338 "Instantiating this exception starts infinite recursion.", /* tp_doc */
5339 0, /* tp_traverse */
5340 0, /* tp_clear */
5341 0, /* tp_richcompare */
5342 0, /* tp_weaklistoffset */
5343 0, /* tp_iter */
5344 0, /* tp_iternext */
5345 0, /* tp_methods */
5346 0, /* tp_members */
5347 0, /* tp_getset */
5348 0, /* tp_base */
5349 0, /* tp_dict */
5350 0, /* tp_descr_get */
5351 0, /* tp_descr_set */
5352 0, /* tp_dictoffset */
5353 (initproc)recurse_infinitely_error_init, /* tp_init */
5354 0, /* tp_alloc */
5355 0, /* tp_new */
5356};
5357
5358static int
5359recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
5360{
5361 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
5362
5363 /* Instantiating this exception starts infinite recursion. */
5364 Py_INCREF(type);
5365 PyErr_SetObject(type, NULL);
5366 return -1;
5367}
5368
5369
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005370/* Test PEP 560 */
5371
5372typedef struct {
5373 PyObject_HEAD
5374 PyObject *item;
5375} PyGenericAliasObject;
5376
5377static void
5378generic_alias_dealloc(PyGenericAliasObject *self)
5379{
5380 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01005381 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005382}
5383
5384static PyObject *
5385generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
5386{
5387 return PyTuple_Pack(1, self->item);
5388}
5389
5390static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005391 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005392 {NULL} /* sentinel */
5393};
5394
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07005395static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005396 PyVarObject_HEAD_INIT(NULL, 0)
5397 "GenericAlias",
5398 sizeof(PyGenericAliasObject),
5399 0,
5400 .tp_dealloc = (destructor)generic_alias_dealloc,
5401 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5402 .tp_methods = generic_alias_methods,
5403};
5404
5405static PyObject *
5406generic_alias_new(PyObject *item)
5407{
5408 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
5409 if (o == NULL) {
5410 return NULL;
5411 }
5412 Py_INCREF(item);
5413 o->item = item;
5414 return (PyObject*) o;
5415}
5416
5417typedef struct {
5418 PyObject_HEAD
5419} PyGenericObject;
5420
5421static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005422generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005423{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005424 return generic_alias_new(item);
5425}
5426
5427static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005428 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005429 {NULL} /* sentinel */
5430};
5431
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07005432static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005433 PyVarObject_HEAD_INIT(NULL, 0)
5434 "Generic",
5435 sizeof(PyGenericObject),
5436 0,
5437 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5438 .tp_methods = generic_methods,
5439};
5440
5441
Martin v. Löwis1a214512008-06-11 05:26:20 +00005442static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005443 PyModuleDef_HEAD_INIT,
5444 "_testcapi",
5445 NULL,
5446 -1,
5447 TestMethods,
5448 NULL,
5449 NULL,
5450 NULL,
5451 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005452};
5453
Nick Coghland5cacbb2015-05-23 22:24:10 +10005454/* Per PEP 489, this module will not be converted to multi-phase initialization
5455 */
5456
Mark Hammond62b1ab12002-07-23 06:31:15 +00005457PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005458PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00005459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005460 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005462 m = PyModule_Create(&_testcapimodule);
5463 if (m == NULL)
5464 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005466 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00005467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005468 Py_TYPE(&test_structmembersType)=&PyType_Type;
5469 Py_INCREF(&test_structmembersType);
5470 /* don't use a name starting with "test", since we don't want
5471 test_capi to automatically call this */
5472 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005473 if (PyType_Ready(&matmulType) < 0)
5474 return NULL;
5475 Py_INCREF(&matmulType);
5476 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005477
Yury Selivanov75445082015-05-11 22:57:16 -04005478 if (PyType_Ready(&awaitType) < 0)
5479 return NULL;
5480 Py_INCREF(&awaitType);
5481 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
5482
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005483 if (PyType_Ready(&GenericAlias_Type) < 0)
5484 return NULL;
5485 Py_INCREF(&GenericAlias_Type);
5486 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
5487
5488 if (PyType_Ready(&Generic_Type) < 0)
5489 return NULL;
5490 Py_INCREF(&Generic_Type);
5491 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
5492
xdegaye56d1f5c2017-10-26 15:09:06 +02005493 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
5494 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
5495 return NULL;
5496 }
5497 Py_INCREF(&PyRecursingInfinitelyError_Type);
5498 PyModule_AddObject(m, "RecursingInfinitelyError",
5499 (PyObject *)&PyRecursingInfinitelyError_Type);
5500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005501 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
5502 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
5503 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
5504 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
5505 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
5506 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
5507 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
5508 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
5509 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
5510 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
5511 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
5512 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
5513 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
5514 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
5515 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
5516 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
5517 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
5518 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
5519 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
5520 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
5521 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
5522 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02005523 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005524 Py_INCREF(&PyInstanceMethod_Type);
5525 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00005526
Larry Hastings2a727912014-01-16 11:32:01 -08005527 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner5d39e042017-11-29 17:20:38 +01005528#ifdef WITH_PYMALLOC
5529 PyModule_AddObject(m, "WITH_PYMALLOC", Py_True);
5530#else
5531 PyModule_AddObject(m, "WITH_PYMALLOC", Py_False);
5532#endif
Larry Hastings2a727912014-01-16 11:32:01 -08005533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
5535 Py_INCREF(TestError);
5536 PyModule_AddObject(m, "error", TestError);
5537 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005538}