blob: 3133d2b11f81dbb9e434e130f69733c5adc98a1e [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 *
950test_buildvalue_N(PyObject *self, PyObject *noargs)
951{
952 PyObject *arg, *res;
953
954 arg = PyList_New(0);
955 if (arg == NULL) {
956 return NULL;
957 }
958 Py_INCREF(arg);
959 res = Py_BuildValue("N", arg);
960 if (res == NULL) {
961 return NULL;
962 }
963 if (res != arg) {
964 return raiseTestError("test_buildvalue_N",
965 "Py_BuildValue(\"N\") returned wrong result");
966 }
967 if (Py_REFCNT(arg) != 2) {
968 return raiseTestError("test_buildvalue_N",
969 "arg was not decrefed in Py_BuildValue(\"N\")");
970 }
971 Py_DECREF(res);
972 Py_DECREF(arg);
973
974 if (test_buildvalue_N_error("O&N") < 0)
975 return NULL;
976 if (test_buildvalue_N_error("(O&N)") < 0)
977 return NULL;
978 if (test_buildvalue_N_error("[O&N]") < 0)
979 return NULL;
980 if (test_buildvalue_N_error("{O&N}") < 0)
981 return NULL;
982 if (test_buildvalue_N_error("{()O&(())N}") < 0)
983 return NULL;
984
985 Py_RETURN_NONE;
986}
987
988
989static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +0300990get_args(PyObject *self, PyObject *args)
991{
992 if (args == NULL) {
993 args = Py_None;
994 }
995 Py_INCREF(args);
996 return args;
997}
998
999static PyObject *
1000get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1001{
1002 if (kwargs == NULL) {
1003 kwargs = Py_None;
1004 }
1005 Py_INCREF(kwargs);
1006 return kwargs;
1007}
1008
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001009/* Test tuple argument processing */
1010static PyObject *
1011getargs_tuple(PyObject *self, PyObject *args)
1012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 int a, b, c;
1014 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1015 return NULL;
1016 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001017}
1018
Christian Heimes380f7f22008-02-28 11:19:05 +00001019/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001020static PyObject *
1021getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001024 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1028 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1029 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1030 return NULL;
1031 return Py_BuildValue("iiiiiiiiii",
1032 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1033 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001034}
1035
Larry Hastings83a9f482012-03-20 20:06:16 +00001036/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1037static PyObject *
1038getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1039{
1040 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1041 int required = -1;
1042 int optional = -1;
1043 int keyword_only = -1;
1044
1045 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1046 &required, &optional, &keyword_only))
1047 return NULL;
1048 return Py_BuildValue("iii", required, optional, keyword_only);
1049}
1050
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001051/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1052static PyObject *
1053getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1054{
1055 static char *keywords[] = {"", "", "keyword", NULL};
1056 int required = -1;
1057 int optional = -1;
1058 int keyword = -1;
1059
1060 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1061 &required, &optional, &keyword))
1062 return NULL;
1063 return Py_BuildValue("iii", required, optional, keyword);
1064}
1065
Thomas Heller3457e4b2003-04-24 16:14:27 +00001066/* Functions to call PyArg_ParseTuple with integer format codes,
1067 and return the result.
1068*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001069static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001070getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001071{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 unsigned char value;
1073 if (!PyArg_ParseTuple(args, "b", &value))
1074 return NULL;
1075 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001076}
1077
Thomas Heller3457e4b2003-04-24 16:14:27 +00001078static PyObject *
1079getargs_B(PyObject *self, PyObject *args)
1080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 unsigned char value;
1082 if (!PyArg_ParseTuple(args, "B", &value))
1083 return NULL;
1084 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001085}
1086
1087static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001088getargs_h(PyObject *self, PyObject *args)
1089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 short value;
1091 if (!PyArg_ParseTuple(args, "h", &value))
1092 return NULL;
1093 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001094}
1095
1096static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001097getargs_H(PyObject *self, PyObject *args)
1098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 unsigned short value;
1100 if (!PyArg_ParseTuple(args, "H", &value))
1101 return NULL;
1102 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001103}
1104
1105static PyObject *
1106getargs_I(PyObject *self, PyObject *args)
1107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 unsigned int value;
1109 if (!PyArg_ParseTuple(args, "I", &value))
1110 return NULL;
1111 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001112}
1113
1114static PyObject *
1115getargs_k(PyObject *self, PyObject *args)
1116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 unsigned long value;
1118 if (!PyArg_ParseTuple(args, "k", &value))
1119 return NULL;
1120 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001121}
1122
1123static PyObject *
1124getargs_i(PyObject *self, PyObject *args)
1125{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 int value;
1127 if (!PyArg_ParseTuple(args, "i", &value))
1128 return NULL;
1129 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001130}
1131
Thomas Hellera4ea6032003-04-17 18:55:45 +00001132static PyObject *
1133getargs_l(PyObject *self, PyObject *args)
1134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 long value;
1136 if (!PyArg_ParseTuple(args, "l", &value))
1137 return NULL;
1138 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001139}
1140
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001141static PyObject *
1142getargs_n(PyObject *self, PyObject *args)
1143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 Py_ssize_t value;
1145 if (!PyArg_ParseTuple(args, "n", &value))
1146 return NULL;
1147 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001148}
1149
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001150static PyObject *
1151getargs_p(PyObject *self, PyObject *args)
1152{
1153 int value;
1154 if (!PyArg_ParseTuple(args, "p", &value))
1155 return NULL;
1156 return PyLong_FromLong(value);
1157}
1158
Thomas Hellera4ea6032003-04-17 18:55:45 +00001159static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001160getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001161{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001162 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 if (!PyArg_ParseTuple(args, "L", &value))
1164 return NULL;
1165 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001166}
1167
Thomas Hellera4ea6032003-04-17 18:55:45 +00001168static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001169getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001170{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001171 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 if (!PyArg_ParseTuple(args, "K", &value))
1173 return NULL;
1174 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001175}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001176
1177/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001178 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001179static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301180test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 PyObject *tuple, *num;
1183 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 tuple = PyTuple_New(1);
1186 if (tuple == NULL)
1187 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 /* a number larger than ULONG_MAX even on 64-bit platforms */
1190 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1191 if (num == NULL)
1192 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 value = PyLong_AsUnsignedLongMask(num);
1195 if (value != ULONG_MAX)
1196 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001197 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001202 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001204 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 if (value != ULONG_MAX)
1206 return raiseTestError("test_k_code",
1207 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 Py_DECREF(num);
1210 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1211 if (num == NULL)
1212 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 value = PyLong_AsUnsignedLongMask(num);
1215 if (value != (unsigned long)-0x42)
1216 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001217 "PyLong_AsUnsignedLongMask() returned wrong "
1218 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001223 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001225 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 if (value != (unsigned long)-0x42)
1227 return raiseTestError("test_k_code",
1228 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001231 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001232}
1233
Victor Stinner06e49dd2010-06-13 18:21:50 +00001234static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001235getargs_f(PyObject *self, PyObject *args)
1236{
1237 float f;
1238 if (!PyArg_ParseTuple(args, "f", &f))
1239 return NULL;
1240 return PyFloat_FromDouble(f);
1241}
1242
1243static PyObject *
1244getargs_d(PyObject *self, PyObject *args)
1245{
1246 double d;
1247 if (!PyArg_ParseTuple(args, "d", &d))
1248 return NULL;
1249 return PyFloat_FromDouble(d);
1250}
1251
1252static PyObject *
1253getargs_D(PyObject *self, PyObject *args)
1254{
1255 Py_complex cval;
1256 if (!PyArg_ParseTuple(args, "D", &cval))
1257 return NULL;
1258 return PyComplex_FromCComplex(cval);
1259}
1260
1261static PyObject *
1262getargs_S(PyObject *self, PyObject *args)
1263{
1264 PyObject *obj;
1265 if (!PyArg_ParseTuple(args, "S", &obj))
1266 return NULL;
1267 Py_INCREF(obj);
1268 return obj;
1269}
1270
1271static PyObject *
1272getargs_Y(PyObject *self, PyObject *args)
1273{
1274 PyObject *obj;
1275 if (!PyArg_ParseTuple(args, "Y", &obj))
1276 return NULL;
1277 Py_INCREF(obj);
1278 return obj;
1279}
1280
1281static PyObject *
1282getargs_U(PyObject *self, PyObject *args)
1283{
1284 PyObject *obj;
1285 if (!PyArg_ParseTuple(args, "U", &obj))
1286 return NULL;
1287 Py_INCREF(obj);
1288 return obj;
1289}
1290
1291static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001292getargs_c(PyObject *self, PyObject *args)
1293{
1294 char c;
1295 if (!PyArg_ParseTuple(args, "c", &c))
1296 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001297 return PyLong_FromLong((unsigned char)c);
1298}
1299
1300static PyObject *
1301getargs_C(PyObject *self, PyObject *args)
1302{
1303 int c;
1304 if (!PyArg_ParseTuple(args, "C", &c))
1305 return NULL;
1306 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001307}
1308
1309static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001310getargs_s(PyObject *self, PyObject *args)
1311{
1312 char *str;
1313 if (!PyArg_ParseTuple(args, "s", &str))
1314 return NULL;
1315 return PyBytes_FromString(str);
1316}
1317
1318static PyObject *
1319getargs_s_star(PyObject *self, PyObject *args)
1320{
1321 Py_buffer buffer;
1322 PyObject *bytes;
1323 if (!PyArg_ParseTuple(args, "s*", &buffer))
1324 return NULL;
1325 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1326 PyBuffer_Release(&buffer);
1327 return bytes;
1328}
1329
1330static PyObject *
1331getargs_s_hash(PyObject *self, PyObject *args)
1332{
1333 char *str;
1334 Py_ssize_t size;
1335 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1336 return NULL;
1337 return PyBytes_FromStringAndSize(str, size);
1338}
1339
1340static PyObject *
1341getargs_z(PyObject *self, PyObject *args)
1342{
1343 char *str;
1344 if (!PyArg_ParseTuple(args, "z", &str))
1345 return NULL;
1346 if (str != NULL)
1347 return PyBytes_FromString(str);
1348 else
1349 Py_RETURN_NONE;
1350}
1351
1352static PyObject *
1353getargs_z_star(PyObject *self, PyObject *args)
1354{
1355 Py_buffer buffer;
1356 PyObject *bytes;
1357 if (!PyArg_ParseTuple(args, "z*", &buffer))
1358 return NULL;
1359 if (buffer.buf != NULL)
1360 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1361 else {
1362 Py_INCREF(Py_None);
1363 bytes = Py_None;
1364 }
1365 PyBuffer_Release(&buffer);
1366 return bytes;
1367}
1368
1369static PyObject *
1370getargs_z_hash(PyObject *self, PyObject *args)
1371{
1372 char *str;
1373 Py_ssize_t size;
1374 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1375 return NULL;
1376 if (str != NULL)
1377 return PyBytes_FromStringAndSize(str, size);
1378 else
1379 Py_RETURN_NONE;
1380}
1381
1382static PyObject *
1383getargs_y(PyObject *self, PyObject *args)
1384{
1385 char *str;
1386 if (!PyArg_ParseTuple(args, "y", &str))
1387 return NULL;
1388 return PyBytes_FromString(str);
1389}
1390
1391static PyObject *
1392getargs_y_star(PyObject *self, PyObject *args)
1393{
1394 Py_buffer buffer;
1395 PyObject *bytes;
1396 if (!PyArg_ParseTuple(args, "y*", &buffer))
1397 return NULL;
1398 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1399 PyBuffer_Release(&buffer);
1400 return bytes;
1401}
1402
1403static PyObject *
1404getargs_y_hash(PyObject *self, PyObject *args)
1405{
1406 char *str;
1407 Py_ssize_t size;
1408 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1409 return NULL;
1410 return PyBytes_FromStringAndSize(str, size);
1411}
1412
1413static PyObject *
1414getargs_u(PyObject *self, PyObject *args)
1415{
1416 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001417 if (!PyArg_ParseTuple(args, "u", &str))
1418 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001419 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001420}
1421
1422static PyObject *
1423getargs_u_hash(PyObject *self, PyObject *args)
1424{
1425 Py_UNICODE *str;
1426 Py_ssize_t size;
1427 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1428 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001429 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001430}
1431
1432static PyObject *
1433getargs_Z(PyObject *self, PyObject *args)
1434{
1435 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001436 if (!PyArg_ParseTuple(args, "Z", &str))
1437 return NULL;
1438 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001439 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001440 } else
1441 Py_RETURN_NONE;
1442}
1443
1444static PyObject *
1445getargs_Z_hash(PyObject *self, PyObject *args)
1446{
1447 Py_UNICODE *str;
1448 Py_ssize_t size;
1449 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1450 return NULL;
1451 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001452 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001453 else
1454 Py_RETURN_NONE;
1455}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001456
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001457static PyObject *
1458getargs_es(PyObject *self, PyObject *args)
1459{
1460 PyObject *arg, *result;
1461 const char *encoding = NULL;
1462 char *str;
1463
1464 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1465 return NULL;
1466 if (!PyArg_Parse(arg, "es", encoding, &str))
1467 return NULL;
1468 result = PyBytes_FromString(str);
1469 PyMem_Free(str);
1470 return result;
1471}
1472
1473static PyObject *
1474getargs_et(PyObject *self, PyObject *args)
1475{
1476 PyObject *arg, *result;
1477 const char *encoding = NULL;
1478 char *str;
1479
1480 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1481 return NULL;
1482 if (!PyArg_Parse(arg, "et", encoding, &str))
1483 return NULL;
1484 result = PyBytes_FromString(str);
1485 PyMem_Free(str);
1486 return result;
1487}
1488
1489static PyObject *
1490getargs_es_hash(PyObject *self, PyObject *args)
1491{
1492 PyObject *arg, *result;
1493 const char *encoding = NULL;
1494 PyByteArrayObject *buffer = NULL;
1495 char *str = NULL;
1496 Py_ssize_t size;
1497
1498 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1499 return NULL;
1500 if (buffer != NULL) {
1501 str = PyByteArray_AS_STRING(buffer);
1502 size = PyByteArray_GET_SIZE(buffer);
1503 }
1504 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1505 return NULL;
1506 result = PyBytes_FromStringAndSize(str, size);
1507 if (buffer == NULL)
1508 PyMem_Free(str);
1509 return result;
1510}
1511
1512static PyObject *
1513getargs_et_hash(PyObject *self, PyObject *args)
1514{
1515 PyObject *arg, *result;
1516 const char *encoding = NULL;
1517 PyByteArrayObject *buffer = NULL;
1518 char *str = NULL;
1519 Py_ssize_t size;
1520
1521 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1522 return NULL;
1523 if (buffer != NULL) {
1524 str = PyByteArray_AS_STRING(buffer);
1525 size = PyByteArray_GET_SIZE(buffer);
1526 }
1527 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1528 return NULL;
1529 result = PyBytes_FromStringAndSize(str, size);
1530 if (buffer == NULL)
1531 PyMem_Free(str);
1532 return result;
1533}
1534
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001535/* Test the s and z codes for PyArg_ParseTuple.
1536*/
1537static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301538test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001539{
1540 /* Unicode strings should be accepted */
1541 PyObject *tuple, *obj;
1542 char *value;
1543
1544 tuple = PyTuple_New(1);
1545 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001547
1548 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001550 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001552
1553 PyTuple_SET_ITEM(tuple, 0, obj);
1554
1555 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001557 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001558 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1559 return NULL;
1560 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001561
Oren Milmanba7d7362017-08-29 11:58:27 +03001562 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1563 return NULL;
1564 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001565
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001566 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001567 Py_RETURN_NONE;
1568}
1569
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001570static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001571parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001572{
Larry Hastings8f904da2012-06-22 03:56:29 -07001573 PyObject *sub_args;
1574 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001575 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001576 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001577
Larry Hastings8f904da2012-06-22 03:56:29 -07001578 Py_ssize_t i, size;
1579 char *keywords[8 + 1]; /* space for NULL at end */
1580 PyObject *o;
1581 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001582
Larry Hastings8f904da2012-06-22 03:56:29 -07001583 int result;
1584 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001585
Larry Hastings22701e82012-08-08 14:52:22 -07001586 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001587
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001588 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001589 &sub_args, &sub_kwargs,
1590 &sub_format, &sub_keywords))
1591 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001592
Larry Hastings8f904da2012-06-22 03:56:29 -07001593 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1594 PyErr_SetString(PyExc_ValueError,
1595 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1596 return NULL;
1597 }
1598
1599 memset(buffers, 0, sizeof(buffers));
1600 memset(converted, 0, sizeof(converted));
1601 memset(keywords, 0, sizeof(keywords));
1602
1603 size = PySequence_Fast_GET_SIZE(sub_keywords);
1604 if (size > 8) {
1605 PyErr_SetString(PyExc_ValueError,
1606 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1607 goto exit;
1608 }
1609
1610 for (i = 0; i < size; i++) {
1611 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1612 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1613 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001614 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001615 goto exit;
1616 }
1617 keywords[i] = PyBytes_AS_STRING(converted[i]);
1618 }
1619
1620 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1621 sub_format, keywords,
1622 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1623 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1624
1625 if (result) {
1626 return_value = Py_None;
1627 Py_INCREF(Py_None);
1628 }
1629
1630exit:
1631 size = sizeof(converted) / sizeof(converted[0]);
1632 for (i = 0; i < size; i++) {
1633 Py_XDECREF(converted[i]);
1634 }
1635 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001636}
1637
Benjamin Peterson92035012008-12-27 16:00:54 +00001638static volatile int x;
1639
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001640/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1641 of an error.
1642*/
1643static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301644test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001645{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 PyObject *tuple, *obj;
1647 Py_UNICODE *value;
1648 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1651 /* Just use the macro and check that it compiles */
1652 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 tuple = PyTuple_New(1);
1655 if (tuple == NULL)
1656 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 obj = PyUnicode_Decode("test", strlen("test"),
1659 "ascii", NULL);
1660 if (obj == NULL)
1661 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001666 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001668 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 if (value != PyUnicode_AS_UNICODE(obj))
1670 return raiseTestError("test_u_code",
1671 "u code returned wrong value for u'test'");
1672 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001673 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001675 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 if (value != PyUnicode_AS_UNICODE(obj) ||
1677 len != PyUnicode_GET_SIZE(obj))
1678 return raiseTestError("test_u_code",
1679 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001682 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001683}
1684
Guido van Rossumfb67be22007-08-29 18:38:11 +00001685/* Test Z and Z# codes for PyArg_ParseTuple */
1686static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301687test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001688{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001690 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 tuple = PyTuple_New(2);
1694 if (tuple == NULL)
1695 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 obj = PyUnicode_FromString("test");
1698 PyTuple_SET_ITEM(tuple, 0, obj);
1699 Py_INCREF(Py_None);
1700 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 /* swap values on purpose */
1703 value1 = NULL;
1704 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001707 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001709 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 if (value1 != PyUnicode_AS_UNICODE(obj))
1711 return raiseTestError("test_Z_code",
1712 "Z code returned wrong value for 'test'");
1713 if (value2 != NULL)
1714 return raiseTestError("test_Z_code",
1715 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 value1 = NULL;
1718 value2 = PyUnicode_AS_UNICODE(obj);
1719 len1 = -1;
1720 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001723 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1724 &value2, &len2))
1725 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001727 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1729 len1 != PyUnicode_GET_SIZE(obj))
1730 return raiseTestError("test_Z_code",
1731 "Z# code returned wrong values for 'test'");
1732 if (value2 != NULL ||
1733 len2 != 0)
1734 return raiseTestError("test_Z_code",
1735 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 Py_DECREF(tuple);
1738 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001739}
1740
Thomas Wouters477c8d52006-05-27 19:21:47 +00001741static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301742test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001743{
1744#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1746 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001747 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001748#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1750 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1755 if (wide == NULL)
1756 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1759 if (utf8 == NULL) {
1760 Py_DECREF(wide);
1761 return NULL;
1762 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001763
Victor Stinner8ef18872011-11-21 02:06:57 +01001764 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 Py_DECREF(wide);
1766 Py_DECREF(utf8);
1767 return raiseTestError("test_widechar",
1768 "wide string and utf8 string "
1769 "have different length");
1770 }
1771 if (PyUnicode_Compare(wide, utf8)) {
1772 Py_DECREF(wide);
1773 Py_DECREF(utf8);
1774 if (PyErr_Occurred())
1775 return NULL;
1776 return raiseTestError("test_widechar",
1777 "wide string and utf8 string "
1778 "are different");
1779 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 Py_DECREF(wide);
1782 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001783
1784#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1785 wide = PyUnicode_FromWideChar(invalid, 1);
1786 if (wide == NULL)
1787 PyErr_Clear();
1788 else
1789 return raiseTestError("test_widechar",
1790 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1791
1792 wide = PyUnicode_FromUnicode(invalid, 1);
1793 if (wide == NULL)
1794 PyErr_Clear();
1795 else
1796 return raiseTestError("test_widechar",
1797 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001798
1799 wide = PyUnicode_FromUnicode(NULL, 1);
1800 if (wide == NULL)
1801 return NULL;
1802 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001803 if (_PyUnicode_Ready(wide) < 0) {
1804 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001805 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001806 }
1807 else {
1808 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001809 return raiseTestError("test_widechar",
1810 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001811 }
Victor Stinnere3b47152011-12-09 20:49:49 +01001812#endif
1813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001815}
1816
1817static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001818unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001819{
1820 PyObject *unicode, *result;
1821 Py_ssize_t buflen, size;
1822 wchar_t *buffer;
1823
1824 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1825 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001826 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001827 if (buffer == NULL)
1828 return PyErr_NoMemory();
1829
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001830 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001831 if (size == -1) {
1832 PyMem_Free(buffer);
1833 return NULL;
1834 }
1835
1836 if (size < buflen)
1837 buflen = size + 1;
1838 else
1839 buflen = size;
1840 result = PyUnicode_FromWideChar(buffer, buflen);
1841 PyMem_Free(buffer);
1842 if (result == NULL)
1843 return NULL;
1844
1845 return Py_BuildValue("(Nn)", result, size);
1846}
1847
1848static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001849unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001850{
1851 PyObject *unicode, *result;
1852 Py_ssize_t size;
1853 wchar_t *buffer;
1854
1855 if (!PyArg_ParseTuple(args, "U", &unicode))
1856 return NULL;
1857
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001858 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001859 if (buffer == NULL)
1860 return NULL;
1861
1862 result = PyUnicode_FromWideChar(buffer, size + 1);
1863 PyMem_Free(buffer);
1864 if (result == NULL)
1865 return NULL;
1866 return Py_BuildValue("(Nn)", result, size);
1867}
1868
1869static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001870unicode_asucs4(PyObject *self, PyObject *args)
1871{
1872 PyObject *unicode, *result;
1873 Py_UCS4 *buffer;
1874 int copy_null;
1875 Py_ssize_t str_len, buf_len;
1876
1877 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1878 return NULL;
1879 }
1880
1881 buf_len = str_len + 1;
1882 buffer = PyMem_NEW(Py_UCS4, buf_len);
1883 if (buffer == NULL) {
1884 return PyErr_NoMemory();
1885 }
1886 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1887 buffer[str_len] = 0xffffU;
1888
1889 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1890 PyMem_FREE(buffer);
1891 return NULL;
1892 }
1893
1894 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1895 PyMem_FREE(buffer);
1896 return result;
1897}
1898
1899static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001900unicode_findchar(PyObject *self, PyObject *args)
1901{
1902 PyObject *str;
1903 int direction;
1904 unsigned int ch;
1905 Py_ssize_t result;
1906 Py_ssize_t start, end;
1907
1908 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1909 &start, &end, &direction)) {
1910 return NULL;
1911 }
1912
1913 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
1914 if (result == -2)
1915 return NULL;
1916 else
1917 return PyLong_FromSsize_t(result);
1918}
1919
1920static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001921unicode_copycharacters(PyObject *self, PyObject *args)
1922{
1923 PyObject *from, *to, *to_copy;
1924 Py_ssize_t from_start, to_start, how_many, copied;
1925
1926 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
1927 &from, &from_start, &how_many)) {
1928 return NULL;
1929 }
1930
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03001931 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
1932 PyUnicode_MAX_CHAR_VALUE(to)))) {
1933 return NULL;
1934 }
1935 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
1936 Py_DECREF(to_copy);
1937 return NULL;
1938 }
1939
1940 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
1941 from_start, how_many)) < 0) {
1942 Py_DECREF(to_copy);
1943 return NULL;
1944 }
1945
1946 return Py_BuildValue("(Nn)", to_copy, copied);
1947}
1948
1949static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01001950unicode_encodedecimal(PyObject *self, PyObject *args)
1951{
1952 Py_UNICODE *unicode;
1953 Py_ssize_t length;
1954 char *errors = NULL;
1955 PyObject *decimal;
1956 Py_ssize_t decimal_length, new_length;
1957 int res;
1958
1959 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
1960 return NULL;
1961
1962 decimal_length = length * 7; /* len('&#8364;') */
1963 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
1964 if (decimal == NULL)
1965 return NULL;
1966
1967 res = PyUnicode_EncodeDecimal(unicode, length,
1968 PyBytes_AS_STRING(decimal),
1969 errors);
1970 if (res < 0) {
1971 Py_DECREF(decimal);
1972 return NULL;
1973 }
1974
1975 new_length = strlen(PyBytes_AS_STRING(decimal));
1976 assert(new_length <= decimal_length);
1977 res = _PyBytes_Resize(&decimal, new_length);
1978 if (res < 0)
1979 return NULL;
1980
1981 return decimal;
1982}
1983
1984static PyObject *
1985unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
1986{
1987 Py_UNICODE *unicode;
1988 Py_ssize_t length;
1989 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
1990 return NULL;
1991 return PyUnicode_TransformDecimalToASCII(unicode, length);
1992}
1993
1994static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01001995unicode_legacy_string(PyObject *self, PyObject *args)
1996{
1997 Py_UNICODE *data;
1998 Py_ssize_t len;
1999 PyObject *u;
2000
2001 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2002 return NULL;
2003
2004 u = PyUnicode_FromUnicode(NULL, len);
2005 if (u == NULL)
2006 return NULL;
2007
2008 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2009
2010 if (len > 0) { /* The empty string is always ready. */
2011 assert(!PyUnicode_IS_READY(u));
2012 }
2013
2014 return u;
2015}
2016
2017static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002018getargs_w_star(PyObject *self, PyObject *args)
2019{
2020 Py_buffer buffer;
2021 PyObject *result;
2022 char *str;
2023
2024 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2025 return NULL;
2026
2027 if (2 <= buffer.len) {
2028 str = buffer.buf;
2029 str[0] = '[';
2030 str[buffer.len-1] = ']';
2031 }
2032
2033 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2034 PyBuffer_Release(&buffer);
2035 return result;
2036}
2037
2038
2039static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302040test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 /* Test that formats can begin with '|'. See issue #4720. */
2043 PyObject *tuple, *dict = NULL;
2044 static char *kwlist[] = {NULL};
2045 int result;
2046 tuple = PyTuple_New(0);
2047 if (!tuple)
2048 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002049 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002051 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 dict = PyDict_New();
2053 if (!dict)
2054 goto done;
2055 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002056 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 Py_DECREF(tuple);
2058 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002059 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002061 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 else {
2063 Py_RETURN_NONE;
2064 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002065}
2066
2067static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002068codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 const char *encoding, *errors = NULL;
2071 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2072 &encoding, &errors))
2073 return NULL;
2074 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002075}
2076
Thomas Wouters477c8d52006-05-27 19:21:47 +00002077static PyObject *
2078codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002079{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 const char *encoding, *errors = NULL;
2081 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2082 &encoding, &errors))
2083 return NULL;
2084 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002085}
2086
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002087
Tim Peters5b8132f2003-01-31 15:52:05 +00002088/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002089static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302090test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002091{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 struct triple {
2093 long input;
2094 size_t nbits;
2095 int sign;
2096 } testcases[] = {{0, 0, 0},
2097 {1L, 1, 1},
2098 {-1L, 1, -1},
2099 {2L, 2, 1},
2100 {-2L, 2, -1},
2101 {3L, 2, 1},
2102 {-3L, 2, -1},
2103 {4L, 3, 1},
2104 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002105 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 {-0x7fffL, 15, -1},
2107 {0xffffL, 16, 1},
2108 {-0xffffL, 16, -1},
2109 {0xfffffffL, 28, 1},
2110 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002111 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002112
Victor Stinner63941882011-09-29 00:42:28 +02002113 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002114 size_t nbits;
2115 int sign;
2116 PyObject *plong;
2117
2118 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002119 if (plong == NULL)
2120 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002121 nbits = _PyLong_NumBits(plong);
2122 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 Py_DECREF(plong);
2125 if (nbits != testcases[i].nbits)
2126 return raiseTestError("test_long_numbits",
2127 "wrong result for _PyLong_NumBits");
2128 if (sign != testcases[i].sign)
2129 return raiseTestError("test_long_numbits",
2130 "wrong result for _PyLong_Sign");
2131 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002132 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002133}
2134
Thomas Heller519a0422007-11-15 20:48:54 +00002135/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002136
2137static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302138test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2141 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2142 Py_XDECREF(o1);
2143 Py_XDECREF(o2);
2144 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002145}
2146
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002147static PyObject *
2148raise_exception(PyObject *self, PyObject *args)
2149{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 PyObject *exc;
2151 PyObject *exc_args, *v;
2152 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2155 &exc, &num_args))
2156 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 exc_args = PyTuple_New(num_args);
2159 if (exc_args == NULL)
2160 return NULL;
2161 for (i = 0; i < num_args; ++i) {
2162 v = PyLong_FromLong(i);
2163 if (v == NULL) {
2164 Py_DECREF(exc_args);
2165 return NULL;
2166 }
2167 PyTuple_SET_ITEM(exc_args, i, v);
2168 }
2169 PyErr_SetObject(exc, exc_args);
2170 Py_DECREF(exc_args);
2171 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002172}
Tim Peters91621db2001-06-12 20:10:01 +00002173
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002174static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002175set_errno(PyObject *self, PyObject *args)
2176{
2177 int new_errno;
2178
2179 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2180 return NULL;
2181
2182 errno = new_errno;
2183 Py_RETURN_NONE;
2184}
2185
2186static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002187test_set_exc_info(PyObject *self, PyObject *args)
2188{
2189 PyObject *orig_exc;
2190 PyObject *new_type, *new_value, *new_tb;
2191 PyObject *type, *value, *tb;
2192 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2193 &new_type, &new_value, &new_tb))
2194 return NULL;
2195
2196 PyErr_GetExcInfo(&type, &value, &tb);
2197
2198 Py_INCREF(new_type);
2199 Py_INCREF(new_value);
2200 Py_INCREF(new_tb);
2201 PyErr_SetExcInfo(new_type, new_value, new_tb);
2202
2203 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2204 Py_XDECREF(type);
2205 Py_XDECREF(value);
2206 Py_XDECREF(tb);
2207 return orig_exc;
2208}
Benjamin Peterson16323982010-02-03 01:13:41 +00002209
2210static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002211
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002212static PyObject *
2213test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214 if (PyDateTimeAPI) {
2215 if (test_run_counter) {
2216 /* Probably regrtest.py -R */
2217 Py_RETURN_NONE;
2218 }
2219 else {
2220 PyErr_SetString(PyExc_AssertionError,
2221 "PyDateTime_CAPI somehow initialized");
2222 return NULL;
2223 }
2224 }
2225 test_run_counter++;
2226 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228 if (PyDateTimeAPI)
2229 Py_RETURN_NONE;
2230 else
2231 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002232}
2233
Paul Ganssle04af5b12018-01-24 17:29:30 -05002234/* Functions exposing the C API type checking for testing */
2235#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2236 PyObject *obj; \
2237 int exact = 0; \
2238 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2239 return NULL; \
2240 } \
2241 int rv = exact?exact_method(obj):check_method(obj); \
2242 if (rv) { \
2243 Py_RETURN_TRUE; \
2244 } else { \
2245 Py_RETURN_FALSE; \
2246 }
2247
2248static PyObject *
2249datetime_check_date(PyObject *self, PyObject *args) {
2250 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2251}
2252
2253static PyObject *
2254datetime_check_time(PyObject *self, PyObject *args) {
2255 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2256}
2257
2258static PyObject *
2259datetime_check_datetime(PyObject *self, PyObject *args) {
2260 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2261}
2262
2263static PyObject *
2264datetime_check_delta(PyObject *self, PyObject *args) {
2265 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2266}
2267
2268static PyObject *
2269datetime_check_tzinfo(PyObject *self, PyObject *args) {
2270 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2271}
2272
2273
2274/* Makes three variations on timezone representing UTC-5:
2275 1. timezone with offset and name from PyDateTimeAPI
2276 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2277 3. timezone with offset (no name) from PyTimeZone_FromOffset
2278*/
2279static PyObject *
2280make_timezones_capi(PyObject *self, PyObject *args) {
2281 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2282 PyObject *name = PyUnicode_FromString("EST");
2283
2284 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2285 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2286 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2287
2288 Py_DecRef(offset);
2289 Py_DecRef(name);
2290
2291 PyObject *rv = PyTuple_New(3);
2292
2293 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2294 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2295 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2296
2297 return rv;
2298}
2299
2300static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002301get_timezones_offset_zero(PyObject *self, PyObject *args) {
2302 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2303 PyObject *name = PyUnicode_FromString("");
2304
2305 // These two should return the UTC singleton
2306 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2307 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2308
2309 // This one will return +00:00 zone, but not the UTC singleton
2310 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2311
2312 Py_DecRef(offset);
2313 Py_DecRef(name);
2314
2315 PyObject *rv = PyTuple_New(3);
2316 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2317 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2318 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2319
2320 return rv;
2321}
2322
2323static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002324get_timezone_utc_capi(PyObject* self, PyObject *args) {
2325 int macro = 0;
2326 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2327 return NULL;
2328 }
2329 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002330 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002331 return PyDateTime_TimeZone_UTC;
2332 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002333 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002334 return PyDateTimeAPI->TimeZone_UTC;
2335 }
2336}
2337
Benjamin Peterson16323982010-02-03 01:13:41 +00002338
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002339/* test_thread_state spawns a thread of its own, and that thread releases
2340 * `thread_done` when it's finished. The driver code has to know when the
2341 * thread finishes, because the thread uses a PyObject (the callable) that
2342 * may go away when the driver finishes. The former lack of this explicit
2343 * synchronization caused rare segfaults, so rare that they were seen only
2344 * on a Mac buildbot (although they were possible on any box).
2345 */
2346static PyThread_type_lock thread_done = NULL;
2347
Benjamin Petersona786b022008-08-25 21:05:21 +00002348static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002349_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 PyObject *rc;
2352 int success;
2353 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002354 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 success = (rc != NULL);
2356 Py_XDECREF(rc);
2357 PyGILState_Release(s);
2358 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002359}
2360
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002361/* Same thing, but releases `thread_done` when it returns. This variant
2362 * should be called only from threads spawned by test_thread_state().
2363 */
2364static void
2365_make_call_from_thread(void *callable)
2366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 _make_call(callable);
2368 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002369}
2370
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002371static PyObject *
2372test_thread_state(PyObject *self, PyObject *args)
2373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 PyObject *fn;
2375 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2378 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 if (!PyCallable_Check(fn)) {
2381 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
2382 fn->ob_type->tp_name);
2383 return NULL;
2384 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 /* Ensure Python is set up for threading */
2387 PyEval_InitThreads();
2388 thread_done = PyThread_allocate_lock();
2389 if (thread_done == NULL)
2390 return PyErr_NoMemory();
2391 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393 /* Start a new thread with our callback. */
2394 PyThread_start_new_thread(_make_call_from_thread, fn);
2395 /* Make the callback with the thread lock held by this thread */
2396 success &= _make_call(fn);
2397 /* Do it all again, but this time with the thread-lock released */
2398 Py_BEGIN_ALLOW_THREADS
2399 success &= _make_call(fn);
2400 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2401 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 /* And once more with and without a thread
2404 XXX - should use a lock and work out exactly what we are trying
2405 to test <wink>
2406 */
2407 Py_BEGIN_ALLOW_THREADS
2408 PyThread_start_new_thread(_make_call_from_thread, fn);
2409 success &= _make_call(fn);
2410 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2411 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 /* Release lock we acquired above. This is required on HP-UX. */
2414 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 PyThread_free_lock(thread_done);
2417 if (!success)
2418 return NULL;
2419 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002420}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002421
2422/* test Py_AddPendingCalls using threads */
2423static int _pending_callback(void *arg)
2424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 /* we assume the argument is callable object to which we own a reference */
2426 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002427 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 Py_DECREF(callable);
2429 Py_XDECREF(r);
2430 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002431}
2432
2433/* The following requests n callbacks to _pending_callback. It can be
2434 * run from any python thread.
2435 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07002436static PyObject *
2437pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 PyObject *callable;
2440 int r;
2441 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2442 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 /* create the reference for the callbackwhile we hold the lock */
2445 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 Py_BEGIN_ALLOW_THREADS
2448 r = Py_AddPendingCall(&_pending_callback, callable);
2449 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 if (r<0) {
2452 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002453 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002455 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002456}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002457
Neal Norwitzb0d26332007-08-25 00:49:05 +00002458/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002459static PyObject *
2460test_string_from_format(PyObject *self, PyObject *args)
2461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 PyObject *result;
2463 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002464
Alexander Belopolskye239d232010-12-08 23:31:48 +00002465#define CHECK_1_FORMAT(FORMAT, TYPE) \
2466 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2467 if (result == NULL) \
2468 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002469 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002470 msg = FORMAT " failed at 1"; \
2471 goto Fail; \
2472 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 CHECK_1_FORMAT("%d", int);
2476 CHECK_1_FORMAT("%ld", long);
2477 /* The z width modifier was added in Python 2.5. */
2478 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 /* The u type code was added in Python 2.5. */
2481 CHECK_1_FORMAT("%u", unsigned int);
2482 CHECK_1_FORMAT("%lu", unsigned long);
2483 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002486 CHECK_1_FORMAT("%llu", unsigned long long);
2487 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002490
2491 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 Py_XDECREF(result);
2493 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002494
2495#undef CHECK_1_FORMAT
2496}
2497
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002498
2499static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302500test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2502 int result;
2503 if (py_s == NULL)
2504 return NULL;
2505 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2506 Py_DECREF(py_s);
2507 if (!result) {
2508 PyErr_SetString(TestError, "Python string ending in NULL "
2509 "should not compare equal to c string.");
2510 return NULL;
2511 }
2512 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002513}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002514
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002515/* This is here to provide a docstring for test_descr. */
2516static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302517test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002520}
2521
Mark Dickinson725bfd82009-05-03 20:33:40 +00002522/* Test PyOS_string_to_double. */
2523static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302524test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002526 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528#define CHECK_STRING(STR, expected) \
2529 result = PyOS_string_to_double(STR, NULL, NULL); \
2530 if (result == -1.0 && PyErr_Occurred()) \
2531 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002532 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 msg = "conversion of " STR " to float failed"; \
2534 goto fail; \
2535 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537#define CHECK_INVALID(STR) \
2538 result = PyOS_string_to_double(STR, NULL, NULL); \
2539 if (result == -1.0 && PyErr_Occurred()) { \
2540 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2541 PyErr_Clear(); \
2542 else \
2543 return NULL; \
2544 } \
2545 else { \
2546 msg = "conversion of " STR " didn't raise ValueError"; \
2547 goto fail; \
2548 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 CHECK_STRING("0.1", 0.1);
2551 CHECK_STRING("1.234", 1.234);
2552 CHECK_STRING("-1.35", -1.35);
2553 CHECK_STRING(".1e01", 1.0);
2554 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 CHECK_INVALID(" 0.1");
2557 CHECK_INVALID("\t\n-3");
2558 CHECK_INVALID(".123 ");
2559 CHECK_INVALID("3\n");
2560 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002563 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002565#undef CHECK_STRING
2566#undef CHECK_INVALID
2567}
2568
2569
Benjamin Petersonb173f782009-05-05 22:31:58 +00002570/* Coverage testing of capsule objects. */
2571
2572static const char *capsule_name = "capsule name";
2573static char *capsule_pointer = "capsule pointer";
2574static char *capsule_context = "capsule context";
2575static const char *capsule_error = NULL;
2576static int
2577capsule_destructor_call_count = 0;
2578
2579static void
2580capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 capsule_destructor_call_count++;
2582 if (PyCapsule_GetContext(o) != capsule_context) {
2583 capsule_error = "context did not match in destructor!";
2584 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2585 capsule_error = "destructor did not match in destructor! (woah!)";
2586 } else if (PyCapsule_GetName(o) != capsule_name) {
2587 capsule_error = "name did not match in destructor!";
2588 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2589 capsule_error = "pointer did not match in destructor!";
2590 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002591}
2592
2593typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002594 char *name;
2595 char *module;
2596 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002597} known_capsule;
2598
2599static PyObject *
2600test_capsule(PyObject *self, PyObject *args)
2601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 PyObject *object;
2603 const char *error = NULL;
2604 void *pointer;
2605 void *pointer2;
2606 known_capsule known_capsules[] = {
2607 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2608 KNOWN_CAPSULE("_socket", "CAPI"),
2609 KNOWN_CAPSULE("_curses", "_C_API"),
2610 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2611 { NULL, NULL },
2612 };
2613 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002614
2615#define FAIL(x) { error = (x); goto exit; }
2616
2617#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 if (capsule_error) { \
2619 FAIL(capsule_error); \
2620 } \
2621 else if (!capsule_destructor_call_count) { \
2622 FAIL("destructor not called!"); \
2623 } \
2624 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002626 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2627 PyCapsule_SetContext(object, capsule_context);
2628 capsule_destructor(object);
2629 CHECK_DESTRUCTOR;
2630 Py_DECREF(object);
2631 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 object = PyCapsule_New(known, "ignored", NULL);
2634 PyCapsule_SetPointer(object, capsule_pointer);
2635 PyCapsule_SetName(object, capsule_name);
2636 PyCapsule_SetDestructor(object, capsule_destructor);
2637 PyCapsule_SetContext(object, capsule_context);
2638 capsule_destructor(object);
2639 CHECK_DESTRUCTOR;
2640 /* intentionally access using the wrong name */
2641 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
2642 if (!PyErr_Occurred()) {
2643 FAIL("PyCapsule_GetPointer should have failed but did not!");
2644 }
2645 PyErr_Clear();
2646 if (pointer2) {
2647 if (pointer2 == capsule_pointer) {
2648 FAIL("PyCapsule_GetPointer should not have"
2649 " returned the internal pointer!");
2650 } else {
2651 FAIL("PyCapsule_GetPointer should have "
2652 "returned NULL pointer but did not!");
2653 }
2654 }
2655 PyCapsule_SetDestructor(object, NULL);
2656 Py_DECREF(object);
2657 if (capsule_destructor_call_count) {
2658 FAIL("destructor called when it should not have been!");
2659 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 for (known = &known_capsules[0]; known->module != NULL; known++) {
2662 /* yeah, ordinarily I wouldn't do this either,
2663 but it's fine for this test harness.
2664 */
2665 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002666#undef FAIL
2667#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002668 { \
2669 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
2670 x, known->module, known->attribute); \
2671 error = buffer; \
2672 goto exit; \
2673 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 PyObject *module = PyImport_ImportModule(known->module);
2676 if (module) {
2677 pointer = PyCapsule_Import(known->name, 0);
2678 if (!pointer) {
2679 Py_DECREF(module);
2680 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
2681 }
2682 object = PyObject_GetAttrString(module, known->attribute);
2683 if (!object) {
2684 Py_DECREF(module);
2685 return NULL;
2686 }
2687 pointer2 = PyCapsule_GetPointer(object,
2688 "weebles wobble but they don't fall down");
2689 if (!PyErr_Occurred()) {
2690 Py_DECREF(object);
2691 Py_DECREF(module);
2692 FAIL("PyCapsule_GetPointer should have failed but did not!");
2693 }
2694 PyErr_Clear();
2695 if (pointer2) {
2696 Py_DECREF(module);
2697 Py_DECREF(object);
2698 if (pointer2 == pointer) {
2699 FAIL("PyCapsule_GetPointer should not have"
2700 " returned its internal pointer!");
2701 } else {
2702 FAIL("PyCapsule_GetPointer should have"
2703 " returned NULL pointer but did not!");
2704 }
2705 }
2706 Py_DECREF(object);
2707 Py_DECREF(module);
2708 }
2709 else
2710 PyErr_Clear();
2711 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002712
2713 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 if (error) {
2715 return raiseTestError("test_capsule", error);
2716 }
2717 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002718#undef FAIL
2719}
2720
Guido van Rossumddefaf32007-01-14 03:31:43 +00002721#ifdef HAVE_GETTIMEOFDAY
2722/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00002723static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00002724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 e->tv_sec -= s->tv_sec;
2726 e->tv_usec -= s->tv_usec;
2727 if (e->tv_usec < 0) {
2728 e->tv_sec -=1;
2729 e->tv_usec += 1000000;
2730 }
2731 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002732}
2733
2734static PyObject *
2735profile_int(PyObject *self, PyObject* args)
2736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 int i, k;
2738 struct timeval start, stop;
2739 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 /* Test 1: Allocate and immediately deallocate
2742 many small integers */
2743 gettimeofday(&start, NULL);
2744 for(k=0; k < 20000; k++)
2745 for(i=0; i < 1000; i++) {
2746 single = PyLong_FromLong(i);
2747 Py_DECREF(single);
2748 }
2749 gettimeofday(&stop, NULL);
2750 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 /* Test 2: Allocate and immediately deallocate
2753 many large integers */
2754 gettimeofday(&start, NULL);
2755 for(k=0; k < 20000; k++)
2756 for(i=0; i < 1000; i++) {
2757 single = PyLong_FromLong(i+1000000);
2758 Py_DECREF(single);
2759 }
2760 gettimeofday(&stop, NULL);
2761 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 /* Test 3: Allocate a few integers, then release
2764 them all simultaneously. */
2765 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02002766 if (multiple == NULL)
2767 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 gettimeofday(&start, NULL);
2769 for(k=0; k < 20000; k++) {
2770 for(i=0; i < 1000; i++) {
2771 multiple[i] = PyLong_FromLong(i+1000000);
2772 }
2773 for(i=0; i < 1000; i++) {
2774 Py_DECREF(multiple[i]);
2775 }
2776 }
2777 gettimeofday(&stop, NULL);
2778 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002779 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 /* Test 4: Allocate many integers, then release
2782 them all simultaneously. */
2783 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002784 if (multiple == NULL)
2785 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 gettimeofday(&start, NULL);
2787 for(k=0; k < 20; k++) {
2788 for(i=0; i < 1000000; i++) {
2789 multiple[i] = PyLong_FromLong(i+1000000);
2790 }
2791 for(i=0; i < 1000000; i++) {
2792 Py_DECREF(multiple[i]);
2793 }
2794 }
2795 gettimeofday(&stop, NULL);
2796 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002797 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 /* Test 5: Allocate many integers < 32000 */
2800 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02002801 if (multiple == NULL)
2802 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 gettimeofday(&start, NULL);
2804 for(k=0; k < 10; k++) {
2805 for(i=0; i < 1000000; i++) {
2806 multiple[i] = PyLong_FromLong(i+1000);
2807 }
2808 for(i=0; i < 1000000; i++) {
2809 Py_DECREF(multiple[i]);
2810 }
2811 }
2812 gettimeofday(&stop, NULL);
2813 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02002814 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 /* Test 6: Perform small int addition */
2817 op1 = PyLong_FromLong(1);
2818 gettimeofday(&start, NULL);
2819 for(i=0; i < 10000000; i++) {
2820 result = PyNumber_Add(op1, op1);
2821 Py_DECREF(result);
2822 }
2823 gettimeofday(&stop, NULL);
2824 Py_DECREF(op1);
2825 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 /* Test 7: Perform medium int addition */
2828 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02002829 if (op1 == NULL)
2830 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 gettimeofday(&start, NULL);
2832 for(i=0; i < 10000000; i++) {
2833 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02002834 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 }
2836 gettimeofday(&stop, NULL);
2837 Py_DECREF(op1);
2838 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00002839
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002840 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00002841}
2842#endif
2843
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002844/* To test the format of tracebacks as printed out. */
2845static PyObject *
2846traceback_print(PyObject *self, PyObject *args)
2847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 PyObject *file;
2849 PyObject *traceback;
2850 int result;
2851
2852 if (!PyArg_ParseTuple(args, "OO:traceback_print",
2853 &traceback, &file))
2854 return NULL;
2855
2856 result = PyTraceBack_Print(traceback, file);
2857 if (result < 0)
2858 return NULL;
2859 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002860}
2861
Benjamin Petersone6528212008-07-15 15:32:09 +00002862/* To test the format of exceptions as printed out. */
2863static PyObject *
2864exception_print(PyObject *self, PyObject *args)
2865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002866 PyObject *value;
2867 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00002868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002869 if (!PyArg_ParseTuple(args, "O:exception_print",
2870 &value))
2871 return NULL;
2872 if (!PyExceptionInstance_Check(value)) {
2873 PyErr_Format(PyExc_TypeError, "an exception instance is required");
2874 return NULL;
2875 }
Benjamin Petersone6528212008-07-15 15:32:09 +00002876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 tb = PyException_GetTraceback(value);
2878 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
2879 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00002880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00002882}
2883
2884
2885
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002886
2887/* reliably raise a MemoryError */
2888static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302889raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002890{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 PyErr_NoMemory();
2892 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002893}
2894
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002895/* Issue 6012 */
2896static PyObject *str1, *str2;
2897static int
2898failing_converter(PyObject *obj, void *arg)
2899{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002900 /* Clone str1, then let the conversion fail. */
2901 assert(str1);
2902 str2 = str1;
2903 Py_INCREF(str2);
2904 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002905}
2906static PyObject*
2907argparsing(PyObject *o, PyObject *args)
2908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909 PyObject *res;
2910 str1 = str2 = NULL;
2911 if (!PyArg_ParseTuple(args, "O&O&",
2912 PyUnicode_FSConverter, &str1,
2913 failing_converter, &str2)) {
2914 if (!str2)
2915 /* argument converter not called? */
2916 return NULL;
2917 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00002918 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 Py_DECREF(str2);
2920 PyErr_Clear();
2921 return res;
2922 }
2923 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00002924}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00002925
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002926/* To test that the result of PyCode_NewEmpty has the right members. */
2927static PyObject *
2928code_newempty(PyObject *self, PyObject *args)
2929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930 const char *filename;
2931 const char *funcname;
2932 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
2935 &filename, &funcname, &firstlineno))
2936 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002938 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00002939}
2940
Georg Brandl1e28a272009-12-28 08:41:01 +00002941/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
2942 Run via Lib/test/test_exceptions.py */
2943static PyObject *
2944make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
2945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 const char *name;
2947 const char *doc = NULL;
2948 PyObject *base = NULL;
2949 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00002952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
2954 "s|sOO:make_exception_with_doc", kwlist,
2955 &name, &doc, &base, &dict))
2956 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00002957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00002959}
2960
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002961static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302962make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00002963{
2964 Py_buffer info;
2965 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
2966 return NULL;
2967 return PyMemoryView_FromBuffer(&info);
2968}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02002969
Stefan Krah7213fcc2015-02-01 16:19:23 +01002970static PyObject *
2971test_from_contiguous(PyObject* self, PyObject *noargs)
2972{
2973 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
2974 int init[5] = {0, 1, 2, 3, 4};
2975 Py_ssize_t itemsize = sizeof(int);
2976 Py_ssize_t shape = 5;
2977 Py_ssize_t strides = 2 * itemsize;
2978 Py_buffer view = {
2979 data,
2980 NULL,
2981 5 * itemsize,
2982 itemsize,
2983 1,
2984 1,
2985 NULL,
2986 &shape,
2987 &strides,
2988 NULL,
2989 NULL
2990 };
2991 int *ptr;
2992 int i;
2993
2994 PyBuffer_FromContiguous(&view, init, view.len, 'C');
2995 ptr = view.buf;
2996 for (i = 0; i < 5; i++) {
2997 if (ptr[2*i] != i) {
2998 PyErr_SetString(TestError,
2999 "test_from_contiguous: incorrect result");
3000 return NULL;
3001 }
3002 }
3003
3004 view.buf = &data[8];
3005 view.strides[0] = -2 * itemsize;
3006
3007 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3008 ptr = view.buf;
3009 for (i = 0; i < 5; i++) {
3010 if (*(ptr-2*i) != i) {
3011 PyErr_SetString(TestError,
3012 "test_from_contiguous: incorrect result");
3013 return NULL;
3014 }
3015 }
3016
3017 Py_RETURN_NONE;
3018}
Stefan Krah650c1e82015-02-03 21:43:23 +01003019
Stefan Kraha7559c02015-02-03 22:27:21 +01003020#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003021extern PyTypeObject _PyBytesIOBuffer_Type;
3022
Stefan Krah5178d912015-02-03 16:57:21 +01003023static PyObject *
3024test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs)
3025{
Stefan Krah650c1e82015-02-03 21:43:23 +01003026 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003027 PyObject *b;
3028 char *dummy[1];
3029 int ret, match;
3030
Stefan Krah650c1e82015-02-03 21:43:23 +01003031 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003032 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3033 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3034 PyErr_Clear();
3035 if (ret != -1 || match == 0)
3036 goto error;
3037
Stefan Krah650c1e82015-02-03 21:43:23 +01003038 /* bytesiobuf_getbuffer() */
3039 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003040 if (b == NULL) {
3041 return NULL;
3042 }
3043
3044 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3045 Py_DECREF(b);
3046 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3047 PyErr_Clear();
3048 if (ret != -1 || match == 0)
3049 goto error;
3050
3051 Py_RETURN_NONE;
3052
3053error:
3054 PyErr_SetString(TestError,
3055 "test_pep3118_obsolete_write_locks: failure");
3056 return NULL;
3057}
Stefan Kraha7559c02015-02-03 22:27:21 +01003058#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003059
Stefan Krah650c1e82015-02-03 21:43:23 +01003060/* This tests functions that historically supported write locks. It is
3061 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3062 is entitled to segfault in that case. */
3063static PyObject *
3064getbuffer_with_null_view(PyObject* self, PyObject *obj)
3065{
3066 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3067 return NULL;
3068
3069 Py_RETURN_NONE;
3070}
3071
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003072/* Test that the fatal error from not having a current thread doesn't
3073 cause an infinite loop. Run via Lib/test/test_capi.py */
3074static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303075crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003076{
3077 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003078 /* Using PyThreadState_Get() directly allows the test to pass in
3079 !pydebug mode. However, the test only actually tests anything
3080 in pydebug mode, since that's where the infinite loop was in
3081 the first place. */
3082 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003083 Py_END_ALLOW_THREADS
3084 return NULL;
3085}
3086
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003087/* To run some code in a sub-interpreter. */
3088static PyObject *
3089run_in_subinterp(PyObject *self, PyObject *args)
3090{
3091 const char *code;
3092 int r;
3093 PyThreadState *substate, *mainstate;
3094
3095 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3096 &code))
3097 return NULL;
3098
3099 mainstate = PyThreadState_Get();
3100
3101 PyThreadState_Swap(NULL);
3102
3103 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003104 if (substate == NULL) {
3105 /* Since no new thread state was created, there is no exception to
3106 propagate; raise a fresh one after swapping in the old thread
3107 state. */
3108 PyThreadState_Swap(mainstate);
3109 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3110 return NULL;
3111 }
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003112 r = PyRun_SimpleString(code);
3113 Py_EndInterpreter(substate);
3114
3115 PyThreadState_Swap(mainstate);
3116
3117 return PyLong_FromLong(r);
3118}
3119
Victor Stinner3c1b3792014-02-17 00:02:43 +01003120static int
3121check_time_rounding(int round)
3122{
Victor Stinner74474232015-09-02 01:43:56 +02003123 if (round != _PyTime_ROUND_FLOOR
3124 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003125 && round != _PyTime_ROUND_HALF_EVEN
3126 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003127 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3128 return -1;
3129 }
3130 return 0;
3131}
3132
Victor Stinner5d272cc2012-03-13 13:35:55 +01003133static PyObject *
3134test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3135{
3136 PyObject *obj;
3137 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003138 int round;
3139 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003140 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003141 if (check_time_rounding(round) < 0)
3142 return NULL;
3143 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003144 return NULL;
3145 return _PyLong_FromTime_t(sec);
3146}
3147
3148static PyObject *
3149test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3150{
3151 PyObject *obj;
3152 time_t sec;
3153 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003154 int round;
3155 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003156 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003157 if (check_time_rounding(round) < 0)
3158 return NULL;
3159 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003160 return NULL;
3161 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3162}
3163
Victor Stinner643cd682012-03-02 22:54:03 +01003164static PyObject *
3165test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3166{
3167 PyObject *obj;
3168 time_t sec;
3169 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003170 int round;
3171 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003172 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003173 if (check_time_rounding(round) < 0)
3174 return NULL;
3175 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003176 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003177 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003178}
3179
Antoine Pitrou796564c2013-07-30 19:59:21 +02003180static void
3181slot_tp_del(PyObject *self)
3182{
3183 _Py_IDENTIFIER(__tp_del__);
3184 PyObject *del, *res;
3185 PyObject *error_type, *error_value, *error_traceback;
3186
3187 /* Temporarily resurrect the object. */
3188 assert(self->ob_refcnt == 0);
3189 self->ob_refcnt = 1;
3190
3191 /* Save the current exception, if any. */
3192 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3193
3194 /* Execute __del__ method, if any. */
3195 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3196 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003197 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003198 if (res == NULL)
3199 PyErr_WriteUnraisable(del);
3200 else
3201 Py_DECREF(res);
3202 Py_DECREF(del);
3203 }
3204
3205 /* Restore the saved exception. */
3206 PyErr_Restore(error_type, error_value, error_traceback);
3207
3208 /* Undo the temporary resurrection; can't use DECREF here, it would
3209 * cause a recursive call.
3210 */
3211 assert(self->ob_refcnt > 0);
3212 if (--self->ob_refcnt == 0)
3213 return; /* this is the normal path out */
3214
3215 /* __del__ resurrected it! Make it look like the original Py_DECREF
3216 * never happened.
3217 */
3218 {
3219 Py_ssize_t refcnt = self->ob_refcnt;
3220 _Py_NewReference(self);
3221 self->ob_refcnt = refcnt;
3222 }
INADA Naokid8521422018-05-17 11:07:21 +09003223 assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self));
Antoine Pitrou796564c2013-07-30 19:59:21 +02003224 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
3225 * we need to undo that. */
3226 _Py_DEC_REFTOTAL;
3227 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
3228 * chain, so no more to do there.
3229 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
3230 * _Py_NewReference bumped tp_allocs: both of those need to be
3231 * undone.
3232 */
3233#ifdef COUNT_ALLOCS
3234 --Py_TYPE(self)->tp_frees;
3235 --Py_TYPE(self)->tp_allocs;
3236#endif
3237}
3238
3239static PyObject *
3240with_tp_del(PyObject *self, PyObject *args)
3241{
3242 PyObject *obj;
3243 PyTypeObject *tp;
3244
3245 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3246 return NULL;
3247 tp = (PyTypeObject *) obj;
3248 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3249 PyErr_Format(PyExc_TypeError,
3250 "heap type expected, got %R", obj);
3251 return NULL;
3252 }
3253 tp->tp_del = slot_tp_del;
3254 Py_INCREF(obj);
3255 return obj;
3256}
3257
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003258static PyMethodDef ml;
3259
3260static PyObject *
3261create_cfunction(PyObject *self, PyObject *args)
3262{
3263 return PyCFunction_NewEx(&ml, self, NULL);
3264}
3265
3266static PyMethodDef ml = {
3267 "create_cfunction",
3268 create_cfunction,
3269 METH_NOARGS,
3270 NULL
3271};
3272
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003273static PyObject *
3274_test_incref(PyObject *ob)
3275{
3276 Py_INCREF(ob);
3277 return ob;
3278}
3279
3280static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303281test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003282{
3283 PyObject *obj = PyLong_FromLong(0);
3284 Py_XINCREF(_test_incref(obj));
3285 Py_DECREF(obj);
3286 Py_DECREF(obj);
3287 Py_DECREF(obj);
3288 Py_RETURN_NONE;
3289}
3290
3291static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303292test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003293{
3294 PyObject *obj = PyLong_FromLong(0);
3295 Py_INCREF(_test_incref(obj));
3296 Py_DECREF(obj);
3297 Py_DECREF(obj);
3298 Py_DECREF(obj);
3299 Py_RETURN_NONE;
3300}
3301
3302static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303303test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003304{
3305 Py_XDECREF(PyLong_FromLong(0));
3306 Py_RETURN_NONE;
3307}
3308
3309static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303310test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003311{
3312 Py_DECREF(PyLong_FromLong(0));
3313 Py_RETURN_NONE;
3314}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003315
Victor Stinner0507bf52013-07-07 02:05:46 +02003316static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303317test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003318{
3319 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003320 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003321 Py_DecRef(obj);
3322 Py_DecRef(obj);
3323 Py_RETURN_NONE;
3324}
3325
3326static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303327test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003328{
3329 void *ptr;
3330
Victor Stinnerdb067af2014-05-02 22:31:14 +02003331 ptr = PyMem_RawMalloc(0);
3332 if (ptr == NULL) {
3333 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3334 return NULL;
3335 }
3336 PyMem_RawFree(ptr);
3337
3338 ptr = PyMem_RawCalloc(0, 0);
3339 if (ptr == NULL) {
3340 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3341 return NULL;
3342 }
3343 PyMem_RawFree(ptr);
3344
Victor Stinner0507bf52013-07-07 02:05:46 +02003345 ptr = PyMem_Malloc(0);
3346 if (ptr == NULL) {
3347 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3348 return NULL;
3349 }
3350 PyMem_Free(ptr);
3351
Victor Stinnerdb067af2014-05-02 22:31:14 +02003352 ptr = PyMem_Calloc(0, 0);
3353 if (ptr == NULL) {
3354 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3355 return NULL;
3356 }
3357 PyMem_Free(ptr);
3358
Victor Stinner0507bf52013-07-07 02:05:46 +02003359 ptr = PyObject_Malloc(0);
3360 if (ptr == NULL) {
3361 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3362 return NULL;
3363 }
3364 PyObject_Free(ptr);
3365
Victor Stinnerdb067af2014-05-02 22:31:14 +02003366 ptr = PyObject_Calloc(0, 0);
3367 if (ptr == NULL) {
3368 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3369 return NULL;
3370 }
3371 PyObject_Free(ptr);
3372
Victor Stinner0507bf52013-07-07 02:05:46 +02003373 Py_RETURN_NONE;
3374}
3375
3376typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003377 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003378
3379 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003380 size_t calloc_nelem;
3381 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003382 void *realloc_ptr;
3383 size_t realloc_new_size;
3384 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003385 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003386} alloc_hook_t;
3387
Victor Stinner9ed83c42017-10-31 12:18:10 -07003388static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003389{
3390 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003391 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003392 hook->malloc_size = size;
3393 return hook->alloc.malloc(hook->alloc.ctx, size);
3394}
3395
Victor Stinner9ed83c42017-10-31 12:18:10 -07003396static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003397{
3398 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003399 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003400 hook->calloc_nelem = nelem;
3401 hook->calloc_elsize = elsize;
3402 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3403}
3404
Victor Stinner9ed83c42017-10-31 12:18:10 -07003405static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003406{
3407 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003408 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003409 hook->realloc_ptr = ptr;
3410 hook->realloc_new_size = new_size;
3411 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3412}
3413
Victor Stinner9ed83c42017-10-31 12:18:10 -07003414static void hook_free(void *ctx, void *ptr)
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->free_ptr = ptr;
3419 hook->alloc.free(hook->alloc.ctx, ptr);
3420}
3421
3422static PyObject *
3423test_setallocators(PyMemAllocatorDomain domain)
3424{
3425 PyObject *res = NULL;
3426 const char *error_msg;
3427 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003428 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003429 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003430 void *ptr, *ptr2;
3431
Victor Stinnerdb067af2014-05-02 22:31:14 +02003432 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003433
3434 alloc.ctx = &hook;
3435 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003436 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003437 alloc.realloc = &hook_realloc;
3438 alloc.free = &hook_free;
3439 PyMem_GetAllocator(domain, &hook.alloc);
3440 PyMem_SetAllocator(domain, &alloc);
3441
Victor Stinner9ed83c42017-10-31 12:18:10 -07003442 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02003443 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003444 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02003445 switch(domain)
3446 {
3447 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3448 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3449 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3450 default: ptr = NULL; break;
3451 }
3452
Victor Stinner9ed83c42017-10-31 12:18:10 -07003453#define CHECK_CTX(FUNC) \
3454 if (hook.ctx != &hook) { \
3455 error_msg = FUNC " wrong context"; \
3456 goto fail; \
3457 } \
3458 hook.ctx = NULL; /* reset for next check */
3459
Victor Stinner0507bf52013-07-07 02:05:46 +02003460 if (ptr == NULL) {
3461 error_msg = "malloc failed";
3462 goto fail;
3463 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003464 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003465 if (hook.malloc_size != size) {
3466 error_msg = "malloc invalid size";
3467 goto fail;
3468 }
3469
3470 size2 = 200;
3471 switch(domain)
3472 {
3473 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3474 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3475 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003476 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003477 }
3478
3479 if (ptr2 == NULL) {
3480 error_msg = "realloc failed";
3481 goto fail;
3482 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003483 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003484 if (hook.realloc_ptr != ptr
3485 || hook.realloc_new_size != size2) {
3486 error_msg = "realloc invalid parameters";
3487 goto fail;
3488 }
3489
3490 switch(domain)
3491 {
3492 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3493 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3494 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3495 }
3496
Victor Stinner9ed83c42017-10-31 12:18:10 -07003497 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02003498 if (hook.free_ptr != ptr2) {
3499 error_msg = "free invalid pointer";
3500 goto fail;
3501 }
3502
Victor Stinner9ed83c42017-10-31 12:18:10 -07003503 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02003504 nelem = 2;
3505 elsize = 5;
3506 switch(domain)
3507 {
3508 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3509 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3510 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3511 default: ptr = NULL; break;
3512 }
3513
3514 if (ptr == NULL) {
3515 error_msg = "calloc failed";
3516 goto fail;
3517 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003518 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02003519 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3520 error_msg = "calloc invalid nelem or elsize";
3521 goto fail;
3522 }
3523
Victor Stinner9ed83c42017-10-31 12:18:10 -07003524 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003525 switch(domain)
3526 {
3527 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3528 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3529 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3530 }
3531
Victor Stinner9ed83c42017-10-31 12:18:10 -07003532 CHECK_CTX("calloc free");
3533 if (hook.free_ptr != ptr) {
3534 error_msg = "calloc free invalid pointer";
3535 goto fail;
3536 }
3537
Victor Stinner0507bf52013-07-07 02:05:46 +02003538 Py_INCREF(Py_None);
3539 res = Py_None;
3540 goto finally;
3541
3542fail:
3543 PyErr_SetString(PyExc_RuntimeError, error_msg);
3544
3545finally:
3546 PyMem_SetAllocator(domain, &hook.alloc);
3547 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003548
3549#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02003550}
3551
3552static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303553test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003554{
3555 return test_setallocators(PYMEM_DOMAIN_RAW);
3556}
3557
3558static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303559test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003560{
3561 return test_setallocators(PYMEM_DOMAIN_MEM);
3562}
3563
3564static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303565test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003566{
3567 return test_setallocators(PYMEM_DOMAIN_OBJ);
3568}
3569
xdegaye85f64302017-07-01 14:14:45 +02003570/* Most part of the following code is inherited from the pyfailmalloc project
3571 * written by Victor Stinner. */
3572static struct {
3573 int installed;
3574 PyMemAllocatorEx raw;
3575 PyMemAllocatorEx mem;
3576 PyMemAllocatorEx obj;
3577} FmHook;
3578
3579static struct {
3580 int start;
3581 int stop;
3582 Py_ssize_t count;
3583} FmData;
3584
3585static int
3586fm_nomemory(void)
3587{
3588 FmData.count++;
3589 if (FmData.count > FmData.start &&
3590 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
3591 return 1;
3592 }
3593 return 0;
3594}
3595
3596static void *
3597hook_fmalloc(void *ctx, size_t size)
3598{
3599 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3600 if (fm_nomemory()) {
3601 return NULL;
3602 }
3603 return alloc->malloc(alloc->ctx, size);
3604}
3605
3606static void *
3607hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
3608{
3609 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3610 if (fm_nomemory()) {
3611 return NULL;
3612 }
3613 return alloc->calloc(alloc->ctx, nelem, elsize);
3614}
3615
3616static void *
3617hook_frealloc(void *ctx, void *ptr, size_t new_size)
3618{
3619 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3620 if (fm_nomemory()) {
3621 return NULL;
3622 }
3623 return alloc->realloc(alloc->ctx, ptr, new_size);
3624}
3625
3626static void
3627hook_ffree(void *ctx, void *ptr)
3628{
3629 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
3630 alloc->free(alloc->ctx, ptr);
3631}
3632
3633static void
3634fm_setup_hooks(void)
3635{
3636 PyMemAllocatorEx alloc;
3637
3638 if (FmHook.installed) {
3639 return;
3640 }
3641 FmHook.installed = 1;
3642
3643 alloc.malloc = hook_fmalloc;
3644 alloc.calloc = hook_fcalloc;
3645 alloc.realloc = hook_frealloc;
3646 alloc.free = hook_ffree;
3647 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3648 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3649 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3650
3651 alloc.ctx = &FmHook.raw;
3652 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
3653
3654 alloc.ctx = &FmHook.mem;
3655 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
3656
3657 alloc.ctx = &FmHook.obj;
3658 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
3659}
3660
3661static void
3662fm_remove_hooks(void)
3663{
3664 if (FmHook.installed) {
3665 FmHook.installed = 0;
3666 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
3667 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
3668 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
3669 }
3670}
3671
3672static PyObject*
3673set_nomemory(PyObject *self, PyObject *args)
3674{
3675 /* Memory allocation fails after 'start' allocation requests, and until
3676 * 'stop' allocation requests except when 'stop' is negative or equal
3677 * to 0 (default) in which case allocation failures never stop. */
3678 FmData.count = 0;
3679 FmData.stop = 0;
3680 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
3681 return NULL;
3682 }
3683 fm_setup_hooks();
3684 Py_RETURN_NONE;
3685}
3686
3687static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303688remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02003689{
3690 fm_remove_hooks();
3691 Py_RETURN_NONE;
3692}
3693
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003694PyDoc_STRVAR(docstring_empty,
3695""
3696);
3697
3698PyDoc_STRVAR(docstring_no_signature,
3699"This docstring has no signature."
3700);
3701
3702PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003703"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003704"\n"
3705"This docstring has an invalid signature."
3706);
3707
Larry Hastings2623c8c2014-02-08 22:15:29 -08003708PyDoc_STRVAR(docstring_with_invalid_signature2,
3709"docstring_with_invalid_signature2($module, /, boo)\n"
3710"\n"
3711"--\n"
3712"\n"
3713"This docstring also has an invalid signature."
3714);
3715
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003716PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003717"docstring_with_signature($module, /, sig)\n"
3718"--\n"
3719"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003720"This docstring has a valid signature."
3721);
3722
Zachary Ware8ef887c2015-04-13 18:22:35 -05003723PyDoc_STRVAR(docstring_with_signature_but_no_doc,
3724"docstring_with_signature_but_no_doc($module, /, sig)\n"
3725"--\n"
3726"\n"
3727);
3728
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003729PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003730"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
3731"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08003732"\n"
3733"\n"
3734"This docstring has a valid signature and some extra newlines."
3735);
3736
Larry Hastings16c51912014-01-07 11:53:01 -08003737PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08003738"docstring_with_signature_with_defaults(module, s='avocado',\n"
3739" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
3740" local=the_number_three, sys=sys.maxsize,\n"
3741" exp=sys.maxsize - 1)\n"
3742"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08003743"\n"
3744"\n"
3745"\n"
3746"This docstring has a valid signature with parameters,\n"
3747"and the parameters take defaults of varying types."
3748);
3749
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003750typedef struct {
3751 PyThread_type_lock start_event;
3752 PyThread_type_lock exit_event;
3753 PyObject *callback;
3754} test_c_thread_t;
3755
3756static void
3757temporary_c_thread(void *data)
3758{
3759 test_c_thread_t *test_c_thread = data;
3760 PyGILState_STATE state;
3761 PyObject *res;
3762
3763 PyThread_release_lock(test_c_thread->start_event);
3764
3765 /* Allocate a Python thread state for this thread */
3766 state = PyGILState_Ensure();
3767
Victor Stinner3466bde2016-09-05 18:16:01 -07003768 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01003769 Py_CLEAR(test_c_thread->callback);
3770
3771 if (res == NULL) {
3772 PyErr_Print();
3773 }
3774 else {
3775 Py_DECREF(res);
3776 }
3777
3778 /* Destroy the Python thread state for this thread */
3779 PyGILState_Release(state);
3780
3781 PyThread_release_lock(test_c_thread->exit_event);
3782
3783 PyThread_exit_thread();
3784}
3785
3786static PyObject *
3787call_in_temporary_c_thread(PyObject *self, PyObject *callback)
3788{
3789 PyObject *res = NULL;
3790 test_c_thread_t test_c_thread;
3791 long thread;
3792
3793 PyEval_InitThreads();
3794
3795 test_c_thread.start_event = PyThread_allocate_lock();
3796 test_c_thread.exit_event = PyThread_allocate_lock();
3797 test_c_thread.callback = NULL;
3798 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
3799 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
3800 goto exit;
3801 }
3802
3803 Py_INCREF(callback);
3804 test_c_thread.callback = callback;
3805
3806 PyThread_acquire_lock(test_c_thread.start_event, 1);
3807 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3808
3809 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
3810 if (thread == -1) {
3811 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
3812 PyThread_release_lock(test_c_thread.start_event);
3813 PyThread_release_lock(test_c_thread.exit_event);
3814 goto exit;
3815 }
3816
3817 PyThread_acquire_lock(test_c_thread.start_event, 1);
3818 PyThread_release_lock(test_c_thread.start_event);
3819
3820 Py_BEGIN_ALLOW_THREADS
3821 PyThread_acquire_lock(test_c_thread.exit_event, 1);
3822 PyThread_release_lock(test_c_thread.exit_event);
3823 Py_END_ALLOW_THREADS
3824
3825 Py_INCREF(Py_None);
3826 res = Py_None;
3827
3828exit:
3829 Py_CLEAR(test_c_thread.callback);
3830 if (test_c_thread.start_event)
3831 PyThread_free_lock(test_c_thread.start_event);
3832 if (test_c_thread.exit_event)
3833 PyThread_free_lock(test_c_thread.exit_event);
3834 return res;
3835}
Victor Stinner13105102013-12-13 02:17:29 +01003836
Victor Stinner56e8c292014-07-21 12:30:22 +02003837static PyObject*
3838test_raise_signal(PyObject* self, PyObject *args)
3839{
3840 int signum, err;
3841
Oren Milmanba7d7362017-08-29 11:58:27 +03003842 if (!PyArg_ParseTuple(args, "i:raise_signal", &signum)) {
Victor Stinner56e8c292014-07-21 12:30:22 +02003843 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03003844 }
Victor Stinner56e8c292014-07-21 12:30:22 +02003845
3846 err = raise(signum);
3847 if (err)
3848 return PyErr_SetFromErrno(PyExc_OSError);
3849
3850 if (PyErr_CheckSignals() < 0)
3851 return NULL;
3852
3853 Py_RETURN_NONE;
3854}
3855
Serhiy Storchakab5181342015-02-06 08:58:56 +02003856/* marshal */
3857
3858static PyObject*
3859pymarshal_write_long_to_file(PyObject* self, PyObject *args)
3860{
3861 long value;
3862 char *filename;
3863 int version;
3864 FILE *fp;
3865
3866 if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file",
3867 &value, &filename, &version))
3868 return NULL;
3869
3870 fp = fopen(filename, "wb");
3871 if (fp == NULL) {
3872 PyErr_SetFromErrno(PyExc_OSError);
3873 return NULL;
3874 }
3875
3876 PyMarshal_WriteLongToFile(value, fp, version);
3877
3878 fclose(fp);
3879 if (PyErr_Occurred())
3880 return NULL;
3881 Py_RETURN_NONE;
3882}
3883
3884static PyObject*
3885pymarshal_write_object_to_file(PyObject* self, PyObject *args)
3886{
3887 PyObject *obj;
3888 char *filename;
3889 int version;
3890 FILE *fp;
3891
3892 if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file",
3893 &obj, &filename, &version))
3894 return NULL;
3895
3896 fp = fopen(filename, "wb");
3897 if (fp == NULL) {
3898 PyErr_SetFromErrno(PyExc_OSError);
3899 return NULL;
3900 }
3901
3902 PyMarshal_WriteObjectToFile(obj, fp, version);
3903
3904 fclose(fp);
3905 if (PyErr_Occurred())
3906 return NULL;
3907 Py_RETURN_NONE;
3908}
3909
3910static PyObject*
3911pymarshal_read_short_from_file(PyObject* self, PyObject *args)
3912{
3913 int value;
3914 long pos;
3915 char *filename;
3916 FILE *fp;
3917
3918 if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename))
3919 return NULL;
3920
3921 fp = fopen(filename, "rb");
3922 if (fp == NULL) {
3923 PyErr_SetFromErrno(PyExc_OSError);
3924 return NULL;
3925 }
3926
3927 value = PyMarshal_ReadShortFromFile(fp);
3928 pos = ftell(fp);
3929
3930 fclose(fp);
3931 if (PyErr_Occurred())
3932 return NULL;
3933 return Py_BuildValue("il", value, pos);
3934}
3935
3936static PyObject*
3937pymarshal_read_long_from_file(PyObject* self, PyObject *args)
3938{
3939 long value, pos;
3940 char *filename;
3941 FILE *fp;
3942
3943 if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename))
3944 return NULL;
3945
3946 fp = fopen(filename, "rb");
3947 if (fp == NULL) {
3948 PyErr_SetFromErrno(PyExc_OSError);
3949 return NULL;
3950 }
3951
3952 value = PyMarshal_ReadLongFromFile(fp);
3953 pos = ftell(fp);
3954
3955 fclose(fp);
3956 if (PyErr_Occurred())
3957 return NULL;
3958 return Py_BuildValue("ll", value, pos);
3959}
3960
3961static PyObject*
3962pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
3963{
3964 PyObject *obj;
3965 long pos;
3966 char *filename;
3967 FILE *fp;
3968
3969 if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename))
3970 return NULL;
3971
3972 fp = fopen(filename, "rb");
3973 if (fp == NULL) {
3974 PyErr_SetFromErrno(PyExc_OSError);
3975 return NULL;
3976 }
3977
3978 obj = PyMarshal_ReadLastObjectFromFile(fp);
3979 pos = ftell(fp);
3980
3981 fclose(fp);
3982 return Py_BuildValue("Nl", obj, pos);
3983}
3984
3985static PyObject*
3986pymarshal_read_object_from_file(PyObject* self, PyObject *args)
3987{
3988 PyObject *obj;
3989 long pos;
3990 char *filename;
3991 FILE *fp;
3992
3993 if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename))
3994 return NULL;
3995
3996 fp = fopen(filename, "rb");
3997 if (fp == NULL) {
3998 PyErr_SetFromErrno(PyExc_OSError);
3999 return NULL;
4000 }
4001
4002 obj = PyMarshal_ReadObjectFromFile(fp);
4003 pos = ftell(fp);
4004
4005 fclose(fp);
4006 return Py_BuildValue("Nl", obj, pos);
4007}
4008
Victor Stinnerefde1462015-03-21 15:04:43 +01004009static PyObject*
4010return_null_without_error(PyObject *self, PyObject *args)
4011{
4012 /* invalid call: return NULL without setting an error,
4013 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4014 PyErr_Clear();
4015 return NULL;
4016}
4017
4018static PyObject*
4019return_result_with_error(PyObject *self, PyObject *args)
4020{
4021 /* invalid call: return a result with an error set,
4022 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4023 PyErr_SetNone(PyExc_ValueError);
4024 Py_RETURN_NONE;
4025}
4026
Victor Stinner992c43f2015-03-27 17:12:45 +01004027static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004028test_pytime_fromseconds(PyObject *self, PyObject *args)
4029{
4030 int seconds;
4031 _PyTime_t ts;
4032
4033 if (!PyArg_ParseTuple(args, "i", &seconds))
4034 return NULL;
4035 ts = _PyTime_FromSeconds(seconds);
4036 return _PyTime_AsNanosecondsObject(ts);
4037}
4038
4039static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004040test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4041{
4042 PyObject *obj;
4043 int round;
4044 _PyTime_t ts;
4045
4046 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4047 return NULL;
4048 if (check_time_rounding(round) < 0)
4049 return NULL;
4050 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4051 return NULL;
4052 return _PyTime_AsNanosecondsObject(ts);
4053}
4054
Victor Stinner4bfb4602015-03-27 22:27:24 +01004055static PyObject *
4056test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4057{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004058 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004059 _PyTime_t ts;
4060 double d;
4061
Victor Stinnerc29b5852017-11-02 07:28:27 -07004062 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004063 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004064 }
4065 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4066 return NULL;
4067 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004068 d = _PyTime_AsSecondsDouble(ts);
4069 return PyFloat_FromDouble(d);
4070}
4071
Victor Stinner95e9cef2015-03-28 01:26:47 +01004072static PyObject *
4073test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4074{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004075 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004076 int round;
4077 _PyTime_t t;
4078 struct timeval tv;
4079 PyObject *seconds;
4080
Victor Stinnerc29b5852017-11-02 07:28:27 -07004081 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004082 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004083 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004084 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004085 }
4086 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004087 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004088 }
4089 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4090 return NULL;
4091 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004092
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004093 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004094 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004095 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004096 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004097 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4098}
4099
Victor Stinner34dc0f42015-03-27 18:19:03 +01004100#ifdef HAVE_CLOCK_GETTIME
4101static PyObject *
4102test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4103{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004104 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004105 _PyTime_t t;
4106 struct timespec ts;
4107
Victor Stinnerc29b5852017-11-02 07:28:27 -07004108 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004109 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004110 }
4111 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004112 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004113 }
4114 if (_PyTime_AsTimespec(t, &ts) == -1) {
4115 return NULL;
4116 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004117 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4118}
4119#endif
4120
Victor Stinner62d1c702015-04-01 17:47:07 +02004121static PyObject *
4122test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4123{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004124 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004125 int round;
4126 _PyTime_t t, ms;
4127
Victor Stinnerc29b5852017-11-02 07:28:27 -07004128 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004129 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004130 }
4131 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004132 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004133 }
4134 if (check_time_rounding(round) < 0) {
4135 return NULL;
4136 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004137 ms = _PyTime_AsMilliseconds(t, round);
4138 /* This conversion rely on the fact that _PyTime_t is a number of
4139 nanoseconds */
4140 return _PyTime_AsNanosecondsObject(ms);
4141}
4142
4143static PyObject *
4144test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4145{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004146 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004147 int round;
4148 _PyTime_t t, ms;
4149
Victor Stinnerc29b5852017-11-02 07:28:27 -07004150 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004151 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004152 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004153 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004154 }
4155 if (check_time_rounding(round) < 0) {
4156 return NULL;
4157 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004158 ms = _PyTime_AsMicroseconds(t, round);
4159 /* This conversion rely on the fact that _PyTime_t is a number of
4160 nanoseconds */
4161 return _PyTime_AsNanosecondsObject(ms);
4162}
4163
Victor Stinner50856d52015-10-13 00:11:21 +02004164static PyObject*
4165get_recursion_depth(PyObject *self, PyObject *args)
4166{
Victor Stinner50b48572018-11-01 01:51:40 +01004167 PyThreadState *tstate = PyThreadState_Get();
Victor Stinner50856d52015-10-13 00:11:21 +02004168
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07004169 /* subtract one to ignore the frame of the get_recursion_depth() call */
Victor Stinner50856d52015-10-13 00:11:21 +02004170 return PyLong_FromLong(tstate->recursion_depth - 1);
4171}
4172
Victor Stinner34be807c2016-03-14 12:04:26 +01004173static PyObject*
4174pymem_buffer_overflow(PyObject *self, PyObject *args)
4175{
4176 char *buffer;
4177
4178 /* Deliberate buffer overflow to check that PyMem_Free() detects
4179 the overflow when debug hooks are installed. */
4180 buffer = PyMem_Malloc(16);
4181 buffer[16] = 'x';
4182 PyMem_Free(buffer);
4183
4184 Py_RETURN_NONE;
4185}
4186
4187static PyObject*
4188pymem_api_misuse(PyObject *self, PyObject *args)
4189{
4190 char *buffer;
4191
4192 /* Deliberate misusage of Python allocators:
4193 allococate with PyMem but release with PyMem_Raw. */
4194 buffer = PyMem_Malloc(16);
4195 PyMem_RawFree(buffer);
4196
4197 Py_RETURN_NONE;
4198}
4199
Victor Stinnerc4aec362016-03-14 22:26:53 +01004200static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004201pymem_malloc_without_gil(PyObject *self, PyObject *args)
4202{
4203 char *buffer;
4204
4205 /* Deliberate bug to test debug hooks on Python memory allocators:
4206 call PyMem_Malloc() without holding the GIL */
4207 Py_BEGIN_ALLOW_THREADS
4208 buffer = PyMem_Malloc(10);
4209 Py_END_ALLOW_THREADS
4210
4211 PyMem_Free(buffer);
4212
4213 Py_RETURN_NONE;
4214}
4215
Victor Stinner5d39e042017-11-29 17:20:38 +01004216
4217static PyObject*
4218test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4219{
4220 const char *name = _PyMem_GetAllocatorsName();
4221 if (name == NULL) {
4222 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4223 return NULL;
4224 }
4225 return PyUnicode_FromString(name);
4226}
4227
4228
Victor Stinnerad524372016-03-16 12:12:53 +01004229static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004230pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4231{
4232 char *buffer;
4233
Victor Stinnerad524372016-03-16 12:12:53 +01004234 /* Deliberate bug to test debug hooks on Python memory allocators:
4235 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004236 Py_BEGIN_ALLOW_THREADS
4237 buffer = PyObject_Malloc(10);
4238 Py_END_ALLOW_THREADS
4239
4240 PyObject_Free(buffer);
4241
4242 Py_RETURN_NONE;
4243}
4244
Victor Stinner10b73e12016-03-22 13:39:05 +01004245static PyObject *
4246tracemalloc_track(PyObject *self, PyObject *args)
4247{
4248 unsigned int domain;
4249 PyObject *ptr_obj;
4250 void *ptr;
4251 Py_ssize_t size;
4252 int release_gil = 0;
4253 int res;
4254
4255 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4256 return NULL;
4257 ptr = PyLong_AsVoidPtr(ptr_obj);
4258 if (PyErr_Occurred())
4259 return NULL;
4260
4261 if (release_gil) {
4262 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004263 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004264 Py_END_ALLOW_THREADS
4265 }
4266 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004267 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004268 }
4269
4270 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004271 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004272 return NULL;
4273 }
4274
4275 Py_RETURN_NONE;
4276}
4277
4278static PyObject *
4279tracemalloc_untrack(PyObject *self, PyObject *args)
4280{
4281 unsigned int domain;
4282 PyObject *ptr_obj;
4283 void *ptr;
4284 int res;
4285
4286 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4287 return NULL;
4288 ptr = PyLong_AsVoidPtr(ptr_obj);
4289 if (PyErr_Occurred())
4290 return NULL;
4291
Victor Stinner5ea4c062017-06-20 17:46:36 +02004292 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004293 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004294 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004295 return NULL;
4296 }
4297
4298 Py_RETURN_NONE;
4299}
4300
4301static PyObject *
4302tracemalloc_get_traceback(PyObject *self, PyObject *args)
4303{
4304 unsigned int domain;
4305 PyObject *ptr_obj;
4306 void *ptr;
4307
4308 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4309 return NULL;
4310 ptr = PyLong_AsVoidPtr(ptr_obj);
4311 if (PyErr_Occurred())
4312 return NULL;
4313
Benjamin Petersonca470632016-09-06 13:47:26 -07004314 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004315}
4316
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004317static PyObject *
4318dict_get_version(PyObject *self, PyObject *args)
4319{
4320 PyDictObject *dict;
4321 uint64_t version;
4322
4323 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4324 return NULL;
4325
4326 version = dict->ma_version_tag;
4327
4328 Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version));
4329 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version);
4330}
4331
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004332
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004333static PyObject *
4334raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4335{
4336 PyGenObject *gen;
4337
4338 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4339 return NULL;
4340
4341 /* This is used in a test to check what happens if a signal arrives just
4342 as we're in the process of entering a yield from chain (see
4343 bpo-30039).
4344
4345 Needs to be done in C, because:
4346 - we don't have a Python wrapper for raise()
4347 - we need to make sure that the Python-level signal handler doesn't run
4348 *before* we enter the generator frame, which is impossible in Python
4349 because we check for signals before every bytecode operation.
4350 */
4351 raise(SIGINT);
4352 return _PyGen_Send(gen, Py_None);
4353}
4354
4355
Victor Stinner3b5cf852017-06-09 16:48:45 +02004356static int
4357fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4358{
4359 if (args == Py_None) {
4360 *stack = NULL;
4361 *nargs = 0;
4362 }
4363 else if (PyTuple_Check(args)) {
4364 *stack = &PyTuple_GET_ITEM(args, 0);
4365 *nargs = PyTuple_GET_SIZE(args);
4366 }
4367 else {
4368 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4369 return -1;
4370 }
4371 return 0;
4372}
4373
4374
4375static PyObject *
4376test_pyobject_fastcall(PyObject *self, PyObject *args)
4377{
4378 PyObject *func, *func_args;
4379 PyObject **stack;
4380 Py_ssize_t nargs;
4381
4382 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4383 return NULL;
4384 }
4385
4386 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4387 return NULL;
4388 }
4389 return _PyObject_FastCall(func, stack, nargs);
4390}
4391
4392
4393static PyObject *
4394test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4395{
4396 PyObject *func, *func_args, *kwargs;
4397 PyObject **stack;
4398 Py_ssize_t nargs;
4399
4400 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4401 return NULL;
4402 }
4403
4404 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4405 return NULL;
4406 }
4407
4408 if (kwargs == Py_None) {
4409 kwargs = NULL;
4410 }
4411 else if (!PyDict_Check(kwargs)) {
4412 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4413 return NULL;
4414 }
4415
4416 return _PyObject_FastCallDict(func, stack, nargs, kwargs);
4417}
4418
4419
4420static PyObject *
4421test_pyobject_fastcallkeywords(PyObject *self, PyObject *args)
4422{
4423 PyObject *func, *func_args, *kwnames = NULL;
4424 PyObject **stack;
4425 Py_ssize_t nargs, nkw;
4426
4427 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4428 return NULL;
4429 }
4430
4431 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4432 return NULL;
4433 }
4434
4435 if (kwnames == Py_None) {
4436 kwnames = NULL;
4437 }
4438 else if (PyTuple_Check(kwnames)) {
4439 nkw = PyTuple_GET_SIZE(kwnames);
4440 if (nargs < nkw) {
4441 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4442 return NULL;
4443 }
4444 nargs -= nkw;
4445 }
4446 else {
4447 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4448 return NULL;
4449 }
4450 return _PyObject_FastCallKeywords(func, stack, nargs, kwnames);
4451}
4452
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004453
Victor Stinner64fa4492017-07-10 14:37:49 +02004454static PyObject*
4455stack_pointer(PyObject *self, PyObject *args)
4456{
4457 int v = 5;
4458 return PyLong_FromVoidPtr(&v);
4459}
4460
Victor Stinner3b5cf852017-06-09 16:48:45 +02004461
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004462#ifdef W_STOPCODE
4463static PyObject*
4464py_w_stopcode(PyObject *self, PyObject *args)
4465{
4466 int sig, status;
4467 if (!PyArg_ParseTuple(args, "i", &sig)) {
4468 return NULL;
4469 }
4470 status = W_STOPCODE(sig);
4471 return PyLong_FromLong(status);
4472}
4473#endif
4474
4475
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004476static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03004477get_mapping_keys(PyObject* self, PyObject *obj)
4478{
4479 return PyMapping_Keys(obj);
4480}
4481
4482static PyObject *
4483get_mapping_values(PyObject* self, PyObject *obj)
4484{
4485 return PyMapping_Values(obj);
4486}
4487
4488static PyObject *
4489get_mapping_items(PyObject* self, PyObject *obj)
4490{
4491 return PyMapping_Items(obj);
4492}
4493
4494
4495static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004496test_pythread_tss_key_state(PyObject *self, PyObject *args)
4497{
4498 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
4499 if (PyThread_tss_is_created(&tss_key)) {
4500 return raiseTestError("test_pythread_tss_key_state",
4501 "TSS key not in an uninitialized state at "
4502 "creation time");
4503 }
4504 if (PyThread_tss_create(&tss_key) != 0) {
4505 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
4506 return NULL;
4507 }
4508 if (!PyThread_tss_is_created(&tss_key)) {
4509 return raiseTestError("test_pythread_tss_key_state",
4510 "PyThread_tss_create succeeded, "
4511 "but with TSS key in an uninitialized state");
4512 }
4513 if (PyThread_tss_create(&tss_key) != 0) {
4514 return raiseTestError("test_pythread_tss_key_state",
4515 "PyThread_tss_create unsuccessful with "
4516 "an already initialized key");
4517 }
4518#define CHECK_TSS_API(expr) \
4519 (void)(expr); \
4520 if (!PyThread_tss_is_created(&tss_key)) { \
4521 return raiseTestError("test_pythread_tss_key_state", \
4522 "TSS key initialization state was not " \
4523 "preserved after calling " #expr); }
4524 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
4525 CHECK_TSS_API(PyThread_tss_get(&tss_key));
4526#undef CHECK_TSS_API
4527 PyThread_tss_delete(&tss_key);
4528 if (PyThread_tss_is_created(&tss_key)) {
4529 return raiseTestError("test_pythread_tss_key_state",
4530 "PyThread_tss_delete called, but did not "
4531 "set the key state to uninitialized");
4532 }
4533
4534 Py_tss_t *ptr_key = PyThread_tss_alloc();
4535 if (ptr_key == NULL) {
4536 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
4537 return NULL;
4538 }
4539 if (PyThread_tss_is_created(ptr_key)) {
4540 return raiseTestError("test_pythread_tss_key_state",
4541 "TSS key not in an uninitialized state at "
4542 "allocation time");
4543 }
4544 PyThread_tss_free(ptr_key);
4545 ptr_key = NULL;
4546 Py_RETURN_NONE;
4547}
4548
4549
Yury Selivanovf23746a2018-01-22 19:11:18 -05004550static PyObject*
4551new_hamt(PyObject *self, PyObject *args)
4552{
4553 return _PyContext_NewHamtForTests();
4554}
4555
4556
jdemeyer5a306202018-10-19 23:50:06 +02004557/* def bad_get(self, obj, cls):
4558 cls()
4559 return repr(self)
4560*/
4561static PyObject*
4562bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4563{
4564 if (nargs != 3) {
4565 PyErr_SetString(PyExc_TypeError, "bad_get requires exactly 3 arguments");
4566 return NULL;
4567 }
4568
4569 PyObject *res = PyObject_CallObject(args[2], NULL);
4570 if (res == NULL) {
4571 return NULL;
4572 }
4573 Py_DECREF(res);
4574
4575 return PyObject_Repr(args[0]);
4576}
4577
4578
Victor Stinner3d4226a2018-08-29 22:21:32 +02004579static PyObject *
4580encode_locale_ex(PyObject *self, PyObject *args)
4581{
4582 PyObject *unicode;
4583 int current_locale = 0;
4584 wchar_t *wstr;
4585 PyObject *res = NULL;
4586 const char *errors = NULL;
4587
4588 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
4589 return NULL;
4590 }
4591 wstr = PyUnicode_AsWideCharString(unicode, NULL);
4592 if (wstr == NULL) {
4593 return NULL;
4594 }
4595 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
4596
4597 char *str = NULL;
4598 size_t error_pos;
4599 const char *reason = NULL;
4600 int ret = _Py_EncodeLocaleEx(wstr,
4601 &str, &error_pos, &reason,
4602 current_locale, error_handler);
4603 PyMem_Free(wstr);
4604
4605 switch(ret) {
4606 case 0:
4607 res = PyBytes_FromString(str);
4608 PyMem_RawFree(str);
4609 break;
4610 case -1:
4611 PyErr_NoMemory();
4612 break;
4613 case -2:
4614 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
4615 error_pos, reason);
4616 break;
4617 case -3:
4618 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
4619 break;
4620 default:
4621 PyErr_SetString(PyExc_ValueError, "unknow error code");
4622 break;
4623 }
4624 return res;
4625}
4626
4627
4628static PyObject *
4629decode_locale_ex(PyObject *self, PyObject *args)
4630{
4631 char *str;
4632 int current_locale = 0;
4633 PyObject *res = NULL;
4634 const char *errors = NULL;
4635
4636 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
4637 return NULL;
4638 }
4639 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
4640
4641 wchar_t *wstr = NULL;
4642 size_t wlen = 0;
4643 const char *reason = NULL;
4644 int ret = _Py_DecodeLocaleEx(str,
4645 &wstr, &wlen, &reason,
4646 current_locale, error_handler);
4647
4648 switch(ret) {
4649 case 0:
4650 res = PyUnicode_FromWideChar(wstr, wlen);
4651 PyMem_RawFree(wstr);
4652 break;
4653 case -1:
4654 PyErr_NoMemory();
4655 break;
4656 case -2:
4657 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
4658 wlen, reason);
4659 break;
4660 case -3:
4661 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
4662 break;
4663 default:
4664 PyErr_SetString(PyExc_ValueError, "unknow error code");
4665 break;
4666 }
4667 return res;
4668}
4669
4670
Victor Stinner2094c2b2018-09-03 17:06:39 +02004671static PyObject *
4672get_coreconfig(PyObject *self, PyObject *Py_UNUSED(args))
4673{
4674 PyInterpreterState *interp = _PyInterpreterState_Get();
4675 const _PyCoreConfig *config = &interp->core_config;
Victor Stinner5ed69952018-11-06 15:59:52 +01004676 return _PyCoreConfig_AsDict(config);
Victor Stinner2094c2b2018-09-03 17:06:39 +02004677}
4678
4679
Victor Stinner18618e652018-10-25 17:28:11 +02004680#ifdef Py_REF_DEBUG
4681static PyObject *
4682negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
4683{
4684 PyObject *obj = PyUnicode_FromString("negative_refcount");
4685 if (obj == NULL) {
4686 return NULL;
4687 }
4688 assert(Py_REFCNT(obj) == 1);
4689
4690 Py_REFCNT(obj) = 0;
4691 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
4692 Py_DECREF(obj);
4693
4694 Py_RETURN_NONE;
4695}
4696#endif
4697
4698
Tim Peters9ea17ac2001-02-02 05:57:15 +00004699static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004700 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304701 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02004702 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304703 {"test_config", test_config, METH_NOARGS},
4704 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05004706 {"datetime_check_date", datetime_check_date, METH_VARARGS},
4707 {"datetime_check_time", datetime_check_time, METH_VARARGS},
4708 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
4709 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
4710 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
4711 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05004712 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05004713 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304714 {"test_list_api", test_list_api, METH_NOARGS},
4715 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02004716 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01004717 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304718 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
4719 {"test_long_api", test_long_api, METH_NOARGS},
4720 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
4721 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
4722 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
4723 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
4724 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
4725 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
4726 {"test_long_as_double", test_long_as_double, METH_NOARGS},
4727 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
4728 {"test_long_numbits", test_long_numbits, METH_NOARGS},
4729 {"test_k_code", test_k_code, METH_NOARGS},
4730 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07004731 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304732 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004733 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304734 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004735 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304736 {"test_string_to_double", test_string_to_double, METH_NOARGS},
4737 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
4738 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004739 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01004740 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004741#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01004742 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01004743#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01004744 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03004745 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03004746 {"get_args", get_args, METH_VARARGS},
4747 {"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004748 {"getargs_tuple", getargs_tuple, METH_VARARGS},
4749 {"getargs_keywords", (PyCFunction)getargs_keywords,
4750 METH_VARARGS|METH_KEYWORDS},
Larry Hastings83a9f482012-03-20 20:06:16 +00004751 {"getargs_keyword_only", (PyCFunction)getargs_keyword_only,
4752 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03004753 {"getargs_positional_only_and_keywords",
4754 (PyCFunction)getargs_positional_only_and_keywords,
4755 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 {"getargs_b", getargs_b, METH_VARARGS},
4757 {"getargs_B", getargs_B, METH_VARARGS},
4758 {"getargs_h", getargs_h, METH_VARARGS},
4759 {"getargs_H", getargs_H, METH_VARARGS},
4760 {"getargs_I", getargs_I, METH_VARARGS},
4761 {"getargs_k", getargs_k, METH_VARARGS},
4762 {"getargs_i", getargs_i, METH_VARARGS},
4763 {"getargs_l", getargs_l, METH_VARARGS},
4764 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07004765 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004766 {"getargs_L", getargs_L, METH_VARARGS},
4767 {"getargs_K", getargs_K, METH_VARARGS},
4768 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304769 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
4770 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03004771 {"getargs_f", getargs_f, METH_VARARGS},
4772 {"getargs_d", getargs_d, METH_VARARGS},
4773 {"getargs_D", getargs_D, METH_VARARGS},
4774 {"getargs_S", getargs_S, METH_VARARGS},
4775 {"getargs_Y", getargs_Y, METH_VARARGS},
4776 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03004777 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004778 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00004779 {"getargs_s", getargs_s, METH_VARARGS},
4780 {"getargs_s_star", getargs_s_star, METH_VARARGS},
4781 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
4782 {"getargs_z", getargs_z, METH_VARARGS},
4783 {"getargs_z_star", getargs_z_star, METH_VARARGS},
4784 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
4785 {"getargs_y", getargs_y, METH_VARARGS},
4786 {"getargs_y_star", getargs_y_star, METH_VARARGS},
4787 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
4788 {"getargs_u", getargs_u, METH_VARARGS},
4789 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
4790 {"getargs_Z", getargs_Z, METH_VARARGS},
4791 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00004792 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02004793 {"getargs_es", getargs_es, METH_VARARGS},
4794 {"getargs_et", getargs_et, METH_VARARGS},
4795 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
4796 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004797 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004798 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004799 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00004800 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304801 {"test_s_code", test_s_code, METH_NOARGS},
4802 {"test_u_code", test_u_code, METH_NOARGS},
4803 {"test_Z_code", test_Z_code, METH_NOARGS},
4804 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004805 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
4806 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03004807 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08004808 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03004809 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01004810 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
4811 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01004812 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004813 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004814 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004815#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00004816 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00004817#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00004818 {"traceback_print", traceback_print, METH_VARARGS},
4819 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02004820 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00004821 {"argparsing", argparsing, METH_VARARGS},
4822 {"code_newempty", code_newempty, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004823 {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
4824 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304825 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00004826 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304827 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01004828 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01004829 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
4830 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01004831 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02004832 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04004833 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304834 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
4835 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
4836 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
4837 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02004838 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
4839 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304840 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02004841 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004842 {"no_docstring",
4843 (PyCFunction)test_with_docstring, METH_NOARGS},
4844 {"docstring_empty",
4845 (PyCFunction)test_with_docstring, METH_NOARGS,
4846 docstring_empty},
4847 {"docstring_no_signature",
4848 (PyCFunction)test_with_docstring, METH_NOARGS,
4849 docstring_no_signature},
4850 {"docstring_with_invalid_signature",
4851 (PyCFunction)test_with_docstring, METH_NOARGS,
4852 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08004853 {"docstring_with_invalid_signature2",
4854 (PyCFunction)test_with_docstring, METH_NOARGS,
4855 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004856 {"docstring_with_signature",
4857 (PyCFunction)test_with_docstring, METH_NOARGS,
4858 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05004859 {"docstring_with_signature_but_no_doc",
4860 (PyCFunction)test_with_docstring, METH_NOARGS,
4861 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004862 {"docstring_with_signature_and_extra_newlines",
4863 (PyCFunction)test_with_docstring, METH_NOARGS,
4864 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08004865 {"docstring_with_signature_with_defaults",
4866 (PyCFunction)test_with_docstring, METH_NOARGS,
4867 docstring_with_signature_with_defaults},
Victor Stinner56e8c292014-07-21 12:30:22 +02004868 {"raise_signal",
4869 (PyCFunction)test_raise_signal, METH_VARARGS},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004870 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
4871 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02004872 {"pymarshal_write_long_to_file",
4873 pymarshal_write_long_to_file, METH_VARARGS},
4874 {"pymarshal_write_object_to_file",
4875 pymarshal_write_object_to_file, METH_VARARGS},
4876 {"pymarshal_read_short_from_file",
4877 pymarshal_read_short_from_file, METH_VARARGS},
4878 {"pymarshal_read_long_from_file",
4879 pymarshal_read_long_from_file, METH_VARARGS},
4880 {"pymarshal_read_last_object_from_file",
4881 pymarshal_read_last_object_from_file, METH_VARARGS},
4882 {"pymarshal_read_object_from_file",
4883 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01004884 {"return_null_without_error",
4885 return_null_without_error, METH_NOARGS},
4886 {"return_result_with_error",
4887 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02004888 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01004889 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
4890 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01004891 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01004892#ifdef HAVE_CLOCK_GETTIME
4893 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
4894#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02004895 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
4896 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner50856d52015-10-13 00:11:21 +02004897 {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01004898 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
4899 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01004900 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01004901 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01004902 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01004903 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
4904 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
4905 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004906 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004907 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02004908 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
4909 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
4910 {"pyobject_fastcallkeywords", test_pyobject_fastcallkeywords, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02004911 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004912#ifdef W_STOPCODE
4913 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
4914#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03004915 {"get_mapping_keys", get_mapping_keys, METH_O},
4916 {"get_mapping_values", get_mapping_values, METH_O},
4917 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004918 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05004919 {"hamt", new_hamt, METH_NOARGS},
jdemeyer5a306202018-10-19 23:50:06 +02004920 {"bad_get", bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02004921 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
4922 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner2094c2b2018-09-03 17:06:39 +02004923 {"get_coreconfig", get_coreconfig, METH_NOARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02004924#ifdef Py_REF_DEBUG
4925 {"negative_refcount", negative_refcount, METH_NOARGS},
4926#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00004928};
4929
Thomas Hellera4ea6032003-04-17 18:55:45 +00004930#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
4931
Thomas Wouters89f507f2006-12-13 04:49:30 +00004932typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004933 char bool_member;
4934 char byte_member;
4935 unsigned char ubyte_member;
4936 short short_member;
4937 unsigned short ushort_member;
4938 int int_member;
4939 unsigned int uint_member;
4940 long long_member;
4941 unsigned long ulong_member;
4942 Py_ssize_t pyssizet_member;
4943 float float_member;
4944 double double_member;
4945 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07004946 long long longlong_member;
4947 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004948} all_structmembers;
4949
4950typedef struct {
4951 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004952 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004953} test_structmembers;
4954
4955static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
4957 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
4958 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
4959 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
4960 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
4961 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
4962 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
4963 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
4964 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
4965 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
4966 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
4967 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
4968 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004969 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
4970 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004971 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00004972};
4973
4974
Christian Heimes1af737c2008-01-23 08:24:23 +00004975static PyObject *
4976test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
4977{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 static char *keywords[] = {
4979 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
4980 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
4981 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004982 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07004984 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004985 test_structmembers *ob;
4986 const char *s = NULL;
4987 Py_ssize_t string_len = 0;
4988 ob = PyObject_New(test_structmembers, type);
4989 if (ob == NULL)
4990 return NULL;
4991 memset(&ob->structmembers, 0, sizeof(all_structmembers));
4992 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
4993 &ob->structmembers.bool_member,
4994 &ob->structmembers.byte_member,
4995 &ob->structmembers.ubyte_member,
4996 &ob->structmembers.short_member,
4997 &ob->structmembers.ushort_member,
4998 &ob->structmembers.int_member,
4999 &ob->structmembers.uint_member,
5000 &ob->structmembers.long_member,
5001 &ob->structmembers.ulong_member,
5002 &ob->structmembers.pyssizet_member,
5003 &ob->structmembers.float_member,
5004 &ob->structmembers.double_member,
5005 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005006 , &ob->structmembers.longlong_member,
5007 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005008 )) {
5009 Py_DECREF(ob);
5010 return NULL;
5011 }
5012 if (s != NULL) {
5013 if (string_len > 5) {
5014 Py_DECREF(ob);
5015 PyErr_SetString(PyExc_ValueError, "string too long");
5016 return NULL;
5017 }
5018 strcpy(ob->structmembers.inplace_member, s);
5019 }
5020 else {
5021 strcpy(ob->structmembers.inplace_member, "");
5022 }
5023 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005024}
5025
Christian Heimes1af737c2008-01-23 08:24:23 +00005026static void
5027test_structmembers_free(PyObject *ob)
5028{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005029 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005030}
5031
5032static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005033 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005034 "test_structmembersType",
5035 sizeof(test_structmembers), /* tp_basicsize */
5036 0, /* tp_itemsize */
5037 test_structmembers_free, /* destructor tp_dealloc */
5038 0, /* tp_print */
5039 0, /* tp_getattr */
5040 0, /* tp_setattr */
5041 0, /* tp_reserved */
5042 0, /* tp_repr */
5043 0, /* tp_as_number */
5044 0, /* tp_as_sequence */
5045 0, /* tp_as_mapping */
5046 0, /* tp_hash */
5047 0, /* tp_call */
5048 0, /* tp_str */
5049 PyObject_GenericGetAttr, /* tp_getattro */
5050 PyObject_GenericSetAttr, /* tp_setattro */
5051 0, /* tp_as_buffer */
5052 0, /* tp_flags */
5053 "Type containing all structmember types",
5054 0, /* traverseproc tp_traverse */
5055 0, /* tp_clear */
5056 0, /* tp_richcompare */
5057 0, /* tp_weaklistoffset */
5058 0, /* tp_iter */
5059 0, /* tp_iternext */
5060 0, /* tp_methods */
5061 test_members, /* tp_members */
5062 0,
5063 0,
5064 0,
5065 0,
5066 0,
5067 0,
5068 0,
5069 0,
5070 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005071};
5072
5073
Benjamin Petersond51374e2014-04-09 23:55:56 -04005074typedef struct {
5075 PyObject_HEAD
5076} matmulObject;
5077
5078static PyObject *
5079matmulType_matmul(PyObject *self, PyObject *other)
5080{
5081 return Py_BuildValue("(sOO)", "matmul", self, other);
5082}
5083
5084static PyObject *
5085matmulType_imatmul(PyObject *self, PyObject *other)
5086{
5087 return Py_BuildValue("(sOO)", "imatmul", self, other);
5088}
5089
5090static void
5091matmulType_dealloc(PyObject *self)
5092{
Zachary Ware420dc562014-04-23 13:51:27 -05005093 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005094}
5095
5096static PyNumberMethods matmulType_as_number = {
5097 0, /* nb_add */
5098 0, /* nb_subtract */
5099 0, /* nb_multiply */
5100 0, /* nb_remainde r*/
5101 0, /* nb_divmod */
5102 0, /* nb_power */
5103 0, /* nb_negative */
5104 0, /* tp_positive */
5105 0, /* tp_absolute */
5106 0, /* tp_bool */
5107 0, /* nb_invert */
5108 0, /* nb_lshift */
5109 0, /* nb_rshift */
5110 0, /* nb_and */
5111 0, /* nb_xor */
5112 0, /* nb_or */
5113 0, /* nb_int */
5114 0, /* nb_reserved */
5115 0, /* nb_float */
5116 0, /* nb_inplace_add */
5117 0, /* nb_inplace_subtract */
5118 0, /* nb_inplace_multiply */
5119 0, /* nb_inplace_remainder */
5120 0, /* nb_inplace_power */
5121 0, /* nb_inplace_lshift */
5122 0, /* nb_inplace_rshift */
5123 0, /* nb_inplace_and */
5124 0, /* nb_inplace_xor */
5125 0, /* nb_inplace_or */
5126 0, /* nb_floor_divide */
5127 0, /* nb_true_divide */
5128 0, /* nb_inplace_floor_divide */
5129 0, /* nb_inplace_true_divide */
5130 0, /* nb_index */
5131 matmulType_matmul, /* nb_matrix_multiply */
5132 matmulType_imatmul /* nb_matrix_inplace_multiply */
5133};
5134
5135static PyTypeObject matmulType = {
5136 PyVarObject_HEAD_INIT(NULL, 0)
5137 "matmulType",
5138 sizeof(matmulObject), /* tp_basicsize */
5139 0, /* tp_itemsize */
5140 matmulType_dealloc, /* destructor tp_dealloc */
5141 0, /* tp_print */
5142 0, /* tp_getattr */
5143 0, /* tp_setattr */
5144 0, /* tp_reserved */
5145 0, /* tp_repr */
5146 &matmulType_as_number, /* tp_as_number */
5147 0, /* tp_as_sequence */
5148 0, /* tp_as_mapping */
5149 0, /* tp_hash */
5150 0, /* tp_call */
5151 0, /* tp_str */
5152 PyObject_GenericGetAttr, /* tp_getattro */
5153 PyObject_GenericSetAttr, /* tp_setattro */
5154 0, /* tp_as_buffer */
5155 0, /* tp_flags */
5156 "C level type with matrix operations defined",
5157 0, /* traverseproc tp_traverse */
5158 0, /* tp_clear */
5159 0, /* tp_richcompare */
5160 0, /* tp_weaklistoffset */
5161 0, /* tp_iter */
5162 0, /* tp_iternext */
5163 0, /* tp_methods */
5164 0, /* tp_members */
5165 0,
5166 0,
5167 0,
5168 0,
5169 0,
5170 0,
5171 0,
5172 0,
5173 PyType_GenericNew, /* tp_new */
5174 PyObject_Del, /* tp_free */
5175};
5176
Martin v. Löwis1a214512008-06-11 05:26:20 +00005177
Yury Selivanov75445082015-05-11 22:57:16 -04005178typedef struct {
5179 PyObject_HEAD
5180 PyObject *ao_iterator;
5181} awaitObject;
5182
5183
5184static PyObject *
5185awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5186{
5187 PyObject *v;
5188 awaitObject *ao;
5189
5190 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
5191 return NULL;
5192
5193 ao = (awaitObject *)type->tp_alloc(type, 0);
5194 if (ao == NULL) {
5195 return NULL;
5196 }
5197
5198 Py_INCREF(v);
5199 ao->ao_iterator = v;
5200
5201 return (PyObject *)ao;
5202}
5203
5204
5205static void
5206awaitObject_dealloc(awaitObject *ao)
5207{
5208 Py_CLEAR(ao->ao_iterator);
5209 Py_TYPE(ao)->tp_free(ao);
5210}
5211
5212
5213static PyObject *
5214awaitObject_await(awaitObject *ao)
5215{
5216 Py_INCREF(ao->ao_iterator);
5217 return ao->ao_iterator;
5218}
5219
5220static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04005221 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04005222 0, /* am_aiter */
5223 0 /* am_anext */
5224};
5225
5226
5227static PyTypeObject awaitType = {
5228 PyVarObject_HEAD_INIT(NULL, 0)
5229 "awaitType",
5230 sizeof(awaitObject), /* tp_basicsize */
5231 0, /* tp_itemsize */
5232 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
5233 0, /* tp_print */
5234 0, /* tp_getattr */
5235 0, /* tp_setattr */
5236 &awaitType_as_async, /* tp_as_async */
5237 0, /* tp_repr */
5238 0, /* tp_as_number */
5239 0, /* tp_as_sequence */
5240 0, /* tp_as_mapping */
5241 0, /* tp_hash */
5242 0, /* tp_call */
5243 0, /* tp_str */
5244 PyObject_GenericGetAttr, /* tp_getattro */
5245 PyObject_GenericSetAttr, /* tp_setattro */
5246 0, /* tp_as_buffer */
5247 0, /* tp_flags */
5248 "C level type with tp_as_async",
5249 0, /* traverseproc tp_traverse */
5250 0, /* tp_clear */
5251 0, /* tp_richcompare */
5252 0, /* tp_weaklistoffset */
5253 0, /* tp_iter */
5254 0, /* tp_iternext */
5255 0, /* tp_methods */
5256 0, /* tp_members */
5257 0,
5258 0,
5259 0,
5260 0,
5261 0,
5262 0,
5263 0,
5264 0,
5265 awaitObject_new, /* tp_new */
5266 PyObject_Del, /* tp_free */
5267};
5268
5269
xdegaye56d1f5c2017-10-26 15:09:06 +02005270static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
5271
5272static PyTypeObject PyRecursingInfinitelyError_Type = {
5273 PyVarObject_HEAD_INIT(NULL, 0)
5274 "RecursingInfinitelyError", /* tp_name */
5275 sizeof(PyBaseExceptionObject), /* tp_basicsize */
5276 0, /* tp_itemsize */
5277 0, /* tp_dealloc */
5278 0, /* tp_print */
5279 0, /* tp_getattr */
5280 0, /* tp_setattr */
5281 0, /* tp_reserved */
5282 0, /* tp_repr */
5283 0, /* tp_as_number */
5284 0, /* tp_as_sequence */
5285 0, /* tp_as_mapping */
5286 0, /* tp_hash */
5287 0, /* tp_call */
5288 0, /* tp_str */
5289 0, /* tp_getattro */
5290 0, /* tp_setattro */
5291 0, /* tp_as_buffer */
5292 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5293 "Instantiating this exception starts infinite recursion.", /* tp_doc */
5294 0, /* tp_traverse */
5295 0, /* tp_clear */
5296 0, /* tp_richcompare */
5297 0, /* tp_weaklistoffset */
5298 0, /* tp_iter */
5299 0, /* tp_iternext */
5300 0, /* tp_methods */
5301 0, /* tp_members */
5302 0, /* tp_getset */
5303 0, /* tp_base */
5304 0, /* tp_dict */
5305 0, /* tp_descr_get */
5306 0, /* tp_descr_set */
5307 0, /* tp_dictoffset */
5308 (initproc)recurse_infinitely_error_init, /* tp_init */
5309 0, /* tp_alloc */
5310 0, /* tp_new */
5311};
5312
5313static int
5314recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
5315{
5316 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
5317
5318 /* Instantiating this exception starts infinite recursion. */
5319 Py_INCREF(type);
5320 PyErr_SetObject(type, NULL);
5321 return -1;
5322}
5323
5324
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005325/* Test PEP 560 */
5326
5327typedef struct {
5328 PyObject_HEAD
5329 PyObject *item;
5330} PyGenericAliasObject;
5331
5332static void
5333generic_alias_dealloc(PyGenericAliasObject *self)
5334{
5335 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01005336 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005337}
5338
5339static PyObject *
5340generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
5341{
5342 return PyTuple_Pack(1, self->item);
5343}
5344
5345static PyMethodDef generic_alias_methods[] = {
5346 {"__mro_entries__", (PyCFunction) generic_alias_mro_entries, METH_O, NULL},
5347 {NULL} /* sentinel */
5348};
5349
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07005350static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005351 PyVarObject_HEAD_INIT(NULL, 0)
5352 "GenericAlias",
5353 sizeof(PyGenericAliasObject),
5354 0,
5355 .tp_dealloc = (destructor)generic_alias_dealloc,
5356 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5357 .tp_methods = generic_alias_methods,
5358};
5359
5360static PyObject *
5361generic_alias_new(PyObject *item)
5362{
5363 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
5364 if (o == NULL) {
5365 return NULL;
5366 }
5367 Py_INCREF(item);
5368 o->item = item;
5369 return (PyObject*) o;
5370}
5371
5372typedef struct {
5373 PyObject_HEAD
5374} PyGenericObject;
5375
5376static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005377generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005378{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005379 return generic_alias_new(item);
5380}
5381
5382static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02005383 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005384 {NULL} /* sentinel */
5385};
5386
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07005387static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005388 PyVarObject_HEAD_INIT(NULL, 0)
5389 "Generic",
5390 sizeof(PyGenericObject),
5391 0,
5392 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
5393 .tp_methods = generic_methods,
5394};
5395
5396
Martin v. Löwis1a214512008-06-11 05:26:20 +00005397static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005398 PyModuleDef_HEAD_INIT,
5399 "_testcapi",
5400 NULL,
5401 -1,
5402 TestMethods,
5403 NULL,
5404 NULL,
5405 NULL,
5406 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005407};
5408
Nick Coghland5cacbb2015-05-23 22:24:10 +10005409/* Per PEP 489, this module will not be converted to multi-phase initialization
5410 */
5411
Mark Hammond62b1ab12002-07-23 06:31:15 +00005412PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005413PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00005414{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005415 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005417 m = PyModule_Create(&_testcapimodule);
5418 if (m == NULL)
5419 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type;
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00005422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005423 Py_TYPE(&test_structmembersType)=&PyType_Type;
5424 Py_INCREF(&test_structmembersType);
5425 /* don't use a name starting with "test", since we don't want
5426 test_capi to automatically call this */
5427 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005428 if (PyType_Ready(&matmulType) < 0)
5429 return NULL;
5430 Py_INCREF(&matmulType);
5431 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005432
Yury Selivanov75445082015-05-11 22:57:16 -04005433 if (PyType_Ready(&awaitType) < 0)
5434 return NULL;
5435 Py_INCREF(&awaitType);
5436 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
5437
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02005438 if (PyType_Ready(&GenericAlias_Type) < 0)
5439 return NULL;
5440 Py_INCREF(&GenericAlias_Type);
5441 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
5442
5443 if (PyType_Ready(&Generic_Type) < 0)
5444 return NULL;
5445 Py_INCREF(&Generic_Type);
5446 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
5447
xdegaye56d1f5c2017-10-26 15:09:06 +02005448 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
5449 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
5450 return NULL;
5451 }
5452 Py_INCREF(&PyRecursingInfinitelyError_Type);
5453 PyModule_AddObject(m, "RecursingInfinitelyError",
5454 (PyObject *)&PyRecursingInfinitelyError_Type);
5455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005456 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
5457 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
5458 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
5459 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
5460 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
5461 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
5462 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
5463 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
5464 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
5465 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
5466 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
5467 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
5468 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
5469 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
5470 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
5471 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
5472 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX));
5473 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN));
5474 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX));
5475 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
5476 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
5477 PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
Victor Stinner4237d342015-09-10 10:10:39 +02005478 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 Py_INCREF(&PyInstanceMethod_Type);
5480 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00005481
Larry Hastings2a727912014-01-16 11:32:01 -08005482 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner5d39e042017-11-29 17:20:38 +01005483#ifdef WITH_PYMALLOC
5484 PyModule_AddObject(m, "WITH_PYMALLOC", Py_True);
5485#else
5486 PyModule_AddObject(m, "WITH_PYMALLOC", Py_False);
5487#endif
Larry Hastings2a727912014-01-16 11:32:01 -08005488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005489 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
5490 Py_INCREF(TestError);
5491 PyModule_AddObject(m, "error", TestError);
5492 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00005493}