blob: 20107f225794a034267beebd5fbda6cf5ac8342c [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 *
Hai Shia13b26c2020-11-11 04:53:46 +08001021test_get_statictype_slots(PyObject *self, PyObject *Py_UNUSED(ignored))
1022{
1023 newfunc tp_new = PyType_GetSlot(&PyLong_Type, Py_tp_new);
1024 if (PyLong_Type.tp_new != tp_new) {
1025 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_new of long");
1026 return NULL;
1027 }
1028
1029 reprfunc tp_repr = PyType_GetSlot(&PyLong_Type, Py_tp_repr);
1030 if (PyLong_Type.tp_repr != tp_repr) {
1031 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_repr of long");
1032 return NULL;
1033 }
1034
1035 ternaryfunc tp_call = PyType_GetSlot(&PyLong_Type, Py_tp_call);
1036 if (tp_call != NULL) {
1037 PyErr_SetString(PyExc_AssertionError, "mismatch: tp_call of long");
1038 return NULL;
1039 }
1040
1041 binaryfunc nb_add = PyType_GetSlot(&PyLong_Type, Py_nb_add);
1042 if (PyLong_Type.tp_as_number->nb_add != nb_add) {
1043 PyErr_SetString(PyExc_AssertionError, "mismatch: nb_add of long");
1044 return NULL;
1045 }
1046
1047 lenfunc mp_length = PyType_GetSlot(&PyLong_Type, Py_mp_length);
1048 if (mp_length != NULL) {
1049 PyErr_SetString(PyExc_AssertionError, "mismatch: mp_length of long");
1050 return NULL;
1051 }
1052
1053 void *over_value = PyType_GetSlot(&PyLong_Type, Py_bf_releasebuffer + 1);
1054 if (over_value != NULL) {
1055 PyErr_SetString(PyExc_AssertionError, "mismatch: max+1 of long");
1056 return NULL;
1057 }
1058
1059 tp_new = PyType_GetSlot(&PyLong_Type, 0);
1060 if (tp_new != NULL) {
1061 PyErr_SetString(PyExc_AssertionError, "mismatch: slot 0 of long");
1062 return NULL;
1063 }
1064 if (PyErr_ExceptionMatches(PyExc_SystemError)) {
1065 // This is the right exception
1066 PyErr_Clear();
1067 }
1068 else {
1069 return NULL;
1070 }
1071
1072 Py_RETURN_NONE;
1073}
1074
1075
1076static PyObject *
Serhiy Storchakace412872016-05-08 23:36:44 +03001077get_args(PyObject *self, PyObject *args)
1078{
1079 if (args == NULL) {
1080 args = Py_None;
1081 }
1082 Py_INCREF(args);
1083 return args;
1084}
1085
1086static PyObject *
1087get_kwargs(PyObject *self, PyObject *args, PyObject *kwargs)
1088{
1089 if (kwargs == NULL) {
1090 kwargs = Py_None;
1091 }
1092 Py_INCREF(kwargs);
1093 return kwargs;
1094}
1095
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001096/* Test tuple argument processing */
1097static PyObject *
1098getargs_tuple(PyObject *self, PyObject *args)
1099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 int a, b, c;
1101 if (!PyArg_ParseTuple(args, "i(ii)", &a, &b, &c))
1102 return NULL;
1103 return Py_BuildValue("iii", a, b, c);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001104}
1105
Christian Heimes380f7f22008-02-28 11:19:05 +00001106/* test PyArg_ParseTupleAndKeywords */
Larry Hastings83a9f482012-03-20 20:06:16 +00001107static PyObject *
1108getargs_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
Christian Heimes380f7f22008-02-28 11:19:05 +00001109{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 static char *keywords[] = {"arg1","arg2","arg3","arg4","arg5", NULL};
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001111 static const char fmt[] = "(ii)i|(i(ii))(iii)i";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 int int_args[10]={-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Christian Heimes380f7f22008-02-28 11:19:05 +00001113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
1115 &int_args[0], &int_args[1], &int_args[2], &int_args[3], &int_args[4],
1116 &int_args[5], &int_args[6], &int_args[7], &int_args[8], &int_args[9]))
1117 return NULL;
1118 return Py_BuildValue("iiiiiiiiii",
1119 int_args[0], int_args[1], int_args[2], int_args[3], int_args[4],
1120 int_args[5], int_args[6], int_args[7], int_args[8], int_args[9]);
Christian Heimes380f7f22008-02-28 11:19:05 +00001121}
1122
Larry Hastings83a9f482012-03-20 20:06:16 +00001123/* test PyArg_ParseTupleAndKeywords keyword-only arguments */
1124static PyObject *
1125getargs_keyword_only(PyObject *self, PyObject *args, PyObject *kwargs)
1126{
1127 static char *keywords[] = {"required", "optional", "keyword_only", NULL};
1128 int required = -1;
1129 int optional = -1;
1130 int keyword_only = -1;
1131
1132 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i$i", keywords,
1133 &required, &optional, &keyword_only))
1134 return NULL;
1135 return Py_BuildValue("iii", required, optional, keyword_only);
1136}
1137
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03001138/* test PyArg_ParseTupleAndKeywords positional-only arguments */
1139static PyObject *
1140getargs_positional_only_and_keywords(PyObject *self, PyObject *args, PyObject *kwargs)
1141{
1142 static char *keywords[] = {"", "", "keyword", NULL};
1143 int required = -1;
1144 int optional = -1;
1145 int keyword = -1;
1146
1147 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|ii", keywords,
1148 &required, &optional, &keyword))
1149 return NULL;
1150 return Py_BuildValue("iii", required, optional, keyword);
1151}
1152
Thomas Heller3457e4b2003-04-24 16:14:27 +00001153/* Functions to call PyArg_ParseTuple with integer format codes,
1154 and return the result.
1155*/
Thomas Hellera4ea6032003-04-17 18:55:45 +00001156static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001157getargs_b(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 unsigned char value;
1160 if (!PyArg_ParseTuple(args, "b", &value))
1161 return NULL;
1162 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001163}
1164
Thomas Heller3457e4b2003-04-24 16:14:27 +00001165static PyObject *
1166getargs_B(PyObject *self, PyObject *args)
1167{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 unsigned char value;
1169 if (!PyArg_ParseTuple(args, "B", &value))
1170 return NULL;
1171 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001172}
1173
1174static PyObject *
Mark Dickinson1554b182009-12-20 16:03:30 +00001175getargs_h(PyObject *self, PyObject *args)
1176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 short value;
1178 if (!PyArg_ParseTuple(args, "h", &value))
1179 return NULL;
1180 return PyLong_FromLong((long)value);
Mark Dickinson1554b182009-12-20 16:03:30 +00001181}
1182
1183static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001184getargs_H(PyObject *self, PyObject *args)
1185{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 unsigned short value;
1187 if (!PyArg_ParseTuple(args, "H", &value))
1188 return NULL;
1189 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001190}
1191
1192static PyObject *
1193getargs_I(PyObject *self, PyObject *args)
1194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 unsigned int value;
1196 if (!PyArg_ParseTuple(args, "I", &value))
1197 return NULL;
1198 return PyLong_FromUnsignedLong((unsigned long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001199}
1200
1201static PyObject *
1202getargs_k(PyObject *self, PyObject *args)
1203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 unsigned long value;
1205 if (!PyArg_ParseTuple(args, "k", &value))
1206 return NULL;
1207 return PyLong_FromUnsignedLong(value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001208}
1209
1210static PyObject *
1211getargs_i(PyObject *self, PyObject *args)
1212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 int value;
1214 if (!PyArg_ParseTuple(args, "i", &value))
1215 return NULL;
1216 return PyLong_FromLong((long)value);
Thomas Heller3457e4b2003-04-24 16:14:27 +00001217}
1218
Thomas Hellera4ea6032003-04-17 18:55:45 +00001219static PyObject *
1220getargs_l(PyObject *self, PyObject *args)
1221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 long value;
1223 if (!PyArg_ParseTuple(args, "l", &value))
1224 return NULL;
1225 return PyLong_FromLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001226}
1227
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001228static PyObject *
1229getargs_n(PyObject *self, PyObject *args)
1230{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 Py_ssize_t value;
1232 if (!PyArg_ParseTuple(args, "n", &value))
1233 return NULL;
1234 return PyLong_FromSsize_t(value);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001235}
1236
Larry Hastingsfaf91e72012-05-05 16:54:29 -07001237static PyObject *
1238getargs_p(PyObject *self, PyObject *args)
1239{
1240 int value;
1241 if (!PyArg_ParseTuple(args, "p", &value))
1242 return NULL;
1243 return PyLong_FromLong(value);
1244}
1245
Thomas Hellera4ea6032003-04-17 18:55:45 +00001246static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001247getargs_L(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001248{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001249 long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 if (!PyArg_ParseTuple(args, "L", &value))
1251 return NULL;
1252 return PyLong_FromLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001253}
1254
Thomas Hellera4ea6032003-04-17 18:55:45 +00001255static PyObject *
Thomas Heller3457e4b2003-04-24 16:14:27 +00001256getargs_K(PyObject *self, PyObject *args)
Thomas Hellera4ea6032003-04-17 18:55:45 +00001257{
Benjamin Petersonaf580df2016-09-06 10:46:49 -07001258 unsigned long long value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 if (!PyArg_ParseTuple(args, "K", &value))
1260 return NULL;
1261 return PyLong_FromUnsignedLongLong(value);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001262}
Thomas Hellera4ea6032003-04-17 18:55:45 +00001263
1264/* This function not only tests the 'k' getargs code, but also the
orenmn698845e2017-03-02 13:29:20 +02001265 PyLong_AsUnsignedLongMask() function. */
Thomas Hellera4ea6032003-04-17 18:55:45 +00001266static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301267test_k_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Hellera4ea6032003-04-17 18:55:45 +00001268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 PyObject *tuple, *num;
1270 unsigned long value;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 tuple = PyTuple_New(1);
1273 if (tuple == NULL)
1274 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 /* a number larger than ULONG_MAX even on 64-bit platforms */
1277 num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
1278 if (num == NULL)
1279 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 value = PyLong_AsUnsignedLongMask(num);
1282 if (value != ULONG_MAX)
1283 return raiseTestError("test_k_code",
Georg Brandl4b5b0622016-01-18 08:00:15 +01001284 "PyLong_AsUnsignedLongMask() returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001289 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001291 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 if (value != ULONG_MAX)
1293 return raiseTestError("test_k_code",
1294 "k code returned wrong value for long 0xFFF...FFF");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 Py_DECREF(num);
1297 num = PyLong_FromString("-FFFFFFFF000000000000000042", NULL, 16);
1298 if (num == NULL)
1299 return NULL;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 value = PyLong_AsUnsignedLongMask(num);
1302 if (value != (unsigned long)-0x42)
1303 return raiseTestError("test_k_code",
orenmn698845e2017-03-02 13:29:20 +02001304 "PyLong_AsUnsignedLongMask() returned wrong "
1305 "value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 PyTuple_SET_ITEM(tuple, 0, num);
Thomas Hellera4ea6032003-04-17 18:55:45 +00001308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001310 if (!PyArg_ParseTuple(tuple, "k:test_k_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001312 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 if (value != (unsigned long)-0x42)
1314 return raiseTestError("test_k_code",
1315 "k code returned wrong value for long -0xFFF..000042");
Thomas Hellera4ea6032003-04-17 18:55:45 +00001316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001318 Py_RETURN_NONE;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001319}
1320
Victor Stinner06e49dd2010-06-13 18:21:50 +00001321static PyObject *
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001322getargs_f(PyObject *self, PyObject *args)
1323{
1324 float f;
1325 if (!PyArg_ParseTuple(args, "f", &f))
1326 return NULL;
1327 return PyFloat_FromDouble(f);
1328}
1329
1330static PyObject *
1331getargs_d(PyObject *self, PyObject *args)
1332{
1333 double d;
1334 if (!PyArg_ParseTuple(args, "d", &d))
1335 return NULL;
1336 return PyFloat_FromDouble(d);
1337}
1338
1339static PyObject *
1340getargs_D(PyObject *self, PyObject *args)
1341{
1342 Py_complex cval;
1343 if (!PyArg_ParseTuple(args, "D", &cval))
1344 return NULL;
1345 return PyComplex_FromCComplex(cval);
1346}
1347
1348static PyObject *
1349getargs_S(PyObject *self, PyObject *args)
1350{
1351 PyObject *obj;
1352 if (!PyArg_ParseTuple(args, "S", &obj))
1353 return NULL;
1354 Py_INCREF(obj);
1355 return obj;
1356}
1357
1358static PyObject *
1359getargs_Y(PyObject *self, PyObject *args)
1360{
1361 PyObject *obj;
1362 if (!PyArg_ParseTuple(args, "Y", &obj))
1363 return NULL;
1364 Py_INCREF(obj);
1365 return obj;
1366}
1367
1368static PyObject *
1369getargs_U(PyObject *self, PyObject *args)
1370{
1371 PyObject *obj;
1372 if (!PyArg_ParseTuple(args, "U", &obj))
1373 return NULL;
1374 Py_INCREF(obj);
1375 return obj;
1376}
1377
1378static PyObject *
Eli Bendersky906b88f2011-07-29 07:05:08 +03001379getargs_c(PyObject *self, PyObject *args)
1380{
1381 char c;
1382 if (!PyArg_ParseTuple(args, "c", &c))
1383 return NULL;
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001384 return PyLong_FromLong((unsigned char)c);
1385}
1386
1387static PyObject *
1388getargs_C(PyObject *self, PyObject *args)
1389{
1390 int c;
1391 if (!PyArg_ParseTuple(args, "C", &c))
1392 return NULL;
1393 return PyLong_FromLong(c);
Eli Bendersky906b88f2011-07-29 07:05:08 +03001394}
1395
1396static PyObject *
Victor Stinner06e49dd2010-06-13 18:21:50 +00001397getargs_s(PyObject *self, PyObject *args)
1398{
1399 char *str;
1400 if (!PyArg_ParseTuple(args, "s", &str))
1401 return NULL;
1402 return PyBytes_FromString(str);
1403}
1404
1405static PyObject *
1406getargs_s_star(PyObject *self, PyObject *args)
1407{
1408 Py_buffer buffer;
1409 PyObject *bytes;
1410 if (!PyArg_ParseTuple(args, "s*", &buffer))
1411 return NULL;
1412 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1413 PyBuffer_Release(&buffer);
1414 return bytes;
1415}
1416
1417static PyObject *
1418getargs_s_hash(PyObject *self, PyObject *args)
1419{
1420 char *str;
1421 Py_ssize_t size;
1422 if (!PyArg_ParseTuple(args, "s#", &str, &size))
1423 return NULL;
1424 return PyBytes_FromStringAndSize(str, size);
1425}
1426
1427static PyObject *
1428getargs_z(PyObject *self, PyObject *args)
1429{
1430 char *str;
1431 if (!PyArg_ParseTuple(args, "z", &str))
1432 return NULL;
1433 if (str != NULL)
1434 return PyBytes_FromString(str);
1435 else
1436 Py_RETURN_NONE;
1437}
1438
1439static PyObject *
1440getargs_z_star(PyObject *self, PyObject *args)
1441{
1442 Py_buffer buffer;
1443 PyObject *bytes;
1444 if (!PyArg_ParseTuple(args, "z*", &buffer))
1445 return NULL;
1446 if (buffer.buf != NULL)
1447 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1448 else {
1449 Py_INCREF(Py_None);
1450 bytes = Py_None;
1451 }
1452 PyBuffer_Release(&buffer);
1453 return bytes;
1454}
1455
1456static PyObject *
1457getargs_z_hash(PyObject *self, PyObject *args)
1458{
1459 char *str;
1460 Py_ssize_t size;
1461 if (!PyArg_ParseTuple(args, "z#", &str, &size))
1462 return NULL;
1463 if (str != NULL)
1464 return PyBytes_FromStringAndSize(str, size);
1465 else
1466 Py_RETURN_NONE;
1467}
1468
1469static PyObject *
1470getargs_y(PyObject *self, PyObject *args)
1471{
1472 char *str;
1473 if (!PyArg_ParseTuple(args, "y", &str))
1474 return NULL;
1475 return PyBytes_FromString(str);
1476}
1477
1478static PyObject *
1479getargs_y_star(PyObject *self, PyObject *args)
1480{
1481 Py_buffer buffer;
1482 PyObject *bytes;
1483 if (!PyArg_ParseTuple(args, "y*", &buffer))
1484 return NULL;
1485 bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
1486 PyBuffer_Release(&buffer);
1487 return bytes;
1488}
1489
1490static PyObject *
1491getargs_y_hash(PyObject *self, PyObject *args)
1492{
1493 char *str;
1494 Py_ssize_t size;
1495 if (!PyArg_ParseTuple(args, "y#", &str, &size))
1496 return NULL;
1497 return PyBytes_FromStringAndSize(str, size);
1498}
1499
1500static PyObject *
1501getargs_u(PyObject *self, PyObject *args)
1502{
1503 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001504 if (!PyArg_ParseTuple(args, "u", &str))
1505 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001506 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001507}
1508
1509static PyObject *
1510getargs_u_hash(PyObject *self, PyObject *args)
1511{
1512 Py_UNICODE *str;
1513 Py_ssize_t size;
1514 if (!PyArg_ParseTuple(args, "u#", &str, &size))
1515 return NULL;
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001516 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001517}
1518
1519static PyObject *
1520getargs_Z(PyObject *self, PyObject *args)
1521{
1522 Py_UNICODE *str;
Victor Stinner06e49dd2010-06-13 18:21:50 +00001523 if (!PyArg_ParseTuple(args, "Z", &str))
1524 return NULL;
1525 if (str != NULL) {
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001526 return PyUnicode_FromWideChar(str, -1);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001527 } else
1528 Py_RETURN_NONE;
1529}
1530
1531static PyObject *
1532getargs_Z_hash(PyObject *self, PyObject *args)
1533{
1534 Py_UNICODE *str;
1535 Py_ssize_t size;
1536 if (!PyArg_ParseTuple(args, "Z#", &str, &size))
1537 return NULL;
1538 if (str != NULL)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +02001539 return PyUnicode_FromWideChar(str, size);
Victor Stinner06e49dd2010-06-13 18:21:50 +00001540 else
1541 Py_RETURN_NONE;
1542}
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001543
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02001544static PyObject *
1545getargs_es(PyObject *self, PyObject *args)
1546{
1547 PyObject *arg, *result;
1548 const char *encoding = NULL;
1549 char *str;
1550
1551 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1552 return NULL;
1553 if (!PyArg_Parse(arg, "es", encoding, &str))
1554 return NULL;
1555 result = PyBytes_FromString(str);
1556 PyMem_Free(str);
1557 return result;
1558}
1559
1560static PyObject *
1561getargs_et(PyObject *self, PyObject *args)
1562{
1563 PyObject *arg, *result;
1564 const char *encoding = NULL;
1565 char *str;
1566
1567 if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1568 return NULL;
1569 if (!PyArg_Parse(arg, "et", encoding, &str))
1570 return NULL;
1571 result = PyBytes_FromString(str);
1572 PyMem_Free(str);
1573 return result;
1574}
1575
1576static PyObject *
1577getargs_es_hash(PyObject *self, PyObject *args)
1578{
1579 PyObject *arg, *result;
1580 const char *encoding = NULL;
1581 PyByteArrayObject *buffer = NULL;
1582 char *str = NULL;
1583 Py_ssize_t size;
1584
1585 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1586 return NULL;
1587 if (buffer != NULL) {
1588 str = PyByteArray_AS_STRING(buffer);
1589 size = PyByteArray_GET_SIZE(buffer);
1590 }
1591 if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1592 return NULL;
1593 result = PyBytes_FromStringAndSize(str, size);
1594 if (buffer == NULL)
1595 PyMem_Free(str);
1596 return result;
1597}
1598
1599static PyObject *
1600getargs_et_hash(PyObject *self, PyObject *args)
1601{
1602 PyObject *arg, *result;
1603 const char *encoding = NULL;
1604 PyByteArrayObject *buffer = NULL;
1605 char *str = NULL;
1606 Py_ssize_t size;
1607
1608 if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1609 return NULL;
1610 if (buffer != NULL) {
1611 str = PyByteArray_AS_STRING(buffer);
1612 size = PyByteArray_GET_SIZE(buffer);
1613 }
1614 if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1615 return NULL;
1616 result = PyBytes_FromStringAndSize(str, size);
1617 if (buffer == NULL)
1618 PyMem_Free(str);
1619 return result;
1620}
1621
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001622/* Test the s and z codes for PyArg_ParseTuple.
1623*/
1624static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301625test_s_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001626{
1627 /* Unicode strings should be accepted */
1628 PyObject *tuple, *obj;
1629 char *value;
1630
1631 tuple = PyTuple_New(1);
1632 if (tuple == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001634
1635 obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 "latin-1", NULL);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001637 if (obj == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 return NULL;
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001639
1640 PyTuple_SET_ITEM(tuple, 0, obj);
1641
1642 /* These two blocks used to raise a TypeError:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 * "argument must be string without null bytes, not str"
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001644 */
Oren Milmanba7d7362017-08-29 11:58:27 +03001645 if (!PyArg_ParseTuple(tuple, "s:test_s_code1", &value)) {
1646 return NULL;
1647 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001648
Oren Milmanba7d7362017-08-29 11:58:27 +03001649 if (!PyArg_ParseTuple(tuple, "z:test_s_code2", &value)) {
1650 return NULL;
1651 }
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001652
Alexandre Vassalottib645bc72008-05-15 22:06:59 +00001653 Py_DECREF(tuple);
Amaury Forgeot d'Arc07404592008-05-12 13:19:07 +00001654 Py_RETURN_NONE;
1655}
1656
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001657static PyObject *
Larry Hastings8f904da2012-06-22 03:56:29 -07001658parse_tuple_and_keywords(PyObject *self, PyObject *args)
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001659{
Larry Hastings8f904da2012-06-22 03:56:29 -07001660 PyObject *sub_args;
1661 PyObject *sub_kwargs;
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001662 const char *sub_format;
Larry Hastings8f904da2012-06-22 03:56:29 -07001663 PyObject *sub_keywords;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001664
Larry Hastings8f904da2012-06-22 03:56:29 -07001665 Py_ssize_t i, size;
1666 char *keywords[8 + 1]; /* space for NULL at end */
1667 PyObject *o;
1668 PyObject *converted[8];
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001669
Larry Hastings8f904da2012-06-22 03:56:29 -07001670 int result;
1671 PyObject *return_value = NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001672
Larry Hastings22701e82012-08-08 14:52:22 -07001673 double buffers[8][4]; /* double ensures alignment where necessary */
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001674
Serhiy Storchaka5f161fd2017-05-04 00:03:23 +03001675 if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords",
Larry Hastings8f904da2012-06-22 03:56:29 -07001676 &sub_args, &sub_kwargs,
1677 &sub_format, &sub_keywords))
1678 return NULL;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001679
Larry Hastings8f904da2012-06-22 03:56:29 -07001680 if (!(PyList_CheckExact(sub_keywords) || PyTuple_CheckExact(sub_keywords))) {
1681 PyErr_SetString(PyExc_ValueError,
1682 "parse_tuple_and_keywords: sub_keywords must be either list or tuple");
1683 return NULL;
1684 }
1685
1686 memset(buffers, 0, sizeof(buffers));
1687 memset(converted, 0, sizeof(converted));
1688 memset(keywords, 0, sizeof(keywords));
1689
1690 size = PySequence_Fast_GET_SIZE(sub_keywords);
1691 if (size > 8) {
1692 PyErr_SetString(PyExc_ValueError,
1693 "parse_tuple_and_keywords: too many keywords in sub_keywords");
1694 goto exit;
1695 }
1696
1697 for (i = 0; i < size; i++) {
1698 o = PySequence_Fast_GET_ITEM(sub_keywords, i);
1699 if (!PyUnicode_FSConverter(o, (void *)(converted + i))) {
1700 PyErr_Format(PyExc_ValueError,
Jesus Cea6e1d2b62012-10-04 16:06:30 +02001701 "parse_tuple_and_keywords: could not convert keywords[%zd] to narrow string", i);
Larry Hastings8f904da2012-06-22 03:56:29 -07001702 goto exit;
1703 }
1704 keywords[i] = PyBytes_AS_STRING(converted[i]);
1705 }
1706
1707 result = PyArg_ParseTupleAndKeywords(sub_args, sub_kwargs,
1708 sub_format, keywords,
1709 buffers + 0, buffers + 1, buffers + 2, buffers + 3,
1710 buffers + 4, buffers + 5, buffers + 6, buffers + 7);
1711
1712 if (result) {
1713 return_value = Py_None;
1714 Py_INCREF(Py_None);
1715 }
1716
1717exit:
1718 size = sizeof(converted) / sizeof(converted[0]);
1719 for (i = 0; i < size; i++) {
1720 Py_XDECREF(converted[i]);
1721 }
1722 return return_value;
Mark Dickinsonf08173b2009-12-03 10:59:46 +00001723}
1724
Benjamin Peterson92035012008-12-27 16:00:54 +00001725static volatile int x;
1726
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001727#if USE_UNICODE_WCHAR_CACHE
Inada Naoki2c4928d2020-06-17 20:09:44 +09001728/* Ignore use of deprecated APIs */
1729_Py_COMP_DIAG_PUSH
1730_Py_COMP_DIAG_IGNORE_DEPR_DECLS
1731
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001732/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
1733 of an error.
1734*/
1735static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301736test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001737{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 PyObject *tuple, *obj;
1739 Py_UNICODE *value;
1740 Py_ssize_t len;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
1743 /* Just use the macro and check that it compiles */
1744 x = Py_UNICODE_ISSPACE(25);
Benjamin Peterson206e3072008-10-19 14:07:49 +00001745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 tuple = PyTuple_New(1);
1747 if (tuple == NULL)
1748 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 obj = PyUnicode_Decode("test", strlen("test"),
1751 "ascii", NULL);
1752 if (obj == NULL)
1753 return NULL;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 PyTuple_SET_ITEM(tuple, 0, obj);
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001758 if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001760 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 if (value != PyUnicode_AS_UNICODE(obj))
1762 return raiseTestError("test_u_code",
1763 "u code returned wrong value for u'test'");
1764 value = 0;
Oren Milmanba7d7362017-08-29 11:58:27 +03001765 if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001767 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 if (value != PyUnicode_AS_UNICODE(obj) ||
1769 len != PyUnicode_GET_SIZE(obj))
1770 return raiseTestError("test_u_code",
1771 "u# code returned wrong values for u'test'");
Tim Petersbaefd9e2003-01-28 20:37:45 +00001772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 Py_DECREF(tuple);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001774 Py_RETURN_NONE;
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00001775}
1776
Guido van Rossumfb67be22007-08-29 18:38:11 +00001777/* Test Z and Z# codes for PyArg_ParseTuple */
1778static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301779test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored))
Guido van Rossumfb67be22007-08-29 18:38:11 +00001780{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 PyObject *tuple, *obj;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001782 const Py_UNICODE *value1, *value2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 Py_ssize_t len1, len2;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 tuple = PyTuple_New(2);
1786 if (tuple == NULL)
1787 return NULL;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 obj = PyUnicode_FromString("test");
1790 PyTuple_SET_ITEM(tuple, 0, obj);
1791 Py_INCREF(Py_None);
1792 PyTuple_SET_ITEM(tuple, 1, Py_None);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 /* swap values on purpose */
1795 value1 = NULL;
1796 value2 = PyUnicode_AS_UNICODE(obj);
Guido van Rossumfb67be22007-08-29 18:38:11 +00001797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 /* Test Z for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001799 if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001801 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 if (value1 != PyUnicode_AS_UNICODE(obj))
1803 return raiseTestError("test_Z_code",
1804 "Z code returned wrong value for 'test'");
1805 if (value2 != NULL)
1806 return raiseTestError("test_Z_code",
1807 "Z code returned wrong value for None");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 value1 = NULL;
1810 value2 = PyUnicode_AS_UNICODE(obj);
1811 len1 = -1;
1812 len2 = -1;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 /* Test Z# for both values */
Oren Milmanba7d7362017-08-29 11:58:27 +03001815 if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1,
1816 &value2, &len2))
1817 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03001819 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 if (value1 != PyUnicode_AS_UNICODE(obj) ||
1821 len1 != PyUnicode_GET_SIZE(obj))
1822 return raiseTestError("test_Z_code",
1823 "Z# code returned wrong values for 'test'");
1824 if (value2 != NULL ||
1825 len2 != 0)
1826 return raiseTestError("test_Z_code",
1827 "Z# code returned wrong values for None'");
Guido van Rossumfb67be22007-08-29 18:38:11 +00001828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 Py_DECREF(tuple);
1830 Py_RETURN_NONE;
Guido van Rossumfb67be22007-08-29 18:38:11 +00001831}
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001832_Py_COMP_DIAG_POP
1833#endif /* USE_UNICODE_WCHAR_CACHE */
Guido van Rossumfb67be22007-08-29 18:38:11 +00001834
Thomas Wouters477c8d52006-05-27 19:21:47 +00001835static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301836test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Mark Dickinson081dfee2009-03-18 14:47:41 +00001837{
1838#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 const wchar_t wtext[2] = {(wchar_t)0x10ABCDu};
1840 size_t wtextlen = 1;
Victor Stinnere3b47152011-12-09 20:49:49 +01001841 const wchar_t invalid[1] = {(wchar_t)0x110000u};
Mark Dickinson081dfee2009-03-18 14:47:41 +00001842#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 const wchar_t wtext[3] = {(wchar_t)0xDBEAu, (wchar_t)0xDFCDu};
1844 size_t wtextlen = 2;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001845#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 PyObject *wide, *utf8;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 wide = PyUnicode_FromWideChar(wtext, wtextlen);
1849 if (wide == NULL)
1850 return NULL;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 utf8 = PyUnicode_FromString("\xf4\x8a\xaf\x8d");
1853 if (utf8 == NULL) {
1854 Py_DECREF(wide);
1855 return NULL;
1856 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001857
Victor Stinner8ef18872011-11-21 02:06:57 +01001858 if (PyUnicode_GET_LENGTH(wide) != PyUnicode_GET_LENGTH(utf8)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 Py_DECREF(wide);
1860 Py_DECREF(utf8);
1861 return raiseTestError("test_widechar",
1862 "wide string and utf8 string "
1863 "have different length");
1864 }
1865 if (PyUnicode_Compare(wide, utf8)) {
1866 Py_DECREF(wide);
1867 Py_DECREF(utf8);
1868 if (PyErr_Occurred())
1869 return NULL;
1870 return raiseTestError("test_widechar",
1871 "wide string and utf8 string "
1872 "are different");
1873 }
Mark Dickinson081dfee2009-03-18 14:47:41 +00001874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 Py_DECREF(wide);
1876 Py_DECREF(utf8);
Victor Stinnere3b47152011-12-09 20:49:49 +01001877
1878#if defined(SIZEOF_WCHAR_T) && (SIZEOF_WCHAR_T == 4)
1879 wide = PyUnicode_FromWideChar(invalid, 1);
1880 if (wide == NULL)
1881 PyErr_Clear();
1882 else
1883 return raiseTestError("test_widechar",
1884 "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail");
1885
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001886#if USE_UNICODE_WCHAR_CACHE
1887/* Ignore use of deprecated APIs */
1888_Py_COMP_DIAG_PUSH
1889_Py_COMP_DIAG_IGNORE_DEPR_DECLS
Victor Stinnere3b47152011-12-09 20:49:49 +01001890 wide = PyUnicode_FromUnicode(invalid, 1);
1891 if (wide == NULL)
1892 PyErr_Clear();
1893 else
1894 return raiseTestError("test_widechar",
1895 "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail");
Victor Stinnere5c05332013-03-06 00:39:03 +01001896
1897 wide = PyUnicode_FromUnicode(NULL, 1);
1898 if (wide == NULL)
1899 return NULL;
1900 PyUnicode_AS_UNICODE(wide)[0] = invalid[0];
Ezio Melotti03e667d2013-03-07 21:18:45 +02001901 if (_PyUnicode_Ready(wide) < 0) {
1902 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001903 PyErr_Clear();
Ezio Melotti03e667d2013-03-07 21:18:45 +02001904 }
1905 else {
1906 Py_DECREF(wide);
Victor Stinnere5c05332013-03-06 00:39:03 +01001907 return raiseTestError("test_widechar",
1908 "PyUnicode_Ready() didn't fail");
Ezio Melotti03e667d2013-03-07 21:18:45 +02001909 }
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001910_Py_COMP_DIAG_POP
1911#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinnere3b47152011-12-09 20:49:49 +01001912#endif
1913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 Py_RETURN_NONE;
Mark Dickinson081dfee2009-03-18 14:47:41 +00001915}
1916
1917static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001918unicode_aswidechar(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001919{
1920 PyObject *unicode, *result;
1921 Py_ssize_t buflen, size;
1922 wchar_t *buffer;
1923
1924 if (!PyArg_ParseTuple(args, "Un", &unicode, &buflen))
1925 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001926 buffer = PyMem_New(wchar_t, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001927 if (buffer == NULL)
1928 return PyErr_NoMemory();
1929
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001930 size = PyUnicode_AsWideChar(unicode, buffer, buflen);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001931 if (size == -1) {
1932 PyMem_Free(buffer);
1933 return NULL;
1934 }
1935
1936 if (size < buflen)
1937 buflen = size + 1;
1938 else
1939 buflen = size;
1940 result = PyUnicode_FromWideChar(buffer, buflen);
1941 PyMem_Free(buffer);
1942 if (result == NULL)
1943 return NULL;
1944
1945 return Py_BuildValue("(Nn)", result, size);
1946}
1947
1948static PyObject *
Victor Stinner46c7b3b2010-10-02 11:49:31 +00001949unicode_aswidecharstring(PyObject *self, PyObject *args)
Victor Stinner1c24bd02010-10-02 11:03:13 +00001950{
1951 PyObject *unicode, *result;
1952 Py_ssize_t size;
1953 wchar_t *buffer;
1954
1955 if (!PyArg_ParseTuple(args, "U", &unicode))
1956 return NULL;
1957
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001958 buffer = PyUnicode_AsWideCharString(unicode, &size);
Victor Stinner1c24bd02010-10-02 11:03:13 +00001959 if (buffer == NULL)
1960 return NULL;
1961
1962 result = PyUnicode_FromWideChar(buffer, size + 1);
1963 PyMem_Free(buffer);
1964 if (result == NULL)
1965 return NULL;
1966 return Py_BuildValue("(Nn)", result, size);
1967}
1968
1969static PyObject *
Serhiy Storchakacc164232016-10-02 21:29:26 +03001970unicode_asucs4(PyObject *self, PyObject *args)
1971{
1972 PyObject *unicode, *result;
1973 Py_UCS4 *buffer;
1974 int copy_null;
1975 Py_ssize_t str_len, buf_len;
1976
1977 if (!PyArg_ParseTuple(args, "Unp:unicode_asucs4", &unicode, &str_len, &copy_null)) {
1978 return NULL;
1979 }
1980
1981 buf_len = str_len + 1;
1982 buffer = PyMem_NEW(Py_UCS4, buf_len);
1983 if (buffer == NULL) {
1984 return PyErr_NoMemory();
1985 }
1986 memset(buffer, 0, sizeof(Py_UCS4)*buf_len);
1987 buffer[str_len] = 0xffffU;
1988
1989 if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
Victor Stinner00d7abd2020-12-01 09:56:42 +01001990 PyMem_Free(buffer);
Serhiy Storchakacc164232016-10-02 21:29:26 +03001991 return NULL;
1992 }
1993
1994 result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
Victor Stinner00d7abd2020-12-01 09:56:42 +01001995 PyMem_Free(buffer);
Serhiy Storchakacc164232016-10-02 21:29:26 +03001996 return result;
1997}
1998
1999static PyObject *
Hai Shi5623ac82019-07-20 02:56:23 -05002000unicode_asutf8(PyObject *self, PyObject *args)
2001{
2002 PyObject *unicode;
2003 const char *buffer;
2004
2005 if (!PyArg_ParseTuple(args, "U", &unicode)) {
2006 return NULL;
2007 }
2008
2009 buffer = PyUnicode_AsUTF8(unicode);
2010 if (buffer == NULL) {
2011 return NULL;
2012 }
2013
2014 return PyBytes_FromString(buffer);
2015}
2016
2017static PyObject *
2018unicode_asutf8andsize(PyObject *self, PyObject *args)
2019{
2020 PyObject *unicode, *result;
2021 const char *buffer;
2022 Py_ssize_t utf8_len;
2023
2024 if(!PyArg_ParseTuple(args, "U", &unicode)) {
2025 return NULL;
2026 }
2027
Victor Stinneraca8c402019-09-30 21:14:26 +02002028 buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len);
Hai Shi5623ac82019-07-20 02:56:23 -05002029 if (buffer == NULL) {
2030 return NULL;
2031 }
2032
2033 result = PyBytes_FromString(buffer);
2034 if (result == NULL) {
2035 return NULL;
2036 }
2037
2038 return Py_BuildValue("(Nn)", result, utf8_len);
2039}
2040
2041static PyObject *
Xiang Zhangb2110682016-12-20 22:52:33 +08002042unicode_findchar(PyObject *self, PyObject *args)
2043{
2044 PyObject *str;
2045 int direction;
2046 unsigned int ch;
2047 Py_ssize_t result;
2048 Py_ssize_t start, end;
2049
2050 if (!PyArg_ParseTuple(args, "UInni:unicode_findchar", &str, &ch,
2051 &start, &end, &direction)) {
2052 return NULL;
2053 }
2054
2055 result = PyUnicode_FindChar(str, (Py_UCS4)ch, start, end, direction);
2056 if (result == -2)
2057 return NULL;
2058 else
2059 return PyLong_FromSsize_t(result);
2060}
2061
2062static PyObject *
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002063unicode_copycharacters(PyObject *self, PyObject *args)
2064{
2065 PyObject *from, *to, *to_copy;
2066 Py_ssize_t from_start, to_start, how_many, copied;
2067
2068 if (!PyArg_ParseTuple(args, "UnOnn:unicode_copycharacters", &to, &to_start,
2069 &from, &from_start, &how_many)) {
2070 return NULL;
2071 }
2072
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002073 if (!(to_copy = PyUnicode_New(PyUnicode_GET_LENGTH(to),
2074 PyUnicode_MAX_CHAR_VALUE(to)))) {
2075 return NULL;
2076 }
2077 if (PyUnicode_Fill(to_copy, 0, PyUnicode_GET_LENGTH(to_copy), 0U) < 0) {
2078 Py_DECREF(to_copy);
2079 return NULL;
2080 }
2081
2082 if ((copied = PyUnicode_CopyCharacters(to_copy, to_start, from,
2083 from_start, how_many)) < 0) {
2084 Py_DECREF(to_copy);
2085 return NULL;
2086 }
2087
2088 return Py_BuildValue("(Nn)", to_copy, copied);
2089}
2090
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002091#if USE_UNICODE_WCHAR_CACHE
Inada Naoki13c90e82020-07-05 11:01:54 +09002092/* Ignore use of deprecated APIs */
2093_Py_COMP_DIAG_PUSH
2094_Py_COMP_DIAG_IGNORE_DEPR_DECLS
2095
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03002096static PyObject *
Victor Stinner42bf7752011-11-21 22:52:58 +01002097unicode_encodedecimal(PyObject *self, PyObject *args)
2098{
2099 Py_UNICODE *unicode;
2100 Py_ssize_t length;
2101 char *errors = NULL;
2102 PyObject *decimal;
2103 Py_ssize_t decimal_length, new_length;
2104 int res;
2105
2106 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length, &errors))
2107 return NULL;
2108
2109 decimal_length = length * 7; /* len('&#8364;') */
2110 decimal = PyBytes_FromStringAndSize(NULL, decimal_length);
2111 if (decimal == NULL)
2112 return NULL;
2113
2114 res = PyUnicode_EncodeDecimal(unicode, length,
2115 PyBytes_AS_STRING(decimal),
2116 errors);
2117 if (res < 0) {
2118 Py_DECREF(decimal);
2119 return NULL;
2120 }
2121
2122 new_length = strlen(PyBytes_AS_STRING(decimal));
2123 assert(new_length <= decimal_length);
2124 res = _PyBytes_Resize(&decimal, new_length);
2125 if (res < 0)
2126 return NULL;
2127
2128 return decimal;
2129}
2130
2131static PyObject *
2132unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
2133{
2134 Py_UNICODE *unicode;
2135 Py_ssize_t length;
2136 if (!PyArg_ParseTuple(args, "u#|s", &unicode, &length))
2137 return NULL;
2138 return PyUnicode_TransformDecimalToASCII(unicode, length);
2139}
2140
2141static PyObject *
Stefan Krahe6996ed2012-11-02 14:44:20 +01002142unicode_legacy_string(PyObject *self, PyObject *args)
2143{
2144 Py_UNICODE *data;
2145 Py_ssize_t len;
2146 PyObject *u;
2147
2148 if (!PyArg_ParseTuple(args, "u#", &data, &len))
2149 return NULL;
2150
2151 u = PyUnicode_FromUnicode(NULL, len);
2152 if (u == NULL)
2153 return NULL;
2154
2155 memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE));
2156
2157 if (len > 0) { /* The empty string is always ready. */
2158 assert(!PyUnicode_IS_READY(u));
2159 }
2160
2161 return u;
2162}
Inada Naoki2c4928d2020-06-17 20:09:44 +09002163_Py_COMP_DIAG_POP
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03002164#endif /* USE_UNICODE_WCHAR_CACHE */
Stefan Krahe6996ed2012-11-02 14:44:20 +01002165
2166static PyObject *
Victor Stinner25e8ec42010-06-25 00:02:38 +00002167getargs_w_star(PyObject *self, PyObject *args)
2168{
2169 Py_buffer buffer;
2170 PyObject *result;
2171 char *str;
2172
2173 if (!PyArg_ParseTuple(args, "w*:getargs_w_star", &buffer))
2174 return NULL;
2175
2176 if (2 <= buffer.len) {
2177 str = buffer.buf;
2178 str[0] = '[';
2179 str[buffer.len-1] = ']';
2180 }
2181
2182 result = PyBytes_FromStringAndSize(buffer.buf, buffer.len);
2183 PyBuffer_Release(&buffer);
2184 return result;
2185}
2186
2187
2188static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302189test_empty_argparse(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson92035012008-12-27 16:00:54 +00002190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 /* Test that formats can begin with '|'. See issue #4720. */
2192 PyObject *tuple, *dict = NULL;
2193 static char *kwlist[] = {NULL};
2194 int result;
2195 tuple = PyTuple_New(0);
2196 if (!tuple)
2197 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002198 if (!(result = PyArg_ParseTuple(tuple, "|:test_empty_argparse"))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 goto done;
Oren Milmanba7d7362017-08-29 11:58:27 +03002200 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002201 dict = PyDict_New();
2202 if (!dict)
2203 goto done;
2204 result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
Benjamin Peterson92035012008-12-27 16:00:54 +00002205 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 Py_DECREF(tuple);
2207 Py_XDECREF(dict);
Oren Milmanba7d7362017-08-29 11:58:27 +03002208 if (!result) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002209 return NULL;
Oren Milmanba7d7362017-08-29 11:58:27 +03002210 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002211 else {
2212 Py_RETURN_NONE;
2213 }
Benjamin Peterson92035012008-12-27 16:00:54 +00002214}
2215
2216static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00002217codec_incrementalencoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 const char *encoding, *errors = NULL;
2220 if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder",
2221 &encoding, &errors))
2222 return NULL;
2223 return PyCodec_IncrementalEncoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002224}
2225
Thomas Wouters477c8d52006-05-27 19:21:47 +00002226static PyObject *
2227codec_incrementaldecoder(PyObject *self, PyObject *args)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 const char *encoding, *errors = NULL;
2230 if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder",
2231 &encoding, &errors))
2232 return NULL;
2233 return PyCodec_IncrementalDecoder(encoding, errors);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002234}
2235
Marc-André Lemburg3e3eacb2002-01-09 16:21:27 +00002236
Tim Peters5b8132f2003-01-31 15:52:05 +00002237/* Simple test of _PyLong_NumBits and _PyLong_Sign. */
Tim Petersbaefd9e2003-01-28 20:37:45 +00002238static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302239test_long_numbits(PyObject *self, PyObject *Py_UNUSED(ignored))
Tim Petersbaefd9e2003-01-28 20:37:45 +00002240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 struct triple {
2242 long input;
2243 size_t nbits;
2244 int sign;
2245 } testcases[] = {{0, 0, 0},
2246 {1L, 1, 1},
2247 {-1L, 1, -1},
2248 {2L, 2, 1},
2249 {-2L, 2, -1},
2250 {3L, 2, 1},
2251 {-3L, 2, -1},
2252 {4L, 3, 1},
2253 {-4L, 3, -1},
Serhiy Storchaka95949422013-08-27 19:40:23 +03002254 {0x7fffL, 15, 1}, /* one Python int digit */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 {-0x7fffL, 15, -1},
2256 {0xffffL, 16, 1},
2257 {-0xffffL, 16, -1},
2258 {0xfffffffL, 28, 1},
2259 {-0xfffffffL, 28, -1}};
Victor Stinner706768c2014-08-16 01:03:39 +02002260 size_t i;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002261
Victor Stinner63941882011-09-29 00:42:28 +02002262 for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
Christian Heimes3205e742013-07-26 15:06:48 +02002263 size_t nbits;
2264 int sign;
2265 PyObject *plong;
2266
2267 plong = PyLong_FromLong(testcases[i].input);
Christian Heimesff369a52013-07-26 14:52:18 +02002268 if (plong == NULL)
2269 return NULL;
Christian Heimes3205e742013-07-26 15:06:48 +02002270 nbits = _PyLong_NumBits(plong);
2271 sign = _PyLong_Sign(plong);
Tim Petersbaefd9e2003-01-28 20:37:45 +00002272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 Py_DECREF(plong);
2274 if (nbits != testcases[i].nbits)
2275 return raiseTestError("test_long_numbits",
2276 "wrong result for _PyLong_NumBits");
2277 if (sign != testcases[i].sign)
2278 return raiseTestError("test_long_numbits",
2279 "wrong result for _PyLong_Sign");
2280 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002281 Py_RETURN_NONE;
Tim Petersbaefd9e2003-01-28 20:37:45 +00002282}
2283
Thomas Heller519a0422007-11-15 20:48:54 +00002284/* Example passing NULLs to PyObject_Str(NULL). */
Thomas Woutersa9773292006-04-21 09:43:23 +00002285
2286static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302287test_null_strings(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Woutersa9773292006-04-21 09:43:23 +00002288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Str(NULL);
2290 PyObject *tuple = PyTuple_Pack(2, o1, o2);
2291 Py_XDECREF(o1);
2292 Py_XDECREF(o2);
2293 return tuple;
Thomas Woutersa9773292006-04-21 09:43:23 +00002294}
2295
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002296static PyObject *
2297raise_exception(PyObject *self, PyObject *args)
2298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 PyObject *exc;
2300 PyObject *exc_args, *v;
2301 int num_args, i;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 if (!PyArg_ParseTuple(args, "Oi:raise_exception",
2304 &exc, &num_args))
2305 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 exc_args = PyTuple_New(num_args);
2308 if (exc_args == NULL)
2309 return NULL;
2310 for (i = 0; i < num_args; ++i) {
2311 v = PyLong_FromLong(i);
2312 if (v == NULL) {
2313 Py_DECREF(exc_args);
2314 return NULL;
2315 }
2316 PyTuple_SET_ITEM(exc_args, i, v);
2317 }
2318 PyErr_SetObject(exc, exc_args);
2319 Py_DECREF(exc_args);
2320 return NULL;
Jeremy Hyltonede049b2001-09-26 20:01:13 +00002321}
Tim Peters91621db2001-06-12 20:10:01 +00002322
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002323static PyObject *
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02002324set_errno(PyObject *self, PyObject *args)
2325{
2326 int new_errno;
2327
2328 if (!PyArg_ParseTuple(args, "i:set_errno", &new_errno))
2329 return NULL;
2330
2331 errno = new_errno;
2332 Py_RETURN_NONE;
2333}
2334
2335static PyObject *
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02002336test_set_exc_info(PyObject *self, PyObject *args)
2337{
2338 PyObject *orig_exc;
2339 PyObject *new_type, *new_value, *new_tb;
2340 PyObject *type, *value, *tb;
2341 if (!PyArg_ParseTuple(args, "OOO:test_set_exc_info",
2342 &new_type, &new_value, &new_tb))
2343 return NULL;
2344
2345 PyErr_GetExcInfo(&type, &value, &tb);
2346
2347 Py_INCREF(new_type);
2348 Py_INCREF(new_value);
2349 Py_INCREF(new_tb);
2350 PyErr_SetExcInfo(new_type, new_value, new_tb);
2351
2352 orig_exc = PyTuple_Pack(3, type ? type : Py_None, value ? value : Py_None, tb ? tb : Py_None);
2353 Py_XDECREF(type);
2354 Py_XDECREF(value);
2355 Py_XDECREF(tb);
2356 return orig_exc;
2357}
Benjamin Peterson16323982010-02-03 01:13:41 +00002358
2359static int test_run_counter = 0;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002360
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002361static PyObject *
2362test_datetime_capi(PyObject *self, PyObject *args) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 if (PyDateTimeAPI) {
2364 if (test_run_counter) {
2365 /* Probably regrtest.py -R */
2366 Py_RETURN_NONE;
2367 }
2368 else {
2369 PyErr_SetString(PyExc_AssertionError,
2370 "PyDateTime_CAPI somehow initialized");
2371 return NULL;
2372 }
2373 }
2374 test_run_counter++;
2375 PyDateTime_IMPORT;
Paul Ganssle04af5b12018-01-24 17:29:30 -05002376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 if (PyDateTimeAPI)
2378 Py_RETURN_NONE;
2379 else
2380 return NULL;
Benjamin Peterson91d58bd2009-12-13 21:30:54 +00002381}
2382
Paul Ganssle04af5b12018-01-24 17:29:30 -05002383/* Functions exposing the C API type checking for testing */
2384#define MAKE_DATETIME_CHECK_FUNC(check_method, exact_method) \
2385 PyObject *obj; \
2386 int exact = 0; \
2387 if (!PyArg_ParseTuple(args, "O|p", &obj, &exact)) { \
2388 return NULL; \
2389 } \
2390 int rv = exact?exact_method(obj):check_method(obj); \
2391 if (rv) { \
2392 Py_RETURN_TRUE; \
2393 } else { \
2394 Py_RETURN_FALSE; \
2395 }
2396
2397static PyObject *
2398datetime_check_date(PyObject *self, PyObject *args) {
2399 MAKE_DATETIME_CHECK_FUNC(PyDate_Check, PyDate_CheckExact)
2400}
2401
2402static PyObject *
2403datetime_check_time(PyObject *self, PyObject *args) {
2404 MAKE_DATETIME_CHECK_FUNC(PyTime_Check, PyTime_CheckExact)
2405}
2406
2407static PyObject *
2408datetime_check_datetime(PyObject *self, PyObject *args) {
2409 MAKE_DATETIME_CHECK_FUNC(PyDateTime_Check, PyDateTime_CheckExact)
2410}
2411
2412static PyObject *
2413datetime_check_delta(PyObject *self, PyObject *args) {
2414 MAKE_DATETIME_CHECK_FUNC(PyDelta_Check, PyDelta_CheckExact)
2415}
2416
2417static PyObject *
2418datetime_check_tzinfo(PyObject *self, PyObject *args) {
2419 MAKE_DATETIME_CHECK_FUNC(PyTZInfo_Check, PyTZInfo_CheckExact)
2420}
2421
2422
2423/* Makes three variations on timezone representing UTC-5:
2424 1. timezone with offset and name from PyDateTimeAPI
2425 2. timezone with offset and name from PyTimeZone_FromOffsetAndName
2426 3. timezone with offset (no name) from PyTimeZone_FromOffset
2427*/
2428static PyObject *
2429make_timezones_capi(PyObject *self, PyObject *args) {
2430 PyObject *offset = PyDelta_FromDSU(0, -18000, 0);
2431 PyObject *name = PyUnicode_FromString("EST");
2432
2433 PyObject *est_zone_capi = PyDateTimeAPI->TimeZone_FromTimeZone(offset, name);
2434 PyObject *est_zone_macro = PyTimeZone_FromOffsetAndName(offset, name);
2435 PyObject *est_zone_macro_noname = PyTimeZone_FromOffset(offset);
2436
2437 Py_DecRef(offset);
2438 Py_DecRef(name);
2439
2440 PyObject *rv = PyTuple_New(3);
2441
2442 PyTuple_SET_ITEM(rv, 0, est_zone_capi);
2443 PyTuple_SET_ITEM(rv, 1, est_zone_macro);
2444 PyTuple_SET_ITEM(rv, 2, est_zone_macro_noname);
2445
2446 return rv;
2447}
2448
2449static PyObject *
Paul Gansslea049f572018-02-22 15:15:32 -05002450get_timezones_offset_zero(PyObject *self, PyObject *args) {
2451 PyObject *offset = PyDelta_FromDSU(0, 0, 0);
2452 PyObject *name = PyUnicode_FromString("");
2453
2454 // These two should return the UTC singleton
2455 PyObject *utc_singleton_0 = PyTimeZone_FromOffset(offset);
2456 PyObject *utc_singleton_1 = PyTimeZone_FromOffsetAndName(offset, NULL);
2457
2458 // This one will return +00:00 zone, but not the UTC singleton
2459 PyObject *non_utc_zone = PyTimeZone_FromOffsetAndName(offset, name);
2460
2461 Py_DecRef(offset);
2462 Py_DecRef(name);
2463
2464 PyObject *rv = PyTuple_New(3);
2465 PyTuple_SET_ITEM(rv, 0, utc_singleton_0);
2466 PyTuple_SET_ITEM(rv, 1, utc_singleton_1);
2467 PyTuple_SET_ITEM(rv, 2, non_utc_zone);
2468
2469 return rv;
2470}
2471
2472static PyObject *
Paul Ganssle04af5b12018-01-24 17:29:30 -05002473get_timezone_utc_capi(PyObject* self, PyObject *args) {
2474 int macro = 0;
2475 if (!PyArg_ParseTuple(args, "|p", &macro)) {
2476 return NULL;
2477 }
2478 if (macro) {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002479 Py_INCREF(PyDateTime_TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002480 return PyDateTime_TimeZone_UTC;
2481 } else {
Paul Ganssle58dc03c2018-01-25 08:58:07 -05002482 Py_INCREF(PyDateTimeAPI->TimeZone_UTC);
Paul Ganssle04af5b12018-01-24 17:29:30 -05002483 return PyDateTimeAPI->TimeZone_UTC;
2484 }
2485}
2486
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002487static PyObject *
Edison A98ff4d52019-05-17 13:28:42 -07002488get_date_fromdate(PyObject *self, PyObject *args)
2489{
2490 PyObject *rv = NULL;
2491 int macro;
2492 int year, month, day;
2493
2494 if (!PyArg_ParseTuple(args, "piii", &macro, &year, &month, &day)) {
2495 return NULL;
2496 }
2497
2498 if (macro) {
2499 rv = PyDate_FromDate(year, month, day);
2500 }
2501 else {
2502 rv = PyDateTimeAPI->Date_FromDate(
2503 year, month, day,
2504 PyDateTimeAPI->DateType);
2505 }
2506 return rv;
2507}
2508
2509static PyObject *
2510get_datetime_fromdateandtime(PyObject *self, PyObject *args)
2511{
2512 PyObject *rv = NULL;
2513 int macro;
2514 int year, month, day;
2515 int hour, minute, second, microsecond;
2516
2517 if (!PyArg_ParseTuple(args, "piiiiiii",
2518 &macro,
2519 &year, &month, &day,
2520 &hour, &minute, &second, &microsecond)) {
2521 return NULL;
2522 }
2523
2524 if (macro) {
2525 rv = PyDateTime_FromDateAndTime(
2526 year, month, day,
2527 hour, minute, second, microsecond);
2528 }
2529 else {
2530 rv = PyDateTimeAPI->DateTime_FromDateAndTime(
2531 year, month, day,
2532 hour, minute, second, microsecond,
2533 Py_None,
2534 PyDateTimeAPI->DateTimeType);
2535 }
2536 return rv;
2537}
2538
2539static PyObject *
2540get_datetime_fromdateandtimeandfold(PyObject *self, PyObject *args)
2541{
2542 PyObject *rv = NULL;
2543 int macro;
2544 int year, month, day;
2545 int hour, minute, second, microsecond, fold;
2546
2547 if (!PyArg_ParseTuple(args, "piiiiiiii",
2548 &macro,
2549 &year, &month, &day,
2550 &hour, &minute, &second, &microsecond,
2551 &fold)) {
2552 return NULL;
2553 }
2554
2555 if (macro) {
2556 rv = PyDateTime_FromDateAndTimeAndFold(
2557 year, month, day,
2558 hour, minute, second, microsecond,
2559 fold);
2560 }
2561 else {
2562 rv = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(
2563 year, month, day,
2564 hour, minute, second, microsecond,
2565 Py_None,
2566 fold,
2567 PyDateTimeAPI->DateTimeType);
2568 }
2569 return rv;
2570}
2571
2572static PyObject *
2573get_time_fromtime(PyObject *self, PyObject *args)
2574{
2575 PyObject *rv = NULL;
2576 int macro;
2577 int hour, minute, second, microsecond;
2578
2579 if (!PyArg_ParseTuple(args, "piiii",
2580 &macro,
2581 &hour, &minute, &second, &microsecond)) {
2582 return NULL;
2583 }
2584
2585 if (macro) {
2586 rv = PyTime_FromTime(hour, minute, second, microsecond);
2587 }
2588 else {
2589 rv = PyDateTimeAPI->Time_FromTime(
2590 hour, minute, second, microsecond,
2591 Py_None,
2592 PyDateTimeAPI->TimeType);
2593 }
2594 return rv;
2595}
2596
2597static PyObject *
2598get_time_fromtimeandfold(PyObject *self, PyObject *args)
2599{
2600 PyObject *rv = NULL;
2601 int macro;
2602 int hour, minute, second, microsecond, fold;
2603
2604 if (!PyArg_ParseTuple(args, "piiiii",
2605 &macro,
2606 &hour, &minute, &second, &microsecond,
2607 &fold)) {
2608 return NULL;
2609 }
2610
2611 if (macro) {
2612 rv = PyTime_FromTimeAndFold(hour, minute, second, microsecond, fold);
2613 }
2614 else {
2615 rv = PyDateTimeAPI->Time_FromTimeAndFold(
2616 hour, minute, second, microsecond,
2617 Py_None,
2618 fold,
2619 PyDateTimeAPI->TimeType);
2620 }
2621 return rv;
2622}
2623
2624static PyObject *
2625get_delta_fromdsu(PyObject *self, PyObject *args)
2626{
2627 PyObject *rv = NULL;
2628 int macro;
2629 int days, seconds, microseconds;
2630
2631 if (!PyArg_ParseTuple(args, "piii",
2632 &macro,
2633 &days, &seconds, &microseconds)) {
2634 return NULL;
2635 }
2636
2637 if (macro) {
2638 rv = PyDelta_FromDSU(days, seconds, microseconds);
2639 }
2640 else {
2641 rv = PyDateTimeAPI->Delta_FromDelta(
2642 days, seconds, microseconds, 1,
2643 PyDateTimeAPI->DeltaType);
2644 }
2645
2646 return rv;
2647}
2648
2649static PyObject *
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04002650get_date_fromtimestamp(PyObject* self, PyObject *args)
2651{
2652 PyObject *tsargs = NULL, *ts = NULL, *rv = NULL;
2653 int macro = 0;
2654
2655 if (!PyArg_ParseTuple(args, "O|p", &ts, &macro)) {
2656 return NULL;
2657 }
2658
2659 // Construct the argument tuple
2660 if ((tsargs = PyTuple_Pack(1, ts)) == NULL) {
2661 return NULL;
2662 }
2663
2664 // Pass along to the API function
2665 if (macro) {
2666 rv = PyDate_FromTimestamp(tsargs);
2667 }
2668 else {
2669 rv = PyDateTimeAPI->Date_FromTimestamp(
2670 (PyObject *)PyDateTimeAPI->DateType, tsargs
2671 );
2672 }
2673
2674 Py_DECREF(tsargs);
2675 return rv;
2676}
2677
2678static PyObject *
2679get_datetime_fromtimestamp(PyObject* self, PyObject *args)
2680{
2681 int macro = 0;
2682 int usetz = 0;
2683 PyObject *tsargs = NULL, *ts = NULL, *tzinfo = Py_None, *rv = NULL;
2684 if (!PyArg_ParseTuple(args, "OO|pp", &ts, &tzinfo, &usetz, &macro)) {
2685 return NULL;
2686 }
2687
2688 // Construct the argument tuple
2689 if (usetz) {
2690 tsargs = PyTuple_Pack(2, ts, tzinfo);
2691 }
2692 else {
2693 tsargs = PyTuple_Pack(1, ts);
2694 }
2695
2696 if (tsargs == NULL) {
2697 return NULL;
2698 }
2699
2700 // Pass along to the API function
2701 if (macro) {
2702 rv = PyDateTime_FromTimestamp(tsargs);
2703 }
2704 else {
2705 rv = PyDateTimeAPI->DateTime_FromTimestamp(
2706 (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL
2707 );
2708 }
2709
2710 Py_DECREF(tsargs);
2711 return rv;
2712}
2713
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002714static PyObject *
2715test_PyDateTime_GET(PyObject *self, PyObject *obj)
2716{
2717 int year, month, day;
2718
2719 year = PyDateTime_GET_YEAR(obj);
2720 month = PyDateTime_GET_MONTH(obj);
2721 day = PyDateTime_GET_DAY(obj);
2722
2723 return Py_BuildValue("(lll)", year, month, day);
2724}
2725
2726static PyObject *
2727test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj)
2728{
2729 int hour, minute, second, microsecond;
2730
2731 hour = PyDateTime_DATE_GET_HOUR(obj);
2732 minute = PyDateTime_DATE_GET_MINUTE(obj);
2733 second = PyDateTime_DATE_GET_SECOND(obj);
2734 microsecond = PyDateTime_DATE_GET_MICROSECOND(obj);
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002735 PyObject *tzinfo = PyDateTime_DATE_GET_TZINFO(obj);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002736
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002737 return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002738}
2739
2740static PyObject *
2741test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj)
2742{
2743 int hour, minute, second, microsecond;
2744
2745 hour = PyDateTime_TIME_GET_HOUR(obj);
2746 minute = PyDateTime_TIME_GET_MINUTE(obj);
2747 second = PyDateTime_TIME_GET_SECOND(obj);
2748 microsecond = PyDateTime_TIME_GET_MICROSECOND(obj);
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002749 PyObject *tzinfo = PyDateTime_TIME_GET_TZINFO(obj);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002750
Zackery Spytz2e4dd332020-09-23 12:43:45 -06002751 return Py_BuildValue("(llllO)", hour, minute, second, microsecond, tzinfo);
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03002752}
2753
2754static PyObject *
2755test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj)
2756{
2757 int days, seconds, microseconds;
2758
2759 days = PyDateTime_DELTA_GET_DAYS(obj);
2760 seconds = PyDateTime_DELTA_GET_SECONDS(obj);
2761 microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj);
2762
2763 return Py_BuildValue("(lll)", days, seconds, microseconds);
2764}
Benjamin Peterson16323982010-02-03 01:13:41 +00002765
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002766/* test_thread_state spawns a thread of its own, and that thread releases
2767 * `thread_done` when it's finished. The driver code has to know when the
2768 * thread finishes, because the thread uses a PyObject (the callable) that
2769 * may go away when the driver finishes. The former lack of this explicit
2770 * synchronization caused rare segfaults, so rare that they were seen only
2771 * on a Mac buildbot (although they were possible on any box).
2772 */
2773static PyThread_type_lock thread_done = NULL;
2774
Benjamin Petersona786b022008-08-25 21:05:21 +00002775static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002776_make_call(void *callable)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778 PyObject *rc;
2779 int success;
2780 PyGILState_STATE s = PyGILState_Ensure();
Victor Stinner3466bde2016-09-05 18:16:01 -07002781 rc = _PyObject_CallNoArg((PyObject *)callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 success = (rc != NULL);
2783 Py_XDECREF(rc);
2784 PyGILState_Release(s);
2785 return success;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002786}
2787
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002788/* Same thing, but releases `thread_done` when it returns. This variant
2789 * should be called only from threads spawned by test_thread_state().
2790 */
2791static void
2792_make_call_from_thread(void *callable)
2793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794 _make_call(callable);
2795 PyThread_release_lock(thread_done);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002796}
2797
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002798static PyObject *
2799test_thread_state(PyObject *self, PyObject *args)
2800{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801 PyObject *fn;
2802 int success = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn))
2805 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 if (!PyCallable_Check(fn)) {
2808 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
Victor Stinnerdaa97562020-02-07 03:37:06 +01002809 Py_TYPE(fn)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 return NULL;
2811 }
Benjamin Petersona786b022008-08-25 21:05:21 +00002812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002813 thread_done = PyThread_allocate_lock();
2814 if (thread_done == NULL)
2815 return PyErr_NoMemory();
2816 PyThread_acquire_lock(thread_done, 1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 /* Start a new thread with our callback. */
2819 PyThread_start_new_thread(_make_call_from_thread, fn);
2820 /* Make the callback with the thread lock held by this thread */
2821 success &= _make_call(fn);
2822 /* Do it all again, but this time with the thread-lock released */
2823 Py_BEGIN_ALLOW_THREADS
2824 success &= _make_call(fn);
2825 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2826 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 /* And once more with and without a thread
2829 XXX - should use a lock and work out exactly what we are trying
2830 to test <wink>
2831 */
2832 Py_BEGIN_ALLOW_THREADS
2833 PyThread_start_new_thread(_make_call_from_thread, fn);
2834 success &= _make_call(fn);
2835 PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */
2836 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002838 /* Release lock we acquired above. This is required on HP-UX. */
2839 PyThread_release_lock(thread_done);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 PyThread_free_lock(thread_done);
2842 if (!success)
2843 return NULL;
2844 Py_RETURN_NONE;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002845}
Benjamin Petersona54c9092009-01-13 02:11:23 +00002846
2847/* test Py_AddPendingCalls using threads */
2848static int _pending_callback(void *arg)
2849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 /* we assume the argument is callable object to which we own a reference */
2851 PyObject *callable = (PyObject *)arg;
Victor Stinnera5ed5f02016-12-06 18:45:50 +01002852 PyObject *r = _PyObject_CallNoArg(callable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002853 Py_DECREF(callable);
2854 Py_XDECREF(r);
2855 return r != NULL ? 0 : -1;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002856}
2857
2858/* The following requests n callbacks to _pending_callback. It can be
2859 * run from any python thread.
2860 */
Benjamin Petersonb4588c22018-07-03 22:30:56 -07002861static PyObject *
2862pending_threadfunc(PyObject *self, PyObject *arg)
Benjamin Petersona54c9092009-01-13 02:11:23 +00002863{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 PyObject *callable;
2865 int r;
2866 if (PyArg_ParseTuple(arg, "O", &callable) == 0)
2867 return NULL;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002869 /* create the reference for the callbackwhile we hold the lock */
2870 Py_INCREF(callable);
Benjamin Petersona54c9092009-01-13 02:11:23 +00002871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 Py_BEGIN_ALLOW_THREADS
2873 r = Py_AddPendingCall(&_pending_callback, callable);
2874 Py_END_ALLOW_THREADS
Benjamin Petersona54c9092009-01-13 02:11:23 +00002875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 if (r<0) {
2877 Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002878 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002879 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002880 Py_RETURN_TRUE;
Benjamin Petersona54c9092009-01-13 02:11:23 +00002881}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00002882
Neal Norwitzb0d26332007-08-25 00:49:05 +00002883/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002884static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02002885test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002886{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 PyObject *result;
2888 char *msg;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002889
Alexander Belopolskye239d232010-12-08 23:31:48 +00002890#define CHECK_1_FORMAT(FORMAT, TYPE) \
2891 result = PyUnicode_FromFormat(FORMAT, (TYPE)1); \
2892 if (result == NULL) \
2893 return NULL; \
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002894 if (!_PyUnicode_EqualToASCIIString(result, "1")) { \
Alexander Belopolskye239d232010-12-08 23:31:48 +00002895 msg = FORMAT " failed at 1"; \
2896 goto Fail; \
2897 } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002898 Py_DECREF(result)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002900 CHECK_1_FORMAT("%d", int);
2901 CHECK_1_FORMAT("%ld", long);
2902 /* The z width modifier was added in Python 2.5. */
2903 CHECK_1_FORMAT("%zd", Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002905 /* The u type code was added in Python 2.5. */
2906 CHECK_1_FORMAT("%u", unsigned int);
2907 CHECK_1_FORMAT("%lu", unsigned long);
2908 CHECK_1_FORMAT("%zu", size_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 /* "%lld" and "%llu" support added in Python 2.7. */
Benjamin Petersonaf580df2016-09-06 10:46:49 -07002911 CHECK_1_FORMAT("%llu", unsigned long long);
2912 CHECK_1_FORMAT("%lld", long long);
Mark Dickinson6ce4a9a2009-11-16 17:00:11 +00002913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002915
2916 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 Py_XDECREF(result);
2918 return raiseTestError("test_string_from_format", msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002919
2920#undef CHECK_1_FORMAT
2921}
2922
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002923
2924static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302925test_unicode_compare_with_ascii(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
2927 int result;
2928 if (py_s == NULL)
2929 return NULL;
2930 result = PyUnicode_CompareWithASCIIString(py_s, "str");
2931 Py_DECREF(py_s);
2932 if (!result) {
2933 PyErr_SetString(TestError, "Python string ending in NULL "
2934 "should not compare equal to c string.");
2935 return NULL;
2936 }
2937 Py_RETURN_NONE;
Victor Stinner3e2b7172010-11-09 09:32:19 +00002938}
Benjamin Peterson8667a9b2010-01-09 21:45:28 +00002939
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002940/* This is here to provide a docstring for test_descr. */
2941static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302942test_with_docstring(PyObject *self, PyObject *Py_UNUSED(ignored))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002944 Py_RETURN_NONE;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002945}
2946
Mark Dickinson725bfd82009-05-03 20:33:40 +00002947/* Test PyOS_string_to_double. */
2948static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302949test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 double result;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002951 const char *msg;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953#define CHECK_STRING(STR, expected) \
2954 result = PyOS_string_to_double(STR, NULL, NULL); \
2955 if (result == -1.0 && PyErr_Occurred()) \
2956 return NULL; \
Benjamin Peterson8f4b2472016-09-07 18:09:22 -07002957 if (result != (double)expected) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 msg = "conversion of " STR " to float failed"; \
2959 goto fail; \
2960 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002962#define CHECK_INVALID(STR) \
2963 result = PyOS_string_to_double(STR, NULL, NULL); \
2964 if (result == -1.0 && PyErr_Occurred()) { \
2965 if (PyErr_ExceptionMatches(PyExc_ValueError)) \
2966 PyErr_Clear(); \
2967 else \
2968 return NULL; \
2969 } \
2970 else { \
2971 msg = "conversion of " STR " didn't raise ValueError"; \
2972 goto fail; \
2973 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00002974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975 CHECK_STRING("0.1", 0.1);
2976 CHECK_STRING("1.234", 1.234);
2977 CHECK_STRING("-1.35", -1.35);
2978 CHECK_STRING(".1e01", 1.0);
2979 CHECK_STRING("2.e-2", 0.02);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 CHECK_INVALID(" 0.1");
2982 CHECK_INVALID("\t\n-3");
2983 CHECK_INVALID(".123 ");
2984 CHECK_INVALID("3\n");
2985 CHECK_INVALID("123abc");
Mark Dickinson725bfd82009-05-03 20:33:40 +00002986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002987 Py_RETURN_NONE;
Mark Dickinson725bfd82009-05-03 20:33:40 +00002988 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002989 return raiseTestError("test_string_to_double", msg);
Mark Dickinson725bfd82009-05-03 20:33:40 +00002990#undef CHECK_STRING
2991#undef CHECK_INVALID
2992}
2993
2994
Benjamin Petersonb173f782009-05-05 22:31:58 +00002995/* Coverage testing of capsule objects. */
2996
2997static const char *capsule_name = "capsule name";
2998static char *capsule_pointer = "capsule pointer";
2999static char *capsule_context = "capsule context";
3000static const char *capsule_error = NULL;
3001static int
3002capsule_destructor_call_count = 0;
3003
3004static void
3005capsule_destructor(PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003006 capsule_destructor_call_count++;
3007 if (PyCapsule_GetContext(o) != capsule_context) {
3008 capsule_error = "context did not match in destructor!";
3009 } else if (PyCapsule_GetDestructor(o) != capsule_destructor) {
3010 capsule_error = "destructor did not match in destructor! (woah!)";
3011 } else if (PyCapsule_GetName(o) != capsule_name) {
3012 capsule_error = "name did not match in destructor!";
3013 } else if (PyCapsule_GetPointer(o, capsule_name) != capsule_pointer) {
3014 capsule_error = "pointer did not match in destructor!";
3015 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003016}
3017
3018typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 char *name;
3020 char *module;
3021 char *attribute;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003022} known_capsule;
3023
3024static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003025test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Petersonb173f782009-05-05 22:31:58 +00003026{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003027 PyObject *object;
3028 const char *error = NULL;
3029 void *pointer;
3030 void *pointer2;
3031 known_capsule known_capsules[] = {
3032 #define KNOWN_CAPSULE(module, name) { module "." name, module, name }
3033 KNOWN_CAPSULE("_socket", "CAPI"),
3034 KNOWN_CAPSULE("_curses", "_C_API"),
3035 KNOWN_CAPSULE("datetime", "datetime_CAPI"),
3036 { NULL, NULL },
3037 };
3038 known_capsule *known = &known_capsules[0];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003039
3040#define FAIL(x) { error = (x); goto exit; }
3041
3042#define CHECK_DESTRUCTOR \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 if (capsule_error) { \
3044 FAIL(capsule_error); \
3045 } \
3046 else if (!capsule_destructor_call_count) { \
3047 FAIL("destructor not called!"); \
3048 } \
3049 capsule_destructor_call_count = 0; \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003051 object = PyCapsule_New(capsule_pointer, capsule_name, capsule_destructor);
3052 PyCapsule_SetContext(object, capsule_context);
3053 capsule_destructor(object);
3054 CHECK_DESTRUCTOR;
3055 Py_DECREF(object);
3056 CHECK_DESTRUCTOR;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003058 object = PyCapsule_New(known, "ignored", NULL);
3059 PyCapsule_SetPointer(object, capsule_pointer);
3060 PyCapsule_SetName(object, capsule_name);
3061 PyCapsule_SetDestructor(object, capsule_destructor);
3062 PyCapsule_SetContext(object, capsule_context);
3063 capsule_destructor(object);
3064 CHECK_DESTRUCTOR;
3065 /* intentionally access using the wrong name */
3066 pointer2 = PyCapsule_GetPointer(object, "the wrong name");
3067 if (!PyErr_Occurred()) {
3068 FAIL("PyCapsule_GetPointer should have failed but did not!");
3069 }
3070 PyErr_Clear();
3071 if (pointer2) {
3072 if (pointer2 == capsule_pointer) {
3073 FAIL("PyCapsule_GetPointer should not have"
3074 " returned the internal pointer!");
3075 } else {
3076 FAIL("PyCapsule_GetPointer should have "
3077 "returned NULL pointer but did not!");
3078 }
3079 }
3080 PyCapsule_SetDestructor(object, NULL);
3081 Py_DECREF(object);
3082 if (capsule_destructor_call_count) {
3083 FAIL("destructor called when it should not have been!");
3084 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 for (known = &known_capsules[0]; known->module != NULL; known++) {
3087 /* yeah, ordinarily I wouldn't do this either,
3088 but it's fine for this test harness.
3089 */
3090 static char buffer[256];
Benjamin Petersonb173f782009-05-05 22:31:58 +00003091#undef FAIL
3092#define FAIL(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 { \
3094 sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
3095 x, known->module, known->attribute); \
3096 error = buffer; \
3097 goto exit; \
3098 } \
Benjamin Petersonb173f782009-05-05 22:31:58 +00003099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003100 PyObject *module = PyImport_ImportModule(known->module);
3101 if (module) {
3102 pointer = PyCapsule_Import(known->name, 0);
3103 if (!pointer) {
3104 Py_DECREF(module);
3105 FAIL("PyCapsule_GetPointer returned NULL unexpectedly!");
3106 }
3107 object = PyObject_GetAttrString(module, known->attribute);
3108 if (!object) {
3109 Py_DECREF(module);
3110 return NULL;
3111 }
3112 pointer2 = PyCapsule_GetPointer(object,
3113 "weebles wobble but they don't fall down");
3114 if (!PyErr_Occurred()) {
3115 Py_DECREF(object);
3116 Py_DECREF(module);
3117 FAIL("PyCapsule_GetPointer should have failed but did not!");
3118 }
3119 PyErr_Clear();
3120 if (pointer2) {
3121 Py_DECREF(module);
3122 Py_DECREF(object);
3123 if (pointer2 == pointer) {
3124 FAIL("PyCapsule_GetPointer should not have"
3125 " returned its internal pointer!");
3126 } else {
3127 FAIL("PyCapsule_GetPointer should have"
3128 " returned NULL pointer but did not!");
3129 }
3130 }
3131 Py_DECREF(object);
3132 Py_DECREF(module);
3133 }
3134 else
3135 PyErr_Clear();
3136 }
Benjamin Petersonb173f782009-05-05 22:31:58 +00003137
3138 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 if (error) {
3140 return raiseTestError("test_capsule", error);
3141 }
3142 Py_RETURN_NONE;
Benjamin Petersonb173f782009-05-05 22:31:58 +00003143#undef FAIL
3144}
3145
Guido van Rossumddefaf32007-01-14 03:31:43 +00003146#ifdef HAVE_GETTIMEOFDAY
3147/* Profiling of integer performance */
Martin v. Löwis1c951552008-06-13 07:48:19 +00003148static void print_delta(int test, struct timeval *s, struct timeval *e)
Guido van Rossumddefaf32007-01-14 03:31:43 +00003149{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003150 e->tv_sec -= s->tv_sec;
3151 e->tv_usec -= s->tv_usec;
3152 if (e->tv_usec < 0) {
3153 e->tv_sec -=1;
3154 e->tv_usec += 1000000;
3155 }
3156 printf("Test %d: %d.%06ds\n", test, (int)e->tv_sec, (int)e->tv_usec);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003157}
3158
3159static PyObject *
3160profile_int(PyObject *self, PyObject* args)
3161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003162 int i, k;
3163 struct timeval start, stop;
3164 PyObject *single, **multiple, *op1, *result;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003166 /* Test 1: Allocate and immediately deallocate
3167 many small integers */
3168 gettimeofday(&start, NULL);
3169 for(k=0; k < 20000; k++)
3170 for(i=0; i < 1000; i++) {
3171 single = PyLong_FromLong(i);
3172 Py_DECREF(single);
3173 }
3174 gettimeofday(&stop, NULL);
3175 print_delta(1, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003177 /* Test 2: Allocate and immediately deallocate
3178 many large integers */
3179 gettimeofday(&start, NULL);
3180 for(k=0; k < 20000; k++)
3181 for(i=0; i < 1000; i++) {
3182 single = PyLong_FromLong(i+1000000);
3183 Py_DECREF(single);
3184 }
3185 gettimeofday(&stop, NULL);
3186 print_delta(2, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003188 /* Test 3: Allocate a few integers, then release
3189 them all simultaneously. */
3190 multiple = malloc(sizeof(PyObject*) * 1000);
Christian Heimes7e138022013-07-26 15:03:50 +02003191 if (multiple == NULL)
3192 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003193 gettimeofday(&start, NULL);
3194 for(k=0; k < 20000; k++) {
3195 for(i=0; i < 1000; i++) {
3196 multiple[i] = PyLong_FromLong(i+1000000);
3197 }
3198 for(i=0; i < 1000; i++) {
3199 Py_DECREF(multiple[i]);
3200 }
3201 }
3202 gettimeofday(&stop, NULL);
3203 print_delta(3, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003204 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003206 /* Test 4: Allocate many integers, then release
3207 them all simultaneously. */
3208 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003209 if (multiple == NULL)
3210 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 gettimeofday(&start, NULL);
3212 for(k=0; k < 20; k++) {
3213 for(i=0; i < 1000000; i++) {
3214 multiple[i] = PyLong_FromLong(i+1000000);
3215 }
3216 for(i=0; i < 1000000; i++) {
3217 Py_DECREF(multiple[i]);
3218 }
3219 }
3220 gettimeofday(&stop, NULL);
3221 print_delta(4, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003222 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003224 /* Test 5: Allocate many integers < 32000 */
3225 multiple = malloc(sizeof(PyObject*) * 1000000);
Christian Heimes7e138022013-07-26 15:03:50 +02003226 if (multiple == NULL)
3227 return PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 gettimeofday(&start, NULL);
3229 for(k=0; k < 10; k++) {
3230 for(i=0; i < 1000000; i++) {
3231 multiple[i] = PyLong_FromLong(i+1000);
3232 }
3233 for(i=0; i < 1000000; i++) {
3234 Py_DECREF(multiple[i]);
3235 }
3236 }
3237 gettimeofday(&stop, NULL);
3238 print_delta(5, &start, &stop);
Christian Heimes7e138022013-07-26 15:03:50 +02003239 free(multiple);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 /* Test 6: Perform small int addition */
3242 op1 = PyLong_FromLong(1);
3243 gettimeofday(&start, NULL);
3244 for(i=0; i < 10000000; i++) {
3245 result = PyNumber_Add(op1, op1);
3246 Py_DECREF(result);
3247 }
3248 gettimeofday(&stop, NULL);
3249 Py_DECREF(op1);
3250 print_delta(6, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 /* Test 7: Perform medium int addition */
3253 op1 = PyLong_FromLong(1000);
Christian Heimes66eda262013-07-26 15:54:07 +02003254 if (op1 == NULL)
3255 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003256 gettimeofday(&start, NULL);
3257 for(i=0; i < 10000000; i++) {
3258 result = PyNumber_Add(op1, op1);
Christian Heimesff369a52013-07-26 14:52:18 +02003259 Py_XDECREF(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 }
3261 gettimeofday(&stop, NULL);
3262 Py_DECREF(op1);
3263 print_delta(7, &start, &stop);
Guido van Rossumddefaf32007-01-14 03:31:43 +00003264
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003265 Py_RETURN_NONE;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003266}
3267#endif
3268
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003269/* To test the format of tracebacks as printed out. */
3270static PyObject *
3271traceback_print(PyObject *self, PyObject *args)
3272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003273 PyObject *file;
3274 PyObject *traceback;
3275 int result;
3276
3277 if (!PyArg_ParseTuple(args, "OO:traceback_print",
3278 &traceback, &file))
3279 return NULL;
3280
3281 result = PyTraceBack_Print(traceback, file);
3282 if (result < 0)
3283 return NULL;
3284 Py_RETURN_NONE;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003285}
3286
Benjamin Petersone6528212008-07-15 15:32:09 +00003287/* To test the format of exceptions as printed out. */
3288static PyObject *
3289exception_print(PyObject *self, PyObject *args)
3290{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 PyObject *value;
3292 PyObject *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00003293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 if (!PyArg_ParseTuple(args, "O:exception_print",
3295 &value))
3296 return NULL;
3297 if (!PyExceptionInstance_Check(value)) {
3298 PyErr_Format(PyExc_TypeError, "an exception instance is required");
3299 return NULL;
3300 }
Benjamin Petersone6528212008-07-15 15:32:09 +00003301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 tb = PyException_GetTraceback(value);
3303 PyErr_Display((PyObject *) Py_TYPE(value), value, tb);
3304 Py_XDECREF(tb);
Benjamin Petersone6528212008-07-15 15:32:09 +00003305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 Py_RETURN_NONE;
Benjamin Petersone6528212008-07-15 15:32:09 +00003307}
3308
3309
3310
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003311
3312/* reliably raise a MemoryError */
3313static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303314raise_memoryerror(PyObject *self, PyObject *Py_UNUSED(ignored))
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 PyErr_NoMemory();
3317 return NULL;
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003318}
3319
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003320/* Issue 6012 */
3321static PyObject *str1, *str2;
3322static int
3323failing_converter(PyObject *obj, void *arg)
3324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 /* Clone str1, then let the conversion fail. */
3326 assert(str1);
3327 str2 = str1;
3328 Py_INCREF(str2);
3329 return 0;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003330}
3331static PyObject*
3332argparsing(PyObject *o, PyObject *args)
3333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 PyObject *res;
3335 str1 = str2 = NULL;
3336 if (!PyArg_ParseTuple(args, "O&O&",
3337 PyUnicode_FSConverter, &str1,
3338 failing_converter, &str2)) {
3339 if (!str2)
3340 /* argument converter not called? */
3341 return NULL;
3342 /* Should be 1 */
Victor Stinner0fcab4a2011-01-04 12:59:15 +00003343 res = PyLong_FromSsize_t(Py_REFCNT(str2));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003344 Py_DECREF(str2);
3345 PyErr_Clear();
3346 return res;
3347 }
3348 Py_RETURN_NONE;
Martin v. Löwisc15bdef2009-05-29 14:47:46 +00003349}
Benjamin Peterson0067bd62008-08-16 16:11:03 +00003350
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003351/* To test that the result of PyCode_NewEmpty has the right members. */
3352static PyObject *
3353code_newempty(PyObject *self, PyObject *args)
3354{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 const char *filename;
3356 const char *funcname;
3357 int firstlineno;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 if (!PyArg_ParseTuple(args, "ssi:code_newempty",
3360 &filename, &funcname, &firstlineno))
3361 return NULL;
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 return (PyObject *)PyCode_NewEmpty(filename, funcname, firstlineno);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003364}
3365
Georg Brandl1e28a272009-12-28 08:41:01 +00003366/* Test PyErr_NewExceptionWithDoc (also exercise PyErr_NewException).
3367 Run via Lib/test/test_exceptions.py */
3368static PyObject *
3369make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
3370{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003371 const char *name;
3372 const char *doc = NULL;
3373 PyObject *base = NULL;
3374 PyObject *dict = NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003376 static char *kwlist[] = {"name", "doc", "base", "dict", NULL};
Georg Brandl1e28a272009-12-28 08:41:01 +00003377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003378 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
3379 "s|sOO:make_exception_with_doc", kwlist,
3380 &name, &doc, &base, &dict))
3381 return NULL;
Georg Brandl1e28a272009-12-28 08:41:01 +00003382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003383 return PyErr_NewExceptionWithDoc(name, doc, base, dict);
Georg Brandl1e28a272009-12-28 08:41:01 +00003384}
3385
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003386static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303387make_memoryview_from_NULL_pointer(PyObject *self, PyObject *Py_UNUSED(ignored))
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003388{
3389 Py_buffer info;
3390 if (PyBuffer_FillInfo(&info, NULL, NULL, 1, 1, PyBUF_FULL_RO) < 0)
3391 return NULL;
3392 return PyMemoryView_FromBuffer(&info);
3393}
Serhiy Storchaka009b8112015-03-18 21:53:15 +02003394
Stefan Krah7213fcc2015-02-01 16:19:23 +01003395static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003396test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah7213fcc2015-02-01 16:19:23 +01003397{
3398 int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
3399 int init[5] = {0, 1, 2, 3, 4};
3400 Py_ssize_t itemsize = sizeof(int);
3401 Py_ssize_t shape = 5;
3402 Py_ssize_t strides = 2 * itemsize;
3403 Py_buffer view = {
3404 data,
3405 NULL,
3406 5 * itemsize,
3407 itemsize,
3408 1,
3409 1,
3410 NULL,
3411 &shape,
3412 &strides,
3413 NULL,
3414 NULL
3415 };
3416 int *ptr;
3417 int i;
3418
3419 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3420 ptr = view.buf;
3421 for (i = 0; i < 5; i++) {
3422 if (ptr[2*i] != i) {
3423 PyErr_SetString(TestError,
3424 "test_from_contiguous: incorrect result");
3425 return NULL;
3426 }
3427 }
3428
3429 view.buf = &data[8];
3430 view.strides[0] = -2 * itemsize;
3431
3432 PyBuffer_FromContiguous(&view, init, view.len, 'C');
3433 ptr = view.buf;
3434 for (i = 0; i < 5; i++) {
3435 if (*(ptr-2*i) != i) {
3436 PyErr_SetString(TestError,
3437 "test_from_contiguous: incorrect result");
3438 return NULL;
3439 }
3440 }
3441
3442 Py_RETURN_NONE;
3443}
Stefan Krah650c1e82015-02-03 21:43:23 +01003444
Stefan Kraha7559c02015-02-03 22:27:21 +01003445#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah650c1e82015-02-03 21:43:23 +01003446extern PyTypeObject _PyBytesIOBuffer_Type;
3447
Stefan Krah5178d912015-02-03 16:57:21 +01003448static PyObject *
Serhiy Storchaka81524022018-11-27 13:05:02 +02003449test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored))
Stefan Krah5178d912015-02-03 16:57:21 +01003450{
Stefan Krah650c1e82015-02-03 21:43:23 +01003451 PyTypeObject *type = &_PyBytesIOBuffer_Type;
Stefan Krah5178d912015-02-03 16:57:21 +01003452 PyObject *b;
3453 char *dummy[1];
3454 int ret, match;
3455
Stefan Krah650c1e82015-02-03 21:43:23 +01003456 /* PyBuffer_FillInfo() */
Stefan Krah5178d912015-02-03 16:57:21 +01003457 ret = PyBuffer_FillInfo(NULL, NULL, dummy, 1, 0, PyBUF_SIMPLE);
3458 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3459 PyErr_Clear();
3460 if (ret != -1 || match == 0)
3461 goto error;
3462
Stefan Krah650c1e82015-02-03 21:43:23 +01003463 /* bytesiobuf_getbuffer() */
3464 b = type->tp_alloc(type, 0);
Stefan Krah5178d912015-02-03 16:57:21 +01003465 if (b == NULL) {
3466 return NULL;
3467 }
3468
3469 ret = PyObject_GetBuffer(b, NULL, PyBUF_SIMPLE);
3470 Py_DECREF(b);
3471 match = PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_BufferError);
3472 PyErr_Clear();
3473 if (ret != -1 || match == 0)
3474 goto error;
3475
3476 Py_RETURN_NONE;
3477
3478error:
3479 PyErr_SetString(TestError,
3480 "test_pep3118_obsolete_write_locks: failure");
3481 return NULL;
3482}
Stefan Kraha7559c02015-02-03 22:27:21 +01003483#endif
Antoine Pitrou5bffa792011-02-24 20:50:49 +00003484
Stefan Krah650c1e82015-02-03 21:43:23 +01003485/* This tests functions that historically supported write locks. It is
3486 wrong to call getbuffer() with view==NULL and a compliant getbufferproc
3487 is entitled to segfault in that case. */
3488static PyObject *
3489getbuffer_with_null_view(PyObject* self, PyObject *obj)
3490{
3491 if (PyObject_GetBuffer(obj, NULL, PyBUF_SIMPLE) < 0)
3492 return NULL;
3493
3494 Py_RETURN_NONE;
3495}
3496
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03003497/* PyBuffer_SizeFromFormat() */
3498static PyObject *
3499test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args)
3500{
3501 const char *format;
3502 Py_ssize_t result;
3503
3504 if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat",
3505 &format)) {
3506 return NULL;
3507 }
3508
3509 result = PyBuffer_SizeFromFormat(format);
3510 if (result == -1) {
3511 return NULL;
3512 }
3513
3514 return PyLong_FromSsize_t(result);
3515}
3516
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003517/* Test that the fatal error from not having a current thread doesn't
3518 cause an infinite loop. Run via Lib/test/test_capi.py */
3519static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303520crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003521{
3522 Py_BEGIN_ALLOW_THREADS
Jeffrey Yasskinea7b7482010-05-17 16:59:23 +00003523 /* Using PyThreadState_Get() directly allows the test to pass in
3524 !pydebug mode. However, the test only actually tests anything
3525 in pydebug mode, since that's where the infinite loop was in
3526 the first place. */
3527 PyThreadState_Get();
Jeffrey Yasskin8e0bdfd2010-05-13 18:31:05 +00003528 Py_END_ALLOW_THREADS
3529 return NULL;
3530}
3531
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003532/* To run some code in a sub-interpreter. */
3533static PyObject *
3534run_in_subinterp(PyObject *self, PyObject *args)
3535{
3536 const char *code;
3537 int r;
3538 PyThreadState *substate, *mainstate;
Guido van Rossum9d197c72020-06-27 17:33:49 -07003539 /* only initialise 'cflags.cf_flags' to test backwards compatibility */
3540 PyCompilerFlags cflags = {0};
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003541
3542 if (!PyArg_ParseTuple(args, "s:run_in_subinterp",
3543 &code))
3544 return NULL;
3545
3546 mainstate = PyThreadState_Get();
3547
3548 PyThreadState_Swap(NULL);
3549
3550 substate = Py_NewInterpreter();
Brett Cannonb6855682012-02-03 12:08:03 -05003551 if (substate == NULL) {
3552 /* Since no new thread state was created, there is no exception to
3553 propagate; raise a fresh one after swapping in the old thread
3554 state. */
3555 PyThreadState_Swap(mainstate);
3556 PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
3557 return NULL;
3558 }
Guido van Rossum9d197c72020-06-27 17:33:49 -07003559 r = PyRun_SimpleStringFlags(code, &cflags);
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003560 Py_EndInterpreter(substate);
3561
3562 PyThreadState_Swap(mainstate);
3563
3564 return PyLong_FromLong(r);
3565}
3566
Victor Stinner3c1b3792014-02-17 00:02:43 +01003567static int
3568check_time_rounding(int round)
3569{
Victor Stinner74474232015-09-02 01:43:56 +02003570 if (round != _PyTime_ROUND_FLOOR
3571 && round != _PyTime_ROUND_CEILING
Pablo Galindo2c15b292017-10-17 15:14:41 +01003572 && round != _PyTime_ROUND_HALF_EVEN
3573 && round != _PyTime_ROUND_UP) {
Victor Stinner3c1b3792014-02-17 00:02:43 +01003574 PyErr_SetString(PyExc_ValueError, "invalid rounding");
3575 return -1;
3576 }
3577 return 0;
3578}
3579
Victor Stinner5d272cc2012-03-13 13:35:55 +01003580static PyObject *
3581test_pytime_object_to_time_t(PyObject *self, PyObject *args)
3582{
3583 PyObject *obj;
3584 time_t sec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003585 int round;
3586 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_time_t", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003587 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003588 if (check_time_rounding(round) < 0)
3589 return NULL;
3590 if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003591 return NULL;
3592 return _PyLong_FromTime_t(sec);
3593}
3594
3595static PyObject *
3596test_pytime_object_to_timeval(PyObject *self, PyObject *args)
3597{
3598 PyObject *obj;
3599 time_t sec;
3600 long usec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003601 int round;
3602 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timeval", &obj, &round))
Victor Stinner5d272cc2012-03-13 13:35:55 +01003603 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003604 if (check_time_rounding(round) < 0)
3605 return NULL;
3606 if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1)
Victor Stinner5d272cc2012-03-13 13:35:55 +01003607 return NULL;
3608 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
3609}
3610
Victor Stinner643cd682012-03-02 22:54:03 +01003611static PyObject *
3612test_pytime_object_to_timespec(PyObject *self, PyObject *args)
3613{
3614 PyObject *obj;
3615 time_t sec;
3616 long nsec;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003617 int round;
3618 if (!PyArg_ParseTuple(args, "Oi:pytime_object_to_timespec", &obj, &round))
Victor Stinner643cd682012-03-02 22:54:03 +01003619 return NULL;
Victor Stinner3c1b3792014-02-17 00:02:43 +01003620 if (check_time_rounding(round) < 0)
3621 return NULL;
3622 if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1)
Victor Stinner643cd682012-03-02 22:54:03 +01003623 return NULL;
Victor Stinner5d272cc2012-03-13 13:35:55 +01003624 return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
Victor Stinner643cd682012-03-02 22:54:03 +01003625}
3626
Antoine Pitrou796564c2013-07-30 19:59:21 +02003627static void
3628slot_tp_del(PyObject *self)
3629{
3630 _Py_IDENTIFIER(__tp_del__);
3631 PyObject *del, *res;
3632 PyObject *error_type, *error_value, *error_traceback;
3633
3634 /* Temporarily resurrect the object. */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003635 assert(Py_REFCNT(self) == 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003636 Py_SET_REFCNT(self, 1);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003637
3638 /* Save the current exception, if any. */
3639 PyErr_Fetch(&error_type, &error_value, &error_traceback);
3640
3641 /* Execute __del__ method, if any. */
3642 del = _PyObject_LookupSpecial(self, &PyId___tp_del__);
3643 if (del != NULL) {
INADA Naoki72dccde2017-02-16 09:26:01 +09003644 res = _PyObject_CallNoArg(del);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003645 if (res == NULL)
3646 PyErr_WriteUnraisable(del);
3647 else
3648 Py_DECREF(res);
3649 Py_DECREF(del);
3650 }
3651
3652 /* Restore the saved exception. */
3653 PyErr_Restore(error_type, error_value, error_traceback);
3654
3655 /* Undo the temporary resurrection; can't use DECREF here, it would
3656 * cause a recursive call.
3657 */
Victor Stinnera93c51e2020-02-07 00:38:59 +01003658 assert(Py_REFCNT(self) > 0);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003659 Py_SET_REFCNT(self, Py_REFCNT(self) - 1);
3660 if (Py_REFCNT(self) == 0) {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003661 /* this is the normal path out */
3662 return;
3663 }
Antoine Pitrou796564c2013-07-30 19:59:21 +02003664
3665 /* __del__ resurrected it! Make it look like the original Py_DECREF
3666 * never happened.
3667 */
3668 {
Victor Stinnera93c51e2020-02-07 00:38:59 +01003669 Py_ssize_t refcnt = Py_REFCNT(self);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003670 _Py_NewReference(self);
Victor Stinnerc86a1122020-02-07 01:24:29 +01003671 Py_SET_REFCNT(self, refcnt);
Antoine Pitrou796564c2013-07-30 19:59:21 +02003672 }
Pablo Galindof13072b2020-04-11 01:21:54 +01003673 assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self));
Victor Stinner49932fe2020-02-03 17:55:05 +01003674 /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased
3675 _Py_RefTotal, so we need to undo that. */
3676#ifdef Py_REF_DEBUG
3677 _Py_RefTotal--;
3678#endif
Antoine Pitrou796564c2013-07-30 19:59:21 +02003679}
3680
3681static PyObject *
3682with_tp_del(PyObject *self, PyObject *args)
3683{
3684 PyObject *obj;
3685 PyTypeObject *tp;
3686
3687 if (!PyArg_ParseTuple(args, "O:with_tp_del", &obj))
3688 return NULL;
3689 tp = (PyTypeObject *) obj;
3690 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3691 PyErr_Format(PyExc_TypeError,
3692 "heap type expected, got %R", obj);
3693 return NULL;
3694 }
3695 tp->tp_del = slot_tp_del;
3696 Py_INCREF(obj);
3697 return obj;
3698}
3699
Brandt Bucherc13b8472020-10-14 18:44:07 -07003700static PyObject *
3701without_gc(PyObject *Py_UNUSED(self), PyObject *obj)
3702{
3703 PyTypeObject *tp = (PyTypeObject*)obj;
3704 if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
3705 return PyErr_Format(PyExc_TypeError, "heap type expected, got %R", obj);
3706 }
3707 if (PyType_IS_GC(tp)) {
3708 // Don't try this at home, kids:
3709 tp->tp_flags -= Py_TPFLAGS_HAVE_GC;
3710 tp->tp_free = PyObject_Del;
3711 tp->tp_traverse = NULL;
3712 tp->tp_clear = NULL;
3713 }
3714 assert(!PyType_IS_GC(tp));
3715 Py_INCREF(obj);
3716 return obj;
3717}
3718
Antoine Pitroub349e4c2014-08-06 19:31:40 -04003719static PyMethodDef ml;
3720
3721static PyObject *
3722create_cfunction(PyObject *self, PyObject *args)
3723{
3724 return PyCFunction_NewEx(&ml, self, NULL);
3725}
3726
3727static PyMethodDef ml = {
3728 "create_cfunction",
3729 create_cfunction,
3730 METH_NOARGS,
3731 NULL
3732};
3733
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003734static PyObject *
3735_test_incref(PyObject *ob)
3736{
3737 Py_INCREF(ob);
3738 return ob;
3739}
3740
3741static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303742test_xincref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003743{
3744 PyObject *obj = PyLong_FromLong(0);
3745 Py_XINCREF(_test_incref(obj));
3746 Py_DECREF(obj);
3747 Py_DECREF(obj);
3748 Py_DECREF(obj);
3749 Py_RETURN_NONE;
3750}
3751
3752static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303753test_incref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003754{
3755 PyObject *obj = PyLong_FromLong(0);
3756 Py_INCREF(_test_incref(obj));
3757 Py_DECREF(obj);
3758 Py_DECREF(obj);
3759 Py_DECREF(obj);
3760 Py_RETURN_NONE;
3761}
3762
3763static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303764test_xdecref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003765{
3766 Py_XDECREF(PyLong_FromLong(0));
3767 Py_RETURN_NONE;
3768}
3769
3770static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303771test_decref_doesnt_leak(PyObject *ob, PyObject *Py_UNUSED(ignored))
Benjamin Petersonda5eb5a2013-05-27 14:46:14 -07003772{
3773 Py_DECREF(PyLong_FromLong(0));
3774 Py_RETURN_NONE;
3775}
Antoine Pitrou2f828f22012-01-18 00:21:11 +01003776
Victor Stinner0507bf52013-07-07 02:05:46 +02003777static PyObject *
Eddie Elizondo474eedf2018-11-13 04:09:31 -08003778test_structseq_newtype_doesnt_leak(PyObject *Py_UNUSED(self),
3779 PyObject *Py_UNUSED(args))
3780{
3781 PyStructSequence_Desc descr;
3782 PyStructSequence_Field descr_fields[3];
3783
3784 descr_fields[0] = (PyStructSequence_Field){"foo", "foo value"};
3785 descr_fields[1] = (PyStructSequence_Field){NULL, "some hidden value"};
3786 descr_fields[2] = (PyStructSequence_Field){0, NULL};
3787
3788 descr.name = "_testcapi.test_descr";
3789 descr.doc = "This is used to test for memory leaks in NewType";
3790 descr.fields = descr_fields;
3791 descr.n_in_sequence = 1;
3792
3793 PyTypeObject* structseq_type = PyStructSequence_NewType(&descr);
3794 assert(structseq_type != NULL);
3795 assert(PyType_Check(structseq_type));
3796 assert(PyType_FastSubclass(structseq_type, Py_TPFLAGS_TUPLE_SUBCLASS));
3797 Py_DECREF(structseq_type);
3798
3799 Py_RETURN_NONE;
3800}
3801
3802static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303803test_incref_decref_API(PyObject *ob, PyObject *Py_UNUSED(ignored))
Christian Heimes4efdb412013-07-31 02:36:43 +02003804{
3805 PyObject *obj = PyLong_FromLong(0);
Victor Stinnerfc6a90a2014-10-09 22:15:41 +02003806 Py_IncRef(obj);
Christian Heimes4efdb412013-07-31 02:36:43 +02003807 Py_DecRef(obj);
3808 Py_DecRef(obj);
3809 Py_RETURN_NONE;
3810}
3811
3812static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05303813test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02003814{
3815 void *ptr;
3816
Victor Stinnerdb067af2014-05-02 22:31:14 +02003817 ptr = PyMem_RawMalloc(0);
3818 if (ptr == NULL) {
3819 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawMalloc(0) returns NULL");
3820 return NULL;
3821 }
3822 PyMem_RawFree(ptr);
3823
3824 ptr = PyMem_RawCalloc(0, 0);
3825 if (ptr == NULL) {
3826 PyErr_SetString(PyExc_RuntimeError, "PyMem_RawCalloc(0, 0) returns NULL");
3827 return NULL;
3828 }
3829 PyMem_RawFree(ptr);
3830
Victor Stinner0507bf52013-07-07 02:05:46 +02003831 ptr = PyMem_Malloc(0);
3832 if (ptr == NULL) {
3833 PyErr_SetString(PyExc_RuntimeError, "PyMem_Malloc(0) returns NULL");
3834 return NULL;
3835 }
3836 PyMem_Free(ptr);
3837
Victor Stinnerdb067af2014-05-02 22:31:14 +02003838 ptr = PyMem_Calloc(0, 0);
3839 if (ptr == NULL) {
3840 PyErr_SetString(PyExc_RuntimeError, "PyMem_Calloc(0, 0) returns NULL");
3841 return NULL;
3842 }
3843 PyMem_Free(ptr);
3844
Victor Stinner0507bf52013-07-07 02:05:46 +02003845 ptr = PyObject_Malloc(0);
3846 if (ptr == NULL) {
3847 PyErr_SetString(PyExc_RuntimeError, "PyObject_Malloc(0) returns NULL");
3848 return NULL;
3849 }
3850 PyObject_Free(ptr);
3851
Victor Stinnerdb067af2014-05-02 22:31:14 +02003852 ptr = PyObject_Calloc(0, 0);
3853 if (ptr == NULL) {
3854 PyErr_SetString(PyExc_RuntimeError, "PyObject_Calloc(0, 0) returns NULL");
3855 return NULL;
3856 }
3857 PyObject_Free(ptr);
3858
Victor Stinner0507bf52013-07-07 02:05:46 +02003859 Py_RETURN_NONE;
3860}
3861
3862typedef struct {
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003863 PyMemAllocatorEx alloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003864
3865 size_t malloc_size;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003866 size_t calloc_nelem;
3867 size_t calloc_elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003868 void *realloc_ptr;
3869 size_t realloc_new_size;
3870 void *free_ptr;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003871 void *ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003872} alloc_hook_t;
3873
Victor Stinner9ed83c42017-10-31 12:18:10 -07003874static void* hook_malloc(void* ctx, size_t size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003875{
3876 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003877 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003878 hook->malloc_size = size;
3879 return hook->alloc.malloc(hook->alloc.ctx, size);
3880}
3881
Victor Stinner9ed83c42017-10-31 12:18:10 -07003882static void* hook_calloc(void* ctx, size_t nelem, size_t elsize)
Victor Stinnerdb067af2014-05-02 22:31:14 +02003883{
3884 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003885 hook->ctx = ctx;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003886 hook->calloc_nelem = nelem;
3887 hook->calloc_elsize = elsize;
3888 return hook->alloc.calloc(hook->alloc.ctx, nelem, elsize);
3889}
3890
Victor Stinner9ed83c42017-10-31 12:18:10 -07003891static void* hook_realloc(void* ctx, void* ptr, size_t new_size)
Victor Stinner0507bf52013-07-07 02:05:46 +02003892{
3893 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003894 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003895 hook->realloc_ptr = ptr;
3896 hook->realloc_new_size = new_size;
3897 return hook->alloc.realloc(hook->alloc.ctx, ptr, new_size);
3898}
3899
Victor Stinner9ed83c42017-10-31 12:18:10 -07003900static void hook_free(void *ctx, void *ptr)
Victor Stinner0507bf52013-07-07 02:05:46 +02003901{
3902 alloc_hook_t *hook = (alloc_hook_t *)ctx;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003903 hook->ctx = ctx;
Victor Stinner0507bf52013-07-07 02:05:46 +02003904 hook->free_ptr = ptr;
3905 hook->alloc.free(hook->alloc.ctx, ptr);
3906}
3907
3908static PyObject *
3909test_setallocators(PyMemAllocatorDomain domain)
3910{
3911 PyObject *res = NULL;
3912 const char *error_msg;
3913 alloc_hook_t hook;
Victor Stinnerd8f0d922014-06-02 21:57:10 +02003914 PyMemAllocatorEx alloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003915 size_t size, size2, nelem, elsize;
Victor Stinner0507bf52013-07-07 02:05:46 +02003916 void *ptr, *ptr2;
3917
Victor Stinnerdb067af2014-05-02 22:31:14 +02003918 memset(&hook, 0, sizeof(hook));
Victor Stinner0507bf52013-07-07 02:05:46 +02003919
3920 alloc.ctx = &hook;
3921 alloc.malloc = &hook_malloc;
Victor Stinnerdb067af2014-05-02 22:31:14 +02003922 alloc.calloc = &hook_calloc;
Victor Stinner0507bf52013-07-07 02:05:46 +02003923 alloc.realloc = &hook_realloc;
3924 alloc.free = &hook_free;
3925 PyMem_GetAllocator(domain, &hook.alloc);
3926 PyMem_SetAllocator(domain, &alloc);
3927
Victor Stinner9ed83c42017-10-31 12:18:10 -07003928 /* malloc, realloc, free */
Victor Stinner0507bf52013-07-07 02:05:46 +02003929 size = 42;
Victor Stinner9ed83c42017-10-31 12:18:10 -07003930 hook.ctx = NULL;
Victor Stinner0507bf52013-07-07 02:05:46 +02003931 switch(domain)
3932 {
3933 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawMalloc(size); break;
3934 case PYMEM_DOMAIN_MEM: ptr = PyMem_Malloc(size); break;
3935 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Malloc(size); break;
3936 default: ptr = NULL; break;
3937 }
3938
Victor Stinner9ed83c42017-10-31 12:18:10 -07003939#define CHECK_CTX(FUNC) \
3940 if (hook.ctx != &hook) { \
3941 error_msg = FUNC " wrong context"; \
3942 goto fail; \
3943 } \
3944 hook.ctx = NULL; /* reset for next check */
3945
Victor Stinner0507bf52013-07-07 02:05:46 +02003946 if (ptr == NULL) {
3947 error_msg = "malloc failed";
3948 goto fail;
3949 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003950 CHECK_CTX("malloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003951 if (hook.malloc_size != size) {
3952 error_msg = "malloc invalid size";
3953 goto fail;
3954 }
3955
3956 size2 = 200;
3957 switch(domain)
3958 {
3959 case PYMEM_DOMAIN_RAW: ptr2 = PyMem_RawRealloc(ptr, size2); break;
3960 case PYMEM_DOMAIN_MEM: ptr2 = PyMem_Realloc(ptr, size2); break;
3961 case PYMEM_DOMAIN_OBJ: ptr2 = PyObject_Realloc(ptr, size2); break;
Christian Heimes865d12a2013-08-02 11:10:51 +02003962 default: ptr2 = NULL; break;
Victor Stinner0507bf52013-07-07 02:05:46 +02003963 }
3964
3965 if (ptr2 == NULL) {
3966 error_msg = "realloc failed";
3967 goto fail;
3968 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07003969 CHECK_CTX("realloc");
Victor Stinner0507bf52013-07-07 02:05:46 +02003970 if (hook.realloc_ptr != ptr
3971 || hook.realloc_new_size != size2) {
3972 error_msg = "realloc invalid parameters";
3973 goto fail;
3974 }
3975
3976 switch(domain)
3977 {
3978 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr2); break;
3979 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr2); break;
3980 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr2); break;
3981 }
3982
Victor Stinner9ed83c42017-10-31 12:18:10 -07003983 CHECK_CTX("free");
Victor Stinner0507bf52013-07-07 02:05:46 +02003984 if (hook.free_ptr != ptr2) {
3985 error_msg = "free invalid pointer";
3986 goto fail;
3987 }
3988
Victor Stinner9ed83c42017-10-31 12:18:10 -07003989 /* calloc, free */
Victor Stinnerdb067af2014-05-02 22:31:14 +02003990 nelem = 2;
3991 elsize = 5;
3992 switch(domain)
3993 {
3994 case PYMEM_DOMAIN_RAW: ptr = PyMem_RawCalloc(nelem, elsize); break;
3995 case PYMEM_DOMAIN_MEM: ptr = PyMem_Calloc(nelem, elsize); break;
3996 case PYMEM_DOMAIN_OBJ: ptr = PyObject_Calloc(nelem, elsize); break;
3997 default: ptr = NULL; break;
3998 }
3999
4000 if (ptr == NULL) {
4001 error_msg = "calloc failed";
4002 goto fail;
4003 }
Victor Stinner9ed83c42017-10-31 12:18:10 -07004004 CHECK_CTX("calloc");
Victor Stinnerdb067af2014-05-02 22:31:14 +02004005 if (hook.calloc_nelem != nelem || hook.calloc_elsize != elsize) {
4006 error_msg = "calloc invalid nelem or elsize";
4007 goto fail;
4008 }
4009
Victor Stinner9ed83c42017-10-31 12:18:10 -07004010 hook.free_ptr = NULL;
Victor Stinnerdb067af2014-05-02 22:31:14 +02004011 switch(domain)
4012 {
4013 case PYMEM_DOMAIN_RAW: PyMem_RawFree(ptr); break;
4014 case PYMEM_DOMAIN_MEM: PyMem_Free(ptr); break;
4015 case PYMEM_DOMAIN_OBJ: PyObject_Free(ptr); break;
4016 }
4017
Victor Stinner9ed83c42017-10-31 12:18:10 -07004018 CHECK_CTX("calloc free");
4019 if (hook.free_ptr != ptr) {
4020 error_msg = "calloc free invalid pointer";
4021 goto fail;
4022 }
4023
Victor Stinner0507bf52013-07-07 02:05:46 +02004024 Py_INCREF(Py_None);
4025 res = Py_None;
4026 goto finally;
4027
4028fail:
4029 PyErr_SetString(PyExc_RuntimeError, error_msg);
4030
4031finally:
4032 PyMem_SetAllocator(domain, &hook.alloc);
4033 return res;
Victor Stinner9ed83c42017-10-31 12:18:10 -07004034
4035#undef CHECK_CTX
Victor Stinner0507bf52013-07-07 02:05:46 +02004036}
4037
4038static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304039test_pymem_setrawallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004040{
4041 return test_setallocators(PYMEM_DOMAIN_RAW);
4042}
4043
4044static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304045test_pymem_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004046{
4047 return test_setallocators(PYMEM_DOMAIN_MEM);
4048}
4049
4050static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304051test_pyobject_setallocators(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0507bf52013-07-07 02:05:46 +02004052{
4053 return test_setallocators(PYMEM_DOMAIN_OBJ);
4054}
4055
xdegaye85f64302017-07-01 14:14:45 +02004056/* Most part of the following code is inherited from the pyfailmalloc project
4057 * written by Victor Stinner. */
4058static struct {
4059 int installed;
4060 PyMemAllocatorEx raw;
4061 PyMemAllocatorEx mem;
4062 PyMemAllocatorEx obj;
4063} FmHook;
4064
4065static struct {
4066 int start;
4067 int stop;
4068 Py_ssize_t count;
4069} FmData;
4070
4071static int
4072fm_nomemory(void)
4073{
4074 FmData.count++;
4075 if (FmData.count > FmData.start &&
4076 (FmData.stop <= 0 || FmData.count <= FmData.stop)) {
4077 return 1;
4078 }
4079 return 0;
4080}
4081
4082static void *
4083hook_fmalloc(void *ctx, size_t size)
4084{
4085 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4086 if (fm_nomemory()) {
4087 return NULL;
4088 }
4089 return alloc->malloc(alloc->ctx, size);
4090}
4091
4092static void *
4093hook_fcalloc(void *ctx, size_t nelem, size_t elsize)
4094{
4095 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4096 if (fm_nomemory()) {
4097 return NULL;
4098 }
4099 return alloc->calloc(alloc->ctx, nelem, elsize);
4100}
4101
4102static void *
4103hook_frealloc(void *ctx, void *ptr, size_t new_size)
4104{
4105 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4106 if (fm_nomemory()) {
4107 return NULL;
4108 }
4109 return alloc->realloc(alloc->ctx, ptr, new_size);
4110}
4111
4112static void
4113hook_ffree(void *ctx, void *ptr)
4114{
4115 PyMemAllocatorEx *alloc = (PyMemAllocatorEx *)ctx;
4116 alloc->free(alloc->ctx, ptr);
4117}
4118
4119static void
4120fm_setup_hooks(void)
4121{
4122 PyMemAllocatorEx alloc;
4123
4124 if (FmHook.installed) {
4125 return;
4126 }
4127 FmHook.installed = 1;
4128
4129 alloc.malloc = hook_fmalloc;
4130 alloc.calloc = hook_fcalloc;
4131 alloc.realloc = hook_frealloc;
4132 alloc.free = hook_ffree;
4133 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4134 PyMem_GetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4135 PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4136
4137 alloc.ctx = &FmHook.raw;
4138 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &alloc);
4139
4140 alloc.ctx = &FmHook.mem;
4141 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &alloc);
4142
4143 alloc.ctx = &FmHook.obj;
4144 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &alloc);
4145}
4146
4147static void
4148fm_remove_hooks(void)
4149{
4150 if (FmHook.installed) {
4151 FmHook.installed = 0;
4152 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &FmHook.raw);
4153 PyMem_SetAllocator(PYMEM_DOMAIN_MEM, &FmHook.mem);
4154 PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &FmHook.obj);
4155 }
4156}
4157
4158static PyObject*
4159set_nomemory(PyObject *self, PyObject *args)
4160{
4161 /* Memory allocation fails after 'start' allocation requests, and until
4162 * 'stop' allocation requests except when 'stop' is negative or equal
4163 * to 0 (default) in which case allocation failures never stop. */
4164 FmData.count = 0;
4165 FmData.stop = 0;
4166 if (!PyArg_ParseTuple(args, "i|i", &FmData.start, &FmData.stop)) {
4167 return NULL;
4168 }
4169 fm_setup_hooks();
4170 Py_RETURN_NONE;
4171}
4172
4173static PyObject*
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05304174remove_mem_hooks(PyObject *self, PyObject *Py_UNUSED(ignored))
xdegaye85f64302017-07-01 14:14:45 +02004175{
4176 fm_remove_hooks();
4177 Py_RETURN_NONE;
4178}
4179
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004180PyDoc_STRVAR(docstring_empty,
4181""
4182);
4183
4184PyDoc_STRVAR(docstring_no_signature,
4185"This docstring has no signature."
4186);
4187
4188PyDoc_STRVAR(docstring_with_invalid_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004189"docstring_with_invalid_signature($module, /, boo)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004190"\n"
4191"This docstring has an invalid signature."
4192);
4193
Larry Hastings2623c8c2014-02-08 22:15:29 -08004194PyDoc_STRVAR(docstring_with_invalid_signature2,
4195"docstring_with_invalid_signature2($module, /, boo)\n"
4196"\n"
4197"--\n"
4198"\n"
4199"This docstring also has an invalid signature."
4200);
4201
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004202PyDoc_STRVAR(docstring_with_signature,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004203"docstring_with_signature($module, /, sig)\n"
4204"--\n"
4205"\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004206"This docstring has a valid signature."
4207);
4208
Zachary Ware8ef887c2015-04-13 18:22:35 -05004209PyDoc_STRVAR(docstring_with_signature_but_no_doc,
4210"docstring_with_signature_but_no_doc($module, /, sig)\n"
4211"--\n"
4212"\n"
4213);
4214
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004215PyDoc_STRVAR(docstring_with_signature_and_extra_newlines,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004216"docstring_with_signature_and_extra_newlines($module, /, parameter)\n"
4217"--\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08004218"\n"
4219"\n"
4220"This docstring has a valid signature and some extra newlines."
4221);
4222
Larry Hastings16c51912014-01-07 11:53:01 -08004223PyDoc_STRVAR(docstring_with_signature_with_defaults,
Larry Hastings2623c8c2014-02-08 22:15:29 -08004224"docstring_with_signature_with_defaults(module, s='avocado',\n"
4225" b=b'bytes', d=3.14, i=35, n=None, t=True, f=False,\n"
4226" local=the_number_three, sys=sys.maxsize,\n"
4227" exp=sys.maxsize - 1)\n"
4228"--\n"
Larry Hastings16c51912014-01-07 11:53:01 -08004229"\n"
4230"\n"
4231"\n"
4232"This docstring has a valid signature with parameters,\n"
4233"and the parameters take defaults of varying types."
4234);
4235
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004236typedef struct {
4237 PyThread_type_lock start_event;
4238 PyThread_type_lock exit_event;
4239 PyObject *callback;
4240} test_c_thread_t;
4241
4242static void
4243temporary_c_thread(void *data)
4244{
4245 test_c_thread_t *test_c_thread = data;
4246 PyGILState_STATE state;
4247 PyObject *res;
4248
4249 PyThread_release_lock(test_c_thread->start_event);
4250
4251 /* Allocate a Python thread state for this thread */
4252 state = PyGILState_Ensure();
4253
Victor Stinner3466bde2016-09-05 18:16:01 -07004254 res = _PyObject_CallNoArg(test_c_thread->callback);
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004255 Py_CLEAR(test_c_thread->callback);
4256
4257 if (res == NULL) {
4258 PyErr_Print();
4259 }
4260 else {
4261 Py_DECREF(res);
4262 }
4263
4264 /* Destroy the Python thread state for this thread */
4265 PyGILState_Release(state);
4266
4267 PyThread_release_lock(test_c_thread->exit_event);
4268
4269 PyThread_exit_thread();
4270}
4271
4272static PyObject *
4273call_in_temporary_c_thread(PyObject *self, PyObject *callback)
4274{
4275 PyObject *res = NULL;
4276 test_c_thread_t test_c_thread;
4277 long thread;
4278
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004279 test_c_thread.start_event = PyThread_allocate_lock();
4280 test_c_thread.exit_event = PyThread_allocate_lock();
4281 test_c_thread.callback = NULL;
4282 if (!test_c_thread.start_event || !test_c_thread.exit_event) {
4283 PyErr_SetString(PyExc_RuntimeError, "could not allocate lock");
4284 goto exit;
4285 }
4286
4287 Py_INCREF(callback);
4288 test_c_thread.callback = callback;
4289
4290 PyThread_acquire_lock(test_c_thread.start_event, 1);
4291 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4292
4293 thread = PyThread_start_new_thread(temporary_c_thread, &test_c_thread);
4294 if (thread == -1) {
4295 PyErr_SetString(PyExc_RuntimeError, "unable to start the thread");
4296 PyThread_release_lock(test_c_thread.start_event);
4297 PyThread_release_lock(test_c_thread.exit_event);
4298 goto exit;
4299 }
4300
4301 PyThread_acquire_lock(test_c_thread.start_event, 1);
4302 PyThread_release_lock(test_c_thread.start_event);
4303
4304 Py_BEGIN_ALLOW_THREADS
4305 PyThread_acquire_lock(test_c_thread.exit_event, 1);
4306 PyThread_release_lock(test_c_thread.exit_event);
4307 Py_END_ALLOW_THREADS
4308
4309 Py_INCREF(Py_None);
4310 res = Py_None;
4311
4312exit:
4313 Py_CLEAR(test_c_thread.callback);
4314 if (test_c_thread.start_event)
4315 PyThread_free_lock(test_c_thread.start_event);
4316 if (test_c_thread.exit_event)
4317 PyThread_free_lock(test_c_thread.exit_event);
4318 return res;
4319}
Victor Stinner13105102013-12-13 02:17:29 +01004320
Serhiy Storchakab5181342015-02-06 08:58:56 +02004321/* marshal */
4322
4323static PyObject*
4324pymarshal_write_long_to_file(PyObject* self, PyObject *args)
4325{
4326 long value;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004327 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004328 int version;
4329 FILE *fp;
4330
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004331 if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004332 &value, &filename, &version))
4333 return NULL;
4334
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004335 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004336 if (fp == NULL) {
4337 PyErr_SetFromErrno(PyExc_OSError);
4338 return NULL;
4339 }
4340
4341 PyMarshal_WriteLongToFile(value, fp, version);
4342
4343 fclose(fp);
4344 if (PyErr_Occurred())
4345 return NULL;
4346 Py_RETURN_NONE;
4347}
4348
4349static PyObject*
4350pymarshal_write_object_to_file(PyObject* self, PyObject *args)
4351{
4352 PyObject *obj;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004353 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004354 int version;
4355 FILE *fp;
4356
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004357 if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file",
Serhiy Storchakab5181342015-02-06 08:58:56 +02004358 &obj, &filename, &version))
4359 return NULL;
4360
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004361 fp = _Py_fopen_obj(filename, "wb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004362 if (fp == NULL) {
4363 PyErr_SetFromErrno(PyExc_OSError);
4364 return NULL;
4365 }
4366
4367 PyMarshal_WriteObjectToFile(obj, fp, version);
4368
4369 fclose(fp);
4370 if (PyErr_Occurred())
4371 return NULL;
4372 Py_RETURN_NONE;
4373}
4374
4375static PyObject*
4376pymarshal_read_short_from_file(PyObject* self, PyObject *args)
4377{
4378 int value;
4379 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004380 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004381 FILE *fp;
4382
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004383 if (!PyArg_ParseTuple(args, "O:pymarshal_read_short_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004384 return NULL;
4385
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004386 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004387 if (fp == NULL) {
4388 PyErr_SetFromErrno(PyExc_OSError);
4389 return NULL;
4390 }
4391
4392 value = PyMarshal_ReadShortFromFile(fp);
4393 pos = ftell(fp);
4394
4395 fclose(fp);
4396 if (PyErr_Occurred())
4397 return NULL;
4398 return Py_BuildValue("il", value, pos);
4399}
4400
4401static PyObject*
4402pymarshal_read_long_from_file(PyObject* self, PyObject *args)
4403{
4404 long value, pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004405 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004406 FILE *fp;
4407
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004408 if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004409 return NULL;
4410
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004411 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004412 if (fp == NULL) {
4413 PyErr_SetFromErrno(PyExc_OSError);
4414 return NULL;
4415 }
4416
4417 value = PyMarshal_ReadLongFromFile(fp);
4418 pos = ftell(fp);
4419
4420 fclose(fp);
4421 if (PyErr_Occurred())
4422 return NULL;
4423 return Py_BuildValue("ll", value, pos);
4424}
4425
4426static PyObject*
4427pymarshal_read_last_object_from_file(PyObject* self, PyObject *args)
4428{
4429 PyObject *obj;
4430 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004431 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004432 FILE *fp;
4433
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004434 if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004435 return NULL;
4436
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004437 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004438 if (fp == NULL) {
4439 PyErr_SetFromErrno(PyExc_OSError);
4440 return NULL;
4441 }
4442
4443 obj = PyMarshal_ReadLastObjectFromFile(fp);
4444 pos = ftell(fp);
4445
4446 fclose(fp);
4447 return Py_BuildValue("Nl", obj, pos);
4448}
4449
4450static PyObject*
4451pymarshal_read_object_from_file(PyObject* self, PyObject *args)
4452{
4453 PyObject *obj;
4454 long pos;
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004455 PyObject *filename;
Serhiy Storchakab5181342015-02-06 08:58:56 +02004456 FILE *fp;
4457
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004458 if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename))
Serhiy Storchakab5181342015-02-06 08:58:56 +02004459 return NULL;
4460
Serhiy Storchaka700cfa82020-06-25 17:56:31 +03004461 fp = _Py_fopen_obj(filename, "rb");
Serhiy Storchakab5181342015-02-06 08:58:56 +02004462 if (fp == NULL) {
4463 PyErr_SetFromErrno(PyExc_OSError);
4464 return NULL;
4465 }
4466
4467 obj = PyMarshal_ReadObjectFromFile(fp);
4468 pos = ftell(fp);
4469
4470 fclose(fp);
4471 return Py_BuildValue("Nl", obj, pos);
4472}
4473
Victor Stinnerefde1462015-03-21 15:04:43 +01004474static PyObject*
4475return_null_without_error(PyObject *self, PyObject *args)
4476{
4477 /* invalid call: return NULL without setting an error,
4478 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4479 PyErr_Clear();
4480 return NULL;
4481}
4482
4483static PyObject*
4484return_result_with_error(PyObject *self, PyObject *args)
4485{
4486 /* invalid call: return a result with an error set,
4487 * _Py_CheckFunctionResult() must detect such bug at runtime. */
4488 PyErr_SetNone(PyExc_ValueError);
4489 Py_RETURN_NONE;
4490}
4491
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01004492static PyObject*
4493getitem_with_error(PyObject *self, PyObject *args)
4494{
4495 PyObject *map, *key;
4496 if (!PyArg_ParseTuple(args, "OO", &map, &key)) {
4497 return NULL;
4498 }
4499
4500 PyErr_SetString(PyExc_ValueError, "bug");
4501 return PyObject_GetItem(map, key);
4502}
4503
Victor Stinner992c43f2015-03-27 17:12:45 +01004504static PyObject *
Victor Stinner13019fd2015-04-03 13:10:54 +02004505test_pytime_fromseconds(PyObject *self, PyObject *args)
4506{
4507 int seconds;
4508 _PyTime_t ts;
4509
4510 if (!PyArg_ParseTuple(args, "i", &seconds))
4511 return NULL;
4512 ts = _PyTime_FromSeconds(seconds);
4513 return _PyTime_AsNanosecondsObject(ts);
4514}
4515
4516static PyObject *
Victor Stinner992c43f2015-03-27 17:12:45 +01004517test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
4518{
4519 PyObject *obj;
4520 int round;
4521 _PyTime_t ts;
4522
4523 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
4524 return NULL;
4525 if (check_time_rounding(round) < 0)
4526 return NULL;
4527 if (_PyTime_FromSecondsObject(&ts, obj, round) == -1)
4528 return NULL;
4529 return _PyTime_AsNanosecondsObject(ts);
4530}
4531
Victor Stinner4bfb4602015-03-27 22:27:24 +01004532static PyObject *
4533test_pytime_assecondsdouble(PyObject *self, PyObject *args)
4534{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004535 PyObject *obj;
Victor Stinner4bfb4602015-03-27 22:27:24 +01004536 _PyTime_t ts;
4537 double d;
4538
Victor Stinnerc29b5852017-11-02 07:28:27 -07004539 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner4bfb4602015-03-27 22:27:24 +01004540 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004541 }
4542 if (_PyTime_FromNanosecondsObject(&ts, obj) < 0) {
4543 return NULL;
4544 }
Victor Stinner4bfb4602015-03-27 22:27:24 +01004545 d = _PyTime_AsSecondsDouble(ts);
4546 return PyFloat_FromDouble(d);
4547}
4548
Victor Stinner95e9cef2015-03-28 01:26:47 +01004549static PyObject *
4550test_PyTime_AsTimeval(PyObject *self, PyObject *args)
4551{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004552 PyObject *obj;
Victor Stinner95e9cef2015-03-28 01:26:47 +01004553 int round;
4554 _PyTime_t t;
4555 struct timeval tv;
4556 PyObject *seconds;
4557
Victor Stinnerc29b5852017-11-02 07:28:27 -07004558 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner95e9cef2015-03-28 01:26:47 +01004559 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004560 if (check_time_rounding(round) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004561 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004562 }
4563 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004564 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004565 }
4566 if (_PyTime_AsTimeval(t, &tv, round) < 0) {
4567 return NULL;
4568 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004569
Benjamin Peterson2c134c32017-04-13 01:44:54 -07004570 seconds = PyLong_FromLongLong(tv.tv_sec);
Victor Stinnerc29b5852017-11-02 07:28:27 -07004571 if (seconds == NULL) {
Victor Stinner95e9cef2015-03-28 01:26:47 +01004572 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004573 }
Victor Stinner95e9cef2015-03-28 01:26:47 +01004574 return Py_BuildValue("Nl", seconds, tv.tv_usec);
4575}
4576
Victor Stinner34dc0f42015-03-27 18:19:03 +01004577#ifdef HAVE_CLOCK_GETTIME
4578static PyObject *
4579test_PyTime_AsTimespec(PyObject *self, PyObject *args)
4580{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004581 PyObject *obj;
Victor Stinner34dc0f42015-03-27 18:19:03 +01004582 _PyTime_t t;
4583 struct timespec ts;
4584
Victor Stinnerc29b5852017-11-02 07:28:27 -07004585 if (!PyArg_ParseTuple(args, "O", &obj)) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004586 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004587 }
4588 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner34dc0f42015-03-27 18:19:03 +01004589 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004590 }
4591 if (_PyTime_AsTimespec(t, &ts) == -1) {
4592 return NULL;
4593 }
Victor Stinner34dc0f42015-03-27 18:19:03 +01004594 return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
4595}
4596#endif
4597
Victor Stinner62d1c702015-04-01 17:47:07 +02004598static PyObject *
4599test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
4600{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004601 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004602 int round;
4603 _PyTime_t t, ms;
4604
Victor Stinnerc29b5852017-11-02 07:28:27 -07004605 if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004606 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004607 }
4608 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004609 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004610 }
4611 if (check_time_rounding(round) < 0) {
4612 return NULL;
4613 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004614 ms = _PyTime_AsMilliseconds(t, round);
4615 /* This conversion rely on the fact that _PyTime_t is a number of
4616 nanoseconds */
4617 return _PyTime_AsNanosecondsObject(ms);
4618}
4619
4620static PyObject *
4621test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
4622{
Victor Stinnerc29b5852017-11-02 07:28:27 -07004623 PyObject *obj;
Victor Stinner62d1c702015-04-01 17:47:07 +02004624 int round;
4625 _PyTime_t t, ms;
4626
Victor Stinnerc29b5852017-11-02 07:28:27 -07004627 if (!PyArg_ParseTuple(args, "Oi", &obj, &round))
Victor Stinner62d1c702015-04-01 17:47:07 +02004628 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004629 if (_PyTime_FromNanosecondsObject(&t, obj) < 0) {
Victor Stinner62d1c702015-04-01 17:47:07 +02004630 return NULL;
Victor Stinnerc29b5852017-11-02 07:28:27 -07004631 }
4632 if (check_time_rounding(round) < 0) {
4633 return NULL;
4634 }
Victor Stinner62d1c702015-04-01 17:47:07 +02004635 ms = _PyTime_AsMicroseconds(t, round);
4636 /* This conversion rely on the fact that _PyTime_t is a number of
4637 nanoseconds */
4638 return _PyTime_AsNanosecondsObject(ms);
4639}
4640
Victor Stinner50856d52015-10-13 00:11:21 +02004641static PyObject*
Victor Stinner34be807c2016-03-14 12:04:26 +01004642pymem_buffer_overflow(PyObject *self, PyObject *args)
4643{
4644 char *buffer;
4645
4646 /* Deliberate buffer overflow to check that PyMem_Free() detects
4647 the overflow when debug hooks are installed. */
4648 buffer = PyMem_Malloc(16);
Victor Stinner414b1cd2019-03-26 14:35:30 +01004649 if (buffer == NULL) {
4650 PyErr_NoMemory();
4651 return NULL;
4652 }
Victor Stinner34be807c2016-03-14 12:04:26 +01004653 buffer[16] = 'x';
4654 PyMem_Free(buffer);
4655
4656 Py_RETURN_NONE;
4657}
4658
4659static PyObject*
4660pymem_api_misuse(PyObject *self, PyObject *args)
4661{
4662 char *buffer;
4663
4664 /* Deliberate misusage of Python allocators:
4665 allococate with PyMem but release with PyMem_Raw. */
4666 buffer = PyMem_Malloc(16);
4667 PyMem_RawFree(buffer);
4668
4669 Py_RETURN_NONE;
4670}
4671
Victor Stinnerc4aec362016-03-14 22:26:53 +01004672static PyObject*
Victor Stinnerad524372016-03-16 12:12:53 +01004673pymem_malloc_without_gil(PyObject *self, PyObject *args)
4674{
4675 char *buffer;
4676
4677 /* Deliberate bug to test debug hooks on Python memory allocators:
4678 call PyMem_Malloc() without holding the GIL */
4679 Py_BEGIN_ALLOW_THREADS
4680 buffer = PyMem_Malloc(10);
4681 Py_END_ALLOW_THREADS
4682
4683 PyMem_Free(buffer);
4684
4685 Py_RETURN_NONE;
4686}
4687
Victor Stinner5d39e042017-11-29 17:20:38 +01004688
4689static PyObject*
4690test_pymem_getallocatorsname(PyObject *self, PyObject *args)
4691{
Victor Stinnerb16b4e42019-05-17 15:20:52 +02004692 const char *name = _PyMem_GetCurrentAllocatorName();
Victor Stinner5d39e042017-11-29 17:20:38 +01004693 if (name == NULL) {
4694 PyErr_SetString(PyExc_RuntimeError, "cannot get allocators name");
4695 return NULL;
4696 }
4697 return PyUnicode_FromString(name);
4698}
4699
4700
Victor Stinnerad524372016-03-16 12:12:53 +01004701static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004702test_pyobject_is_freed(const char *test_name, PyObject *op)
Victor Stinner2b00db62019-04-11 11:33:27 +02004703{
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004704 if (!_PyObject_IsFreed(op)) {
4705 return raiseTestError(test_name, "object is not seen as freed");
4706 }
4707 Py_RETURN_NONE;
Victor Stinner2b00db62019-04-11 11:33:27 +02004708}
4709
4710
4711static PyObject*
Victor Stinner68762572019-10-07 18:42:01 +02004712check_pyobject_null_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
4713{
4714 PyObject *op = NULL;
4715 return test_pyobject_is_freed("check_pyobject_null_is_freed", op);
4716}
4717
4718
4719static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004720check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004721{
4722 PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject));
4723 if (op == NULL) {
4724 return NULL;
4725 }
4726 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004727 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004728 /* object fields like ob_type are uninitialized! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004729 return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004730}
4731
4732
4733static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004734check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004735{
4736 /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */
4737 PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type));
4738 if (op == NULL) {
4739 return NULL;
4740 }
4741 /* Initialize reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004742 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004743 /* ob_type field is after the memory block: part of "forbidden bytes"
Min ho Kim39d87b52019-08-31 06:21:19 +10004744 when using debug hooks on memory allocators! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004745 return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004746}
4747
4748
4749static PyObject*
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004750check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
Victor Stinner2b00db62019-04-11 11:33:27 +02004751{
4752 PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type);
4753 if (op == NULL) {
4754 return NULL;
4755 }
4756 Py_TYPE(op)->tp_dealloc(op);
4757 /* Reset reference count to avoid early crash in ceval or GC */
Victor Stinnerc86a1122020-02-07 01:24:29 +01004758 Py_SET_REFCNT(op, 1);
Victor Stinner2b00db62019-04-11 11:33:27 +02004759 /* object memory is freed! */
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02004760 return test_pyobject_is_freed("check_pyobject_freed_is_freed", op);
Victor Stinner2b00db62019-04-11 11:33:27 +02004761}
4762
4763
4764static PyObject*
Victor Stinnerc4aec362016-03-14 22:26:53 +01004765pyobject_malloc_without_gil(PyObject *self, PyObject *args)
4766{
4767 char *buffer;
4768
Victor Stinnerad524372016-03-16 12:12:53 +01004769 /* Deliberate bug to test debug hooks on Python memory allocators:
4770 call PyObject_Malloc() without holding the GIL */
Victor Stinnerc4aec362016-03-14 22:26:53 +01004771 Py_BEGIN_ALLOW_THREADS
4772 buffer = PyObject_Malloc(10);
4773 Py_END_ALLOW_THREADS
4774
4775 PyObject_Free(buffer);
4776
4777 Py_RETURN_NONE;
4778}
4779
Victor Stinner10b73e12016-03-22 13:39:05 +01004780static PyObject *
4781tracemalloc_track(PyObject *self, PyObject *args)
4782{
4783 unsigned int domain;
4784 PyObject *ptr_obj;
4785 void *ptr;
4786 Py_ssize_t size;
4787 int release_gil = 0;
4788 int res;
4789
4790 if (!PyArg_ParseTuple(args, "IOn|i", &domain, &ptr_obj, &size, &release_gil))
4791 return NULL;
4792 ptr = PyLong_AsVoidPtr(ptr_obj);
4793 if (PyErr_Occurred())
4794 return NULL;
4795
4796 if (release_gil) {
4797 Py_BEGIN_ALLOW_THREADS
Victor Stinner5ea4c062017-06-20 17:46:36 +02004798 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004799 Py_END_ALLOW_THREADS
4800 }
4801 else {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004802 res = PyTraceMalloc_Track(domain, (uintptr_t)ptr, size);
Victor Stinner10b73e12016-03-22 13:39:05 +01004803 }
4804
4805 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004806 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Track error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004807 return NULL;
4808 }
4809
4810 Py_RETURN_NONE;
4811}
4812
4813static PyObject *
4814tracemalloc_untrack(PyObject *self, PyObject *args)
4815{
4816 unsigned int domain;
4817 PyObject *ptr_obj;
4818 void *ptr;
4819 int res;
4820
4821 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4822 return NULL;
4823 ptr = PyLong_AsVoidPtr(ptr_obj);
4824 if (PyErr_Occurred())
4825 return NULL;
4826
Victor Stinner5ea4c062017-06-20 17:46:36 +02004827 res = PyTraceMalloc_Untrack(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004828 if (res < 0) {
Victor Stinner5ea4c062017-06-20 17:46:36 +02004829 PyErr_SetString(PyExc_RuntimeError, "PyTraceMalloc_Untrack error");
Victor Stinner10b73e12016-03-22 13:39:05 +01004830 return NULL;
4831 }
4832
4833 Py_RETURN_NONE;
4834}
4835
4836static PyObject *
4837tracemalloc_get_traceback(PyObject *self, PyObject *args)
4838{
4839 unsigned int domain;
4840 PyObject *ptr_obj;
4841 void *ptr;
4842
4843 if (!PyArg_ParseTuple(args, "IO", &domain, &ptr_obj))
4844 return NULL;
4845 ptr = PyLong_AsVoidPtr(ptr_obj);
4846 if (PyErr_Occurred())
4847 return NULL;
4848
Benjamin Petersonca470632016-09-06 13:47:26 -07004849 return _PyTraceMalloc_GetTraceback(domain, (uintptr_t)ptr);
Victor Stinner10b73e12016-03-22 13:39:05 +01004850}
4851
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004852static PyObject *
4853dict_get_version(PyObject *self, PyObject *args)
4854{
4855 PyDictObject *dict;
4856 uint64_t version;
4857
4858 if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
4859 return NULL;
4860
4861 version = dict->ma_version_tag;
4862
Sergey Fedoseeva9ed91e2019-10-21 11:49:48 +05004863 Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(version));
4864 return PyLong_FromUnsignedLongLong((unsigned long long)version);
Victor Stinner3b6a6b42016-09-08 12:51:24 -07004865}
4866
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01004867
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004868static PyObject *
4869raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
4870{
Vladimir Matveev037245c2020-10-09 17:15:15 -07004871 _Py_IDENTIFIER(send);
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004872 PyGenObject *gen;
4873
4874 if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
4875 return NULL;
4876
4877 /* This is used in a test to check what happens if a signal arrives just
4878 as we're in the process of entering a yield from chain (see
4879 bpo-30039).
4880
4881 Needs to be done in C, because:
4882 - we don't have a Python wrapper for raise()
4883 - we need to make sure that the Python-level signal handler doesn't run
4884 *before* we enter the generator frame, which is impossible in Python
4885 because we check for signals before every bytecode operation.
4886 */
4887 raise(SIGINT);
Vladimir Matveev037245c2020-10-09 17:15:15 -07004888 return _PyObject_CallMethodIdOneArg((PyObject *)gen, &PyId_send, Py_None);
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07004889}
4890
4891
Victor Stinner3b5cf852017-06-09 16:48:45 +02004892static int
4893fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
4894{
4895 if (args == Py_None) {
4896 *stack = NULL;
4897 *nargs = 0;
4898 }
4899 else if (PyTuple_Check(args)) {
Victor Stinnerd17a6932018-11-09 16:56:48 +01004900 *stack = ((PyTupleObject *)args)->ob_item;
Victor Stinner3b5cf852017-06-09 16:48:45 +02004901 *nargs = PyTuple_GET_SIZE(args);
4902 }
4903 else {
4904 PyErr_SetString(PyExc_TypeError, "args must be None or a tuple");
4905 return -1;
4906 }
4907 return 0;
4908}
4909
4910
4911static PyObject *
4912test_pyobject_fastcall(PyObject *self, PyObject *args)
4913{
4914 PyObject *func, *func_args;
4915 PyObject **stack;
4916 Py_ssize_t nargs;
4917
4918 if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
4919 return NULL;
4920 }
4921
4922 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4923 return NULL;
4924 }
4925 return _PyObject_FastCall(func, stack, nargs);
4926}
4927
4928
4929static PyObject *
4930test_pyobject_fastcalldict(PyObject *self, PyObject *args)
4931{
4932 PyObject *func, *func_args, *kwargs;
4933 PyObject **stack;
4934 Py_ssize_t nargs;
4935
4936 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) {
4937 return NULL;
4938 }
4939
4940 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4941 return NULL;
4942 }
4943
4944 if (kwargs == Py_None) {
4945 kwargs = NULL;
4946 }
4947 else if (!PyDict_Check(kwargs)) {
4948 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict");
4949 return NULL;
4950 }
4951
Petr Viktorinffd97532020-02-11 17:46:57 +01004952 return PyObject_VectorcallDict(func, stack, nargs, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02004953}
4954
4955
4956static PyObject *
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004957test_pyobject_vectorcall(PyObject *self, PyObject *args)
Victor Stinner3b5cf852017-06-09 16:48:45 +02004958{
4959 PyObject *func, *func_args, *kwnames = NULL;
4960 PyObject **stack;
4961 Py_ssize_t nargs, nkw;
4962
4963 if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) {
4964 return NULL;
4965 }
4966
4967 if (fastcall_args(func_args, &stack, &nargs) < 0) {
4968 return NULL;
4969 }
4970
4971 if (kwnames == Py_None) {
4972 kwnames = NULL;
4973 }
4974 else if (PyTuple_Check(kwnames)) {
4975 nkw = PyTuple_GET_SIZE(kwnames);
4976 if (nargs < nkw) {
4977 PyErr_SetString(PyExc_ValueError, "kwnames longer than args");
4978 return NULL;
4979 }
4980 nargs -= nkw;
4981 }
4982 else {
4983 PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple");
4984 return NULL;
4985 }
Petr Viktorinffd97532020-02-11 17:46:57 +01004986 return PyObject_Vectorcall(func, stack, nargs, kwnames);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02004987}
4988
4989
4990static PyObject *
4991test_pyvectorcall_call(PyObject *self, PyObject *args)
4992{
4993 PyObject *func;
4994 PyObject *argstuple;
4995 PyObject *kwargs = NULL;
4996
4997 if (!PyArg_ParseTuple(args, "OO|O", &func, &argstuple, &kwargs)) {
4998 return NULL;
4999 }
5000
5001 if (!PyTuple_Check(argstuple)) {
5002 PyErr_SetString(PyExc_TypeError, "args must be a tuple");
5003 return NULL;
5004 }
5005 if (kwargs != NULL && !PyDict_Check(kwargs)) {
5006 PyErr_SetString(PyExc_TypeError, "kwargs must be a dict");
5007 return NULL;
5008 }
5009
5010 return PyVectorcall_Call(func, argstuple, kwargs);
Victor Stinner3b5cf852017-06-09 16:48:45 +02005011}
5012
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005013
Victor Stinner64fa4492017-07-10 14:37:49 +02005014static PyObject*
5015stack_pointer(PyObject *self, PyObject *args)
5016{
5017 int v = 5;
5018 return PyLong_FromVoidPtr(&v);
5019}
5020
Victor Stinner3b5cf852017-06-09 16:48:45 +02005021
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005022#ifdef W_STOPCODE
5023static PyObject*
5024py_w_stopcode(PyObject *self, PyObject *args)
5025{
5026 int sig, status;
5027 if (!PyArg_ParseTuple(args, "i", &sig)) {
5028 return NULL;
5029 }
5030 status = W_STOPCODE(sig);
5031 return PyLong_FromLong(status);
5032}
5033#endif
5034
5035
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005036static PyObject *
Oren Milman0ccc0f62017-10-08 11:17:46 +03005037get_mapping_keys(PyObject* self, PyObject *obj)
5038{
5039 return PyMapping_Keys(obj);
5040}
5041
5042static PyObject *
5043get_mapping_values(PyObject* self, PyObject *obj)
5044{
5045 return PyMapping_Values(obj);
5046}
5047
5048static PyObject *
5049get_mapping_items(PyObject* self, PyObject *obj)
5050{
5051 return PyMapping_Items(obj);
5052}
5053
5054
5055static PyObject *
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005056test_pythread_tss_key_state(PyObject *self, PyObject *args)
5057{
5058 Py_tss_t tss_key = Py_tss_NEEDS_INIT;
5059 if (PyThread_tss_is_created(&tss_key)) {
5060 return raiseTestError("test_pythread_tss_key_state",
5061 "TSS key not in an uninitialized state at "
5062 "creation time");
5063 }
5064 if (PyThread_tss_create(&tss_key) != 0) {
5065 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_create failed");
5066 return NULL;
5067 }
5068 if (!PyThread_tss_is_created(&tss_key)) {
5069 return raiseTestError("test_pythread_tss_key_state",
5070 "PyThread_tss_create succeeded, "
5071 "but with TSS key in an uninitialized state");
5072 }
5073 if (PyThread_tss_create(&tss_key) != 0) {
5074 return raiseTestError("test_pythread_tss_key_state",
5075 "PyThread_tss_create unsuccessful with "
5076 "an already initialized key");
5077 }
5078#define CHECK_TSS_API(expr) \
5079 (void)(expr); \
5080 if (!PyThread_tss_is_created(&tss_key)) { \
5081 return raiseTestError("test_pythread_tss_key_state", \
5082 "TSS key initialization state was not " \
5083 "preserved after calling " #expr); }
5084 CHECK_TSS_API(PyThread_tss_set(&tss_key, NULL));
5085 CHECK_TSS_API(PyThread_tss_get(&tss_key));
5086#undef CHECK_TSS_API
5087 PyThread_tss_delete(&tss_key);
5088 if (PyThread_tss_is_created(&tss_key)) {
5089 return raiseTestError("test_pythread_tss_key_state",
5090 "PyThread_tss_delete called, but did not "
5091 "set the key state to uninitialized");
5092 }
5093
5094 Py_tss_t *ptr_key = PyThread_tss_alloc();
5095 if (ptr_key == NULL) {
5096 PyErr_SetString(PyExc_RuntimeError, "PyThread_tss_alloc failed");
5097 return NULL;
5098 }
5099 if (PyThread_tss_is_created(ptr_key)) {
5100 return raiseTestError("test_pythread_tss_key_state",
5101 "TSS key not in an uninitialized state at "
5102 "allocation time");
5103 }
5104 PyThread_tss_free(ptr_key);
5105 ptr_key = NULL;
5106 Py_RETURN_NONE;
5107}
5108
5109
Yury Selivanovf23746a2018-01-22 19:11:18 -05005110static PyObject*
5111new_hamt(PyObject *self, PyObject *args)
5112{
5113 return _PyContext_NewHamtForTests();
5114}
5115
5116
jdemeyer5a306202018-10-19 23:50:06 +02005117/* def bad_get(self, obj, cls):
5118 cls()
5119 return repr(self)
5120*/
5121static PyObject*
5122bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5123{
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005124 PyObject *self, *obj, *cls;
5125 if (!_PyArg_UnpackStack(args, nargs, "bad_get", 3, 3, &self, &obj, &cls)) {
jdemeyer5a306202018-10-19 23:50:06 +02005126 return NULL;
5127 }
5128
Jeroen Demeyer7f41c8e2019-07-04 12:35:31 +02005129 PyObject *res = _PyObject_CallNoArg(cls);
jdemeyer5a306202018-10-19 23:50:06 +02005130 if (res == NULL) {
5131 return NULL;
5132 }
5133 Py_DECREF(res);
5134
Serhiy Storchakab1dede32018-11-20 20:45:40 +02005135 return PyObject_Repr(self);
jdemeyer5a306202018-10-19 23:50:06 +02005136}
5137
5138
Victor Stinner3d4226a2018-08-29 22:21:32 +02005139static PyObject *
5140encode_locale_ex(PyObject *self, PyObject *args)
5141{
5142 PyObject *unicode;
5143 int current_locale = 0;
5144 wchar_t *wstr;
5145 PyObject *res = NULL;
5146 const char *errors = NULL;
5147
5148 if (!PyArg_ParseTuple(args, "U|is", &unicode, &current_locale, &errors)) {
5149 return NULL;
5150 }
5151 wstr = PyUnicode_AsWideCharString(unicode, NULL);
5152 if (wstr == NULL) {
5153 return NULL;
5154 }
5155 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5156
5157 char *str = NULL;
5158 size_t error_pos;
5159 const char *reason = NULL;
5160 int ret = _Py_EncodeLocaleEx(wstr,
5161 &str, &error_pos, &reason,
5162 current_locale, error_handler);
5163 PyMem_Free(wstr);
5164
5165 switch(ret) {
5166 case 0:
5167 res = PyBytes_FromString(str);
5168 PyMem_RawFree(str);
5169 break;
5170 case -1:
5171 PyErr_NoMemory();
5172 break;
5173 case -2:
5174 PyErr_Format(PyExc_RuntimeError, "encode error: pos=%zu, reason=%s",
5175 error_pos, reason);
5176 break;
5177 case -3:
5178 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5179 break;
5180 default:
5181 PyErr_SetString(PyExc_ValueError, "unknow error code");
5182 break;
5183 }
5184 return res;
5185}
5186
5187
5188static PyObject *
5189decode_locale_ex(PyObject *self, PyObject *args)
5190{
5191 char *str;
5192 int current_locale = 0;
5193 PyObject *res = NULL;
5194 const char *errors = NULL;
5195
5196 if (!PyArg_ParseTuple(args, "y|is", &str, &current_locale, &errors)) {
5197 return NULL;
5198 }
5199 _Py_error_handler error_handler = _Py_GetErrorHandler(errors);
5200
5201 wchar_t *wstr = NULL;
5202 size_t wlen = 0;
5203 const char *reason = NULL;
5204 int ret = _Py_DecodeLocaleEx(str,
5205 &wstr, &wlen, &reason,
5206 current_locale, error_handler);
5207
5208 switch(ret) {
5209 case 0:
5210 res = PyUnicode_FromWideChar(wstr, wlen);
5211 PyMem_RawFree(wstr);
5212 break;
5213 case -1:
5214 PyErr_NoMemory();
5215 break;
5216 case -2:
5217 PyErr_Format(PyExc_RuntimeError, "decode error: pos=%zu, reason=%s",
5218 wlen, reason);
5219 break;
5220 case -3:
5221 PyErr_SetString(PyExc_ValueError, "unsupported error handler");
5222 break;
5223 default:
5224 PyErr_SetString(PyExc_ValueError, "unknow error code");
5225 break;
5226 }
5227 return res;
5228}
5229
5230
Victor Stinner18618e652018-10-25 17:28:11 +02005231#ifdef Py_REF_DEBUG
5232static PyObject *
5233negative_refcount(PyObject *self, PyObject *Py_UNUSED(args))
5234{
5235 PyObject *obj = PyUnicode_FromString("negative_refcount");
5236 if (obj == NULL) {
5237 return NULL;
5238 }
5239 assert(Py_REFCNT(obj) == 1);
5240
Victor Stinnerc86a1122020-02-07 01:24:29 +01005241 Py_SET_REFCNT(obj, 0);
Victor Stinner18618e652018-10-25 17:28:11 +02005242 /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */
5243 Py_DECREF(obj);
5244
5245 Py_RETURN_NONE;
5246}
5247#endif
5248
5249
Victor Stinneref9d9b62019-05-22 11:28:22 +02005250static PyObject*
5251test_write_unraisable_exc(PyObject *self, PyObject *args)
5252{
Victor Stinner71c52e32019-05-27 08:57:14 +02005253 PyObject *exc, *err_msg, *obj;
5254 if (!PyArg_ParseTuple(args, "OOO", &exc, &err_msg, &obj)) {
Victor Stinneref9d9b62019-05-22 11:28:22 +02005255 return NULL;
5256 }
5257
Victor Stinner71c52e32019-05-27 08:57:14 +02005258 const char *err_msg_utf8;
5259 if (err_msg != Py_None) {
5260 err_msg_utf8 = PyUnicode_AsUTF8(err_msg);
5261 if (err_msg_utf8 == NULL) {
5262 return NULL;
5263 }
5264 }
5265 else {
5266 err_msg_utf8 = NULL;
5267 }
5268
Victor Stinneref9d9b62019-05-22 11:28:22 +02005269 PyErr_SetObject((PyObject *)Py_TYPE(exc), exc);
Victor Stinner71c52e32019-05-27 08:57:14 +02005270 _PyErr_WriteUnraisableMsg(err_msg_utf8, obj);
Victor Stinneref9d9b62019-05-22 11:28:22 +02005271 Py_RETURN_NONE;
5272}
5273
5274
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005275static PyObject *
5276sequence_getitem(PyObject *self, PyObject *args)
5277{
5278 PyObject *seq;
5279 Py_ssize_t i;
5280 if (!PyArg_ParseTuple(args, "On", &seq, &i)) {
5281 return NULL;
5282 }
5283 return PySequence_GetItem(seq, i);
5284}
5285
5286
Petr Viktorinf9583772019-09-10 12:21:09 +01005287/* Functions for testing C calling conventions (METH_*) are named meth_*,
5288 * e.g. "meth_varargs" for METH_VARARGS.
5289 *
5290 * They all return a tuple of their C-level arguments, with None instead
5291 * of NULL and Python tuples instead of C arrays.
5292 */
5293
5294
5295static PyObject*
5296_null_to_none(PyObject* obj)
5297{
5298 if (obj == NULL) {
5299 Py_RETURN_NONE;
5300 }
5301 Py_INCREF(obj);
5302 return obj;
5303}
5304
5305static PyObject*
5306meth_varargs(PyObject* self, PyObject* args)
5307{
5308 return Py_BuildValue("NO", _null_to_none(self), args);
5309}
5310
5311static PyObject*
5312meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs)
5313{
5314 return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs));
5315}
5316
5317static PyObject*
5318meth_o(PyObject* self, PyObject* obj)
5319{
5320 return Py_BuildValue("NO", _null_to_none(self), obj);
5321}
5322
5323static PyObject*
5324meth_noargs(PyObject* self, PyObject* ignored)
5325{
5326 return _null_to_none(self);
5327}
5328
5329static PyObject*
5330_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs)
5331{
5332 PyObject *tuple = PyTuple_New(nargs);
5333 if (tuple == NULL) {
5334 return NULL;
5335 }
5336 for (Py_ssize_t i=0; i < nargs; i++) {
5337 Py_INCREF(args[i]);
5338 PyTuple_SET_ITEM(tuple, i, args[i]);
5339 }
5340 return tuple;
5341}
5342
5343static PyObject*
5344meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs)
5345{
5346 return Py_BuildValue(
5347 "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs)
5348 );
5349}
5350
5351static PyObject*
5352meth_fastcall_keywords(PyObject* self, PyObject* const* args,
5353 Py_ssize_t nargs, PyObject* kwargs)
5354{
5355 PyObject *pyargs = _fastcall_to_tuple(args, nargs);
5356 if (pyargs == NULL) {
5357 return NULL;
5358 }
Petr Viktorinffd97532020-02-11 17:46:57 +01005359 PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type,
Petr Viktorinf9583772019-09-10 12:21:09 +01005360 args + nargs, 0, kwargs);
5361 return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs);
5362}
5363
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005364
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005365static PyObject*
5366pynumber_tobase(PyObject *module, PyObject *args)
5367{
5368 PyObject *obj;
5369 int base;
5370 if (!PyArg_ParseTuple(args, "Oi:pynumber_tobase",
5371 &obj, &base)) {
5372 return NULL;
5373 }
5374 return PyNumber_ToBase(obj, base);
5375}
5376
5377
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005378static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *);
5379
Victor Stinner0e2ac212020-11-18 18:48:06 +01005380
5381static PyObject*
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005382test_set_type_size(PyObject *self, PyObject *Py_UNUSED(ignored))
Victor Stinner0e2ac212020-11-18 18:48:06 +01005383{
5384 PyObject *obj = PyList_New(0);
5385 if (obj == NULL) {
5386 return NULL;
5387 }
5388
5389 // Ensure that following tests don't modify the object,
5390 // to ensure that Py_DECREF() will not crash.
5391 assert(Py_TYPE(obj) == &PyList_Type);
5392 assert(Py_SIZE(obj) == 0);
5393
5394 // bpo-39573: Check that Py_TYPE() and Py_SIZE() can be used
5395 // as l-values to set an object type and size.
5396 Py_TYPE(obj) = &PyList_Type;
5397 Py_SIZE(obj) = 0;
5398
5399 Py_DECREF(obj);
5400 Py_RETURN_NONE;
5401}
5402
5403
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005404// Test Py_NewRef() and Py_XNewRef() functions
5405static PyObject*
5406test_refcount(PyObject *self, PyObject *Py_UNUSED(ignored))
5407{
5408 PyObject *obj = PyList_New(0);
5409 if (obj == NULL) {
5410 return NULL;
5411 }
5412 assert(Py_REFCNT(obj) == 1);
5413
5414 // Test Py_NewRef()
5415 PyObject *ref = Py_NewRef(obj);
5416 assert(ref == obj);
5417 assert(Py_REFCNT(obj) == 2);
5418 Py_DECREF(ref);
5419
5420 // Test Py_XNewRef()
5421 PyObject *xref = Py_XNewRef(obj);
5422 assert(xref == obj);
5423 assert(Py_REFCNT(obj) == 2);
5424 Py_DECREF(xref);
5425
5426 assert(Py_XNewRef(NULL) == NULL);
5427
5428 Py_DECREF(obj);
5429 Py_RETURN_NONE;
5430}
5431
5432
Victor Stinnere2320252021-01-18 18:24:29 +01005433static PyObject *
5434test_fatal_error(PyObject *self, PyObject *args)
5435{
5436 char *message;
5437 int release_gil = 0;
5438 if (!PyArg_ParseTuple(args, "y|i:fatal_error", &message, &release_gil))
5439 return NULL;
5440 if (release_gil) {
5441 Py_BEGIN_ALLOW_THREADS
5442 Py_FatalError(message);
5443 Py_END_ALLOW_THREADS
5444 }
5445 else {
5446 Py_FatalError(message);
5447 }
5448 // Py_FatalError() does not return, but exits the process.
5449 Py_RETURN_NONE;
5450}
5451
5452
5453
Tim Peters9ea17ac2001-02-02 05:57:15 +00005454static PyMethodDef TestMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005455 {"raise_exception", raise_exception, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305456 {"raise_memoryerror", raise_memoryerror, METH_NOARGS},
Antoine Pitrou6bc217d2015-06-23 14:31:11 +02005457 {"set_errno", set_errno, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305458 {"test_config", test_config, METH_NOARGS},
5459 {"test_sizeof_c_types", test_sizeof_c_types, METH_NOARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005460 {"test_datetime_capi", test_datetime_capi, METH_NOARGS},
Paul Ganssle04af5b12018-01-24 17:29:30 -05005461 {"datetime_check_date", datetime_check_date, METH_VARARGS},
5462 {"datetime_check_time", datetime_check_time, METH_VARARGS},
5463 {"datetime_check_datetime", datetime_check_datetime, METH_VARARGS},
5464 {"datetime_check_delta", datetime_check_delta, METH_VARARGS},
5465 {"datetime_check_tzinfo", datetime_check_tzinfo, METH_VARARGS},
5466 {"make_timezones_capi", make_timezones_capi, METH_NOARGS},
Paul Gansslea049f572018-02-22 15:15:32 -05005467 {"get_timezones_offset_zero", get_timezones_offset_zero, METH_NOARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005468 {"get_timezone_utc_capi", get_timezone_utc_capi, METH_VARARGS},
Edison A98ff4d52019-05-17 13:28:42 -07005469 {"get_date_fromdate", get_date_fromdate, METH_VARARGS},
5470 {"get_datetime_fromdateandtime", get_datetime_fromdateandtime, METH_VARARGS},
5471 {"get_datetime_fromdateandtimeandfold", get_datetime_fromdateandtimeandfold, METH_VARARGS},
5472 {"get_time_fromtime", get_time_fromtime, METH_VARARGS},
5473 {"get_time_fromtimeandfold", get_time_fromtimeandfold, METH_VARARGS},
5474 {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS},
Paul Ganssle4d8c8c02019-04-27 15:39:40 -04005475 {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS},
5476 {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS},
Joannah Nanjekye2c5fb172019-08-29 09:54:46 -03005477 {"PyDateTime_GET", test_PyDateTime_GET, METH_O},
5478 {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O},
5479 {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O},
5480 {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305481 {"test_list_api", test_list_api, METH_NOARGS},
5482 {"test_dict_iteration", test_dict_iteration, METH_NOARGS},
Serhiy Storchakaf0b311b2016-11-06 13:18:24 +02005483 {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS},
Victor Stinner3d3f2642016-12-15 17:21:23 +01005484 {"dict_hassplittable", dict_hassplittable, METH_O},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305485 {"test_lazy_hash_inheritance", test_lazy_hash_inheritance,METH_NOARGS},
5486 {"test_long_api", test_long_api, METH_NOARGS},
5487 {"test_xincref_doesnt_leak",test_xincref_doesnt_leak, METH_NOARGS},
5488 {"test_incref_doesnt_leak", test_incref_doesnt_leak, METH_NOARGS},
5489 {"test_xdecref_doesnt_leak",test_xdecref_doesnt_leak, METH_NOARGS},
5490 {"test_decref_doesnt_leak", test_decref_doesnt_leak, METH_NOARGS},
Eddie Elizondo474eedf2018-11-13 04:09:31 -08005491 {"test_structseq_newtype_doesnt_leak",
5492 test_structseq_newtype_doesnt_leak, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305493 {"test_incref_decref_API", test_incref_decref_API, METH_NOARGS},
5494 {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS},
5495 {"test_long_as_double", test_long_as_double, METH_NOARGS},
5496 {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS},
Zackery Spytzdc247652019-06-06 14:39:23 -06005497 {"test_long_as_unsigned_long_long_mask",
5498 test_long_as_unsigned_long_long_mask, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305499 {"test_long_numbits", test_long_numbits, METH_NOARGS},
5500 {"test_k_code", test_k_code, METH_NOARGS},
5501 {"test_empty_argparse", test_empty_argparse, METH_NOARGS},
Larry Hastings8f904da2012-06-22 03:56:29 -07005502 {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305503 {"test_null_strings", test_null_strings, METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005504 {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305505 {"test_with_docstring", test_with_docstring, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005506 PyDoc_STR("This is a pretty normal docstring.")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305507 {"test_string_to_double", test_string_to_double, METH_NOARGS},
5508 {"test_unicode_compare_with_ascii", test_unicode_compare_with_ascii,
5509 METH_NOARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005510 {"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
Stefan Krah7213fcc2015-02-01 16:19:23 +01005511 {"test_from_contiguous", (PyCFunction)test_from_contiguous, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005512#if (defined(__linux__) || defined(__FreeBSD__)) && defined(__GNUC__)
Stefan Krah5178d912015-02-03 16:57:21 +01005513 {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
Stefan Kraha7559c02015-02-03 22:27:21 +01005514#endif
Stefan Krah650c1e82015-02-03 21:43:23 +01005515 {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -03005516 {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS},
Serhiy Storchaka13e602e2016-05-20 22:31:14 +03005517 {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02005518 {"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS},
Hai Shia13b26c2020-11-11 04:53:46 +08005519 {"get_args", get_args, METH_VARARGS},
5520 {"test_get_statictype_slots", test_get_statictype_slots, METH_NOARGS},
5521 {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs,
5522 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005523 {"getargs_tuple", getargs_tuple, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005524 {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005525 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005526 {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only,
Larry Hastings83a9f482012-03-20 20:06:16 +00005527 METH_VARARGS|METH_KEYWORDS},
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005528 {"getargs_positional_only_and_keywords",
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005529 (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords,
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +03005530 METH_VARARGS|METH_KEYWORDS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 {"getargs_b", getargs_b, METH_VARARGS},
5532 {"getargs_B", getargs_B, METH_VARARGS},
5533 {"getargs_h", getargs_h, METH_VARARGS},
5534 {"getargs_H", getargs_H, METH_VARARGS},
5535 {"getargs_I", getargs_I, METH_VARARGS},
5536 {"getargs_k", getargs_k, METH_VARARGS},
5537 {"getargs_i", getargs_i, METH_VARARGS},
5538 {"getargs_l", getargs_l, METH_VARARGS},
5539 {"getargs_n", getargs_n, METH_VARARGS},
Larry Hastingsfaf91e72012-05-05 16:54:29 -07005540 {"getargs_p", getargs_p, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 {"getargs_L", getargs_L, METH_VARARGS},
5542 {"getargs_K", getargs_K, METH_VARARGS},
5543 {"test_longlong_api", test_longlong_api, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305544 {"test_long_long_and_overflow",test_long_long_and_overflow, METH_NOARGS},
5545 {"test_L_code", test_L_code, METH_NOARGS},
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03005546 {"getargs_f", getargs_f, METH_VARARGS},
5547 {"getargs_d", getargs_d, METH_VARARGS},
5548 {"getargs_D", getargs_D, METH_VARARGS},
5549 {"getargs_S", getargs_S, METH_VARARGS},
5550 {"getargs_Y", getargs_Y, METH_VARARGS},
5551 {"getargs_U", getargs_U, METH_VARARGS},
Eli Bendersky906b88f2011-07-29 07:05:08 +03005552 {"getargs_c", getargs_c, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005553 {"getargs_C", getargs_C, METH_VARARGS},
Victor Stinner06e49dd2010-06-13 18:21:50 +00005554 {"getargs_s", getargs_s, METH_VARARGS},
5555 {"getargs_s_star", getargs_s_star, METH_VARARGS},
5556 {"getargs_s_hash", getargs_s_hash, METH_VARARGS},
5557 {"getargs_z", getargs_z, METH_VARARGS},
5558 {"getargs_z_star", getargs_z_star, METH_VARARGS},
5559 {"getargs_z_hash", getargs_z_hash, METH_VARARGS},
5560 {"getargs_y", getargs_y, METH_VARARGS},
5561 {"getargs_y_star", getargs_y_star, METH_VARARGS},
5562 {"getargs_y_hash", getargs_y_hash, METH_VARARGS},
5563 {"getargs_u", getargs_u, METH_VARARGS},
5564 {"getargs_u_hash", getargs_u_hash, METH_VARARGS},
5565 {"getargs_Z", getargs_Z, METH_VARARGS},
5566 {"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
Victor Stinner25e8ec42010-06-25 00:02:38 +00005567 {"getargs_w_star", getargs_w_star, METH_VARARGS},
Serhiy Storchakac8241fd2016-01-28 19:49:54 +02005568 {"getargs_es", getargs_es, METH_VARARGS},
5569 {"getargs_et", getargs_et, METH_VARARGS},
5570 {"getargs_es_hash", getargs_es_hash, METH_VARARGS},
5571 {"getargs_et_hash", getargs_et_hash, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005572 {"codec_incrementalencoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005573 (PyCFunction)codec_incrementalencoder, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 {"codec_incrementaldecoder",
Victor Stinner1c24bd02010-10-02 11:03:13 +00005575 (PyCFunction)codec_incrementaldecoder, METH_VARARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305576 {"test_s_code", test_s_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005577#if USE_UNICODE_WCHAR_CACHE
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305578 {"test_u_code", test_u_code, METH_NOARGS},
5579 {"test_Z_code", test_Z_code, METH_NOARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005580#endif /* USE_UNICODE_WCHAR_CACHE */
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305581 {"test_widechar", test_widechar, METH_NOARGS},
Victor Stinner42bf7752011-11-21 22:52:58 +01005582 {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS},
5583 {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS},
Serhiy Storchakacc164232016-10-02 21:29:26 +03005584 {"unicode_asucs4", unicode_asucs4, METH_VARARGS},
Hai Shi5623ac82019-07-20 02:56:23 -05005585 {"unicode_asutf8", unicode_asutf8, METH_VARARGS},
5586 {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS},
Xiang Zhangb2110682016-12-20 22:52:33 +08005587 {"unicode_findchar", unicode_findchar, METH_VARARGS},
Serhiy Storchaka9c0e1f82016-10-08 22:45:38 +03005588 {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005589#if USE_UNICODE_WCHAR_CACHE
Victor Stinner42bf7752011-11-21 22:52:58 +01005590 {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS},
5591 {"unicode_transformdecimaltoascii", unicode_transformdecimaltoascii, METH_VARARGS},
Stefan Krahe6996ed2012-11-02 14:44:20 +01005592 {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS},
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03005593#endif /* USE_UNICODE_WCHAR_CACHE */
Victor Stinner1c24bd02010-10-02 11:03:13 +00005594 {"_test_thread_state", test_thread_state, METH_VARARGS},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 {"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005596#ifdef HAVE_GETTIMEOFDAY
Victor Stinner1c24bd02010-10-02 11:03:13 +00005597 {"profile_int", profile_int, METH_NOARGS},
Guido van Rossumddefaf32007-01-14 03:31:43 +00005598#endif
Victor Stinner1c24bd02010-10-02 11:03:13 +00005599 {"traceback_print", traceback_print, METH_VARARGS},
5600 {"exception_print", exception_print, METH_VARARGS},
Martin v. Löwisaa2efcb2012-04-19 14:33:43 +02005601 {"set_exc_info", test_set_exc_info, METH_VARARGS},
Victor Stinner1c24bd02010-10-02 11:03:13 +00005602 {"argparsing", argparsing, METH_VARARGS},
5603 {"code_newempty", code_newempty, METH_VARARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005604 {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 METH_VARARGS | METH_KEYWORDS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305606 {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
Antoine Pitrou5bffa792011-02-24 20:50:49 +00005607 METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305608 {"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
Antoine Pitrou2f828f22012-01-18 00:21:11 +01005609 {"run_in_subinterp", run_in_subinterp, METH_VARARGS},
Victor Stinner5d272cc2012-03-13 13:35:55 +01005610 {"pytime_object_to_time_t", test_pytime_object_to_time_t, METH_VARARGS},
5611 {"pytime_object_to_timeval", test_pytime_object_to_timeval, METH_VARARGS},
Victor Stinner643cd682012-03-02 22:54:03 +01005612 {"pytime_object_to_timespec", test_pytime_object_to_timespec, METH_VARARGS},
Antoine Pitrou796564c2013-07-30 19:59:21 +02005613 {"with_tp_del", with_tp_del, METH_VARARGS},
Antoine Pitroub349e4c2014-08-06 19:31:40 -04005614 {"create_cfunction", create_cfunction, METH_NOARGS},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305615 {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS},
5616 {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
5617 {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
5618 {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
xdegaye85f64302017-07-01 14:14:45 +02005619 {"set_nomemory", (PyCFunction)set_nomemory, METH_VARARGS,
5620 PyDoc_STR("set_nomemory(start:int, stop:int = 0)")},
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05305621 {"remove_mem_hooks", remove_mem_hooks, METH_NOARGS,
xdegaye85f64302017-07-01 14:14:45 +02005622 PyDoc_STR("Remove memory hooks.")},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005623 {"no_docstring",
5624 (PyCFunction)test_with_docstring, METH_NOARGS},
5625 {"docstring_empty",
5626 (PyCFunction)test_with_docstring, METH_NOARGS,
5627 docstring_empty},
5628 {"docstring_no_signature",
5629 (PyCFunction)test_with_docstring, METH_NOARGS,
5630 docstring_no_signature},
5631 {"docstring_with_invalid_signature",
5632 (PyCFunction)test_with_docstring, METH_NOARGS,
5633 docstring_with_invalid_signature},
Larry Hastings2623c8c2014-02-08 22:15:29 -08005634 {"docstring_with_invalid_signature2",
5635 (PyCFunction)test_with_docstring, METH_NOARGS,
5636 docstring_with_invalid_signature2},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005637 {"docstring_with_signature",
5638 (PyCFunction)test_with_docstring, METH_NOARGS,
5639 docstring_with_signature},
Zachary Ware8ef887c2015-04-13 18:22:35 -05005640 {"docstring_with_signature_but_no_doc",
5641 (PyCFunction)test_with_docstring, METH_NOARGS,
5642 docstring_with_signature_but_no_doc},
Larry Hastings44e2eaa2013-11-23 15:37:55 -08005643 {"docstring_with_signature_and_extra_newlines",
5644 (PyCFunction)test_with_docstring, METH_NOARGS,
5645 docstring_with_signature_and_extra_newlines},
Larry Hastings16c51912014-01-07 11:53:01 -08005646 {"docstring_with_signature_with_defaults",
5647 (PyCFunction)test_with_docstring, METH_NOARGS,
5648 docstring_with_signature_with_defaults},
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +01005649 {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O,
5650 PyDoc_STR("set_error_class(error_class) -> None")},
Serhiy Storchakab5181342015-02-06 08:58:56 +02005651 {"pymarshal_write_long_to_file",
5652 pymarshal_write_long_to_file, METH_VARARGS},
5653 {"pymarshal_write_object_to_file",
5654 pymarshal_write_object_to_file, METH_VARARGS},
5655 {"pymarshal_read_short_from_file",
5656 pymarshal_read_short_from_file, METH_VARARGS},
5657 {"pymarshal_read_long_from_file",
5658 pymarshal_read_long_from_file, METH_VARARGS},
5659 {"pymarshal_read_last_object_from_file",
5660 pymarshal_read_last_object_from_file, METH_VARARGS},
5661 {"pymarshal_read_object_from_file",
5662 pymarshal_read_object_from_file, METH_VARARGS},
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01005663 {"return_null_without_error", return_null_without_error, METH_NOARGS},
5664 {"return_result_with_error", return_result_with_error, METH_NOARGS},
5665 {"getitem_with_error", getitem_with_error, METH_VARARGS},
Victor Stinner13019fd2015-04-03 13:10:54 +02005666 {"PyTime_FromSeconds", test_pytime_fromseconds, METH_VARARGS},
Victor Stinner4bfb4602015-03-27 22:27:24 +01005667 {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject, METH_VARARGS},
5668 {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
Victor Stinner95e9cef2015-03-28 01:26:47 +01005669 {"PyTime_AsTimeval", test_PyTime_AsTimeval, METH_VARARGS},
Victor Stinner34dc0f42015-03-27 18:19:03 +01005670#ifdef HAVE_CLOCK_GETTIME
5671 {"PyTime_AsTimespec", test_PyTime_AsTimespec, METH_VARARGS},
5672#endif
Victor Stinner62d1c702015-04-01 17:47:07 +02005673 {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS},
5674 {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS},
Victor Stinner34be807c2016-03-14 12:04:26 +01005675 {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS},
5676 {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
Victor Stinnerad524372016-03-16 12:12:53 +01005677 {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
Victor Stinner5d39e042017-11-29 17:20:38 +01005678 {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
Victor Stinner68762572019-10-07 18:42:01 +02005679 {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
Victor Stinner3bf0f3a2019-06-07 16:22:21 +02005680 {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
5681 {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
5682 {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
Victor Stinnerc4aec362016-03-14 22:26:53 +01005683 {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS},
Victor Stinner10b73e12016-03-22 13:39:05 +01005684 {"tracemalloc_track", tracemalloc_track, METH_VARARGS},
5685 {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS},
5686 {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS},
Victor Stinner3b6a6b42016-09-08 12:51:24 -07005687 {"dict_get_version", dict_get_version, METH_VARARGS},
Nathaniel J. Smithab4413a2017-05-17 13:33:23 -07005688 {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS},
Victor Stinner3b5cf852017-06-09 16:48:45 +02005689 {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
5690 {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +02005691 {"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
5692 {"pyvectorcall_call", test_pyvectorcall_call, METH_VARARGS},
Victor Stinner64fa4492017-07-10 14:37:49 +02005693 {"stack_pointer", stack_pointer, METH_NOARGS},
Victor Stinner7b7c6dc2017-08-10 12:37:39 +02005694#ifdef W_STOPCODE
5695 {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
5696#endif
Oren Milman0ccc0f62017-10-08 11:17:46 +03005697 {"get_mapping_keys", get_mapping_keys, METH_O},
5698 {"get_mapping_values", get_mapping_values, METH_O},
5699 {"get_mapping_items", get_mapping_items, METH_O},
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09005700 {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS},
Yury Selivanovf23746a2018-01-22 19:11:18 -05005701 {"hamt", new_hamt, METH_NOARGS},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02005702 {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL},
Victor Stinner3d4226a2018-08-29 22:21:32 +02005703 {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS},
5704 {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS},
Victor Stinner18618e652018-10-25 17:28:11 +02005705#ifdef Py_REF_DEBUG
5706 {"negative_refcount", negative_refcount, METH_NOARGS},
5707#endif
Victor Stinneref9d9b62019-05-22 11:28:22 +02005708 {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS},
Sergey Fedoseev92709a22019-09-09 21:28:34 +05005709 {"sequence_getitem", sequence_getitem, METH_VARARGS},
Petr Viktorinf9583772019-09-10 12:21:09 +01005710 {"meth_varargs", meth_varargs, METH_VARARGS},
5711 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
5712 {"meth_o", meth_o, METH_O},
5713 {"meth_noargs", meth_noargs, METH_NOARGS},
5714 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
5715 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02005716 {"pynumber_tobase", pynumber_tobase, METH_VARARGS},
Brandt Bucherc13b8472020-10-14 18:44:07 -07005717 {"without_gc", without_gc, METH_O},
Victor Stinner0e2ac212020-11-18 18:48:06 +01005718 {"test_set_type_size", test_set_type_size, METH_NOARGS},
Victor Stinner8b6c4a92020-12-03 14:01:10 +01005719 {"test_refcount", test_refcount, METH_NOARGS},
Victor Stinnere2320252021-01-18 18:24:29 +01005720 {"fatal_error", test_fatal_error, METH_VARARGS,
5721 PyDoc_STR("fatal_error(message, release_gil=False): call Py_FatalError(message)")},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005722 {NULL, NULL} /* sentinel */
Tim Peters9ea17ac2001-02-02 05:57:15 +00005723};
5724
Thomas Hellera4ea6032003-04-17 18:55:45 +00005725#define AddSym(d, n, f, v) {PyObject *o = f(v); PyDict_SetItemString(d, n, o); Py_DECREF(o);}
5726
Thomas Wouters89f507f2006-12-13 04:49:30 +00005727typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728 char bool_member;
5729 char byte_member;
5730 unsigned char ubyte_member;
5731 short short_member;
5732 unsigned short ushort_member;
5733 int int_member;
5734 unsigned int uint_member;
5735 long long_member;
5736 unsigned long ulong_member;
5737 Py_ssize_t pyssizet_member;
5738 float float_member;
5739 double double_member;
5740 char inplace_member[6];
Benjamin Petersonaf580df2016-09-06 10:46:49 -07005741 long long longlong_member;
5742 unsigned long long ulonglong_member;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005743} all_structmembers;
5744
5745typedef struct {
5746 PyObject_HEAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005747 all_structmembers structmembers;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005748} test_structmembers;
5749
5750static struct PyMemberDef test_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751 {"T_BOOL", T_BOOL, offsetof(test_structmembers, structmembers.bool_member), 0, NULL},
5752 {"T_BYTE", T_BYTE, offsetof(test_structmembers, structmembers.byte_member), 0, NULL},
5753 {"T_UBYTE", T_UBYTE, offsetof(test_structmembers, structmembers.ubyte_member), 0, NULL},
5754 {"T_SHORT", T_SHORT, offsetof(test_structmembers, structmembers.short_member), 0, NULL},
5755 {"T_USHORT", T_USHORT, offsetof(test_structmembers, structmembers.ushort_member), 0, NULL},
5756 {"T_INT", T_INT, offsetof(test_structmembers, structmembers.int_member), 0, NULL},
5757 {"T_UINT", T_UINT, offsetof(test_structmembers, structmembers.uint_member), 0, NULL},
5758 {"T_LONG", T_LONG, offsetof(test_structmembers, structmembers.long_member), 0, NULL},
5759 {"T_ULONG", T_ULONG, offsetof(test_structmembers, structmembers.ulong_member), 0, NULL},
5760 {"T_PYSSIZET", T_PYSSIZET, offsetof(test_structmembers, structmembers.pyssizet_member), 0, NULL},
5761 {"T_FLOAT", T_FLOAT, offsetof(test_structmembers, structmembers.float_member), 0, NULL},
5762 {"T_DOUBLE", T_DOUBLE, offsetof(test_structmembers, structmembers.double_member), 0, NULL},
5763 {"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005764 {"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
5765 {"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 {NULL}
Thomas Wouters89f507f2006-12-13 04:49:30 +00005767};
5768
5769
Christian Heimes1af737c2008-01-23 08:24:23 +00005770static PyObject *
5771test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
5772{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 static char *keywords[] = {
5774 "T_BOOL", "T_BYTE", "T_UBYTE", "T_SHORT", "T_USHORT",
5775 "T_INT", "T_UINT", "T_LONG", "T_ULONG", "T_PYSSIZET",
5776 "T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005777 "T_LONGLONG", "T_ULONGLONG",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778 NULL};
Benjamin Petersoned4aa832016-09-05 17:44:18 -07005779 static const char fmt[] = "|bbBhHiIlknfds#LK";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005780 test_structmembers *ob;
5781 const char *s = NULL;
5782 Py_ssize_t string_len = 0;
5783 ob = PyObject_New(test_structmembers, type);
5784 if (ob == NULL)
5785 return NULL;
5786 memset(&ob->structmembers, 0, sizeof(all_structmembers));
5787 if (!PyArg_ParseTupleAndKeywords(args, kwargs, fmt, keywords,
5788 &ob->structmembers.bool_member,
5789 &ob->structmembers.byte_member,
5790 &ob->structmembers.ubyte_member,
5791 &ob->structmembers.short_member,
5792 &ob->structmembers.ushort_member,
5793 &ob->structmembers.int_member,
5794 &ob->structmembers.uint_member,
5795 &ob->structmembers.long_member,
5796 &ob->structmembers.ulong_member,
5797 &ob->structmembers.pyssizet_member,
5798 &ob->structmembers.float_member,
5799 &ob->structmembers.double_member,
5800 &s, &string_len
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801 , &ob->structmembers.longlong_member,
5802 &ob->structmembers.ulonglong_member
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005803 )) {
5804 Py_DECREF(ob);
5805 return NULL;
5806 }
5807 if (s != NULL) {
5808 if (string_len > 5) {
5809 Py_DECREF(ob);
5810 PyErr_SetString(PyExc_ValueError, "string too long");
5811 return NULL;
5812 }
5813 strcpy(ob->structmembers.inplace_member, s);
5814 }
5815 else {
5816 strcpy(ob->structmembers.inplace_member, "");
5817 }
5818 return (PyObject *)ob;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005819}
5820
Christian Heimes1af737c2008-01-23 08:24:23 +00005821static void
5822test_structmembers_free(PyObject *ob)
5823{
Victor Stinner32bd68c2020-12-01 10:37:39 +01005824 PyObject_Free(ob);
Thomas Wouters89f507f2006-12-13 04:49:30 +00005825}
5826
5827static PyTypeObject test_structmembersType = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00005828 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005829 "test_structmembersType",
5830 sizeof(test_structmembers), /* tp_basicsize */
5831 0, /* tp_itemsize */
5832 test_structmembers_free, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005833 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 0, /* tp_getattr */
5835 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005836 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837 0, /* tp_repr */
5838 0, /* tp_as_number */
5839 0, /* tp_as_sequence */
5840 0, /* tp_as_mapping */
5841 0, /* tp_hash */
5842 0, /* tp_call */
5843 0, /* tp_str */
5844 PyObject_GenericGetAttr, /* tp_getattro */
5845 PyObject_GenericSetAttr, /* tp_setattro */
5846 0, /* tp_as_buffer */
5847 0, /* tp_flags */
5848 "Type containing all structmember types",
5849 0, /* traverseproc tp_traverse */
5850 0, /* tp_clear */
5851 0, /* tp_richcompare */
5852 0, /* tp_weaklistoffset */
5853 0, /* tp_iter */
5854 0, /* tp_iternext */
5855 0, /* tp_methods */
5856 test_members, /* tp_members */
5857 0,
5858 0,
5859 0,
5860 0,
5861 0,
5862 0,
5863 0,
5864 0,
5865 test_structmembers_new, /* tp_new */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005866};
5867
5868
Benjamin Petersond51374e2014-04-09 23:55:56 -04005869typedef struct {
5870 PyObject_HEAD
5871} matmulObject;
5872
5873static PyObject *
5874matmulType_matmul(PyObject *self, PyObject *other)
5875{
5876 return Py_BuildValue("(sOO)", "matmul", self, other);
5877}
5878
5879static PyObject *
5880matmulType_imatmul(PyObject *self, PyObject *other)
5881{
5882 return Py_BuildValue("(sOO)", "imatmul", self, other);
5883}
5884
5885static void
5886matmulType_dealloc(PyObject *self)
5887{
Zachary Ware420dc562014-04-23 13:51:27 -05005888 Py_TYPE(self)->tp_free(self);
Benjamin Petersond51374e2014-04-09 23:55:56 -04005889}
5890
5891static PyNumberMethods matmulType_as_number = {
5892 0, /* nb_add */
5893 0, /* nb_subtract */
5894 0, /* nb_multiply */
5895 0, /* nb_remainde r*/
5896 0, /* nb_divmod */
5897 0, /* nb_power */
5898 0, /* nb_negative */
5899 0, /* tp_positive */
5900 0, /* tp_absolute */
5901 0, /* tp_bool */
5902 0, /* nb_invert */
5903 0, /* nb_lshift */
5904 0, /* nb_rshift */
5905 0, /* nb_and */
5906 0, /* nb_xor */
5907 0, /* nb_or */
5908 0, /* nb_int */
5909 0, /* nb_reserved */
5910 0, /* nb_float */
5911 0, /* nb_inplace_add */
5912 0, /* nb_inplace_subtract */
5913 0, /* nb_inplace_multiply */
5914 0, /* nb_inplace_remainder */
5915 0, /* nb_inplace_power */
5916 0, /* nb_inplace_lshift */
5917 0, /* nb_inplace_rshift */
5918 0, /* nb_inplace_and */
5919 0, /* nb_inplace_xor */
5920 0, /* nb_inplace_or */
5921 0, /* nb_floor_divide */
5922 0, /* nb_true_divide */
5923 0, /* nb_inplace_floor_divide */
5924 0, /* nb_inplace_true_divide */
5925 0, /* nb_index */
5926 matmulType_matmul, /* nb_matrix_multiply */
5927 matmulType_imatmul /* nb_matrix_inplace_multiply */
5928};
5929
5930static PyTypeObject matmulType = {
5931 PyVarObject_HEAD_INIT(NULL, 0)
5932 "matmulType",
5933 sizeof(matmulObject), /* tp_basicsize */
5934 0, /* tp_itemsize */
5935 matmulType_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005936 0, /* tp_vectorcall_offset */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005937 0, /* tp_getattr */
5938 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005939 0, /* tp_as_async */
Benjamin Petersond51374e2014-04-09 23:55:56 -04005940 0, /* tp_repr */
5941 &matmulType_as_number, /* tp_as_number */
5942 0, /* tp_as_sequence */
5943 0, /* tp_as_mapping */
5944 0, /* tp_hash */
5945 0, /* tp_call */
5946 0, /* tp_str */
5947 PyObject_GenericGetAttr, /* tp_getattro */
5948 PyObject_GenericSetAttr, /* tp_setattro */
5949 0, /* tp_as_buffer */
5950 0, /* tp_flags */
5951 "C level type with matrix operations defined",
5952 0, /* traverseproc tp_traverse */
5953 0, /* tp_clear */
5954 0, /* tp_richcompare */
5955 0, /* tp_weaklistoffset */
5956 0, /* tp_iter */
5957 0, /* tp_iternext */
5958 0, /* tp_methods */
5959 0, /* tp_members */
5960 0,
5961 0,
5962 0,
5963 0,
5964 0,
5965 0,
5966 0,
5967 0,
5968 PyType_GenericNew, /* tp_new */
5969 PyObject_Del, /* tp_free */
5970};
5971
Zackery Spytzc7f803b2019-05-31 03:46:36 -06005972typedef struct {
5973 PyObject_HEAD
5974} ipowObject;
5975
5976static PyObject *
5977ipowType_ipow(PyObject *self, PyObject *other, PyObject *mod)
5978{
5979 return Py_BuildValue("OO", other, mod);
5980}
5981
5982static PyNumberMethods ipowType_as_number = {
5983 .nb_inplace_power = ipowType_ipow
5984};
5985
5986static PyTypeObject ipowType = {
5987 PyVarObject_HEAD_INIT(NULL, 0)
5988 .tp_name = "ipowType",
5989 .tp_basicsize = sizeof(ipowObject),
5990 .tp_as_number = &ipowType_as_number,
5991 .tp_new = PyType_GenericNew
5992};
Martin v. Löwis1a214512008-06-11 05:26:20 +00005993
Yury Selivanov75445082015-05-11 22:57:16 -04005994typedef struct {
5995 PyObject_HEAD
5996 PyObject *ao_iterator;
5997} awaitObject;
5998
5999
6000static PyObject *
6001awaitObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6002{
6003 PyObject *v;
6004 awaitObject *ao;
6005
6006 if (!PyArg_UnpackTuple(args, "awaitObject", 1, 1, &v))
6007 return NULL;
6008
6009 ao = (awaitObject *)type->tp_alloc(type, 0);
6010 if (ao == NULL) {
6011 return NULL;
6012 }
6013
6014 Py_INCREF(v);
6015 ao->ao_iterator = v;
6016
6017 return (PyObject *)ao;
6018}
6019
6020
6021static void
6022awaitObject_dealloc(awaitObject *ao)
6023{
6024 Py_CLEAR(ao->ao_iterator);
6025 Py_TYPE(ao)->tp_free(ao);
6026}
6027
6028
6029static PyObject *
6030awaitObject_await(awaitObject *ao)
6031{
6032 Py_INCREF(ao->ao_iterator);
6033 return ao->ao_iterator;
6034}
6035
6036static PyAsyncMethods awaitType_as_async = {
Yury Selivanov6ef05902015-05-28 11:21:31 -04006037 (unaryfunc)awaitObject_await, /* am_await */
Yury Selivanov75445082015-05-11 22:57:16 -04006038 0, /* am_aiter */
Vladimir Matveev1e996c32020-11-10 12:09:55 -08006039 0, /* am_anext */
6040 0, /* am_send */
Yury Selivanov75445082015-05-11 22:57:16 -04006041};
6042
6043
6044static PyTypeObject awaitType = {
6045 PyVarObject_HEAD_INIT(NULL, 0)
6046 "awaitType",
6047 sizeof(awaitObject), /* tp_basicsize */
6048 0, /* tp_itemsize */
6049 (destructor)awaitObject_dealloc, /* destructor tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006050 0, /* tp_vectorcall_offset */
Yury Selivanov75445082015-05-11 22:57:16 -04006051 0, /* tp_getattr */
6052 0, /* tp_setattr */
6053 &awaitType_as_async, /* tp_as_async */
6054 0, /* tp_repr */
6055 0, /* tp_as_number */
6056 0, /* tp_as_sequence */
6057 0, /* tp_as_mapping */
6058 0, /* tp_hash */
6059 0, /* tp_call */
6060 0, /* tp_str */
6061 PyObject_GenericGetAttr, /* tp_getattro */
6062 PyObject_GenericSetAttr, /* tp_setattro */
6063 0, /* tp_as_buffer */
6064 0, /* tp_flags */
6065 "C level type with tp_as_async",
6066 0, /* traverseproc tp_traverse */
6067 0, /* tp_clear */
6068 0, /* tp_richcompare */
6069 0, /* tp_weaklistoffset */
6070 0, /* tp_iter */
6071 0, /* tp_iternext */
6072 0, /* tp_methods */
6073 0, /* tp_members */
6074 0,
6075 0,
6076 0,
6077 0,
6078 0,
6079 0,
6080 0,
6081 0,
6082 awaitObject_new, /* tp_new */
6083 PyObject_Del, /* tp_free */
6084};
6085
6086
xdegaye56d1f5c2017-10-26 15:09:06 +02006087static int recurse_infinitely_error_init(PyObject *, PyObject *, PyObject *);
6088
6089static PyTypeObject PyRecursingInfinitelyError_Type = {
6090 PyVarObject_HEAD_INIT(NULL, 0)
6091 "RecursingInfinitelyError", /* tp_name */
6092 sizeof(PyBaseExceptionObject), /* tp_basicsize */
6093 0, /* tp_itemsize */
6094 0, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006095 0, /* tp_vectorcall_offset */
xdegaye56d1f5c2017-10-26 15:09:06 +02006096 0, /* tp_getattr */
6097 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006098 0, /* tp_as_async */
xdegaye56d1f5c2017-10-26 15:09:06 +02006099 0, /* tp_repr */
6100 0, /* tp_as_number */
6101 0, /* tp_as_sequence */
6102 0, /* tp_as_mapping */
6103 0, /* tp_hash */
6104 0, /* tp_call */
6105 0, /* tp_str */
6106 0, /* tp_getattro */
6107 0, /* tp_setattro */
6108 0, /* tp_as_buffer */
6109 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6110 "Instantiating this exception starts infinite recursion.", /* tp_doc */
6111 0, /* tp_traverse */
6112 0, /* tp_clear */
6113 0, /* tp_richcompare */
6114 0, /* tp_weaklistoffset */
6115 0, /* tp_iter */
6116 0, /* tp_iternext */
6117 0, /* tp_methods */
6118 0, /* tp_members */
6119 0, /* tp_getset */
6120 0, /* tp_base */
6121 0, /* tp_dict */
6122 0, /* tp_descr_get */
6123 0, /* tp_descr_set */
6124 0, /* tp_dictoffset */
6125 (initproc)recurse_infinitely_error_init, /* tp_init */
6126 0, /* tp_alloc */
6127 0, /* tp_new */
6128};
6129
6130static int
6131recurse_infinitely_error_init(PyObject *self, PyObject *args, PyObject *kwds)
6132{
6133 PyObject *type = (PyObject *)&PyRecursingInfinitelyError_Type;
6134
6135 /* Instantiating this exception starts infinite recursion. */
6136 Py_INCREF(type);
6137 PyErr_SetObject(type, NULL);
6138 return -1;
6139}
6140
6141
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006142/* Test bpo-35983: create a subclass of "list" which checks that instances
6143 * are not deallocated twice */
6144
6145typedef struct {
6146 PyListObject list;
6147 int deallocated;
6148} MyListObject;
6149
6150static PyObject *
6151MyList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6152{
6153 PyObject* op = PyList_Type.tp_new(type, args, kwds);
6154 ((MyListObject*)op)->deallocated = 0;
6155 return op;
6156}
6157
6158void
6159MyList_dealloc(MyListObject* op)
6160{
6161 if (op->deallocated) {
6162 /* We cannot raise exceptions here but we still want the testsuite
6163 * to fail when we hit this */
6164 Py_FatalError("MyList instance deallocated twice");
6165 }
6166 op->deallocated = 1;
6167 PyList_Type.tp_dealloc((PyObject *)op);
6168}
6169
6170static PyTypeObject MyList_Type = {
6171 PyVarObject_HEAD_INIT(NULL, 0)
6172 "MyList",
6173 sizeof(MyListObject),
6174 0,
6175 (destructor)MyList_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006176 0, /* tp_vectorcall_offset */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006177 0, /* tp_getattr */
6178 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02006179 0, /* tp_as_async */
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006180 0, /* tp_repr */
6181 0, /* tp_as_number */
6182 0, /* tp_as_sequence */
6183 0, /* tp_as_mapping */
6184 0, /* tp_hash */
6185 0, /* tp_call */
6186 0, /* tp_str */
6187 0, /* tp_getattro */
6188 0, /* tp_setattro */
6189 0, /* tp_as_buffer */
6190 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
6191 0, /* tp_doc */
6192 0, /* tp_traverse */
6193 0, /* tp_clear */
6194 0, /* tp_richcompare */
6195 0, /* tp_weaklistoffset */
6196 0, /* tp_iter */
6197 0, /* tp_iternext */
6198 0, /* tp_methods */
6199 0, /* tp_members */
6200 0, /* tp_getset */
6201 0, /* &PyList_Type */ /* tp_base */
6202 0, /* tp_dict */
6203 0, /* tp_descr_get */
6204 0, /* tp_descr_set */
6205 0, /* tp_dictoffset */
6206 0, /* tp_init */
6207 0, /* tp_alloc */
6208 MyList_new, /* tp_new */
6209};
6210
6211
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006212/* Test PEP 560 */
6213
6214typedef struct {
6215 PyObject_HEAD
6216 PyObject *item;
6217} PyGenericAliasObject;
6218
6219static void
6220generic_alias_dealloc(PyGenericAliasObject *self)
6221{
6222 Py_CLEAR(self->item);
Victor Stinnere8600892018-01-17 23:08:18 +01006223 Py_TYPE(self)->tp_free((PyObject *)self);
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006224}
6225
6226static PyObject *
6227generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases)
6228{
6229 return PyTuple_Pack(1, self->item);
6230}
6231
6232static PyMethodDef generic_alias_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02006233 {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006234 {NULL} /* sentinel */
6235};
6236
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006237static PyTypeObject GenericAlias_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006238 PyVarObject_HEAD_INIT(NULL, 0)
6239 "GenericAlias",
6240 sizeof(PyGenericAliasObject),
6241 0,
6242 .tp_dealloc = (destructor)generic_alias_dealloc,
6243 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6244 .tp_methods = generic_alias_methods,
6245};
6246
6247static PyObject *
6248generic_alias_new(PyObject *item)
6249{
6250 PyGenericAliasObject *o = PyObject_New(PyGenericAliasObject, &GenericAlias_Type);
6251 if (o == NULL) {
6252 return NULL;
6253 }
6254 Py_INCREF(item);
6255 o->item = item;
6256 return (PyObject*) o;
6257}
6258
6259typedef struct {
6260 PyObject_HEAD
6261} PyGenericObject;
6262
6263static PyObject *
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006264generic_class_getitem(PyObject *type, PyObject *item)
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006265{
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006266 return generic_alias_new(item);
6267}
6268
6269static PyMethodDef generic_methods[] = {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +02006270 {"__class_getitem__", generic_class_getitem, METH_O|METH_CLASS, NULL},
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006271 {NULL} /* sentinel */
6272};
6273
Benjamin Peterson97ae32c2018-07-03 22:39:09 -07006274static PyTypeObject Generic_Type = {
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02006275 PyVarObject_HEAD_INIT(NULL, 0)
6276 "Generic",
6277 sizeof(PyGenericObject),
6278 0,
6279 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6280 .tp_methods = generic_methods,
6281};
6282
6283
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006284/* Test PEP 590 */
6285
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006286typedef struct {
6287 PyObject_HEAD
6288 vectorcallfunc vectorcall;
6289} MethodDescriptorObject;
6290
6291static PyObject *
6292MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args,
6293 size_t nargsf, PyObject *kwnames)
6294{
6295 /* True if using the vectorcall function in MethodDescriptorObject
6296 * but False for MethodDescriptor2Object */
6297 MethodDescriptorObject *md = (MethodDescriptorObject *)callable;
6298 return PyBool_FromLong(md->vectorcall != NULL);
6299}
6300
6301static PyObject *
6302MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6303{
Petr Viktorine584cbf2019-06-03 01:08:14 +02006304 MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0);
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006305 op->vectorcall = MethodDescriptor_vectorcall;
6306 return (PyObject *)op;
6307}
6308
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006309static PyObject *
6310func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6311{
6312 if (obj == Py_None || obj == NULL) {
6313 Py_INCREF(func);
6314 return func;
6315 }
6316 return PyMethod_New(func, obj);
6317}
6318
6319static PyObject *
6320nop_descr_get(PyObject *func, PyObject *obj, PyObject *type)
6321{
6322 Py_INCREF(func);
6323 return func;
6324}
6325
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006326static PyObject *
6327call_return_args(PyObject *self, PyObject *args, PyObject *kwargs)
6328{
6329 Py_INCREF(args);
6330 return args;
6331}
6332
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006333static PyTypeObject MethodDescriptorBase_Type = {
6334 PyVarObject_HEAD_INIT(NULL, 0)
6335 "MethodDescriptorBase",
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006336 sizeof(MethodDescriptorObject),
6337 .tp_new = MethodDescriptor_new,
6338 .tp_call = PyVectorcall_Call,
6339 .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall),
6340 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Petr Viktorinffd97532020-02-11 17:46:57 +01006341 Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006342 .tp_descr_get = func_descr_get,
6343};
6344
6345static PyTypeObject MethodDescriptorDerived_Type = {
6346 PyVarObject_HEAD_INIT(NULL, 0)
6347 "MethodDescriptorDerived",
6348 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6349};
6350
6351static PyTypeObject MethodDescriptorNopGet_Type = {
6352 PyVarObject_HEAD_INIT(NULL, 0)
6353 "MethodDescriptorNopGet",
6354 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006355 .tp_call = call_return_args,
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006356 .tp_descr_get = nop_descr_get,
6357};
6358
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006359typedef struct {
6360 MethodDescriptorObject base;
6361 vectorcallfunc vectorcall;
6362} MethodDescriptor2Object;
6363
6364static PyObject *
6365MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw)
6366{
6367 MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type);
6368 op->base.vectorcall = NULL;
6369 op->vectorcall = MethodDescriptor_vectorcall;
6370 return (PyObject *)op;
6371}
6372
6373static PyTypeObject MethodDescriptor2_Type = {
6374 PyVarObject_HEAD_INIT(NULL, 0)
6375 "MethodDescriptor2",
6376 sizeof(MethodDescriptor2Object),
6377 .tp_new = MethodDescriptor2_new,
6378 .tp_call = PyVectorcall_Call,
6379 .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall),
Petr Viktorinffd97532020-02-11 17:46:57 +01006380 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL,
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02006381};
6382
Benjamin Peterson39403332020-09-02 11:29:06 -05006383PyDoc_STRVAR(heapdocctype__doc__,
6384"HeapDocCType(arg1, arg2)\n"
6385"--\n"
6386"\n"
6387"somedoc");
6388
6389typedef struct {
6390 PyObject_HEAD
6391} HeapDocCTypeObject;
6392
6393static PyType_Slot HeapDocCType_slots[] = {
6394 {Py_tp_doc, (char*)heapdocctype__doc__},
6395 {0},
6396};
6397
6398static PyType_Spec HeapDocCType_spec = {
6399 "_testcapi.HeapDocCType",
6400 sizeof(HeapDocCTypeObject),
6401 0,
6402 Py_TPFLAGS_DEFAULT,
6403 HeapDocCType_slots
6404};
6405
Hai Shi88c2cfd2020-11-07 00:04:47 +08006406typedef struct {
6407 PyObject_HEAD
6408} NullTpDocTypeObject;
6409
6410static PyType_Slot NullTpDocType_slots[] = {
6411 {Py_tp_doc, NULL},
6412 {0, 0},
6413};
6414
6415static PyType_Spec NullTpDocType_spec = {
6416 "_testcapi.NullTpDocType",
6417 sizeof(NullTpDocTypeObject),
6418 0,
6419 Py_TPFLAGS_DEFAULT,
6420 NullTpDocType_slots
6421};
6422
Benjamin Peterson39403332020-09-02 11:29:06 -05006423
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006424PyDoc_STRVAR(heapgctype__doc__,
6425"A heap type with GC, and with overridden dealloc.\n\n"
6426"The 'value' attribute is set to 10 in __init__.");
6427
6428typedef struct {
6429 PyObject_HEAD
6430 int value;
6431} HeapCTypeObject;
6432
6433static struct PyMemberDef heapctype_members[] = {
6434 {"value", T_INT, offsetof(HeapCTypeObject, value)},
6435 {NULL} /* Sentinel */
6436};
6437
6438static int
6439heapctype_init(PyObject *self, PyObject *args, PyObject *kwargs)
6440{
6441 ((HeapCTypeObject *)self)->value = 10;
6442 return 0;
6443}
6444
6445static void
6446heapgcctype_dealloc(HeapCTypeObject *self)
6447{
6448 PyTypeObject *tp = Py_TYPE(self);
6449 PyObject_GC_UnTrack(self);
6450 PyObject_GC_Del(self);
6451 Py_DECREF(tp);
6452}
6453
6454static PyType_Slot HeapGcCType_slots[] = {
6455 {Py_tp_init, heapctype_init},
6456 {Py_tp_members, heapctype_members},
6457 {Py_tp_dealloc, heapgcctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006458 {Py_tp_doc, (char*)heapgctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006459 {0, 0},
6460};
6461
6462static PyType_Spec HeapGcCType_spec = {
6463 "_testcapi.HeapGcCType",
6464 sizeof(HeapCTypeObject),
6465 0,
6466 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
6467 HeapGcCType_slots
6468};
6469
6470PyDoc_STRVAR(heapctype__doc__,
6471"A heap type without GC, but with overridden dealloc.\n\n"
6472"The 'value' attribute is set to 10 in __init__.");
6473
6474static void
6475heapctype_dealloc(HeapCTypeObject *self)
6476{
6477 PyTypeObject *tp = Py_TYPE(self);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006478 PyObject_Free(self);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006479 Py_DECREF(tp);
6480}
6481
6482static PyType_Slot HeapCType_slots[] = {
6483 {Py_tp_init, heapctype_init},
6484 {Py_tp_members, heapctype_members},
6485 {Py_tp_dealloc, heapctype_dealloc},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006486 {Py_tp_doc, (char*)heapctype__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006487 {0, 0},
6488};
6489
6490static PyType_Spec HeapCType_spec = {
6491 "_testcapi.HeapCType",
6492 sizeof(HeapCTypeObject),
6493 0,
6494 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6495 HeapCType_slots
6496};
6497
6498PyDoc_STRVAR(heapctypesubclass__doc__,
6499"Subclass of HeapCType, without GC.\n\n"
6500"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6501
6502typedef struct {
6503 HeapCTypeObject base;
6504 int value2;
6505} HeapCTypeSubclassObject;
6506
6507static int
6508heapctypesubclass_init(PyObject *self, PyObject *args, PyObject *kwargs)
6509{
6510 /* Call __init__ of the superclass */
6511 if (heapctype_init(self, args, kwargs) < 0) {
6512 return -1;
6513 }
6514 /* Initialize additional element */
6515 ((HeapCTypeSubclassObject *)self)->value2 = 20;
6516 return 0;
6517}
6518
6519static struct PyMemberDef heapctypesubclass_members[] = {
6520 {"value2", T_INT, offsetof(HeapCTypeSubclassObject, value2)},
6521 {NULL} /* Sentinel */
6522};
6523
6524static PyType_Slot HeapCTypeSubclass_slots[] = {
6525 {Py_tp_init, heapctypesubclass_init},
6526 {Py_tp_members, heapctypesubclass_members},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006527 {Py_tp_doc, (char*)heapctypesubclass__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006528 {0, 0},
6529};
6530
6531static PyType_Spec HeapCTypeSubclass_spec = {
6532 "_testcapi.HeapCTypeSubclass",
6533 sizeof(HeapCTypeSubclassObject),
6534 0,
6535 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6536 HeapCTypeSubclass_slots
6537};
6538
scoderf7c4e232020-06-06 21:35:10 +02006539PyDoc_STRVAR(heapctypewithbuffer__doc__,
6540"Heap type with buffer support.\n\n"
6541"The buffer is set to [b'1', b'2', b'3', b'4']");
6542
6543typedef struct {
6544 HeapCTypeObject base;
6545 char buffer[4];
6546} HeapCTypeWithBufferObject;
6547
6548static int
6549heapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags)
6550{
6551 self->buffer[0] = '1';
6552 self->buffer[1] = '2';
6553 self->buffer[2] = '3';
6554 self->buffer[3] = '4';
6555 return PyBuffer_FillInfo(
6556 view, (PyObject*)self, (void *)self->buffer, 4, 1, flags);
6557}
6558
Rémi Lapeyreb8867e52020-06-07 09:05:33 +02006559static void
scoderf7c4e232020-06-06 21:35:10 +02006560heapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view)
6561{
6562 assert(view->obj == (void*) self);
6563}
6564
6565static PyType_Slot HeapCTypeWithBuffer_slots[] = {
6566 {Py_bf_getbuffer, heapctypewithbuffer_getbuffer},
6567 {Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer},
6568 {Py_tp_doc, (char*)heapctypewithbuffer__doc__},
6569 {0, 0},
6570};
6571
6572static PyType_Spec HeapCTypeWithBuffer_spec = {
6573 "_testcapi.HeapCTypeWithBuffer",
6574 sizeof(HeapCTypeWithBufferObject),
6575 0,
6576 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6577 HeapCTypeWithBuffer_slots
6578};
6579
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006580PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__,
6581"Subclass of HeapCType with a finalizer that reassigns __class__.\n\n"
6582"__class__ is set to plain HeapCTypeSubclass during finalization.\n"
6583"__init__ sets the 'value' attribute to 10 and 'value2' to 20.");
6584
6585static int
6586heapctypesubclasswithfinalizer_init(PyObject *self, PyObject *args, PyObject *kwargs)
6587{
6588 PyTypeObject *base = (PyTypeObject *)PyType_GetSlot(Py_TYPE(self), Py_tp_base);
6589 initproc base_init = PyType_GetSlot(base, Py_tp_init);
6590 base_init(self, args, kwargs);
6591 return 0;
6592}
6593
6594static void
6595heapctypesubclasswithfinalizer_finalize(PyObject *self)
6596{
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006597 PyObject *error_type, *error_value, *error_traceback, *m;
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006598 PyObject *oldtype = NULL, *newtype = NULL, *refcnt = NULL;
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006599
6600 /* Save the current exception, if any. */
6601 PyErr_Fetch(&error_type, &error_value, &error_traceback);
6602
6603 m = PyState_FindModule(&_testcapimodule);
6604 if (m == NULL) {
6605 goto cleanup_finalize;
6606 }
6607 oldtype = PyObject_GetAttrString(m, "HeapCTypeSubclassWithFinalizer");
6608 newtype = PyObject_GetAttrString(m, "HeapCTypeSubclass");
6609 if (oldtype == NULL || newtype == NULL) {
6610 goto cleanup_finalize;
6611 }
6612
6613 if (PyObject_SetAttrString(self, "__class__", newtype) < 0) {
6614 goto cleanup_finalize;
6615 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006616 refcnt = PyLong_FromSsize_t(Py_REFCNT(oldtype));
6617 if (refcnt == NULL) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006618 goto cleanup_finalize;
6619 }
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006620 if (PyObject_SetAttrString(oldtype, "refcnt_in_del", refcnt) < 0) {
6621 goto cleanup_finalize;
6622 }
6623 Py_DECREF(refcnt);
6624 refcnt = PyLong_FromSsize_t(Py_REFCNT(newtype));
6625 if (refcnt == NULL) {
6626 goto cleanup_finalize;
6627 }
6628 if (PyObject_SetAttrString(newtype, "refcnt_in_del", refcnt) < 0) {
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006629 goto cleanup_finalize;
6630 }
6631
6632cleanup_finalize:
6633 Py_XDECREF(oldtype);
6634 Py_XDECREF(newtype);
Eddie Elizondoa67ac2f2019-09-13 12:48:03 -04006635 Py_XDECREF(refcnt);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006636
6637 /* Restore the saved exception. */
6638 PyErr_Restore(error_type, error_value, error_traceback);
6639}
6640
6641static PyType_Slot HeapCTypeSubclassWithFinalizer_slots[] = {
6642 {Py_tp_init, heapctypesubclasswithfinalizer_init},
6643 {Py_tp_members, heapctypesubclass_members},
6644 {Py_tp_finalize, heapctypesubclasswithfinalizer_finalize},
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006645 {Py_tp_doc, (char*)heapctypesubclasswithfinalizer__doc__},
Eddie Elizondoff023ed2019-09-11 05:17:13 -04006646 {0, 0},
6647};
6648
6649static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = {
6650 "_testcapi.HeapCTypeSubclassWithFinalizer",
6651 sizeof(HeapCTypeSubclassObject),
6652 0,
6653 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
6654 HeapCTypeSubclassWithFinalizer_slots
6655};
6656
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006657typedef struct {
6658 PyObject_HEAD
6659 PyObject *dict;
6660} HeapCTypeWithDictObject;
6661
6662static void
6663heapctypewithdict_dealloc(HeapCTypeWithDictObject* self)
6664{
6665
6666 PyTypeObject *tp = Py_TYPE(self);
6667 Py_XDECREF(self->dict);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006668 PyObject_Free(self);
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006669 Py_DECREF(tp);
6670}
6671
6672static PyGetSetDef heapctypewithdict_getsetlist[] = {
6673 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
6674 {NULL} /* Sentinel */
6675};
6676
6677static struct PyMemberDef heapctypewithdict_members[] = {
6678 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
6679 {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY},
6680 {NULL} /* Sentinel */
6681};
6682
6683static PyType_Slot HeapCTypeWithDict_slots[] = {
6684 {Py_tp_members, heapctypewithdict_members},
6685 {Py_tp_getset, heapctypewithdict_getsetlist},
6686 {Py_tp_dealloc, heapctypewithdict_dealloc},
6687 {0, 0},
6688};
6689
6690static PyType_Spec HeapCTypeWithDict_spec = {
6691 "_testcapi.HeapCTypeWithDict",
6692 sizeof(HeapCTypeWithDictObject),
6693 0,
6694 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6695 HeapCTypeWithDict_slots
6696};
6697
6698static struct PyMemberDef heapctypewithnegativedict_members[] = {
6699 {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)},
Victor Stinneraca8c402019-09-30 21:14:26 +02006700 {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006701 {NULL} /* Sentinel */
6702};
6703
6704static PyType_Slot HeapCTypeWithNegativeDict_slots[] = {
6705 {Py_tp_members, heapctypewithnegativedict_members},
6706 {Py_tp_getset, heapctypewithdict_getsetlist},
6707 {Py_tp_dealloc, heapctypewithdict_dealloc},
6708 {0, 0},
6709};
6710
6711static PyType_Spec HeapCTypeWithNegativeDict_spec = {
6712 "_testcapi.HeapCTypeWithNegativeDict",
6713 sizeof(HeapCTypeWithDictObject),
6714 0,
6715 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6716 HeapCTypeWithNegativeDict_slots
6717};
6718
6719typedef struct {
6720 PyObject_HEAD
6721 PyObject *weakreflist;
6722} HeapCTypeWithWeakrefObject;
6723
6724static struct PyMemberDef heapctypewithweakref_members[] = {
6725 {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)},
6726 {"__weaklistoffset__", T_PYSSIZET,
6727 offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY},
6728 {NULL} /* Sentinel */
6729};
6730
6731static void
6732heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self)
6733{
6734
6735 PyTypeObject *tp = Py_TYPE(self);
6736 if (self->weakreflist != NULL)
6737 PyObject_ClearWeakRefs((PyObject *) self);
6738 Py_XDECREF(self->weakreflist);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006739 PyObject_Free(self);
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07006740 Py_DECREF(tp);
6741}
6742
6743static PyType_Slot HeapCTypeWithWeakref_slots[] = {
6744 {Py_tp_members, heapctypewithweakref_members},
6745 {Py_tp_dealloc, heapctypewithweakref_dealloc},
6746 {0, 0},
6747};
6748
6749static PyType_Spec HeapCTypeWithWeakref_spec = {
6750 "_testcapi.HeapCTypeWithWeakref",
6751 sizeof(HeapCTypeWithWeakrefObject),
6752 0,
6753 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6754 HeapCTypeWithWeakref_slots
6755};
6756
scoder148f3292020-07-03 02:09:28 +02006757PyDoc_STRVAR(heapctypesetattr__doc__,
6758"A heap type without GC, but with overridden __setattr__.\n\n"
6759"The 'value' attribute is set to 10 in __init__ and updated via attribute setting.");
6760
6761typedef struct {
6762 PyObject_HEAD
6763 long value;
6764} HeapCTypeSetattrObject;
6765
6766static struct PyMemberDef heapctypesetattr_members[] = {
6767 {"pvalue", T_LONG, offsetof(HeapCTypeSetattrObject, value)},
6768 {NULL} /* Sentinel */
6769};
6770
6771static int
6772heapctypesetattr_init(PyObject *self, PyObject *args, PyObject *kwargs)
6773{
6774 ((HeapCTypeSetattrObject *)self)->value = 10;
6775 return 0;
6776}
6777
6778static void
6779heapctypesetattr_dealloc(HeapCTypeSetattrObject *self)
6780{
6781 PyTypeObject *tp = Py_TYPE(self);
Victor Stinner32bd68c2020-12-01 10:37:39 +01006782 PyObject_Free(self);
scoder148f3292020-07-03 02:09:28 +02006783 Py_DECREF(tp);
6784}
6785
6786static int
6787heapctypesetattr_setattro(HeapCTypeSetattrObject *self, PyObject *attr, PyObject *value)
6788{
6789 PyObject *svalue = PyUnicode_FromString("value");
6790 if (svalue == NULL)
6791 return -1;
6792 int eq = PyObject_RichCompareBool(svalue, attr, Py_EQ);
6793 Py_DECREF(svalue);
6794 if (eq < 0)
6795 return -1;
6796 if (!eq) {
6797 return PyObject_GenericSetAttr((PyObject*) self, attr, value);
6798 }
6799 if (value == NULL) {
6800 self->value = 0;
6801 return 0;
6802 }
6803 PyObject *ivalue = PyNumber_Long(value);
6804 if (ivalue == NULL)
6805 return -1;
6806 long v = PyLong_AsLong(ivalue);
6807 Py_DECREF(ivalue);
6808 if (v == -1 && PyErr_Occurred())
6809 return -1;
6810 self->value = v;
6811 return 0;
6812}
6813
6814static PyType_Slot HeapCTypeSetattr_slots[] = {
6815 {Py_tp_init, heapctypesetattr_init},
6816 {Py_tp_members, heapctypesetattr_members},
6817 {Py_tp_setattro, heapctypesetattr_setattro},
6818 {Py_tp_dealloc, heapctypesetattr_dealloc},
6819 {Py_tp_doc, (char*)heapctypesetattr__doc__},
6820 {0, 0},
6821};
6822
6823static PyType_Spec HeapCTypeSetattr_spec = {
6824 "_testcapi.HeapCTypeSetattr",
6825 sizeof(HeapCTypeSetattrObject),
6826 0,
6827 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6828 HeapCTypeSetattr_slots
6829};
6830
Petr Viktorinf9583772019-09-10 12:21:09 +01006831static PyMethodDef meth_instance_methods[] = {
6832 {"meth_varargs", meth_varargs, METH_VARARGS},
6833 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS},
6834 {"meth_o", meth_o, METH_O},
6835 {"meth_noargs", meth_noargs, METH_NOARGS},
6836 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
6837 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
6838 {NULL, NULL} /* sentinel */
6839};
6840
6841
6842static PyTypeObject MethInstance_Type = {
6843 PyVarObject_HEAD_INIT(NULL, 0)
6844 "MethInstance",
6845 sizeof(PyObject),
6846 .tp_new = PyType_GenericNew,
6847 .tp_flags = Py_TPFLAGS_DEFAULT,
6848 .tp_methods = meth_instance_methods,
Petr Viktorin5e9caee2019-09-12 10:12:53 +01006849 .tp_doc = (char*)PyDoc_STR(
Petr Viktorinf9583772019-09-10 12:21:09 +01006850 "Class with normal (instance) methods to test calling conventions"),
6851};
6852
6853static PyMethodDef meth_class_methods[] = {
6854 {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS},
6855 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS},
6856 {"meth_o", meth_o, METH_O|METH_CLASS},
6857 {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS},
6858 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS},
6859 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS},
6860 {NULL, NULL} /* sentinel */
6861};
6862
6863
6864static PyTypeObject MethClass_Type = {
6865 PyVarObject_HEAD_INIT(NULL, 0)
6866 "MethClass",
6867 sizeof(PyObject),
6868 .tp_new = PyType_GenericNew,
6869 .tp_flags = Py_TPFLAGS_DEFAULT,
6870 .tp_methods = meth_class_methods,
6871 .tp_doc = PyDoc_STR(
6872 "Class with class methods to test calling conventions"),
6873};
6874
6875static PyMethodDef meth_static_methods[] = {
6876 {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC},
6877 {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC},
6878 {"meth_o", meth_o, METH_O|METH_STATIC},
6879 {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC},
6880 {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC},
6881 {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC},
6882 {NULL, NULL} /* sentinel */
6883};
6884
6885
6886static PyTypeObject MethStatic_Type = {
6887 PyVarObject_HEAD_INIT(NULL, 0)
6888 "MethStatic",
6889 sizeof(PyObject),
6890 .tp_new = PyType_GenericNew,
6891 .tp_flags = Py_TPFLAGS_DEFAULT,
6892 .tp_methods = meth_static_methods,
6893 .tp_doc = PyDoc_STR(
6894 "Class with static methods to test calling conventions"),
6895};
6896
Neil Schemenauer392a13b2019-10-15 20:56:48 -07006897/* ContainerNoGC -- a simple container without GC methods */
6898
6899typedef struct {
6900 PyObject_HEAD
6901 PyObject *value;
6902} ContainerNoGCobject;
6903
6904static PyObject *
6905ContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
6906{
6907 PyObject *value;
6908 char *names[] = {"value", NULL};
6909 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) {
6910 return NULL;
6911 }
6912 PyObject *self = type->tp_alloc(type, 0);
6913 if (self == NULL) {
6914 return NULL;
6915 }
6916 Py_INCREF(value);
6917 ((ContainerNoGCobject *)self)->value = value;
6918 return self;
6919}
6920
6921static void
6922ContainerNoGC_dealloc(ContainerNoGCobject *self)
6923{
6924 Py_DECREF(self->value);
6925 Py_TYPE(self)->tp_free((PyObject *)self);
6926}
6927
6928static PyMemberDef ContainerNoGC_members[] = {
6929 {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY,
6930 PyDoc_STR("a container value for test purposes")},
6931 {0}
6932};
6933
6934static PyTypeObject ContainerNoGC_type = {
6935 PyVarObject_HEAD_INIT(NULL, 0)
6936 "_testcapi.ContainerNoGC",
6937 sizeof(ContainerNoGCobject),
6938 .tp_dealloc = (destructor)ContainerNoGC_dealloc,
6939 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
6940 .tp_members = ContainerNoGC_members,
6941 .tp_new = ContainerNoGC_new,
6942};
6943
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006944
Martin v. Löwis1a214512008-06-11 05:26:20 +00006945static struct PyModuleDef _testcapimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006946 PyModuleDef_HEAD_INIT,
6947 "_testcapi",
6948 NULL,
6949 -1,
6950 TestMethods,
6951 NULL,
6952 NULL,
6953 NULL,
6954 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006955};
6956
Nick Coghland5cacbb2015-05-23 22:24:10 +10006957/* Per PEP 489, this module will not be converted to multi-phase initialization
6958 */
6959
Mark Hammond62b1ab12002-07-23 06:31:15 +00006960PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006961PyInit__testcapi(void)
Tim Peters9ea17ac2001-02-02 05:57:15 +00006962{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963 PyObject *m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006965 m = PyModule_Create(&_testcapimodule);
6966 if (m == NULL)
6967 return NULL;
Tim Peters9ea17ac2001-02-02 05:57:15 +00006968
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01006969 Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type);
Hirokazu Yamamoto8ebab5d2008-12-31 06:05:46 +00006970
Victor Stinnerd2ec81a2020-02-07 09:17:07 +01006971 Py_SET_TYPE(&test_structmembersType, &PyType_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972 Py_INCREF(&test_structmembersType);
6973 /* don't use a name starting with "test", since we don't want
6974 test_capi to automatically call this */
6975 PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType);
Benjamin Petersond51374e2014-04-09 23:55:56 -04006976 if (PyType_Ready(&matmulType) < 0)
6977 return NULL;
6978 Py_INCREF(&matmulType);
6979 PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType);
Zackery Spytzc7f803b2019-05-31 03:46:36 -06006980 if (PyType_Ready(&ipowType) < 0) {
6981 return NULL;
6982 }
6983 Py_INCREF(&ipowType);
6984 PyModule_AddObject(m, "ipowType", (PyObject *)&ipowType);
Thomas Wouters89f507f2006-12-13 04:49:30 +00006985
Yury Selivanov75445082015-05-11 22:57:16 -04006986 if (PyType_Ready(&awaitType) < 0)
6987 return NULL;
6988 Py_INCREF(&awaitType);
6989 PyModule_AddObject(m, "awaitType", (PyObject *)&awaitType);
6990
Jeroen Demeyer351c6742019-05-10 19:21:11 +02006991 MyList_Type.tp_base = &PyList_Type;
6992 if (PyType_Ready(&MyList_Type) < 0)
6993 return NULL;
6994 Py_INCREF(&MyList_Type);
6995 PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type);
6996
Jeroen Demeyereb65e242019-05-28 14:42:53 +02006997 if (PyType_Ready(&MethodDescriptorBase_Type) < 0)
6998 return NULL;
6999 Py_INCREF(&MethodDescriptorBase_Type);
7000 PyModule_AddObject(m, "MethodDescriptorBase", (PyObject *)&MethodDescriptorBase_Type);
7001
7002 MethodDescriptorDerived_Type.tp_base = &MethodDescriptorBase_Type;
7003 if (PyType_Ready(&MethodDescriptorDerived_Type) < 0)
7004 return NULL;
7005 Py_INCREF(&MethodDescriptorDerived_Type);
7006 PyModule_AddObject(m, "MethodDescriptorDerived", (PyObject *)&MethodDescriptorDerived_Type);
7007
7008 MethodDescriptorNopGet_Type.tp_base = &MethodDescriptorBase_Type;
7009 if (PyType_Ready(&MethodDescriptorNopGet_Type) < 0)
7010 return NULL;
7011 Py_INCREF(&MethodDescriptorNopGet_Type);
7012 PyModule_AddObject(m, "MethodDescriptorNopGet", (PyObject *)&MethodDescriptorNopGet_Type);
7013
Jeroen Demeyer735e8af2019-05-30 12:43:19 +02007014 MethodDescriptor2_Type.tp_base = &MethodDescriptorBase_Type;
7015 if (PyType_Ready(&MethodDescriptor2_Type) < 0)
7016 return NULL;
7017 Py_INCREF(&MethodDescriptor2_Type);
7018 PyModule_AddObject(m, "MethodDescriptor2", (PyObject *)&MethodDescriptor2_Type);
7019
Serhiy Storchaka45700fb2017-12-16 11:25:56 +02007020 if (PyType_Ready(&GenericAlias_Type) < 0)
7021 return NULL;
7022 Py_INCREF(&GenericAlias_Type);
7023 PyModule_AddObject(m, "GenericAlias", (PyObject *)&GenericAlias_Type);
7024
7025 if (PyType_Ready(&Generic_Type) < 0)
7026 return NULL;
7027 Py_INCREF(&Generic_Type);
7028 PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type);
7029
Petr Viktorinf9583772019-09-10 12:21:09 +01007030 if (PyType_Ready(&MethInstance_Type) < 0)
7031 return NULL;
7032 Py_INCREF(&MethInstance_Type);
7033 PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type);
7034
7035 if (PyType_Ready(&MethClass_Type) < 0)
7036 return NULL;
7037 Py_INCREF(&MethClass_Type);
7038 PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type);
7039
7040 if (PyType_Ready(&MethStatic_Type) < 0)
7041 return NULL;
7042 Py_INCREF(&MethStatic_Type);
7043 PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type);
7044
xdegaye56d1f5c2017-10-26 15:09:06 +02007045 PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception;
7046 if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) {
7047 return NULL;
7048 }
7049 Py_INCREF(&PyRecursingInfinitelyError_Type);
7050 PyModule_AddObject(m, "RecursingInfinitelyError",
7051 (PyObject *)&PyRecursingInfinitelyError_Type);
7052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007053 PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX));
7054 PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN));
7055 PyModule_AddObject(m, "UCHAR_MAX", PyLong_FromLong(UCHAR_MAX));
7056 PyModule_AddObject(m, "SHRT_MAX", PyLong_FromLong(SHRT_MAX));
7057 PyModule_AddObject(m, "SHRT_MIN", PyLong_FromLong(SHRT_MIN));
7058 PyModule_AddObject(m, "USHRT_MAX", PyLong_FromLong(USHRT_MAX));
7059 PyModule_AddObject(m, "INT_MAX", PyLong_FromLong(INT_MAX));
7060 PyModule_AddObject(m, "INT_MIN", PyLong_FromLong(INT_MIN));
7061 PyModule_AddObject(m, "UINT_MAX", PyLong_FromUnsignedLong(UINT_MAX));
7062 PyModule_AddObject(m, "LONG_MAX", PyLong_FromLong(LONG_MAX));
7063 PyModule_AddObject(m, "LONG_MIN", PyLong_FromLong(LONG_MIN));
7064 PyModule_AddObject(m, "ULONG_MAX", PyLong_FromUnsignedLong(ULONG_MAX));
7065 PyModule_AddObject(m, "FLT_MAX", PyFloat_FromDouble(FLT_MAX));
7066 PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN));
7067 PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX));
7068 PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN));
Sergey Fedoseev1f9f69d2019-12-05 19:55:28 +05007069 PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX));
7070 PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN));
7071 PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007072 PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
7073 PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
Victor Stinner4237d342015-09-10 10:10:39 +02007074 PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007075 Py_INCREF(&PyInstanceMethod_Type);
7076 PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
Thomas Hellera4ea6032003-04-17 18:55:45 +00007077
Larry Hastings2a727912014-01-16 11:32:01 -08007078 PyModule_AddIntConstant(m, "the_number_three", 3);
Victor Stinner310e2d22019-11-22 10:58:00 +01007079 PyObject *v;
Victor Stinner5d39e042017-11-29 17:20:38 +01007080#ifdef WITH_PYMALLOC
Victor Stinner310e2d22019-11-22 10:58:00 +01007081 v = Py_True;
Victor Stinner5d39e042017-11-29 17:20:38 +01007082#else
Victor Stinner310e2d22019-11-22 10:58:00 +01007083 v = Py_False;
Victor Stinner5d39e042017-11-29 17:20:38 +01007084#endif
Victor Stinner310e2d22019-11-22 10:58:00 +01007085 Py_INCREF(v);
7086 PyModule_AddObject(m, "WITH_PYMALLOC", v);
Larry Hastings2a727912014-01-16 11:32:01 -08007087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007088 TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
7089 Py_INCREF(TestError);
7090 PyModule_AddObject(m, "error", TestError);
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007091
Benjamin Peterson39403332020-09-02 11:29:06 -05007092 PyObject *HeapDocCType = PyType_FromSpec(&HeapDocCType_spec);
7093 if (HeapDocCType == NULL) {
7094 return NULL;
7095 }
7096 PyModule_AddObject(m, "HeapDocCType", HeapDocCType);
7097
Hai Shi88c2cfd2020-11-07 00:04:47 +08007098 /* bpo-41832: Add a new type to test PyType_FromSpec()
7099 now can accept a NULL tp_doc slot. */
7100 PyObject *NullTpDocType = PyType_FromSpec(&NullTpDocType_spec);
7101 if (NullTpDocType == NULL) {
7102 return NULL;
7103 }
7104 PyModule_AddObject(m, "NullTpDocType", NullTpDocType);
7105
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007106 PyObject *HeapGcCType = PyType_FromSpec(&HeapGcCType_spec);
7107 if (HeapGcCType == NULL) {
7108 return NULL;
7109 }
7110 PyModule_AddObject(m, "HeapGcCType", HeapGcCType);
7111
7112 PyObject *HeapCType = PyType_FromSpec(&HeapCType_spec);
7113 if (HeapCType == NULL) {
7114 return NULL;
7115 }
7116 PyObject *subclass_bases = PyTuple_Pack(1, HeapCType);
7117 if (subclass_bases == NULL) {
7118 return NULL;
7119 }
7120 PyObject *HeapCTypeSubclass = PyType_FromSpecWithBases(&HeapCTypeSubclass_spec, subclass_bases);
7121 if (HeapCTypeSubclass == NULL) {
7122 return NULL;
7123 }
7124 Py_DECREF(subclass_bases);
7125 PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass);
7126
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07007127 PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec);
7128 if (HeapCTypeWithDict == NULL) {
7129 return NULL;
7130 }
7131 PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict);
7132
7133 PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec);
7134 if (HeapCTypeWithNegativeDict == NULL) {
7135 return NULL;
7136 }
7137 PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict);
7138
7139 PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec);
7140 if (HeapCTypeWithWeakref == NULL) {
7141 return NULL;
7142 }
7143 PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref);
7144
scoderf7c4e232020-06-06 21:35:10 +02007145 PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec);
7146 if (HeapCTypeWithBuffer == NULL) {
7147 return NULL;
7148 }
7149 PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer);
7150
scoder148f3292020-07-03 02:09:28 +02007151 PyObject *HeapCTypeSetattr = PyType_FromSpec(&HeapCTypeSetattr_spec);
7152 if (HeapCTypeSetattr == NULL) {
7153 return NULL;
7154 }
7155 PyModule_AddObject(m, "HeapCTypeSetattr", HeapCTypeSetattr);
7156
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007157 PyObject *subclass_with_finalizer_bases = PyTuple_Pack(1, HeapCTypeSubclass);
7158 if (subclass_with_finalizer_bases == NULL) {
7159 return NULL;
7160 }
7161 PyObject *HeapCTypeSubclassWithFinalizer = PyType_FromSpecWithBases(
7162 &HeapCTypeSubclassWithFinalizer_spec, subclass_with_finalizer_bases);
7163 if (HeapCTypeSubclassWithFinalizer == NULL) {
7164 return NULL;
7165 }
7166 Py_DECREF(subclass_with_finalizer_bases);
7167 PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer);
7168
Neil Schemenauer392a13b2019-10-15 20:56:48 -07007169 if (PyType_Ready(&ContainerNoGC_type) < 0) {
7170 return NULL;
7171 }
7172 Py_INCREF(&ContainerNoGC_type);
7173 if (PyModule_AddObject(m, "ContainerNoGC",
7174 (PyObject *) &ContainerNoGC_type) < 0)
7175 return NULL;
7176
Eddie Elizondoff023ed2019-09-11 05:17:13 -04007177 PyState_AddModule(m, &_testcapimodule);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007178 return m;
Tim Peters9ea17ac2001-02-02 05:57:15 +00007179}
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007180
7181
7182/* Test the C API exposed when PY_SSIZE_T_CLEAN is not defined */
7183
7184#undef Py_BuildValue
7185PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
7186
7187static PyObject *
7188test_buildvalue_issue38913(PyObject *self, PyObject *Py_UNUSED(ignored))
7189{
7190 PyObject *res;
7191 const char str[] = "string";
7192 const Py_UNICODE unicode[] = L"unicode";
Victor Stinner37bb2892020-06-19 11:45:31 +02007193 assert(!PyErr_Occurred());
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007194
7195 res = Py_BuildValue("(s#O)", str, 1, Py_None);
7196 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007197 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007198 return NULL;
7199 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007200 PyErr_Clear();
7201
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007202 res = Py_BuildValue("(z#O)", str, 1, Py_None);
7203 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007204 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007205 return NULL;
7206 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007207 PyErr_Clear();
7208
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007209 res = Py_BuildValue("(y#O)", str, 1, Py_None);
7210 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007211 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007212 return NULL;
7213 }
Victor Stinner37bb2892020-06-19 11:45:31 +02007214 PyErr_Clear();
7215
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007216 res = Py_BuildValue("(u#O)", unicode, 1, Py_None);
7217 assert(res == NULL);
Victor Stinner37bb2892020-06-19 11:45:31 +02007218 if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007219 return NULL;
7220 }
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007221 PyErr_Clear();
Victor Stinner37bb2892020-06-19 11:45:31 +02007222
7223
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +02007224 Py_RETURN_NONE;
7225}