blob: fca94a83a5d04ed73f66e17ceac374e44fd5751c [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
Victor Stinner3f2f4fe2020-03-13 13:07:31 +01008/* This module tests the public (Include/ and Include/cpython/) C API.
9 The internal C API must not be used here: use _testinternalcapi for that.
10
11 The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE
12 macro defined, but only the public C API must be tested here. */
Hai Shi5dd21f52020-04-21 00:49:13 +080013
Victor Stinner5c75f372019-04-17 23:02:26 +020014#undef Py_BUILD_CORE_MODULE
Hai Shi5dd21f52020-04-21 00:49:13 +080015/* Always enable assertions */
16#undef NDEBUG
Victor Stinner5c75f372019-04-17 23:02:26 +020017
Neal Norwitz8866e0a2007-10-27 04:01:17 +000018#define PY_SSIZE_T_CLEAN
19
Tim Peters9ea17ac2001-02-02 05:57:15 +000020#include "Python.h"
Benjamin Peterson91d58bd2009-12-13 21:30:54 +000021#include "datetime.h"
Serhiy Storchakab5181342015-02-06 08:58:56 +020022#include "marshal.h"
Victor Stinner4a21e572020-04-15 02:35:41 +020023#include "structmember.h" // PyMemberDef
Victor Stinnera1c249c2018-11-01 03:15:58 +010024#include <float.h>
Victor Stinner56e8c292014-07-21 12:30:22 +020025#include <signal.h>
Tim Peters9ea17ac2001-02-02 05:57:15 +000026
Victor Stinner95e9cef2015-03-28 01:26:47 +010027#ifdef MS_WINDOWS
Victor Stinner09e5cf22015-03-30 00:09:18 +020028# include <winsock2.h> /* struct timeval */
Victor Stinner95e9cef2015-03-28 01:26:47 +010029#endif
30
Victor Stinner7b7c6dc2017-08-10 12:37:39 +020031#ifdef HAVE_SYS_WAIT_H
32#include <sys/wait.h> /* For W_STOPCODE */
33#endif
34
Victor Stinner5ed69952018-11-06 15:59:52 +010035#ifdef Py_BUILD_CORE
36# error "_testcapi must test the public Python C API, not CPython internal C API"
37#endif
38
Eddie Elizondoff023ed2019-09-11 05:17:13 -040039static struct PyModuleDef _testcapimodule;
40
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000041static PyObject *TestError; /* set to exception object in init */
Tim Peters9ea17ac2001-02-02 05:57:15 +000042
Tim Peters91621db2001-06-12 20:10:01 +000043/* Raise TestError with test_name + ": " + msg, and return NULL. */
44
45static PyObject *
46raiseTestError(const char* test_name, const char* msg)
47{
Victor Stinner6ced7c42011-03-21 18:15:42 +010048 PyErr_Format(TestError, "%s: %s", test_name, msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 return NULL;
Tim Peters91621db2001-06-12 20:10:01 +000050}
51
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000052/* Test #defines from pyconfig.h (particularly the SIZEOF_* defines).
Tim Peters9ea17ac2001-02-02 05:57:15 +000053
54 The ones derived from autoconf on the UNIX-like OSes can be relied
55 upon (in the absence of sloppy cross-compiling), but the Windows
56 platforms have these hardcoded. Better safe than sorry.
57*/
58static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +000059sizeof_error(const char* fatname, const char* typname,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 int expected, int got)
Tim Peters9ea17ac2001-02-02 05:57:15 +000061{
Victor Stinner499dfcf2011-03-21 13:26:24 +010062 PyErr_Format(TestError,
63 "%s #define == %d but sizeof(%s) == %d",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 fatname, expected, typname, got);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 return (PyObject*)NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +000066}
67
68static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053069test_config(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters9ea17ac2001-02-02 05:57:15 +000070{
Tim Peters9ea17ac2001-02-02 05:57:15 +000071#define CHECK_SIZEOF(FATNAME, TYPE) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 if (FATNAME != sizeof(TYPE)) \
73 return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
Tim Peters9ea17ac2001-02-02 05:57:15 +000074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 CHECK_SIZEOF(SIZEOF_SHORT, short);
76 CHECK_SIZEOF(SIZEOF_INT, int);
77 CHECK_SIZEOF(SIZEOF_LONG, long);
78 CHECK_SIZEOF(SIZEOF_VOID_P, void*);
79 CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
Benjamin Petersonaf580df2016-09-06 10:46:49 -070080 CHECK_SIZEOF(SIZEOF_LONG_LONG, long long);
Tim Peters9ea17ac2001-02-02 05:57:15 +000081
82#undef CHECK_SIZEOF
83
Serhiy Storchaka228b12e2017-01-23 09:47:21 +020084 Py_RETURN_NONE;
Tim Peters9ea17ac2001-02-02 05:57:15 +000085}
86
Tim Peters5c4d5bf2001-02-12 22:13:26 +000087static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +053088test_sizeof_c_types(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner01076552013-10-29 19:39:52 +010089{
Ned Deilye37a1942015-03-05 15:47:10 -080090#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +020091#pragma GCC diagnostic push
92#pragma GCC diagnostic ignored "-Wtype-limits"
93#endif
Victor Stinnerf866f972013-10-29 19:59:31 +010094#define CHECK_SIZEOF(TYPE, EXPECTED) \
Victor Stinner01076552013-10-29 19:39:52 +010095 if (EXPECTED != sizeof(TYPE)) { \
96 PyErr_Format(TestError, \
97 "sizeof(%s) = %u instead of %u", \
98 #TYPE, sizeof(TYPE), EXPECTED); \
99 return (PyObject*)NULL; \
100 }
Victor Stinnerf866f972013-10-29 19:59:31 +0100101#define IS_SIGNED(TYPE) (((TYPE)-1) < (TYPE)0)
102#define CHECK_SIGNNESS(TYPE, SIGNED) \
103 if (IS_SIGNED(TYPE) != SIGNED) { \
104 PyErr_Format(TestError, \
105 "%s signness is, instead of %i", \
106 #TYPE, IS_SIGNED(TYPE), SIGNED); \
107 return (PyObject*)NULL; \
108 }
Victor Stinner01076552013-10-29 19:39:52 +0100109
110 /* integer types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100111 CHECK_SIZEOF(Py_UCS1, 1);
112 CHECK_SIZEOF(Py_UCS2, 2);
113 CHECK_SIZEOF(Py_UCS4, 4);
114 CHECK_SIGNNESS(Py_UCS1, 0);
115 CHECK_SIGNNESS(Py_UCS2, 0);
116 CHECK_SIGNNESS(Py_UCS4, 0);
Benjamin Peterson9b3d7702016-09-06 13:24:00 -0700117 CHECK_SIZEOF(int32_t, 4);
118 CHECK_SIGNNESS(int32_t, 1);
119 CHECK_SIZEOF(uint32_t, 4);
120 CHECK_SIGNNESS(uint32_t, 0);
121 CHECK_SIZEOF(int64_t, 8);
122 CHECK_SIGNNESS(int64_t, 1);
123 CHECK_SIZEOF(uint64_t, 8);
124 CHECK_SIGNNESS(uint64_t, 0);
Victor Stinner01076552013-10-29 19:39:52 +0100125
126 /* pointer/size types */
Victor Stinnerf866f972013-10-29 19:59:31 +0100127 CHECK_SIZEOF(size_t, sizeof(void *));
128 CHECK_SIGNNESS(size_t, 0);
129 CHECK_SIZEOF(Py_ssize_t, sizeof(void *));
130 CHECK_SIGNNESS(Py_ssize_t, 1);
131
Benjamin Petersonca470632016-09-06 13:47:26 -0700132 CHECK_SIZEOF(uintptr_t, sizeof(void *));
133 CHECK_SIGNNESS(uintptr_t, 0);
134 CHECK_SIZEOF(intptr_t, sizeof(void *));
135 CHECK_SIGNNESS(intptr_t, 1);
Victor Stinner01076552013-10-29 19:39:52 +0100136
Serhiy Storchakad1302c02017-01-23 10:23:58 +0200137 Py_RETURN_NONE;
Victor Stinner01076552013-10-29 19:39:52 +0100138
Victor Stinnerf866f972013-10-29 19:59:31 +0100139#undef IS_SIGNED
140#undef CHECK_SIGNESS
Victor Stinner01076552013-10-29 19:39:52 +0100141#undef CHECK_SIZEOF
Ned Deilye37a1942015-03-05 15:47:10 -0800142#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +0200143#pragma GCC diagnostic pop
144#endif
Victor Stinner01076552013-10-29 19:39:52 +0100145}
146
147
148static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530149test_list_api(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 PyObject* list;
152 int i;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 /* SF bug 132008: PyList_Reverse segfaults */
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000155#define NLIST 30
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 list = PyList_New(NLIST);
157 if (list == (PyObject*)NULL)
158 return (PyObject*)NULL;
159 /* list = range(NLIST) */
160 for (i = 0; i < NLIST; ++i) {
161 PyObject* anint = PyLong_FromLong(i);
162 if (anint == (PyObject*)NULL) {
163 Py_DECREF(list);
164 return (PyObject*)NULL;
165 }
166 PyList_SET_ITEM(list, i, anint);
167 }
168 /* list.reverse(), via PyList_Reverse() */
169 i = PyList_Reverse(list); /* should not blow up! */
170 if (i != 0) {
171 Py_DECREF(list);
172 return (PyObject*)NULL;
173 }
174 /* Check that list == range(29, -1, -1) now */
175 for (i = 0; i < NLIST; ++i) {
176 PyObject* anint = PyList_GET_ITEM(list, i);
177 if (PyLong_AS_LONG(anint) != NLIST-1-i) {
178 PyErr_SetString(TestError,
179 "test_list_api: reverse screwed up");
180 Py_DECREF(list);
181 return (PyObject*)NULL;
182 }
183 }
184 Py_DECREF(list);
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000185#undef NLIST
186
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200187 Py_RETURN_NONE;
Tim Peters5c4d5bf2001-02-12 22:13:26 +0000188}
189
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000190static int
191test_dict_inner(int count)
192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193 Py_ssize_t pos = 0, iterations = 0;
194 int i;
195 PyObject *dict = PyDict_New();
196 PyObject *v, *k;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000198 if (dict == NULL)
199 return -1;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 for (i = 0; i < count; i++) {
202 v = PyLong_FromLong(i);
Christian Heimesff369a52013-07-26 14:52:18 +0200203 if (v == NULL) {
Christian Heimesff369a52013-07-26 14:52:18 +0200204 return -1;
205 }
Christian Heimes97cb67b2013-07-20 15:01:26 +0200206 if (PyDict_SetItem(dict, v, v) < 0) {
207 Py_DECREF(v);
208 return -1;
209 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 Py_DECREF(v);
211 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 while (PyDict_Next(dict, &pos, &k, &v)) {
214 PyObject *o;
215 iterations++;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 i = PyLong_AS_LONG(v) + 1;
218 o = PyLong_FromLong(i);
219 if (o == NULL)
220 return -1;
221 if (PyDict_SetItem(dict, k, o) < 0) {
222 Py_DECREF(o);
223 return -1;
224 }
225 Py_DECREF(o);
226 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 Py_DECREF(dict);
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 if (iterations != count) {
231 PyErr_SetString(
232 TestError,
233 "test_dict_iteration: dict iteration went wrong ");
234 return -1;
235 } else {
236 return 0;
237 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000238}
239
240static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530241test_dict_iteration(PyObject* self, PyObject *Py_UNUSED(ignored))
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 int i;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 for (i = 0; i < 200; i++) {
246 if (test_dict_inner(i) < 0) {
247 return NULL;
248 }
249 }
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000250
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200251 Py_RETURN_NONE;
Guido van Rossumeb0d9922001-04-13 17:08:15 +0000252}
253
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +0200254static PyObject*
255dict_getitem_knownhash(PyObject *self, PyObject *args)
256{
257 PyObject *mp, *key, *result;
258 Py_ssize_t hash;
259
260 if (!PyArg_ParseTuple(args, "OOn:dict_getitem_knownhash",
261 &mp, &key, &hash)) {
262 return NULL;
263 }
264
265 result = _PyDict_GetItem_KnownHash(mp, key, (Py_hash_t)hash);
266 if (result == NULL && !PyErr_Occurred()) {
267 _PyErr_SetKeyError(key);
268 return NULL;
269 }
270
271 Py_XINCREF(result);
272 return result;
273}
Tim Peters91621db2001-06-12 20:10:01 +0000274
Victor Stinner3d3f2642016-12-15 17:21:23 +0100275static PyObject*
276dict_hassplittable(PyObject *self, PyObject *arg)
277{
278 if (!PyDict_Check(arg)) {
279 PyErr_Format(PyExc_TypeError,
280 "dict_hassplittable() argument must be dict, not '%s'",
Victor Stinnerdaa97562020-02-07 03:37:06 +0100281 Py_TYPE(arg)->tp_name);
Victor Stinner3d3f2642016-12-15 17:21:23 +0100282 return NULL;
283 }
284
285 return PyBool_FromLong(_PyDict_HasSplitTable((PyDictObject*)arg));
286}
287
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000288/* Issue #4701: Check that PyObject_Hash implicitly calls
289 * PyType_Ready if it hasn't already been called
290 */
291static PyTypeObject _HashInheritanceTester_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 PyVarObject_HEAD_INIT(NULL, 0)
293 "hashinheritancetester", /* Name of this type */
294 sizeof(PyObject), /* Basic object size */
295 0, /* Item size for varobject */
296 (destructor)PyObject_Del, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200297 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 0, /* tp_getattr */
299 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200300 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 0, /* tp_repr */
302 0, /* tp_as_number */
303 0, /* tp_as_sequence */
304 0, /* tp_as_mapping */
305 0, /* tp_hash */
306 0, /* tp_call */
307 0, /* tp_str */
308 PyObject_GenericGetAttr, /* tp_getattro */
309 0, /* tp_setattro */
310 0, /* tp_as_buffer */
311 Py_TPFLAGS_DEFAULT, /* tp_flags */
312 0, /* tp_doc */
313 0, /* tp_traverse */
314 0, /* tp_clear */
315 0, /* tp_richcompare */
316 0, /* tp_weaklistoffset */
317 0, /* tp_iter */
318 0, /* tp_iternext */
319 0, /* tp_methods */
320 0, /* tp_members */
321 0, /* tp_getset */
322 0, /* tp_base */
323 0, /* tp_dict */
324 0, /* tp_descr_get */
325 0, /* tp_descr_set */
326 0, /* tp_dictoffset */
327 0, /* tp_init */
328 0, /* tp_alloc */
329 PyType_GenericNew, /* tp_new */
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000330};
331
332static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530333test_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 PyTypeObject *type;
336 PyObject *obj;
Antoine Pitrou29aad002010-10-23 19:42:38 +0000337 Py_hash_t hash;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 type = &_HashInheritanceTester_Type;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 if (type->tp_dict != NULL)
342 /* The type has already been initialized. This probably means
343 -R is being used. */
344 Py_RETURN_NONE;
Benjamin Petersonf1726372009-05-05 21:11:54 +0000345
346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 obj = PyObject_New(PyObject, type);
348 if (obj == NULL) {
349 PyErr_Clear();
350 PyErr_SetString(
351 TestError,
352 "test_lazy_hash_inheritance: failed to create object");
353 return NULL;
354 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 if (type->tp_dict != NULL) {
357 PyErr_SetString(
358 TestError,
359 "test_lazy_hash_inheritance: type initialised too soon");
360 Py_DECREF(obj);
361 return NULL;
362 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 hash = PyObject_Hash(obj);
365 if ((hash == -1) && PyErr_Occurred()) {
366 PyErr_Clear();
367 PyErr_SetString(
368 TestError,
369 "test_lazy_hash_inheritance: could not hash object");
370 Py_DECREF(obj);
371 return NULL;
372 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 if (type->tp_dict == NULL) {
375 PyErr_SetString(
376 TestError,
377 "test_lazy_hash_inheritance: type not initialised by hash()");
378 Py_DECREF(obj);
379 return NULL;
380 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 if (type->tp_hash != PyType_Type.tp_hash) {
383 PyErr_SetString(
384 TestError,
385 "test_lazy_hash_inheritance: unexpected hash function");
386 Py_DECREF(obj);
387 return NULL;
388 }
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 Py_DECREF(obj);
Benjamin Petersonf1726372009-05-05 21:11:54 +0000391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 Py_RETURN_NONE;
Nick Coghlanf1f2f682008-12-30 07:29:12 +0000393}
394
395
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700396/* Tests of PyLong_{As, From}{Unsigned,}Long(), and
Tim Petersff70d3c2001-06-14 01:11:03 +0000397 PyLong_{As, From}{Unsigned,}LongLong().
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000398
399 Note that the meat of the test is contained in testcapi_long.h.
400 This is revolting, but delicate code duplication is worse: "almost
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700401 exactly the same" code is needed to test long long, but the ubiquitous
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000402 dependence on type names makes it impossible to use a parameterized
403 function. A giant macro would be even worse than this. A C++ template
404 would be perfect.
405
406 The "report an error" functions are deliberately not part of the #include
407 file: if the test fails, you can set a breakpoint in the appropriate
408 error function directly, and crawl back from there in the debugger.
409*/
410
411#define UNBIND(X) Py_DECREF(X); (X) = NULL
412
413static PyObject *
414raise_test_long_error(const char* msg)
415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 return raiseTestError("test_long_api", msg);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000417}
418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419#define TESTNAME test_long_api_inner
420#define TYPENAME long
421#define F_S_TO_PY PyLong_FromLong
422#define F_PY_TO_S PyLong_AsLong
423#define F_U_TO_PY PyLong_FromUnsignedLong
424#define F_PY_TO_U PyLong_AsUnsignedLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000425
426#include "testcapi_long.h"
427
428static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530429test_long_api(PyObject* self, PyObject *Py_UNUSED(ignored))
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 return TESTNAME(raise_test_long_error);
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000432}
433
434#undef TESTNAME
435#undef TYPENAME
436#undef F_S_TO_PY
437#undef F_PY_TO_S
438#undef F_U_TO_PY
439#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000440
Tim Peters91621db2001-06-12 20:10:01 +0000441static PyObject *
Tim Petersd1a7da62001-06-13 00:35:57 +0000442raise_test_longlong_error(const char* msg)
443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 return raiseTestError("test_longlong_api", msg);
Tim Petersd1a7da62001-06-13 00:35:57 +0000445}
446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447#define TESTNAME test_longlong_api_inner
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700448#define TYPENAME long long
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449#define F_S_TO_PY PyLong_FromLongLong
450#define F_PY_TO_S PyLong_AsLongLong
451#define F_U_TO_PY PyLong_FromUnsignedLongLong
452#define F_PY_TO_U PyLong_AsUnsignedLongLong
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000453
454#include "testcapi_long.h"
Tim Petersd1a7da62001-06-13 00:35:57 +0000455
456static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000457test_longlong_api(PyObject* self, PyObject *args)
Tim Peters91621db2001-06-12 20:10:01 +0000458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 return TESTNAME(raise_test_longlong_error);
Tim Peters91621db2001-06-12 20:10:01 +0000460}
461
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000462#undef TESTNAME
463#undef TYPENAME
464#undef F_S_TO_PY
465#undef F_PY_TO_S
466#undef F_U_TO_PY
467#undef F_PY_TO_U
Tim Peterse7c1f9b2001-06-14 00:55:41 +0000468
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000469/* Test the PyLong_AsLongAndOverflow API. General conversion to PY_LONG
470 is tested by test_long_api_inner. This test will concentrate on proper
471 handling of overflow.
472*/
473
474static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530475test_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 PyObject *num, *one, *temp;
478 long value;
479 int overflow;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 /* Test that overflow is set properly for a large value. */
482 /* num is a number larger than LONG_MAX even on 64-bit platforms */
483 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
484 if (num == NULL)
485 return NULL;
486 overflow = 1234;
487 value = PyLong_AsLongAndOverflow(num, &overflow);
488 Py_DECREF(num);
489 if (value == -1 && PyErr_Occurred())
490 return NULL;
491 if (value != -1)
492 return raiseTestError("test_long_and_overflow",
493 "return value was not set to -1");
494 if (overflow != 1)
495 return raiseTestError("test_long_and_overflow",
496 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 /* Same again, with num = LONG_MAX + 1 */
499 num = PyLong_FromLong(LONG_MAX);
500 if (num == NULL)
501 return NULL;
502 one = PyLong_FromLong(1L);
503 if (one == NULL) {
504 Py_DECREF(num);
505 return NULL;
506 }
507 temp = PyNumber_Add(num, one);
508 Py_DECREF(one);
509 Py_DECREF(num);
510 num = temp;
511 if (num == NULL)
512 return NULL;
513 overflow = 0;
514 value = PyLong_AsLongAndOverflow(num, &overflow);
515 Py_DECREF(num);
516 if (value == -1 && PyErr_Occurred())
517 return NULL;
518 if (value != -1)
519 return raiseTestError("test_long_and_overflow",
520 "return value was not set to -1");
521 if (overflow != 1)
522 return raiseTestError("test_long_and_overflow",
523 "overflow was not set to 1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 /* Test that overflow is set properly for a large negative value. */
526 /* num is a number smaller than LONG_MIN even on 64-bit platforms */
527 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
528 if (num == NULL)
529 return NULL;
530 overflow = 1234;
531 value = PyLong_AsLongAndOverflow(num, &overflow);
532 Py_DECREF(num);
533 if (value == -1 && PyErr_Occurred())
534 return NULL;
535 if (value != -1)
536 return raiseTestError("test_long_and_overflow",
537 "return value was not set to -1");
538 if (overflow != -1)
539 return raiseTestError("test_long_and_overflow",
540 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 /* Same again, with num = LONG_MIN - 1 */
543 num = PyLong_FromLong(LONG_MIN);
544 if (num == NULL)
545 return NULL;
546 one = PyLong_FromLong(1L);
547 if (one == NULL) {
548 Py_DECREF(num);
549 return NULL;
550 }
551 temp = PyNumber_Subtract(num, one);
552 Py_DECREF(one);
553 Py_DECREF(num);
554 num = temp;
555 if (num == NULL)
556 return NULL;
557 overflow = 0;
558 value = PyLong_AsLongAndOverflow(num, &overflow);
559 Py_DECREF(num);
560 if (value == -1 && PyErr_Occurred())
561 return NULL;
562 if (value != -1)
563 return raiseTestError("test_long_and_overflow",
564 "return value was not set to -1");
565 if (overflow != -1)
566 return raiseTestError("test_long_and_overflow",
567 "overflow was not set to -1");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 /* Test that overflow is cleared properly for small values. */
570 num = PyLong_FromString("FF", NULL, 16);
571 if (num == NULL)
572 return NULL;
573 overflow = 1234;
574 value = PyLong_AsLongAndOverflow(num, &overflow);
575 Py_DECREF(num);
576 if (value == -1 && PyErr_Occurred())
577 return NULL;
578 if (value != 0xFF)
579 return raiseTestError("test_long_and_overflow",
580 "expected return value 0xFF");
581 if (overflow != 0)
582 return raiseTestError("test_long_and_overflow",
583 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 num = PyLong_FromString("-FF", NULL, 16);
586 if (num == NULL)
587 return NULL;
588 overflow = 0;
589 value = PyLong_AsLongAndOverflow(num, &overflow);
590 Py_DECREF(num);
591 if (value == -1 && PyErr_Occurred())
592 return NULL;
593 if (value != -0xFF)
594 return raiseTestError("test_long_and_overflow",
595 "expected return value 0xFF");
596 if (overflow != 0)
597 return raiseTestError("test_long_and_overflow",
598 "overflow was set incorrectly");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 num = PyLong_FromLong(LONG_MAX);
601 if (num == NULL)
602 return NULL;
603 overflow = 1234;
604 value = PyLong_AsLongAndOverflow(num, &overflow);
605 Py_DECREF(num);
606 if (value == -1 && PyErr_Occurred())
607 return NULL;
608 if (value != LONG_MAX)
609 return raiseTestError("test_long_and_overflow",
610 "expected return value LONG_MAX");
611 if (overflow != 0)
612 return raiseTestError("test_long_and_overflow",
613 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 num = PyLong_FromLong(LONG_MIN);
616 if (num == NULL)
617 return NULL;
618 overflow = 0;
619 value = PyLong_AsLongAndOverflow(num, &overflow);
620 Py_DECREF(num);
621 if (value == -1 && PyErr_Occurred())
622 return NULL;
623 if (value != LONG_MIN)
624 return raiseTestError("test_long_and_overflow",
625 "expected return value LONG_MIN");
626 if (overflow != 0)
627 return raiseTestError("test_long_and_overflow",
628 "overflow was not cleared");
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000629
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200630 Py_RETURN_NONE;
Mark Dickinson309aa2d2009-12-21 12:37:06 +0000631}
632
Mark Dickinson93f562c2010-01-30 10:30:15 +0000633/* Test the PyLong_AsLongLongAndOverflow API. General conversion to
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700634 long long is tested by test_long_api_inner. This test will
Mark Dickinson93f562c2010-01-30 10:30:15 +0000635 concentrate on proper handling of overflow.
636*/
637
638static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530639test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson93f562c2010-01-30 10:30:15 +0000640{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 PyObject *num, *one, *temp;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700642 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 int overflow;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 /* Test that overflow is set properly for a large value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500646 /* num is a number larger than LLONG_MAX on a typical machine. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
648 if (num == NULL)
649 return NULL;
650 overflow = 1234;
651 value = PyLong_AsLongLongAndOverflow(num, &overflow);
652 Py_DECREF(num);
653 if (value == -1 && PyErr_Occurred())
654 return NULL;
655 if (value != -1)
656 return raiseTestError("test_long_long_and_overflow",
657 "return value was not set to -1");
658 if (overflow != 1)
659 return raiseTestError("test_long_long_and_overflow",
660 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000661
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500662 /* Same again, with num = LLONG_MAX + 1 */
663 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 if (num == NULL)
665 return NULL;
666 one = PyLong_FromLong(1L);
667 if (one == NULL) {
668 Py_DECREF(num);
669 return NULL;
670 }
671 temp = PyNumber_Add(num, one);
672 Py_DECREF(one);
673 Py_DECREF(num);
674 num = temp;
675 if (num == NULL)
676 return NULL;
677 overflow = 0;
678 value = PyLong_AsLongLongAndOverflow(num, &overflow);
679 Py_DECREF(num);
680 if (value == -1 && PyErr_Occurred())
681 return NULL;
682 if (value != -1)
683 return raiseTestError("test_long_long_and_overflow",
684 "return value was not set to -1");
685 if (overflow != 1)
686 return raiseTestError("test_long_long_and_overflow",
687 "overflow was not set to 1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 /* Test that overflow is set properly for a large negative value. */
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500690 /* num is a number smaller than LLONG_MIN on a typical platform */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
692 if (num == NULL)
693 return NULL;
694 overflow = 1234;
695 value = PyLong_AsLongLongAndOverflow(num, &overflow);
696 Py_DECREF(num);
697 if (value == -1 && PyErr_Occurred())
698 return NULL;
699 if (value != -1)
700 return raiseTestError("test_long_long_and_overflow",
701 "return value was not set to -1");
702 if (overflow != -1)
703 return raiseTestError("test_long_long_and_overflow",
704 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000705
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500706 /* Same again, with num = LLONG_MIN - 1 */
707 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 if (num == NULL)
709 return NULL;
710 one = PyLong_FromLong(1L);
711 if (one == NULL) {
712 Py_DECREF(num);
713 return NULL;
714 }
715 temp = PyNumber_Subtract(num, one);
716 Py_DECREF(one);
717 Py_DECREF(num);
718 num = temp;
719 if (num == NULL)
720 return NULL;
721 overflow = 0;
722 value = PyLong_AsLongLongAndOverflow(num, &overflow);
723 Py_DECREF(num);
724 if (value == -1 && PyErr_Occurred())
725 return NULL;
726 if (value != -1)
727 return raiseTestError("test_long_long_and_overflow",
728 "return value was not set to -1");
729 if (overflow != -1)
730 return raiseTestError("test_long_long_and_overflow",
731 "overflow was not set to -1");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 /* Test that overflow is cleared properly for small values. */
734 num = PyLong_FromString("FF", NULL, 16);
735 if (num == NULL)
736 return NULL;
737 overflow = 1234;
738 value = PyLong_AsLongLongAndOverflow(num, &overflow);
739 Py_DECREF(num);
740 if (value == -1 && PyErr_Occurred())
741 return NULL;
742 if (value != 0xFF)
743 return raiseTestError("test_long_long_and_overflow",
744 "expected return value 0xFF");
745 if (overflow != 0)
746 return raiseTestError("test_long_long_and_overflow",
747 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 num = PyLong_FromString("-FF", NULL, 16);
750 if (num == NULL)
751 return NULL;
752 overflow = 0;
753 value = PyLong_AsLongLongAndOverflow(num, &overflow);
754 Py_DECREF(num);
755 if (value == -1 && PyErr_Occurred())
756 return NULL;
757 if (value != -0xFF)
758 return raiseTestError("test_long_long_and_overflow",
759 "expected return value 0xFF");
760 if (overflow != 0)
761 return raiseTestError("test_long_long_and_overflow",
762 "overflow was set incorrectly");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000763
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500764 num = PyLong_FromLongLong(LLONG_MAX);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 if (num == NULL)
766 return NULL;
767 overflow = 1234;
768 value = PyLong_AsLongLongAndOverflow(num, &overflow);
769 Py_DECREF(num);
770 if (value == -1 && PyErr_Occurred())
771 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500772 if (value != LLONG_MAX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500774 "expected return value LLONG_MAX");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 if (overflow != 0)
776 return raiseTestError("test_long_long_and_overflow",
777 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000778
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500779 num = PyLong_FromLongLong(LLONG_MIN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 if (num == NULL)
781 return NULL;
782 overflow = 0;
783 value = PyLong_AsLongLongAndOverflow(num, &overflow);
784 Py_DECREF(num);
785 if (value == -1 && PyErr_Occurred())
786 return NULL;
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500787 if (value != LLONG_MIN)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 return raiseTestError("test_long_long_and_overflow",
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +0500789 "expected return value LLONG_MIN");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 if (overflow != 0)
791 return raiseTestError("test_long_long_and_overflow",
792 "overflow was not cleared");
Mark Dickinson93f562c2010-01-30 10:30:15 +0000793
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200794 Py_RETURN_NONE;
Mark Dickinson93f562c2010-01-30 10:30:15 +0000795}
796
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200797/* Test the PyLong_As{Size,Ssize}_t API. At present this just tests that
798 non-integer arguments are handled correctly. It should be extended to
799 test overflow handling.
800 */
801
802static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530803test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200804{
805 size_t out_u;
806 Py_ssize_t out_s;
807
808 Py_INCREF(Py_None);
809
810 out_u = PyLong_AsSize_t(Py_None);
811 if (out_u != (size_t)-1 || !PyErr_Occurred())
812 return raiseTestError("test_long_as_size_t",
813 "PyLong_AsSize_t(None) didn't complain");
814 if (!PyErr_ExceptionMatches(PyExc_TypeError))
815 return raiseTestError("test_long_as_size_t",
816 "PyLong_AsSize_t(None) raised "
817 "something other than TypeError");
818 PyErr_Clear();
819
820 out_s = PyLong_AsSsize_t(Py_None);
821 if (out_s != (Py_ssize_t)-1 || !PyErr_Occurred())
822 return raiseTestError("test_long_as_size_t",
823 "PyLong_AsSsize_t(None) didn't complain");
824 if (!PyErr_ExceptionMatches(PyExc_TypeError))
825 return raiseTestError("test_long_as_size_t",
826 "PyLong_AsSsize_t(None) raised "
827 "something other than TypeError");
828 PyErr_Clear();
829
830 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
831 return Py_None;
832}
833
Zackery Spytzdc247652019-06-06 14:39:23 -0600834static PyObject *
835test_long_as_unsigned_long_long_mask(PyObject *self,
836 PyObject *Py_UNUSED(ignored))
837{
838 unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL);
839
840 if (res != (unsigned long long)-1 || !PyErr_Occurred()) {
841 return raiseTestError("test_long_as_unsigned_long_long_mask",
842 "PyLong_AsUnsignedLongLongMask(NULL) didn't "
843 "complain");
844 }
845 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
846 return raiseTestError("test_long_as_unsigned_long_long_mask",
847 "PyLong_AsUnsignedLongLongMask(NULL) raised "
848 "something other than SystemError");
849 }
850 PyErr_Clear();
851 Py_RETURN_NONE;
852}
853
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200854/* Test the PyLong_AsDouble API. At present this just tests that
855 non-integer arguments are handled correctly.
856 */
857
858static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530859test_long_as_double(PyObject *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3d5881e2011-09-07 21:40:26 +0200860{
861 double out;
862
863 Py_INCREF(Py_None);
864
865 out = PyLong_AsDouble(Py_None);
866 if (out != -1.0 || !PyErr_Occurred())
867 return raiseTestError("test_long_as_double",
868 "PyLong_AsDouble(None) didn't complain");
869 if (!PyErr_ExceptionMatches(PyExc_TypeError))
870 return raiseTestError("test_long_as_double",
871 "PyLong_AsDouble(None) raised "
872 "something other than TypeError");
873 PyErr_Clear();
874
875 /* Py_INCREF(Py_None) omitted - we already have a reference to it. */
876 return Py_None;
877}
878
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700879/* Test the L code for PyArg_ParseTuple. This should deliver a long long
Tim Petersd38b1c72001-09-30 05:09:37 +0000880 for both long and int arguments. The test may leak a little memory if
881 it fails.
882*/
883static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530884test_L_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersd38b1c72001-09-30 05:09:37 +0000885{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 PyObject *tuple, *num;
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700887 long long value;
Tim Petersd38b1c72001-09-30 05:09:37 +0000888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 tuple = PyTuple_New(1);
890 if (tuple == NULL)
891 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 num = PyLong_FromLong(42);
894 if (num == NULL)
895 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300900 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300902 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 if (value != 42)
904 return raiseTestError("test_L_code",
905 "L code returned wrong value for long 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 Py_DECREF(num);
908 num = PyLong_FromLong(42);
909 if (num == NULL)
910 return NULL;
Tim Petersd38b1c72001-09-30 05:09:37 +0000911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 PyTuple_SET_ITEM(tuple, 0, num);
Tim Petersd38b1c72001-09-30 05:09:37 +0000913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 value = -1;
Oren Milmanba7d7362017-08-29 11:58:27 +0300915 if (!PyArg_ParseTuple(tuple, "L:test_L_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +0300917 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 if (value != 42)
919 return raiseTestError("test_L_code",
920 "L code returned wrong value for int 42");
Tim Petersd38b1c72001-09-30 05:09:37 +0000921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200923 Py_RETURN_NONE;
Tim Petersd38b1c72001-09-30 05:09:37 +0000924}
925
Serhiy Storchakace412872016-05-08 23:36:44 +0300926static PyObject *
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300927return_none(void *unused)
928{
929 Py_RETURN_NONE;
930}
931
932static PyObject *
933raise_error(void *unused)
934{
935 PyErr_SetNone(PyExc_ValueError);
936 return NULL;
937}
938
939static int
940test_buildvalue_N_error(const char *fmt)
941{
942 PyObject *arg, *res;
943
944 arg = PyList_New(0);
945 if (arg == NULL) {
946 return -1;
947 }
948
949 Py_INCREF(arg);
950 res = Py_BuildValue(fmt, return_none, NULL, arg);
951 if (res == NULL) {
952 return -1;
953 }
954 Py_DECREF(res);
955 if (Py_REFCNT(arg) != 1) {
956 PyErr_Format(TestError, "test_buildvalue_N: "
957 "arg was not decrefed in successful "
958 "Py_BuildValue(\"%s\")", fmt);
959 return -1;
960 }
961
962 Py_INCREF(arg);
963 res = Py_BuildValue(fmt, raise_error, NULL, arg);
964 if (res != NULL || !PyErr_Occurred()) {
965 PyErr_Format(TestError, "test_buildvalue_N: "
966 "Py_BuildValue(\"%s\") didn't complain", fmt);
967 return -1;
968 }
969 PyErr_Clear();
970 if (Py_REFCNT(arg) != 1) {
971 PyErr_Format(TestError, "test_buildvalue_N: "
972 "arg was not decrefed in failed "
973 "Py_BuildValue(\"%s\")", fmt);
974 return -1;
975 }
976 Py_DECREF(arg);
977 return 0;
978}
979
980static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +0200981test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300982{
983 PyObject *arg, *res;
984
985 arg = PyList_New(0);
986 if (arg == NULL) {
987 return NULL;
988 }
989 Py_INCREF(arg);
990 res = Py_BuildValue("N", arg);
991 if (res == NULL) {
992 return NULL;
993 }
994 if (res != arg) {
995 return raiseTestError("test_buildvalue_N",
996 "Py_BuildValue(\"N\") returned wrong result");
997 }
998 if (Py_REFCNT(arg) != 2) {
999 return raiseTestError("test_buildvalue_N",
1000 "arg was not decrefed in Py_BuildValue(\"N\")");
1001 }
1002 Py_DECREF(res);
1003 Py_DECREF(arg);
1004
1005 if (test_buildvalue_N_error("O&N") < 0)
1006 return NULL;
1007 if (test_buildvalue_N_error("(O&N)") < 0)
1008 return NULL;
1009 if (test_buildvalue_N_error("[O&N]") < 0)
1010 return NULL;
1011 if (test_buildvalue_N_error("{O&N}") < 0)
1012 return NULL;
1013 if (test_buildvalue_N_error("{()O&(())N}") < 0)
1014 return NULL;
1015
1016 Py_RETURN_NONE;
1017}
1018
1019
1020static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +03001021get_args(PyObject *self, PyObject *args)
1022{
1023 if (args == NULL) {
1024 args = Py_None;
1025 }
1026 Py_INCREF(args);
1027 return args;
1028}
1029
1030static PyObject *
1031get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1032{
1033 if (kwargs == NULL) {
1034 kwargs = Py_None;
1035 }
1036 Py_INCREF(kwargs);
1037 return kwargs;
1038}
1039
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001040/* Test tuple argument processing */
1041static PyObject *
1042getargs_tuple(PyObject *self, PyObject *args)
1043{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 int a, b, c;
1045 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1046 return NULL;
1047 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001048}
1049
Christian Heimes380f7f22008-02-28 11:19:05 +00001050/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001051static PyObject *
1052getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001055 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1059 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1060 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1061 return NULL;
1062 return Py_BuildValue("iiiiiiiiii",
1063 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1064 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001065}
1066
Larry Hastings83a9f482012-03-20 20:06:16 +00001067/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1068static PyObject *
1069getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1070{
1071 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1072 int required = -1;
1073 int optional = -1;
1074 int keyword_only = -1;
1075
1076 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1077 &required, &optional, &keyword_only))
1078 return NULL;
1079 return Py_BuildValue("iii", required, optional, keyword_only);
1080}
1081
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001082/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1083static PyObject *
1084getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1085{
1086 static char *keywords[] = {"", "", "keyword", NULL};
1087 int required = -1;
1088 int optional = -1;
1089 int keyword = -1;
1090
1091 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1092 &required, &optional, &keyword))
1093 return NULL;
1094 return Py_BuildValue("iii", required, optional, keyword);
1095}
1096
Thomas Heller3457e4b2003-04-24 16:14:27 +00001097/* Functions to call PyArg_ParseTuple with integer format codes,
1098 and return the result.
1099*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001100static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001101getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 unsigned char value;
1104 if (!PyArg_ParseTuple(args, "b", &value))
1105 return NULL;
1106 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001107}
1108
Thomas Heller3457e4b2003-04-24 16:14:27 +00001109static PyObject *
1110getargs_B(PyObject *self, PyObject *args)
1111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 unsigned char value;
1113 if (!PyArg_ParseTuple(args, "B", &value))
1114 return NULL;
1115 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001116}
1117
1118static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001119getargs_h(PyObject *self, PyObject *args)
1120{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 short value;
1122 if (!PyArg_ParseTuple(args, "h", &value))
1123 return NULL;
1124 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001125}
1126
1127static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001128getargs_H(PyObject *self, PyObject *args)
1129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 unsigned short value;
1131 if (!PyArg_ParseTuple(args, "H", &value))
1132 return NULL;
1133 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001134}
1135
1136static PyObject *
1137getargs_I(PyObject *self, PyObject *args)
1138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 unsigned int value;
1140 if (!PyArg_ParseTuple(args, "I", &value))
1141 return NULL;
1142 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001143}
1144
1145static PyObject *
1146getargs_k(PyObject *self, PyObject *args)
1147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 unsigned long value;
1149 if (!PyArg_ParseTuple(args, "k", &value))
1150 return NULL;
1151 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001152}
1153
1154static PyObject *
1155getargs_i(PyObject *self, PyObject *args)
1156{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 int value;
1158 if (!PyArg_ParseTuple(args, "i", &value))
1159 return NULL;
1160 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001161}
1162
Thomas Hellera4ea6032003-04-17 18:55:45 +00001163static PyObject *
1164getargs_l(PyObject *self, PyObject *args)
1165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 long value;
1167 if (!PyArg_ParseTuple(args, "l", &value))
1168 return NULL;
1169 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001170}
1171
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001172static PyObject *
1173getargs_n(PyObject *self, PyObject *args)
1174{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 Py_ssize_t value;
1176 if (!PyArg_ParseTuple(args, "n", &value))
1177 return NULL;
1178 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001179}
1180
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001181static PyObject *
1182getargs_p(PyObject *self, PyObject *args)
1183{
1184 int value;
1185 if (!PyArg_ParseTuple(args, "p", &value))
1186 return NULL;
1187 return PyLong_FromLong(value);
1188}
1189
Thomas Hellera4ea6032003-04-17 18:55:45 +00001190static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001191getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001192{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001193 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 if (!PyArg_ParseTuple(args, "L", &value))
1195 return NULL;
1196 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001197}
1198
Thomas Hellera4ea6032003-04-17 18:55:45 +00001199static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001200getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001201{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001202 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 if (!PyArg_ParseTuple(args, "K", &value))
1204 return NULL;
1205 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001206}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001207
1208/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001209 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001210static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301211test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 PyObject *tuple, *num;
1214 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 tuple = PyTuple_New(1);
1217 if (tuple == NULL)
1218 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 /* a number larger than ULONG_MAX even on 64-bit platforms */
1221 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1222 if (num == NULL)
1223 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 value = PyLong_AsUnsignedLongMask(num);
1226 if (value != ULONG_MAX)
1227 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001228 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001233 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001235 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 if (value != ULONG_MAX)
1237 return raiseTestError("test_k_code",
1238 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 Py_DECREF(num);
1241 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1242 if (num == NULL)
1243 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 value = PyLong_AsUnsignedLongMask(num);
1246 if (value != (unsigned long)-0x42)
1247 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001248 "PyLong_AsUnsignedLongMask() returned wrong "
1249 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001254 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001256 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 if (value != (unsigned long)-0x42)
1258 return raiseTestError("test_k_code",
1259 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001262 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001263}
1264
Victor Stinner06e49dd2010-06-13 18:21:50 +00001265static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001266getargs_f(PyObject *self, PyObject *args)
1267{
1268 float f;
1269 if (!PyArg_ParseTuple(args, "f", &f))
1270 return NULL;
1271 return PyFloat_FromDouble(f);
1272}
1273
1274static PyObject *
1275getargs_d(PyObject *self, PyObject *args)
1276{
1277 double d;
1278 if (!PyArg_ParseTuple(args, "d", &d))
1279 return NULL;
1280 return PyFloat_FromDouble(d);
1281}
1282
1283static PyObject *
1284getargs_D(PyObject *self, PyObject *args)
1285{
1286 Py_complex cval;
1287 if (!PyArg_ParseTuple(args, "D", &cval))
1288 return NULL;
1289 return PyComplex_FromCComplex(cval);
1290}
1291
1292static PyObject *
1293getargs_S(PyObject *self, PyObject *args)
1294{
1295 PyObject *obj;
1296 if (!PyArg_ParseTuple(args, "S", &obj))
1297 return NULL;
1298 Py_INCREF(obj);
1299 return obj;
1300}
1301
1302static PyObject *
1303getargs_Y(PyObject *self, PyObject *args)
1304{
1305 PyObject *obj;
1306 if (!PyArg_ParseTuple(args, "Y", &obj))
1307 return NULL;
1308 Py_INCREF(obj);
1309 return obj;
1310}
1311
1312static PyObject *
1313getargs_U(PyObject *self, PyObject *args)
1314{
1315 PyObject *obj;
1316 if (!PyArg_ParseTuple(args, "U", &obj))
1317 return NULL;
1318 Py_INCREF(obj);
1319 return obj;
1320}
1321
1322static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001323getargs_c(PyObject *self, PyObject *args)
1324{
1325 char c;
1326 if (!PyArg_ParseTuple(args, "c", &c))
1327 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001328 return PyLong_FromLong((unsigned char)c);
1329}
1330
1331static PyObject *
1332getargs_C(PyObject *self, PyObject *args)
1333{
1334 int c;
1335 if (!PyArg_ParseTuple(args, "C", &c))
1336 return NULL;
1337 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001338}
1339
1340static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001341getargs_s(PyObject *self, PyObject *args)
1342{
1343 char *str;
1344 if (!PyArg_ParseTuple(args, "s", &str))
1345 return NULL;
1346 return PyBytes_FromString(str);
1347}
1348
1349static PyObject *
1350getargs_s_star(PyObject *self, PyObject *args)
1351{
1352 Py_buffer buffer;
1353 PyObject *bytes;
1354 if (!PyArg_ParseTuple(args, "s*", &buffer))
1355 return NULL;
1356 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1357 PyBuffer_Release(&buffer);
1358 return bytes;
1359}
1360
1361static PyObject *
1362getargs_s_hash(PyObject *self, PyObject *args)
1363{
1364 char *str;
1365 Py_ssize_t size;
1366 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1367 return NULL;
1368 return PyBytes_FromStringAndSize(str, size);
1369}
1370
1371static PyObject *
1372getargs_z(PyObject *self, PyObject *args)
1373{
1374 char *str;
1375 if (!PyArg_ParseTuple(args, "z", &str))
1376 return NULL;
1377 if (str != NULL)
1378 return PyBytes_FromString(str);
1379 else
1380 Py_RETURN_NONE;
1381}
1382
1383static PyObject *
1384getargs_z_star(PyObject *self, PyObject *args)
1385{
1386 Py_buffer buffer;
1387 PyObject *bytes;
1388 if (!PyArg_ParseTuple(args, "z*", &buffer))
1389 return NULL;
1390 if (buffer.buf != NULL)
1391 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1392 else {
1393 Py_INCREF(Py_None);
1394 bytes = Py_None;
1395 }
1396 PyBuffer_Release(&buffer);
1397 return bytes;
1398}
1399
1400static PyObject *
1401getargs_z_hash(PyObject *self, PyObject *args)
1402{
1403 char *str;
1404 Py_ssize_t size;
1405 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1406 return NULL;
1407 if (str != NULL)
1408 return PyBytes_FromStringAndSize(str, size);
1409 else
1410 Py_RETURN_NONE;
1411}
1412
1413static PyObject *
1414getargs_y(PyObject *self, PyObject *args)
1415{
1416 char *str;
1417 if (!PyArg_ParseTuple(args, "y", &str))
1418 return NULL;
1419 return PyBytes_FromString(str);
1420}
1421
1422static PyObject *
1423getargs_y_star(PyObject *self, PyObject *args)
1424{
1425 Py_buffer buffer;
1426 PyObject *bytes;
1427 if (!PyArg_ParseTuple(args, "y*", &buffer))
1428 return NULL;
1429 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1430 PyBuffer_Release(&buffer);
1431 return bytes;
1432}
1433
1434static PyObject *
1435getargs_y_hash(PyObject *self, PyObject *args)
1436{
1437 char *str;
1438 Py_ssize_t size;
1439 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1440 return NULL;
1441 return PyBytes_FromStringAndSize(str, size);
1442}
1443
1444static PyObject *
1445getargs_u(PyObject *self, PyObject *args)
1446{
1447 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001448 if (!PyArg_ParseTuple(args, "u", &str))
1449 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001450 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001451}
1452
1453static PyObject *
1454getargs_u_hash(PyObject *self, PyObject *args)
1455{
1456 Py_UNICODE *str;
1457 Py_ssize_t size;
1458 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1459 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001460 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001461}
1462
1463static PyObject *
1464getargs_Z(PyObject *self, PyObject *args)
1465{
1466 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001467 if (!PyArg_ParseTuple(args, "Z", &str))
1468 return NULL;
1469 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001470 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001471 } else
1472 Py_RETURN_NONE;
1473}
1474
1475static PyObject *
1476getargs_Z_hash(PyObject *self, PyObject *args)
1477{
1478 Py_UNICODE *str;
1479 Py_ssize_t size;
1480 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1481 return NULL;
1482 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001483 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001484 else
1485 Py_RETURN_NONE;
1486}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001487
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001488static PyObject *
1489getargs_es(PyObject *self, PyObject *args)
1490{
1491 PyObject *arg, *result;
1492 const char *encoding = NULL;
1493 char *str;
1494
1495 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1496 return NULL;
1497 if (!PyArg_Parse(arg, "es", encoding, &str))
1498 return NULL;
1499 result = PyBytes_FromString(str);
1500 PyMem_Free(str);
1501 return result;
1502}
1503
1504static PyObject *
1505getargs_et(PyObject *self, PyObject *args)
1506{
1507 PyObject *arg, *result;
1508 const char *encoding = NULL;
1509 char *str;
1510
1511 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1512 return NULL;
1513 if (!PyArg_Parse(arg, "et", encoding, &str))
1514 return NULL;
1515 result = PyBytes_FromString(str);
1516 PyMem_Free(str);
1517 return result;
1518}
1519
1520static PyObject *
1521getargs_es_hash(PyObject *self, PyObject *args)
1522{
1523 PyObject *arg, *result;
1524 const char *encoding = NULL;
1525 PyByteArrayObject *buffer = NULL;
1526 char *str = NULL;
1527 Py_ssize_t size;
1528
1529 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1530 return NULL;
1531 if (buffer != NULL) {
1532 str = PyByteArray_AS_STRING(buffer);
1533 size = PyByteArray_GET_SIZE(buffer);
1534 }
1535 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1536 return NULL;
1537 result = PyBytes_FromStringAndSize(str, size);
1538 if (buffer == NULL)
1539 PyMem_Free(str);
1540 return result;
1541}
1542
1543static PyObject *
1544getargs_et_hash(PyObject *self, PyObject *args)
1545{
1546 PyObject *arg, *result;
1547 const char *encoding = NULL;
1548 PyByteArrayObject *buffer = NULL;
1549 char *str = NULL;
1550 Py_ssize_t size;
1551
1552 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1553 return NULL;
1554 if (buffer != NULL) {
1555 str = PyByteArray_AS_STRING(buffer);
1556 size = PyByteArray_GET_SIZE(buffer);
1557 }
1558 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1559 return NULL;
1560 result = PyBytes_FromStringAndSize(str, size);
1561 if (buffer == NULL)
1562 PyMem_Free(str);
1563 return result;
1564}
1565
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001566/* Test the s and z codes for PyArg_ParseTuple.
1567*/
1568static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301569test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001570{
1571 /* Unicode strings should be accepted */
1572 PyObject *tuple, *obj;
1573 char *value;
1574
1575 tuple = PyTuple_New(1);
1576 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001578
1579 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001581 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001583
1584 PyTuple_SET_ITEM(tuple, 0, obj);
1585
1586 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001588 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001589 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1590 return NULL;
1591 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001592
Oren Milmanba7d7362017-08-29 11:58:27 +03001593 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1594 return NULL;
1595 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001596
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001597 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001598 Py_RETURN_NONE;
1599}
1600
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001601static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001602parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001603{
Larry Hastings8f904da2012-06-22 03:56:29 -07001604 PyObject *sub_args;
1605 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001606 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001607 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001608
Larry Hastings8f904da2012-06-22 03:56:29 -07001609 Py_ssize_t i, size;
1610 char *keywords[8 + 1]; /* space for NULL at end */
1611 PyObject *o;
1612 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001613
Larry Hastings8f904da2012-06-22 03:56:29 -07001614 int result;
1615 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001616
Larry Hastings22701e82012-08-08 14:52:22 -07001617 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001618
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001619 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001620 &sub_args, &sub_kwargs,
1621 &sub_format, &sub_keywords))
1622 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001623
Larry Hastings8f904da2012-06-22 03:56:29 -07001624 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1625 PyErr_SetString(PyExc_ValueError,
1626 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1627 return NULL;
1628 }
1629
1630 memset(buffers, 0, sizeof(buffers));
1631 memset(converted, 0, sizeof(converted));
1632 memset(keywords, 0, sizeof(keywords));
1633
1634 size = PySequence_Fast_GET_SIZE(sub_keywords);
1635 if (size > 8) {
1636 PyErr_SetString(PyExc_ValueError,
1637 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1638 goto exit;
1639 }
1640
1641 for (i = 0; i < size; i++) {
1642 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1643 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1644 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001645 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001646 goto exit;
1647 }
1648 keywords[i] = PyBytes_AS_STRING(converted[i]);
1649 }
1650
1651 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1652 sub_format, keywords,
1653 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1654 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1655
1656 if (result) {
1657 return_value = Py_None;
1658 Py_INCREF(Py_None);
1659 }
1660
1661exit:
1662 size = sizeof(converted) / sizeof(converted[0]);
1663 for (i = 0; i < size; i++) {
1664 Py_XDECREF(converted[i]);
1665 }
1666 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001667}
1668
Benjamin Peterson92035012008-12-27 16:00:54 +00001669static volatile int x;
1670
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001671#if USE_UNICODE_WCHAR_CACHE
Inada Naoki2c4928d2020-06-17 20:09:44 +09001672/* Ignore use of deprecated APIs */
1673_Py_COMP_DIAG_PUSH
1674_Py_COMP_DIAG_IGNORE_DEPR_DECLS
1675
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001676/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1677 of an error.
1678*/
1679static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301680test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001681{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 PyObject *tuple, *obj;
1683 Py_UNICODE *value;
1684 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1687 /* Just use the macro and check that it compiles */
1688 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 tuple = PyTuple_New(1);
1691 if (tuple == NULL)
1692 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 obj = PyUnicode_Decode("test", strlen("test"),
1695 "ascii", NULL);
1696 if (obj == NULL)
1697 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001702 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001704 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 if (value != PyUnicode_AS_UNICODE(obj))
1706 return raiseTestError("test_u_code",
1707 "u code returned wrong value for u'test'");
1708 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001709 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001711 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 if (value != PyUnicode_AS_UNICODE(obj) ||
1713 len != PyUnicode_GET_SIZE(obj))
1714 return raiseTestError("test_u_code",
1715 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001718 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001719}
1720
Guido van Rossumfb67be22007-08-29 18:38:11 +00001721/* Test Z and Z# codes for PyArg_ParseTuple */
1722static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301723test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001726 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 tuple = PyTuple_New(2);
1730 if (tuple == NULL)
1731 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 obj = PyUnicode_FromString("test");
1734 PyTuple_SET_ITEM(tuple, 0, obj);
1735 Py_INCREF(Py_None);
1736 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 /* swap values on purpose */
1739 value1 = NULL;
1740 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001743 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001745 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 if (value1 != PyUnicode_AS_UNICODE(obj))
1747 return raiseTestError("test_Z_code",
1748 "Z code returned wrong value for 'test'");
1749 if (value2 != NULL)
1750 return raiseTestError("test_Z_code",
1751 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 value1 = NULL;
1754 value2 = PyUnicode_AS_UNICODE(obj);
1755 len1 = -1;
1756 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001759 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1760 &value2, &len2))
1761 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001763 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1765 len1 != PyUnicode_GET_SIZE(obj))
1766 return raiseTestError("test_Z_code",
1767 "Z# code returned wrong values for 'test'");
1768 if (value2 != NULL ||
1769 len2 != 0)
1770 return raiseTestError("test_Z_code",
1771 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 Py_DECREF(tuple);
1774 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001775}
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001776_Py_COMP_DIAG_POP
1777#endif /* USE_UNICODE_WCHAR_CACHE */
Guido van Rossumfb67be22007-08-29 18:38:11 +00001778
Thomas Wouters477c8d52006-05-27 19:21:47 +00001779static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301780test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001781{
1782#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1784 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001785 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001786#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1788 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001789#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1793 if (wide == NULL)
1794 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1797 if (utf8 == NULL) {
1798 Py_DECREF(wide);
1799 return NULL;
1800 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001801
Victor Stinner8ef18872011-11-21 02:06:57 +01001802 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 Py_DECREF(wide);
1804 Py_DECREF(utf8);
1805 return raiseTestError("test_widechar",
1806 "wide string and utf8 string "
1807 "have different length");
1808 }
1809 if (PyUnicode_Compare(wide, utf8)) {
1810 Py_DECREF(wide);
1811 Py_DECREF(utf8);
1812 if (PyErr_Occurred())
1813 return NULL;
1814 return raiseTestError("test_widechar",
1815 "wide string and utf8 string "
1816 "are different");
1817 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 Py_DECREF(wide);
1820 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001821
1822#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1823 wide = PyUnicode_FromWideChar(invalid, 1);
1824 if (wide == NULL)
1825 PyErr_Clear();
1826 else
1827 return raiseTestError("test_widechar",
1828 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1829
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001830#if USE_UNICODE_WCHAR_CACHE
1831/* Ignore use of deprecated APIs */
1832_Py_COMP_DIAG_PUSH
1833_Py_COMP_DIAG_IGNORE_DEPR_DECLS
Victor Stinnere3b47152011-12-09 20:49:49 +01001834 wide = PyUnicode_FromUnicode(invalid, 1);
1835 if (wide == NULL)
1836 PyErr_Clear();
1837 else
1838 return raiseTestError("test_widechar",
1839 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001840
1841 wide = PyUnicode_FromUnicode(NULL, 1);
1842 if (wide == NULL)
1843 return NULL;
1844 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001845 if (_PyUnicode_Ready(wide) < 0) {
1846 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001847 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001848 }
1849 else {
1850 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001851 return raiseTestError("test_widechar",
1852 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001853 }
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001854_Py_COMP_DIAG_POP
1855#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinnere3b47152011-12-09 20:49:49 +01001856#endif
1857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001859}
1860
1861static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001862unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001863{
1864 PyObject *unicode, *result;
1865 Py_ssize_t buflen, size;
1866 wchar_t *buffer;
1867
1868 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1869 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001870 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001871 if (buffer == NULL)
1872 return PyErr_NoMemory();
1873
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001874 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001875 if (size == -1) {
1876 PyMem_Free(buffer);
1877 return NULL;
1878 }
1879
1880 if (size < buflen)
1881 buflen = size + 1;
1882 else
1883 buflen = size;
1884 result = PyUnicode_FromWideChar(buffer, buflen);
1885 PyMem_Free(buffer);
1886 if (result == NULL)
1887 return NULL;
1888
1889 return Py_BuildValue("(Nn)", result, size);
1890}
1891
1892static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001893unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001894{
1895 PyObject *unicode, *result;
1896 Py_ssize_t size;
1897 wchar_t *buffer;
1898
1899 if (!PyArg_ParseTuple(args, "U", &unicode))
1900 return NULL;
1901
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001902 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001903 if (buffer == NULL)
1904 return NULL;
1905
1906 result = PyUnicode_FromWideChar(buffer, size + 1);
1907 PyMem_Free(buffer);
1908 if (result == NULL)
1909 return NULL;
1910 return Py_BuildValue("(Nn)", result, size);
1911}
1912
1913static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001914unicode_asucs4(PyObject *self, PyObject *args)
1915{
1916 PyObject *unicode, *result;
1917 Py_UCS4 *buffer;
1918 int copy_null;
1919 Py_ssize_t str_len, buf_len;
1920
1921 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1922 return NULL;
1923 }
1924
1925 buf_len = str_len + 1;
1926 buffer = PyMem_NEW(Py_UCS4, buf_len);
1927 if (buffer == NULL) {
1928 return PyErr_NoMemory();
1929 }
1930 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1931 buffer[str_len] = 0xffffU;
1932
1933 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1934 PyMem_FREE(buffer);
1935 return NULL;
1936 }
1937
1938 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1939 PyMem_FREE(buffer);
1940 return result;
1941}
1942
1943static PyObject *
Hai Shi5623ac82019-07-20 02:56:23 -05001944unicode_asutf8(PyObject *self, PyObject *args)
1945{
1946 PyObject *unicode;
1947 const char *buffer;
1948
1949 if (!PyArg_ParseTuple(args, "U", &unicode)) {
1950 return NULL;
1951 }
1952
1953 buffer = PyUnicode_AsUTF8(unicode);
1954 if (buffer == NULL) {
1955 return NULL;
1956 }
1957
1958 return PyBytes_FromString(buffer);
1959}
1960
1961static PyObject *
1962unicode_asutf8andsize(PyObject *self, PyObject *args)
1963{
1964 PyObject *unicode, *result;
1965 const char *buffer;
1966 Py_ssize_t utf8_len;
1967
1968 if(!PyArg_ParseTuple(args, "U", &unicode)) {
1969 return NULL;
1970 }
1971
Victor Stinneraca8c402019-09-30 21:14:26 +02001972 buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len);
Hai Shi5623ac82019-07-20 02:56:23 -05001973 if (buffer == NULL) {
1974 return NULL;
1975 }
1976
1977 result = PyBytes_FromString(buffer);
1978 if (result == NULL) {
1979 return NULL;
1980 }
1981
1982 return Py_BuildValue("(Nn)", result, utf8_len);
1983}
1984
1985static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08001986unicode_findchar(PyObject *self, PyObject *args)
1987{
1988 PyObject *str;
1989 int direction;
1990 unsigned int ch;
1991 Py_ssize_t result;
1992 Py_ssize_t start, end;
1993
1994 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
1995 &start, &end, &direction)) {
1996 return NULL;
1997 }
1998
1999 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
2000 if (result == -2)
2001 return NULL;
2002 else
2003 return PyLong_FromSsize_t(result);
2004}
2005
2006static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002007unicode_copycharacters(PyObject *self, PyObject *args)
2008{
2009 PyObject *from, *to, *to_copy;
2010 Py_ssize_t from_start, to_start, how_many, copied;
2011
2012 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
2013 &from, &from_start, &how_many)) {
2014 return NULL;
2015 }
2016
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002017 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
2018 PyUnicode_MAX_CHAR_VALUE(to)))) {
2019 return NULL;
2020 }
2021 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
2022 Py_DECREF(to_copy);
2023 return NULL;
2024 }
2025
2026 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
2027 from_start, how_many)) < 0) {
2028 Py_DECREF(to_copy);
2029 return NULL;
2030 }
2031
2032 return Py_BuildValue("(Nn)", to_copy, copied);
2033}
2034
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002035#if USE_UNICODE_WCHAR_CACHE
Inada Naoki13c90e82020-07-05 11:01:54 +09002036/* Ignore use of deprecated APIs */
2037_Py_COMP_DIAG_PUSH
2038_Py_COMP_DIAG_IGNORE_DEPR_DECLS
2039
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002040static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01002041unicode_encodedecimal(PyObject *self, PyObject *args)
2042{
2043 Py_UNICODE *unicode;
2044 Py_ssize_t length;
2045 char *errors = NULL;
2046 PyObject *decimal;
2047 Py_ssize_t decimal_length, new_length;
2048 int res;
2049
2050 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
2051 return NULL;
2052
2053 decimal_length = length * 7; /* len('&#8364;') */
2054 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
2055 if (decimal == NULL)
2056 return NULL;
2057
2058 res = PyUnicode_EncodeDecimal(unicode, length,
2059 PyBytes_AS_STRING(decimal),
2060 errors);
2061 if (res < 0) {
2062 Py_DECREF(decimal);
2063 return NULL;
2064 }
2065
2066 new_length = strlen(PyBytes_AS_STRING(decimal));
2067 assert(new_length <= decimal_length);
2068 res = _PyBytes_Resize(&decimal, new_length);
2069 if (res < 0)
2070 return NULL;
2071
2072 return decimal;
2073}
2074
2075static PyObject *
2076unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
2077{
2078 Py_UNICODE *unicode;
2079 Py_ssize_t length;
2080 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
2081 return NULL;
2082 return PyUnicode_TransformDecimalToASCII(unicode, length);
2083}
2084
2085static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002086unicode_legacy_string(PyObject *self, PyObject *args)
2087{
2088 Py_UNICODE *data;
2089 Py_ssize_t len;
2090 PyObject *u;
2091
2092 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2093 return NULL;
2094
2095 u = PyUnicode_FromUnicode(NULL, len);
2096 if (u == NULL)
2097 return NULL;
2098
2099 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2100
2101 if (len > 0) { /* The empty string is always ready. */
2102 assert(!PyUnicode_IS_READY(u));
2103 }
2104
2105 return u;
2106}
Inada Naoki2c4928d2020-06-17 20:09:44 +09002107_Py_COMP_DIAG_POP
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002108#endif /* USE_UNICODE_WCHAR_CACHE */
Stefan Krahe6996ed2012-11-02 14:44:20 +01002109
2110static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002111getargs_w_star(PyObject *self, PyObject *args)
2112{
2113 Py_buffer buffer;
2114 PyObject *result;
2115 char *str;
2116
2117 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2118 return NULL;
2119
2120 if (2 <= buffer.len) {
2121 str = buffer.buf;
2122 str[0] = '[';
2123 str[buffer.len-1] = ']';
2124 }
2125
2126 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2127 PyBuffer_Release(&buffer);
2128 return result;
2129}
2130
2131
2132static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302133test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 /* Test that formats can begin with '|'. See issue #4720. */
2136 PyObject *tuple, *dict = NULL;
2137 static char *kwlist[] = {NULL};
2138 int result;
2139 tuple = PyTuple_New(0);
2140 if (!tuple)
2141 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002142 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002144 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 dict = PyDict_New();
2146 if (!dict)
2147 goto done;
2148 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002149 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 Py_DECREF(tuple);
2151 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002152 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002154 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002155 else {
2156 Py_RETURN_NONE;
2157 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002158}
2159
2160static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002161codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 const char *encoding, *errors = NULL;
2164 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2165 &encoding, &errors))
2166 return NULL;
2167 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002168}
2169
Thomas Wouters477c8d52006-05-27 19:21:47 +00002170static PyObject *
2171codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 const char *encoding, *errors = NULL;
2174 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2175 &encoding, &errors))
2176 return NULL;
2177 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002178}
2179
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002180
Tim Peters5b8132f2003-01-31 15:52:05 +00002181/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002182static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302183test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 struct triple {
2186 long input;
2187 size_t nbits;
2188 int sign;
2189 } testcases[] = {{0, 0, 0},
2190 {1L, 1, 1},
2191 {-1L, 1, -1},
2192 {2L, 2, 1},
2193 {-2L, 2, -1},
2194 {3L, 2, 1},
2195 {-3L, 2, -1},
2196 {4L, 3, 1},
2197 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002198 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 {-0x7fffL, 15, -1},
2200 {0xffffL, 16, 1},
2201 {-0xffffL, 16, -1},
2202 {0xfffffffL, 28, 1},
2203 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002204 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002205
Victor Stinner63941882011-09-29 00:42:28 +02002206 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002207 size_t nbits;
2208 int sign;
2209 PyObject *plong;
2210
2211 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002212 if (plong == NULL)
2213 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002214 nbits = _PyLong_NumBits(plong);
2215 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 Py_DECREF(plong);
2218 if (nbits != testcases[i].nbits)
2219 return raiseTestError("test_long_numbits",
2220 "wrong result for _PyLong_NumBits");
2221 if (sign != testcases[i].sign)
2222 return raiseTestError("test_long_numbits",
2223 "wrong result for _PyLong_Sign");
2224 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002225 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002226}
2227
Thomas Heller519a0422007-11-15 20:48:54 +00002228/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002229
2230static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302231test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2234 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2235 Py_XDECREF(o1);
2236 Py_XDECREF(o2);
2237 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002238}
2239
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002240static PyObject *
2241raise_exception(PyObject *self, PyObject *args)
2242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 PyObject *exc;
2244 PyObject *exc_args, *v;
2245 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002247 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2248 &exc, &num_args))
2249 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 exc_args = PyTuple_New(num_args);
2252 if (exc_args == NULL)
2253 return NULL;
2254 for (i = 0; i < num_args; ++i) {
2255 v = PyLong_FromLong(i);
2256 if (v == NULL) {
2257 Py_DECREF(exc_args);
2258 return NULL;
2259 }
2260 PyTuple_SET_ITEM(exc_args, i, v);
2261 }
2262 PyErr_SetObject(exc, exc_args);
2263 Py_DECREF(exc_args);
2264 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002265}
Tim Peters91621db2001-06-12 20:10:01 +00002266
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002267static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002268set_errno(PyObject *self, PyObject *args)
2269{
2270 int new_errno;
2271
2272 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2273 return NULL;
2274
2275 errno = new_errno;
2276 Py_RETURN_NONE;
2277}
2278
2279static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002280test_set_exc_info(PyObject *self, PyObject *args)
2281{
2282 PyObject *orig_exc;
2283 PyObject *new_type, *new_value, *new_tb;
2284 PyObject *type, *value, *tb;
2285 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2286 &new_type, &new_value, &new_tb))
2287 return NULL;
2288
2289 PyErr_GetExcInfo(&type, &value, &tb);
2290
2291 Py_INCREF(new_type);
2292 Py_INCREF(new_value);
2293 Py_INCREF(new_tb);
2294 PyErr_SetExcInfo(new_type, new_value, new_tb);
2295
2296 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2297 Py_XDECREF(type);
2298 Py_XDECREF(value);
2299 Py_XDECREF(tb);
2300 return orig_exc;
2301}
Benjamin Peterson16323982010-02-03 01:13:41 +00002302
2303static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002304
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002305static PyObject *
2306test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 if (PyDateTimeAPI) {
2308 if (test_run_counter) {
2309 /* Probably regrtest.py -R */
2310 Py_RETURN_NONE;
2311 }
2312 else {
2313 PyErr_SetString(PyExc_AssertionError,
2314 "PyDateTime_CAPI somehow initialized");
2315 return NULL;
2316 }
2317 }
2318 test_run_counter++;
2319 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 if (PyDateTimeAPI)
2322 Py_RETURN_NONE;
2323 else
2324 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002325}
2326
Paul Ganssle04af5b12018-01-24 17:29:30 -05002327/* Functions exposing the C API type checking for testing */
2328#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2329 PyObject *obj; \
2330 int exact = 0; \
2331 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2332 return NULL; \
2333 } \
2334 int rv = exact?exact_method(obj):check_method(obj); \
2335 if (rv) { \
2336 Py_RETURN_TRUE; \
2337 } else { \
2338 Py_RETURN_FALSE; \
2339 }
2340
2341static PyObject *
2342datetime_check_date(PyObject *self, PyObject *args) {
2343 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2344}
2345
2346static PyObject *
2347datetime_check_time(PyObject *self, PyObject *args) {
2348 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2349}
2350
2351static PyObject *
2352datetime_check_datetime(PyObject *self, PyObject *args) {
2353 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2354}
2355
2356static PyObject *
2357datetime_check_delta(PyObject *self, PyObject *args) {
2358 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2359}
2360
2361static PyObject *
2362datetime_check_tzinfo(PyObject *self, PyObject *args) {
2363 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2364}
2365
2366
2367/* Makes three variations on timezone representing UTC-5:
2368 1. timezone with offset and name from PyDateTimeAPI
2369 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2370 3. timezone with offset (no name) from PyTimeZone_FromOffset
2371*/
2372static PyObject *
2373make_timezones_capi(PyObject *self, PyObject *args) {
2374 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2375 PyObject *name = PyUnicode_FromString("EST");
2376
2377 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2378 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2379 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2380
2381 Py_DecRef(offset);
2382 Py_DecRef(name);
2383
2384 PyObject *rv = PyTuple_New(3);
2385
2386 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2387 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2388 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2389
2390 return rv;
2391}
2392
2393static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002394get_timezones_offset_zero(PyObject *self, PyObject *args) {
2395 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2396 PyObject *name = PyUnicode_FromString("");
2397
2398 // These two should return the UTC singleton
2399 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2400 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2401
2402 // This one will return +00:00 zone, but not the UTC singleton
2403 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2404
2405 Py_DecRef(offset);
2406 Py_DecRef(name);
2407
2408 PyObject *rv = PyTuple_New(3);
2409 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2410 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2411 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2412
2413 return rv;
2414}
2415
2416static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002417get_timezone_utc_capi(PyObject* self, PyObject *args) {
2418 int macro = 0;
2419 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2420 return NULL;
2421 }
2422 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002423 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002424 return PyDateTime_TimeZone_UTC;
2425 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002426 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002427 return PyDateTimeAPI->TimeZone_UTC;
2428 }
2429}
2430
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002431static PyObject *
Edison A98ff4d52019-05-17 13:28:42 -07002432get_date_fromdate(PyObject *self, PyObject *args)
2433{
2434 PyObject *rv = NULL;
2435 int macro;
2436 int year, month, day;
2437
2438 if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2439 return NULL;
2440 }
2441
2442 if (macro) {
2443 rv = PyDate_FromDate(year, month, day);
2444 }
2445 else {
2446 rv = PyDateTimeAPI->Date_FromDate(
2447 year, month, day,
2448 PyDateTimeAPI->DateType);
2449 }
2450 return rv;
2451}
2452
2453static PyObject *
2454get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2455{
2456 PyObject *rv = NULL;
2457 int macro;
2458 int year, month, day;
2459 int hour, minute, second, microsecond;
2460
2461 if (!PyArg_ParseTuple(args, "piiiiiii",
2462 &macro,
2463 &year, &month, &day,
2464 &hour, &minute, &second, &microsecond)) {
2465 return NULL;
2466 }
2467
2468 if (macro) {
2469 rv = PyDateTime_FromDateAndTime(
2470 year, month, day,
2471 hour, minute, second, microsecond);
2472 }
2473 else {
2474 rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2475 year, month, day,
2476 hour, minute, second, microsecond,
2477 Py_None,
2478 PyDateTimeAPI->DateTimeType);
2479 }
2480 return rv;
2481}
2482
2483static PyObject *
2484get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2485{
2486 PyObject *rv = NULL;
2487 int macro;
2488 int year, month, day;
2489 int hour, minute, second, microsecond, fold;
2490
2491 if (!PyArg_ParseTuple(args, "piiiiiiii",
2492 &macro,
2493 &year, &month, &day,
2494 &hour, &minute, &second, &microsecond,
2495 &fold)) {
2496 return NULL;
2497 }
2498
2499 if (macro) {
2500 rv = PyDateTime_FromDateAndTimeAndFold(
2501 year, month, day,
2502 hour, minute, second, microsecond,
2503 fold);
2504 }
2505 else {
2506 rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2507 year, month, day,
2508 hour, minute, second, microsecond,
2509 Py_None,
2510 fold,
2511 PyDateTimeAPI->DateTimeType);
2512 }
2513 return rv;
2514}
2515
2516static PyObject *
2517get_time_fromtime(PyObject *self, PyObject *args)
2518{
2519 PyObject *rv = NULL;
2520 int macro;
2521 int hour, minute, second, microsecond;
2522
2523 if (!PyArg_ParseTuple(args, "piiii",
2524 &macro,
2525 &hour, &minute, &second, &microsecond)) {
2526 return NULL;
2527 }
2528
2529 if (macro) {
2530 rv = PyTime_FromTime(hour, minute, second, microsecond);
2531 }
2532 else {
2533 rv = PyDateTimeAPI->Time_FromTime(
2534 hour, minute, second, microsecond,
2535 Py_None,
2536 PyDateTimeAPI->TimeType);
2537 }
2538 return rv;
2539}
2540
2541static PyObject *
2542get_time_fromtimeandfold(PyObject *self, PyObject *args)
2543{
2544 PyObject *rv = NULL;
2545 int macro;
2546 int hour, minute, second, microsecond, fold;
2547
2548 if (!PyArg_ParseTuple(args, "piiiii",
2549 &macro,
2550 &hour, &minute, &second, &microsecond,
2551 &fold)) {
2552 return NULL;
2553 }
2554
2555 if (macro) {
2556 rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2557 }
2558 else {
2559 rv = PyDateTimeAPI->Time_FromTimeAndFold(
2560 hour, minute, second, microsecond,
2561 Py_None,
2562 fold,
2563 PyDateTimeAPI->TimeType);
2564 }
2565 return rv;
2566}
2567
2568static PyObject *
2569get_delta_fromdsu(PyObject *self, PyObject *args)
2570{
2571 PyObject *rv = NULL;
2572 int macro;
2573 int days, seconds, microseconds;
2574
2575 if (!PyArg_ParseTuple(args, "piii",
2576 &macro,
2577 &days, &seconds, &microseconds)) {
2578 return NULL;
2579 }
2580
2581 if (macro) {
2582 rv = PyDelta_FromDSU(days, seconds, microseconds);
2583 }
2584 else {
2585 rv = PyDateTimeAPI->Delta_FromDelta(
2586 days, seconds, microseconds, 1,
2587 PyDateTimeAPI->DeltaType);
2588 }
2589
2590 return rv;
2591}
2592
2593static PyObject *
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002594get_date_fromtimestamp(PyObject* self, PyObject *args)
2595{
2596 PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2597 int macro = 0;
2598
2599 if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2600 return NULL;
2601 }
2602
2603 // Construct the argument tuple
2604 if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2605 return NULL;
2606 }
2607
2608 // Pass along to the API function
2609 if (macro) {
2610 rv = PyDate_FromTimestamp(tsargs);
2611 }
2612 else {
2613 rv = PyDateTimeAPI->Date_FromTimestamp(
2614 (PyObject *)PyDateTimeAPI->DateType, tsargs
2615 );
2616 }
2617
2618 Py_DECREF(tsargs);
2619 return rv;
2620}
2621
2622static PyObject *
2623get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2624{
2625 int macro = 0;
2626 int usetz = 0;
2627 PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2628 if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2629 return NULL;
2630 }
2631
2632 // Construct the argument tuple
2633 if (usetz) {
2634 tsargs = PyTuple_Pack(2, ts, tzinfo);
2635 }
2636 else {
2637 tsargs = PyTuple_Pack(1, ts);
2638 }
2639
2640 if (tsargs == NULL) {
2641 return NULL;
2642 }
2643
2644 // Pass along to the API function
2645 if (macro) {
2646 rv = PyDateTime_FromTimestamp(tsargs);
2647 }
2648 else {
2649 rv = PyDateTimeAPI->DateTime_FromTimestamp(
2650 (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2651 );
2652 }
2653
2654 Py_DECREF(tsargs);
2655 return rv;
2656}
2657
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002658static PyObject *
2659test_PyDateTime_GET(PyObject *self, PyObject *obj)
2660{
2661 int year, month, day;
2662
2663 year = PyDateTime_GET_YEAR(obj);
2664 month = PyDateTime_GET_MONTH(obj);
2665 day = PyDateTime_GET_DAY(obj);
2666
2667 return Py_BuildValue("(lll)", year, month, day);
2668}
2669
2670static PyObject *
2671test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
2672{
2673 int hour, minute, second, microsecond;
2674
2675 hour = PyDateTime_DATE_GET_HOUR(obj);
2676 minute = PyDateTime_DATE_GET_MINUTE(obj);
2677 second = PyDateTime_DATE_GET_SECOND(obj);
2678 microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
2679
2680 return Py_BuildValue("(llll)", hour, minute, second, microsecond);
2681}
2682
2683static PyObject *
2684test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
2685{
2686 int hour, minute, second, microsecond;
2687
2688 hour = PyDateTime_TIME_GET_HOUR(obj);
2689 minute = PyDateTime_TIME_GET_MINUTE(obj);
2690 second = PyDateTime_TIME_GET_SECOND(obj);
2691 microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
2692
2693 return Py_BuildValue("(llll)", hour, minute, second, microsecond);
2694}
2695
2696static PyObject *
2697test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
2698{
2699 int days, seconds, microseconds;
2700
2701 days = PyDateTime_DELTA_GET_DAYS(obj);
2702 seconds = PyDateTime_DELTA_GET_SECONDS(obj);
2703 microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
2704
2705 return Py_BuildValue("(lll)", days, seconds, microseconds);
2706}
Benjamin Peterson16323982010-02-03 01:13:41 +00002707
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002708/* test_thread_state spawns a thread of its own, and that thread releases
2709 * `thread_done` when it's finished. The driver code has to know when the
2710 * thread finishes, because the thread uses a PyObject (the callable) that
2711 * may go away when the driver finishes. The former lack of this explicit
2712 * synchronization caused rare segfaults, so rare that they were seen only
2713 * on a Mac buildbot (although they were possible on any box).
2714 */
2715static PyThread_type_lock thread_done = NULL;
2716
Benjamin Petersona786b022008-08-25 21:05:21 +00002717static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002718_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002719{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 PyObject *rc;
2721 int success;
2722 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002723 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 success = (rc != NULL);
2725 Py_XDECREF(rc);
2726 PyGILState_Release(s);
2727 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002728}
2729
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002730/* Same thing, but releases `thread_done` when it returns. This variant
2731 * should be called only from threads spawned by test_thread_state().
2732 */
2733static void
2734_make_call_from_thread(void *callable)
2735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 _make_call(callable);
2737 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002738}
2739
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002740static PyObject *
2741test_thread_state(PyObject *self, PyObject *args)
2742{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 PyObject *fn;
2744 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2747 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 if (!PyCallable_Check(fn)) {
2750 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
Victor Stinnerdaa97562020-02-07 03:37:06 +01002751 Py_TYPE(fn)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 return NULL;
2753 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 thread_done = PyThread_allocate_lock();
2756 if (thread_done == NULL)
2757 return PyErr_NoMemory();
2758 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 /* Start a new thread with our callback. */
2761 PyThread_start_new_thread(_make_call_from_thread, fn);
2762 /* Make the callback with the thread lock held by this thread */
2763 success &= _make_call(fn);
2764 /* Do it all again, but this time with the thread-lock released */
2765 Py_BEGIN_ALLOW_THREADS
2766 success &= _make_call(fn);
2767 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2768 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770 /* And once more with and without a thread
2771 XXX - should use a lock and work out exactly what we are trying
2772 to test <wink>
2773 */
2774 Py_BEGIN_ALLOW_THREADS
2775 PyThread_start_new_thread(_make_call_from_thread, fn);
2776 success &= _make_call(fn);
2777 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2778 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 /* Release lock we acquired above. This is required on HP-UX. */
2781 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 PyThread_free_lock(thread_done);
2784 if (!success)
2785 return NULL;
2786 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002787}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002788
2789/* test Py_AddPendingCalls using threads */
2790static int _pending_callback(void *arg)
2791{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002792 /* we assume the argument is callable object to which we own a reference */
2793 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002794 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 Py_DECREF(callable);
2796 Py_XDECREF(r);
2797 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002798}
2799
2800/* The following requests n callbacks to _pending_callback. It can be
2801 * run from any python thread.
2802 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07002803static PyObject *
2804pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002805{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806 PyObject *callable;
2807 int r;
2808 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2809 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 /* create the reference for the callbackwhile we hold the lock */
2812 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 Py_BEGIN_ALLOW_THREADS
2815 r = Py_AddPendingCall(&_pending_callback, callable);
2816 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 if (r<0) {
2819 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002820 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002822 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002823}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002824
Neal Norwitzb0d26332007-08-25 00:49:05 +00002825/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002826static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002827test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002828{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 PyObject *result;
2830 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002831
Alexander Belopolskye239d232010-12-08 23:31:48 +00002832#define CHECK_1_FORMAT(FORMAT, TYPE) \
2833 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2834 if (result == NULL) \
2835 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002836 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002837 msg = FORMAT " failed at 1"; \
2838 goto Fail; \
2839 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 CHECK_1_FORMAT("%d", int);
2843 CHECK_1_FORMAT("%ld", long);
2844 /* The z width modifier was added in Python 2.5. */
2845 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 /* The u type code was added in Python 2.5. */
2848 CHECK_1_FORMAT("%u", unsigned int);
2849 CHECK_1_FORMAT("%lu", unsigned long);
2850 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002852 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002853 CHECK_1_FORMAT("%llu", unsigned long long);
2854 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002856 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002857
2858 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 Py_XDECREF(result);
2860 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002861
2862#undef CHECK_1_FORMAT
2863}
2864
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002865
2866static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302867test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2869 int result;
2870 if (py_s == NULL)
2871 return NULL;
2872 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2873 Py_DECREF(py_s);
2874 if (!result) {
2875 PyErr_SetString(TestError, "Python string ending in NULL "
2876 "should not compare equal to c string.");
2877 return NULL;
2878 }
2879 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002880}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002881
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002882/* This is here to provide a docstring for test_descr. */
2883static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302884test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002885{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002886 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002887}
2888
Mark Dickinson725bfd82009-05-03 20:33:40 +00002889/* Test PyOS_string_to_double. */
2890static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302891test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002893 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002895#define CHECK_STRING(STR, expected) \
2896 result = PyOS_string_to_double(STR, NULL, NULL); \
2897 if (result == -1.0 && PyErr_Occurred()) \
2898 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002899 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002900 msg = "conversion of " STR " to float failed"; \
2901 goto fail; \
2902 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002904#define CHECK_INVALID(STR) \
2905 result = PyOS_string_to_double(STR, NULL, NULL); \
2906 if (result == -1.0 && PyErr_Occurred()) { \
2907 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2908 PyErr_Clear(); \
2909 else \
2910 return NULL; \
2911 } \
2912 else { \
2913 msg = "conversion of " STR " didn't raise ValueError"; \
2914 goto fail; \
2915 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 CHECK_STRING("0.1", 0.1);
2918 CHECK_STRING("1.234", 1.234);
2919 CHECK_STRING("-1.35", -1.35);
2920 CHECK_STRING(".1e01", 1.0);
2921 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002923 CHECK_INVALID(" 0.1");
2924 CHECK_INVALID("\t\n-3");
2925 CHECK_INVALID(".123 ");
2926 CHECK_INVALID("3\n");
2927 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002930 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002932#undef CHECK_STRING
2933#undef CHECK_INVALID
2934}
2935
2936
Benjamin Petersonb173f782009-05-05 22:31:58 +00002937/* Coverage testing of capsule objects. */
2938
2939static const char *capsule_name = "capsule name";
2940static char *capsule_pointer = "capsule pointer";
2941static char *capsule_context = "capsule context";
2942static const char *capsule_error = NULL;
2943static int
2944capsule_destructor_call_count = 0;
2945
2946static void
2947capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 capsule_destructor_call_count++;
2949 if (PyCapsule_GetContext(o) != capsule_context) {
2950 capsule_error = "context did not match in destructor!";
2951 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
2952 capsule_error = "destructor did not match in destructor! (woah!)";
2953 } else if (PyCapsule_GetName(o) != capsule_name) {
2954 capsule_error = "name did not match in destructor!";
2955 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
2956 capsule_error = "pointer did not match in destructor!";
2957 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00002958}
2959
2960typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002961 char *name;
2962 char *module;
2963 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002964} known_capsule;
2965
2966static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002967test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00002968{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 PyObject *object;
2970 const char *error = NULL;
2971 void *pointer;
2972 void *pointer2;
2973 known_capsule known_capsules[] = {
2974 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
2975 KNOWN_CAPSULE("_socket", "CAPI"),
2976 KNOWN_CAPSULE("_curses", "_C_API"),
2977 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
2978 { NULL, NULL },
2979 };
2980 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00002981
2982#define FAIL(x) { error = (x); goto exit; }
2983
2984#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 if (capsule_error) { \
2986 FAIL(capsule_error); \
2987 } \
2988 else if (!capsule_destructor_call_count) { \
2989 FAIL("destructor not called!"); \
2990 } \
2991 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00002992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002993 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
2994 PyCapsule_SetContext(object, capsule_context);
2995 capsule_destructor(object);
2996 CHECK_DESTRUCTOR;
2997 Py_DECREF(object);
2998 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00002999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003000 object = PyCapsule_New(known, "ignored", NULL);
3001 PyCapsule_SetPointer(object, capsule_pointer);
3002 PyCapsule_SetName(object, capsule_name);
3003 PyCapsule_SetDestructor(object, capsule_destructor);
3004 PyCapsule_SetContext(object, capsule_context);
3005 capsule_destructor(object);
3006 CHECK_DESTRUCTOR;
3007 /* intentionally access using the wrong name */
3008 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
3009 if (!PyErr_Occurred()) {
3010 FAIL("PyCapsule_GetPointer should have failed but did not!");
3011 }
3012 PyErr_Clear();
3013 if (pointer2) {
3014 if (pointer2 == capsule_pointer) {
3015 FAIL("PyCapsule_GetPointer should not have"
3016 " returned the internal pointer!");
3017 } else {
3018 FAIL("PyCapsule_GetPointer should have "
3019 "returned NULL pointer but did not!");
3020 }
3021 }
3022 PyCapsule_SetDestructor(object, NULL);
3023 Py_DECREF(object);
3024 if (capsule_destructor_call_count) {
3025 FAIL("destructor called when it should not have been!");
3026 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003028 for (known = &known_capsules[0]; known->module != NULL; known++) {
3029 /* yeah, ordinarily I wouldn't do this either,
3030 but it's fine for this test harness.
3031 */
3032 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003033#undef FAIL
3034#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035 { \
3036 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
3037 x, known->module, known->attribute); \
3038 error = buffer; \
3039 goto exit; \
3040 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042 PyObject *module = PyImport_ImportModule(known->module);
3043 if (module) {
3044 pointer = PyCapsule_Import(known->name, 0);
3045 if (!pointer) {
3046 Py_DECREF(module);
3047 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
3048 }
3049 object = PyObject_GetAttrString(module, known->attribute);
3050 if (!object) {
3051 Py_DECREF(module);
3052 return NULL;
3053 }
3054 pointer2 = PyCapsule_GetPointer(object,
3055 "weebles wobble but they don't fall down");
3056 if (!PyErr_Occurred()) {
3057 Py_DECREF(object);
3058 Py_DECREF(module);
3059 FAIL("PyCapsule_GetPointer should have failed but did not!");
3060 }
3061 PyErr_Clear();
3062 if (pointer2) {
3063 Py_DECREF(module);
3064 Py_DECREF(object);
3065 if (pointer2 == pointer) {
3066 FAIL("PyCapsule_GetPointer should not have"
3067 " returned its internal pointer!");
3068 } else {
3069 FAIL("PyCapsule_GetPointer should have"
3070 " returned NULL pointer but did not!");
3071 }
3072 }
3073 Py_DECREF(object);
3074 Py_DECREF(module);
3075 }
3076 else
3077 PyErr_Clear();
3078 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003079
3080 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 if (error) {
3082 return raiseTestError("test_capsule", error);
3083 }
3084 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003085#undef FAIL
3086}
3087
Guido van Rossumddefaf32007-01-14 03:31:43 +00003088#ifdef HAVE_GETTIMEOFDAY
3089/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00003090static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003091{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003092 e->tv_sec -= s->tv_sec;
3093 e->tv_usec -= s->tv_usec;
3094 if (e->tv_usec < 0) {
3095 e->tv_sec -=1;
3096 e->tv_usec += 1000000;
3097 }
3098 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003099}
3100
3101static PyObject *
3102profile_int(PyObject *self, PyObject* args)
3103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003104 int i, k;
3105 struct timeval start, stop;
3106 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003108 /* Test 1: Allocate and immediately deallocate
3109 many small integers */
3110 gettimeofday(&start, NULL);
3111 for(k=0; k < 20000; k++)
3112 for(i=0; i < 1000; i++) {
3113 single = PyLong_FromLong(i);
3114 Py_DECREF(single);
3115 }
3116 gettimeofday(&stop, NULL);
3117 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003119 /* Test 2: Allocate and immediately deallocate
3120 many large integers */
3121 gettimeofday(&start, NULL);
3122 for(k=0; k < 20000; k++)
3123 for(i=0; i < 1000; i++) {
3124 single = PyLong_FromLong(i+1000000);
3125 Py_DECREF(single);
3126 }
3127 gettimeofday(&stop, NULL);
3128 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003130 /* Test 3: Allocate a few integers, then release
3131 them all simultaneously. */
3132 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02003133 if (multiple == NULL)
3134 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003135 gettimeofday(&start, NULL);
3136 for(k=0; k < 20000; k++) {
3137 for(i=0; i < 1000; i++) {
3138 multiple[i] = PyLong_FromLong(i+1000000);
3139 }
3140 for(i=0; i < 1000; i++) {
3141 Py_DECREF(multiple[i]);
3142 }
3143 }
3144 gettimeofday(&stop, NULL);
3145 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003146 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 /* Test 4: Allocate many integers, then release
3149 them all simultaneously. */
3150 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003151 if (multiple == NULL)
3152 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 gettimeofday(&start, NULL);
3154 for(k=0; k < 20; k++) {
3155 for(i=0; i < 1000000; i++) {
3156 multiple[i] = PyLong_FromLong(i+1000000);
3157 }
3158 for(i=0; i < 1000000; i++) {
3159 Py_DECREF(multiple[i]);
3160 }
3161 }
3162 gettimeofday(&stop, NULL);
3163 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003164 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003166 /* Test 5: Allocate many integers < 32000 */
3167 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003168 if (multiple == NULL)
3169 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003170 gettimeofday(&start, NULL);
3171 for(k=0; k < 10; k++) {
3172 for(i=0; i < 1000000; i++) {
3173 multiple[i] = PyLong_FromLong(i+1000);
3174 }
3175 for(i=0; i < 1000000; i++) {
3176 Py_DECREF(multiple[i]);
3177 }
3178 }
3179 gettimeofday(&stop, NULL);
3180 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003181 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 /* Test 6: Perform small int addition */
3184 op1 = PyLong_FromLong(1);
3185 gettimeofday(&start, NULL);
3186 for(i=0; i < 10000000; i++) {
3187 result = PyNumber_Add(op1, op1);
3188 Py_DECREF(result);
3189 }
3190 gettimeofday(&stop, NULL);
3191 Py_DECREF(op1);
3192 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 /* Test 7: Perform medium int addition */
3195 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003196 if (op1 == NULL)
3197 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003198 gettimeofday(&start, NULL);
3199 for(i=0; i < 10000000; i++) {
3200 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003201 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003202 }
3203 gettimeofday(&stop, NULL);
3204 Py_DECREF(op1);
3205 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003206
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003207 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003208}
3209#endif
3210
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003211/* To test the format of tracebacks as printed out. */
3212static PyObject *
3213traceback_print(PyObject *self, PyObject *args)
3214{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 PyObject *file;
3216 PyObject *traceback;
3217 int result;
3218
3219 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3220 &traceback, &file))
3221 return NULL;
3222
3223 result = PyTraceBack_Print(traceback, file);
3224 if (result < 0)
3225 return NULL;
3226 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003227}
3228
Benjamin Petersone6528212008-07-15 15:32:09 +00003229/* To test the format of exceptions as printed out. */
3230static PyObject *
3231exception_print(PyObject *self, PyObject *args)
3232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 PyObject *value;
3234 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 if (!PyArg_ParseTuple(args, "O:exception_print",
3237 &value))
3238 return NULL;
3239 if (!PyExceptionInstance_Check(value)) {
3240 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3241 return NULL;
3242 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003244 tb = PyException_GetTraceback(value);
3245 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3246 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003248 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003249}
3250
3251
3252
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003253
3254/* reliably raise a MemoryError */
3255static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303256raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003257{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003258 PyErr_NoMemory();
3259 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003260}
3261
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003262/* Issue 6012 */
3263static PyObject *str1, *str2;
3264static int
3265failing_converter(PyObject *obj, void *arg)
3266{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003267 /* Clone str1, then let the conversion fail. */
3268 assert(str1);
3269 str2 = str1;
3270 Py_INCREF(str2);
3271 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003272}
3273static PyObject*
3274argparsing(PyObject *o, PyObject *args)
3275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003276 PyObject *res;
3277 str1 = str2 = NULL;
3278 if (!PyArg_ParseTuple(args, "O&O&",
3279 PyUnicode_FSConverter, &str1,
3280 failing_converter, &str2)) {
3281 if (!str2)
3282 /* argument converter not called? */
3283 return NULL;
3284 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003285 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003286 Py_DECREF(str2);
3287 PyErr_Clear();
3288 return res;
3289 }
3290 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003291}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003292
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003293/* To test that the result of PyCode_NewEmpty has the right members. */
3294static PyObject *
3295code_newempty(PyObject *self, PyObject *args)
3296{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003297 const char *filename;
3298 const char *funcname;
3299 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003301 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3302 &filename, &funcname, &firstlineno))
3303 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003306}
3307
Georg Brandl1e28a272009-12-28 08:41:01 +00003308/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3309 Run via Lib/test/test_exceptions.py */
3310static PyObject *
3311make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 const char *name;
3314 const char *doc = NULL;
3315 PyObject *base = NULL;
3316 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3321 "s|sOO:make_exception_with_doc", kwlist,
3322 &name, &doc, &base, &dict))
3323 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003326}
3327
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003328static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303329make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003330{
3331 Py_buffer info;
3332 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3333 return NULL;
3334 return PyMemoryView_FromBuffer(&info);
3335}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003336
Stefan Krah7213fcc2015-02-01 16:19:23 +01003337static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003338test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003339{
3340 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3341 int init[5] = {0, 1, 2, 3, 4};
3342 Py_ssize_t itemsize = sizeof(int);
3343 Py_ssize_t shape = 5;
3344 Py_ssize_t strides = 2 * itemsize;
3345 Py_buffer view = {
3346 data,
3347 NULL,
3348 5 * itemsize,
3349 itemsize,
3350 1,
3351 1,
3352 NULL,
3353 &shape,
3354 &strides,
3355 NULL,
3356 NULL
3357 };
3358 int *ptr;
3359 int i;
3360
3361 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3362 ptr = view.buf;
3363 for (i = 0; i < 5; i++) {
3364 if (ptr[2*i] != i) {
3365 PyErr_SetString(TestError,
3366 "test_from_contiguous: incorrect result");
3367 return NULL;
3368 }
3369 }
3370
3371 view.buf = &data[8];
3372 view.strides[0] = -2 * itemsize;
3373
3374 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3375 ptr = view.buf;
3376 for (i = 0; i < 5; i++) {
3377 if (*(ptr-2*i) != i) {
3378 PyErr_SetString(TestError,
3379 "test_from_contiguous: incorrect result");
3380 return NULL;
3381 }
3382 }
3383
3384 Py_RETURN_NONE;
3385}
Stefan Krah650c1e82015-02-03 21:43:23 +01003386
Stefan Kraha7559c02015-02-03 22:27:21 +01003387#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003388extern PyTypeObject _PyBytesIOBuffer_Type;
3389
Stefan Krah5178d912015-02-03 16:57:21 +01003390static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003391test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003392{
Stefan Krah650c1e82015-02-03 21:43:23 +01003393 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003394 PyObject *b;
3395 char *dummy[1];
3396 int ret, match;
3397
Stefan Krah650c1e82015-02-03 21:43:23 +01003398 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003399 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3400 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3401 PyErr_Clear();
3402 if (ret != -1 || match == 0)
3403 goto error;
3404
Stefan Krah650c1e82015-02-03 21:43:23 +01003405 /* bytesiobuf_getbuffer() */
3406 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003407 if (b == NULL) {
3408 return NULL;
3409 }
3410
3411 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3412 Py_DECREF(b);
3413 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3414 PyErr_Clear();
3415 if (ret != -1 || match == 0)
3416 goto error;
3417
3418 Py_RETURN_NONE;
3419
3420error:
3421 PyErr_SetString(TestError,
3422 "test_pep3118_obsolete_write_locks: failure");
3423 return NULL;
3424}
Stefan Kraha7559c02015-02-03 22:27:21 +01003425#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003426
Stefan Krah650c1e82015-02-03 21:43:23 +01003427/* This tests functions that historically supported write locks. It is
3428 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3429 is entitled to segfault in that case. */
3430static PyObject *
3431getbuffer_with_null_view(PyObject* self, PyObject *obj)
3432{
3433 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3434 return NULL;
3435
3436 Py_RETURN_NONE;
3437}
3438
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03003439/* PyBuffer_SizeFromFormat() */
3440static PyObject *
3441test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
3442{
3443 const char *format;
3444 Py_ssize_t result;
3445
3446 if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
3447 &format)) {
3448 return NULL;
3449 }
3450
3451 result = PyBuffer_SizeFromFormat(format);
3452 if (result == -1) {
3453 return NULL;
3454 }
3455
3456 return PyLong_FromSsize_t(result);
3457}
3458
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003459/* Test that the fatal error from not having a current thread doesn't
3460 cause an infinite loop. Run via Lib/test/test_capi.py */
3461static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303462crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003463{
3464 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003465 /* Using PyThreadState_Get() directly allows the test to pass in
3466 !pydebug mode. However, the test only actually tests anything
3467 in pydebug mode, since that's where the infinite loop was in
3468 the first place. */
3469 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003470 Py_END_ALLOW_THREADS
3471 return NULL;
3472}
3473
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003474/* To run some code in a sub-interpreter. */
3475static PyObject *
3476run_in_subinterp(PyObject *self, PyObject *args)
3477{
3478 const char *code;
3479 int r;
3480 PyThreadState *substate, *mainstate;
Guido van Rossum9d197c72020-06-27 17:33:49 -07003481 /* only initialise 'cflags.cf_flags' to test backwards compatibility */
3482 PyCompilerFlags cflags = {0};
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003483
3484 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3485 &code))
3486 return NULL;
3487
3488 mainstate = PyThreadState_Get();
3489
3490 PyThreadState_Swap(NULL);
3491
3492 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003493 if (substate == NULL) {
3494 /* Since no new thread state was created, there is no exception to
3495 propagate; raise a fresh one after swapping in the old thread
3496 state. */
3497 PyThreadState_Swap(mainstate);
3498 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3499 return NULL;
3500 }
Guido van Rossum9d197c72020-06-27 17:33:49 -07003501 r = PyRun_SimpleStringFlags(code, &cflags);
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003502 Py_EndInterpreter(substate);
3503
3504 PyThreadState_Swap(mainstate);
3505
3506 return PyLong_FromLong(r);
3507}
3508
Victor Stinner3c1b3792014-02-17 00:02:43 +01003509static int
3510check_time_rounding(int round)
3511{
Victor Stinner74474232015-09-02 01:43:56 +02003512 if (round != _PyTime_ROUND_FLOOR
3513 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003514 && round != _PyTime_ROUND_HALF_EVEN
3515 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003516 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3517 return -1;
3518 }
3519 return 0;
3520}
3521
Victor Stinner5d272cc2012-03-13 13:35:55 +01003522static PyObject *
3523test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3524{
3525 PyObject *obj;
3526 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003527 int round;
3528 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003529 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003530 if (check_time_rounding(round) < 0)
3531 return NULL;
3532 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003533 return NULL;
3534 return _PyLong_FromTime_t(sec);
3535}
3536
3537static PyObject *
3538test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3539{
3540 PyObject *obj;
3541 time_t sec;
3542 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003543 int round;
3544 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003545 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003546 if (check_time_rounding(round) < 0)
3547 return NULL;
3548 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003549 return NULL;
3550 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3551}
3552
Victor Stinner643cd682012-03-02 22:54:03 +01003553static PyObject *
3554test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3555{
3556 PyObject *obj;
3557 time_t sec;
3558 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003559 int round;
3560 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003561 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003562 if (check_time_rounding(round) < 0)
3563 return NULL;
3564 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003565 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003566 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003567}
3568
Antoine Pitrou796564c2013-07-30 19:59:21 +02003569static void
3570slot_tp_del(PyObject *self)
3571{
3572 _Py_IDENTIFIER(__tp_del__);
3573 PyObject *del, *res;
3574 PyObject *error_type, *error_value, *error_traceback;
3575
3576 /* Temporarily resurrect the object. */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003577 assert(Py_REFCNT(self) == 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003578 Py_SET_REFCNT(self, 1);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003579
3580 /* Save the current exception, if any. */
3581 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3582
3583 /* Execute __del__ method, if any. */
3584 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3585 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003586 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003587 if (res == NULL)
3588 PyErr_WriteUnraisable(del);
3589 else
3590 Py_DECREF(res);
3591 Py_DECREF(del);
3592 }
3593
3594 /* Restore the saved exception. */
3595 PyErr_Restore(error_type, error_value, error_traceback);
3596
3597 /* Undo the temporary resurrection; can't use DECREF here, it would
3598 * cause a recursive call.
3599 */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003600 assert(Py_REFCNT(self) > 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003601 Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
3602 if (Py_REFCNT(self) == 0) {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003603 /* this is the normal path out */
3604 return;
3605 }
Antoine Pitrou796564c2013-07-30 19:59:21 +02003606
3607 /* __del__ resurrected it! Make it look like the original Py_DECREF
3608 * never happened.
3609 */
3610 {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003611 Py_ssize_t refcnt = Py_REFCNT(self);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003612 _Py_NewReference(self);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003613 Py_SET_REFCNT(self, refcnt);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003614 }
Pablo Galindof13072b2020-04-11 01:21:54 +01003615 assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self));
Victor Stinner49932fe2020-02-03 17:55:05 +01003616 /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
3617 _Py_RefTotal, so we need to undo that. */
3618#ifdef Py_REF_DEBUG
3619 _Py_RefTotal--;
3620#endif
Antoine Pitrou796564c2013-07-30 19:59:21 +02003621}
3622
3623static PyObject *
3624with_tp_del(PyObject *self, PyObject *args)
3625{
3626 PyObject *obj;
3627 PyTypeObject *tp;
3628
3629 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3630 return NULL;
3631 tp = (PyTypeObject *) obj;
3632 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3633 PyErr_Format(PyExc_TypeError,
3634 "heap type expected, got %R", obj);
3635 return NULL;
3636 }
3637 tp->tp_del = slot_tp_del;
3638 Py_INCREF(obj);
3639 return obj;
3640}
3641
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003642static PyMethodDef ml;
3643
3644static PyObject *
3645create_cfunction(PyObject *self, PyObject *args)
3646{
3647 return PyCFunction_NewEx(&ml, self, NULL);
3648}
3649
3650static PyMethodDef ml = {
3651 "create_cfunction",
3652 create_cfunction,
3653 METH_NOARGS,
3654 NULL
3655};
3656
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003657static PyObject *
3658_test_incref(PyObject *ob)
3659{
3660 Py_INCREF(ob);
3661 return ob;
3662}
3663
3664static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303665test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003666{
3667 PyObject *obj = PyLong_FromLong(0);
3668 Py_XINCREF(_test_incref(obj));
3669 Py_DECREF(obj);
3670 Py_DECREF(obj);
3671 Py_DECREF(obj);
3672 Py_RETURN_NONE;
3673}
3674
3675static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303676test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003677{
3678 PyObject *obj = PyLong_FromLong(0);
3679 Py_INCREF(_test_incref(obj));
3680 Py_DECREF(obj);
3681 Py_DECREF(obj);
3682 Py_DECREF(obj);
3683 Py_RETURN_NONE;
3684}
3685
3686static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303687test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003688{
3689 Py_XDECREF(PyLong_FromLong(0));
3690 Py_RETURN_NONE;
3691}
3692
3693static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303694test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003695{
3696 Py_DECREF(PyLong_FromLong(0));
3697 Py_RETURN_NONE;
3698}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003699
Victor Stinner0507bf52013-07-07 02:05:46 +02003700static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003701test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3702 PyObject *Py_UNUSED(args))
3703{
3704 PyStructSequence_Desc descr;
3705 PyStructSequence_Field descr_fields[3];
3706
3707 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3708 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3709 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3710
3711 descr.name = "_testcapi.test_descr";
3712 descr.doc = "This is used to test for memory leaks in NewType";
3713 descr.fields = descr_fields;
3714 descr.n_in_sequence = 1;
3715
3716 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3717 assert(structseq_type != NULL);
3718 assert(PyType_Check(structseq_type));
3719 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3720 Py_DECREF(structseq_type);
3721
3722 Py_RETURN_NONE;
3723}
3724
3725static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303726test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003727{
3728 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003729 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003730 Py_DecRef(obj);
3731 Py_DecRef(obj);
3732 Py_RETURN_NONE;
3733}
3734
3735static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303736test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003737{
3738 void *ptr;
3739
Victor Stinnerdb067af2014-05-02 22:31:14 +02003740 ptr = PyMem_RawMalloc(0);
3741 if (ptr == NULL) {
3742 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3743 return NULL;
3744 }
3745 PyMem_RawFree(ptr);
3746
3747 ptr = PyMem_RawCalloc(0, 0);
3748 if (ptr == NULL) {
3749 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3750 return NULL;
3751 }
3752 PyMem_RawFree(ptr);
3753
Victor Stinner0507bf52013-07-07 02:05:46 +02003754 ptr = PyMem_Malloc(0);
3755 if (ptr == NULL) {
3756 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3757 return NULL;
3758 }
3759 PyMem_Free(ptr);
3760
Victor Stinnerdb067af2014-05-02 22:31:14 +02003761 ptr = PyMem_Calloc(0, 0);
3762 if (ptr == NULL) {
3763 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3764 return NULL;
3765 }
3766 PyMem_Free(ptr);
3767
Victor Stinner0507bf52013-07-07 02:05:46 +02003768 ptr = PyObject_Malloc(0);
3769 if (ptr == NULL) {
3770 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3771 return NULL;
3772 }
3773 PyObject_Free(ptr);
3774
Victor Stinnerdb067af2014-05-02 22:31:14 +02003775 ptr = PyObject_Calloc(0, 0);
3776 if (ptr == NULL) {
3777 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3778 return NULL;
3779 }
3780 PyObject_Free(ptr);
3781
Victor Stinner0507bf52013-07-07 02:05:46 +02003782 Py_RETURN_NONE;
3783}
3784
3785typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003786 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003787
3788 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003789 size_t calloc_nelem;
3790 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003791 void *realloc_ptr;
3792 size_t realloc_new_size;
3793 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003794 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003795} alloc_hook_t;
3796
Victor Stinner9ed83c42017-10-31 12:18:10 -07003797static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003798{
3799 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003800 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003801 hook->malloc_size = size;
3802 return hook->alloc.malloc(hook->alloc.ctx, size);
3803}
3804
Victor Stinner9ed83c42017-10-31 12:18:10 -07003805static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003806{
3807 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003808 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003809 hook->calloc_nelem = nelem;
3810 hook->calloc_elsize = elsize;
3811 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3812}
3813
Victor Stinner9ed83c42017-10-31 12:18:10 -07003814static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003815{
3816 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003817 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003818 hook->realloc_ptr = ptr;
3819 hook->realloc_new_size = new_size;
3820 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3821}
3822
Victor Stinner9ed83c42017-10-31 12:18:10 -07003823static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02003824{
3825 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003826 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003827 hook->free_ptr = ptr;
3828 hook->alloc.free(hook->alloc.ctx, ptr);
3829}
3830
3831static PyObject *
3832test_setallocators(PyMemAllocatorDomain domain)
3833{
3834 PyObject *res = NULL;
3835 const char *error_msg;
3836 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003837 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003838 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003839 void *ptr, *ptr2;
3840
Victor Stinnerdb067af2014-05-02 22:31:14 +02003841 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003842
3843 alloc.ctx = &hook;
3844 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003845 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003846 alloc.realloc = &hook_realloc;
3847 alloc.free = &hook_free;
3848 PyMem_GetAllocator(domain, &hook.alloc);
3849 PyMem_SetAllocator(domain, &alloc);
3850
Victor Stinner9ed83c42017-10-31 12:18:10 -07003851 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02003852 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003853 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02003854 switch(domain)
3855 {
3856 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3857 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3858 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3859 default: ptr = NULL; break;
3860 }
3861
Victor Stinner9ed83c42017-10-31 12:18:10 -07003862#define CHECK_CTX(FUNC) \
3863 if (hook.ctx != &hook) { \
3864 error_msg = FUNC " wrong context"; \
3865 goto fail; \
3866 } \
3867 hook.ctx = NULL; /* reset for next check */
3868
Victor Stinner0507bf52013-07-07 02:05:46 +02003869 if (ptr == NULL) {
3870 error_msg = "malloc failed";
3871 goto fail;
3872 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003873 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003874 if (hook.malloc_size != size) {
3875 error_msg = "malloc invalid size";
3876 goto fail;
3877 }
3878
3879 size2 = 200;
3880 switch(domain)
3881 {
3882 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3883 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3884 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003885 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003886 }
3887
3888 if (ptr2 == NULL) {
3889 error_msg = "realloc failed";
3890 goto fail;
3891 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003892 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003893 if (hook.realloc_ptr != ptr
3894 || hook.realloc_new_size != size2) {
3895 error_msg = "realloc invalid parameters";
3896 goto fail;
3897 }
3898
3899 switch(domain)
3900 {
3901 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3902 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3903 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3904 }
3905
Victor Stinner9ed83c42017-10-31 12:18:10 -07003906 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02003907 if (hook.free_ptr != ptr2) {
3908 error_msg = "free invalid pointer";
3909 goto fail;
3910 }
3911
Victor Stinner9ed83c42017-10-31 12:18:10 -07003912 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02003913 nelem = 2;
3914 elsize = 5;
3915 switch(domain)
3916 {
3917 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3918 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3919 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3920 default: ptr = NULL; break;
3921 }
3922
3923 if (ptr == NULL) {
3924 error_msg = "calloc failed";
3925 goto fail;
3926 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003927 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02003928 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
3929 error_msg = "calloc invalid nelem or elsize";
3930 goto fail;
3931 }
3932
Victor Stinner9ed83c42017-10-31 12:18:10 -07003933 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003934 switch(domain)
3935 {
3936 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
3937 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
3938 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
3939 }
3940
Victor Stinner9ed83c42017-10-31 12:18:10 -07003941 CHECK_CTX("calloc free");
3942 if (hook.free_ptr != ptr) {
3943 error_msg = "calloc free invalid pointer";
3944 goto fail;
3945 }
3946
Victor Stinner0507bf52013-07-07 02:05:46 +02003947 Py_INCREF(Py_None);
3948 res = Py_None;
3949 goto finally;
3950
3951fail:
3952 PyErr_SetString(PyExc_RuntimeError, error_msg);
3953
3954finally:
3955 PyMem_SetAllocator(domain, &hook.alloc);
3956 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003957
3958#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02003959}
3960
3961static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303962test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003963{
3964 return test_setallocators(PYMEM_DOMAIN_RAW);
3965}
3966
3967static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303968test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003969{
3970 return test_setallocators(PYMEM_DOMAIN_MEM);
3971}
3972
3973static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303974test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003975{
3976 return test_setallocators(PYMEM_DOMAIN_OBJ);
3977}
3978
xdegaye85f64302017-07-01 14:14:45 +02003979/* Most part of the following code is inherited from the pyfailmalloc project
3980 * written by Victor Stinner. */
3981static struct {
3982 int installed;
3983 PyMemAllocatorEx raw;
3984 PyMemAllocatorEx mem;
3985 PyMemAllocatorEx obj;
3986} FmHook;
3987
3988static struct {
3989 int start;
3990 int stop;
3991 Py_ssize_t count;
3992} FmData;
3993
3994static int
3995fm_nomemory(void)
3996{
3997 FmData.count++;
3998 if (FmData.count > FmData.start &&
3999 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
4000 return 1;
4001 }
4002 return 0;
4003}
4004
4005static void *
4006hook_fmalloc(void *ctx, size_t size)
4007{
4008 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4009 if (fm_nomemory()) {
4010 return NULL;
4011 }
4012 return alloc->malloc(alloc->ctx, size);
4013}
4014
4015static void *
4016hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
4017{
4018 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4019 if (fm_nomemory()) {
4020 return NULL;
4021 }
4022 return alloc->calloc(alloc->ctx, nelem, elsize);
4023}
4024
4025static void *
4026hook_frealloc(void *ctx, void *ptr, size_t new_size)
4027{
4028 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4029 if (fm_nomemory()) {
4030 return NULL;
4031 }
4032 return alloc->realloc(alloc->ctx, ptr, new_size);
4033}
4034
4035static void
4036hook_ffree(void *ctx, void *ptr)
4037{
4038 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4039 alloc->free(alloc->ctx, ptr);
4040}
4041
4042static void
4043fm_setup_hooks(void)
4044{
4045 PyMemAllocatorEx alloc;
4046
4047 if (FmHook.installed) {
4048 return;
4049 }
4050 FmHook.installed = 1;
4051
4052 alloc.malloc = hook_fmalloc;
4053 alloc.calloc = hook_fcalloc;
4054 alloc.realloc = hook_frealloc;
4055 alloc.free = hook_ffree;
4056 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4057 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4058 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4059
4060 alloc.ctx = &FmHook.raw;
4061 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
4062
4063 alloc.ctx = &FmHook.mem;
4064 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
4065
4066 alloc.ctx = &FmHook.obj;
4067 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
4068}
4069
4070static void
4071fm_remove_hooks(void)
4072{
4073 if (FmHook.installed) {
4074 FmHook.installed = 0;
4075 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4076 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4077 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4078 }
4079}
4080
4081static PyObject*
4082set_nomemory(PyObject *self, PyObject *args)
4083{
4084 /* Memory allocation fails after 'start' allocation requests, and until
4085 * 'stop' allocation requests except when 'stop' is negative or equal
4086 * to 0 (default) in which case allocation failures never stop. */
4087 FmData.count = 0;
4088 FmData.stop = 0;
4089 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
4090 return NULL;
4091 }
4092 fm_setup_hooks();
4093 Py_RETURN_NONE;
4094}
4095
4096static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304097remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02004098{
4099 fm_remove_hooks();
4100 Py_RETURN_NONE;
4101}
4102
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004103PyDoc_STRVAR(docstring_empty,
4104""
4105);
4106
4107PyDoc_STRVAR(docstring_no_signature,
4108"This docstring has no signature."
4109);
4110
4111PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004112"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004113"\n"
4114"This docstring has an invalid signature."
4115);
4116
Larry Hastings2623c8c2014-02-08 22:15:29 -08004117PyDoc_STRVAR(docstring_with_invalid_signature2,
4118"docstring_with_invalid_signature2($module, /, boo)\n"
4119"\n"
4120"--\n"
4121"\n"
4122"This docstring also has an invalid signature."
4123);
4124
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004125PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004126"docstring_with_signature($module, /, sig)\n"
4127"--\n"
4128"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004129"This docstring has a valid signature."
4130);
4131
Zachary Ware8ef887c2015-04-13 18:22:35 -05004132PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4133"docstring_with_signature_but_no_doc($module, /, sig)\n"
4134"--\n"
4135"\n"
4136);
4137
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004138PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004139"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4140"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004141"\n"
4142"\n"
4143"This docstring has a valid signature and some extra newlines."
4144);
4145
Larry Hastings16c51912014-01-07 11:53:01 -08004146PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004147"docstring_with_signature_with_defaults(module, s='avocado',\n"
4148" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4149" local=the_number_three, sys=sys.maxsize,\n"
4150" exp=sys.maxsize - 1)\n"
4151"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004152"\n"
4153"\n"
4154"\n"
4155"This docstring has a valid signature with parameters,\n"
4156"and the parameters take defaults of varying types."
4157);
4158
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004159typedef struct {
4160 PyThread_type_lock start_event;
4161 PyThread_type_lock exit_event;
4162 PyObject *callback;
4163} test_c_thread_t;
4164
4165static void
4166temporary_c_thread(void *data)
4167{
4168 test_c_thread_t *test_c_thread = data;
4169 PyGILState_STATE state;
4170 PyObject *res;
4171
4172 PyThread_release_lock(test_c_thread->start_event);
4173
4174 /* Allocate a Python thread state for this thread */
4175 state = PyGILState_Ensure();
4176
Victor Stinner3466bde2016-09-05 18:16:01 -07004177 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004178 Py_CLEAR(test_c_thread->callback);
4179
4180 if (res == NULL) {
4181 PyErr_Print();
4182 }
4183 else {
4184 Py_DECREF(res);
4185 }
4186
4187 /* Destroy the Python thread state for this thread */
4188 PyGILState_Release(state);
4189
4190 PyThread_release_lock(test_c_thread->exit_event);
4191
4192 PyThread_exit_thread();
4193}
4194
4195static PyObject *
4196call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4197{
4198 PyObject *res = NULL;
4199 test_c_thread_t test_c_thread;
4200 long thread;
4201
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004202 test_c_thread.start_event = PyThread_allocate_lock();
4203 test_c_thread.exit_event = PyThread_allocate_lock();
4204 test_c_thread.callback = NULL;
4205 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4206 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4207 goto exit;
4208 }
4209
4210 Py_INCREF(callback);
4211 test_c_thread.callback = callback;
4212
4213 PyThread_acquire_lock(test_c_thread.start_event, 1);
4214 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4215
4216 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4217 if (thread == -1) {
4218 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4219 PyThread_release_lock(test_c_thread.start_event);
4220 PyThread_release_lock(test_c_thread.exit_event);
4221 goto exit;
4222 }
4223
4224 PyThread_acquire_lock(test_c_thread.start_event, 1);
4225 PyThread_release_lock(test_c_thread.start_event);
4226
4227 Py_BEGIN_ALLOW_THREADS
4228 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4229 PyThread_release_lock(test_c_thread.exit_event);
4230 Py_END_ALLOW_THREADS
4231
4232 Py_INCREF(Py_None);
4233 res = Py_None;
4234
4235exit:
4236 Py_CLEAR(test_c_thread.callback);
4237 if (test_c_thread.start_event)
4238 PyThread_free_lock(test_c_thread.start_event);
4239 if (test_c_thread.exit_event)
4240 PyThread_free_lock(test_c_thread.exit_event);
4241 return res;
4242}
Victor Stinner13105102013-12-13 02:17:29 +01004243
Serhiy Storchakab5181342015-02-06 08:58:56 +02004244/* marshal */
4245
4246static PyObject*
4247pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4248{
4249 long value;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004250 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004251 int version;
4252 FILE *fp;
4253
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004254 if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004255 &value, &filename, &version))
4256 return NULL;
4257
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004258 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004259 if (fp == NULL) {
4260 PyErr_SetFromErrno(PyExc_OSError);
4261 return NULL;
4262 }
4263
4264 PyMarshal_WriteLongToFile(value, fp, version);
4265
4266 fclose(fp);
4267 if (PyErr_Occurred())
4268 return NULL;
4269 Py_RETURN_NONE;
4270}
4271
4272static PyObject*
4273pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4274{
4275 PyObject *obj;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004276 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004277 int version;
4278 FILE *fp;
4279
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004280 if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004281 &obj, &filename, &version))
4282 return NULL;
4283
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004284 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004285 if (fp == NULL) {
4286 PyErr_SetFromErrno(PyExc_OSError);
4287 return NULL;
4288 }
4289
4290 PyMarshal_WriteObjectToFile(obj, fp, version);
4291
4292 fclose(fp);
4293 if (PyErr_Occurred())
4294 return NULL;
4295 Py_RETURN_NONE;
4296}
4297
4298static PyObject*
4299pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4300{
4301 int value;
4302 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004303 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004304 FILE *fp;
4305
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004306 if (!PyArg_ParseTuple(args, "O:pymarshal_read_short_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004307 return NULL;
4308
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004309 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004310 if (fp == NULL) {
4311 PyErr_SetFromErrno(PyExc_OSError);
4312 return NULL;
4313 }
4314
4315 value = PyMarshal_ReadShortFromFile(fp);
4316 pos = ftell(fp);
4317
4318 fclose(fp);
4319 if (PyErr_Occurred())
4320 return NULL;
4321 return Py_BuildValue("il", value, pos);
4322}
4323
4324static PyObject*
4325pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4326{
4327 long value, pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004328 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004329 FILE *fp;
4330
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004331 if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004332 return NULL;
4333
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004334 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004335 if (fp == NULL) {
4336 PyErr_SetFromErrno(PyExc_OSError);
4337 return NULL;
4338 }
4339
4340 value = PyMarshal_ReadLongFromFile(fp);
4341 pos = ftell(fp);
4342
4343 fclose(fp);
4344 if (PyErr_Occurred())
4345 return NULL;
4346 return Py_BuildValue("ll", value, pos);
4347}
4348
4349static PyObject*
4350pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4351{
4352 PyObject *obj;
4353 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004354 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004355 FILE *fp;
4356
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004357 if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004358 return NULL;
4359
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004360 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004361 if (fp == NULL) {
4362 PyErr_SetFromErrno(PyExc_OSError);
4363 return NULL;
4364 }
4365
4366 obj = PyMarshal_ReadLastObjectFromFile(fp);
4367 pos = ftell(fp);
4368
4369 fclose(fp);
4370 return Py_BuildValue("Nl", obj, pos);
4371}
4372
4373static PyObject*
4374pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4375{
4376 PyObject *obj;
4377 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004378 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004379 FILE *fp;
4380
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004381 if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004382 return NULL;
4383
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004384 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004385 if (fp == NULL) {
4386 PyErr_SetFromErrno(PyExc_OSError);
4387 return NULL;
4388 }
4389
4390 obj = PyMarshal_ReadObjectFromFile(fp);
4391 pos = ftell(fp);
4392
4393 fclose(fp);
4394 return Py_BuildValue("Nl", obj, pos);
4395}
4396
Victor Stinnerefde1462015-03-21 15:04:43 +01004397static PyObject*
4398return_null_without_error(PyObject *self, PyObject *args)
4399{
4400 /* invalid call: return NULL without setting an error,
4401 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4402 PyErr_Clear();
4403 return NULL;
4404}
4405
4406static PyObject*
4407return_result_with_error(PyObject *self, PyObject *args)
4408{
4409 /* invalid call: return a result with an error set,
4410 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4411 PyErr_SetNone(PyExc_ValueError);
4412 Py_RETURN_NONE;
4413}
4414
Victor Stinner992c43f2015-03-27 17:12:45 +01004415static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004416test_pytime_fromseconds(PyObject *self, PyObject *args)
4417{
4418 int seconds;
4419 _PyTime_t ts;
4420
4421 if (!PyArg_ParseTuple(args, "i", &seconds))
4422 return NULL;
4423 ts = _PyTime_FromSeconds(seconds);
4424 return _PyTime_AsNanosecondsObject(ts);
4425}
4426
4427static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004428test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4429{
4430 PyObject *obj;
4431 int round;
4432 _PyTime_t ts;
4433
4434 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4435 return NULL;
4436 if (check_time_rounding(round) < 0)
4437 return NULL;
4438 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4439 return NULL;
4440 return _PyTime_AsNanosecondsObject(ts);
4441}
4442
Victor Stinner4bfb4602015-03-27 22:27:24 +01004443static PyObject *
4444test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4445{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004446 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004447 _PyTime_t ts;
4448 double d;
4449
Victor Stinnerc29b5852017-11-02 07:28:27 -07004450 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004451 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004452 }
4453 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4454 return NULL;
4455 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004456 d = _PyTime_AsSecondsDouble(ts);
4457 return PyFloat_FromDouble(d);
4458}
4459
Victor Stinner95e9cef2015-03-28 01:26:47 +01004460static PyObject *
4461test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4462{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004463 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004464 int round;
4465 _PyTime_t t;
4466 struct timeval tv;
4467 PyObject *seconds;
4468
Victor Stinnerc29b5852017-11-02 07:28:27 -07004469 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004470 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004471 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004472 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004473 }
4474 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004475 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004476 }
4477 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4478 return NULL;
4479 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004480
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004481 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004482 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004483 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004484 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004485 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4486}
4487
Victor Stinner34dc0f42015-03-27 18:19:03 +01004488#ifdef HAVE_CLOCK_GETTIME
4489static PyObject *
4490test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4491{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004492 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004493 _PyTime_t t;
4494 struct timespec ts;
4495
Victor Stinnerc29b5852017-11-02 07:28:27 -07004496 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004497 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004498 }
4499 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004500 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004501 }
4502 if (_PyTime_AsTimespec(t, &ts) == -1) {
4503 return NULL;
4504 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004505 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4506}
4507#endif
4508
Victor Stinner62d1c702015-04-01 17:47:07 +02004509static PyObject *
4510test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4511{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004512 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004513 int round;
4514 _PyTime_t t, ms;
4515
Victor Stinnerc29b5852017-11-02 07:28:27 -07004516 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004517 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004518 }
4519 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004520 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004521 }
4522 if (check_time_rounding(round) < 0) {
4523 return NULL;
4524 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004525 ms = _PyTime_AsMilliseconds(t, round);
4526 /* This conversion rely on the fact that _PyTime_t is a number of
4527 nanoseconds */
4528 return _PyTime_AsNanosecondsObject(ms);
4529}
4530
4531static PyObject *
4532test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4533{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004534 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004535 int round;
4536 _PyTime_t t, ms;
4537
Victor Stinnerc29b5852017-11-02 07:28:27 -07004538 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004539 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004540 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004541 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004542 }
4543 if (check_time_rounding(round) < 0) {
4544 return NULL;
4545 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004546 ms = _PyTime_AsMicroseconds(t, round);
4547 /* This conversion rely on the fact that _PyTime_t is a number of
4548 nanoseconds */
4549 return _PyTime_AsNanosecondsObject(ms);
4550}
4551
Victor Stinner50856d52015-10-13 00:11:21 +02004552static PyObject*
Victor Stinner34be807c2016-03-14 12:04:26 +01004553pymem_buffer_overflow(PyObject *self, PyObject *args)
4554{
4555 char *buffer;
4556
4557 /* Deliberate buffer overflow to check that PyMem_Free() detects
4558 the overflow when debug hooks are installed. */
4559 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004560 if (buffer == NULL) {
4561 PyErr_NoMemory();
4562 return NULL;
4563 }
Victor Stinner34be807c2016-03-14 12:04:26 +01004564 buffer[16] = 'x';
4565 PyMem_Free(buffer);
4566
4567 Py_RETURN_NONE;
4568}
4569
4570static PyObject*
4571pymem_api_misuse(PyObject *self, PyObject *args)
4572{
4573 char *buffer;
4574
4575 /* Deliberate misusage of Python allocators:
4576 allococate with PyMem but release with PyMem_Raw. */
4577 buffer = PyMem_Malloc(16);
4578 PyMem_RawFree(buffer);
4579
4580 Py_RETURN_NONE;
4581}
4582
Victor Stinnerc4aec362016-03-14 22:26:53 +01004583static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004584pymem_malloc_without_gil(PyObject *self, PyObject *args)
4585{
4586 char *buffer;
4587
4588 /* Deliberate bug to test debug hooks on Python memory allocators:
4589 call PyMem_Malloc() without holding the GIL */
4590 Py_BEGIN_ALLOW_THREADS
4591 buffer = PyMem_Malloc(10);
4592 Py_END_ALLOW_THREADS
4593
4594 PyMem_Free(buffer);
4595
4596 Py_RETURN_NONE;
4597}
4598
Victor Stinner5d39e042017-11-29 17:20:38 +01004599
4600static PyObject*
4601test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4602{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004603 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004604 if (name == NULL) {
4605 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4606 return NULL;
4607 }
4608 return PyUnicode_FromString(name);
4609}
4610
4611
Victor Stinnerad524372016-03-16 12:12:53 +01004612static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004613test_pyobject_is_freed(const char *test_name, PyObject *op)
Victor Stinner2b00db62019-04-11 11:33:27 +02004614{
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004615 if (!_PyObject_IsFreed(op)) {
4616 return raiseTestError(test_name, "object is not seen as freed");
4617 }
4618 Py_RETURN_NONE;
Victor Stinner2b00db62019-04-11 11:33:27 +02004619}
4620
4621
4622static PyObject*
Victor Stinner68762572019-10-07 18:42:01 +02004623check_pyobject_null_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
4624{
4625 PyObject *op = NULL;
4626 return test_pyobject_is_freed("check_pyobject_null_is_freed", op);
4627}
4628
4629
4630static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004631check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004632{
4633 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4634 if (op == NULL) {
4635 return NULL;
4636 }
4637 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004638 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004639 /* object fields like ob_type are uninitialized! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004640 return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004641}
4642
4643
4644static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004645check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004646{
4647 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4648 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4649 if (op == NULL) {
4650 return NULL;
4651 }
4652 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004653 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004654 /* ob_type field is after the memory block: part of "forbidden bytes"
Min ho Kim39d87b52019-08-31 06:21:19 +10004655 when using debug hooks on memory allocators! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004656 return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004657}
4658
4659
4660static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004661check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004662{
4663 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4664 if (op == NULL) {
4665 return NULL;
4666 }
4667 Py_TYPE(op)->tp_dealloc(op);
4668 /* Reset reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004669 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004670 /* object memory is freed! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004671 return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004672}
4673
4674
4675static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004676pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4677{
4678 char *buffer;
4679
Victor Stinnerad524372016-03-16 12:12:53 +01004680 /* Deliberate bug to test debug hooks on Python memory allocators:
4681 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004682 Py_BEGIN_ALLOW_THREADS
4683 buffer = PyObject_Malloc(10);
4684 Py_END_ALLOW_THREADS
4685
4686 PyObject_Free(buffer);
4687
4688 Py_RETURN_NONE;
4689}
4690
Victor Stinner10b73e12016-03-22 13:39:05 +01004691static PyObject *
4692tracemalloc_track(PyObject *self, PyObject *args)
4693{
4694 unsigned int domain;
4695 PyObject *ptr_obj;
4696 void *ptr;
4697 Py_ssize_t size;
4698 int release_gil = 0;
4699 int res;
4700
4701 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4702 return NULL;
4703 ptr = PyLong_AsVoidPtr(ptr_obj);
4704 if (PyErr_Occurred())
4705 return NULL;
4706
4707 if (release_gil) {
4708 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004709 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004710 Py_END_ALLOW_THREADS
4711 }
4712 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004713 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004714 }
4715
4716 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004717 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004718 return NULL;
4719 }
4720
4721 Py_RETURN_NONE;
4722}
4723
4724static PyObject *
4725tracemalloc_untrack(PyObject *self, PyObject *args)
4726{
4727 unsigned int domain;
4728 PyObject *ptr_obj;
4729 void *ptr;
4730 int res;
4731
4732 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4733 return NULL;
4734 ptr = PyLong_AsVoidPtr(ptr_obj);
4735 if (PyErr_Occurred())
4736 return NULL;
4737
Victor Stinner5ea4c062017-06-20 17:46:36 +02004738 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004739 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004740 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004741 return NULL;
4742 }
4743
4744 Py_RETURN_NONE;
4745}
4746
4747static PyObject *
4748tracemalloc_get_traceback(PyObject *self, PyObject *args)
4749{
4750 unsigned int domain;
4751 PyObject *ptr_obj;
4752 void *ptr;
4753
4754 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4755 return NULL;
4756 ptr = PyLong_AsVoidPtr(ptr_obj);
4757 if (PyErr_Occurred())
4758 return NULL;
4759
Benjamin Petersonca470632016-09-06 13:47:26 -07004760 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004761}
4762
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004763static PyObject *
4764dict_get_version(PyObject *self, PyObject *args)
4765{
4766 PyDictObject *dict;
4767 uint64_t version;
4768
4769 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4770 return NULL;
4771
4772 version = dict->ma_version_tag;
4773
Sergey Fedoseeva9ed91e2019-10-21 11:49:48 +05004774 Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(version));
4775 return PyLong_FromUnsignedLongLong((unsigned long long)version);
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004776}
4777
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004778
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004779static PyObject *
4780raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4781{
4782 PyGenObject *gen;
4783
4784 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4785 return NULL;
4786
4787 /* This is used in a test to check what happens if a signal arrives just
4788 as we're in the process of entering a yield from chain (see
4789 bpo-30039).
4790
4791 Needs to be done in C, because:
4792 - we don't have a Python wrapper for raise()
4793 - we need to make sure that the Python-level signal handler doesn't run
4794 *before* we enter the generator frame, which is impossible in Python
4795 because we check for signals before every bytecode operation.
4796 */
4797 raise(SIGINT);
4798 return _PyGen_Send(gen, Py_None);
4799}
4800
4801
Victor Stinner3b5cf852017-06-09 16:48:45 +02004802static int
4803fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4804{
4805 if (args == Py_None) {
4806 *stack = NULL;
4807 *nargs = 0;
4808 }
4809 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01004810 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02004811 *nargs = PyTuple_GET_SIZE(args);
4812 }
4813 else {
4814 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4815 return -1;
4816 }
4817 return 0;
4818}
4819
4820
4821static PyObject *
4822test_pyobject_fastcall(PyObject *self, PyObject *args)
4823{
4824 PyObject *func, *func_args;
4825 PyObject **stack;
4826 Py_ssize_t nargs;
4827
4828 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4829 return NULL;
4830 }
4831
4832 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4833 return NULL;
4834 }
4835 return _PyObject_FastCall(func, stack, nargs);
4836}
4837
4838
4839static PyObject *
4840test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4841{
4842 PyObject *func, *func_args, *kwargs;
4843 PyObject **stack;
4844 Py_ssize_t nargs;
4845
4846 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4847 return NULL;
4848 }
4849
4850 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4851 return NULL;
4852 }
4853
4854 if (kwargs == Py_None) {
4855 kwargs = NULL;
4856 }
4857 else if (!PyDict_Check(kwargs)) {
4858 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4859 return NULL;
4860 }
4861
Petr Viktorinffd97532020-02-11 17:46:57 +01004862 return PyObject_VectorcallDict(func, stack, nargs, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02004863}
4864
4865
4866static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004867test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02004868{
4869 PyObject *func, *func_args, *kwnames = NULL;
4870 PyObject **stack;
4871 Py_ssize_t nargs, nkw;
4872
4873 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4874 return NULL;
4875 }
4876
4877 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4878 return NULL;
4879 }
4880
4881 if (kwnames == Py_None) {
4882 kwnames = NULL;
4883 }
4884 else if (PyTuple_Check(kwnames)) {
4885 nkw = PyTuple_GET_SIZE(kwnames);
4886 if (nargs < nkw) {
4887 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4888 return NULL;
4889 }
4890 nargs -= nkw;
4891 }
4892 else {
4893 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4894 return NULL;
4895 }
Petr Viktorinffd97532020-02-11 17:46:57 +01004896 return PyObject_Vectorcall(func, stack, nargs, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004897}
4898
4899
4900static PyObject *
4901test_pyvectorcall_call(PyObject *self, PyObject *args)
4902{
4903 PyObject *func;
4904 PyObject *argstuple;
4905 PyObject *kwargs = NULL;
4906
4907 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
4908 return NULL;
4909 }
4910
4911 if (!PyTuple_Check(argstuple)) {
4912 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
4913 return NULL;
4914 }
4915 if (kwargs != NULL && !PyDict_Check(kwargs)) {
4916 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
4917 return NULL;
4918 }
4919
4920 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02004921}
4922
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004923
Victor Stinner64fa4492017-07-10 14:37:49 +02004924static PyObject*
4925stack_pointer(PyObject *self, PyObject *args)
4926{
4927 int v = 5;
4928 return PyLong_FromVoidPtr(&v);
4929}
4930
Victor Stinner3b5cf852017-06-09 16:48:45 +02004931
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02004932#ifdef W_STOPCODE
4933static PyObject*
4934py_w_stopcode(PyObject *self, PyObject *args)
4935{
4936 int sig, status;
4937 if (!PyArg_ParseTuple(args, "i", &sig)) {
4938 return NULL;
4939 }
4940 status = W_STOPCODE(sig);
4941 return PyLong_FromLong(status);
4942}
4943#endif
4944
4945
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004946static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03004947get_mapping_keys(PyObject* self, PyObject *obj)
4948{
4949 return PyMapping_Keys(obj);
4950}
4951
4952static PyObject *
4953get_mapping_values(PyObject* self, PyObject *obj)
4954{
4955 return PyMapping_Values(obj);
4956}
4957
4958static PyObject *
4959get_mapping_items(PyObject* self, PyObject *obj)
4960{
4961 return PyMapping_Items(obj);
4962}
4963
4964
4965static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09004966test_pythread_tss_key_state(PyObject *self, PyObject *args)
4967{
4968 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
4969 if (PyThread_tss_is_created(&tss_key)) {
4970 return raiseTestError("test_pythread_tss_key_state",
4971 "TSS key not in an uninitialized state at "
4972 "creation time");
4973 }
4974 if (PyThread_tss_create(&tss_key) != 0) {
4975 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
4976 return NULL;
4977 }
4978 if (!PyThread_tss_is_created(&tss_key)) {
4979 return raiseTestError("test_pythread_tss_key_state",
4980 "PyThread_tss_create succeeded, "
4981 "but with TSS key in an uninitialized state");
4982 }
4983 if (PyThread_tss_create(&tss_key) != 0) {
4984 return raiseTestError("test_pythread_tss_key_state",
4985 "PyThread_tss_create unsuccessful with "
4986 "an already initialized key");
4987 }
4988#define CHECK_TSS_API(expr) \
4989 (void)(expr); \
4990 if (!PyThread_tss_is_created(&tss_key)) { \
4991 return raiseTestError("test_pythread_tss_key_state", \
4992 "TSS key initialization state was not " \
4993 "preserved after calling " #expr); }
4994 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
4995 CHECK_TSS_API(PyThread_tss_get(&tss_key));
4996#undef CHECK_TSS_API
4997 PyThread_tss_delete(&tss_key);
4998 if (PyThread_tss_is_created(&tss_key)) {
4999 return raiseTestError("test_pythread_tss_key_state",
5000 "PyThread_tss_delete called, but did not "
5001 "set the key state to uninitialized");
5002 }
5003
5004 Py_tss_t *ptr_key = PyThread_tss_alloc();
5005 if (ptr_key == NULL) {
5006 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
5007 return NULL;
5008 }
5009 if (PyThread_tss_is_created(ptr_key)) {
5010 return raiseTestError("test_pythread_tss_key_state",
5011 "TSS key not in an uninitialized state at "
5012 "allocation time");
5013 }
5014 PyThread_tss_free(ptr_key);
5015 ptr_key = NULL;
5016 Py_RETURN_NONE;
5017}
5018
5019
Yury Selivanovf23746a2018-01-22 19:11:18 -05005020static PyObject*
5021new_hamt(PyObject *self, PyObject *args)
5022{
5023 return _PyContext_NewHamtForTests();
5024}
5025
5026
jdemeyer5a306202018-10-19 23:50:06 +02005027/* def bad_get(self, obj, cls):
5028 cls()
5029 return repr(self)
5030*/
5031static PyObject*
5032bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5033{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005034 PyObject *self, *obj, *cls;
5035 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02005036 return NULL;
5037 }
5038
Jeroen Demeyer7f41c8e2019-07-04 12:35:31 +02005039 PyObject *res = _PyObject_CallNoArg(cls);
jdemeyer5a306202018-10-19 23:50:06 +02005040 if (res == NULL) {
5041 return NULL;
5042 }
5043 Py_DECREF(res);
5044
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005045 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02005046}
5047
5048
Victor Stinner3d4226a2018-08-29 22:21:32 +02005049static PyObject *
5050encode_locale_ex(PyObject *self, PyObject *args)
5051{
5052 PyObject *unicode;
5053 int current_locale = 0;
5054 wchar_t *wstr;
5055 PyObject *res = NULL;
5056 const char *errors = NULL;
5057
5058 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
5059 return NULL;
5060 }
5061 wstr = PyUnicode_AsWideCharString(unicode, NULL);
5062 if (wstr == NULL) {
5063 return NULL;
5064 }
5065 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5066
5067 char *str = NULL;
5068 size_t error_pos;
5069 const char *reason = NULL;
5070 int ret = _Py_EncodeLocaleEx(wstr,
5071 &str, &error_pos, &reason,
5072 current_locale, error_handler);
5073 PyMem_Free(wstr);
5074
5075 switch(ret) {
5076 case 0:
5077 res = PyBytes_FromString(str);
5078 PyMem_RawFree(str);
5079 break;
5080 case -1:
5081 PyErr_NoMemory();
5082 break;
5083 case -2:
5084 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
5085 error_pos, reason);
5086 break;
5087 case -3:
5088 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5089 break;
5090 default:
5091 PyErr_SetString(PyExc_ValueError, "unknow error code");
5092 break;
5093 }
5094 return res;
5095}
5096
5097
5098static PyObject *
5099decode_locale_ex(PyObject *self, PyObject *args)
5100{
5101 char *str;
5102 int current_locale = 0;
5103 PyObject *res = NULL;
5104 const char *errors = NULL;
5105
5106 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
5107 return NULL;
5108 }
5109 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5110
5111 wchar_t *wstr = NULL;
5112 size_t wlen = 0;
5113 const char *reason = NULL;
5114 int ret = _Py_DecodeLocaleEx(str,
5115 &wstr, &wlen, &reason,
5116 current_locale, error_handler);
5117
5118 switch(ret) {
5119 case 0:
5120 res = PyUnicode_FromWideChar(wstr, wlen);
5121 PyMem_RawFree(wstr);
5122 break;
5123 case -1:
5124 PyErr_NoMemory();
5125 break;
5126 case -2:
5127 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
5128 wlen, reason);
5129 break;
5130 case -3:
5131 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5132 break;
5133 default:
5134 PyErr_SetString(PyExc_ValueError, "unknow error code");
5135 break;
5136 }
5137 return res;
5138}
5139
5140
Victor Stinner18618e652018-10-25 17:28:11 +02005141#ifdef Py_REF_DEBUG
5142static PyObject *
5143negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5144{
5145 PyObject *obj = PyUnicode_FromString("negative_refcount");
5146 if (obj == NULL) {
5147 return NULL;
5148 }
5149 assert(Py_REFCNT(obj) == 1);
5150
Victor Stinnerc86a1122020-02-07 01:24:29 +01005151 Py_SET_REFCNT(obj, 0);
Victor Stinner18618e652018-10-25 17:28:11 +02005152 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5153 Py_DECREF(obj);
5154
5155 Py_RETURN_NONE;
5156}
5157#endif
5158
5159
Victor Stinneref9d9b62019-05-22 11:28:22 +02005160static PyObject*
5161test_write_unraisable_exc(PyObject *self, PyObject *args)
5162{
Victor Stinner71c52e32019-05-27 08:57:14 +02005163 PyObject *exc, *err_msg, *obj;
5164 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005165 return NULL;
5166 }
5167
Victor Stinner71c52e32019-05-27 08:57:14 +02005168 const char *err_msg_utf8;
5169 if (err_msg != Py_None) {
5170 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5171 if (err_msg_utf8 == NULL) {
5172 return NULL;
5173 }
5174 }
5175 else {
5176 err_msg_utf8 = NULL;
5177 }
5178
Victor Stinneref9d9b62019-05-22 11:28:22 +02005179 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005180 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005181 Py_RETURN_NONE;
5182}
5183
5184
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005185static PyObject *
5186sequence_getitem(PyObject *self, PyObject *args)
5187{
5188 PyObject *seq;
5189 Py_ssize_t i;
5190 if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
5191 return NULL;
5192 }
5193 return PySequence_GetItem(seq, i);
5194}
5195
5196
Petr Viktorinf9583772019-09-10 12:21:09 +01005197/* Functions for testing C calling conventions (METH_*) are named meth_*,
5198 * e.g. "meth_varargs" for METH_VARARGS.
5199 *
5200 * They all return a tuple of their C-level arguments, with None instead
5201 * of NULL and Python tuples instead of C arrays.
5202 */
5203
5204
5205static PyObject*
5206_null_to_none(PyObject* obj)
5207{
5208 if (obj == NULL) {
5209 Py_RETURN_NONE;
5210 }
5211 Py_INCREF(obj);
5212 return obj;
5213}
5214
5215static PyObject*
5216meth_varargs(PyObject* self, PyObject* args)
5217{
5218 return Py_BuildValue("NO", _null_to_none(self), args);
5219}
5220
5221static PyObject*
5222meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs)
5223{
5224 return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs));
5225}
5226
5227static PyObject*
5228meth_o(PyObject* self, PyObject* obj)
5229{
5230 return Py_BuildValue("NO", _null_to_none(self), obj);
5231}
5232
5233static PyObject*
5234meth_noargs(PyObject* self, PyObject* ignored)
5235{
5236 return _null_to_none(self);
5237}
5238
5239static PyObject*
5240_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs)
5241{
5242 PyObject *tuple = PyTuple_New(nargs);
5243 if (tuple == NULL) {
5244 return NULL;
5245 }
5246 for (Py_ssize_t i=0; i < nargs; i++) {
5247 Py_INCREF(args[i]);
5248 PyTuple_SET_ITEM(tuple, i, args[i]);
5249 }
5250 return tuple;
5251}
5252
5253static PyObject*
5254meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
5255{
5256 return Py_BuildValue(
5257 "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs)
5258 );
5259}
5260
5261static PyObject*
5262meth_fastcall_keywords(PyObject* self, PyObject* const* args,
5263 Py_ssize_t nargs, PyObject* kwargs)
5264{
5265 PyObject *pyargs = _fastcall_to_tuple(args, nargs);
5266 if (pyargs == NULL) {
5267 return NULL;
5268 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005269 PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type,
Petr Viktorinf9583772019-09-10 12:21:09 +01005270 args + nargs, 0, kwargs);
5271 return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
5272}
5273
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005274
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005275static PyObject*
5276pynumber_tobase(PyObject *module, PyObject *args)
5277{
5278 PyObject *obj;
5279 int base;
5280 if (!PyArg_ParseTuple(args, "Oi:pynumber_tobase",
5281 &obj, &base)) {
5282 return NULL;
5283 }
5284 return PyNumber_ToBase(obj, base);
5285}
5286
5287
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005288static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
5289
Tim Peters9ea17ac2001-02-02 05:57:15 +00005290static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005291 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305292 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005293 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305294 {"test_config", test_config, METH_NOARGS},
5295 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005296 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005297 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5298 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5299 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5300 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5301 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5302 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005303 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005304 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005305 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5306 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5307 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5308 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5309 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5310 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005311 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5312 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03005313 {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
5314 {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
5315 {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
5316 {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305317 {"test_list_api", test_list_api, METH_NOARGS},
5318 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005319 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005320 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305321 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5322 {"test_long_api", test_long_api, METH_NOARGS},
5323 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5324 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5325 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5326 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005327 {"test_structseq_newtype_doesnt_leak",
5328 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305329 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5330 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5331 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5332 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
Zackery Spytzdc247652019-06-06 14:39:23 -06005333 {"test_long_as_unsigned_long_long_mask",
5334 test_long_as_unsigned_long_long_mask, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305335 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5336 {"test_k_code", test_k_code, METH_NOARGS},
5337 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005338 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305339 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305341 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305343 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5344 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5345 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005347 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005348#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005349 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005350#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005351 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03005352 {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005353 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005354 {"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS},
Serhiy Storchakace412872016-05-08 23:36:44 +03005355 {"get_args", get_args, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005356 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005358 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005359 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005360 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005361 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005362 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005363 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005364 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005365 {"getargs_b", getargs_b, METH_VARARGS},
5366 {"getargs_B", getargs_B, METH_VARARGS},
5367 {"getargs_h", getargs_h, METH_VARARGS},
5368 {"getargs_H", getargs_H, METH_VARARGS},
5369 {"getargs_I", getargs_I, METH_VARARGS},
5370 {"getargs_k", getargs_k, METH_VARARGS},
5371 {"getargs_i", getargs_i, METH_VARARGS},
5372 {"getargs_l", getargs_l, METH_VARARGS},
5373 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005374 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005375 {"getargs_L", getargs_L, METH_VARARGS},
5376 {"getargs_K", getargs_K, METH_VARARGS},
5377 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305378 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5379 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005380 {"getargs_f", getargs_f, METH_VARARGS},
5381 {"getargs_d", getargs_d, METH_VARARGS},
5382 {"getargs_D", getargs_D, METH_VARARGS},
5383 {"getargs_S", getargs_S, METH_VARARGS},
5384 {"getargs_Y", getargs_Y, METH_VARARGS},
5385 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005386 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005387 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005388 {"getargs_s", getargs_s, METH_VARARGS},
5389 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5390 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
5391 {"getargs_z", getargs_z, METH_VARARGS},
5392 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5393 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5394 {"getargs_y", getargs_y, METH_VARARGS},
5395 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5396 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5397 {"getargs_u", getargs_u, METH_VARARGS},
5398 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5399 {"getargs_Z", getargs_Z, METH_VARARGS},
5400 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005401 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005402 {"getargs_es", getargs_es, METH_VARARGS},
5403 {"getargs_et", getargs_et, METH_VARARGS},
5404 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5405 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005407 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005408 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005409 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305410 {"test_s_code", test_s_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005411#if USE_UNICODE_WCHAR_CACHE
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305412 {"test_u_code", test_u_code, METH_NOARGS},
5413 {"test_Z_code", test_Z_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005414#endif /* USE_UNICODE_WCHAR_CACHE */
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305415 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005416 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5417 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005418 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Hai Shi5623ac82019-07-20 02:56:23 -05005419 {"unicode_asutf8", unicode_asutf8, METH_VARARGS},
5420 {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005421 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005422 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005423#if USE_UNICODE_WCHAR_CACHE
Victor Stinner42bf7752011-11-21 22:52:58 +01005424 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5425 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005426 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005427#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinner1c24bd02010-10-02 11:03:13 +00005428 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005430#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005431 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005432#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005433 {"traceback_print", traceback_print, METH_VARARGS},
5434 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005435 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005436 {"argparsing", argparsing, METH_VARARGS},
5437 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005438 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305440 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005441 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305442 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005443 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005444 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5445 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005446 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005447 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005448 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305449 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5450 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5451 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5452 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005453 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5454 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305455 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005456 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005457 {"no_docstring",
5458 (PyCFunction)test_with_docstring, METH_NOARGS},
5459 {"docstring_empty",
5460 (PyCFunction)test_with_docstring, METH_NOARGS,
5461 docstring_empty},
5462 {"docstring_no_signature",
5463 (PyCFunction)test_with_docstring, METH_NOARGS,
5464 docstring_no_signature},
5465 {"docstring_with_invalid_signature",
5466 (PyCFunction)test_with_docstring, METH_NOARGS,
5467 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005468 {"docstring_with_invalid_signature2",
5469 (PyCFunction)test_with_docstring, METH_NOARGS,
5470 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005471 {"docstring_with_signature",
5472 (PyCFunction)test_with_docstring, METH_NOARGS,
5473 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005474 {"docstring_with_signature_but_no_doc",
5475 (PyCFunction)test_with_docstring, METH_NOARGS,
5476 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005477 {"docstring_with_signature_and_extra_newlines",
5478 (PyCFunction)test_with_docstring, METH_NOARGS,
5479 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005480 {"docstring_with_signature_with_defaults",
5481 (PyCFunction)test_with_docstring, METH_NOARGS,
5482 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005483 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5484 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005485 {"pymarshal_write_long_to_file",
5486 pymarshal_write_long_to_file, METH_VARARGS},
5487 {"pymarshal_write_object_to_file",
5488 pymarshal_write_object_to_file, METH_VARARGS},
5489 {"pymarshal_read_short_from_file",
5490 pymarshal_read_short_from_file, METH_VARARGS},
5491 {"pymarshal_read_long_from_file",
5492 pymarshal_read_long_from_file, METH_VARARGS},
5493 {"pymarshal_read_last_object_from_file",
5494 pymarshal_read_last_object_from_file, METH_VARARGS},
5495 {"pymarshal_read_object_from_file",
5496 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerefde1462015-03-21 15:04:43 +01005497 {"return_null_without_error",
5498 return_null_without_error, METH_NOARGS},
5499 {"return_result_with_error",
5500 return_result_with_error, METH_NOARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02005501 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005502 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5503 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005504 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005505#ifdef HAVE_CLOCK_GETTIME
5506 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5507#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005508 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5509 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01005510 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5511 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005512 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005513 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner68762572019-10-07 18:42:01 +02005514 {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02005515 {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
5516 {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
5517 {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005518 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005519 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5520 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5521 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005522 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005523 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005524 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5525 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005526 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5527 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005528 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005529#ifdef W_STOPCODE
5530 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5531#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005532 {"get_mapping_keys", get_mapping_keys, METH_O},
5533 {"get_mapping_values", get_mapping_values, METH_O},
5534 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005535 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005536 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005537 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005538 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5539 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005540#ifdef Py_REF_DEBUG
5541 {"negative_refcount", negative_refcount, METH_NOARGS},
5542#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005543 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005544 {"sequence_getitem", sequence_getitem, METH_VARARGS},
Petr Viktorinf9583772019-09-10 12:21:09 +01005545 {"meth_varargs", meth_varargs, METH_VARARGS},
5546 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
5547 {"meth_o", meth_o, METH_O},
5548 {"meth_noargs", meth_noargs, METH_NOARGS},
5549 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
5550 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005551 {"pynumber_tobase", pynumber_tobase, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005552 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005553};
5554
Thomas Hellera4ea6032003-04-17 18:55:45 +00005555#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5556
Thomas Wouters89f507f2006-12-13 04:49:30 +00005557typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005558 char bool_member;
5559 char byte_member;
5560 unsigned char ubyte_member;
5561 short short_member;
5562 unsigned short ushort_member;
5563 int int_member;
5564 unsigned int uint_member;
5565 long long_member;
5566 unsigned long ulong_member;
5567 Py_ssize_t pyssizet_member;
5568 float float_member;
5569 double double_member;
5570 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005571 long long longlong_member;
5572 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005573} all_structmembers;
5574
5575typedef struct {
5576 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005577 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005578} test_structmembers;
5579
5580static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5582 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5583 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5584 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5585 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5586 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5587 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5588 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5589 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5590 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5591 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5592 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5593 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5595 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005596 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005597};
5598
5599
Christian Heimes1af737c2008-01-23 08:24:23 +00005600static PyObject *
5601test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5602{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005603 static char *keywords[] = {
5604 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5605 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5606 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005609 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 test_structmembers *ob;
5611 const char *s = NULL;
5612 Py_ssize_t string_len = 0;
5613 ob = PyObject_New(test_structmembers, type);
5614 if (ob == NULL)
5615 return NULL;
5616 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5617 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5618 &ob->structmembers.bool_member,
5619 &ob->structmembers.byte_member,
5620 &ob->structmembers.ubyte_member,
5621 &ob->structmembers.short_member,
5622 &ob->structmembers.ushort_member,
5623 &ob->structmembers.int_member,
5624 &ob->structmembers.uint_member,
5625 &ob->structmembers.long_member,
5626 &ob->structmembers.ulong_member,
5627 &ob->structmembers.pyssizet_member,
5628 &ob->structmembers.float_member,
5629 &ob->structmembers.double_member,
5630 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 , &ob->structmembers.longlong_member,
5632 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005633 )) {
5634 Py_DECREF(ob);
5635 return NULL;
5636 }
5637 if (s != NULL) {
5638 if (string_len > 5) {
5639 Py_DECREF(ob);
5640 PyErr_SetString(PyExc_ValueError, "string too long");
5641 return NULL;
5642 }
5643 strcpy(ob->structmembers.inplace_member, s);
5644 }
5645 else {
5646 strcpy(ob->structmembers.inplace_member, "");
5647 }
5648 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005649}
5650
Christian Heimes1af737c2008-01-23 08:24:23 +00005651static void
5652test_structmembers_free(PyObject *ob)
5653{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654 PyObject_FREE(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005655}
5656
5657static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005658 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 "test_structmembersType",
5660 sizeof(test_structmembers), /* tp_basicsize */
5661 0, /* tp_itemsize */
5662 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005663 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005664 0, /* tp_getattr */
5665 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005666 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005667 0, /* tp_repr */
5668 0, /* tp_as_number */
5669 0, /* tp_as_sequence */
5670 0, /* tp_as_mapping */
5671 0, /* tp_hash */
5672 0, /* tp_call */
5673 0, /* tp_str */
5674 PyObject_GenericGetAttr, /* tp_getattro */
5675 PyObject_GenericSetAttr, /* tp_setattro */
5676 0, /* tp_as_buffer */
5677 0, /* tp_flags */
5678 "Type containing all structmember types",
5679 0, /* traverseproc tp_traverse */
5680 0, /* tp_clear */
5681 0, /* tp_richcompare */
5682 0, /* tp_weaklistoffset */
5683 0, /* tp_iter */
5684 0, /* tp_iternext */
5685 0, /* tp_methods */
5686 test_members, /* tp_members */
5687 0,
5688 0,
5689 0,
5690 0,
5691 0,
5692 0,
5693 0,
5694 0,
5695 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005696};
5697
5698
Benjamin Petersond51374e2014-04-09 23:55:56 -04005699typedef struct {
5700 PyObject_HEAD
5701} matmulObject;
5702
5703static PyObject *
5704matmulType_matmul(PyObject *self, PyObject *other)
5705{
5706 return Py_BuildValue("(sOO)", "matmul", self, other);
5707}
5708
5709static PyObject *
5710matmulType_imatmul(PyObject *self, PyObject *other)
5711{
5712 return Py_BuildValue("(sOO)", "imatmul", self, other);
5713}
5714
5715static void
5716matmulType_dealloc(PyObject *self)
5717{
Zachary Ware420dc562014-04-23 13:51:27 -05005718 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005719}
5720
5721static PyNumberMethods matmulType_as_number = {
5722 0, /* nb_add */
5723 0, /* nb_subtract */
5724 0, /* nb_multiply */
5725 0, /* nb_remainde r*/
5726 0, /* nb_divmod */
5727 0, /* nb_power */
5728 0, /* nb_negative */
5729 0, /* tp_positive */
5730 0, /* tp_absolute */
5731 0, /* tp_bool */
5732 0, /* nb_invert */
5733 0, /* nb_lshift */
5734 0, /* nb_rshift */
5735 0, /* nb_and */
5736 0, /* nb_xor */
5737 0, /* nb_or */
5738 0, /* nb_int */
5739 0, /* nb_reserved */
5740 0, /* nb_float */
5741 0, /* nb_inplace_add */
5742 0, /* nb_inplace_subtract */
5743 0, /* nb_inplace_multiply */
5744 0, /* nb_inplace_remainder */
5745 0, /* nb_inplace_power */
5746 0, /* nb_inplace_lshift */
5747 0, /* nb_inplace_rshift */
5748 0, /* nb_inplace_and */
5749 0, /* nb_inplace_xor */
5750 0, /* nb_inplace_or */
5751 0, /* nb_floor_divide */
5752 0, /* nb_true_divide */
5753 0, /* nb_inplace_floor_divide */
5754 0, /* nb_inplace_true_divide */
5755 0, /* nb_index */
5756 matmulType_matmul, /* nb_matrix_multiply */
5757 matmulType_imatmul /* nb_matrix_inplace_multiply */
5758};
5759
5760static PyTypeObject matmulType = {
5761 PyVarObject_HEAD_INIT(NULL, 0)
5762 "matmulType",
5763 sizeof(matmulObject), /* tp_basicsize */
5764 0, /* tp_itemsize */
5765 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005766 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005767 0, /* tp_getattr */
5768 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005769 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005770 0, /* tp_repr */
5771 &matmulType_as_number, /* tp_as_number */
5772 0, /* tp_as_sequence */
5773 0, /* tp_as_mapping */
5774 0, /* tp_hash */
5775 0, /* tp_call */
5776 0, /* tp_str */
5777 PyObject_GenericGetAttr, /* tp_getattro */
5778 PyObject_GenericSetAttr, /* tp_setattro */
5779 0, /* tp_as_buffer */
5780 0, /* tp_flags */
5781 "C level type with matrix operations defined",
5782 0, /* traverseproc tp_traverse */
5783 0, /* tp_clear */
5784 0, /* tp_richcompare */
5785 0, /* tp_weaklistoffset */
5786 0, /* tp_iter */
5787 0, /* tp_iternext */
5788 0, /* tp_methods */
5789 0, /* tp_members */
5790 0,
5791 0,
5792 0,
5793 0,
5794 0,
5795 0,
5796 0,
5797 0,
5798 PyType_GenericNew, /* tp_new */
5799 PyObject_Del, /* tp_free */
5800};
5801
Zackery Spytzc7f803b2019-05-31 03:46:36 -06005802typedef struct {
5803 PyObject_HEAD
5804} ipowObject;
5805
5806static PyObject *
5807ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
5808{
5809 return Py_BuildValue("OO", other, mod);
5810}
5811
5812static PyNumberMethods ipowType_as_number = {
5813 .nb_inplace_power = ipowType_ipow
5814};
5815
5816static PyTypeObject ipowType = {
5817 PyVarObject_HEAD_INIT(NULL, 0)
5818 .tp_name = "ipowType",
5819 .tp_basicsize = sizeof(ipowObject),
5820 .tp_as_number = &ipowType_as_number,
5821 .tp_new = PyType_GenericNew
5822};
Martin v. Löwis1a214512008-06-11 05:26:20 +00005823
Yury Selivanov75445082015-05-11 22:57:16 -04005824typedef struct {
5825 PyObject_HEAD
5826 PyObject *ao_iterator;
5827} awaitObject;
5828
5829
5830static PyObject *
5831awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5832{
5833 PyObject *v;
5834 awaitObject *ao;
5835
5836 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
5837 return NULL;
5838
5839 ao = (awaitObject *)type->tp_alloc(type, 0);
5840 if (ao == NULL) {
5841 return NULL;
5842 }
5843
5844 Py_INCREF(v);
5845 ao->ao_iterator = v;
5846
5847 return (PyObject *)ao;
5848}
5849
5850
5851static void
5852awaitObject_dealloc(awaitObject *ao)
5853{
5854 Py_CLEAR(ao->ao_iterator);
5855 Py_TYPE(ao)->tp_free(ao);
5856}
5857
5858
5859static PyObject *
5860awaitObject_await(awaitObject *ao)
5861{
5862 Py_INCREF(ao->ao_iterator);
5863 return ao->ao_iterator;
5864}
5865
5866static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04005867 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04005868 0, /* am_aiter */
5869 0 /* am_anext */
5870};
5871
5872
5873static PyTypeObject awaitType = {
5874 PyVarObject_HEAD_INIT(NULL, 0)
5875 "awaitType",
5876 sizeof(awaitObject), /* tp_basicsize */
5877 0, /* tp_itemsize */
5878 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005879 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04005880 0, /* tp_getattr */
5881 0, /* tp_setattr */
5882 &awaitType_as_async, /* tp_as_async */
5883 0, /* tp_repr */
5884 0, /* tp_as_number */
5885 0, /* tp_as_sequence */
5886 0, /* tp_as_mapping */
5887 0, /* tp_hash */
5888 0, /* tp_call */
5889 0, /* tp_str */
5890 PyObject_GenericGetAttr, /* tp_getattro */
5891 PyObject_GenericSetAttr, /* tp_setattro */
5892 0, /* tp_as_buffer */
5893 0, /* tp_flags */
5894 "C level type with tp_as_async",
5895 0, /* traverseproc tp_traverse */
5896 0, /* tp_clear */
5897 0, /* tp_richcompare */
5898 0, /* tp_weaklistoffset */
5899 0, /* tp_iter */
5900 0, /* tp_iternext */
5901 0, /* tp_methods */
5902 0, /* tp_members */
5903 0,
5904 0,
5905 0,
5906 0,
5907 0,
5908 0,
5909 0,
5910 0,
5911 awaitObject_new, /* tp_new */
5912 PyObject_Del, /* tp_free */
5913};
5914
5915
xdegaye56d1f5c2017-10-26 15:09:06 +02005916static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
5917
5918static PyTypeObject PyRecursingInfinitelyError_Type = {
5919 PyVarObject_HEAD_INIT(NULL, 0)
5920 "RecursingInfinitelyError", /* tp_name */
5921 sizeof(PyBaseExceptionObject), /* tp_basicsize */
5922 0, /* tp_itemsize */
5923 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005924 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02005925 0, /* tp_getattr */
5926 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005927 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02005928 0, /* tp_repr */
5929 0, /* tp_as_number */
5930 0, /* tp_as_sequence */
5931 0, /* tp_as_mapping */
5932 0, /* tp_hash */
5933 0, /* tp_call */
5934 0, /* tp_str */
5935 0, /* tp_getattro */
5936 0, /* tp_setattro */
5937 0, /* tp_as_buffer */
5938 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5939 "Instantiating this exception starts infinite recursion.", /* tp_doc */
5940 0, /* tp_traverse */
5941 0, /* tp_clear */
5942 0, /* tp_richcompare */
5943 0, /* tp_weaklistoffset */
5944 0, /* tp_iter */
5945 0, /* tp_iternext */
5946 0, /* tp_methods */
5947 0, /* tp_members */
5948 0, /* tp_getset */
5949 0, /* tp_base */
5950 0, /* tp_dict */
5951 0, /* tp_descr_get */
5952 0, /* tp_descr_set */
5953 0, /* tp_dictoffset */
5954 (initproc)recurse_infinitely_error_init, /* tp_init */
5955 0, /* tp_alloc */
5956 0, /* tp_new */
5957};
5958
5959static int
5960recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
5961{
5962 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
5963
5964 /* Instantiating this exception starts infinite recursion. */
5965 Py_INCREF(type);
5966 PyErr_SetObject(type, NULL);
5967 return -1;
5968}
5969
5970
Jeroen Demeyer351c6742019-05-10 19:21:11 +02005971/* Test bpo-35983: create a subclass of "list" which checks that instances
5972 * are not deallocated twice */
5973
5974typedef struct {
5975 PyListObject list;
5976 int deallocated;
5977} MyListObject;
5978
5979static PyObject *
5980MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5981{
5982 PyObject* op = PyList_Type.tp_new(type, args, kwds);
5983 ((MyListObject*)op)->deallocated = 0;
5984 return op;
5985}
5986
5987void
5988MyList_dealloc(MyListObject* op)
5989{
5990 if (op->deallocated) {
5991 /* We cannot raise exceptions here but we still want the testsuite
5992 * to fail when we hit this */
5993 Py_FatalError("MyList instance deallocated twice");
5994 }
5995 op->deallocated = 1;
5996 PyList_Type.tp_dealloc((PyObject *)op);
5997}
5998
5999static PyTypeObject MyList_Type = {
6000 PyVarObject_HEAD_INIT(NULL, 0)
6001 "MyList",
6002 sizeof(MyListObject),
6003 0,
6004 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006005 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006006 0, /* tp_getattr */
6007 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006008 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006009 0, /* tp_repr */
6010 0, /* tp_as_number */
6011 0, /* tp_as_sequence */
6012 0, /* tp_as_mapping */
6013 0, /* tp_hash */
6014 0, /* tp_call */
6015 0, /* tp_str */
6016 0, /* tp_getattro */
6017 0, /* tp_setattro */
6018 0, /* tp_as_buffer */
6019 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6020 0, /* tp_doc */
6021 0, /* tp_traverse */
6022 0, /* tp_clear */
6023 0, /* tp_richcompare */
6024 0, /* tp_weaklistoffset */
6025 0, /* tp_iter */
6026 0, /* tp_iternext */
6027 0, /* tp_methods */
6028 0, /* tp_members */
6029 0, /* tp_getset */
6030 0, /* &PyList_Type */ /* tp_base */
6031 0, /* tp_dict */
6032 0, /* tp_descr_get */
6033 0, /* tp_descr_set */
6034 0, /* tp_dictoffset */
6035 0, /* tp_init */
6036 0, /* tp_alloc */
6037 MyList_new, /* tp_new */
6038};
6039
6040
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006041/* Test PEP 560 */
6042
6043typedef struct {
6044 PyObject_HEAD
6045 PyObject *item;
6046} PyGenericAliasObject;
6047
6048static void
6049generic_alias_dealloc(PyGenericAliasObject *self)
6050{
6051 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01006052 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006053}
6054
6055static PyObject *
6056generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
6057{
6058 return PyTuple_Pack(1, self->item);
6059}
6060
6061static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006062 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006063 {NULL} /* sentinel */
6064};
6065
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006066static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006067 PyVarObject_HEAD_INIT(NULL, 0)
6068 "GenericAlias",
6069 sizeof(PyGenericAliasObject),
6070 0,
6071 .tp_dealloc = (destructor)generic_alias_dealloc,
6072 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6073 .tp_methods = generic_alias_methods,
6074};
6075
6076static PyObject *
6077generic_alias_new(PyObject *item)
6078{
6079 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
6080 if (o == NULL) {
6081 return NULL;
6082 }
6083 Py_INCREF(item);
6084 o->item = item;
6085 return (PyObject*) o;
6086}
6087
6088typedef struct {
6089 PyObject_HEAD
6090} PyGenericObject;
6091
6092static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006093generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006094{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006095 return generic_alias_new(item);
6096}
6097
6098static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006099 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006100 {NULL} /* sentinel */
6101};
6102
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006103static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006104 PyVarObject_HEAD_INIT(NULL, 0)
6105 "Generic",
6106 sizeof(PyGenericObject),
6107 0,
6108 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6109 .tp_methods = generic_methods,
6110};
6111
6112
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006113/* Test PEP 590 */
6114
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006115typedef struct {
6116 PyObject_HEAD
6117 vectorcallfunc vectorcall;
6118} MethodDescriptorObject;
6119
6120static PyObject *
6121MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
6122 size_t nargsf, PyObject *kwnames)
6123{
6124 /* True if using the vectorcall function in MethodDescriptorObject
6125 * but False for MethodDescriptor2Object */
6126 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
6127 return PyBool_FromLong(md->vectorcall != NULL);
6128}
6129
6130static PyObject *
6131MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6132{
Petr Viktorine584cbf2019-06-03 01:08:14 +02006133 MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006134 op->vectorcall = MethodDescriptor_vectorcall;
6135 return (PyObject *)op;
6136}
6137
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006138static PyObject *
6139func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6140{
6141 if (obj == Py_None || obj == NULL) {
6142 Py_INCREF(func);
6143 return func;
6144 }
6145 return PyMethod_New(func, obj);
6146}
6147
6148static PyObject *
6149nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6150{
6151 Py_INCREF(func);
6152 return func;
6153}
6154
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006155static PyObject *
6156call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
6157{
6158 Py_INCREF(args);
6159 return args;
6160}
6161
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006162static PyTypeObject MethodDescriptorBase_Type = {
6163 PyVarObject_HEAD_INIT(NULL, 0)
6164 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006165 sizeof(MethodDescriptorObject),
6166 .tp_new = MethodDescriptor_new,
6167 .tp_call = PyVectorcall_Call,
6168 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
6169 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Petr Viktorinffd97532020-02-11 17:46:57 +01006170 Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006171 .tp_descr_get = func_descr_get,
6172};
6173
6174static PyTypeObject MethodDescriptorDerived_Type = {
6175 PyVarObject_HEAD_INIT(NULL, 0)
6176 "MethodDescriptorDerived",
6177 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6178};
6179
6180static PyTypeObject MethodDescriptorNopGet_Type = {
6181 PyVarObject_HEAD_INIT(NULL, 0)
6182 "MethodDescriptorNopGet",
6183 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006184 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006185 .tp_descr_get = nop_descr_get,
6186};
6187
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006188typedef struct {
6189 MethodDescriptorObject base;
6190 vectorcallfunc vectorcall;
6191} MethodDescriptor2Object;
6192
6193static PyObject *
6194MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6195{
6196 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
6197 op->base.vectorcall = NULL;
6198 op->vectorcall = MethodDescriptor_vectorcall;
6199 return (PyObject *)op;
6200}
6201
6202static PyTypeObject MethodDescriptor2_Type = {
6203 PyVarObject_HEAD_INIT(NULL, 0)
6204 "MethodDescriptor2",
6205 sizeof(MethodDescriptor2Object),
6206 .tp_new = MethodDescriptor2_new,
6207 .tp_call = PyVectorcall_Call,
6208 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
Petr Viktorinffd97532020-02-11 17:46:57 +01006209 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006210};
6211
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006212PyDoc_STRVAR(heapgctype__doc__,
6213"A heap type with GC, and with overridden dealloc.\n\n"
6214"The 'value' attribute is set to 10 in __init__.");
6215
6216typedef struct {
6217 PyObject_HEAD
6218 int value;
6219} HeapCTypeObject;
6220
6221static struct PyMemberDef heapctype_members[] = {
6222 {"value", T_INT, offsetof(HeapCTypeObject, value)},
6223 {NULL} /* Sentinel */
6224};
6225
6226static int
6227heapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
6228{
6229 ((HeapCTypeObject *)self)->value = 10;
6230 return 0;
6231}
6232
6233static void
6234heapgcctype_dealloc(HeapCTypeObject *self)
6235{
6236 PyTypeObject *tp = Py_TYPE(self);
6237 PyObject_GC_UnTrack(self);
6238 PyObject_GC_Del(self);
6239 Py_DECREF(tp);
6240}
6241
6242static PyType_Slot HeapGcCType_slots[] = {
6243 {Py_tp_init, heapctype_init},
6244 {Py_tp_members, heapctype_members},
6245 {Py_tp_dealloc, heapgcctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006246 {Py_tp_doc, (char*)heapgctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006247 {0, 0},
6248};
6249
6250static PyType_Spec HeapGcCType_spec = {
6251 "_testcapi.HeapGcCType",
6252 sizeof(HeapCTypeObject),
6253 0,
6254 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6255 HeapGcCType_slots
6256};
6257
6258PyDoc_STRVAR(heapctype__doc__,
6259"A heap type without GC, but with overridden dealloc.\n\n"
6260"The 'value' attribute is set to 10 in __init__.");
6261
6262static void
6263heapctype_dealloc(HeapCTypeObject *self)
6264{
6265 PyTypeObject *tp = Py_TYPE(self);
6266 PyObject_Del(self);
6267 Py_DECREF(tp);
6268}
6269
6270static PyType_Slot HeapCType_slots[] = {
6271 {Py_tp_init, heapctype_init},
6272 {Py_tp_members, heapctype_members},
6273 {Py_tp_dealloc, heapctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006274 {Py_tp_doc, (char*)heapctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006275 {0, 0},
6276};
6277
6278static PyType_Spec HeapCType_spec = {
6279 "_testcapi.HeapCType",
6280 sizeof(HeapCTypeObject),
6281 0,
6282 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6283 HeapCType_slots
6284};
6285
6286PyDoc_STRVAR(heapctypesubclass__doc__,
6287"Subclass of HeapCType, without GC.\n\n"
6288"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6289
6290typedef struct {
6291 HeapCTypeObject base;
6292 int value2;
6293} HeapCTypeSubclassObject;
6294
6295static int
6296heapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
6297{
6298 /* Call __init__ of the superclass */
6299 if (heapctype_init(self, args, kwargs) < 0) {
6300 return -1;
6301 }
6302 /* Initialize additional element */
6303 ((HeapCTypeSubclassObject *)self)->value2 = 20;
6304 return 0;
6305}
6306
6307static struct PyMemberDef heapctypesubclass_members[] = {
6308 {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
6309 {NULL} /* Sentinel */
6310};
6311
6312static PyType_Slot HeapCTypeSubclass_slots[] = {
6313 {Py_tp_init, heapctypesubclass_init},
6314 {Py_tp_members, heapctypesubclass_members},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006315 {Py_tp_doc, (char*)heapctypesubclass__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006316 {0, 0},
6317};
6318
6319static PyType_Spec HeapCTypeSubclass_spec = {
6320 "_testcapi.HeapCTypeSubclass",
6321 sizeof(HeapCTypeSubclassObject),
6322 0,
6323 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6324 HeapCTypeSubclass_slots
6325};
6326
scoderf7c4e232020-06-06 21:35:10 +02006327PyDoc_STRVAR(heapctypewithbuffer__doc__,
6328"Heap type with buffer support.\n\n"
6329"The buffer is set to [b'1', b'2', b'3', b'4']");
6330
6331typedef struct {
6332 HeapCTypeObject base;
6333 char buffer[4];
6334} HeapCTypeWithBufferObject;
6335
6336static int
6337heapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags)
6338{
6339 self->buffer[0] = '1';
6340 self->buffer[1] = '2';
6341 self->buffer[2] = '3';
6342 self->buffer[3] = '4';
6343 return PyBuffer_FillInfo(
6344 view, (PyObject*)self, (void *)self->buffer, 4, 1, flags);
6345}
6346
Rémi Lapeyreb8867e52020-06-07 09:05:33 +02006347static void
scoderf7c4e232020-06-06 21:35:10 +02006348heapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view)
6349{
6350 assert(view->obj == (void*) self);
6351}
6352
6353static PyType_Slot HeapCTypeWithBuffer_slots[] = {
6354 {Py_bf_getbuffer, heapctypewithbuffer_getbuffer},
6355 {Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer},
6356 {Py_tp_doc, (char*)heapctypewithbuffer__doc__},
6357 {0, 0},
6358};
6359
6360static PyType_Spec HeapCTypeWithBuffer_spec = {
6361 "_testcapi.HeapCTypeWithBuffer",
6362 sizeof(HeapCTypeWithBufferObject),
6363 0,
6364 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6365 HeapCTypeWithBuffer_slots
6366};
6367
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006368PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
6369"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
6370"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
6371"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6372
6373static int
6374heapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
6375{
6376 PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
6377 initproc base_init = PyType_GetSlot(base, Py_tp_init);
6378 base_init(self, args, kwargs);
6379 return 0;
6380}
6381
6382static void
6383heapctypesubclasswithfinalizer_finalize(PyObject *self)
6384{
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006385 PyObject *error_type, *error_value, *error_traceback, *m;
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006386 PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006387
6388 /* Save the current exception, if any. */
6389 PyErr_Fetch(&error_type, &error_value, &error_traceback);
6390
6391 m = PyState_FindModule(&_testcapimodule);
6392 if (m == NULL) {
6393 goto cleanup_finalize;
6394 }
6395 oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
6396 newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
6397 if (oldtype == NULL || newtype == NULL) {
6398 goto cleanup_finalize;
6399 }
6400
6401 if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
6402 goto cleanup_finalize;
6403 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006404 refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
6405 if (refcnt == NULL) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006406 goto cleanup_finalize;
6407 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006408 if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
6409 goto cleanup_finalize;
6410 }
6411 Py_DECREF(refcnt);
6412 refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
6413 if (refcnt == NULL) {
6414 goto cleanup_finalize;
6415 }
6416 if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006417 goto cleanup_finalize;
6418 }
6419
6420cleanup_finalize:
6421 Py_XDECREF(oldtype);
6422 Py_XDECREF(newtype);
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006423 Py_XDECREF(refcnt);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006424
6425 /* Restore the saved exception. */
6426 PyErr_Restore(error_type, error_value, error_traceback);
6427}
6428
6429static PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
6430 {Py_tp_init, heapctypesubclasswithfinalizer_init},
6431 {Py_tp_members, heapctypesubclass_members},
6432 {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006433 {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006434 {0, 0},
6435};
6436
6437static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
6438 "_testcapi.HeapCTypeSubclassWithFinalizer",
6439 sizeof(HeapCTypeSubclassObject),
6440 0,
6441 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
6442 HeapCTypeSubclassWithFinalizer_slots
6443};
6444
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006445typedef struct {
6446 PyObject_HEAD
6447 PyObject *dict;
6448} HeapCTypeWithDictObject;
6449
6450static void
6451heapctypewithdict_dealloc(HeapCTypeWithDictObject* self)
6452{
6453
6454 PyTypeObject *tp = Py_TYPE(self);
6455 Py_XDECREF(self->dict);
6456 PyObject_DEL(self);
6457 Py_DECREF(tp);
6458}
6459
6460static PyGetSetDef heapctypewithdict_getsetlist[] = {
6461 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
6462 {NULL} /* Sentinel */
6463};
6464
6465static struct PyMemberDef heapctypewithdict_members[] = {
6466 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
6467 {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY},
6468 {NULL} /* Sentinel */
6469};
6470
6471static PyType_Slot HeapCTypeWithDict_slots[] = {
6472 {Py_tp_members, heapctypewithdict_members},
6473 {Py_tp_getset, heapctypewithdict_getsetlist},
6474 {Py_tp_dealloc, heapctypewithdict_dealloc},
6475 {0, 0},
6476};
6477
6478static PyType_Spec HeapCTypeWithDict_spec = {
6479 "_testcapi.HeapCTypeWithDict",
6480 sizeof(HeapCTypeWithDictObject),
6481 0,
6482 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6483 HeapCTypeWithDict_slots
6484};
6485
6486static struct PyMemberDef heapctypewithnegativedict_members[] = {
6487 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
Victor Stinneraca8c402019-09-30 21:14:26 +02006488 {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006489 {NULL} /* Sentinel */
6490};
6491
6492static PyType_Slot HeapCTypeWithNegativeDict_slots[] = {
6493 {Py_tp_members, heapctypewithnegativedict_members},
6494 {Py_tp_getset, heapctypewithdict_getsetlist},
6495 {Py_tp_dealloc, heapctypewithdict_dealloc},
6496 {0, 0},
6497};
6498
6499static PyType_Spec HeapCTypeWithNegativeDict_spec = {
6500 "_testcapi.HeapCTypeWithNegativeDict",
6501 sizeof(HeapCTypeWithDictObject),
6502 0,
6503 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6504 HeapCTypeWithNegativeDict_slots
6505};
6506
6507typedef struct {
6508 PyObject_HEAD
6509 PyObject *weakreflist;
6510} HeapCTypeWithWeakrefObject;
6511
6512static struct PyMemberDef heapctypewithweakref_members[] = {
6513 {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)},
6514 {"__weaklistoffset__", T_PYSSIZET,
6515 offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY},
6516 {NULL} /* Sentinel */
6517};
6518
6519static void
6520heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self)
6521{
6522
6523 PyTypeObject *tp = Py_TYPE(self);
6524 if (self->weakreflist != NULL)
6525 PyObject_ClearWeakRefs((PyObject *) self);
6526 Py_XDECREF(self->weakreflist);
6527 PyObject_DEL(self);
6528 Py_DECREF(tp);
6529}
6530
6531static PyType_Slot HeapCTypeWithWeakref_slots[] = {
6532 {Py_tp_members, heapctypewithweakref_members},
6533 {Py_tp_dealloc, heapctypewithweakref_dealloc},
6534 {0, 0},
6535};
6536
6537static PyType_Spec HeapCTypeWithWeakref_spec = {
6538 "_testcapi.HeapCTypeWithWeakref",
6539 sizeof(HeapCTypeWithWeakrefObject),
6540 0,
6541 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6542 HeapCTypeWithWeakref_slots
6543};
6544
scoder148f3292020-07-03 02:09:28 +02006545PyDoc_STRVAR(heapctypesetattr__doc__,
6546"A heap type without GC, but with overridden __setattr__.\n\n"
6547"The 'value' attribute is set to 10 in __init__ and updated via attribute setting.");
6548
6549typedef struct {
6550 PyObject_HEAD
6551 long value;
6552} HeapCTypeSetattrObject;
6553
6554static struct PyMemberDef heapctypesetattr_members[] = {
6555 {"pvalue", T_LONG, offsetof(HeapCTypeSetattrObject, value)},
6556 {NULL} /* Sentinel */
6557};
6558
6559static int
6560heapctypesetattr_init(PyObject *self, PyObject *args, PyObject *kwargs)
6561{
6562 ((HeapCTypeSetattrObject *)self)->value = 10;
6563 return 0;
6564}
6565
6566static void
6567heapctypesetattr_dealloc(HeapCTypeSetattrObject *self)
6568{
6569 PyTypeObject *tp = Py_TYPE(self);
6570 PyObject_Del(self);
6571 Py_DECREF(tp);
6572}
6573
6574static int
6575heapctypesetattr_setattro(HeapCTypeSetattrObject *self, PyObject *attr, PyObject *value)
6576{
6577 PyObject *svalue = PyUnicode_FromString("value");
6578 if (svalue == NULL)
6579 return -1;
6580 int eq = PyObject_RichCompareBool(svalue, attr, Py_EQ);
6581 Py_DECREF(svalue);
6582 if (eq < 0)
6583 return -1;
6584 if (!eq) {
6585 return PyObject_GenericSetAttr((PyObject*) self, attr, value);
6586 }
6587 if (value == NULL) {
6588 self->value = 0;
6589 return 0;
6590 }
6591 PyObject *ivalue = PyNumber_Long(value);
6592 if (ivalue == NULL)
6593 return -1;
6594 long v = PyLong_AsLong(ivalue);
6595 Py_DECREF(ivalue);
6596 if (v == -1 && PyErr_Occurred())
6597 return -1;
6598 self->value = v;
6599 return 0;
6600}
6601
6602static PyType_Slot HeapCTypeSetattr_slots[] = {
6603 {Py_tp_init, heapctypesetattr_init},
6604 {Py_tp_members, heapctypesetattr_members},
6605 {Py_tp_setattro, heapctypesetattr_setattro},
6606 {Py_tp_dealloc, heapctypesetattr_dealloc},
6607 {Py_tp_doc, (char*)heapctypesetattr__doc__},
6608 {0, 0},
6609};
6610
6611static PyType_Spec HeapCTypeSetattr_spec = {
6612 "_testcapi.HeapCTypeSetattr",
6613 sizeof(HeapCTypeSetattrObject),
6614 0,
6615 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6616 HeapCTypeSetattr_slots
6617};
6618
Petr Viktorinf9583772019-09-10 12:21:09 +01006619static PyMethodDef meth_instance_methods[] = {
6620 {"meth_varargs", meth_varargs, METH_VARARGS},
6621 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
6622 {"meth_o", meth_o, METH_O},
6623 {"meth_noargs", meth_noargs, METH_NOARGS},
6624 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
6625 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
6626 {NULL, NULL} /* sentinel */
6627};
6628
6629
6630static PyTypeObject MethInstance_Type = {
6631 PyVarObject_HEAD_INIT(NULL, 0)
6632 "MethInstance",
6633 sizeof(PyObject),
6634 .tp_new = PyType_GenericNew,
6635 .tp_flags = Py_TPFLAGS_DEFAULT,
6636 .tp_methods = meth_instance_methods,
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006637 .tp_doc = (char*)PyDoc_STR(
Petr Viktorinf9583772019-09-10 12:21:09 +01006638 "Class with normal (instance) methods to test calling conventions"),
6639};
6640
6641static PyMethodDef meth_class_methods[] = {
6642 {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS},
6643 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS},
6644 {"meth_o", meth_o, METH_O|METH_CLASS},
6645 {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS},
6646 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS},
6647 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS},
6648 {NULL, NULL} /* sentinel */
6649};
6650
6651
6652static PyTypeObject MethClass_Type = {
6653 PyVarObject_HEAD_INIT(NULL, 0)
6654 "MethClass",
6655 sizeof(PyObject),
6656 .tp_new = PyType_GenericNew,
6657 .tp_flags = Py_TPFLAGS_DEFAULT,
6658 .tp_methods = meth_class_methods,
6659 .tp_doc = PyDoc_STR(
6660 "Class with class methods to test calling conventions"),
6661};
6662
6663static PyMethodDef meth_static_methods[] = {
6664 {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC},
6665 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC},
6666 {"meth_o", meth_o, METH_O|METH_STATIC},
6667 {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC},
6668 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC},
6669 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC},
6670 {NULL, NULL} /* sentinel */
6671};
6672
6673
6674static PyTypeObject MethStatic_Type = {
6675 PyVarObject_HEAD_INIT(NULL, 0)
6676 "MethStatic",
6677 sizeof(PyObject),
6678 .tp_new = PyType_GenericNew,
6679 .tp_flags = Py_TPFLAGS_DEFAULT,
6680 .tp_methods = meth_static_methods,
6681 .tp_doc = PyDoc_STR(
6682 "Class with static methods to test calling conventions"),
6683};
6684
Neil Schemenauer392a13b2019-10-15 20:56:48 -07006685/* ContainerNoGC -- a simple container without GC methods */
6686
6687typedef struct {
6688 PyObject_HEAD
6689 PyObject *value;
6690} ContainerNoGCobject;
6691
6692static PyObject *
6693ContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
6694{
6695 PyObject *value;
6696 char *names[] = {"value", NULL};
6697 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) {
6698 return NULL;
6699 }
6700 PyObject *self = type->tp_alloc(type, 0);
6701 if (self == NULL) {
6702 return NULL;
6703 }
6704 Py_INCREF(value);
6705 ((ContainerNoGCobject *)self)->value = value;
6706 return self;
6707}
6708
6709static void
6710ContainerNoGC_dealloc(ContainerNoGCobject *self)
6711{
6712 Py_DECREF(self->value);
6713 Py_TYPE(self)->tp_free((PyObject *)self);
6714}
6715
6716static PyMemberDef ContainerNoGC_members[] = {
6717 {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY,
6718 PyDoc_STR("a container value for test purposes")},
6719 {0}
6720};
6721
6722static PyTypeObject ContainerNoGC_type = {
6723 PyVarObject_HEAD_INIT(NULL, 0)
6724 "_testcapi.ContainerNoGC",
6725 sizeof(ContainerNoGCobject),
6726 .tp_dealloc = (destructor)ContainerNoGC_dealloc,
6727 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6728 .tp_members = ContainerNoGC_members,
6729 .tp_new = ContainerNoGC_new,
6730};
6731
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006732
Martin v. Löwis1a214512008-06-11 05:26:20 +00006733static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006734 PyModuleDef_HEAD_INIT,
6735 "_testcapi",
6736 NULL,
6737 -1,
6738 TestMethods,
6739 NULL,
6740 NULL,
6741 NULL,
6742 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006743};
6744
Nick Coghland5cacbb2015-05-23 22:24:10 +10006745/* Per PEP 489, this module will not be converted to multi-phase initialization
6746 */
6747
Mark Hammond62b1ab12002-07-23 06:31:15 +00006748PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006749PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00006750{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006751 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006753 m = PyModule_Create(&_testcapimodule);
6754 if (m == NULL)
6755 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006756
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01006757 Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type);
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00006758
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01006759 Py_SET_TYPE(&test_structmembersType, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006760 Py_INCREF(&test_structmembersType);
6761 /* don't use a name starting with "test", since we don't want
6762 test_capi to automatically call this */
6763 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04006764 if (PyType_Ready(&matmulType) < 0)
6765 return NULL;
6766 Py_INCREF(&matmulType);
6767 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06006768 if (PyType_Ready(&ipowType) < 0) {
6769 return NULL;
6770 }
6771 Py_INCREF(&ipowType);
6772 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00006773
Yury Selivanov75445082015-05-11 22:57:16 -04006774 if (PyType_Ready(&awaitType) < 0)
6775 return NULL;
6776 Py_INCREF(&awaitType);
6777 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
6778
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006779 MyList_Type.tp_base = &PyList_Type;
6780 if (PyType_Ready(&MyList_Type) < 0)
6781 return NULL;
6782 Py_INCREF(&MyList_Type);
6783 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
6784
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006785 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
6786 return NULL;
6787 Py_INCREF(&MethodDescriptorBase_Type);
6788 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
6789
6790 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
6791 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
6792 return NULL;
6793 Py_INCREF(&MethodDescriptorDerived_Type);
6794 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
6795
6796 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
6797 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
6798 return NULL;
6799 Py_INCREF(&MethodDescriptorNopGet_Type);
6800 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
6801
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006802 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
6803 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
6804 return NULL;
6805 Py_INCREF(&MethodDescriptor2_Type);
6806 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
6807
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006808 if (PyType_Ready(&GenericAlias_Type) < 0)
6809 return NULL;
6810 Py_INCREF(&GenericAlias_Type);
6811 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
6812
6813 if (PyType_Ready(&Generic_Type) < 0)
6814 return NULL;
6815 Py_INCREF(&Generic_Type);
6816 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
6817
Petr Viktorinf9583772019-09-10 12:21:09 +01006818 if (PyType_Ready(&MethInstance_Type) < 0)
6819 return NULL;
6820 Py_INCREF(&MethInstance_Type);
6821 PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type);
6822
6823 if (PyType_Ready(&MethClass_Type) < 0)
6824 return NULL;
6825 Py_INCREF(&MethClass_Type);
6826 PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type);
6827
6828 if (PyType_Ready(&MethStatic_Type) < 0)
6829 return NULL;
6830 Py_INCREF(&MethStatic_Type);
6831 PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type);
6832
xdegaye56d1f5c2017-10-26 15:09:06 +02006833 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
6834 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
6835 return NULL;
6836 }
6837 Py_INCREF(&PyRecursingInfinitelyError_Type);
6838 PyModule_AddObject(m, "RecursingInfinitelyError",
6839 (PyObject *)&PyRecursingInfinitelyError_Type);
6840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006841 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
6842 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
6843 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
6844 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
6845 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
6846 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
6847 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
6848 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
6849 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
6850 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
6851 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
6852 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
6853 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
6854 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
6855 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
6856 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05006857 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX));
6858 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN));
6859 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006860 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
6861 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
Victor Stinner4237d342015-09-10 10:10:39 +02006862 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006863 Py_INCREF(&PyInstanceMethod_Type);
6864 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00006865
Larry Hastings2a727912014-01-16 11:32:01 -08006866 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner310e2d22019-11-22 10:58:00 +01006867 PyObject *v;
Victor Stinner5d39e042017-11-29 17:20:38 +01006868#ifdef WITH_PYMALLOC
Victor Stinner310e2d22019-11-22 10:58:00 +01006869 v = Py_True;
Victor Stinner5d39e042017-11-29 17:20:38 +01006870#else
Victor Stinner310e2d22019-11-22 10:58:00 +01006871 v = Py_False;
Victor Stinner5d39e042017-11-29 17:20:38 +01006872#endif
Victor Stinner310e2d22019-11-22 10:58:00 +01006873 Py_INCREF(v);
6874 PyModule_AddObject(m, "WITH_PYMALLOC", v);
Larry Hastings2a727912014-01-16 11:32:01 -08006875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006876 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
6877 Py_INCREF(TestError);
6878 PyModule_AddObject(m, "error", TestError);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006879
6880 PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
6881 if (HeapGcCType == NULL) {
6882 return NULL;
6883 }
6884 PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
6885
6886 PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
6887 if (HeapCType == NULL) {
6888 return NULL;
6889 }
6890 PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
6891 if (subclass_bases == NULL) {
6892 return NULL;
6893 }
6894 PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
6895 if (HeapCTypeSubclass == NULL) {
6896 return NULL;
6897 }
6898 Py_DECREF(subclass_bases);
6899 PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
6900
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006901 PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec);
6902 if (HeapCTypeWithDict == NULL) {
6903 return NULL;
6904 }
6905 PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict);
6906
6907 PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
6908 if (HeapCTypeWithNegativeDict == NULL) {
6909 return NULL;
6910 }
6911 PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict);
6912
6913 PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec);
6914 if (HeapCTypeWithWeakref == NULL) {
6915 return NULL;
6916 }
6917 PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref);
6918
scoderf7c4e232020-06-06 21:35:10 +02006919 PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec);
6920 if (HeapCTypeWithBuffer == NULL) {
6921 return NULL;
6922 }
6923 PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer);
6924
scoder148f3292020-07-03 02:09:28 +02006925 PyObject *HeapCTypeSetattr = PyType_FromSpec(&HeapCTypeSetattr_spec);
6926 if (HeapCTypeSetattr == NULL) {
6927 return NULL;
6928 }
6929 PyModule_AddObject(m, "HeapCTypeSetattr", HeapCTypeSetattr);
6930
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006931 PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
6932 if (subclass_with_finalizer_bases == NULL) {
6933 return NULL;
6934 }
6935 PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
6936 &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
6937 if (HeapCTypeSubclassWithFinalizer == NULL) {
6938 return NULL;
6939 }
6940 Py_DECREF(subclass_with_finalizer_bases);
6941 PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
6942
Neil Schemenauer392a13b2019-10-15 20:56:48 -07006943 if (PyType_Ready(&ContainerNoGC_type) < 0) {
6944 return NULL;
6945 }
6946 Py_INCREF(&ContainerNoGC_type);
6947 if (PyModule_AddObject(m, "ContainerNoGC",
6948 (PyObject *) &ContainerNoGC_type) < 0)
6949 return NULL;
6950
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006951 PyState_AddModule(m, &_testcapimodule);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006952 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006953}
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006954
6955
6956/* Test the C API exposed when PY_SSIZE_T_CLEAN is not defined */
6957
6958#undef Py_BuildValue
6959PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
6960
6961static PyObject *
6962test_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
6963{
6964 PyObject *res;
6965 const char str[] = "string";
6966 const Py_UNICODE unicode[] = L"unicode";
Victor Stinner37bb2892020-06-19 11:45:31 +02006967 assert(!PyErr_Occurred());
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006968
6969 res = Py_BuildValue("(s#O)", str, 1, Py_None);
6970 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02006971 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006972 return NULL;
6973 }
Victor Stinner37bb2892020-06-19 11:45:31 +02006974 PyErr_Clear();
6975
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006976 res = Py_BuildValue("(z#O)", str, 1, Py_None);
6977 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02006978 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006979 return NULL;
6980 }
Victor Stinner37bb2892020-06-19 11:45:31 +02006981 PyErr_Clear();
6982
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006983 res = Py_BuildValue("(y#O)", str, 1, Py_None);
6984 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02006985 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006986 return NULL;
6987 }
Victor Stinner37bb2892020-06-19 11:45:31 +02006988 PyErr_Clear();
6989
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006990 res = Py_BuildValue("(u#O)", unicode, 1, Py_None);
6991 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02006992 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006993 return NULL;
6994 }
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006995 PyErr_Clear();
Victor Stinner37bb2892020-06-19 11:45:31 +02006996
6997
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02006998 Py_RETURN_NONE;
6999}