blob: 5b0da783e5e2a449c004cd6d8116625501e2d86d [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
Eric Snowef4ac962019-02-24 15:40:47 -08002448 /* XXX Use the internal _Py_AddPendingCall(). */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 r = Py_AddPendingCall(&_pending_callback, callable);
2450 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 if (r<0) {
2453 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002454 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002456 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002457}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002458
Neal Norwitzb0d26332007-08-25 00:49:05 +00002459/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002460static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002461test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 PyObject *result;
2464 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002465
Alexander Belopolskye239d232010-12-08 23:31:48 +00002466#define CHECK_1_FORMAT(FORMAT, TYPE) \
2467 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2468 if (result == NULL) \
2469 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002470 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002471 msg = FORMAT " failed at 1"; \
2472 goto Fail; \
2473 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 CHECK_1_FORMAT("%d", int);
2477 CHECK_1_FORMAT("%ld", long);
2478 /* The z width modifier was added in Python 2.5. */
2479 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 /* The u type code was added in Python 2.5. */
2482 CHECK_1_FORMAT("%u", unsigned int);
2483 CHECK_1_FORMAT("%lu", unsigned long);
2484 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002486 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002487 CHECK_1_FORMAT("%llu", unsigned long long);
2488 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002491
2492 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 Py_XDECREF(result);
2494 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002495
2496#undef CHECK_1_FORMAT
2497}
2498
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002499
2500static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302501test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2503 int result;
2504 if (py_s == NULL)
2505 return NULL;
2506 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2507 Py_DECREF(py_s);
2508 if (!result) {
2509 PyErr_SetString(TestError, "Python string ending in NULL "
2510 "should not compare equal to c string.");
2511 return NULL;
2512 }
2513 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002514}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002515
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002516/* This is here to provide a docstring for test_descr. */
2517static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302518test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002521}
2522
Mark Dickinson725bfd82009-05-03 20:33:40 +00002523/* Test PyOS_string_to_double. */
2524static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302525test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002527 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529#define CHECK_STRING(STR, expected) \
2530 result = PyOS_string_to_double(STR, NULL, NULL); \
2531 if (result == -1.0 && PyErr_Occurred()) \
2532 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002533 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 msg = "conversion of " STR " to float failed"; \
2535 goto fail; \
2536 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538#define CHECK_INVALID(STR) \
2539 result = PyOS_string_to_double(STR, NULL, NULL); \
2540 if (result == -1.0 && PyErr_Occurred()) { \
2541 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2542 PyErr_Clear(); \
2543 else \
2544 return NULL; \
2545 } \
2546 else { \
2547 msg = "conversion of " STR " didn't raise ValueError"; \
2548 goto fail; \
2549 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 CHECK_STRING("0.1", 0.1);
2552 CHECK_STRING("1.234", 1.234);
2553 CHECK_STRING("-1.35", -1.35);
2554 CHECK_STRING(".1e01", 1.0);
2555 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 CHECK_INVALID(" 0.1");
2558 CHECK_INVALID("\t\n-3");
2559 CHECK_INVALID(".123 ");
2560 CHECK_INVALID("3\n");
2561 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002563 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002564 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002566#undef CHECK_STRING
2567#undef CHECK_INVALID
2568}
2569
2570
Benjamin Petersonb173f782009-05-05 22:31:58 +00002571/* Coverage testing of capsule objects. */
2572
2573static const char *capsule_name = "capsule name";
2574static char *capsule_pointer = "capsule pointer";
2575static char *capsule_context = "capsule context";
2576static const char *capsule_error = NULL;
2577static int
2578capsule_destructor_call_count = 0;
2579
2580static void
2581capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 capsule_destructor_call_count++;
2583 if (PyCapsule_GetContext(o) != capsule_context) {
2584 capsule_error = "context did not match in destructor!";
2585 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2586 capsule_error = "destructor did not match in destructor! (woah!)";
2587 } else if (PyCapsule_GetName(o) != capsule_name) {
2588 capsule_error = "name did not match in destructor!";
2589 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2590 capsule_error = "pointer did not match in destructor!";
2591 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002592}
2593
2594typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 char *name;
2596 char *module;
2597 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002598} known_capsule;
2599
2600static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002601test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00002602{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 PyObject *object;
2604 const char *error = NULL;
2605 void *pointer;
2606 void *pointer2;
2607 known_capsule known_capsules[] = {
2608 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2609 KNOWN_CAPSULE("_socket", "CAPI"),
2610 KNOWN_CAPSULE("_curses", "_C_API"),
2611 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2612 { NULL, NULL },
2613 };
2614 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002615
2616#define FAIL(x) { error = (x); goto exit; }
2617
2618#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 if (capsule_error) { \
2620 FAIL(capsule_error); \
2621 } \
2622 else if (!capsule_destructor_call_count) { \
2623 FAIL("destructor not called!"); \
2624 } \
2625 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2628 PyCapsule_SetContext(object, capsule_context);
2629 capsule_destructor(object);
2630 CHECK_DESTRUCTOR;
2631 Py_DECREF(object);
2632 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 object = PyCapsule_New(known, "ignored", NULL);
2635 PyCapsule_SetPointer(object, capsule_pointer);
2636 PyCapsule_SetName(object, capsule_name);
2637 PyCapsule_SetDestructor(object, capsule_destructor);
2638 PyCapsule_SetContext(object, capsule_context);
2639 capsule_destructor(object);
2640 CHECK_DESTRUCTOR;
2641 /* intentionally access using the wrong name */
2642 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2643 if (!PyErr_Occurred()) {
2644 FAIL("PyCapsule_GetPointer should have failed but did not!");
2645 }
2646 PyErr_Clear();
2647 if (pointer2) {
2648 if (pointer2 == capsule_pointer) {
2649 FAIL("PyCapsule_GetPointer should not have"
2650 " returned the internal pointer!");
2651 } else {
2652 FAIL("PyCapsule_GetPointer should have "
2653 "returned NULL pointer but did not!");
2654 }
2655 }
2656 PyCapsule_SetDestructor(object, NULL);
2657 Py_DECREF(object);
2658 if (capsule_destructor_call_count) {
2659 FAIL("destructor called when it should not have been!");
2660 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 for (known = &known_capsules[0]; known->module != NULL; known++) {
2663 /* yeah, ordinarily I wouldn't do this either,
2664 but it's fine for this test harness.
2665 */
2666 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002667#undef FAIL
2668#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002669 { \
2670 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2671 x, known->module, known->attribute); \
2672 error = buffer; \
2673 goto exit; \
2674 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002676 PyObject *module = PyImport_ImportModule(known->module);
2677 if (module) {
2678 pointer = PyCapsule_Import(known->name, 0);
2679 if (!pointer) {
2680 Py_DECREF(module);
2681 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2682 }
2683 object = PyObject_GetAttrString(module, known->attribute);
2684 if (!object) {
2685 Py_DECREF(module);
2686 return NULL;
2687 }
2688 pointer2 = PyCapsule_GetPointer(object,
2689 "weebles wobble but they don't fall down");
2690 if (!PyErr_Occurred()) {
2691 Py_DECREF(object);
2692 Py_DECREF(module);
2693 FAIL("PyCapsule_GetPointer should have failed but did not!");
2694 }
2695 PyErr_Clear();
2696 if (pointer2) {
2697 Py_DECREF(module);
2698 Py_DECREF(object);
2699 if (pointer2 == pointer) {
2700 FAIL("PyCapsule_GetPointer should not have"
2701 " returned its internal pointer!");
2702 } else {
2703 FAIL("PyCapsule_GetPointer should have"
2704 " returned NULL pointer but did not!");
2705 }
2706 }
2707 Py_DECREF(object);
2708 Py_DECREF(module);
2709 }
2710 else
2711 PyErr_Clear();
2712 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002713
2714 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 if (error) {
2716 return raiseTestError("test_capsule", error);
2717 }
2718 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002719#undef FAIL
2720}
2721
Guido van Rossumddefaf32007-01-14 03:31:43 +00002722#ifdef HAVE_GETTIMEOFDAY
2723/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002724static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002725{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 e->tv_sec -= s->tv_sec;
2727 e->tv_usec -= s->tv_usec;
2728 if (e->tv_usec < 0) {
2729 e->tv_sec -=1;
2730 e->tv_usec += 1000000;
2731 }
2732 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002733}
2734
2735static PyObject *
2736profile_int(PyObject *self, PyObject* args)
2737{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 int i, k;
2739 struct timeval start, stop;
2740 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 /* Test 1: Allocate and immediately deallocate
2743 many small integers */
2744 gettimeofday(&start, NULL);
2745 for(k=0; k < 20000; k++)
2746 for(i=0; i < 1000; i++) {
2747 single = PyLong_FromLong(i);
2748 Py_DECREF(single);
2749 }
2750 gettimeofday(&stop, NULL);
2751 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 /* Test 2: Allocate and immediately deallocate
2754 many large integers */
2755 gettimeofday(&start, NULL);
2756 for(k=0; k < 20000; k++)
2757 for(i=0; i < 1000; i++) {
2758 single = PyLong_FromLong(i+1000000);
2759 Py_DECREF(single);
2760 }
2761 gettimeofday(&stop, NULL);
2762 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 /* Test 3: Allocate a few integers, then release
2765 them all simultaneously. */
2766 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002767 if (multiple == NULL)
2768 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 gettimeofday(&start, NULL);
2770 for(k=0; k < 20000; k++) {
2771 for(i=0; i < 1000; i++) {
2772 multiple[i] = PyLong_FromLong(i+1000000);
2773 }
2774 for(i=0; i < 1000; i++) {
2775 Py_DECREF(multiple[i]);
2776 }
2777 }
2778 gettimeofday(&stop, NULL);
2779 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002780 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 /* Test 4: Allocate many integers, then release
2783 them all simultaneously. */
2784 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002785 if (multiple == NULL)
2786 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 gettimeofday(&start, NULL);
2788 for(k=0; k < 20; k++) {
2789 for(i=0; i < 1000000; i++) {
2790 multiple[i] = PyLong_FromLong(i+1000000);
2791 }
2792 for(i=0; i < 1000000; i++) {
2793 Py_DECREF(multiple[i]);
2794 }
2795 }
2796 gettimeofday(&stop, NULL);
2797 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002798 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 /* Test 5: Allocate many integers < 32000 */
2801 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002802 if (multiple == NULL)
2803 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 gettimeofday(&start, NULL);
2805 for(k=0; k < 10; k++) {
2806 for(i=0; i < 1000000; i++) {
2807 multiple[i] = PyLong_FromLong(i+1000);
2808 }
2809 for(i=0; i < 1000000; i++) {
2810 Py_DECREF(multiple[i]);
2811 }
2812 }
2813 gettimeofday(&stop, NULL);
2814 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002815 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 /* Test 6: Perform small int addition */
2818 op1 = PyLong_FromLong(1);
2819 gettimeofday(&start, NULL);
2820 for(i=0; i < 10000000; i++) {
2821 result = PyNumber_Add(op1, op1);
2822 Py_DECREF(result);
2823 }
2824 gettimeofday(&stop, NULL);
2825 Py_DECREF(op1);
2826 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 /* Test 7: Perform medium int addition */
2829 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002830 if (op1 == NULL)
2831 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 gettimeofday(&start, NULL);
2833 for(i=0; i < 10000000; i++) {
2834 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002835 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 }
2837 gettimeofday(&stop, NULL);
2838 Py_DECREF(op1);
2839 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002840
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002841 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002842}
2843#endif
2844
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002845/* To test the format of tracebacks as printed out. */
2846static PyObject *
2847traceback_print(PyObject *self, PyObject *args)
2848{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 PyObject *file;
2850 PyObject *traceback;
2851 int result;
2852
2853 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2854 &traceback, &file))
2855 return NULL;
2856
2857 result = PyTraceBack_Print(traceback, file);
2858 if (result < 0)
2859 return NULL;
2860 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002861}
2862
Benjamin Petersone6528212008-07-15 15:32:09 +00002863/* To test the format of exceptions as printed out. */
2864static PyObject *
2865exception_print(PyObject *self, PyObject *args)
2866{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002867 PyObject *value;
2868 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 if (!PyArg_ParseTuple(args, "O:exception_print",
2871 &value))
2872 return NULL;
2873 if (!PyExceptionInstance_Check(value)) {
2874 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2875 return NULL;
2876 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 tb = PyException_GetTraceback(value);
2879 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2880 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002883}
2884
2885
2886
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002887
2888/* reliably raise a MemoryError */
2889static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302890raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002891{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 PyErr_NoMemory();
2893 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002894}
2895
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002896/* Issue 6012 */
2897static PyObject *str1, *str2;
2898static int
2899failing_converter(PyObject *obj, void *arg)
2900{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901 /* Clone str1, then let the conversion fail. */
2902 assert(str1);
2903 str2 = str1;
2904 Py_INCREF(str2);
2905 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002906}
2907static PyObject*
2908argparsing(PyObject *o, PyObject *args)
2909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 PyObject *res;
2911 str1 = str2 = NULL;
2912 if (!PyArg_ParseTuple(args, "O&O&",
2913 PyUnicode_FSConverter, &str1,
2914 failing_converter, &str2)) {
2915 if (!str2)
2916 /* argument converter not called? */
2917 return NULL;
2918 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002919 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002920 Py_DECREF(str2);
2921 PyErr_Clear();
2922 return res;
2923 }
2924 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002925}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002926
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002927/* To test that the result of PyCode_NewEmpty has the right members. */
2928static PyObject *
2929code_newempty(PyObject *self, PyObject *args)
2930{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 const char *filename;
2932 const char *funcname;
2933 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002935 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2936 &filename, &funcname, &firstlineno))
2937 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002939 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002940}
2941
Georg Brandl1e28a272009-12-28 08:41:01 +00002942/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2943 Run via Lib/test/test_exceptions.py */
2944static PyObject *
2945make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 const char *name;
2948 const char *doc = NULL;
2949 PyObject *base = NULL;
2950 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2955 "s|sOO:make_exception_with_doc", kwlist,
2956 &name, &doc, &base, &dict))
2957 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002960}
2961
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002962static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302963make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002964{
2965 Py_buffer info;
2966 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2967 return NULL;
2968 return PyMemoryView_FromBuffer(&info);
2969}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002970
Stefan Krah7213fcc2015-02-01 16:19:23 +01002971static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002972test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01002973{
2974 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2975 int init[5] = {0, 1, 2, 3, 4};
2976 Py_ssize_t itemsize = sizeof(int);
2977 Py_ssize_t shape = 5;
2978 Py_ssize_t strides = 2 * itemsize;
2979 Py_buffer view = {
2980 data,
2981 NULL,
2982 5 * itemsize,
2983 itemsize,
2984 1,
2985 1,
2986 NULL,
2987 &shape,
2988 &strides,
2989 NULL,
2990 NULL
2991 };
2992 int *ptr;
2993 int i;
2994
2995 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2996 ptr = view.buf;
2997 for (i = 0; i < 5; i++) {
2998 if (ptr[2*i] != i) {
2999 PyErr_SetString(TestError,
3000 "test_from_contiguous: incorrect result");
3001 return NULL;
3002 }
3003 }
3004
3005 view.buf = &data[8];
3006 view.strides[0] = -2 * itemsize;
3007
3008 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3009 ptr = view.buf;
3010 for (i = 0; i < 5; i++) {
3011 if (*(ptr-2*i) != i) {
3012 PyErr_SetString(TestError,
3013 "test_from_contiguous: incorrect result");
3014 return NULL;
3015 }
3016 }
3017
3018 Py_RETURN_NONE;
3019}
Stefan Krah650c1e82015-02-03 21:43:23 +01003020
Stefan Kraha7559c02015-02-03 22:27:21 +01003021#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003022extern PyTypeObject _PyBytesIOBuffer_Type;
3023
Stefan Krah5178d912015-02-03 16:57:21 +01003024static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003025test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003026{
Stefan Krah650c1e82015-02-03 21:43:23 +01003027 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003028 PyObject *b;
3029 char *dummy[1];
3030 int ret, match;
3031
Stefan Krah650c1e82015-02-03 21:43:23 +01003032 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003033 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3034 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3035 PyErr_Clear();
3036 if (ret != -1 || match == 0)
3037 goto error;
3038
Stefan Krah650c1e82015-02-03 21:43:23 +01003039 /* bytesiobuf_getbuffer() */
3040 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003041 if (b == NULL) {
3042 return NULL;
3043 }
3044
3045 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3046 Py_DECREF(b);
3047 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3048 PyErr_Clear();
3049 if (ret != -1 || match == 0)
3050 goto error;
3051
3052 Py_RETURN_NONE;
3053
3054error:
3055 PyErr_SetString(TestError,
3056 "test_pep3118_obsolete_write_locks: failure");
3057 return NULL;
3058}
Stefan Kraha7559c02015-02-03 22:27:21 +01003059#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003060
Stefan Krah650c1e82015-02-03 21:43:23 +01003061/* This tests functions that historically supported write locks. It is
3062 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3063 is entitled to segfault in that case. */
3064static PyObject *
3065getbuffer_with_null_view(PyObject* self, PyObject *obj)
3066{
3067 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3068 return NULL;
3069
3070 Py_RETURN_NONE;
3071}
3072
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003073/* Test that the fatal error from not having a current thread doesn't
3074 cause an infinite loop. Run via Lib/test/test_capi.py */
3075static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303076crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003077{
3078 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003079 /* Using PyThreadState_Get() directly allows the test to pass in
3080 !pydebug mode. However, the test only actually tests anything
3081 in pydebug mode, since that's where the infinite loop was in
3082 the first place. */
3083 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003084 Py_END_ALLOW_THREADS
3085 return NULL;
3086}
3087
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003088/* To run some code in a sub-interpreter. */
3089static PyObject *
3090run_in_subinterp(PyObject *self, PyObject *args)
3091{
3092 const char *code;
3093 int r;
3094 PyThreadState *substate, *mainstate;
3095
3096 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3097 &code))
3098 return NULL;
3099
3100 mainstate = PyThreadState_Get();
3101
3102 PyThreadState_Swap(NULL);
3103
3104 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003105 if (substate == NULL) {
3106 /* Since no new thread state was created, there is no exception to
3107 propagate; raise a fresh one after swapping in the old thread
3108 state. */
3109 PyThreadState_Swap(mainstate);
3110 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3111 return NULL;
3112 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003113 r = PyRun_SimpleString(code);
3114 Py_EndInterpreter(substate);
3115
3116 PyThreadState_Swap(mainstate);
3117
3118 return PyLong_FromLong(r);
3119}
3120
Victor Stinner3c1b3792014-02-17 00:02:43 +01003121static int
3122check_time_rounding(int round)
3123{
Victor Stinner74474232015-09-02 01:43:56 +02003124 if (round != _PyTime_ROUND_FLOOR
3125 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003126 && round != _PyTime_ROUND_HALF_EVEN
3127 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003128 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3129 return -1;
3130 }
3131 return 0;
3132}
3133
Victor Stinner5d272cc2012-03-13 13:35:55 +01003134static PyObject *
3135test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3136{
3137 PyObject *obj;
3138 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003139 int round;
3140 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003141 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003142 if (check_time_rounding(round) < 0)
3143 return NULL;
3144 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003145 return NULL;
3146 return _PyLong_FromTime_t(sec);
3147}
3148
3149static PyObject *
3150test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3151{
3152 PyObject *obj;
3153 time_t sec;
3154 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003155 int round;
3156 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003157 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003158 if (check_time_rounding(round) < 0)
3159 return NULL;
3160 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003161 return NULL;
3162 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3163}
3164
Victor Stinner643cd682012-03-02 22:54:03 +01003165static PyObject *
3166test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3167{
3168 PyObject *obj;
3169 time_t sec;
3170 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003171 int round;
3172 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003173 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003174 if (check_time_rounding(round) < 0)
3175 return NULL;
3176 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003177 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003178 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003179}
3180
Antoine Pitrou796564c2013-07-30 19:59:21 +02003181static void
3182slot_tp_del(PyObject *self)
3183{
3184 _Py_IDENTIFIER(__tp_del__);
3185 PyObject *del, *res;
3186 PyObject *error_type, *error_value, *error_traceback;
3187
3188 /* Temporarily resurrect the object. */
3189 assert(self->ob_refcnt == 0);
3190 self->ob_refcnt = 1;
3191
3192 /* Save the current exception, if any. */
3193 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3194
3195 /* Execute __del__ method, if any. */
3196 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3197 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003198 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003199 if (res == NULL)
3200 PyErr_WriteUnraisable(del);
3201 else
3202 Py_DECREF(res);
3203 Py_DECREF(del);
3204 }
3205
3206 /* Restore the saved exception. */
3207 PyErr_Restore(error_type, error_value, error_traceback);
3208
3209 /* Undo the temporary resurrection; can't use DECREF here, it would
3210 * cause a recursive call.
3211 */
3212 assert(self->ob_refcnt > 0);
3213 if (--self->ob_refcnt == 0)
3214 return; /* this is the normal path out */
3215
3216 /* __del__ resurrected it! Make it look like the original Py_DECREF
3217 * never happened.
3218 */
3219 {
3220 Py_ssize_t refcnt = self->ob_refcnt;
3221 _Py_NewReference(self);
3222 self->ob_refcnt = refcnt;
3223 }
INADA Naokid8521422018-05-17 11:07:21 +09003224 assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self));
Antoine Pitrou796564c2013-07-30 19:59:21 +02003225 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3226 * we need to undo that. */
3227 _Py_DEC_REFTOTAL;
3228 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3229 * chain, so no more to do there.
3230 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3231 * _Py_NewReference bumped tp_allocs: both of those need to be
3232 * undone.
3233 */
3234#ifdef COUNT_ALLOCS
3235 --Py_TYPE(self)->tp_frees;
3236 --Py_TYPE(self)->tp_allocs;
3237#endif
3238}
3239
3240static PyObject *
3241with_tp_del(PyObject *self, PyObject *args)
3242{
3243 PyObject *obj;
3244 PyTypeObject *tp;
3245
3246 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3247 return NULL;
3248 tp = (PyTypeObject *) obj;
3249 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3250 PyErr_Format(PyExc_TypeError,
3251 "heap type expected, got %R", obj);
3252 return NULL;
3253 }
3254 tp->tp_del = slot_tp_del;
3255 Py_INCREF(obj);
3256 return obj;
3257}
3258
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003259static PyMethodDef ml;
3260
3261static PyObject *
3262create_cfunction(PyObject *self, PyObject *args)
3263{
3264 return PyCFunction_NewEx(&ml, self, NULL);
3265}
3266
3267static PyMethodDef ml = {
3268 "create_cfunction",
3269 create_cfunction,
3270 METH_NOARGS,
3271 NULL
3272};
3273
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003274static PyObject *
3275_test_incref(PyObject *ob)
3276{
3277 Py_INCREF(ob);
3278 return ob;
3279}
3280
3281static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303282test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003283{
3284 PyObject *obj = PyLong_FromLong(0);
3285 Py_XINCREF(_test_incref(obj));
3286 Py_DECREF(obj);
3287 Py_DECREF(obj);
3288 Py_DECREF(obj);
3289 Py_RETURN_NONE;
3290}
3291
3292static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303293test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003294{
3295 PyObject *obj = PyLong_FromLong(0);
3296 Py_INCREF(_test_incref(obj));
3297 Py_DECREF(obj);
3298 Py_DECREF(obj);
3299 Py_DECREF(obj);
3300 Py_RETURN_NONE;
3301}
3302
3303static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303304test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003305{
3306 Py_XDECREF(PyLong_FromLong(0));
3307 Py_RETURN_NONE;
3308}
3309
3310static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303311test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003312{
3313 Py_DECREF(PyLong_FromLong(0));
3314 Py_RETURN_NONE;
3315}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003316
Victor Stinner0507bf52013-07-07 02:05:46 +02003317static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003318test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3319 PyObject *Py_UNUSED(args))
3320{
3321 PyStructSequence_Desc descr;
3322 PyStructSequence_Field descr_fields[3];
3323
3324 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3325 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3326 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3327
3328 descr.name = "_testcapi.test_descr";
3329 descr.doc = "This is used to test for memory leaks in NewType";
3330 descr.fields = descr_fields;
3331 descr.n_in_sequence = 1;
3332
3333 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3334 assert(structseq_type != NULL);
3335 assert(PyType_Check(structseq_type));
3336 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3337 Py_DECREF(structseq_type);
3338
3339 Py_RETURN_NONE;
3340}
3341
3342static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303343test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003344{
3345 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003346 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003347 Py_DecRef(obj);
3348 Py_DecRef(obj);
3349 Py_RETURN_NONE;
3350}
3351
3352static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303353test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003354{
3355 void *ptr;
3356
Victor Stinnerdb067af2014-05-02 22:31:14 +02003357 ptr = PyMem_RawMalloc(0);
3358 if (ptr == NULL) {
3359 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3360 return NULL;
3361 }
3362 PyMem_RawFree(ptr);
3363
3364 ptr = PyMem_RawCalloc(0, 0);
3365 if (ptr == NULL) {
3366 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3367 return NULL;
3368 }
3369 PyMem_RawFree(ptr);
3370
Victor Stinner0507bf52013-07-07 02:05:46 +02003371 ptr = PyMem_Malloc(0);
3372 if (ptr == NULL) {
3373 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3374 return NULL;
3375 }
3376 PyMem_Free(ptr);
3377
Victor Stinnerdb067af2014-05-02 22:31:14 +02003378 ptr = PyMem_Calloc(0, 0);
3379 if (ptr == NULL) {
3380 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3381 return NULL;
3382 }
3383 PyMem_Free(ptr);
3384
Victor Stinner0507bf52013-07-07 02:05:46 +02003385 ptr = PyObject_Malloc(0);
3386 if (ptr == NULL) {
3387 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3388 return NULL;
3389 }
3390 PyObject_Free(ptr);
3391
Victor Stinnerdb067af2014-05-02 22:31:14 +02003392 ptr = PyObject_Calloc(0, 0);
3393 if (ptr == NULL) {
3394 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3395 return NULL;
3396 }
3397 PyObject_Free(ptr);
3398
Victor Stinner0507bf52013-07-07 02:05:46 +02003399 Py_RETURN_NONE;
3400}
3401
3402typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003403 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003404
3405 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003406 size_t calloc_nelem;
3407 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003408 void *realloc_ptr;
3409 size_t realloc_new_size;
3410 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003411 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003412} alloc_hook_t;
3413
Victor Stinner9ed83c42017-10-31 12:18:10 -07003414static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003415{
3416 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003417 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003418 hook->malloc_size = size;
3419 return hook->alloc.malloc(hook->alloc.ctx, size);
3420}
3421
Victor Stinner9ed83c42017-10-31 12:18:10 -07003422static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003423{
3424 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003425 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003426 hook->calloc_nelem = nelem;
3427 hook->calloc_elsize = elsize;
3428 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3429}
3430
Victor Stinner9ed83c42017-10-31 12:18:10 -07003431static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003432{
3433 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003434 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003435 hook->realloc_ptr = ptr;
3436 hook->realloc_new_size = new_size;
3437 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3438}
3439
Victor Stinner9ed83c42017-10-31 12:18:10 -07003440static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02003441{
3442 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003443 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003444 hook->free_ptr = ptr;
3445 hook->alloc.free(hook->alloc.ctx, ptr);
3446}
3447
3448static PyObject *
3449test_setallocators(PyMemAllocatorDomain domain)
3450{
3451 PyObject *res = NULL;
3452 const char *error_msg;
3453 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003454 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003455 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003456 void *ptr, *ptr2;
3457
Victor Stinnerdb067af2014-05-02 22:31:14 +02003458 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003459
3460 alloc.ctx = &hook;
3461 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003462 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003463 alloc.realloc = &hook_realloc;
3464 alloc.free = &hook_free;
3465 PyMem_GetAllocator(domain, &hook.alloc);
3466 PyMem_SetAllocator(domain, &alloc);
3467
Victor Stinner9ed83c42017-10-31 12:18:10 -07003468 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02003469 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003470 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02003471 switch(domain)
3472 {
3473 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3474 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3475 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3476 default: ptr = NULL; break;
3477 }
3478
Victor Stinner9ed83c42017-10-31 12:18:10 -07003479#define CHECK_CTX(FUNC) \
3480 if (hook.ctx != &hook) { \
3481 error_msg = FUNC " wrong context"; \
3482 goto fail; \
3483 } \
3484 hook.ctx = NULL; /* reset for next check */
3485
Victor Stinner0507bf52013-07-07 02:05:46 +02003486 if (ptr == NULL) {
3487 error_msg = "malloc failed";
3488 goto fail;
3489 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003490 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003491 if (hook.malloc_size != size) {
3492 error_msg = "malloc invalid size";
3493 goto fail;
3494 }
3495
3496 size2 = 200;
3497 switch(domain)
3498 {
3499 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3500 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3501 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003502 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003503 }
3504
3505 if (ptr2 == NULL) {
3506 error_msg = "realloc failed";
3507 goto fail;
3508 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003509 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003510 if (hook.realloc_ptr != ptr
3511 || hook.realloc_new_size != size2) {
3512 error_msg = "realloc invalid parameters";
3513 goto fail;
3514 }
3515
3516 switch(domain)
3517 {
3518 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3519 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3520 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3521 }
3522
Victor Stinner9ed83c42017-10-31 12:18:10 -07003523 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02003524 if (hook.free_ptr != ptr2) {
3525 error_msg = "free invalid pointer";
3526 goto fail;
3527 }
3528
Victor Stinner9ed83c42017-10-31 12:18:10 -07003529 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02003530 nelem = 2;
3531 elsize = 5;
3532 switch(domain)
3533 {
3534 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3535 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3536 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3537 default: ptr = NULL; break;
3538 }
3539
3540 if (ptr == NULL) {
3541 error_msg = "calloc failed";
3542 goto fail;
3543 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003544 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02003545 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3546 error_msg = "calloc invalid nelem or elsize";
3547 goto fail;
3548 }
3549
Victor Stinner9ed83c42017-10-31 12:18:10 -07003550 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003551 switch(domain)
3552 {
3553 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3554 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3555 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3556 }
3557
Victor Stinner9ed83c42017-10-31 12:18:10 -07003558 CHECK_CTX("calloc free");
3559 if (hook.free_ptr != ptr) {
3560 error_msg = "calloc free invalid pointer";
3561 goto fail;
3562 }
3563
Victor Stinner0507bf52013-07-07 02:05:46 +02003564 Py_INCREF(Py_None);
3565 res = Py_None;
3566 goto finally;
3567
3568fail:
3569 PyErr_SetString(PyExc_RuntimeError, error_msg);
3570
3571finally:
3572 PyMem_SetAllocator(domain, &hook.alloc);
3573 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003574
3575#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02003576}
3577
3578static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303579test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003580{
3581 return test_setallocators(PYMEM_DOMAIN_RAW);
3582}
3583
3584static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303585test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003586{
3587 return test_setallocators(PYMEM_DOMAIN_MEM);
3588}
3589
3590static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303591test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003592{
3593 return test_setallocators(PYMEM_DOMAIN_OBJ);
3594}
3595
xdegaye85f64302017-07-01 14:14:45 +02003596/* Most part of the following code is inherited from the pyfailmalloc project
3597 * written by Victor Stinner. */
3598static struct {
3599 int installed;
3600 PyMemAllocatorEx raw;
3601 PyMemAllocatorEx mem;
3602 PyMemAllocatorEx obj;
3603} FmHook;
3604
3605static struct {
3606 int start;
3607 int stop;
3608 Py_ssize_t count;
3609} FmData;
3610
3611static int
3612fm_nomemory(void)
3613{
3614 FmData.count++;
3615 if (FmData.count > FmData.start &&
3616 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
3617 return 1;
3618 }
3619 return 0;
3620}
3621
3622static void *
3623hook_fmalloc(void *ctx, size_t size)
3624{
3625 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3626 if (fm_nomemory()) {
3627 return NULL;
3628 }
3629 return alloc->malloc(alloc->ctx, size);
3630}
3631
3632static void *
3633hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
3634{
3635 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3636 if (fm_nomemory()) {
3637 return NULL;
3638 }
3639 return alloc->calloc(alloc->ctx, nelem, elsize);
3640}
3641
3642static void *
3643hook_frealloc(void *ctx, void *ptr, size_t new_size)
3644{
3645 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3646 if (fm_nomemory()) {
3647 return NULL;
3648 }
3649 return alloc->realloc(alloc->ctx, ptr, new_size);
3650}
3651
3652static void
3653hook_ffree(void *ctx, void *ptr)
3654{
3655 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3656 alloc->free(alloc->ctx, ptr);
3657}
3658
3659static void
3660fm_setup_hooks(void)
3661{
3662 PyMemAllocatorEx alloc;
3663
3664 if (FmHook.installed) {
3665 return;
3666 }
3667 FmHook.installed = 1;
3668
3669 alloc.malloc = hook_fmalloc;
3670 alloc.calloc = hook_fcalloc;
3671 alloc.realloc = hook_frealloc;
3672 alloc.free = hook_ffree;
3673 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3674 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3675 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3676
3677 alloc.ctx = &FmHook.raw;
3678 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
3679
3680 alloc.ctx = &FmHook.mem;
3681 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
3682
3683 alloc.ctx = &FmHook.obj;
3684 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
3685}
3686
3687static void
3688fm_remove_hooks(void)
3689{
3690 if (FmHook.installed) {
3691 FmHook.installed = 0;
3692 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3693 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3694 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3695 }
3696}
3697
3698static PyObject*
3699set_nomemory(PyObject *self, PyObject *args)
3700{
3701 /* Memory allocation fails after 'start' allocation requests, and until
3702 * 'stop' allocation requests except when 'stop' is negative or equal
3703 * to 0 (default) in which case allocation failures never stop. */
3704 FmData.count = 0;
3705 FmData.stop = 0;
3706 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
3707 return NULL;
3708 }
3709 fm_setup_hooks();
3710 Py_RETURN_NONE;
3711}
3712
3713static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303714remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02003715{
3716 fm_remove_hooks();
3717 Py_RETURN_NONE;
3718}
3719
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003720PyDoc_STRVAR(docstring_empty,
3721""
3722);
3723
3724PyDoc_STRVAR(docstring_no_signature,
3725"This docstring has no signature."
3726);
3727
3728PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003729"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003730"\n"
3731"This docstring has an invalid signature."
3732);
3733
Larry Hastings2623c8c2014-02-08 22:15:29 -08003734PyDoc_STRVAR(docstring_with_invalid_signature2,
3735"docstring_with_invalid_signature2($module, /, boo)\n"
3736"\n"
3737"--\n"
3738"\n"
3739"This docstring also has an invalid signature."
3740);
3741
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003742PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003743"docstring_with_signature($module, /, sig)\n"
3744"--\n"
3745"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003746"This docstring has a valid signature."
3747);
3748
Zachary Ware8ef887c2015-04-13 18:22:35 -05003749PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3750"docstring_with_signature_but_no_doc($module, /, sig)\n"
3751"--\n"
3752"\n"
3753);
3754
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003755PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003756"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3757"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003758"\n"
3759"\n"
3760"This docstring has a valid signature and some extra newlines."
3761);
3762
Larry Hastings16c51912014-01-07 11:53:01 -08003763PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003764"docstring_with_signature_with_defaults(module, s='avocado',\n"
3765" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3766" local=the_number_three, sys=sys.maxsize,\n"
3767" exp=sys.maxsize - 1)\n"
3768"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003769"\n"
3770"\n"
3771"\n"
3772"This docstring has a valid signature with parameters,\n"
3773"and the parameters take defaults of varying types."
3774);
3775
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003776typedef struct {
3777 PyThread_type_lock start_event;
3778 PyThread_type_lock exit_event;
3779 PyObject *callback;
3780} test_c_thread_t;
3781
3782static void
3783temporary_c_thread(void *data)
3784{
3785 test_c_thread_t *test_c_thread = data;
3786 PyGILState_STATE state;
3787 PyObject *res;
3788
3789 PyThread_release_lock(test_c_thread->start_event);
3790
3791 /* Allocate a Python thread state for this thread */
3792 state = PyGILState_Ensure();
3793
Victor Stinner3466bde2016-09-05 18:16:01 -07003794 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003795 Py_CLEAR(test_c_thread->callback);
3796
3797 if (res == NULL) {
3798 PyErr_Print();
3799 }
3800 else {
3801 Py_DECREF(res);
3802 }
3803
3804 /* Destroy the Python thread state for this thread */
3805 PyGILState_Release(state);
3806
3807 PyThread_release_lock(test_c_thread->exit_event);
3808
3809 PyThread_exit_thread();
3810}
3811
3812static PyObject *
3813call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3814{
3815 PyObject *res = NULL;
3816 test_c_thread_t test_c_thread;
3817 long thread;
3818
3819 PyEval_InitThreads();
3820
3821 test_c_thread.start_event = PyThread_allocate_lock();
3822 test_c_thread.exit_event = PyThread_allocate_lock();
3823 test_c_thread.callback = NULL;
3824 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3825 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3826 goto exit;
3827 }
3828
3829 Py_INCREF(callback);
3830 test_c_thread.callback = callback;
3831
3832 PyThread_acquire_lock(test_c_thread.start_event, 1);
3833 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3834
3835 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3836 if (thread == -1) {
3837 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3838 PyThread_release_lock(test_c_thread.start_event);
3839 PyThread_release_lock(test_c_thread.exit_event);
3840 goto exit;
3841 }
3842
3843 PyThread_acquire_lock(test_c_thread.start_event, 1);
3844 PyThread_release_lock(test_c_thread.start_event);
3845
3846 Py_BEGIN_ALLOW_THREADS
3847 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3848 PyThread_release_lock(test_c_thread.exit_event);
3849 Py_END_ALLOW_THREADS
3850
3851 Py_INCREF(Py_None);
3852 res = Py_None;
3853
3854exit:
3855 Py_CLEAR(test_c_thread.callback);
3856 if (test_c_thread.start_event)
3857 PyThread_free_lock(test_c_thread.start_event);
3858 if (test_c_thread.exit_event)
3859 PyThread_free_lock(test_c_thread.exit_event);
3860 return res;
3861}
Victor Stinner13105102013-12-13 02:17:29 +01003862
Serhiy Storchakab5181342015-02-06 08:58:56 +02003863/* marshal */
3864
3865static PyObject*
3866pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3867{
3868 long value;
3869 char *filename;
3870 int version;
3871 FILE *fp;
3872
3873 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3874 &value, &filename, &version))
3875 return NULL;
3876
3877 fp = fopen(filename, "wb");
3878 if (fp == NULL) {
3879 PyErr_SetFromErrno(PyExc_OSError);
3880 return NULL;
3881 }
3882
3883 PyMarshal_WriteLongToFile(value, fp, version);
3884
3885 fclose(fp);
3886 if (PyErr_Occurred())
3887 return NULL;
3888 Py_RETURN_NONE;
3889}
3890
3891static PyObject*
3892pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3893{
3894 PyObject *obj;
3895 char *filename;
3896 int version;
3897 FILE *fp;
3898
3899 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3900 &obj, &filename, &version))
3901 return NULL;
3902
3903 fp = fopen(filename, "wb");
3904 if (fp == NULL) {
3905 PyErr_SetFromErrno(PyExc_OSError);
3906 return NULL;
3907 }
3908
3909 PyMarshal_WriteObjectToFile(obj, fp, version);
3910
3911 fclose(fp);
3912 if (PyErr_Occurred())
3913 return NULL;
3914 Py_RETURN_NONE;
3915}
3916
3917static PyObject*
3918pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3919{
3920 int value;
3921 long pos;
3922 char *filename;
3923 FILE *fp;
3924
3925 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3926 return NULL;
3927
3928 fp = fopen(filename, "rb");
3929 if (fp == NULL) {
3930 PyErr_SetFromErrno(PyExc_OSError);
3931 return NULL;
3932 }
3933
3934 value = PyMarshal_ReadShortFromFile(fp);
3935 pos = ftell(fp);
3936
3937 fclose(fp);
3938 if (PyErr_Occurred())
3939 return NULL;
3940 return Py_BuildValue("il", value, pos);
3941}
3942
3943static PyObject*
3944pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3945{
3946 long value, pos;
3947 char *filename;
3948 FILE *fp;
3949
3950 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3951 return NULL;
3952
3953 fp = fopen(filename, "rb");
3954 if (fp == NULL) {
3955 PyErr_SetFromErrno(PyExc_OSError);
3956 return NULL;
3957 }
3958
3959 value = PyMarshal_ReadLongFromFile(fp);
3960 pos = ftell(fp);
3961
3962 fclose(fp);
3963 if (PyErr_Occurred())
3964 return NULL;
3965 return Py_BuildValue("ll", value, pos);
3966}
3967
3968static PyObject*
3969pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3970{
3971 PyObject *obj;
3972 long pos;
3973 char *filename;
3974 FILE *fp;
3975
3976 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3977 return NULL;
3978
3979 fp = fopen(filename, "rb");
3980 if (fp == NULL) {
3981 PyErr_SetFromErrno(PyExc_OSError);
3982 return NULL;
3983 }
3984
3985 obj = PyMarshal_ReadLastObjectFromFile(fp);
3986 pos = ftell(fp);
3987
3988 fclose(fp);
3989 return Py_BuildValue("Nl", obj, pos);
3990}
3991
3992static PyObject*
3993pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3994{
3995 PyObject *obj;
3996 long pos;
3997 char *filename;
3998 FILE *fp;
3999
4000 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
4001 return NULL;
4002
4003 fp = fopen(filename, "rb");
4004 if (fp == NULL) {
4005 PyErr_SetFromErrno(PyExc_OSError);
4006 return NULL;
4007 }
4008
4009 obj = PyMarshal_ReadObjectFromFile(fp);
4010 pos = ftell(fp);
4011
4012 fclose(fp);
4013 return Py_BuildValue("Nl", obj, pos);
4014}
4015
Victor Stinnerefde1462015-03-21 15:04:43 +01004016static PyObject*
4017return_null_without_error(PyObject *self, PyObject *args)
4018{
4019 /* invalid call: return NULL without setting an error,
4020 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4021 PyErr_Clear();
4022 return NULL;
4023}
4024
4025static PyObject*
4026return_result_with_error(PyObject *self, PyObject *args)
4027{
4028 /* invalid call: return a result with an error set,
4029 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4030 PyErr_SetNone(PyExc_ValueError);
4031 Py_RETURN_NONE;
4032}
4033
Victor Stinner992c43f2015-03-27 17:12:45 +01004034static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004035test_pytime_fromseconds(PyObject *self, PyObject *args)
4036{
4037 int seconds;
4038 _PyTime_t ts;
4039
4040 if (!PyArg_ParseTuple(args, "i", &seconds))
4041 return NULL;
4042 ts = _PyTime_FromSeconds(seconds);
4043 return _PyTime_AsNanosecondsObject(ts);
4044}
4045
4046static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004047test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4048{
4049 PyObject *obj;
4050 int round;
4051 _PyTime_t ts;
4052
4053 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4054 return NULL;
4055 if (check_time_rounding(round) < 0)
4056 return NULL;
4057 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4058 return NULL;
4059 return _PyTime_AsNanosecondsObject(ts);
4060}
4061
Victor Stinner4bfb4602015-03-27 22:27:24 +01004062static PyObject *
4063test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4064{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004065 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004066 _PyTime_t ts;
4067 double d;
4068
Victor Stinnerc29b5852017-11-02 07:28:27 -07004069 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004070 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004071 }
4072 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4073 return NULL;
4074 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004075 d = _PyTime_AsSecondsDouble(ts);
4076 return PyFloat_FromDouble(d);
4077}
4078
Victor Stinner95e9cef2015-03-28 01:26:47 +01004079static PyObject *
4080test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4081{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004082 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004083 int round;
4084 _PyTime_t t;
4085 struct timeval tv;
4086 PyObject *seconds;
4087
Victor Stinnerc29b5852017-11-02 07:28:27 -07004088 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004089 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004090 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004091 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004092 }
4093 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004094 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004095 }
4096 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4097 return NULL;
4098 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004099
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004100 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004101 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004102 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004103 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004104 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4105}
4106
Victor Stinner34dc0f42015-03-27 18:19:03 +01004107#ifdef HAVE_CLOCK_GETTIME
4108static PyObject *
4109test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4110{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004111 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004112 _PyTime_t t;
4113 struct timespec ts;
4114
Victor Stinnerc29b5852017-11-02 07:28:27 -07004115 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004116 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004117 }
4118 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004119 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004120 }
4121 if (_PyTime_AsTimespec(t, &ts) == -1) {
4122 return NULL;
4123 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004124 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4125}
4126#endif
4127
Victor Stinner62d1c702015-04-01 17:47:07 +02004128static PyObject *
4129test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4130{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004131 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004132 int round;
4133 _PyTime_t t, ms;
4134
Victor Stinnerc29b5852017-11-02 07:28:27 -07004135 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004136 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004137 }
4138 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004139 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004140 }
4141 if (check_time_rounding(round) < 0) {
4142 return NULL;
4143 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004144 ms = _PyTime_AsMilliseconds(t, round);
4145 /* This conversion rely on the fact that _PyTime_t is a number of
4146 nanoseconds */
4147 return _PyTime_AsNanosecondsObject(ms);
4148}
4149
4150static PyObject *
4151test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4152{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004153 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004154 int round;
4155 _PyTime_t t, ms;
4156
Victor Stinnerc29b5852017-11-02 07:28:27 -07004157 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004158 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004159 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004160 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004161 }
4162 if (check_time_rounding(round) < 0) {
4163 return NULL;
4164 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004165 ms = _PyTime_AsMicroseconds(t, round);
4166 /* This conversion rely on the fact that _PyTime_t is a number of
4167 nanoseconds */
4168 return _PyTime_AsNanosecondsObject(ms);
4169}
4170
Victor Stinner50856d52015-10-13 00:11:21 +02004171static PyObject*
4172get_recursion_depth(PyObject *self, PyObject *args)
4173{
Victor Stinner50b48572018-11-01 01:51:40 +01004174 PyThreadState *tstate = PyThreadState_Get();
Victor Stinner50856d52015-10-13 00:11:21 +02004175
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07004176 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02004177 return PyLong_FromLong(tstate->recursion_depth - 1);
4178}
4179
Victor Stinner34be807c2016-03-14 12:04:26 +01004180static PyObject*
4181pymem_buffer_overflow(PyObject *self, PyObject *args)
4182{
4183 char *buffer;
4184
4185 /* Deliberate buffer overflow to check that PyMem_Free() detects
4186 the overflow when debug hooks are installed. */
4187 buffer = PyMem_Malloc(16);
4188 buffer[16] = 'x';
4189 PyMem_Free(buffer);
4190
4191 Py_RETURN_NONE;
4192}
4193
4194static PyObject*
4195pymem_api_misuse(PyObject *self, PyObject *args)
4196{
4197 char *buffer;
4198
4199 /* Deliberate misusage of Python allocators:
4200 allococate with PyMem but release with PyMem_Raw. */
4201 buffer = PyMem_Malloc(16);
4202 PyMem_RawFree(buffer);
4203
4204 Py_RETURN_NONE;
4205}
4206
Victor Stinnerc4aec362016-03-14 22:26:53 +01004207static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004208pymem_malloc_without_gil(PyObject *self, PyObject *args)
4209{
4210 char *buffer;
4211
4212 /* Deliberate bug to test debug hooks on Python memory allocators:
4213 call PyMem_Malloc() without holding the GIL */
4214 Py_BEGIN_ALLOW_THREADS
4215 buffer = PyMem_Malloc(10);
4216 Py_END_ALLOW_THREADS
4217
4218 PyMem_Free(buffer);
4219
4220 Py_RETURN_NONE;
4221}
4222
Victor Stinner5d39e042017-11-29 17:20:38 +01004223
4224static PyObject*
4225test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4226{
4227 const char *name = _PyMem_GetAllocatorsName();
4228 if (name == NULL) {
4229 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4230 return NULL;
4231 }
4232 return PyUnicode_FromString(name);
4233}
4234
4235
Victor Stinnerad524372016-03-16 12:12:53 +01004236static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004237pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4238{
4239 char *buffer;
4240
Victor Stinnerad524372016-03-16 12:12:53 +01004241 /* Deliberate bug to test debug hooks on Python memory allocators:
4242 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004243 Py_BEGIN_ALLOW_THREADS
4244 buffer = PyObject_Malloc(10);
4245 Py_END_ALLOW_THREADS
4246
4247 PyObject_Free(buffer);
4248
4249 Py_RETURN_NONE;
4250}
4251
Victor Stinner10b73e12016-03-22 13:39:05 +01004252static PyObject *
4253tracemalloc_track(PyObject *self, PyObject *args)
4254{
4255 unsigned int domain;
4256 PyObject *ptr_obj;
4257 void *ptr;
4258 Py_ssize_t size;
4259 int release_gil = 0;
4260 int res;
4261
4262 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4263 return NULL;
4264 ptr = PyLong_AsVoidPtr(ptr_obj);
4265 if (PyErr_Occurred())
4266 return NULL;
4267
4268 if (release_gil) {
4269 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004270 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004271 Py_END_ALLOW_THREADS
4272 }
4273 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004274 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004275 }
4276
4277 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004278 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004279 return NULL;
4280 }
4281
4282 Py_RETURN_NONE;
4283}
4284
4285static PyObject *
4286tracemalloc_untrack(PyObject *self, PyObject *args)
4287{
4288 unsigned int domain;
4289 PyObject *ptr_obj;
4290 void *ptr;
4291 int res;
4292
4293 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4294 return NULL;
4295 ptr = PyLong_AsVoidPtr(ptr_obj);
4296 if (PyErr_Occurred())
4297 return NULL;
4298
Victor Stinner5ea4c062017-06-20 17:46:36 +02004299 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004300 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004301 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004302 return NULL;
4303 }
4304
4305 Py_RETURN_NONE;
4306}
4307
4308static PyObject *
4309tracemalloc_get_traceback(PyObject *self, PyObject *args)
4310{
4311 unsigned int domain;
4312 PyObject *ptr_obj;
4313 void *ptr;
4314
4315 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4316 return NULL;
4317 ptr = PyLong_AsVoidPtr(ptr_obj);
4318 if (PyErr_Occurred())
4319 return NULL;
4320
Benjamin Petersonca470632016-09-06 13:47:26 -07004321 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004322}
4323
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004324static PyObject *
4325dict_get_version(PyObject *self, PyObject *args)
4326{
4327 PyDictObject *dict;
4328 uint64_t version;
4329
4330 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4331 return NULL;
4332
4333 version = dict->ma_version_tag;
4334
4335 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4336 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4337}
4338
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004339
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004340static PyObject *
4341raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4342{
4343 PyGenObject *gen;
4344
4345 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4346 return NULL;
4347
4348 /* This is used in a test to check what happens if a signal arrives just
4349 as we're in the process of entering a yield from chain (see
4350 bpo-30039).
4351
4352 Needs to be done in C, because:
4353 - we don't have a Python wrapper for raise()
4354 - we need to make sure that the Python-level signal handler doesn't run
4355 *before* we enter the generator frame, which is impossible in Python
4356 because we check for signals before every bytecode operation.
4357 */
4358 raise(SIGINT);
4359 return _PyGen_Send(gen, Py_None);
4360}
4361
4362
Victor Stinner3b5cf852017-06-09 16:48:45 +02004363static int
4364fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4365{
4366 if (args == Py_None) {
4367 *stack = NULL;
4368 *nargs = 0;
4369 }
4370 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01004371 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02004372 *nargs = PyTuple_GET_SIZE(args);
4373 }
4374 else {
4375 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4376 return -1;
4377 }
4378 return 0;
4379}
4380
4381
4382static PyObject *
4383test_pyobject_fastcall(PyObject *self, PyObject *args)
4384{
4385 PyObject *func, *func_args;
4386 PyObject **stack;
4387 Py_ssize_t nargs;
4388
4389 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4390 return NULL;
4391 }
4392
4393 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4394 return NULL;
4395 }
4396 return _PyObject_FastCall(func, stack, nargs);
4397}
4398
4399
4400static PyObject *
4401test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4402{
4403 PyObject *func, *func_args, *kwargs;
4404 PyObject **stack;
4405 Py_ssize_t nargs;
4406
4407 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4408 return NULL;
4409 }
4410
4411 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4412 return NULL;
4413 }
4414
4415 if (kwargs == Py_None) {
4416 kwargs = NULL;
4417 }
4418 else if (!PyDict_Check(kwargs)) {
4419 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4420 return NULL;
4421 }
4422
4423 return _PyObject_FastCallDict(func, stack, nargs, kwargs);
4424}
4425
4426
4427static PyObject *
4428test_pyobject_fastcallkeywords(PyObject *self, PyObject *args)
4429{
4430 PyObject *func, *func_args, *kwnames = NULL;
4431 PyObject **stack;
4432 Py_ssize_t nargs, nkw;
4433
4434 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4435 return NULL;
4436 }
4437
4438 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4439 return NULL;
4440 }
4441
4442 if (kwnames == Py_None) {
4443 kwnames = NULL;
4444 }
4445 else if (PyTuple_Check(kwnames)) {
4446 nkw = PyTuple_GET_SIZE(kwnames);
4447 if (nargs < nkw) {
4448 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4449 return NULL;
4450 }
4451 nargs -= nkw;
4452 }
4453 else {
4454 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4455 return NULL;
4456 }
4457 return _PyObject_FastCallKeywords(func, stack, nargs, kwnames);
4458}
4459
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004460
Victor Stinner64fa4492017-07-10 14:37:49 +02004461static PyObject*
4462stack_pointer(PyObject *self, PyObject *args)
4463{
4464 int v = 5;
4465 return PyLong_FromVoidPtr(&v);
4466}
4467
Victor Stinner3b5cf852017-06-09 16:48:45 +02004468
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004469#ifdef W_STOPCODE
4470static PyObject*
4471py_w_stopcode(PyObject *self, PyObject *args)
4472{
4473 int sig, status;
4474 if (!PyArg_ParseTuple(args, "i", &sig)) {
4475 return NULL;
4476 }
4477 status = W_STOPCODE(sig);
4478 return PyLong_FromLong(status);
4479}
4480#endif
4481
4482
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004483static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03004484get_mapping_keys(PyObject* self, PyObject *obj)
4485{
4486 return PyMapping_Keys(obj);
4487}
4488
4489static PyObject *
4490get_mapping_values(PyObject* self, PyObject *obj)
4491{
4492 return PyMapping_Values(obj);
4493}
4494
4495static PyObject *
4496get_mapping_items(PyObject* self, PyObject *obj)
4497{
4498 return PyMapping_Items(obj);
4499}
4500
4501
4502static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004503test_pythread_tss_key_state(PyObject *self, PyObject *args)
4504{
4505 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
4506 if (PyThread_tss_is_created(&tss_key)) {
4507 return raiseTestError("test_pythread_tss_key_state",
4508 "TSS key not in an uninitialized state at "
4509 "creation time");
4510 }
4511 if (PyThread_tss_create(&tss_key) != 0) {
4512 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
4513 return NULL;
4514 }
4515 if (!PyThread_tss_is_created(&tss_key)) {
4516 return raiseTestError("test_pythread_tss_key_state",
4517 "PyThread_tss_create succeeded, "
4518 "but with TSS key in an uninitialized state");
4519 }
4520 if (PyThread_tss_create(&tss_key) != 0) {
4521 return raiseTestError("test_pythread_tss_key_state",
4522 "PyThread_tss_create unsuccessful with "
4523 "an already initialized key");
4524 }
4525#define CHECK_TSS_API(expr) \
4526 (void)(expr); \
4527 if (!PyThread_tss_is_created(&tss_key)) { \
4528 return raiseTestError("test_pythread_tss_key_state", \
4529 "TSS key initialization state was not " \
4530 "preserved after calling " #expr); }
4531 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
4532 CHECK_TSS_API(PyThread_tss_get(&tss_key));
4533#undef CHECK_TSS_API
4534 PyThread_tss_delete(&tss_key);
4535 if (PyThread_tss_is_created(&tss_key)) {
4536 return raiseTestError("test_pythread_tss_key_state",
4537 "PyThread_tss_delete called, but did not "
4538 "set the key state to uninitialized");
4539 }
4540
4541 Py_tss_t *ptr_key = PyThread_tss_alloc();
4542 if (ptr_key == NULL) {
4543 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
4544 return NULL;
4545 }
4546 if (PyThread_tss_is_created(ptr_key)) {
4547 return raiseTestError("test_pythread_tss_key_state",
4548 "TSS key not in an uninitialized state at "
4549 "allocation time");
4550 }
4551 PyThread_tss_free(ptr_key);
4552 ptr_key = NULL;
4553 Py_RETURN_NONE;
4554}
4555
4556
Yury Selivanovf23746a2018-01-22 19:11:18 -05004557static PyObject*
4558new_hamt(PyObject *self, PyObject *args)
4559{
4560 return _PyContext_NewHamtForTests();
4561}
4562
4563
jdemeyer5a306202018-10-19 23:50:06 +02004564/* def bad_get(self, obj, cls):
4565 cls()
4566 return repr(self)
4567*/
4568static PyObject*
4569bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4570{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02004571 PyObject *self, *obj, *cls;
4572 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02004573 return NULL;
4574 }
4575
Serhiy Storchakab1dede32018-11-20 20:45:40 +02004576 PyObject *res = PyObject_CallObject(cls, NULL);
jdemeyer5a306202018-10-19 23:50:06 +02004577 if (res == NULL) {
4578 return NULL;
4579 }
4580 Py_DECREF(res);
4581
Serhiy Storchakab1dede32018-11-20 20:45:40 +02004582 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02004583}
4584
4585
Victor Stinner3d4226a2018-08-29 22:21:32 +02004586static PyObject *
4587encode_locale_ex(PyObject *self, PyObject *args)
4588{
4589 PyObject *unicode;
4590 int current_locale = 0;
4591 wchar_t *wstr;
4592 PyObject *res = NULL;
4593 const char *errors = NULL;
4594
4595 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
4596 return NULL;
4597 }
4598 wstr = PyUnicode_AsWideCharString(unicode, NULL);
4599 if (wstr == NULL) {
4600 return NULL;
4601 }
4602 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
4603
4604 char *str = NULL;
4605 size_t error_pos;
4606 const char *reason = NULL;
4607 int ret = _Py_EncodeLocaleEx(wstr,
4608 &str, &error_pos, &reason,
4609 current_locale, error_handler);
4610 PyMem_Free(wstr);
4611
4612 switch(ret) {
4613 case 0:
4614 res = PyBytes_FromString(str);
4615 PyMem_RawFree(str);
4616 break;
4617 case -1:
4618 PyErr_NoMemory();
4619 break;
4620 case -2:
4621 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
4622 error_pos, reason);
4623 break;
4624 case -3:
4625 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
4626 break;
4627 default:
4628 PyErr_SetString(PyExc_ValueError, "unknow error code");
4629 break;
4630 }
4631 return res;
4632}
4633
4634
4635static PyObject *
4636decode_locale_ex(PyObject *self, PyObject *args)
4637{
4638 char *str;
4639 int current_locale = 0;
4640 PyObject *res = NULL;
4641 const char *errors = NULL;
4642
4643 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
4644 return NULL;
4645 }
4646 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
4647
4648 wchar_t *wstr = NULL;
4649 size_t wlen = 0;
4650 const char *reason = NULL;
4651 int ret = _Py_DecodeLocaleEx(str,
4652 &wstr, &wlen, &reason,
4653 current_locale, error_handler);
4654
4655 switch(ret) {
4656 case 0:
4657 res = PyUnicode_FromWideChar(wstr, wlen);
4658 PyMem_RawFree(wstr);
4659 break;
4660 case -1:
4661 PyErr_NoMemory();
4662 break;
4663 case -2:
4664 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
4665 wlen, reason);
4666 break;
4667 case -3:
4668 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
4669 break;
4670 default:
4671 PyErr_SetString(PyExc_ValueError, "unknow error code");
4672 break;
4673 }
4674 return res;
4675}
4676
4677
Victor Stinner2094c2b2018-09-03 17:06:39 +02004678static PyObject *
Victor Stinner7ddd56f2018-11-14 00:24:28 +01004679get_global_config(PyObject *self, PyObject *Py_UNUSED(args))
4680{
4681 return _Py_GetGlobalVariablesAsDict();
4682}
4683
4684
4685static PyObject *
4686get_core_config(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2094c2b2018-09-03 17:06:39 +02004687{
4688 PyInterpreterState *interp = _PyInterpreterState_Get();
Eric Snowbe3b2952019-02-23 11:35:52 -07004689 const _PyCoreConfig *config = _PyInterpreterState_GetCoreConfig(interp);
Victor Stinner5ed69952018-11-06 15:59:52 +01004690 return _PyCoreConfig_AsDict(config);
Victor Stinner2094c2b2018-09-03 17:06:39 +02004691}
4692
4693
Victor Stinner00b137c2018-11-13 19:59:26 +01004694static PyObject *
Victor Stinner7ddd56f2018-11-14 00:24:28 +01004695get_main_config(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner00b137c2018-11-13 19:59:26 +01004696{
4697 PyInterpreterState *interp = _PyInterpreterState_Get();
Eric Snowbe3b2952019-02-23 11:35:52 -07004698 const _PyMainInterpreterConfig *config = _PyInterpreterState_GetMainConfig(interp);
Victor Stinner00b137c2018-11-13 19:59:26 +01004699 return _PyMainInterpreterConfig_AsDict(config);
4700}
4701
4702
Victor Stinner18618e652018-10-25 17:28:11 +02004703#ifdef Py_REF_DEBUG
4704static PyObject *
4705negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
4706{
4707 PyObject *obj = PyUnicode_FromString("negative_refcount");
4708 if (obj == NULL) {
4709 return NULL;
4710 }
4711 assert(Py_REFCNT(obj) == 1);
4712
4713 Py_REFCNT(obj) = 0;
4714 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
4715 Py_DECREF(obj);
4716
4717 Py_RETURN_NONE;
4718}
4719#endif
4720
4721
Tim Peters9ea17ac2001-02-02 05:57:15 +00004722static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004723 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304724 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02004725 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304726 {"test_config", test_config, METH_NOARGS},
4727 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05004729 {"datetime_check_date", datetime_check_date, METH_VARARGS},
4730 {"datetime_check_time", datetime_check_time, METH_VARARGS},
4731 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
4732 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
4733 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
4734 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05004735 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05004736 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304737 {"test_list_api", test_list_api, METH_NOARGS},
4738 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02004739 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01004740 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304741 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
4742 {"test_long_api", test_long_api, METH_NOARGS},
4743 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
4744 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
4745 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
4746 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08004747 {"test_structseq_newtype_doesnt_leak",
4748 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304749 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
4750 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
4751 {"test_long_as_double", test_long_as_double, METH_NOARGS},
4752 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
4753 {"test_long_numbits", test_long_numbits, METH_NOARGS},
4754 {"test_k_code", test_k_code, METH_NOARGS},
4755 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07004756 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304757 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004758 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304759 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304761 {"test_string_to_double", test_string_to_double, METH_NOARGS},
4762 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
4763 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004764 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01004765 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004766#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01004767 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004768#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01004769 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03004770 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03004771 {"get_args", get_args, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004772 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004773 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004774 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004775 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004776 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00004777 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03004778 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004779 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03004780 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004781 {"getargs_b", getargs_b, METH_VARARGS},
4782 {"getargs_B", getargs_B, METH_VARARGS},
4783 {"getargs_h", getargs_h, METH_VARARGS},
4784 {"getargs_H", getargs_H, METH_VARARGS},
4785 {"getargs_I", getargs_I, METH_VARARGS},
4786 {"getargs_k", getargs_k, METH_VARARGS},
4787 {"getargs_i", getargs_i, METH_VARARGS},
4788 {"getargs_l", getargs_l, METH_VARARGS},
4789 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07004790 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 {"getargs_L", getargs_L, METH_VARARGS},
4792 {"getargs_K", getargs_K, METH_VARARGS},
4793 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304794 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
4795 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03004796 {"getargs_f", getargs_f, METH_VARARGS},
4797 {"getargs_d", getargs_d, METH_VARARGS},
4798 {"getargs_D", getargs_D, METH_VARARGS},
4799 {"getargs_S", getargs_S, METH_VARARGS},
4800 {"getargs_Y", getargs_Y, METH_VARARGS},
4801 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03004802 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004803 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00004804 {"getargs_s", getargs_s, METH_VARARGS},
4805 {"getargs_s_star", getargs_s_star, METH_VARARGS},
4806 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
4807 {"getargs_z", getargs_z, METH_VARARGS},
4808 {"getargs_z_star", getargs_z_star, METH_VARARGS},
4809 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
4810 {"getargs_y", getargs_y, METH_VARARGS},
4811 {"getargs_y_star", getargs_y_star, METH_VARARGS},
4812 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
4813 {"getargs_u", getargs_u, METH_VARARGS},
4814 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
4815 {"getargs_Z", getargs_Z, METH_VARARGS},
4816 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00004817 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004818 {"getargs_es", getargs_es, METH_VARARGS},
4819 {"getargs_et", getargs_et, METH_VARARGS},
4820 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
4821 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004822 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004823 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004824 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004825 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304826 {"test_s_code", test_s_code, METH_NOARGS},
4827 {"test_u_code", test_u_code, METH_NOARGS},
4828 {"test_Z_code", test_Z_code, METH_NOARGS},
4829 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004830 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
4831 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03004832 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08004833 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03004834 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004835 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
4836 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01004837 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004838 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004839 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004840#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00004841 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004842#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00004843 {"traceback_print", traceback_print, METH_VARARGS},
4844 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02004845 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004846 {"argparsing", argparsing, METH_VARARGS},
4847 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004848 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004849 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304850 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00004851 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304852 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004853 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01004854 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
4855 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01004856 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02004857 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04004858 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304859 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
4860 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
4861 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
4862 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02004863 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
4864 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304865 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02004866 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004867 {"no_docstring",
4868 (PyCFunction)test_with_docstring, METH_NOARGS},
4869 {"docstring_empty",
4870 (PyCFunction)test_with_docstring, METH_NOARGS,
4871 docstring_empty},
4872 {"docstring_no_signature",
4873 (PyCFunction)test_with_docstring, METH_NOARGS,
4874 docstring_no_signature},
4875 {"docstring_with_invalid_signature",
4876 (PyCFunction)test_with_docstring, METH_NOARGS,
4877 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004878 {"docstring_with_invalid_signature2",
4879 (PyCFunction)test_with_docstring, METH_NOARGS,
4880 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004881 {"docstring_with_signature",
4882 (PyCFunction)test_with_docstring, METH_NOARGS,
4883 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004884 {"docstring_with_signature_but_no_doc",
4885 (PyCFunction)test_with_docstring, METH_NOARGS,
4886 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004887 {"docstring_with_signature_and_extra_newlines",
4888 (PyCFunction)test_with_docstring, METH_NOARGS,
4889 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004890 {"docstring_with_signature_with_defaults",
4891 (PyCFunction)test_with_docstring, METH_NOARGS,
4892 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004893 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4894 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02004895 {"pymarshal_write_long_to_file",
4896 pymarshal_write_long_to_file, METH_VARARGS},
4897 {"pymarshal_write_object_to_file",
4898 pymarshal_write_object_to_file, METH_VARARGS},
4899 {"pymarshal_read_short_from_file",
4900 pymarshal_read_short_from_file, METH_VARARGS},
4901 {"pymarshal_read_long_from_file",
4902 pymarshal_read_long_from_file, METH_VARARGS},
4903 {"pymarshal_read_last_object_from_file",
4904 pymarshal_read_last_object_from_file, METH_VARARGS},
4905 {"pymarshal_read_object_from_file",
4906 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004907 {"return_null_without_error",
4908 return_null_without_error, METH_NOARGS},
4909 {"return_result_with_error",
4910 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004911 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004912 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4913 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004914 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004915#ifdef HAVE_CLOCK_GETTIME
4916 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4917#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004918 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4919 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004920 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01004921 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
4922 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01004923 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01004924 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01004925 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01004926 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
4927 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
4928 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004929 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004930 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02004931 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
4932 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
4933 {"pyobject_fastcallkeywords", test_pyobject_fastcallkeywords, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02004934 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004935#ifdef W_STOPCODE
4936 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
4937#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03004938 {"get_mapping_keys", get_mapping_keys, METH_O},
4939 {"get_mapping_values", get_mapping_values, METH_O},
4940 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004941 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05004942 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02004943 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02004944 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
4945 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner7ddd56f2018-11-14 00:24:28 +01004946 {"get_global_config", get_global_config, METH_NOARGS},
4947 {"get_core_config", get_core_config, METH_NOARGS},
4948 {"get_main_config", get_main_config, METH_NOARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02004949#ifdef Py_REF_DEBUG
4950 {"negative_refcount", negative_refcount, METH_NOARGS},
4951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004952 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00004953};
4954
Thomas Hellera4ea6032003-04-17 18:55:45 +00004955#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
4956
Thomas Wouters89f507f2006-12-13 04:49:30 +00004957typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004958 char bool_member;
4959 char byte_member;
4960 unsigned char ubyte_member;
4961 short short_member;
4962 unsigned short ushort_member;
4963 int int_member;
4964 unsigned int uint_member;
4965 long long_member;
4966 unsigned long ulong_member;
4967 Py_ssize_t pyssizet_member;
4968 float float_member;
4969 double double_member;
4970 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07004971 long long longlong_member;
4972 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004973} all_structmembers;
4974
4975typedef struct {
4976 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004977 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004978} test_structmembers;
4979
4980static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004981 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
4982 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
4983 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
4984 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
4985 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
4986 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
4987 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
4988 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
4989 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
4990 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
4991 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
4992 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
4993 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
4995 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004996 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00004997};
4998
4999
Christian Heimes1af737c2008-01-23 08:24:23 +00005000static PyObject *
5001test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005003 static char *keywords[] = {
5004 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5005 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5006 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005008 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005009 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005010 test_structmembers *ob;
5011 const char *s = NULL;
5012 Py_ssize_t string_len = 0;
5013 ob = PyObject_New(test_structmembers, type);
5014 if (ob == NULL)
5015 return NULL;
5016 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5017 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5018 &ob->structmembers.bool_member,
5019 &ob->structmembers.byte_member,
5020 &ob->structmembers.ubyte_member,
5021 &ob->structmembers.short_member,
5022 &ob->structmembers.ushort_member,
5023 &ob->structmembers.int_member,
5024 &ob->structmembers.uint_member,
5025 &ob->structmembers.long_member,
5026 &ob->structmembers.ulong_member,
5027 &ob->structmembers.pyssizet_member,
5028 &ob->structmembers.float_member,
5029 &ob->structmembers.double_member,
5030 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031 , &ob->structmembers.longlong_member,
5032 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005033 )) {
5034 Py_DECREF(ob);
5035 return NULL;
5036 }
5037 if (s != NULL) {
5038 if (string_len > 5) {
5039 Py_DECREF(ob);
5040 PyErr_SetString(PyExc_ValueError, "string too long");
5041 return NULL;
5042 }
5043 strcpy(ob->structmembers.inplace_member, s);
5044 }
5045 else {
5046 strcpy(ob->structmembers.inplace_member, "");
5047 }
5048 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005049}
5050
Christian Heimes1af737c2008-01-23 08:24:23 +00005051static void
5052test_structmembers_free(PyObject *ob)
5053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005054 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005055}
5056
5057static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005058 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059 "test_structmembersType",
5060 sizeof(test_structmembers), /* tp_basicsize */
5061 0, /* tp_itemsize */
5062 test_structmembers_free, /* destructor tp_dealloc */
5063 0, /* tp_print */
5064 0, /* tp_getattr */
5065 0, /* tp_setattr */
5066 0, /* tp_reserved */
5067 0, /* tp_repr */
5068 0, /* tp_as_number */
5069 0, /* tp_as_sequence */
5070 0, /* tp_as_mapping */
5071 0, /* tp_hash */
5072 0, /* tp_call */
5073 0, /* tp_str */
5074 PyObject_GenericGetAttr, /* tp_getattro */
5075 PyObject_GenericSetAttr, /* tp_setattro */
5076 0, /* tp_as_buffer */
5077 0, /* tp_flags */
5078 "Type containing all structmember types",
5079 0, /* traverseproc tp_traverse */
5080 0, /* tp_clear */
5081 0, /* tp_richcompare */
5082 0, /* tp_weaklistoffset */
5083 0, /* tp_iter */
5084 0, /* tp_iternext */
5085 0, /* tp_methods */
5086 test_members, /* tp_members */
5087 0,
5088 0,
5089 0,
5090 0,
5091 0,
5092 0,
5093 0,
5094 0,
5095 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005096};
5097
5098
Benjamin Petersond51374e2014-04-09 23:55:56 -04005099typedef struct {
5100 PyObject_HEAD
5101} matmulObject;
5102
5103static PyObject *
5104matmulType_matmul(PyObject *self, PyObject *other)
5105{
5106 return Py_BuildValue("(sOO)", "matmul", self, other);
5107}
5108
5109static PyObject *
5110matmulType_imatmul(PyObject *self, PyObject *other)
5111{
5112 return Py_BuildValue("(sOO)", "imatmul", self, other);
5113}
5114
5115static void
5116matmulType_dealloc(PyObject *self)
5117{
Zachary Ware420dc562014-04-23 13:51:27 -05005118 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005119}
5120
5121static PyNumberMethods matmulType_as_number = {
5122 0, /* nb_add */
5123 0, /* nb_subtract */
5124 0, /* nb_multiply */
5125 0, /* nb_remainde r*/
5126 0, /* nb_divmod */
5127 0, /* nb_power */
5128 0, /* nb_negative */
5129 0, /* tp_positive */
5130 0, /* tp_absolute */
5131 0, /* tp_bool */
5132 0, /* nb_invert */
5133 0, /* nb_lshift */
5134 0, /* nb_rshift */
5135 0, /* nb_and */
5136 0, /* nb_xor */
5137 0, /* nb_or */
5138 0, /* nb_int */
5139 0, /* nb_reserved */
5140 0, /* nb_float */
5141 0, /* nb_inplace_add */
5142 0, /* nb_inplace_subtract */
5143 0, /* nb_inplace_multiply */
5144 0, /* nb_inplace_remainder */
5145 0, /* nb_inplace_power */
5146 0, /* nb_inplace_lshift */
5147 0, /* nb_inplace_rshift */
5148 0, /* nb_inplace_and */
5149 0, /* nb_inplace_xor */
5150 0, /* nb_inplace_or */
5151 0, /* nb_floor_divide */
5152 0, /* nb_true_divide */
5153 0, /* nb_inplace_floor_divide */
5154 0, /* nb_inplace_true_divide */
5155 0, /* nb_index */
5156 matmulType_matmul, /* nb_matrix_multiply */
5157 matmulType_imatmul /* nb_matrix_inplace_multiply */
5158};
5159
5160static PyTypeObject matmulType = {
5161 PyVarObject_HEAD_INIT(NULL, 0)
5162 "matmulType",
5163 sizeof(matmulObject), /* tp_basicsize */
5164 0, /* tp_itemsize */
5165 matmulType_dealloc, /* destructor tp_dealloc */
5166 0, /* tp_print */
5167 0, /* tp_getattr */
5168 0, /* tp_setattr */
5169 0, /* tp_reserved */
5170 0, /* tp_repr */
5171 &matmulType_as_number, /* tp_as_number */
5172 0, /* tp_as_sequence */
5173 0, /* tp_as_mapping */
5174 0, /* tp_hash */
5175 0, /* tp_call */
5176 0, /* tp_str */
5177 PyObject_GenericGetAttr, /* tp_getattro */
5178 PyObject_GenericSetAttr, /* tp_setattro */
5179 0, /* tp_as_buffer */
5180 0, /* tp_flags */
5181 "C level type with matrix operations defined",
5182 0, /* traverseproc tp_traverse */
5183 0, /* tp_clear */
5184 0, /* tp_richcompare */
5185 0, /* tp_weaklistoffset */
5186 0, /* tp_iter */
5187 0, /* tp_iternext */
5188 0, /* tp_methods */
5189 0, /* tp_members */
5190 0,
5191 0,
5192 0,
5193 0,
5194 0,
5195 0,
5196 0,
5197 0,
5198 PyType_GenericNew, /* tp_new */
5199 PyObject_Del, /* tp_free */
5200};
5201
Martin v. Löwis1a214512008-06-11 05:26:20 +00005202
Yury Selivanov75445082015-05-11 22:57:16 -04005203typedef struct {
5204 PyObject_HEAD
5205 PyObject *ao_iterator;
5206} awaitObject;
5207
5208
5209static PyObject *
5210awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5211{
5212 PyObject *v;
5213 awaitObject *ao;
5214
5215 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
5216 return NULL;
5217
5218 ao = (awaitObject *)type->tp_alloc(type, 0);
5219 if (ao == NULL) {
5220 return NULL;
5221 }
5222
5223 Py_INCREF(v);
5224 ao->ao_iterator = v;
5225
5226 return (PyObject *)ao;
5227}
5228
5229
5230static void
5231awaitObject_dealloc(awaitObject *ao)
5232{
5233 Py_CLEAR(ao->ao_iterator);
5234 Py_TYPE(ao)->tp_free(ao);
5235}
5236
5237
5238static PyObject *
5239awaitObject_await(awaitObject *ao)
5240{
5241 Py_INCREF(ao->ao_iterator);
5242 return ao->ao_iterator;
5243}
5244
5245static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04005246 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04005247 0, /* am_aiter */
5248 0 /* am_anext */
5249};
5250
5251
5252static PyTypeObject awaitType = {
5253 PyVarObject_HEAD_INIT(NULL, 0)
5254 "awaitType",
5255 sizeof(awaitObject), /* tp_basicsize */
5256 0, /* tp_itemsize */
5257 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
5258 0, /* tp_print */
5259 0, /* tp_getattr */
5260 0, /* tp_setattr */
5261 &awaitType_as_async, /* tp_as_async */
5262 0, /* tp_repr */
5263 0, /* tp_as_number */
5264 0, /* tp_as_sequence */
5265 0, /* tp_as_mapping */
5266 0, /* tp_hash */
5267 0, /* tp_call */
5268 0, /* tp_str */
5269 PyObject_GenericGetAttr, /* tp_getattro */
5270 PyObject_GenericSetAttr, /* tp_setattro */
5271 0, /* tp_as_buffer */
5272 0, /* tp_flags */
5273 "C level type with tp_as_async",
5274 0, /* traverseproc tp_traverse */
5275 0, /* tp_clear */
5276 0, /* tp_richcompare */
5277 0, /* tp_weaklistoffset */
5278 0, /* tp_iter */
5279 0, /* tp_iternext */
5280 0, /* tp_methods */
5281 0, /* tp_members */
5282 0,
5283 0,
5284 0,
5285 0,
5286 0,
5287 0,
5288 0,
5289 0,
5290 awaitObject_new, /* tp_new */
5291 PyObject_Del, /* tp_free */
5292};
5293
5294
xdegaye56d1f5c2017-10-26 15:09:06 +02005295static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
5296
5297static PyTypeObject PyRecursingInfinitelyError_Type = {
5298 PyVarObject_HEAD_INIT(NULL, 0)
5299 "RecursingInfinitelyError", /* tp_name */
5300 sizeof(PyBaseExceptionObject), /* tp_basicsize */
5301 0, /* tp_itemsize */
5302 0, /* tp_dealloc */
5303 0, /* tp_print */
5304 0, /* tp_getattr */
5305 0, /* tp_setattr */
5306 0, /* tp_reserved */
5307 0, /* tp_repr */
5308 0, /* tp_as_number */
5309 0, /* tp_as_sequence */
5310 0, /* tp_as_mapping */
5311 0, /* tp_hash */
5312 0, /* tp_call */
5313 0, /* tp_str */
5314 0, /* tp_getattro */
5315 0, /* tp_setattro */
5316 0, /* tp_as_buffer */
5317 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5318 "Instantiating this exception starts infinite recursion.", /* tp_doc */
5319 0, /* tp_traverse */
5320 0, /* tp_clear */
5321 0, /* tp_richcompare */
5322 0, /* tp_weaklistoffset */
5323 0, /* tp_iter */
5324 0, /* tp_iternext */
5325 0, /* tp_methods */
5326 0, /* tp_members */
5327 0, /* tp_getset */
5328 0, /* tp_base */
5329 0, /* tp_dict */
5330 0, /* tp_descr_get */
5331 0, /* tp_descr_set */
5332 0, /* tp_dictoffset */
5333 (initproc)recurse_infinitely_error_init, /* tp_init */
5334 0, /* tp_alloc */
5335 0, /* tp_new */
5336};
5337
5338static int
5339recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
5340{
5341 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
5342
5343 /* Instantiating this exception starts infinite recursion. */
5344 Py_INCREF(type);
5345 PyErr_SetObject(type, NULL);
5346 return -1;
5347}
5348
5349
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005350/* Test PEP 560 */
5351
5352typedef struct {
5353 PyObject_HEAD
5354 PyObject *item;
5355} PyGenericAliasObject;
5356
5357static void
5358generic_alias_dealloc(PyGenericAliasObject *self)
5359{
5360 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01005361 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005362}
5363
5364static PyObject *
5365generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
5366{
5367 return PyTuple_Pack(1, self->item);
5368}
5369
5370static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005371 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005372 {NULL} /* sentinel */
5373};
5374
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07005375static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005376 PyVarObject_HEAD_INIT(NULL, 0)
5377 "GenericAlias",
5378 sizeof(PyGenericAliasObject),
5379 0,
5380 .tp_dealloc = (destructor)generic_alias_dealloc,
5381 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5382 .tp_methods = generic_alias_methods,
5383};
5384
5385static PyObject *
5386generic_alias_new(PyObject *item)
5387{
5388 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
5389 if (o == NULL) {
5390 return NULL;
5391 }
5392 Py_INCREF(item);
5393 o->item = item;
5394 return (PyObject*) o;
5395}
5396
5397typedef struct {
5398 PyObject_HEAD
5399} PyGenericObject;
5400
5401static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005402generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005403{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005404 return generic_alias_new(item);
5405}
5406
5407static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005408 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005409 {NULL} /* sentinel */
5410};
5411
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07005412static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005413 PyVarObject_HEAD_INIT(NULL, 0)
5414 "Generic",
5415 sizeof(PyGenericObject),
5416 0,
5417 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5418 .tp_methods = generic_methods,
5419};
5420
5421
Martin v. Löwis1a214512008-06-11 05:26:20 +00005422static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005423 PyModuleDef_HEAD_INIT,
5424 "_testcapi",
5425 NULL,
5426 -1,
5427 TestMethods,
5428 NULL,
5429 NULL,
5430 NULL,
5431 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005432};
5433
Nick Coghland5cacbb2015-05-23 22:24:10 +10005434/* Per PEP 489, this module will not be converted to multi-phase initialization
5435 */
5436
Mark Hammond62b1ab12002-07-23 06:31:15 +00005437PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005438PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00005439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005440 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 m = PyModule_Create(&_testcapimodule);
5443 if (m == NULL)
5444 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005446 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00005447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 Py_TYPE(&test_structmembersType)=&PyType_Type;
5449 Py_INCREF(&test_structmembersType);
5450 /* don't use a name starting with "test", since we don't want
5451 test_capi to automatically call this */
5452 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005453 if (PyType_Ready(&matmulType) < 0)
5454 return NULL;
5455 Py_INCREF(&matmulType);
5456 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005457
Yury Selivanov75445082015-05-11 22:57:16 -04005458 if (PyType_Ready(&awaitType) < 0)
5459 return NULL;
5460 Py_INCREF(&awaitType);
5461 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
5462
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005463 if (PyType_Ready(&GenericAlias_Type) < 0)
5464 return NULL;
5465 Py_INCREF(&GenericAlias_Type);
5466 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
5467
5468 if (PyType_Ready(&Generic_Type) < 0)
5469 return NULL;
5470 Py_INCREF(&Generic_Type);
5471 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
5472
xdegaye56d1f5c2017-10-26 15:09:06 +02005473 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
5474 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
5475 return NULL;
5476 }
5477 Py_INCREF(&PyRecursingInfinitelyError_Type);
5478 PyModule_AddObject(m, "RecursingInfinitelyError",
5479 (PyObject *)&PyRecursingInfinitelyError_Type);
5480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005481 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
5482 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
5483 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
5484 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
5485 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
5486 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
5487 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
5488 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
5489 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
5490 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
5491 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
5492 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
5493 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
5494 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
5495 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
5496 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
5497 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
5498 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
5499 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
5500 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
5501 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
5502 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02005503 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005504 Py_INCREF(&PyInstanceMethod_Type);
5505 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00005506
Larry Hastings2a727912014-01-16 11:32:01 -08005507 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner5d39e042017-11-29 17:20:38 +01005508#ifdef WITH_PYMALLOC
5509 PyModule_AddObject(m, "WITH_PYMALLOC", Py_True);
5510#else
5511 PyModule_AddObject(m, "WITH_PYMALLOC", Py_False);
5512#endif
Larry Hastings2a727912014-01-16 11:32:01 -08005513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
5515 Py_INCREF(TestError);
5516 PyModule_AddObject(m, "error", TestError);
5517 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005518}